From c03778ec8b86c2d7936a54c7a89e56bbd5e37905 Mon Sep 17 00:00:00 2001 From: Aiden McClelland Date: Thu, 9 Mar 2023 15:02:09 -0700 Subject: [PATCH 001/169] fixup after rebase --- backend/src/manager/js_api.rs | 1 - libs/helpers/src/os_api.rs | 1 - 2 files changed, 2 deletions(-) diff --git a/backend/src/manager/js_api.rs b/backend/src/manager/js_api.rs index 74e030242..8f26f2d50 100644 --- a/backend/src/manager/js_api.rs +++ b/backend/src/manager/js_api.rs @@ -12,7 +12,6 @@ use sqlx::Acquire; use crate::{ config::hook::ConfigHook, manager::{start_stop::StartStop, Manager}, - net::keys::Key, }; use super::try_get_running_ip; diff --git a/libs/helpers/src/os_api.rs b/libs/helpers/src/os_api.rs index 47735332f..1ade88a34 100644 --- a/libs/helpers/src/os_api.rs +++ b/libs/helpers/src/os_api.rs @@ -1,6 +1,5 @@ use std::sync::Arc; -use color_eyre::eyre::eyre; use color_eyre::Report; use models::InterfaceId; use models::PackageId; From 38c2c4778932a01c9a690956a65a464c6aefc15d Mon Sep 17 00:00:00 2001 From: Matt Hill Date: Tue, 7 Mar 2023 14:37:14 -0700 Subject: [PATCH 002/169] Feat/domains update FE types and unify sideload page with marketplace show begin popover for UI launch select update node version for github workflows fix type errors eager load more components fix mocks for types recalculate updates bad on pkg uninstall chore: break form-object file structure files for config finish file upload API and implement for config chore: break down form-object by type, part 1 remove NEW from config comment entire setTimeout for new generic form options chore: break down form-object by type, part 2 headers for enums and unions implement select and multiselect for config update union types and camel case for specs implement textarea config value inputspec and required instead of nullable remove subtype from list spec update start-sdk bump start-sdk feat: use Taiga UI for config modal (#2250) * feat: use Taiga UI for config modal * chore: finish remaining changes * chore: address comments * bump sdk version --------- Co-authored-by: Matt Hill update package lock update to sdk 20 and fix types chore: update Taiga UI and migrate some more forms (#2252) update form to latest sdk validate length for textarea too chore: accommodate new changes to the specs (#2254) * chore: accommodate new changes to the specs * chore: fix error * chore: fix error feat: add input color (#2257) * feat: add input color * patterns will always be there --------- Co-authored-by: Matt Hill chore: properly type pattern error update to latest sdk Add sans-serif font fallback (#2263) * Add sans-serif font fallback * Update frontend readme start scripts feat: add datetime spec support (#2264) Wifi optional (#2249) * begin work * allow enable and disable wifi * nice styling * done except for popover not dismissing * update wifi.ts * address comments Feat/automated backups (#2142) * initial restructuring * very cool * new structure in place * delete unnecessary T * down the rabbit hole * getting better * dont like it * nice * very nice * sessions select all * nice * backup runs * fix targets and more * small improvements * mostly working * address PR comments * fix error * delete issue with merge * fix checkboxes and add API for deleting backup runs * better styling for checkboxes * small button in ssh kpage too * complete multiple UI launcher * fix actions * present error toast too * fix target forms Add logs window to setup wizard loading screen (#2076) * add logs window to setup wizard loading screen * fix type error * Update frontend/projects/setup-wizard/src/app/services/api/live-api.service.ts Co-authored-by: Lucy C <12953208+elvece@users.noreply.github.com> --------- Co-authored-by: Lucy C <12953208+elvece@users.noreply.github.com> statically type server metrics and use websocket (#2124) Co-authored-by: Matt Hill Feat/external-smtp (#1791) * UI for EOS smtp, missing API layer * implement api * fix errors * switch to external smtp creds * fix things up * fix types * update types for new forms * feat: add new form to emails and marketplace (#2268) * import tuilet module * feat: get rid of old form completely (#2270) * move to builder spec and delete developer menu * update sdk * tiny * getting better * working * done * feat: add step to number config * chore: small fixes * update SDK and step for numbers --------- Co-authored-by: Alex Inkin latest sdk, fix build update SDK for better disabled props feat: implement `disabled`, `immutable` and `generate` (#2280) * feat: implement `disabled`, `immutable` and `generate` * chore: remove unnecessary code * chore: add generate to textarea and implement immutable * no generate for textarea --------- Co-authored-by: Matt Hill update lockfile refactor: extract loading status to shared library (#2282) * refactor: extract loading status to shared library * chore: remove inline style refactor: break routing down to apps level (#2285) closes #2212 and closes #2214 Feat/credentials (#2290) add credentials and remove properties refactor: break ui up further down (#2292) * refactor: break ui up further down * permit loading even when authed --------- Co-authored-by: Matt Hill update patchdb for package compatability fixes fix file structure WIP finish rebase mvp complete port forwards mvp looking good cleaner system page move experimental features manual port overrides better info headers for jobs pages refactor: move diagnostic-ui app under ui route (#2306) * refactor: move diagnostic-ui app under ui route * chore: hide navigation * chore: remove ionic from diagnostic * fix navbar showing on login --------- Co-authored-by: Matt Hill chore: partially remove ionic modals and loaders (#2308) * chore: partially remove ionic modals and loaders * change to snake --------- Co-authored-by: Matt Hill better session data fetching abstract store icon component to shared marketplace project (#2311) * abstract store icon component to shared marketplace project * better than using a pipe * minor cleanup * chore: fix missing node types in libraries * typo --------- Co-authored-by: Matt Hill Co-authored-by: waterplea refactor: continue to get rid of ionic infrastructure (#2325) refactor: finish removing ionic entities: (#2333) * refactor: finish removing ionic entities: ToastController ErrorToastService ModalController AlertController LoadingController * chore: rollback testing code * chore: fix comments * minor form change * chore: fix comments * update clearnet address parts * move around patchDB * chore: fix comments --------- Co-authored-by: Matt Hill fixup after rebase --- CONTRIBUTING.md | 3 - Makefile | 7 +- frontend/README.md | 1 - frontend/angular.json | 145 +----- frontend/ionic.config.json | 6 - frontend/lint-staged.config.js | 1 - frontend/package-lock.json | 126 ++--- frontend/package.json | 14 +- .../src/app/app-routing.module.ts | 25 - .../diagnostic-ui/src/app/app.component.html | 5 - .../diagnostic-ui/src/app/app.component.scss | 8 - .../diagnostic-ui/src/app/app.component.ts | 10 - .../diagnostic-ui/src/app/app.module.ts | 43 -- .../src/app/pages/home/home-routing.module.ts | 16 - .../src/app/pages/home/home.module.ts | 18 - .../src/app/pages/home/home.page.html | 81 --- .../src/app/pages/home/home.page.scss | 5 - .../src/environments/environment.prod.ts | 3 - .../src/environments/environment.ts | 16 - .../projects/diagnostic-ui/src/index.html | 23 - frontend/projects/diagnostic-ui/src/main.ts | 12 - .../projects/diagnostic-ui/src/polyfills.ts | 65 --- .../projects/diagnostic-ui/src/styles.scss | 41 -- .../projects/diagnostic-ui/src/zone-flags.ts | 6 - frontend/projects/diagnostic-ui/tsconfig.json | 9 - .../install-wizard/src/app/app.component.html | 3 +- .../install-wizard/src/app/app.module.ts | 17 +- .../src/app/pages/home/home.page.ts | 98 ++-- frontend/projects/marketplace/package.json | 3 +- .../store-icon/store-icon.component.html | 4 +- .../store-icon/store-icon.component.module.ts | 4 +- .../store-icon/store-icon.component.scss | 0 .../store-icon/store-icon.component.ts | 28 ++ .../release-notes.component.html | 5 +- .../release-notes/release-notes.module.ts | 4 + .../src/pages/show/about/about.component.html | 5 +- .../src/pages/show/about/about.module.ts | 9 +- .../show/additional/additional.component.html | 33 +- .../show/additional/additional.component.scss | 10 + .../show/additional/additional.component.ts | 101 ++-- .../show/additional/additional.module.ts | 17 +- .../projects/marketplace/src/public-api.ts | 2 + frontend/projects/marketplace/src/types.ts | 2 +- frontend/projects/marketplace/tsconfig.json | 3 +- .../setup-wizard/src/app/app.component.html | 3 +- .../setup-wizard/src/app/app.component.ts | 6 +- .../setup-wizard/src/app/app.module.ts | 16 +- .../modals/cifs-modal/cifs-modal.module.ts | 26 +- .../modals/cifs-modal/cifs-modal.page.html | 123 ++--- .../modals/cifs-modal/cifs-modal.page.scss | 17 +- .../app/modals/cifs-modal/cifs-modal.page.ts | 131 +++-- .../app/modals/password/password.module.ts | 20 +- .../app/modals/password/password.page.html | 118 ++--- .../app/modals/password/password.page.scss | 21 - .../src/app/modals/password/password.page.ts | 100 ++-- .../src/app/pages/attach/attach.page.ts | 51 +- .../src/app/pages/embassy/embassy.page.ts | 128 +++-- .../src/app/pages/home/home.page.ts | 6 +- .../src/app/pages/loading/loading.module.ts | 4 +- .../src/app/pages/loading/loading.page.html | 4 +- .../src/app/pages/recover/recover.page.ts | 73 ++- .../src/app/pages/success/success.page.ts | 9 +- .../src/app/pages/transfer/transfer.page.ts | 54 +- .../fonts/Redacted/redacted.regular.ttf | Bin 17036 -> 0 bytes frontend/projects/shared/package.json | 2 + .../alert/alert-button.directive.ts | 29 -- .../components/alert/alert-input.directive.ts | 27 - .../src/components/alert/alert.component.ts | 99 ---- .../src/components/alert/alert.module.ts | 10 - .../initializing.component.html} | 0 .../initializing/initializing.component.scss | 18 + .../initializing/initializing.component.ts | 35 ++ .../initializing/initializing.module.ts | 14 + .../logs-window/logs-window.component.html | 0 .../logs-window/logs-window.component.scss | 0 .../logs-window/logs-window.component.ts | 4 +- .../components/loading/loading.component.scss | 30 +- .../components/loading/loading.component.ts | 42 +- .../src/components/loading/loading.module.ts | 13 +- .../components}/loading/loading.service.ts | 0 .../markdown/markdown.component.html | 41 +- .../markdown/markdown.component.module.ts | 2 + .../components/markdown/markdown.component.ts | 26 +- .../toast/toast-button.directive.ts | 32 -- .../src/components/toast/toast.component.ts | 85 ---- .../src/components/toast/toast.module.ts | 9 - .../src/directives/alert/alert.directive.ts | 22 + .../src/directives/alert/alert.module.ts | 8 + .../src/pipes/markdown/markdown.pipe.ts | 19 +- frontend/projects/shared/src/public-api.ts | 18 +- .../shared/src/services/copy.service.ts | 16 + .../src/services/error-toast.service.ts | 70 --- .../shared/src/services/error.service.ts | 2 +- .../shared/src/services/setup.service.ts | 8 +- .../shared/src/types/workspace-config.ts | 12 +- frontend/projects/shared/styles/shared.scss | 7 + frontend/projects/shared/styles/taiga.scss | 49 ++ .../projects/ui/src/app/app.component.html | 8 +- frontend/projects/ui/src/app/app.component.ts | 12 +- frontend/projects/ui/src/app/app.module.ts | 2 +- .../ui/src/app/app/menu/menu.component.html | 4 +- .../app/preloader/preloader.component.html | 2 - .../app/app/preloader/preloader.component.ts | 2 + .../ui/src/app/app/snek/snake.page.html | 36 +- .../ui/src/app/app/snek/snake.page.scss | 10 +- .../ui/src/app/app/snek/snake.page.ts | 44 +- .../ui/src/app/app/snek/snek.directive.ts | 65 ++- .../ui/src/app/app/snek/snek.module.ts | 3 +- .../app/apps/diagnostic/diagnostic.module.ts | 32 ++ .../app/apps/diagnostic/home/home.module.ts | 18 + .../app/apps/diagnostic/home/home.page.html | 53 ++ .../app/apps/diagnostic/home/home.page.scss | 35 ++ .../app/apps/diagnostic}/home/home.page.ts | 130 +++-- .../app/apps/diagnostic}/logs/logs.module.ts | 10 +- .../app/apps/diagnostic}/logs/logs.page.html | 0 .../app/apps/diagnostic}/logs/logs.page.ts | 15 +- .../services/diagnostic.service.ts} | 2 +- .../services/live-diagnostic.service.ts} | 4 +- .../services/mock-diagnostic.service.ts} | 4 +- .../ui/src/app/apps/loading/loading.module.ts | 4 +- .../ui/src/app/apps/loading/loading.page.html | 4 +- .../ui/src/app/apps/login/login.page.ts | 30 +- .../backup-report.component.html | 32 ++ ...ort.page.ts => backup-report.component.ts} | 32 +- .../backup-report/backup-report.module.ts | 6 +- .../backup-report/backup-report.page.html | 44 -- .../app/apps/ui/modals/form/form.module.ts | 2 + .../app/apps/ui/modals/form/form.page.html | 30 +- .../src/app/apps/ui/modals/form/form.page.ts | 11 +- .../generic-input.component.html | 67 --- .../generic-input.component.module.ts | 20 - .../generic-input/generic-input.component.ts | 90 ---- .../ui/modals/prompt/prompt.component.html | 40 ++ .../ui/modals/prompt/prompt.component.scss | 13 + .../apps/ui/modals/prompt/prompt.component.ts | 49 ++ .../apps/ui/modals/prompt/prompt.module.ts | 21 + .../directives/backup-create.directive.ts | 73 ++- .../directives/backup-restore.directive.ts | 149 +++--- .../backup-select/backup-select.module.ts | 13 +- .../backup-select/backup-select.page.html | 84 ++-- .../backup-select/backup-select.page.scss | 28 +- .../backup-select/backup-select.page.ts | 27 +- .../recover-select/recover-select.module.ts | 11 +- .../recover-select/recover-select.page.html | 87 ++-- .../recover-select/recover-select.page.scss | 31 ++ .../recover-select/recover-select.page.ts | 49 +- .../target-select/target-select.module.ts | 2 + .../target-select/target-select.page.html | 87 ++-- .../target-select/target-select.page.scss | 3 + .../target-select/target-select.page.ts | 41 +- .../backup-history/backup-history.page.ts | 44 +- .../pages/backup-jobs/backup-jobs.module.ts | 27 +- .../pages/backup-jobs/backup-jobs.page.html | 24 +- .../pages/backup-jobs/backup-jobs.page.ts | 123 ++--- .../edit-job/edit-job.component.html | 47 ++ .../edit-job/edit-job.component.scss | 33 ++ .../edit-job/edit-job.component.ts | 75 +++ .../backup-jobs/edit-job/edit-job.page.html | 33 -- .../backup-jobs/edit-job/edit-job.page.scss | 3 - .../backup-jobs/edit-job/edit-job.page.ts | 54 -- .../pages/backup-jobs/edit-job/job-builder.ts | 41 ++ .../job-options/job-options.component.html | 34 -- .../job-options/job-options.component.scss | 9 - .../job-options/job-options.component.ts | 91 ---- .../backup-jobs/new-job/new-job.page.html | 40 -- .../backup-jobs/new-job/new-job.page.scss | 3 - .../pages/backup-jobs/new-job/new-job.page.ts | 54 -- .../pages/backups/pages/backup-jobs/pipes.ts | 4 +- .../backup-targets/backup-targets.module.ts | 2 + .../backup-targets/backup-targets.page.html | 24 +- .../backup-targets/backup-targets.page.ts | 3 +- .../backups/pages/backups/backups.module.ts | 4 +- .../marketplace-list.module.ts | 2 +- .../marketplace-list.page.html | 1 + .../marketplace-list/marketplace-list.page.ts | 4 +- .../marketplace-settings.module.ts | 2 +- .../marketplace-settings.page.html | 11 +- .../marketplace-settings.page.ts | 10 +- .../marketplace-show-controls.component.ts | 153 +++--- .../notifications/notifications.module.ts | 4 +- .../pages/notifications/notifications.page.ts | 110 ++--- .../action-success/action-success.page.html | 53 +- .../action-success/action-success.page.ts | 35 +- .../services/app-actions/app-actions.page.ts | 122 +++-- .../app-credentials/app-credentials.page.html | 2 +- .../app-credentials/app-credentials.page.ts | 27 +- .../app-interfaces-item.component.html | 2 +- .../app-interfaces/app-interfaces.page.ts | 41 +- .../services/app-interfaces/qr.component.ts | 11 +- .../app-show-additional.component.html | 2 +- .../app-show-additional.component.ts | 49 +- .../app-show-status.component.ts | 140 ++---- .../modals/app-config/app-config.page.ts | 36 +- .../app-show/pipes/to-buttons.pipe.ts | 30 +- .../ui/pages/system/domains/domain.const.ts | 34 ++ .../domains.module.ts} | 12 +- .../ui/pages/system/domains/domains.page.html | 126 +++++ .../pages/system/domains/domains.page.scss} | 0 .../ui/pages/system/domains/domains.page.ts | 215 ++++++++ .../apps/ui/pages/system/email/email.page.ts | 3 +- .../experimental-features.module.ts | 7 +- .../experimental-features.page.html | 15 + .../experimental-features.page.ts | 163 +++--- .../apps/ui/pages/system/lan/lan.page.html | 43 -- .../apps/ui/pages/system/lan/lan.page.scss | 0 .../app/apps/ui/pages/system/lan/lan.page.ts | 22 - .../os-addresses/os-addresses.module.ts | 18 + .../os-addresses/os-addresses.page.html | 228 +++++++++ .../os-addresses/os-addresses.page.scss | 15 + .../system/os-addresses/os-addresses.page.ts | 168 +++++++ .../port-forwards/port-forwards.module.ts | 26 + .../port-forwards/port-forwards.page.html | 153 ++++++ .../port-forwards/port-forwards.page.scss | 26 + .../port-forwards/port-forwards.page.ts | 46 ++ .../server-show/os-update/os-update.page.html | 52 +- .../os-update/os-update.page.module.ts | 16 +- .../server-show/os-update/os-update.page.scss | 30 +- .../server-show/os-update/os-update.page.ts | 42 +- .../system/server-show/server-show.module.ts | 4 +- .../system/server-show/server-show.page.html | 88 ++-- .../system/server-show/server-show.page.scss | 15 + .../system/server-show/server-show.page.ts | 467 ++++++++---------- .../server-specs/server-specs.page.html | 56 +-- .../system/server-specs/server-specs.page.ts | 21 +- .../pages/system/sessions/sessions.module.ts | 2 + .../pages/system/sessions/sessions.page.html | 148 +++--- .../ui/pages/system/sessions/sessions.page.ts | 82 ++- .../ui/pages/system/sideload/sideload.page.ts | 21 +- .../pages/system/ssh-keys/ssh-keys.module.ts | 6 +- .../pages/system/ssh-keys/ssh-keys.page.html | 23 +- .../ui/pages/system/ssh-keys/ssh-keys.page.ts | 103 ++-- .../app/apps/ui/pages/system/system.module.ts | 19 +- .../apps/ui/pages/system/wifi/wifi.page.ts | 91 ++-- .../apps/ui/pages/updates/updates.module.ts | 10 +- .../apps/ui/pages/updates/updates.page.html | 9 +- .../app/apps/ui/pages/updates/updates.page.ts | 67 +-- .../form/form-select/form-select.component.ts | 2 +- .../form/form-text/form-text.component.html | 3 +- .../app/common/loading/loading.component.scss | 21 - .../app/common/loading/loading.component.ts | 20 - .../src/app/common/loading/loading.module.ts | 14 - .../ui/src/app/common/logs/logs.component.ts | 20 +- .../common/os-welcome/os-welcome.module.ts | 7 +- .../common/os-welcome/os-welcome.page.html | 188 ++++--- .../common/os-welcome/os-welcome.page.scss | 7 +- .../app/common/os-welcome/os-welcome.page.ts | 13 +- .../common/primary-ip/primary-ip.module.ts | 8 + .../app/common/primary-ip/primary-ip.pipe.ts | 17 + .../common/store-icon/store-icon.component.ts | 40 -- .../notifications-toast.component.html | 21 +- .../refresh-alert.component.html | 18 +- .../refresh-alert/refresh-alert.component.ts | 4 +- .../toast-container/toast-container.module.ts | 13 +- .../update-toast/update-toast.component.html | 26 +- .../update-toast/update-toast.component.ts | 17 +- .../projects/ui/src/app/routing.module.ts | 7 + .../ui/src/app/services/api/api.fixures.ts | 4 +- .../ui/src/app/services/api/api.types.ts | 24 + .../app/services/api/embassy-api.service.ts | 26 +- .../services/api/embassy-live-api.service.ts | 36 ++ .../services/api/embassy-mock-api.service.ts | 100 +++- .../ui/src/app/services/api/mock-patch.ts | 59 ++- .../src/app/services/form-dialog.service.ts | 2 +- .../ui/src/app/services/patch-data.service.ts | 32 +- .../src/app/services/patch-db/data-model.ts | 50 +- .../ui/src/app/util/clearnetAddress.ts | 11 + frontend/projects/ui/src/styles.scss | 31 -- frontend/tsconfig.lib.json | 1 - 268 files changed, 4741 insertions(+), 4779 deletions(-) delete mode 100644 frontend/projects/diagnostic-ui/src/app/app-routing.module.ts delete mode 100644 frontend/projects/diagnostic-ui/src/app/app.component.html delete mode 100644 frontend/projects/diagnostic-ui/src/app/app.component.scss delete mode 100644 frontend/projects/diagnostic-ui/src/app/app.component.ts delete mode 100644 frontend/projects/diagnostic-ui/src/app/app.module.ts delete mode 100644 frontend/projects/diagnostic-ui/src/app/pages/home/home-routing.module.ts delete mode 100644 frontend/projects/diagnostic-ui/src/app/pages/home/home.module.ts delete mode 100644 frontend/projects/diagnostic-ui/src/app/pages/home/home.page.html delete mode 100644 frontend/projects/diagnostic-ui/src/app/pages/home/home.page.scss delete mode 100644 frontend/projects/diagnostic-ui/src/environments/environment.prod.ts delete mode 100644 frontend/projects/diagnostic-ui/src/environments/environment.ts delete mode 100644 frontend/projects/diagnostic-ui/src/index.html delete mode 100644 frontend/projects/diagnostic-ui/src/main.ts delete mode 100644 frontend/projects/diagnostic-ui/src/polyfills.ts delete mode 100644 frontend/projects/diagnostic-ui/src/styles.scss delete mode 100644 frontend/projects/diagnostic-ui/src/zone-flags.ts delete mode 100644 frontend/projects/diagnostic-ui/tsconfig.json rename frontend/projects/{ui/src/app/common => marketplace/src/components}/store-icon/store-icon.component.html (76%) rename frontend/projects/{ui/src/app/common => marketplace/src/components}/store-icon/store-icon.component.module.ts (67%) rename frontend/projects/{ui/src/app/common => marketplace/src/components}/store-icon/store-icon.component.scss (100%) create mode 100644 frontend/projects/marketplace/src/components/store-icon/store-icon.component.ts create mode 100644 frontend/projects/marketplace/src/pages/show/additional/additional.component.scss delete mode 100644 frontend/projects/setup-wizard/src/app/modals/password/password.page.scss delete mode 100644 frontend/projects/shared/assets/fonts/Redacted/redacted.regular.ttf delete mode 100644 frontend/projects/shared/src/components/alert/alert-button.directive.ts delete mode 100644 frontend/projects/shared/src/components/alert/alert-input.directive.ts delete mode 100644 frontend/projects/shared/src/components/alert/alert.component.ts delete mode 100644 frontend/projects/shared/src/components/alert/alert.module.ts rename frontend/projects/shared/src/components/{loading/loading.component.html => initializing/initializing.component.html} (100%) create mode 100644 frontend/projects/shared/src/components/initializing/initializing.component.scss create mode 100644 frontend/projects/shared/src/components/initializing/initializing.component.ts create mode 100644 frontend/projects/shared/src/components/initializing/initializing.module.ts rename frontend/projects/shared/src/components/{loading => initializing}/logs-window/logs-window.component.html (100%) rename frontend/projects/shared/src/components/{loading => initializing}/logs-window/logs-window.component.scss (100%) rename frontend/projects/shared/src/components/{loading => initializing}/logs-window/logs-window.component.ts (96%) rename frontend/projects/{ui/src/app/common => shared/src/components}/loading/loading.service.ts (100%) delete mode 100644 frontend/projects/shared/src/components/toast/toast-button.directive.ts delete mode 100644 frontend/projects/shared/src/components/toast/toast.component.ts delete mode 100644 frontend/projects/shared/src/components/toast/toast.module.ts create mode 100644 frontend/projects/shared/src/directives/alert/alert.directive.ts create mode 100644 frontend/projects/shared/src/directives/alert/alert.module.ts create mode 100644 frontend/projects/shared/src/services/copy.service.ts delete mode 100644 frontend/projects/shared/src/services/error-toast.service.ts create mode 100644 frontend/projects/shared/styles/taiga.scss create mode 100644 frontend/projects/ui/src/app/apps/diagnostic/diagnostic.module.ts create mode 100644 frontend/projects/ui/src/app/apps/diagnostic/home/home.module.ts create mode 100644 frontend/projects/ui/src/app/apps/diagnostic/home/home.page.html create mode 100644 frontend/projects/ui/src/app/apps/diagnostic/home/home.page.scss rename frontend/projects/{diagnostic-ui/src/app/pages => ui/src/app/apps/diagnostic}/home/home.page.ts (59%) rename frontend/projects/{diagnostic-ui/src/app/pages => ui/src/app/apps/diagnostic}/logs/logs.module.ts (68%) rename frontend/projects/{diagnostic-ui/src/app/pages => ui/src/app/apps/diagnostic}/logs/logs.page.html (100%) rename frontend/projects/{diagnostic-ui/src/app/pages => ui/src/app/apps/diagnostic}/logs/logs.page.ts (84%) rename frontend/projects/{diagnostic-ui/src/app/services/api/api.service.ts => ui/src/app/apps/diagnostic/services/diagnostic.service.ts} (90%) rename frontend/projects/{diagnostic-ui/src/app/services/api/live-api.service.ts => ui/src/app/apps/diagnostic/services/live-diagnostic.service.ts} (91%) rename frontend/projects/{diagnostic-ui/src/app/services/api/mock-api.service.ts => ui/src/app/apps/diagnostic/services/mock-diagnostic.service.ts} (91%) create mode 100644 frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.html rename frontend/projects/ui/src/app/apps/ui/modals/backup-report/{backup-report.page.ts => backup-report.component.ts} (55%) delete mode 100644 frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.page.html delete mode 100644 frontend/projects/ui/src/app/apps/ui/modals/generic-input/generic-input.component.html delete mode 100644 frontend/projects/ui/src/app/apps/ui/modals/generic-input/generic-input.component.module.ts delete mode 100644 frontend/projects/ui/src/app/apps/ui/modals/generic-input/generic-input.component.ts create mode 100644 frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html create mode 100644 frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.scss create mode 100644 frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.ts create mode 100644 frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.module.ts create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.html create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.scss create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.ts delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.page.html delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.page.scss delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.page.ts create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/job-builder.ts delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/job-options/job-options.component.html delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/job-options/job-options.component.scss delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/job-options/job-options.component.ts delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/new-job/new-job.page.html delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/new-job/new-job.page.scss delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/new-job/new-job.page.ts create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts rename frontend/projects/ui/src/app/apps/ui/pages/system/{lan/lan.module.ts => domains/domains.module.ts} (57%) create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html rename frontend/projects/{diagnostic-ui/src/app/pages/logs/logs.page.scss => ui/src/app/apps/ui/pages/system/domains/domains.page.scss} (100%) create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.ts delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/lan/lan.page.html delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/lan/lan.page.scss delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/lan/lan.page.ts create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.module.ts create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.page.html create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.page.scss create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.page.ts create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.module.ts create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.page.html create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.page.scss create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.page.ts delete mode 100644 frontend/projects/ui/src/app/common/loading/loading.component.scss delete mode 100644 frontend/projects/ui/src/app/common/loading/loading.component.ts delete mode 100644 frontend/projects/ui/src/app/common/loading/loading.module.ts create mode 100644 frontend/projects/ui/src/app/common/primary-ip/primary-ip.module.ts create mode 100644 frontend/projects/ui/src/app/common/primary-ip/primary-ip.pipe.ts delete mode 100644 frontend/projects/ui/src/app/common/store-icon/store-icon.component.ts create mode 100644 frontend/projects/ui/src/app/util/clearnetAddress.ts diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 76dfec490..ea2486ad1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -220,9 +220,6 @@ instructions. is running normally. - `projects/setup-wizard`(frontend/README.md) - Code for the user interface that is displayed during the setup and recovery process for StartOS. - - `projects/diagnostic-ui` - Code for the user interface that is displayed - when something has gone wrong with starting up StartOS, which provides - helpful debugging tools. - `libs` (Rust) is a set of standalone crates that were separated out of `backend` for the purpose of portability - `patch-db` - A diff based data store that is used to synchronize data between diff --git a/Makefile b/Makefile index 1586ce8d5..71ffac6a8 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ ENVIRONMENT_FILE = $(shell ./check-environment.sh) GIT_HASH_FILE = $(shell ./check-git-hash.sh) VERSION_FILE = $(shell ./check-version.sh) EMBASSY_BINS := backend/target/$(ARCH)-unknown-linux-gnu/release/embassyd backend/target/$(ARCH)-unknown-linux-gnu/release/embassy-init backend/target/$(ARCH)-unknown-linux-gnu/release/embassy-cli backend/target/$(ARCH)-unknown-linux-gnu/release/embassy-sdk backend/target/$(ARCH)-unknown-linux-gnu/release/avahi-alias libs/target/aarch64-unknown-linux-musl/release/embassy_container_init libs/target/x86_64-unknown-linux-musl/release/embassy_container_init -EMBASSY_UIS := frontend/dist/ui frontend/dist/setup-wizard frontend/dist/diagnostic-ui frontend/dist/install-wizard +EMBASSY_UIS := frontend/dist/ui frontend/dist/setup-wizard frontend/dist/install-wizard BUILD_SRC := $(shell find build) EMBASSY_SRC := backend/embassyd.service backend/embassy-init.service $(EMBASSY_UIS) $(BUILD_SRC) COMPAT_SRC := $(shell find system-images/compat/ -not -path 'system-images/compat/target/*' -and -not -name *.tar -and -not -name target) @@ -14,7 +14,6 @@ BACKEND_SRC := $(shell find backend/src) $(shell find backend/migrations) $(shel FRONTEND_SHARED_SRC := $(shell find frontend/projects/shared) $(shell ls -p frontend/ | grep -v / | sed 's/^/frontend\//g') frontend/package.json frontend/node_modules frontend/config.json patch-db/client/dist frontend/patchdb-ui-seed.json FRONTEND_UI_SRC := $(shell find frontend/projects/ui) FRONTEND_SETUP_WIZARD_SRC := $(shell find frontend/projects/setup-wizard) -FRONTEND_DIAGNOSTIC_UI_SRC := $(shell find frontend/projects/diagnostic-ui) FRONTEND_INSTALL_WIZARD_SRC := $(shell find frontend/projects/install-wizard) PATCH_DB_CLIENT_SRC := $(shell find patch-db/client -not -path patch-db/client/dist) GZIP_BIN := $(shell which pigz || which gzip) @@ -95,7 +94,6 @@ install: $(ALL_TARGETS) $(call cp,system-images/binfmt/docker-images/$(ARCH).tar,$(DESTDIR)/usr/lib/embassy/system-images/binfmt.tar) $(call mkdir,$(DESTDIR)/var/www/html) - $(call cp,frontend/dist/diagnostic-ui,$(DESTDIR)/var/www/html/diagnostic) $(call cp,frontend/dist/setup-wizard,$(DESTDIR)/var/www/html/setup) $(call cp,frontend/dist/install-wizard,$(DESTDIR)/var/www/html/install) $(call cp,frontend/dist/ui,$(DESTDIR)/var/www/html/main) @@ -154,9 +152,6 @@ frontend/dist/ui: $(FRONTEND_UI_SRC) $(FRONTEND_SHARED_SRC) $(ENVIRONMENT_FILE) frontend/dist/setup-wizard: $(FRONTEND_SETUP_WIZARD_SRC) $(FRONTEND_SHARED_SRC) $(ENVIRONMENT_FILE) npm --prefix frontend run build:setup -frontend/dist/diagnostic-ui: $(FRONTEND_DIAGNOSTIC_UI_SRC) $(FRONTEND_SHARED_SRC) $(ENVIRONMENT_FILE) - npm --prefix frontend run build:dui - frontend/dist/install-wizard: $(FRONTEND_INSTALL_WIZARD_SRC) $(FRONTEND_SHARED_SRC) $(ENVIRONMENT_FILE) npm --prefix frontend run build:install-wiz diff --git a/frontend/README.md b/frontend/README.md index 369b9cfe6..950aff264 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -5,7 +5,6 @@ StartOS has three user interfaces and a shared library, all written in Ionic/Ang 1. **ui**: the main user interface 1. **install-wizard**: used to install StartOS 1. **setup-wizard**: used to facilitate initial setup -1. **diagnostic-ui**: used to display certain diagnostic information in the event StartOS fails to initialize 1. **marketplace**: abstracted ui elements to search for, list and display details for packages and their dependencies 1. **shared**: contains components, types, and functions shared amongst all of the UIs. diff --git a/frontend/angular.json b/frontend/angular.json index dca324ac9..d7b637042 100644 --- a/frontend/angular.json +++ b/frontend/angular.json @@ -50,6 +50,7 @@ ], "styles": [ "node_modules/@taiga-ui/core/styles/taiga-ui-theme.less", + "projects/shared/styles/taiga.scss", "projects/shared/styles/variables.scss", "projects/shared/styles/global.scss", "projects/shared/styles/shared.scss", @@ -169,9 +170,16 @@ "glob": "**/*.svg", "input": "node_modules/ionicons/dist/ionicons/svg", "output": "./svg" + }, + { + "glob": "**/*", + "input": "node_modules/@taiga-ui/icons/src", + "output": "assets/taiga-ui/icons" } ], "styles": [ + "node_modules/@taiga-ui/core/styles/taiga-ui-theme.less", + "projects/shared/styles/taiga.scss", "projects/shared/styles/variables.scss", "projects/shared/styles/global.scss", "projects/shared/styles/shared.scss", @@ -299,9 +307,16 @@ "glob": "**/*.svg", "input": "node_modules/ionicons/dist/ionicons/svg", "output": "./svg" + }, + { + "glob": "**/*", + "input": "node_modules/@taiga-ui/icons/src", + "output": "assets/taiga-ui/icons" } ], "styles": [ + "node_modules/@taiga-ui/core/styles/taiga-ui-theme.less", + "projects/shared/styles/taiga.scss", "projects/shared/styles/variables.scss", "projects/shared/styles/global.scss", "projects/shared/styles/shared.scss", @@ -393,136 +408,6 @@ } } }, - "diagnostic-ui": { - "projectType": "application", - "schematics": {}, - "root": "projects/diagnostic-ui", - "sourceRoot": "projects/diagnostic-ui/src", - "prefix": "app", - "architect": { - "build": { - "builder": "@angular-devkit/build-angular:browser", - "options": { - "outputPath": "dist/diagnostic-ui", - "index": "projects/diagnostic-ui/src/index.html", - "main": "projects/diagnostic-ui/src/main.ts", - "polyfills": "projects/diagnostic-ui/src/polyfills.ts", - "tsConfig": "projects/diagnostic-ui/tsconfig.json", - "inlineStyleLanguage": "scss", - "assets": [ - { - "glob": "**/*", - "input": "projects/shared/assets", - "output": "assets" - }, - { - "glob": "**/*.svg", - "input": "node_modules/ionicons/dist/ionicons/svg", - "output": "./svg" - } - ], - "styles": [ - "projects/shared/styles/variables.scss", - "projects/shared/styles/global.scss", - "projects/shared/styles/shared.scss", - "projects/diagnostic-ui/src/styles.scss" - ], - "scripts": [] - }, - "configurations": { - "production": { - "fileReplacements": [ - { - "replace": "projects/diagnostic-ui/src/environments/environment.ts", - "with": "projects/diagnostic-ui/src/environments/environment.prod.ts" - } - ], - "optimization": true, - "outputHashing": "all", - "sourceMap": false, - "namedChunks": false, - "aot": true, - "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": true, - "budgets": [ - { - "type": "initial", - "maximumWarning": "2mb", - "maximumError": "5mb" - } - ] - }, - "ci": { - "progress": false - }, - "development": { - "buildOptimizer": false, - "optimization": false, - "vendorChunk": true, - "extractLicenses": false, - "sourceMap": true, - "namedChunks": true - } - }, - "defaultConfiguration": "production" - }, - "serve": { - "builder": "@angular-devkit/build-angular:dev-server", - "options": { - "browserTarget": "diagnostic-ui:build" - }, - "configurations": { - "production": { - "browserTarget": "diagnostic-ui:build:production" - }, - "development": { - "browserTarget": "diagnostic-ui:build:development" - } - }, - "defaultConfiguration": "development" - }, - "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", - "options": { - "browserTarget": "diagnostic-ui:build" - } - }, - "lint": { - "builder": "@angular-eslint/builder:lint", - "options": { - "lintFilePatterns": [ - "projects/diagnostic-ui/src/**/*.ts", - "projects/diagnostic-ui/src/**/*.html" - ] - } - }, - "ionic-cordova-build": { - "builder": "@ionic/angular-toolkit:cordova-build", - "options": { - "browserTarget": "diagnostic-ui:build" - }, - "configurations": { - "production": { - "browserTarget": "diagnostic-ui:build:production" - } - } - }, - "ionic-cordova-serve": { - "builder": "@ionic/angular-toolkit:cordova-serve", - "options": { - "cordovaBuildTarget": "diagnostic-ui:ionic-cordova-build", - "devServerTarget": "diagnostic-ui:serve" - }, - "configurations": { - "production": { - "cordovaBuildTarget": "diagnostic-ui:ionic-cordova-build:production", - "devServerTarget": "diagnostic-ui:serve:production" - } - } - } - } - }, "marketplace": { "projectType": "library", "root": "projects/marketplace", diff --git a/frontend/ionic.config.json b/frontend/ionic.config.json index ee434f78a..c5810bc10 100644 --- a/frontend/ionic.config.json +++ b/frontend/ionic.config.json @@ -17,12 +17,6 @@ "integrations": {}, "type": "angular", "root": "projects/setup-wizard" - }, - "diagnostic-ui": { - "name": "diagnostic-ui", - "integrations": {}, - "type": "angular", - "root": "projects/diagnostic-ui" } }, "defaultProject": "ui" diff --git a/frontend/lint-staged.config.js b/frontend/lint-staged.config.js index 80ea7cf8b..731cc9d5e 100644 --- a/frontend/lint-staged.config.js +++ b/frontend/lint-staged.config.js @@ -4,7 +4,6 @@ module.exports = { 'projects/ui/**/*.ts': () => 'npm run check:ui', 'projects/shared/**/*.ts': () => 'npm run check:shared', 'projects/marketplace/**/*.ts': () => 'npm run check:marketplace', - 'projects/diagnostic-ui/**/*.ts': () => 'npm run check:dui', 'projects/install-wizard/**/*.ts': () => 'npm run check:install-wiz', 'projects/setup-wizard/**/*.ts': () => 'npm run check:setup', } diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 8cbbe67d5..8d70ccebf 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -25,11 +25,12 @@ "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc5", - "@taiga-ui/addon-charts": "3.28.0", - "@taiga-ui/cdk": "3.28.0", - "@taiga-ui/core": "3.28.0", - "@taiga-ui/icons": "3.28.0", - "@taiga-ui/kit": "3.28.0", + "@taiga-ui/addon-charts": "3.33.1", + "@taiga-ui/cdk": "3.33.1", + "@taiga-ui/core": "3.33.1", + "@taiga-ui/icons": "3.33.1", + "@taiga-ui/kit": "3.33.1", + "@tinkoff/ng-dompurify": "4.0.0", "angular-svg-round-progressbar": "^9.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", @@ -3716,9 +3717,9 @@ } }, "node_modules/@ng-web-apis/intersection-observer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@ng-web-apis/intersection-observer/-/intersection-observer-3.0.0.tgz", - "integrity": "sha512-Y3ts9WgXG/A6atyMlFOoP8ZNczUNxUGHSV4ii4xCepwcKW2gN/kkimsP4oPtb7UsTWzN1tF1n0bgD2civraZiA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@ng-web-apis/intersection-observer/-/intersection-observer-3.0.1.tgz", + "integrity": "sha512-oTQ+oA6eFt46xs5EQcpAZTlwxabEAeAcNm0/bzo/60WPX+003HUgkHO2ipwrVia2gF+w7oJa/zCFsQ4+agql9w==", "dependencies": { "tslib": "^2.2.0" }, @@ -4020,9 +4021,9 @@ } }, "node_modules/@taiga-ui/addon-charts": { - "version": "3.28.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.28.0.tgz", - "integrity": "sha512-ZLsOKrEfni8T+ppteJLULooRqtmvP8aZ0cf7WUEEjEeNR05out6eh8a3uHsnx241HI/or8b4OVKHbTmiFm9Mzg==", + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.33.1.tgz", + "integrity": "sha512-AL2rIt53hBq3fuV4wZjZvU/DXIz0bRMIS6IwN0/1J6J0dsawuvjAn71wVvTkI0ooI8OvDRsLyBSMPxl/QauN+w==", "dependencies": { "tslib": ">=2.0.0" }, @@ -4030,22 +4031,22 @@ "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@ng-web-apis/common": ">=2.0.0", - "@taiga-ui/cdk": ">=3.28.0", - "@taiga-ui/core": ">=3.28.0", + "@taiga-ui/cdk": ">=3.33.1", + "@taiga-ui/core": ">=3.33.1", "@tinkoff/ng-polymorpheus": ">=4.0.0" } }, "node_modules/@taiga-ui/cdk": { - "version": "3.28.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.28.0.tgz", - "integrity": "sha512-U9LTaiaHABanwxssPyutqiK1I8aUKX8ZpJ3CpMvhxszHC3zMYp4/N3RvxYfI8Mb2sqeLR8D+x85EElbWQIxRkA==", + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.33.1.tgz", + "integrity": "sha512-Zo+3orOG9BrAgIxQhfWRU+arPYyZmOy7LNTOJzwc+jAw31mCcHZLBQ9Iys+DFBMUKhARO9PRytjKysKw0YR6QQ==", "dependencies": { "@ng-web-apis/common": "2.1.0", "@ng-web-apis/mutation-observer": "2.0.0", "@ng-web-apis/resize-observer": "2.0.0", "@tinkoff/ng-event-plugins": "3.1.0", "@tinkoff/ng-polymorpheus": "4.1.0", - "tslib": "2.5.2" + "tslib": "2.5.3" }, "optionalDependencies": { "ng-morph": "2.2.4", @@ -4059,17 +4060,12 @@ "rxjs": ">=6.0.0" } }, - "node_modules/@taiga-ui/cdk/node_modules/tslib": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", - "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" - }, "node_modules/@taiga-ui/core": { - "version": "3.28.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.28.0.tgz", - "integrity": "sha512-7P62xmja4kpEwVe43zgMfSg1UmYzkdMjNr4DF1S1zU8u0gKQGYHcUFQL1hqTJk6W50xSXVyi4tlWKKCXMvEd5Q==", + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.33.1.tgz", + "integrity": "sha512-NIcjC9Sy0FDW8CUpq5KN803yM5XjTfoSqcbkrtHIYf90gDD/gWyJOQ6zBea+rlqjvfOcRlILu+/q+YJ48ldgWA==", "dependencies": { - "@taiga-ui/i18n": "^3.28.0", + "@taiga-ui/i18n": "^3.33.1", "tslib": ">=2.0.0" }, "peerDependencies": { @@ -4081,17 +4077,17 @@ "@angular/router": ">=12.0.0", "@ng-web-apis/common": ">=2.0.0", "@ng-web-apis/mutation-observer": ">=2.0.0", - "@taiga-ui/cdk": ">=3.28.0", - "@taiga-ui/i18n": ">=3.28.0", + "@taiga-ui/cdk": ">=3.33.1", + "@taiga-ui/i18n": ">=3.33.1", "@tinkoff/ng-event-plugins": ">=3.1.0", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/i18n": { - "version": "3.30.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.30.0.tgz", - "integrity": "sha512-238T1LaNmXbo/fUTQF3D4CQDV3TXw/NTc1ObpnWNDXKY7HJXEoI/tf09RZEPlQYlDT9yJJeo1m0iYp6JGipYIQ==", + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.33.1.tgz", + "integrity": "sha512-XWV+fWyIBi2sr5WK2W2MBVDE+0mxiiRMORBHkpSSl3bdUUakwKzBPktNn0Q7X8RSAhABemkmUKyGAsO5YbvU2w==", "dependencies": { "tslib": ">=2.0.0" }, @@ -4101,22 +4097,22 @@ } }, "node_modules/@taiga-ui/icons": { - "version": "3.28.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.28.0.tgz", - "integrity": "sha512-TzQEKgRLP5f+wGsDLMqnBUYPhCN/jgRzQbOWZPIrl+CzaYQTbsFRo1YlKEfMO3Wk55R8QBKv0qpj35+i2Q8Mmg==", + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.33.1.tgz", + "integrity": "sha512-JPO/7vBXBtp1ryp0n8Al3wl6ah3mEb0GMKIPVycpX0fc8jccE7i/BtHc43ep1fMSWw/3Gg+6U4YWozMQkPbvNQ==", "dependencies": { "tslib": "^2.2.0" } }, "node_modules/@taiga-ui/kit": { - "version": "3.28.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.28.0.tgz", - "integrity": "sha512-jLi/mmIS7kqG1FEY7LT+1uH76pEAiWZsZEQH+3rOwvEGaQBjLE73OPf83f/swaYtFm/DgJemMNnfEMYu661DYA==", - "dependencies": { - "@maskito/angular": "0.11.1", - "@maskito/core": "0.11.1", - "@maskito/kit": "0.11.1", - "@ng-web-apis/intersection-observer": "3.0.0", + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.33.1.tgz", + "integrity": "sha512-l2OwxFitcDJe3D2YuCm/4FYI8EwWcb2Iifp1f7k9ZRn/bFcIbT90WdZMbNW2QSdIi+/8HRpyQEFwECjSejTk1Q==", + "dependencies": { + "@maskito/angular": "1.0.0", + "@maskito/core": "1.0.0", + "@maskito/kit": "1.0.0", + "@ng-web-apis/intersection-observer": "3.0.1", "text-mask-core": "5.1.2", "tslib": ">=2.0.0" }, @@ -4128,17 +4124,17 @@ "@ng-web-apis/common": ">=2.0.0", "@ng-web-apis/mutation-observer": ">=2.0.0", "@ng-web-apis/resize-observer": ">=2.0.0", - "@taiga-ui/cdk": ">=3.28.0", - "@taiga-ui/core": ">=3.28.0", - "@taiga-ui/i18n": ">=3.28.0", + "@taiga-ui/cdk": ">=3.33.1", + "@taiga-ui/core": ">=3.33.1", + "@taiga-ui/i18n": ">=3.33.1", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/kit/node_modules/@maskito/angular": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-0.11.1.tgz", - "integrity": "sha512-80V4FT2jHv+VrJA2gRJpvWvbYVJvPHHoS0ZDqt8DZO/ejWe2SJP3+i/tFHar3i423tXk59dBLp0ahfwkaaNN1A==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-1.0.0.tgz", + "integrity": "sha512-y3uMog1Ez5l/dvWmCpiC4LnZvDvQK/JDdsVgg0YFZPQU+onnxIgdNp3S/3axN3LzuRG2bUa7xo5fBZXUt3R0JQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -4146,21 +4142,35 @@ "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@angular/forms": ">=12.0.0", - "@maskito/core": "^0.11.1", + "@maskito/core": "^1.0.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/kit/node_modules/@maskito/core": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@maskito/core/-/core-0.11.1.tgz", - "integrity": "sha512-8wPNVvlf+q1g4KF1By++eppIZxYs0XWCd/dzvtbfLQRwPXIPTnp9Cm8yWFPGbUVkfA5znkpk5OiiCLzkuYYg7A==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@maskito/core/-/core-1.0.0.tgz", + "integrity": "sha512-zFfGkc3Ir+zNudJQF727RNkcPkwvIWI/F7UcOq4Ur2Zn/n09bYoQoW4jijJ8ZZpbf2ReCzvxFKtplGnR9s/K2Q==" }, "node_modules/@taiga-ui/kit/node_modules/@maskito/kit": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-0.11.1.tgz", - "integrity": "sha512-5P+WC/oP9Cwk2aEyxGLpy934jpOwagvm2wLGGfNLZ7D0WaXSuDtXJGizG0Yt6EOnx3/EdChwI3WcmdLhDKK+bQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-1.0.0.tgz", + "integrity": "sha512-LTgIPmJZk9VPv6/tC+goPbbM3tI/XCZBCuZGsPYiYuJdKZhyF0nIhPL/Aa7ymwcwSdkZZbFHZp2vub9xDsSoUA==", + "peerDependencies": { + "@maskito/core": "^1.0.0" + } + }, + "node_modules/@tinkoff/ng-dompurify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tinkoff/ng-dompurify/-/ng-dompurify-4.0.0.tgz", + "integrity": "sha512-BjKUweWLrOx8UOZw+Tl+Dae5keYuSbeMkppcXQdsvwASMrPfmP7d3Q206Q6HDqOV2WnpnFqGUB95IMbLAeRRuw==", + "dependencies": { + "tslib": "^2.0.0" + }, "peerDependencies": { - "@maskito/core": "^0.11.1" + "@angular/core": ">=12.0.0", + "@angular/platform-browser": ">=12.0.0", + "@types/dompurify": ">=2.3.0", + "dompurify": ">= 2.3.0" } }, "node_modules/@tinkoff/ng-event-plugins": { @@ -4307,7 +4317,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-2.4.0.tgz", "integrity": "sha512-IDBwO5IZhrKvHFUl+clZxgf3hn2b/lU6H1KaBShPkQyGJUQ0xwebezIPSuiyGwfz1UzJWQl4M7BDxtHtCCPlTg==", - "dev": true, "dependencies": { "@types/trusted-types": "*" } @@ -4526,8 +4535,7 @@ "node_modules/@types/trusted-types": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", - "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==", - "dev": true + "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==" }, "node_modules/@types/uuid": { "version": "8.3.4", diff --git a/frontend/package.json b/frontend/package.json index b92c8c172..c96e73d45 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -8,12 +8,10 @@ "check": "npm run check:shared && npm run check:marketplace && npm run check:ui && npm run check:install-wiz && npm run check:setup && npm run check:dui", "check:shared": "tsc --project projects/shared/tsconfig.json --noEmit --skipLibCheck", "check:marketplace": "tsc --project projects/marketplace/tsconfig.json --noEmit --skipLibCheck", - "check:dui": "tsc --project projects/diagnostic-ui/tsconfig.json --noEmit --skipLibCheck", "check:install-wiz": "tsc --project projects/install-wizard/tsconfig.json --noEmit --skipLibCheck", "check:setup": "tsc --project projects/setup-wizard/tsconfig.json --noEmit --skipLibCheck", "check:ui": "tsc --project projects/ui/tsconfig.json --noEmit --skipLibCheck", "build:deps": "rm -rf .angular/cache && cd ../patch-db/client && npm ci && npm run build", - "build:dui": "ng run diagnostic-ui:build", "build:install-wiz": "ng run install-wizard:build", "build:setup": "ng run setup-wizard:build", "build:ui": "ng run ui:build", @@ -25,7 +23,6 @@ "analyze:ui": "webpack-bundle-analyzer dist/ui/stats.json", "publish:shared": "npm run build:shared && npm publish ./dist/shared --access public", "publish:marketplace": "npm run build:marketplace && npm publish ./dist/marketplace --access public", - "start:dui": "npm run-script build-config && ionic serve --project diagnostic-ui --host 0.0.0.0", "start:install-wiz": "npm run-script build-config && ionic serve --project install-wizard --host 0.0.0.0", "start:setup": "npm run-script build-config && ionic serve --project setup-wizard --host 0.0.0.0", "start:ui": "npm run-script build-config && ionic serve --project ui --ip --host 0.0.0.0", @@ -49,11 +46,12 @@ "@materia-ui/ngx-monaco-editor": "^6.0.0", "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", - "@taiga-ui/addon-charts": "3.28.0", - "@taiga-ui/cdk": "3.28.0", - "@taiga-ui/core": "3.28.0", - "@taiga-ui/icons": "3.28.0", - "@taiga-ui/kit": "3.28.0", + "@taiga-ui/addon-charts": "3.33.1", + "@taiga-ui/cdk": "3.33.1", + "@taiga-ui/core": "3.33.1", + "@taiga-ui/icons": "3.33.1", + "@taiga-ui/kit": "3.33.1", + "@tinkoff/ng-dompurify": "4.0.0", "angular-svg-round-progressbar": "^9.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", diff --git a/frontend/projects/diagnostic-ui/src/app/app-routing.module.ts b/frontend/projects/diagnostic-ui/src/app/app-routing.module.ts deleted file mode 100644 index fffdfeece..000000000 --- a/frontend/projects/diagnostic-ui/src/app/app-routing.module.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { NgModule } from '@angular/core' -import { PreloadAllModules, RouterModule, Routes } from '@angular/router' - -const routes: Routes = [ - { - path: '', - loadChildren: () => import('./pages/home/home.module').then( m => m.HomePageModule) - }, - { - path: 'logs', - loadChildren: () => import('./pages/logs/logs.module').then( m => m.LogsPageModule) - }, -] - -@NgModule({ - imports: [ - RouterModule.forRoot(routes, { - scrollPositionRestoration: 'enabled', - preloadingStrategy: PreloadAllModules, - useHash: true, - }) - ], - exports: [RouterModule] -}) -export class AppRoutingModule { } diff --git a/frontend/projects/diagnostic-ui/src/app/app.component.html b/frontend/projects/diagnostic-ui/src/app/app.component.html deleted file mode 100644 index cd28a7e80..000000000 --- a/frontend/projects/diagnostic-ui/src/app/app.component.html +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/frontend/projects/diagnostic-ui/src/app/app.component.scss b/frontend/projects/diagnostic-ui/src/app/app.component.scss deleted file mode 100644 index b528fd9bd..000000000 --- a/frontend/projects/diagnostic-ui/src/app/app.component.scss +++ /dev/null @@ -1,8 +0,0 @@ -:host { - display: block; - height: 100%; -} - -tui-root { - height: 100%; -} diff --git a/frontend/projects/diagnostic-ui/src/app/app.component.ts b/frontend/projects/diagnostic-ui/src/app/app.component.ts deleted file mode 100644 index 5ac82a652..000000000 --- a/frontend/projects/diagnostic-ui/src/app/app.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component } from '@angular/core' - -@Component({ - selector: 'app-root', - templateUrl: 'app.component.html', - styleUrls: ['app.component.scss'], -}) -export class AppComponent { - constructor() {} -} diff --git a/frontend/projects/diagnostic-ui/src/app/app.module.ts b/frontend/projects/diagnostic-ui/src/app/app.module.ts deleted file mode 100644 index 1abde53a3..000000000 --- a/frontend/projects/diagnostic-ui/src/app/app.module.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { NgModule } from '@angular/core' -import { BrowserAnimationsModule } from '@angular/platform-browser/animations' -import { RouteReuseStrategy } from '@angular/router' -import { IonicModule, IonicRouteStrategy } from '@ionic/angular' -import { TuiRootModule } from '@taiga-ui/core' -import { AppComponent } from './app.component' -import { AppRoutingModule } from './app-routing.module' -import { HttpClientModule } from '@angular/common/http' -import { ApiService } from './services/api/api.service' -import { MockApiService } from './services/api/mock-api.service' -import { LiveApiService } from './services/api/live-api.service' -import { RELATIVE_URL, WorkspaceConfig } from '@start9labs/shared' - -const { - useMocks, - ui: { api }, -} = require('../../../../config.json') as WorkspaceConfig - -@NgModule({ - declarations: [AppComponent], - imports: [ - HttpClientModule, - BrowserAnimationsModule, - IonicModule.forRoot({ - mode: 'md', - }), - AppRoutingModule, - TuiRootModule, - ], - providers: [ - { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }, - { - provide: ApiService, - useClass: useMocks ? MockApiService : LiveApiService, - }, - { - provide: RELATIVE_URL, - useValue: `/${api.url}/${api.version}`, - }, - ], - bootstrap: [AppComponent], -}) -export class AppModule {} diff --git a/frontend/projects/diagnostic-ui/src/app/pages/home/home-routing.module.ts b/frontend/projects/diagnostic-ui/src/app/pages/home/home-routing.module.ts deleted file mode 100644 index 6ac28af67..000000000 --- a/frontend/projects/diagnostic-ui/src/app/pages/home/home-routing.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NgModule } from '@angular/core' -import { RouterModule, Routes } from '@angular/router' -import { HomePage } from './home.page' - -const routes: Routes = [ - { - path: '', - component: HomePage, - } -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class HomePageRoutingModule {} diff --git a/frontend/projects/diagnostic-ui/src/app/pages/home/home.module.ts b/frontend/projects/diagnostic-ui/src/app/pages/home/home.module.ts deleted file mode 100644 index 63184b7a2..000000000 --- a/frontend/projects/diagnostic-ui/src/app/pages/home/home.module.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { FormsModule } from '@angular/forms' -import { HomePage } from './home.page' -import { HomePageRoutingModule } from './home-routing.module' - - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - IonicModule, - HomePageRoutingModule - ], - declarations: [HomePage] -}) -export class HomePageModule {} diff --git a/frontend/projects/diagnostic-ui/src/app/pages/home/home.page.html b/frontend/projects/diagnostic-ui/src/app/pages/home/home.page.html deleted file mode 100644 index 9cba08258..000000000 --- a/frontend/projects/diagnostic-ui/src/app/pages/home/home.page.html +++ /dev/null @@ -1,81 +0,0 @@ - -
- -

- StartOS - Diagnostic Mode -

- - -

- StartOS launch error: -

-
- - {{ error.problem }} - -
-
- {{ error.details }} -
-
-
- View Logs -

- Possible solutions: -

-
- {{ error.solution }} -
- Restart Server - - {{ error.code === 15 ? 'Setup Current Drive' : 'Enter Recovery Mode' - }} - - -
- - System Rebuild - -
- -
- - Repair Drive - -
-
-
- - -

- Server is restarting -

-

- Wait for the server to restart, then refresh this page. -

- Refresh -
-
-
diff --git a/frontend/projects/diagnostic-ui/src/app/pages/home/home.page.scss b/frontend/projects/diagnostic-ui/src/app/pages/home/home.page.scss deleted file mode 100644 index 214e26874..000000000 --- a/frontend/projects/diagnostic-ui/src/app/pages/home/home.page.scss +++ /dev/null @@ -1,5 +0,0 @@ -.code-block { - background-color: rgb(69, 69, 69); - padding: 12px; - margin-bottom: 32px; -} \ No newline at end of file diff --git a/frontend/projects/diagnostic-ui/src/environments/environment.prod.ts b/frontend/projects/diagnostic-ui/src/environments/environment.prod.ts deleted file mode 100644 index bc0327dbe..000000000 --- a/frontend/projects/diagnostic-ui/src/environments/environment.prod.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const environment = { - production: true -} diff --git a/frontend/projects/diagnostic-ui/src/environments/environment.ts b/frontend/projects/diagnostic-ui/src/environments/environment.ts deleted file mode 100644 index 745ee023b..000000000 --- a/frontend/projects/diagnostic-ui/src/environments/environment.ts +++ /dev/null @@ -1,16 +0,0 @@ -// This file can be replaced during build by using the `fileReplacements` array. -// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. -// The list of file replacements can be found in `angular.json`. - -export const environment = { - production: false -} - -/* - * For easier debugging in development mode, you can import the following file - * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. - * - * This import should be commented out in production mode because it will have a negative impact - * on performance if an error is thrown. - */ -// import 'zone.js/dist/zone-error'; // Included with Angular CLI. diff --git a/frontend/projects/diagnostic-ui/src/index.html b/frontend/projects/diagnostic-ui/src/index.html deleted file mode 100644 index 1822018f3..000000000 --- a/frontend/projects/diagnostic-ui/src/index.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - StartOS Diagnostic UI - - - - - - - - - - - - - - - diff --git a/frontend/projects/diagnostic-ui/src/main.ts b/frontend/projects/diagnostic-ui/src/main.ts deleted file mode 100644 index 21499c3cd..000000000 --- a/frontend/projects/diagnostic-ui/src/main.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { enableProdMode } from '@angular/core' -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic' -import { AppModule } from './app/app.module' -import { environment } from './environments/environment' - -if (environment.production) { - enableProdMode() -} - -platformBrowserDynamic() - .bootstrapModule(AppModule) - .catch(err => console.error(err)) diff --git a/frontend/projects/diagnostic-ui/src/polyfills.ts b/frontend/projects/diagnostic-ui/src/polyfills.ts deleted file mode 100644 index f9f1dd06f..000000000 --- a/frontend/projects/diagnostic-ui/src/polyfills.ts +++ /dev/null @@ -1,65 +0,0 @@ -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/guide/browser-support - */ - -/*************************************************************************************************** - * BROWSER POLYFILLS - */ - -/** IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. - -/** - * Web Animations `@angular/platform-browser/animations` - * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. - * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). - */ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - -/** - * By default, zone.js will patch all possible macroTask and DomEvents - * user can disable parts of macroTask/DomEvents patch by setting following flags - * because those flags need to be set before `zone.js` being loaded, and webpack - * will put import in the top of bundle, so user need to create a separate file - * in this directory (for example: zone-flags.ts), and put the following flags - * into that file, and then add the following code before importing zone.js. - * import './zone-flags'; - * - * The flags allowed in zone-flags.ts are listed here. - * - * The following flags will work for all browsers. - * - * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame - * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick - * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames - * - * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js - * with the following flag, it will bypass `zone.js` patch for IE/Edge - * - * (window as any).__Zone_enable_cross_context_check = true; - * - */ - -import './zone-flags' - -/*************************************************************************************************** - * Zone JS is required by default for Angular itself. - */ -import 'zone.js/dist/zone' // Included with Angular CLI. - - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ diff --git a/frontend/projects/diagnostic-ui/src/styles.scss b/frontend/projects/diagnostic-ui/src/styles.scss deleted file mode 100644 index 07a1d8ea0..000000000 --- a/frontend/projects/diagnostic-ui/src/styles.scss +++ /dev/null @@ -1,41 +0,0 @@ -@font-face { - font-family: 'Montserrat'; - font-style: normal; - font-weight: normal; - src: url('/assets/fonts/Montserrat/Montserrat-Regular.ttf'); -} - -/** Ionic CSS Variables overrides **/ -:root { - --ion-font-family: 'Montserrat', sans-serif; - - --ion-color-primary: #0075e1; - - --ion-color-medium: #989aa2; - --ion-color-medium-rgb: 152,154,162; - --ion-color-medium-contrast: #000000; - --ion-color-medium-contrast-rgb: 0,0,0; - --ion-color-medium-shade: #86888f; - --ion-color-medium-tint: #a2a4ab; - - --ion-color-light: #222428; - --ion-color-light-rgb: 34,36,40; - --ion-color-light-contrast: #ffffff; - --ion-color-light-contrast-rgb: 255,255,255; - --ion-color-light-shade: #1e2023; - --ion-color-light-tint: #383a3e; - - --ion-item-background: #2b2b2b; - --ion-toolbar-background: #2b2b2b; - --ion-card-background: #2b2b2b; - - --ion-background-color: #282828; - --ion-background-color-rgb: 30,30,30; - --ion-text-color: var(--ion-color-dark); - --ion-text-color-rgb: var(--ion-color-dark-rgb); -} - -.loader { - --spinner-color: var(--ion-color-warning) !important; - z-index: 40000 !important; -} diff --git a/frontend/projects/diagnostic-ui/src/zone-flags.ts b/frontend/projects/diagnostic-ui/src/zone-flags.ts deleted file mode 100644 index 24ca60fe2..000000000 --- a/frontend/projects/diagnostic-ui/src/zone-flags.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Prevents Angular change detection from - * running with certain Web Component callbacks - */ -// eslint-disable-next-line no-underscore-dangle -(window as any).__Zone_disable_customElements = true diff --git a/frontend/projects/diagnostic-ui/tsconfig.json b/frontend/projects/diagnostic-ui/tsconfig.json deleted file mode 100644 index f642f09b3..000000000 --- a/frontend/projects/diagnostic-ui/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -/* To learn more about this file see: https://angular.io/config/tsconfig. */ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "baseUrl": "./" - }, - "files": ["src/main.ts", "src/polyfills.ts"], - "include": ["src/**/*.d.ts"] -} diff --git a/frontend/projects/install-wizard/src/app/app.component.html b/frontend/projects/install-wizard/src/app/app.component.html index cd28a7e80..2d86be205 100644 --- a/frontend/projects/install-wizard/src/app/app.component.html +++ b/frontend/projects/install-wizard/src/app/app.component.html @@ -1,4 +1,5 @@ - + + diff --git a/frontend/projects/install-wizard/src/app/app.module.ts b/frontend/projects/install-wizard/src/app/app.module.ts index 1abde53a3..9cc91ba3f 100644 --- a/frontend/projects/install-wizard/src/app/app.module.ts +++ b/frontend/projects/install-wizard/src/app/app.module.ts @@ -2,14 +2,23 @@ import { NgModule } from '@angular/core' import { BrowserAnimationsModule } from '@angular/platform-browser/animations' import { RouteReuseStrategy } from '@angular/router' import { IonicModule, IonicRouteStrategy } from '@ionic/angular' -import { TuiRootModule } from '@taiga-ui/core' +import { + TuiDialogModule, + TuiModeModule, + TuiRootModule, + TuiThemeNightModule, +} from '@taiga-ui/core' import { AppComponent } from './app.component' import { AppRoutingModule } from './app-routing.module' import { HttpClientModule } from '@angular/common/http' import { ApiService } from './services/api/api.service' import { MockApiService } from './services/api/mock-api.service' import { LiveApiService } from './services/api/live-api.service' -import { RELATIVE_URL, WorkspaceConfig } from '@start9labs/shared' +import { + LoadingModule, + RELATIVE_URL, + WorkspaceConfig, +} from '@start9labs/shared' const { useMocks, @@ -26,6 +35,10 @@ const { }), AppRoutingModule, TuiRootModule, + TuiDialogModule, + LoadingModule, + TuiModeModule, + TuiThemeNightModule, ], providers: [ { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }, diff --git a/frontend/projects/install-wizard/src/app/pages/home/home.page.ts b/frontend/projects/install-wizard/src/app/pages/home/home.page.ts index c3764a976..b2bf633ee 100644 --- a/frontend/projects/install-wizard/src/app/pages/home/home.page.ts +++ b/frontend/projects/install-wizard/src/app/pages/home/home.page.ts @@ -1,8 +1,11 @@ import { Component } from '@angular/core' -import { AlertController, IonicSlides, LoadingController } from '@ionic/angular' +import { IonicSlides } from '@ionic/angular' import { ApiService } from 'src/app/services/api/api.service' import SwiperCore, { Swiper } from 'swiper' -import { DiskInfo } from '@start9labs/shared' +import { DiskInfo, LoadingService } from '@start9labs/shared' +import { TuiDialogService } from '@taiga-ui/core' +import { TUI_PROMPT } from '@taiga-ui/kit' +import { filter } from 'rxjs' SwiperCore.use([IonicSlides]) @@ -18,9 +21,9 @@ export class HomePage { error = '' constructor( - private readonly loadingCtrl: LoadingController, + private readonly loader: LoadingService, private readonly api: ApiService, - private readonly alertCtrl: AlertController, + private readonly dialogs: TuiDialogService, ) {} async ngOnInit() { @@ -55,10 +58,7 @@ export class HomePage { } private async install(overwrite: boolean) { - const loader = await this.loadingCtrl.create({ - message: 'Installing StartOS...', - }) - await loader.present() + const loader = this.loader.open('Installing StartOS...').subscribe() try { await this.api.install({ @@ -69,56 +69,52 @@ export class HomePage { } catch (e: any) { this.error = e.message } finally { - loader.dismiss() + loader.unsubscribe() } } - private async presentAlertDanger() { + private presentAlertDanger() { const { vendor, model } = this.selectedDisk! - const alert = await this.alertCtrl.create({ - header: 'Warning', - message: `This action will COMPLETELY erase the disk ${ - vendor || 'Unknown Vendor' - } - ${model || 'Unknown Model'} and install StartOS in its place`, - buttons: [ - { - text: 'Cancel', - role: 'cancel', - }, - { - text: 'Continue', - handler: () => { - this.install(true) - }, + this.dialogs + .open(TUI_PROMPT, { + label: 'Warning', + size: 's', + data: { + content: `This action will COMPLETELY erase the disk ${ + vendor || 'Unknown Vendor' + } - ${model || 'Unknown Model'} and install StartOS in its place`, + yes: 'Continue', + no: 'Cancel', }, - ], - cssClass: 'alert-danger-message', - }) - await alert.present() + }) + .pipe(filter(Boolean)) + .subscribe(() => { + this.install(true) + }) } private async presentAlertReboot() { - const alert = await this.alertCtrl.create({ - header: 'Install Success', - message: + this.dialogs + .open( 'Remove the USB stick and reboot your device to begin using your new Start9 server', - buttons: [ { - text: 'Reboot', - handler: () => { - this.reboot() - }, + label: 'Install Success', + closeable: false, + dismissible: false, + size: 's', + data: { button: 'Reboot' }, + }, + ) + .subscribe({ + complete: () => { + this.reboot() }, - ], - cssClass: 'alert-success-message', - }) - await alert.present() + }) } private async reboot() { - const loader = await this.loadingCtrl.create() - await loader.present() + const loader = this.loader.open('').subscribe() try { await this.api.reboot() @@ -126,16 +122,16 @@ export class HomePage { } catch (e: any) { this.error = e.message } finally { - loader.dismiss() + loader.unsubscribe() } } - private async presentAlertComplete() { - const alert = await this.alertCtrl.create({ - header: 'Rebooting', - message: 'Please wait for StartOS to restart, then refresh this page', - buttons: ['OK'], - }) - await alert.present() + private presentAlertComplete() { + this.dialogs + .open('Please wait for StartOS to restart, then refresh this page', { + label: 'Rebooting', + size: 's', + }) + .subscribe() } } diff --git a/frontend/projects/marketplace/package.json b/frontend/projects/marketplace/package.json index 827b6e456..85ef8b4db 100644 --- a/frontend/projects/marketplace/package.json +++ b/frontend/projects/marketplace/package.json @@ -1,12 +1,13 @@ { "name": "@start9labs/marketplace", - "version": "0.3.11", + "version": "0.3.12", "peerDependencies": { "@angular/common": ">=13.2.0", "@angular/core": ">=13.2.0", "@ionic/angular": ">=6.0.0", "@start9labs/shared": ">=0.3.0", "@taiga-ui/cdk": ">=3.0.0", + "@tinkoff/ng-dompurify": ">=4.0.0", "fuse.js": "^6.4.6" }, "dependencies": { diff --git a/frontend/projects/ui/src/app/common/store-icon/store-icon.component.html b/frontend/projects/marketplace/src/components/store-icon/store-icon.component.html similarity index 76% rename from frontend/projects/ui/src/app/common/store-icon/store-icon.component.html rename to frontend/projects/marketplace/src/components/store-icon/store-icon.component.html index 43ecb41a1..76638337e 100644 --- a/frontend/projects/ui/src/app/common/store-icon/store-icon.component.html +++ b/frontend/projects/marketplace/src/components/store-icon/store-icon.component.html @@ -1,8 +1,8 @@ diff --git a/frontend/projects/ui/src/app/common/store-icon/store-icon.component.module.ts b/frontend/projects/marketplace/src/components/store-icon/store-icon.component.module.ts similarity index 67% rename from frontend/projects/ui/src/app/common/store-icon/store-icon.component.module.ts rename to frontend/projects/marketplace/src/components/store-icon/store-icon.component.module.ts index 34b6dd2dd..5006663eb 100644 --- a/frontend/projects/ui/src/app/common/store-icon/store-icon.component.module.ts +++ b/frontend/projects/marketplace/src/components/store-icon/store-icon.component.module.ts @@ -1,10 +1,10 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { IonicModule } from '@ionic/angular' -import { GetIconPipe, StoreIconComponent } from './store-icon.component' +import { StoreIconComponent } from './store-icon.component' @NgModule({ - declarations: [StoreIconComponent, GetIconPipe], + declarations: [StoreIconComponent], imports: [CommonModule, IonicModule], exports: [StoreIconComponent], }) diff --git a/frontend/projects/ui/src/app/common/store-icon/store-icon.component.scss b/frontend/projects/marketplace/src/components/store-icon/store-icon.component.scss similarity index 100% rename from frontend/projects/ui/src/app/common/store-icon/store-icon.component.scss rename to frontend/projects/marketplace/src/components/store-icon/store-icon.component.scss diff --git a/frontend/projects/marketplace/src/components/store-icon/store-icon.component.ts b/frontend/projects/marketplace/src/components/store-icon/store-icon.component.ts new file mode 100644 index 000000000..ff4a1aeae --- /dev/null +++ b/frontend/projects/marketplace/src/components/store-icon/store-icon.component.ts @@ -0,0 +1,28 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core' +import { MarketplaceConfig, sameUrl } from '@start9labs/shared' + +@Component({ + selector: 'store-icon', + templateUrl: './store-icon.component.html', + styleUrls: ['./store-icon.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class StoreIconComponent { + @Input() + url = '' + @Input() + size?: string + @Input() + marketplace!: MarketplaceConfig + + get icon() { + const { start9, community } = this.marketplace + + if (sameUrl(this.url, start9)) { + return 'assets/img/icon_transparent.png' + } else if (sameUrl(this.url, community)) { + return 'assets/img/community-store.png' + } + return null + } +} diff --git a/frontend/projects/marketplace/src/pages/release-notes/release-notes.component.html b/frontend/projects/marketplace/src/pages/release-notes/release-notes.component.html index 74e34c88f..7cb79764b 100644 --- a/frontend/projects/marketplace/src/pages/release-notes/release-notes.component.html +++ b/frontend/projects/marketplace/src/pages/release-notes/release-notes.component.html @@ -1,6 +1,6 @@ -
+
diff --git a/frontend/projects/marketplace/src/pages/release-notes/release-notes.module.ts b/frontend/projects/marketplace/src/pages/release-notes/release-notes.module.ts index 583631dc4..59ec09c96 100644 --- a/frontend/projects/marketplace/src/pages/release-notes/release-notes.module.ts +++ b/frontend/projects/marketplace/src/pages/release-notes/release-notes.module.ts @@ -4,9 +4,11 @@ import { IonicModule } from '@ionic/angular' import { EmverPipesModule, MarkdownPipeModule, + SafeLinksModule, TextSpinnerComponentModule, } from '@start9labs/shared' import { TuiElementModule } from '@taiga-ui/cdk' +import { NgDompurifyModule } from '@tinkoff/ng-dompurify' import { ReleaseNotesComponent } from './release-notes.component' @@ -18,6 +20,8 @@ import { ReleaseNotesComponent } from './release-notes.component' EmverPipesModule, MarkdownPipeModule, TuiElementModule, + NgDompurifyModule, + SafeLinksModule, ], declarations: [ReleaseNotesComponent], exports: [ReleaseNotesComponent], diff --git a/frontend/projects/marketplace/src/pages/show/about/about.component.html b/frontend/projects/marketplace/src/pages/show/about/about.component.html index c1d76dd2c..bf8495095 100644 --- a/frontend/projects/marketplace/src/pages/show/about/about.component.html +++ b/frontend/projects/marketplace/src/pages/show/about/about.component.html @@ -4,7 +4,10 @@ -
+
diff --git a/frontend/projects/marketplace/src/pages/show/about/about.module.ts b/frontend/projects/marketplace/src/pages/show/about/about.module.ts index b48bbcbaa..cc7d4f234 100644 --- a/frontend/projects/marketplace/src/pages/show/about/about.module.ts +++ b/frontend/projects/marketplace/src/pages/show/about/about.module.ts @@ -2,7 +2,12 @@ import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' import { RouterModule } from '@angular/router' import { IonicModule } from '@ionic/angular' -import { EmverPipesModule, MarkdownPipeModule } from '@start9labs/shared' +import { + EmverPipesModule, + MarkdownPipeModule, + SafeLinksModule, +} from '@start9labs/shared' +import { NgDompurifyModule } from '@tinkoff/ng-dompurify' import { AboutComponent } from './about.component' @@ -13,6 +18,8 @@ import { AboutComponent } from './about.component' IonicModule, MarkdownPipeModule, EmverPipesModule, + NgDompurifyModule, + SafeLinksModule, ], declarations: [AboutComponent], exports: [AboutComponent], diff --git a/frontend/projects/marketplace/src/pages/show/additional/additional.component.html b/frontend/projects/marketplace/src/pages/show/additional/additional.component.html index 8937e8c74..a639cb994 100644 --- a/frontend/projects/marketplace/src/pages/show/additional/additional.component.html +++ b/frontend/projects/marketplace/src/pages/show/additional/additional.component.html @@ -18,7 +18,7 @@ *ngIf="manifest['git-hash'] as gitHash; else noHash" button detail="false" - (click)="copy(gitHash)" + (click)="copyService.copy(gitHash)" >

Git Hash

@@ -34,14 +34,39 @@

Git Hash

- +

Other Versions

Click to view other versions

+ + +
+ + +
+
- +

License

{{ manifest.license }}

@@ -51,7 +76,7 @@

License

Instructions

diff --git a/frontend/projects/marketplace/src/pages/show/additional/additional.component.scss b/frontend/projects/marketplace/src/pages/show/additional/additional.component.scss new file mode 100644 index 000000000..8508da686 --- /dev/null +++ b/frontend/projects/marketplace/src/pages/show/additional/additional.component.scss @@ -0,0 +1,10 @@ +.radio { + display: block; + margin: 1rem 0; +} + +.buttons { + display: flex; + justify-content: flex-end; + gap: 1rem; +} diff --git a/frontend/projects/marketplace/src/pages/show/additional/additional.component.ts b/frontend/projects/marketplace/src/pages/show/additional/additional.component.ts index 778ea6c54..8ac6164ae 100644 --- a/frontend/projects/marketplace/src/pages/show/additional/additional.component.ts +++ b/frontend/projects/marketplace/src/pages/show/additional/additional.component.ts @@ -4,25 +4,30 @@ import { EventEmitter, Input, Output, + TemplateRef, } from '@angular/core' +import { ActivatedRoute } from '@angular/router' import { - AlertController, - ModalController, - ToastController, -} from '@ionic/angular' + TuiAlertService, + TuiDialogContext, + TuiDialogService, +} from '@taiga-ui/core' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' import { + CopyService, copyToClipboard, displayEmver, Emver, MarkdownComponent, } from '@start9labs/shared' +import { filter } from 'rxjs' import { MarketplacePkg } from '../../../types' import { AbstractMarketplaceService } from '../../../services/marketplace.service' -import { ActivatedRoute } from '@angular/router' @Component({ selector: 'marketplace-additional', templateUrl: 'additional.component.html', + styleUrls: ['additional.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) export class AdditionalComponent { @@ -34,68 +39,46 @@ export class AdditionalComponent { readonly url = this.route.snapshot.queryParamMap.get('url') || undefined + readonly displayEmver = displayEmver + constructor( - private readonly alertCtrl: AlertController, - private readonly modalCtrl: ModalController, + readonly copyService: CopyService, + private readonly alerts: TuiAlertService, + private readonly dialogs: TuiDialogService, private readonly emver: Emver, private readonly marketplaceService: AbstractMarketplaceService, - private readonly toastCtrl: ToastController, private readonly route: ActivatedRoute, ) {} - async copy(address: string): Promise { - const success = await copyToClipboard(address) - const message = success - ? 'Copied to clipboard!' - : 'Failed to copy to clipboard.' - - const toast = await this.toastCtrl.create({ - header: message, - position: 'bottom', - duration: 1000, - }) - await toast.present() - } - - async presentAlertVersions() { - const alert = await this.alertCtrl.create({ - header: 'Versions', - inputs: this.pkg.versions - .sort((a, b) => -1 * (this.emver.compare(a, b) || 0)) - .map(v => ({ - name: v, // for CSS - type: 'radio', - label: displayEmver(v), // appearance on screen - value: v, // literal SEM version value - checked: this.pkg.manifest.version === v, - })), - buttons: [ - { - text: 'Cancel', - role: 'cancel', + presentAlertVersions(version: TemplateRef) { + this.dialogs + .open(version, { + label: 'Versions', + size: 's', + data: { + value: this.pkg.manifest.version, + items: this.pkg.versions.sort( + (a, b) => -1 * (this.emver.compare(a, b) || 0), + ), }, - { - text: 'Ok', - handler: (version: string) => this.version.emit(version), - }, - ], - }) - - await alert.present() + }) + .pipe(filter(Boolean)) + .subscribe(version => this.version.emit(version)) } - async presentModalMd(title: string) { - const content = this.marketplaceService.fetchStatic$( - this.pkg.manifest.id, - title, - this.url, - ) - - const modal = await this.modalCtrl.create({ - componentProps: { title, content }, - component: MarkdownComponent, - }) - - await modal.present() + presentModalMd(label: string) { + this.dialogs + .open(new PolymorpheusComponent(MarkdownComponent), { + label, + size: 'l', + data: { + content: this.marketplaceService.fetchStatic$( + this.pkg.manifest.id, + label.toLowerCase(), + this.url, + ), + }, + }) + .subscribe() } } diff --git a/frontend/projects/marketplace/src/pages/show/additional/additional.module.ts b/frontend/projects/marketplace/src/pages/show/additional/additional.module.ts index 8d85c7b70..640d9e7d4 100644 --- a/frontend/projects/marketplace/src/pages/show/additional/additional.module.ts +++ b/frontend/projects/marketplace/src/pages/show/additional/additional.module.ts @@ -4,9 +4,24 @@ import { IonicModule } from '@ionic/angular' import { MarkdownModule, ResponsiveColModule } from '@start9labs/shared' import { AdditionalComponent } from './additional.component' +import { + TuiRadioListModule, + TuiStringifyContentPipeModule, +} from '@taiga-ui/kit' +import { FormsModule } from '@angular/forms' +import { TuiButtonModule } from '@taiga-ui/core' @NgModule({ - imports: [CommonModule, IonicModule, MarkdownModule, ResponsiveColModule], + imports: [ + CommonModule, + IonicModule, + MarkdownModule, + ResponsiveColModule, + TuiRadioListModule, + FormsModule, + TuiStringifyContentPipeModule, + TuiButtonModule, + ], declarations: [AdditionalComponent], exports: [AdditionalComponent], }) diff --git a/frontend/projects/marketplace/src/public-api.ts b/frontend/projects/marketplace/src/public-api.ts index fef451a3e..605b76ebe 100644 --- a/frontend/projects/marketplace/src/public-api.ts +++ b/frontend/projects/marketplace/src/public-api.ts @@ -24,6 +24,8 @@ export * from './pages/show/package/package.module' export * from './pipes/filter-packages.pipe' export * from './pipes/mime-type.pipe' +export * from './components/store-icon/store-icon.component.module' + export * from './services/marketplace.service' export * from './types' diff --git a/frontend/projects/marketplace/src/types.ts b/frontend/projects/marketplace/src/types.ts index d079985e5..7ea64c967 100644 --- a/frontend/projects/marketplace/src/types.ts +++ b/frontend/projects/marketplace/src/types.ts @@ -48,7 +48,7 @@ export interface Manifest { long: string } assets: { - icon: string // ie. icon.png + icon: Url // filename } replaces?: string[] 'release-notes': string diff --git a/frontend/projects/marketplace/tsconfig.json b/frontend/projects/marketplace/tsconfig.json index e3a6b521c..e1f4625bf 100644 --- a/frontend/projects/marketplace/tsconfig.json +++ b/frontend/projects/marketplace/tsconfig.json @@ -6,8 +6,7 @@ "outDir": "../../out-tsc/lib", "declaration": true, "declarationMap": true, - "inlineSources": true, - "types": [] + "inlineSources": true }, "exclude": ["src/test.ts", "**/*.spec.ts"] } diff --git a/frontend/projects/setup-wizard/src/app/app.component.html b/frontend/projects/setup-wizard/src/app/app.component.html index cd28a7e80..2d86be205 100644 --- a/frontend/projects/setup-wizard/src/app/app.component.html +++ b/frontend/projects/setup-wizard/src/app/app.component.html @@ -1,4 +1,5 @@ - + + diff --git a/frontend/projects/setup-wizard/src/app/app.component.ts b/frontend/projects/setup-wizard/src/app/app.component.ts index b821e089d..aee925f41 100644 --- a/frontend/projects/setup-wizard/src/app/app.component.ts +++ b/frontend/projects/setup-wizard/src/app/app.component.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core' import { NavController } from '@ionic/angular' import { ApiService } from './services/api/api.service' -import { ErrorToastService } from '@start9labs/shared' +import { ErrorService } from '@start9labs/shared' @Component({ selector: 'app-root', @@ -11,7 +11,7 @@ import { ErrorToastService } from '@start9labs/shared' export class AppComponent { constructor( private readonly apiService: ApiService, - private readonly errorToastService: ErrorToastService, + private readonly errorService: ErrorService, private readonly navCtrl: NavController, ) {} @@ -26,7 +26,7 @@ export class AppComponent { await this.navCtrl.navigateForward(route) } catch (e: any) { - this.errorToastService.present(e) + this.errorService.handleError(e) } } } diff --git a/frontend/projects/setup-wizard/src/app/app.module.ts b/frontend/projects/setup-wizard/src/app/app.module.ts index 0f48d072d..b346a135c 100644 --- a/frontend/projects/setup-wizard/src/app/app.module.ts +++ b/frontend/projects/setup-wizard/src/app/app.module.ts @@ -2,7 +2,14 @@ import { NgModule } from '@angular/core' import { BrowserAnimationsModule } from '@angular/platform-browser/animations' import { RouteReuseStrategy } from '@angular/router' import { HttpClientModule } from '@angular/common/http' -import { TuiRootModule } from '@taiga-ui/core' +import { + TuiAlertModule, + tuiButtonOptionsProvider, + TuiDialogModule, + TuiModeModule, + TuiRootModule, + TuiThemeNightModule, +} from '@taiga-ui/core' import { ApiService } from './services/api/api.service' import { MockApiService } from './services/api/mock-api.service' import { LiveApiService } from './services/api/live-api.service' @@ -19,6 +26,7 @@ import { LoadingPageModule } from './pages/loading/loading.module' import { RecoverPageModule } from './pages/recover/recover.module' import { TransferPageModule } from './pages/transfer/transfer.module' import { + LoadingModule, provideSetupLogsService, provideSetupService, RELATIVE_URL, @@ -46,10 +54,16 @@ const { RecoverPageModule, TransferPageModule, TuiRootModule, + TuiDialogModule, + TuiAlertModule, + LoadingModule, + TuiModeModule, + TuiThemeNightModule, ], providers: [ provideSetupService(ApiService), provideSetupLogsService(ApiService), + tuiButtonOptionsProvider({ size: 'm' }), { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }, { provide: ApiService, diff --git a/frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.module.ts b/frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.module.ts index f10455e0c..3e26600bc 100644 --- a/frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.module.ts +++ b/frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.module.ts @@ -1,20 +1,26 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { FormsModule } from '@angular/forms' +import { FormsModule, ReactiveFormsModule } from '@angular/forms' +import { TuiButtonModule, TuiErrorModule } from '@taiga-ui/core' +import { + TuiFieldErrorPipeModule, + TuiInputModule, + TuiInputPasswordModule, +} from '@taiga-ui/kit' import { CifsModal } from './cifs-modal.page' @NgModule({ - declarations: [ - CifsModal, - ], + declarations: [CifsModal], imports: [ CommonModule, FormsModule, - IonicModule, - ], - exports: [ - CifsModal, + TuiButtonModule, + TuiInputModule, + TuiErrorModule, + ReactiveFormsModule, + TuiFieldErrorPipeModule, + TuiInputPasswordModule, ], + exports: [CifsModal], }) -export class CifsModalModule { } +export class CifsModalModule {} diff --git a/frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.html b/frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.html index ebec1b21f..6250ad636 100644 --- a/frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.html +++ b/frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.html @@ -1,94 +1,39 @@ - - - Connect Network Folder - - +
+ + Hostname + + + - - -

Hostname *

- - - -

- Hostname is required. e.g. 'My Computer' OR - 'my-computer.local' -

+ + Path + + + -

Path *

- - - -

- Path is required -

+ + Username + + + -

Username *

- - - -

- Username is required -

+ + Password + -

Password

- - - - - - -
- - - - +
+ + +
+ diff --git a/frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.scss b/frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.scss index db8acb8f7..5638f9537 100644 --- a/frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.scss +++ b/frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.scss @@ -1,16 +1,3 @@ -.item-interactive { - --highlight-background: var(--ion-color-dark) !important; +.input { + margin-top: 16px; } - -ion-item { - - &:hover { - transition-property: transform; - transform: none; - } - -} - -.item-has-focus { - --background: var(--ion-color-dark-tint) !important; -} \ No newline at end of file diff --git a/frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.ts b/frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.ts index 7f293f5e0..4335f8a0e 100644 --- a/frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.ts +++ b/frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.ts @@ -1,94 +1,117 @@ -import { Component } from '@angular/core' +import { Component, Inject } from '@angular/core' +import { FormControl, FormGroup, Validators } from '@angular/forms' +import { TUI_VALIDATION_ERRORS } from '@taiga-ui/kit' +import { LoadingService, StartOSDiskInfo } from '@start9labs/shared' +import { TuiDialogContext, TuiDialogService } from '@taiga-ui/core' +import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' import { - AlertController, - LoadingController, - ModalController, -} from '@ionic/angular' -import { ApiService, CifsBackupTarget } from 'src/app/services/api/api.service' -import { StartOSDiskInfo } from '@start9labs/shared' -import { PasswordPage } from '../password/password.page' + ApiService, + CifsBackupTarget, + CifsRecoverySource, +} from 'src/app/services/api/api.service' +import { PASSWORD } from '../password/password.page' @Component({ selector: 'cifs-modal', templateUrl: 'cifs-modal.page.html', styleUrls: ['cifs-modal.page.scss'], + providers: [ + { + provide: TUI_VALIDATION_ERRORS, + useValue: { + required: 'This field is required', + }, + }, + ], }) export class CifsModal { - cifs = { - type: 'cifs' as 'cifs', - hostname: '', - path: '', - username: '', - password: '', - } + readonly form = new FormGroup({ + hostname: new FormControl('', { + validators: [ + Validators.required, + Validators.pattern(/^[a-zA-Z0-9._-]+( [a-zA-Z0-9]+)*$/), + ], + nonNullable: true, + }), + path: new FormControl('', { + validators: [Validators.required], + nonNullable: true, + }), + username: new FormControl('', { + validators: [Validators.required], + nonNullable: true, + }), + password: new FormControl(), + }) constructor( - private readonly modalController: ModalController, + @Inject(POLYMORPHEUS_CONTEXT) + private readonly context: TuiDialogContext<{ + cifs: CifsRecoverySource + recoveryPassword: string + }>, + private readonly dialogs: TuiDialogService, private readonly api: ApiService, - private readonly loadingCtrl: LoadingController, - private readonly alertCtrl: AlertController, + private readonly loader: LoadingService, ) {} cancel() { - this.modalController.dismiss() + this.context.$implicit.complete() } async submit(): Promise { - const loader = await this.loadingCtrl.create({ - message: 'Connecting to shared folder...', - cssClass: 'loader', - }) - await loader.present() + const loader = this.loader + .open('Connecting to shared folder...') + .subscribe() try { const diskInfo = await this.api.verifyCifs({ - ...this.cifs, - password: this.cifs.password - ? await this.api.encrypt(this.cifs.password) + ...this.form.getRawValue(), + type: 'cifs', + password: this.form.value.password + ? await this.api.encrypt(String(this.form.value.password)) : null, }) - await loader.dismiss() + loader.unsubscribe() this.presentModalPassword(diskInfo) } catch (e) { - await loader.dismiss() + loader.unsubscribe() this.presentAlertFailed() } } - private async presentModalPassword(diskInfo: StartOSDiskInfo): Promise { + private presentModalPassword(diskInfo: StartOSDiskInfo) { const target: CifsBackupTarget = { - ...this.cifs, + ...this.form.getRawValue(), mountable: true, 'embassy-os': diskInfo, } - const modal = await this.modalController.create({ - component: PasswordPage, - componentProps: { target }, - }) - modal.onDidDismiss().then(res => { - if (res.role === 'success') { - this.modalController.dismiss( - { - cifs: this.cifs, - recoveryPassword: res.data.password, - }, - 'success', - ) - } - }) - await modal.present() + this.dialogs + .open(PASSWORD, { + label: 'Unlock Drive', + size: 's', + data: { target }, + }) + .subscribe(recoveryPassword => { + this.context.completeWith({ + cifs: { ...this.form.getRawValue(), type: 'cifs' }, + recoveryPassword, + }) + }) } - private async presentAlertFailed(): Promise { - const alert = await this.alertCtrl.create({ - header: 'Connection Failed', - message: + private presentAlertFailed() { + this.dialogs + .open( 'Unable to connect to shared folder. Ensure (1) target computer is connected to LAN, (2) target folder is being shared, and (3) hostname, path, and credentials are accurate.', - buttons: ['OK'], - }) - alert.present() + { + label: 'Connection Failed', + size: 's', + }, + ) + .subscribe() } } diff --git a/frontend/projects/setup-wizard/src/app/modals/password/password.module.ts b/frontend/projects/setup-wizard/src/app/modals/password/password.module.ts index 416c558f5..ce89d0709 100644 --- a/frontend/projects/setup-wizard/src/app/modals/password/password.module.ts +++ b/frontend/projects/setup-wizard/src/app/modals/password/password.module.ts @@ -1,20 +1,20 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { FormsModule } from '@angular/forms' +import { FormsModule, ReactiveFormsModule } from '@angular/forms' +import { TuiButtonModule, TuiErrorModule } from '@taiga-ui/core' +import { TuiInputPasswordModule } from '@taiga-ui/kit' import { PasswordPage } from './password.page' @NgModule({ - declarations: [ - PasswordPage, - ], + declarations: [PasswordPage], imports: [ CommonModule, FormsModule, - IonicModule, - ], - exports: [ - PasswordPage, + TuiButtonModule, + TuiInputPasswordModule, + TuiErrorModule, + ReactiveFormsModule, ], + exports: [PasswordPage], }) -export class PasswordPageModule { } +export class PasswordPageModule {} diff --git a/frontend/projects/setup-wizard/src/app/modals/password/password.page.html b/frontend/projects/setup-wizard/src/app/modals/password/password.page.html index d779077c6..10dae39cd 100644 --- a/frontend/projects/setup-wizard/src/app/modals/password/password.page.html +++ b/frontend/projects/setup-wizard/src/app/modals/password/password.page.html @@ -1,91 +1,35 @@ - - - {{ storageDrive ? 'Set Password' : 'Unlock Drive' }} - - +

+ Enter the password that was used to encrypt this drive. +

+ +

+ Choose a password for your server. + Make it good. Write it down. +

+
- -
-

- Enter the password that was used to encrypt this drive. -

- -

- Choose a password for your server. - Make it good. Write it down. -

-
- -
- - - - - - -

{{ pwError }}

- - - - - - - -

{{ verError }}

-
- -
-
-
- - - - +
+ + Enter Password + + + + + + Retype Password + + + + +
+ +
+
diff --git a/frontend/projects/setup-wizard/src/app/modals/password/password.page.scss b/frontend/projects/setup-wizard/src/app/modals/password/password.page.scss deleted file mode 100644 index d3af3bcbd..000000000 --- a/frontend/projects/setup-wizard/src/app/modals/password/password.page.scss +++ /dev/null @@ -1,21 +0,0 @@ -.item-interactive { - --highlight-background: var(--ion-color-dark) !important; -} - -ion-item { - &:hover { - transition-property: transform; - transform: none; - } -} - -.item-has-focus { - --background: var(--ion-color-dark-tint) !important; -} - -.error-message { - color: var(--ion-color-danger) !important; - font-size: .9rem !important; - margin-left: 36px; - margin-top: -16px; -} \ No newline at end of file diff --git a/frontend/projects/setup-wizard/src/app/modals/password/password.page.ts b/frontend/projects/setup-wizard/src/app/modals/password/password.page.ts index 98de93e1a..ec500c4ad 100644 --- a/frontend/projects/setup-wizard/src/app/modals/password/password.page.ts +++ b/frontend/projects/setup-wizard/src/app/modals/password/password.page.ts @@ -1,81 +1,77 @@ -import { Component, Input, ViewChild } from '@angular/core' -import { IonInput, ModalController } from '@ionic/angular' +import { Component, Inject } from '@angular/core' +import { FormControl } from '@angular/forms' +import * as argon2 from '@start9labs/argon2' +import { ErrorService } from '@start9labs/shared' +import { TuiDialogContext } from '@taiga-ui/core' +import { + PolymorpheusComponent, + POLYMORPHEUS_CONTEXT, +} from '@tinkoff/ng-polymorpheus' import { CifsBackupTarget, DiskBackupTarget, } from 'src/app/services/api/api.service' -import * as argon2 from '@start9labs/argon2' + +interface DialogData { + target?: CifsBackupTarget | DiskBackupTarget + storageDrive?: boolean +} @Component({ selector: 'app-password', templateUrl: 'password.page.html', - styleUrls: ['password.page.scss'], }) export class PasswordPage { - @ViewChild('focusInput') elem?: IonInput - @Input() target?: CifsBackupTarget | DiskBackupTarget - @Input() storageDrive = false + readonly target = this.context.data.target + readonly storageDrive = this.context.data.storageDrive + readonly password = new FormControl('', { nonNullable: true }) + readonly confirm = new FormControl('', { nonNullable: true }) - pwError = '' - password = '' - unmasked1 = false + constructor( + @Inject(POLYMORPHEUS_CONTEXT) + private readonly context: TuiDialogContext, + private readonly errorService: ErrorService, + ) {} - verError = '' - passwordVer = '' - unmasked2 = false + get passwordError(): string | null { + if (!this.password.touched || this.target) return null - constructor(private modalController: ModalController) {} + if (!this.storageDrive && !this.target?.['embassy-os']) + return 'No recovery target' // unreachable - ngAfterViewInit() { - setTimeout(() => this.elem?.setFocus(), 400) - } + if (this.password.value.length < 12) + return 'Must be 12 characters or greater' - async verifyPw() { - if (!this.target || !this.target['embassy-os']) - this.pwError = 'No recovery target' // unreachable + if (this.password.value.length > 64) + return 'Must be less than 65 characters' - try { - const passwordHash = this.target!['embassy-os']?.['password-hash'] || '' - - argon2.verify(passwordHash, this.password) - this.modalController.dismiss({ password: this.password }, 'success') - } catch (e) { - this.pwError = 'Incorrect password provided' - } + return null } - async submitPw() { - this.validate() - if (this.password !== this.passwordVer) { - this.verError = '*passwords do not match' - } - - if (this.pwError || this.verError) return - this.modalController.dismiss({ password: this.password }, 'success') + get confirmError(): string | null { + return this.confirm.touched && this.password.value !== this.confirm.value + ? 'Passwords do not match' + : null } - validate() { - if (!!this.target) return (this.pwError = '') - - if (this.passwordVer) { - this.checkVer() - } + verifyPw() { + try { + const passwordHash = this.target!['embassy-os']?.['password-hash'] || '' - if (this.password.length < 12) { - this.pwError = 'Must be 12 characters or greater' - } else if (this.password.length > 64) { - this.pwError = 'Must be less than 65 characters' - } else { - this.pwError = '' + argon2.verify(passwordHash, this.password.value) + this.context.completeWith(this.password.value) + } catch (e) { + this.errorService.handleError('Incorrect password provided') } } - checkVer() { - this.verError = - this.password !== this.passwordVer ? 'Passwords do not match' : '' + submitPw() { + this.context.completeWith(this.password.value) } cancel() { - this.modalController.dismiss() + this.context.$implicit.complete() } } + +export const PASSWORD = new PolymorpheusComponent(PasswordPage) diff --git a/frontend/projects/setup-wizard/src/app/pages/attach/attach.page.ts b/frontend/projects/setup-wizard/src/app/pages/attach/attach.page.ts index b4d6eb9f9..2662abc9d 100644 --- a/frontend/projects/setup-wizard/src/app/pages/attach/attach.page.ts +++ b/frontend/projects/setup-wizard/src/app/pages/attach/attach.page.ts @@ -1,13 +1,10 @@ import { Component } from '@angular/core' -import { - LoadingController, - ModalController, - NavController, -} from '@ionic/angular' +import { NavController } from '@ionic/angular' +import { DiskInfo, ErrorService, LoadingService } from '@start9labs/shared' +import { TuiDialogService } from '@taiga-ui/core' import { ApiService } from 'src/app/services/api/api.service' -import { DiskInfo, ErrorToastService } from '@start9labs/shared' import { StateService } from 'src/app/services/state.service' -import { PasswordPage } from 'src/app/modals/password/password.page' +import { PASSWORD, PasswordPage } from 'src/app/modals/password/password.page' @Component({ selector: 'app-attach', @@ -21,10 +18,10 @@ export class AttachPage { constructor( private readonly apiService: ApiService, private readonly navCtrl: NavController, - private readonly errToastService: ErrorToastService, + private readonly errorService: ErrorService, private readonly stateService: StateService, - private readonly modalCtrl: ModalController, - private readonly loadingCtrl: LoadingController, + private readonly dialogs: TuiDialogService, + private readonly loader: LoadingService, ) {} async ngOnInit() { @@ -41,38 +38,34 @@ export class AttachPage { try { this.drives = await this.apiService.getDrives() } catch (e: any) { - this.errToastService.present(e) + this.errorService.handleError(e) } finally { this.loading = false } } - async select(guid: string) { - const modal = await this.modalCtrl.create({ - component: PasswordPage, - componentProps: { storageDrive: true }, - }) - modal.onDidDismiss().then(res => { - if (res.data && res.data.password) { - this.attachDrive(guid, res.data.password) - } - }) - await modal.present() + select(guid: string) { + this.dialogs + .open(PASSWORD, { + label: 'Set Password', + size: 's', + data: { storageDrive: true }, + }) + .subscribe(password => { + this.attachDrive(guid, password) + }) } private async attachDrive(guid: string, password: string) { - const loader = await this.loadingCtrl.create({ - message: 'Connecting to drive...', - cssClass: 'loader', - }) - await loader.present() + const loader = this.loader.open('Connecting to drive...').subscribe() + try { await this.stateService.importDrive(guid, password) await this.navCtrl.navigateForward(`/loading`) } catch (e: any) { - this.errToastService.present(e) + this.errorService.handleError(e) } finally { - loader.dismiss() + loader.unsubscribe() } } } diff --git a/frontend/projects/setup-wizard/src/app/pages/embassy/embassy.page.ts b/frontend/projects/setup-wizard/src/app/pages/embassy/embassy.page.ts index 855051879..81a9faaba 100644 --- a/frontend/projects/setup-wizard/src/app/pages/embassy/embassy.page.ts +++ b/frontend/projects/setup-wizard/src/app/pages/embassy/embassy.page.ts @@ -1,19 +1,22 @@ import { Component } from '@angular/core' +import { NavController } from '@ionic/angular' import { - AlertController, - LoadingController, - ModalController, - NavController, -} from '@ionic/angular' + DiskInfo, + ErrorService, + GuidPipe, + LoadingService, +} from '@start9labs/shared' +import { TuiDialogService } from '@taiga-ui/core' import { ApiService, BackupRecoverySource, DiskRecoverySource, DiskMigrateSource, } from 'src/app/services/api/api.service' -import { DiskInfo, ErrorToastService, GuidPipe } from '@start9labs/shared' import { StateService } from 'src/app/services/state.service' -import { PasswordPage } from '../../modals/password/password.page' +import { PASSWORD, PasswordPage } from '../../modals/password/password.page' +import { TUI_PROMPT } from '@taiga-ui/kit' +import { filter, of, switchMap } from 'rxjs' @Component({ selector: 'app-embassy', @@ -28,11 +31,10 @@ export class EmbassyPage { constructor( private readonly apiService: ApiService, private readonly navCtrl: NavController, - private readonly modalController: ModalController, - private readonly alertCtrl: AlertController, + private readonly dialogs: TuiDialogService, private readonly stateService: StateService, - private readonly loadingCtrl: LoadingController, - private readonly errorToastService: ErrorToastService, + private readonly loader: LoadingService, + private readonly errorService: ErrorService, private readonly guidPipe: GuidPipe, ) {} @@ -77,87 +79,71 @@ export class EmbassyPage { }) } } catch (e: any) { - this.errorToastService.present(e) + this.errorService.handleError(e) } finally { this.loading = false } } - async chooseDrive(drive: DiskInfo) { - if ( - this.guidPipe.transform(drive) || - !!drive.partitions.find(p => p.used) - ) { - const alert = await this.alertCtrl.create({ - header: 'Warning', - subHeader: 'Drive contains data!', - message: 'All data stored on this drive will be permanently deleted.', - buttons: [ - { - role: 'cancel', - text: 'Cancel', - }, - { - text: 'Continue', - handler: () => { - // for backup recoveries - if (this.stateService.recoveryPassword) { - this.setupEmbassy( - drive.logicalname, - this.stateService.recoveryPassword, - ) - } else { - // for migrations and fresh setups - this.presentModalPassword(drive.logicalname) - } - }, - }, - ], + chooseDrive(drive: DiskInfo) { + of(!this.guidPipe.transform(drive) && !drive.partitions.some(p => p.used)) + .pipe( + switchMap(unused => + unused + ? of(true) + : this.dialogs.open(TUI_PROMPT, { + label: 'Warning', + size: 's', + data: { + content: + 'Drive contains data!

All data stored on this drive will be permanently deleted.

', + yes: 'Continue', + no: 'Cancel', + }, + }), + ), + ) + .pipe(filter(Boolean)) + .subscribe(() => { + // for backup recoveries + if (this.stateService.recoveryPassword) { + this.setupEmbassy( + drive.logicalname, + this.stateService.recoveryPassword, + ) + } else { + // for migrations and fresh setups + this.presentModalPassword(drive.logicalname) + } }) - await alert.present() - } else { - // for backup recoveries - if (this.stateService.recoveryPassword) { - this.setupEmbassy(drive.logicalname, this.stateService.recoveryPassword) - } else { - // for migrations and fresh setups - this.presentModalPassword(drive.logicalname) - } - } } - private async presentModalPassword(logicalname: string): Promise { - const modal = await this.modalController.create({ - component: PasswordPage, - componentProps: { - storageDrive: true, - }, - }) - modal.onDidDismiss().then(async ret => { - if (!ret.data || !ret.data.password) return - this.setupEmbassy(logicalname, ret.data.password) - }) - await modal.present() + private presentModalPassword(logicalname: string) { + this.dialogs + .open(PASSWORD, { + label: 'Set Password', + size: 's', + data: { storageDrive: true }, + }) + .subscribe(password => { + this.setupEmbassy(logicalname, password) + }) } private async setupEmbassy( logicalname: string, password: string, ): Promise { - const loader = await this.loadingCtrl.create({ - message: 'Connecting to drive...', - cssClass: 'loader', - }) - await loader.present() + const loader = this.loader.open('Connecting to drive...').subscribe() try { await this.stateService.setupEmbassy(logicalname, password) await this.navCtrl.navigateForward(`/loading`) } catch (e: any) { - this.errorToastService.present(e) + this.errorService.handleError(e) console.error(e) } finally { - loader.dismiss() + loader.unsubscribe() } } } diff --git a/frontend/projects/setup-wizard/src/app/pages/home/home.page.ts b/frontend/projects/setup-wizard/src/app/pages/home/home.page.ts index c0e93d18a..88ab04160 100644 --- a/frontend/projects/setup-wizard/src/app/pages/home/home.page.ts +++ b/frontend/projects/setup-wizard/src/app/pages/home/home.page.ts @@ -2,7 +2,7 @@ import { Component } from '@angular/core' import { IonicSlides } from '@ionic/angular' import { ApiService } from 'src/app/services/api/api.service' import SwiperCore, { Swiper } from 'swiper' -import { ErrorToastService } from '@start9labs/shared' +import { ErrorService } from '@start9labs/shared' import { StateService } from 'src/app/services/state.service' SwiperCore.use([IonicSlides]) @@ -19,7 +19,7 @@ export class HomePage { constructor( private readonly api: ApiService, - private readonly errToastService: ErrorToastService, + private readonly errorService: ErrorService, private readonly stateService: StateService, ) {} @@ -33,7 +33,7 @@ export class HomePage { await this.api.getPubKey() } catch (e: any) { this.error = true - this.errToastService.present(e) + this.errorService.handleError(e) } finally { this.loading = false } diff --git a/frontend/projects/setup-wizard/src/app/pages/loading/loading.module.ts b/frontend/projects/setup-wizard/src/app/pages/loading/loading.module.ts index 9c7ae1bc9..3de110846 100644 --- a/frontend/projects/setup-wizard/src/app/pages/loading/loading.module.ts +++ b/frontend/projects/setup-wizard/src/app/pages/loading/loading.module.ts @@ -1,6 +1,6 @@ import { NgModule } from '@angular/core' import { RouterModule, Routes } from '@angular/router' -import { LoadingModule } from '@start9labs/shared' +import { InitializingModule } from '@start9labs/shared' import { LoadingPage } from './loading.page' const routes: Routes = [ @@ -11,7 +11,7 @@ const routes: Routes = [ ] @NgModule({ - imports: [LoadingModule, RouterModule.forChild(routes)], + imports: [InitializingModule, RouterModule.forChild(routes)], declarations: [LoadingPage], }) export class LoadingPageModule {} diff --git a/frontend/projects/setup-wizard/src/app/pages/loading/loading.page.html b/frontend/projects/setup-wizard/src/app/pages/loading/loading.page.html index 559705a7f..54609eb9a 100644 --- a/frontend/projects/setup-wizard/src/app/pages/loading/loading.page.html +++ b/frontend/projects/setup-wizard/src/app/pages/loading/loading.page.html @@ -1,5 +1,5 @@ - +> diff --git a/frontend/projects/setup-wizard/src/app/pages/recover/recover.page.ts b/frontend/projects/setup-wizard/src/app/pages/recover/recover.page.ts index a8cd194ba..66cab3eff 100644 --- a/frontend/projects/setup-wizard/src/app/pages/recover/recover.page.ts +++ b/frontend/projects/setup-wizard/src/app/pages/recover/recover.page.ts @@ -1,10 +1,17 @@ import { Component, Input } from '@angular/core' -import { ModalController, NavController } from '@ionic/angular' +import { NavController } from '@ionic/angular' import { CifsModal } from 'src/app/modals/cifs-modal/cifs-modal.page' -import { ApiService, DiskBackupTarget } from 'src/app/services/api/api.service' -import { ErrorToastService } from '@start9labs/shared' +import { + ApiService, + CifsRecoverySource, + DiskBackupTarget, +} from 'src/app/services/api/api.service' +import { ErrorService } from '@start9labs/shared' import { StateService } from 'src/app/services/state.service' -import { PasswordPage } from '../../modals/password/password.page' +import { PASSWORD } from '../../modals/password/password.page' +import { TuiDialogService } from '@taiga-ui/core' +import { filter } from 'rxjs' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' @Component({ selector: 'app-recover', @@ -18,9 +25,8 @@ export class RecoverPage { constructor( private readonly apiService: ApiService, private readonly navCtrl: NavController, - private readonly modalCtrl: ModalController, - private readonly modalController: ModalController, - private readonly errToastService: ErrorToastService, + private readonly dialogs: TuiDialogService, + private readonly errorService: ErrorService, private readonly stateService: StateService, ) {} @@ -62,34 +68,28 @@ export class RecoverPage { }) }) } catch (e: any) { - this.errToastService.present(e) + this.errorService.handleError(e) } finally { this.loading = false } } - async presentModalCifs(): Promise { - const modal = await this.modalCtrl.create({ - component: CifsModal, - }) - modal.onDidDismiss().then(res => { - if (res.role === 'success') { - const { hostname, path, username, password } = res.data.cifs + presentModalCifs() { + this.dialogs + .open<{ cifs: CifsRecoverySource; recoveryPassword: string }>( + new PolymorpheusComponent(CifsModal), + { + label: 'Connect Network Folder', + }, + ) + .subscribe(({ cifs, recoveryPassword }) => { this.stateService.recoverySource = { type: 'backup', - target: { - type: 'cifs', - hostname, - path, - username, - password, - }, + target: cifs, } - this.stateService.recoveryPassword = res.data.recoveryPassword + this.stateService.recoveryPassword = recoveryPassword this.navCtrl.navigateForward('/storage') - } - }) - await modal.present() + }) } async select(target: DiskBackupTarget) { @@ -97,17 +97,16 @@ export class RecoverPage { if (!logicalname) return - const modal = await this.modalController.create({ - component: PasswordPage, - componentProps: { target }, - cssClass: 'alertlike-modal', - }) - modal.onDidDismiss().then(res => { - if (res.data?.password) { - this.selectRecoverySource(logicalname, res.data.password) - } - }) - await modal.present() + this.dialogs + .open(PASSWORD, { + label: 'Unlock Drive', + size: 's', + data: { target }, + }) + .pipe(filter(Boolean)) + .subscribe(password => { + this.selectRecoverySource(logicalname, password) + }) } private async selectRecoverySource(logicalname: string, password?: string) { diff --git a/frontend/projects/setup-wizard/src/app/pages/success/success.page.ts b/frontend/projects/setup-wizard/src/app/pages/success/success.page.ts index 4ea73e619..17da17223 100644 --- a/frontend/projects/setup-wizard/src/app/pages/success/success.page.ts +++ b/frontend/projects/setup-wizard/src/app/pages/success/success.page.ts @@ -1,6 +1,6 @@ import { DOCUMENT } from '@angular/common' import { Component, ElementRef, Inject, NgZone, ViewChild } from '@angular/core' -import { DownloadHTMLService, ErrorToastService } from '@start9labs/shared' +import { DownloadHTMLService, ErrorService } from '@start9labs/shared' import { ApiService } from 'src/app/services/api/api.service' import { StateService } from 'src/app/services/state.service' @@ -12,7 +12,8 @@ import { StateService } from 'src/app/services/state.service' }) export class SuccessPage { @ViewChild('canvas', { static: true }) - private canvas: ElementRef = {} as ElementRef + private canvas: ElementRef = + {} as ElementRef private ctx: CanvasRenderingContext2D = {} as CanvasRenderingContext2D torAddress?: string @@ -28,7 +29,7 @@ export class SuccessPage { constructor( @Inject(DOCUMENT) private readonly document: Document, - private readonly errCtrl: ErrorToastService, + private readonly errorService: ErrorService, private readonly stateService: StateService, private readonly api: ApiService, private readonly downloadHtml: DownloadHTMLService, @@ -55,7 +56,7 @@ export class SuccessPage { await this.api.exit() } } catch (e: any) { - await this.errCtrl.present(e) + await this.errorService.handleError(e) } } diff --git a/frontend/projects/setup-wizard/src/app/pages/transfer/transfer.page.ts b/frontend/projects/setup-wizard/src/app/pages/transfer/transfer.page.ts index 5de21a289..8cf58d7fa 100644 --- a/frontend/projects/setup-wizard/src/app/pages/transfer/transfer.page.ts +++ b/frontend/projects/setup-wizard/src/app/pages/transfer/transfer.page.ts @@ -1,8 +1,11 @@ import { Component } from '@angular/core' -import { AlertController, NavController } from '@ionic/angular' +import { NavController } from '@ionic/angular' import { ApiService } from 'src/app/services/api/api.service' -import { DiskInfo, ErrorToastService } from '@start9labs/shared' +import { DiskInfo, ErrorService } from '@start9labs/shared' import { StateService } from 'src/app/services/state.service' +import { TuiDialogService } from '@taiga-ui/core' +import { TUI_PROMPT } from '@taiga-ui/kit' +import { filter } from 'rxjs' @Component({ selector: 'app-transfer', @@ -16,8 +19,8 @@ export class TransferPage { constructor( private readonly apiService: ApiService, private readonly navCtrl: NavController, - private readonly alertCtrl: AlertController, - private readonly errToastService: ErrorToastService, + private readonly dialogs: TuiDialogService, + private readonly errorService: ErrorService, private readonly stateService: StateService, ) {} @@ -35,34 +38,31 @@ export class TransferPage { try { this.drives = await this.apiService.getDrives() } catch (e: any) { - this.errToastService.present(e) + this.errorService.handleError(e) } finally { this.loading = false } } - async select(guid: string) { - const alert = await this.alertCtrl.create({ - header: 'Warning', - message: - 'After transferring data from this drive, do not attempt to boot into it again as a Start9 Server. This may result in services malfunctioning, data corruption, or loss of funds.', - buttons: [ - { - role: 'cancel', - text: 'Cancel', + select(guid: string) { + this.dialogs + .open(TUI_PROMPT, { + label: 'Warning', + size: 's', + data: { + content: + 'After transferring data from this drive, do not attempt to boot into it again as a Start9 Server. This may result in services malfunctioning, data corruption, or loss of funds.', + yes: 'Continue', + no: 'Cancel', }, - { - text: 'Continue', - handler: () => { - this.stateService.recoverySource = { - type: 'migrate', - guid, - } - this.navCtrl.navigateForward(`/storage`) - }, - }, - ], - }) - await alert.present() + }) + .pipe(filter(Boolean)) + .subscribe(() => { + this.stateService.recoverySource = { + type: 'migrate', + guid, + } + this.navCtrl.navigateForward(`/storage`) + }) } } diff --git a/frontend/projects/shared/assets/fonts/Redacted/redacted.regular.ttf b/frontend/projects/shared/assets/fonts/Redacted/redacted.regular.ttf deleted file mode 100644 index 3bc1fe32c5d2531891d9441ddeb1bd99b8dd8af0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17036 zcmeHPYjjja60W}U%w#5+nM^_;0ecugAd`215CVh{!Ye=w4`(z8L*5XQm*meffSWf5h0LC>uMVs4;H?hLNvM* z`n*$DUse}=w5c~yZYJm_E-sr_zW-3sFyJeI8&QOH=-|lBZwvU=?54pXxVS*+i2w%8 zaY?`#eTD*S0fTx{J6lTz(i_tChk!pEg3=+nL5dS3f>6D59TfpNF3KU>capLEY&p~@ zXL~u(gQCw^ZbS=l$bkg4#48xlakPl`c(C3B=mnjgtf<-OR%&O{*%E2Lbevnbi}&Jv zcwat%C-W>mhi`ZHZKdy|_IA(;YEGM2kxEV6&SQDJNH3Kzk|EB%p_PyrBGT?~M!BM6dc^kZ6&K&T&sE&r*VC{6fU5@%8l2!wOiE5kO-s)hGIUtx z@T?KpBS($S8IwB}-aUT8#7UD2rc9kycumpt88c^H>+@fCeevuY=FAPy%DeBm_rdiW zw`|_}*zX^I;;ARMKfU7_x%t`Wc0J$n!b>l{{0h~VmQ{VY9|^Z4C~vd&u-%jKLxpIgrHC(3%S80z-8Z}NQ@ zcgPy!;j+WFPo*S=WD}hs*i_lVmFN1zhe0(rJ;0f}eM-k_d zsmLeifD-c)V&$ANfnZF8B5CB&ShqWl9}U6`7&H;O%~W-RejtnVdiYUQxQF{DPmgoU z%4F#%C=UNiwH>dE&6=Fh!wCSqum7n2Cy zEzCBl)DtwxywH~&w+B5g@3WM{a&mLo zcbfFNFVmWhhU3{gbrP!7tP{-!(Y(`S)PJA7lZp0phuhKL?QrKw{A@qA{%oaT=C@Df zDf=KI_iVW?9s8J$dc&=gWtPljeX>kPn|17Sr5IQOrKI*`Zig=YY`K}vD0*q*G`nd2 zqQ!%@PiXt+mGOS)LBHh9C*H~D-+kJcuAdva%XVEo*L0VDSDGBn-l6mK<-D%lxkg=; zrH#Avzqc-Dzv?dCy4yD{_jz@fewVYHE7d11XPbAIZe3m5uISfQS=zWuzppgAXm-*5 zo_zjq23kC5@u0A2M_0!0N7}hgJJ)IFI_+Gio$Iu7op!F% z&UOE5=Q`^AiD#$pT)Nt)or$zFk#;7+2h&Qf2y#SH@h!Hf|L5UO@zqUn0-3qBTlS{R ziOl|nt}=@+%#lZf{F!s`EOb+{TFmFNJn+36a$iOvMF>>whtP|bPSyDIbb;%PT}$4nc*|S>%v!uZwucS z-WvYBHP)J8Ewol!S6R1O_gIfx&)8hH6kCC<(ze33$@Y@%nC*0gJ;EC?A)+*5dBlc@ zmWU$}Uq@Oa2S(;a&W&6axju4NoJ;z>bUt(Wpm+c4bZ4SMIJF*=BlwR4+upR?8ZeN=2zMpR)`b=0b;tx@RCD$?6>1cbj_b2YG=n2uYqU)pAL_Zn5Kl-ESvoXD5hQ<`d)Zh-rJcfI3%!!yU zdKi1ahm>8o4O?y~8&BjsN))3sC#lPBr~PmTrVj(Y86{L_$obr?)+LIdooZc2189$0 z*Au5t)w+SUBLgrr)<|~NL2shLY_HmGratVHS`VW>l0~hDBfoN>TDMY~v{J3x7?)bq zdIV+Yj;Zwn6r;DQ^*1R+-4f;E{CDAbGIYP0+0#FK?a%f)-sq0U5{1xGSKwSo3S9oqcZXE-ztS(8I^A$JU211O>^3$U|w8ZZ|TiFN30fJEW7BC2Z9T7i|B zhVcbm8gnh?Jr5QXek=BYP!vp2aABV^$P}$Z@l1o4X2G8`@XWw{ezyqimvpv`Zcz8h z&Y%r@sKj*Gh4jc6HzMECOkrf9aAa@WuwO=E|8$U(qR2(j*l~Lx>%1rRqB!Jw_ohB{ z6=b=oFL|gR^~auiHDYrR4W7I=faz%qt)RQ; zWqOF(XeF(od+8B+g0?aP1?dC2lOAM7W}^F;nO4zjbb^J^MtYLIq0{tlydR#XH|Y&} z2KFwYweZD1!@39PPxLm^g7*5PqA2fgcBYQ!V9H6;1VJrGbXZP*+-h2oA~Dk87&0705VMkNn&e zMGwF&?f)@ diff --git a/frontend/projects/shared/package.json b/frontend/projects/shared/package.json index a2bbec95f..64e244562 100644 --- a/frontend/projects/shared/package.json +++ b/frontend/projects/shared/package.json @@ -10,6 +10,8 @@ "@ng-web-apis/resize-observer": ">=2.0.0", "@start9labs/emver": "^0.1.5", "@taiga-ui/cdk": ">=3.0.0", + "@taiga-ui/core": ">=3.0.0", + "@tinkoff/ng-dompurify": ">=4.0.0", "ansi-to-html": "^0.7.2" }, "exports": { diff --git a/frontend/projects/shared/src/components/alert/alert-button.directive.ts b/frontend/projects/shared/src/components/alert/alert-button.directive.ts deleted file mode 100644 index fc5320edb..000000000 --- a/frontend/projects/shared/src/components/alert/alert-button.directive.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Directive, ElementRef, Input } from '@angular/core' -import { AlertButton } from '@ionic/angular' - -@Directive({ - selector: `button[alertButton], a[alertButton]`, -}) -export class AlertButtonDirective implements AlertButton { - @Input() - icon?: string - - @Input() - role?: 'cancel' | 'destructive' | string - - handler = () => { - this.elementRef.nativeElement.click() - - return false - } - - constructor(private readonly elementRef: ElementRef) {} - - get text(): string { - return this.elementRef.nativeElement.textContent?.trim() || '' - } - - get cssClass(): string[] { - return Array.from(this.elementRef.nativeElement.classList) - } -} diff --git a/frontend/projects/shared/src/components/alert/alert-input.directive.ts b/frontend/projects/shared/src/components/alert/alert-input.directive.ts deleted file mode 100644 index af7879e37..000000000 --- a/frontend/projects/shared/src/components/alert/alert-input.directive.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Directive, ElementRef, Input } from '@angular/core' -import { AlertInput } from '@ionic/angular' - -@Directive({ - selector: `input[alertInput], textarea[alertInput]`, -}) -export class AlertInputDirective implements AlertInput { - @Input() - value?: T - - @Input() - label?: string - - constructor(private readonly elementRef: ElementRef) {} - - get checked(): boolean { - return this.elementRef.nativeElement.checked - } - - get name(): string { - return this.elementRef.nativeElement.name - } - - get type(): AlertInput['type'] { - return this.elementRef.nativeElement.type as AlertInput['type'] - } -} diff --git a/frontend/projects/shared/src/components/alert/alert.component.ts b/frontend/projects/shared/src/components/alert/alert.component.ts deleted file mode 100644 index 522ba93d3..000000000 --- a/frontend/projects/shared/src/components/alert/alert.component.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { - AfterViewInit, - ChangeDetectionStrategy, - Component, - ContentChildren, - ElementRef, - EventEmitter, - Input, - OnDestroy, - Output, - QueryList, - ViewChild, -} from '@angular/core' -import { AlertController, AlertOptions, IonicSafeString } from '@ionic/angular' -import { OverlayEventDetail } from '@ionic/core' -import { AlertButtonDirective } from './alert-button.directive' -import { AlertInputDirective } from './alert-input.directive' - -@Component({ - selector: 'alert', - template: ` -
- - - `, - styles: [':host { display: none !important; }'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AlertComponent implements AfterViewInit, OnDestroy { - @Output() - readonly dismiss = new EventEmitter>() - - @Input() - header = '' - - @Input() - subHeader = '' - - @Input() - backdropDismiss = true - - @ViewChild('message', { static: true }) - private readonly content?: ElementRef - - @ContentChildren(AlertButtonDirective) - private readonly buttons: QueryList = new QueryList() - - @ContentChildren(AlertInputDirective) - private readonly inputs: QueryList> = new QueryList() - - private alert?: HTMLIonAlertElement - - constructor( - private readonly elementRef: ElementRef, - private readonly controller: AlertController, - ) {} - - get cssClass(): string[] { - return Array.from(this.elementRef.nativeElement.classList) - } - - get message(): IonicSafeString { - return new IonicSafeString(this.content?.nativeElement.innerHTML || '') - } - - async ngAfterViewInit() { - this.alert = await this.controller.create(this.getOptions()) - this.alert.onDidDismiss().then(event => { - this.dismiss.emit(event) - }) - - await this.alert.present() - } - - async ngOnDestroy() { - await this.alert?.dismiss() - } - - private getOptions(): AlertOptions { - const { - header, - subHeader, - message, - cssClass, - buttons, - inputs, - backdropDismiss, - } = this - return { - header, - subHeader, - message, - cssClass, - backdropDismiss, - buttons: buttons.toArray(), - inputs: inputs.toArray(), - } - } -} diff --git a/frontend/projects/shared/src/components/alert/alert.module.ts b/frontend/projects/shared/src/components/alert/alert.module.ts deleted file mode 100644 index 45fa01f55..000000000 --- a/frontend/projects/shared/src/components/alert/alert.module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { NgModule } from '@angular/core' -import { AlertComponent } from './alert.component' -import { AlertButtonDirective } from './alert-button.directive' -import { AlertInputDirective } from './alert-input.directive' - -@NgModule({ - declarations: [AlertComponent, AlertButtonDirective, AlertInputDirective], - exports: [AlertComponent, AlertButtonDirective, AlertInputDirective], -}) -export class AlertModule {} diff --git a/frontend/projects/shared/src/components/loading/loading.component.html b/frontend/projects/shared/src/components/initializing/initializing.component.html similarity index 100% rename from frontend/projects/shared/src/components/loading/loading.component.html rename to frontend/projects/shared/src/components/initializing/initializing.component.html diff --git a/frontend/projects/shared/src/components/initializing/initializing.component.scss b/frontend/projects/shared/src/components/initializing/initializing.component.scss new file mode 100644 index 000000000..f21705ce5 --- /dev/null +++ b/frontend/projects/shared/src/components/initializing/initializing.component.scss @@ -0,0 +1,18 @@ +ion-card-title { + font-size: 42px; +} + +.progress { + max-width: 700px; + padding-bottom: 20px; + margin: auto auto 40px; +} + +.logs-container { + margin-top: 24px; + height: 280px; + text-align: left; + overflow: hidden; + border-radius: 31px; + margin-inline: 10px; +} diff --git a/frontend/projects/shared/src/components/initializing/initializing.component.ts b/frontend/projects/shared/src/components/initializing/initializing.component.ts new file mode 100644 index 000000000..e72cecb9e --- /dev/null +++ b/frontend/projects/shared/src/components/initializing/initializing.component.ts @@ -0,0 +1,35 @@ +import { Component, inject, Input, Output } from '@angular/core' +import { delay, filter } from 'rxjs' +import { SetupService } from '../../services/setup.service' + +@Component({ + selector: 'app-initializing', + templateUrl: 'initializing.component.html', + styleUrls: ['initializing.component.scss'], +}) +export class InitializingComponent { + readonly progress$ = inject(SetupService) + + @Input() + setupType?: 'fresh' | 'restore' | 'attach' | 'transfer' + + @Output() + readonly finished = this.progress$.pipe( + filter(progress => progress === 1), + delay(500), + ) + + getMessage(progress: number | null): string { + if (['fresh', 'attach'].includes(this.setupType || '')) { + return 'Setting up your server' + } + + if (!progress) { + return 'Preparing data. This can take a while' + } else if (progress < 1) { + return 'Copying data' + } else { + return 'Finalizing' + } + } +} diff --git a/frontend/projects/shared/src/components/initializing/initializing.module.ts b/frontend/projects/shared/src/components/initializing/initializing.module.ts new file mode 100644 index 000000000..daa025aa3 --- /dev/null +++ b/frontend/projects/shared/src/components/initializing/initializing.module.ts @@ -0,0 +1,14 @@ +import { NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' +import { IonicModule } from '@ionic/angular' +import { TuiLetModule } from '@taiga-ui/cdk' + +import { LogsWindowComponent } from './logs-window/logs-window.component' +import { InitializingComponent } from './initializing.component' + +@NgModule({ + imports: [CommonModule, IonicModule, TuiLetModule], + declarations: [InitializingComponent, LogsWindowComponent], + exports: [InitializingComponent], +}) +export class InitializingModule {} diff --git a/frontend/projects/shared/src/components/loading/logs-window/logs-window.component.html b/frontend/projects/shared/src/components/initializing/logs-window/logs-window.component.html similarity index 100% rename from frontend/projects/shared/src/components/loading/logs-window/logs-window.component.html rename to frontend/projects/shared/src/components/initializing/logs-window/logs-window.component.html diff --git a/frontend/projects/shared/src/components/loading/logs-window/logs-window.component.scss b/frontend/projects/shared/src/components/initializing/logs-window/logs-window.component.scss similarity index 100% rename from frontend/projects/shared/src/components/loading/logs-window/logs-window.component.scss rename to frontend/projects/shared/src/components/initializing/logs-window/logs-window.component.scss diff --git a/frontend/projects/shared/src/components/loading/logs-window/logs-window.component.ts b/frontend/projects/shared/src/components/initializing/logs-window/logs-window.component.ts similarity index 96% rename from frontend/projects/shared/src/components/loading/logs-window/logs-window.component.ts rename to frontend/projects/shared/src/components/initializing/logs-window/logs-window.component.ts index 4378be4af..6439ba062 100644 --- a/frontend/projects/shared/src/components/loading/logs-window/logs-window.component.ts +++ b/frontend/projects/shared/src/components/initializing/logs-window/logs-window.component.ts @@ -6,8 +6,8 @@ import { SetupLogsService } from '../../../services/setup-logs.service' import { Log } from '../../../types/api' import { toLocalIsoString } from '../../../util/to-local-iso-string' -var Convert = require('ansi-to-html') -var convert = new Convert({ +const Convert = require('ansi-to-html') +const convert = new Convert({ bg: 'transparent', }) diff --git a/frontend/projects/shared/src/components/loading/loading.component.scss b/frontend/projects/shared/src/components/loading/loading.component.scss index f21705ce5..9a7d10100 100644 --- a/frontend/projects/shared/src/components/loading/loading.component.scss +++ b/frontend/projects/shared/src/components/loading/loading.component.scss @@ -1,18 +1,20 @@ -ion-card-title { - font-size: 42px; -} +@import '@taiga-ui/core/styles/taiga-ui-local'; + +:host { + @include shadow(3); + + display: flex; + align-items: center; + max-width: 80%; + margin: auto; + padding: 1.5rem; + background: var(--tui-elevation-01); + border-radius: var(--tui-radius-m); -.progress { - max-width: 700px; - padding-bottom: 20px; - margin: auto auto 40px; + --tui-primary: var(--tui-warning-fill); } -.logs-container { - margin-top: 24px; - height: 280px; - text-align: left; - overflow: hidden; - border-radius: 31px; - margin-inline: 10px; +tui-loader { + flex-shrink: 0; + min-width: 2rem; } diff --git a/frontend/projects/shared/src/components/loading/loading.component.ts b/frontend/projects/shared/src/components/loading/loading.component.ts index 3207aebb7..373f013a1 100644 --- a/frontend/projects/shared/src/components/loading/loading.component.ts +++ b/frontend/projects/shared/src/components/loading/loading.component.ts @@ -1,35 +1,17 @@ -import { Component, inject, Input, Output } from '@angular/core' -import { delay, filter } from 'rxjs' -import { SetupService } from '../../services/setup.service' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { + POLYMORPHEUS_CONTEXT, + PolymorpheusContent, +} from '@tinkoff/ng-polymorpheus' @Component({ - selector: 'app-loading', - templateUrl: 'loading.component.html', - styleUrls: ['loading.component.scss'], + template: ` + + `, + styleUrls: ['./loading.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class LoadingComponent { - readonly progress$ = inject(SetupService) - - @Input() - setupType?: 'fresh' | 'restore' | 'attach' | 'transfer' - - @Output() - readonly finished = this.progress$.pipe( - filter(progress => progress === 1), - delay(500), - ) - - getMessage(progress: number | null): string { - if (['fresh', 'attach'].includes(this.setupType || '')) { - return 'Setting up your server' - } - - if (!progress) { - return 'Preparing data. This can take a while' - } else if (progress < 1) { - return 'Copying data' - } else { - return 'Finalizing' - } - } + readonly content: PolymorpheusContent = + inject(POLYMORPHEUS_CONTEXT)['content'] } diff --git a/frontend/projects/shared/src/components/loading/loading.module.ts b/frontend/projects/shared/src/components/loading/loading.module.ts index 1ffcd7e36..4a3798041 100644 --- a/frontend/projects/shared/src/components/loading/loading.module.ts +++ b/frontend/projects/shared/src/components/loading/loading.module.ts @@ -1,14 +1,13 @@ import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { TuiLetModule } from '@taiga-ui/cdk' - -import { LogsWindowComponent } from './logs-window/logs-window.component' +import { TuiLoaderModule } from '@taiga-ui/core' +import { tuiAsDialog } from '@taiga-ui/cdk' import { LoadingComponent } from './loading.component' +import { LoadingService } from './loading.service' @NgModule({ - imports: [CommonModule, IonicModule, TuiLetModule], - declarations: [LoadingComponent, LogsWindowComponent], + imports: [TuiLoaderModule], + declarations: [LoadingComponent], exports: [LoadingComponent], + providers: [tuiAsDialog(LoadingService)], }) export class LoadingModule {} diff --git a/frontend/projects/ui/src/app/common/loading/loading.service.ts b/frontend/projects/shared/src/components/loading/loading.service.ts similarity index 100% rename from frontend/projects/ui/src/app/common/loading/loading.service.ts rename to frontend/projects/shared/src/components/loading/loading.service.ts diff --git a/frontend/projects/shared/src/components/markdown/markdown.component.html b/frontend/projects/shared/src/components/markdown/markdown.component.html index 090070c4e..45271946d 100644 --- a/frontend/projects/shared/src/components/markdown/markdown.component.html +++ b/frontend/projects/shared/src/components/markdown/markdown.component.html @@ -1,29 +1,16 @@ - - - {{ title | titlecase }} - - - - - - - + + + {{ error }} + + - - - - {{ error }} - - +
-
- - - - -
+ + + diff --git a/frontend/projects/shared/src/components/markdown/markdown.component.module.ts b/frontend/projects/shared/src/components/markdown/markdown.component.module.ts index 6da4673d1..8b8e3a6fe 100644 --- a/frontend/projects/shared/src/components/markdown/markdown.component.module.ts +++ b/frontend/projects/shared/src/components/markdown/markdown.component.module.ts @@ -1,6 +1,7 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { IonicModule } from '@ionic/angular' +import { NgDompurifyModule } from '@tinkoff/ng-dompurify' import { MarkdownPipeModule } from '../../pipes/markdown/markdown.module' import { SafeLinksModule } from '../../directives/safe-links/safe-links.module' @@ -15,6 +16,7 @@ import { MarkdownComponent } from './markdown.component' MarkdownPipeModule, TextSpinnerComponentModule, SafeLinksModule, + NgDompurifyModule, ], exports: [MarkdownComponent], }) diff --git a/frontend/projects/shared/src/components/markdown/markdown.component.ts b/frontend/projects/shared/src/components/markdown/markdown.component.ts index 7e47acc39..922ad645c 100644 --- a/frontend/projects/shared/src/components/markdown/markdown.component.ts +++ b/frontend/projects/shared/src/components/markdown/markdown.component.ts @@ -1,5 +1,6 @@ -import { Component, Input } from '@angular/core' -import { ModalController } from '@ionic/angular' +import { Component, Inject } from '@angular/core' +import { TuiDialogContext } from '@taiga-ui/core' +import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' import { catchError, ignoreElements, @@ -10,7 +11,7 @@ import { of, } from 'rxjs' -import { getErrorMessage } from '../../services/error-toast.service' +import { getErrorMessage } from '../../services/error.service' @Component({ selector: 'markdown', @@ -18,11 +19,10 @@ import { getErrorMessage } from '../../services/error-toast.service' styleUrls: ['./markdown.component.scss'], }) export class MarkdownComponent { - @Input() content!: string | Observable - @Input() title!: string - readonly content$ = defer(() => - isObservable(this.content) ? this.content : of(this.content), + isObservable(this.context.data.content) + ? this.context.data.content + : of(this.context.data.content), ).pipe(share()) readonly error$ = this.content$.pipe( @@ -30,9 +30,15 @@ export class MarkdownComponent { catchError(e => of(getErrorMessage(e))), ) - constructor(private readonly modalCtrl: ModalController) {} + constructor( + @Inject(POLYMORPHEUS_CONTEXT) + private readonly context: TuiDialogContext< + void, + { content: string | Observable } + >, + ) {} - async dismiss() { - return this.modalCtrl.dismiss(true) + get title(): string { + return this.context.label || '' } } diff --git a/frontend/projects/shared/src/components/toast/toast-button.directive.ts b/frontend/projects/shared/src/components/toast/toast-button.directive.ts deleted file mode 100644 index 7c564961e..000000000 --- a/frontend/projects/shared/src/components/toast/toast-button.directive.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Directive, ElementRef, Input } from '@angular/core' -import { ToastButton } from '@ionic/angular' - -@Directive({ - selector: `button[toastButton], a[toastButton]`, -}) -export class ToastButtonDirective implements ToastButton { - @Input() - icon?: string - - @Input() - side?: 'start' | 'end' - - @Input() - role?: 'cancel' | string - - handler = () => { - this.elementRef.nativeElement.click() - - return false - } - - constructor(private readonly elementRef: ElementRef) {} - - get text(): string | undefined { - return this.elementRef.nativeElement.textContent?.trim() || undefined - } - - get cssClass(): string[] { - return Array.from(this.elementRef.nativeElement.classList) - } -} diff --git a/frontend/projects/shared/src/components/toast/toast.component.ts b/frontend/projects/shared/src/components/toast/toast.component.ts deleted file mode 100644 index b6431c532..000000000 --- a/frontend/projects/shared/src/components/toast/toast.component.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { - AfterViewInit, - ChangeDetectionStrategy, - Component, - ContentChildren, - ElementRef, - EventEmitter, - Input, - OnDestroy, - Output, - QueryList, - ViewChild, -} from '@angular/core' -import { IonicSafeString, ToastController, ToastOptions } from '@ionic/angular' -import { OverlayEventDetail } from '@ionic/core' -import { ToastButtonDirective } from './toast-button.directive' - -@Component({ - selector: 'toast', - template: ` -
- - `, - styles: [':host { display: none !important; }'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class ToastComponent implements AfterViewInit, OnDestroy { - @Output() - readonly dismiss = new EventEmitter>() - - @Input() - header = '' - - @Input() - duration = 0 - - @Input() - position: 'top' | 'bottom' | 'middle' = 'bottom' - - @ViewChild('message', { static: true }) - private readonly content?: ElementRef - - @ContentChildren(ToastButtonDirective) - private readonly buttons: QueryList = new QueryList() - - private toast?: HTMLIonToastElement - - constructor( - private readonly elementRef: ElementRef, - private readonly controller: ToastController, - ) {} - - get cssClass(): string[] { - return Array.from(this.elementRef.nativeElement.classList) - } - - get message(): IonicSafeString { - return new IonicSafeString(this.content?.nativeElement.innerHTML || '') - } - - async ngAfterViewInit() { - this.toast = await this.controller.create(this.getOptions()) - this.toast.onDidDismiss().then(event => { - this.dismiss.emit(event) - }) - - await this.toast.present() - } - - async ngOnDestroy() { - await this.toast?.dismiss() - } - - private getOptions(): ToastOptions { - const { header, message, duration, position, cssClass, buttons } = this - return { - header, - message, - duration, - position, - cssClass, - buttons: buttons.toArray(), - } - } -} diff --git a/frontend/projects/shared/src/components/toast/toast.module.ts b/frontend/projects/shared/src/components/toast/toast.module.ts deleted file mode 100644 index 9f5304f5d..000000000 --- a/frontend/projects/shared/src/components/toast/toast.module.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { NgModule } from '@angular/core' -import { ToastComponent } from './toast.component' -import { ToastButtonDirective } from './toast-button.directive' - -@NgModule({ - declarations: [ToastComponent, ToastButtonDirective], - exports: [ToastComponent, ToastButtonDirective], -}) -export class ToastModule {} diff --git a/frontend/projects/shared/src/directives/alert/alert.directive.ts b/frontend/projects/shared/src/directives/alert/alert.directive.ts new file mode 100644 index 000000000..c9c7e3b4a --- /dev/null +++ b/frontend/projects/shared/src/directives/alert/alert.directive.ts @@ -0,0 +1,22 @@ +import { Directive } from '@angular/core' +import { + AbstractTuiDialogDirective, + AbstractTuiDialogService, +} from '@taiga-ui/cdk' +import { TuiAlertOptions, TuiAlertService } from '@taiga-ui/core' + +// TODO: Move to Taiga UI +@Directive({ + selector: 'ng-template[tuiAlert]', + providers: [ + { + provide: AbstractTuiDialogService, + useExisting: TuiAlertService, + }, + ], + inputs: ['options: tuiAlertOptions', 'open: tuiAlert'], + outputs: ['openChange: tuiAlertChange'], +}) +export class TuiAlertDirective extends AbstractTuiDialogDirective< + TuiAlertOptions +> {} diff --git a/frontend/projects/shared/src/directives/alert/alert.module.ts b/frontend/projects/shared/src/directives/alert/alert.module.ts new file mode 100644 index 000000000..75791bd29 --- /dev/null +++ b/frontend/projects/shared/src/directives/alert/alert.module.ts @@ -0,0 +1,8 @@ +import { NgModule } from '@angular/core' +import { TuiAlertDirective } from './alert.directive' + +@NgModule({ + declarations: [TuiAlertDirective], + exports: [TuiAlertDirective], +}) +export class TuiAlertModule {} diff --git a/frontend/projects/shared/src/pipes/markdown/markdown.pipe.ts b/frontend/projects/shared/src/pipes/markdown/markdown.pipe.ts index f2c024670..bd6bb8630 100644 --- a/frontend/projects/shared/src/pipes/markdown/markdown.pipe.ts +++ b/frontend/projects/shared/src/pipes/markdown/markdown.pipe.ts @@ -1,28 +1,11 @@ import { Pipe, PipeTransform } from '@angular/core' import { marked } from 'marked' -import * as DOMPurify from 'dompurify' @Pipe({ name: 'markdown', }) export class MarkdownPipe implements PipeTransform { transform(value: string): string { - if (value && value.length > 0) { - // convert markdown to html - const html = marked(value) - // sanitize html - const sanitized = DOMPurify.sanitize(html) - // parse html to find all links - let parser = new DOMParser() - const doc = parser.parseFromString(sanitized, 'text/html') - const links = Array.from(doc.getElementsByTagName('a')) - // add target="_blank" to every link - links.forEach(link => { - link.setAttribute('target', '_blank') - }) - // return new html string - return doc.documentElement.innerHTML - } - return value + return value?.length ? marked(value) : '' } } diff --git a/frontend/projects/shared/src/public-api.ts b/frontend/projects/shared/src/public-api.ts index da0632cc1..2f0dea166 100644 --- a/frontend/projects/shared/src/public-api.ts +++ b/frontend/projects/shared/src/public-api.ts @@ -5,23 +5,21 @@ export * from './classes/http-error' export * from './classes/rpc-error' -export * from './components/alert/alert.component' -export * from './components/alert/alert.module' -export * from './components/alert/alert-button.directive' -export * from './components/alert/alert-input.directive' -export * from './components/loading/logs-window/logs-window.component' -export * from './components/loading/loading.module' +export * from './components/initializing/logs-window/logs-window.component' +export * from './components/initializing/initializing.module' +export * from './components/initializing/initializing.component' export * from './components/loading/loading.component' +export * from './components/loading/loading.module' +export * from './components/loading/loading.service' export * from './components/markdown/markdown.component' export * from './components/markdown/markdown.component.module' export * from './components/text-spinner/text-spinner.component' export * from './components/text-spinner/text-spinner.component.module' export * from './components/ticker/ticker.component' export * from './components/ticker/ticker.module' -export * from './components/toast/toast.component' -export * from './components/toast/toast.module' -export * from './components/toast/toast-button.directive' +export * from './directives/alert/alert.directive' +export * from './directives/alert/alert.module' export * from './directives/responsive-col/responsive-col.directive' export * from './directives/responsive-col/responsive-col.module' export * from './directives/responsive-col/responsive-col-viewport.directive' @@ -43,10 +41,10 @@ export * from './pipes/shared/trust.pipe' export * from './pipes/unit-conversion/unit-conversion.module' export * from './pipes/unit-conversion/unit-conversion.pipe' +export * from './services/copy.service' export * from './services/download-html.service' export * from './services/emver.service' export * from './services/error.service' -export * from './services/error-toast.service' export * from './services/http.service' export * from './services/setup.service' export * from './services/setup-logs.service' diff --git a/frontend/projects/shared/src/services/copy.service.ts b/frontend/projects/shared/src/services/copy.service.ts new file mode 100644 index 000000000..39bf3d733 --- /dev/null +++ b/frontend/projects/shared/src/services/copy.service.ts @@ -0,0 +1,16 @@ +import { inject, Injectable } from '@angular/core' +import { TuiAlertService } from '@taiga-ui/core' +import { copyToClipboard } from '../util/copy-to-clipboard' + +@Injectable({ providedIn: 'root' }) +export class CopyService { + private readonly alerts = inject(TuiAlertService) + + async copy(text: string) { + const success = await copyToClipboard(text) + + this.alerts + .open(success ? 'Copied to clipboard!' : 'Failed to copy to clipboard.') + .subscribe() + } +} diff --git a/frontend/projects/shared/src/services/error-toast.service.ts b/frontend/projects/shared/src/services/error-toast.service.ts deleted file mode 100644 index 2ac1314f7..000000000 --- a/frontend/projects/shared/src/services/error-toast.service.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { Injectable } from '@angular/core' -import { IonicSafeString, ToastController } from '@ionic/angular' -import { HttpError } from '../classes/http-error' - -@Injectable({ - providedIn: 'root', -}) -export class ErrorToastService { - private toast?: HTMLIonToastElement - - constructor(private readonly toastCtrl: ToastController) {} - - async present(e: HttpError | string, link?: string): Promise { - console.error(e) - - if (this.toast) return - - this.toast = await this.toastCtrl.create({ - header: 'Error', - message: getErrorMessage(e, link), - duration: 0, - position: 'top', - cssClass: 'error-toast', - buttons: [ - { - side: 'end', - icon: 'close', - handler: () => { - this.dismiss() - }, - }, - ], - }) - await this.toast.present() - } - - async dismiss(): Promise { - if (this.toast) { - await this.toast.dismiss() - this.toast = undefined - } - } -} - -export function getErrorMessage( - e: HttpError | string, - link?: string, -): string | IonicSafeString { - let message = '' - - if (typeof e === 'string') { - message = e - } else if (e.code === 0) { - message = - 'Request Error. Your browser blocked the request. This is usually caused by a corrupt browser cache or an overly aggressive ad blocker. Please clear your browser cache and/or adjust your ad blocker and try again' - } else if (!e.message) { - message = 'Unknown Error' - link = 'https://docs.start9.com/latest/support/faq' - } else { - message = e.message - } - - if (link) { - return new IonicSafeString( - `${message}

Get Help`, - ) - } - - return message -} diff --git a/frontend/projects/shared/src/services/error.service.ts b/frontend/projects/shared/src/services/error.service.ts index bb0221ce2..45891e0f4 100644 --- a/frontend/projects/shared/src/services/error.service.ts +++ b/frontend/projects/shared/src/services/error.service.ts @@ -22,7 +22,7 @@ export class ErrorService extends ErrorHandler { } } -function getErrorMessage(e: HttpError | string, link?: string): string { +export function getErrorMessage(e: HttpError | string, link?: string): string { let message = '' if (typeof e === 'string') { diff --git a/frontend/projects/shared/src/services/setup.service.ts b/frontend/projects/shared/src/services/setup.service.ts index f05007869..118cf35fe 100644 --- a/frontend/projects/shared/src/services/setup.service.ts +++ b/frontend/projects/shared/src/services/setup.service.ts @@ -1,4 +1,4 @@ -import { inject, StaticClassProvider, Type } from '@angular/core' +import { inject, StaticClassProvider } from '@angular/core' import { catchError, EMPTY, @@ -12,8 +12,8 @@ import { takeWhile, } from 'rxjs' import { SetupStatus } from '../types/api' -import { ErrorToastService } from './error-toast.service' import { Constructor } from '../types/constructor' +import { ErrorService } from './error.service' export function provideSetupService( api: Constructor[0]>, @@ -26,12 +26,12 @@ export function provideSetupService( } export class SetupService extends Observable { - private readonly errorToastService = inject(ErrorToastService) + private readonly errorService = inject(ErrorService) private readonly progress$ = interval(500).pipe( exhaustMap(() => from(this.api.getSetupStatus()).pipe( catchError(e => { - this.errorToastService.present(e) + this.errorService.handleError(e) return EMPTY }), diff --git a/frontend/projects/shared/src/types/workspace-config.ts b/frontend/projects/shared/src/types/workspace-config.ts index 997ded733..2da7d3f8d 100644 --- a/frontend/projects/shared/src/types/workspace-config.ts +++ b/frontend/projects/shared/src/types/workspace-config.ts @@ -4,19 +4,21 @@ export type WorkspaceConfig = { gitHash: string useMocks: boolean enableWidgets: boolean - // each key corresponds to a project and values adjust settings for that project, eg: ui, install-wizard, setup-wizard, diagnostic-ui + // each key corresponds to a project and values adjust settings for that project, eg: ui, install-wizard, setup-wizard ui: { api: { url: string version: string } - marketplace: { - start9: 'https://registry.start9.com/' - community: 'https://community-registry.start9.com/' - } + marketplace: MarketplaceConfig mocks: { maskAs: 'tor' | 'lan' skipStartupAlerts: boolean } } } + +export interface MarketplaceConfig { + start9: 'https://registry.start9.com/' + community: 'https://community-registry.start9.com/' +} diff --git a/frontend/projects/shared/styles/shared.scss b/frontend/projects/shared/styles/shared.scss index 725d7d985..4bcedd0f4 100644 --- a/frontend/projects/shared/styles/shared.scss +++ b/frontend/projects/shared/styles/shared.scss @@ -160,3 +160,10 @@ a { color: aqua; text-decoration: none; } + +.modal-buttons { + display: flex; + justify-content: flex-end; + gap: 16px; + margin-top: 24px; +} diff --git a/frontend/projects/shared/styles/taiga.scss b/frontend/projects/shared/styles/taiga.scss new file mode 100644 index 000000000..8bd35d622 --- /dev/null +++ b/frontend/projects/shared/styles/taiga.scss @@ -0,0 +1,49 @@ +@import '@taiga-ui/core/styles/taiga-ui-local'; + +/* stylelint-disable order/order */ +[tuiWrapper][data-appearance='secondary-warning'] { + background: var(--tui-warning-bg); + color: var(--tui-warning-fill); + + &[data-mode='onDark'] { + background: var(--tui-warning-bg-night); + color: var(--tui-warning-fill-night); + + @include wrapper-hover { + background: var(--tui-warning-bg-night-hover); + } + + @include wrapper-active { + background: var(--tui-warning-bg-night-hover); + } + } + + @include wrapper-hover { + background: var(--tui-warning-bg-hover); + } + + @include wrapper-active { + background: var(--tui-warning-bg-hover); + } +} + +tui-dialog { + transform: translate3d(0, 0, 0); +} + +tui-opt-group[data-label^='⚠️']:before { + color: var(--tui-warning-fill); +} + +tui-hint[data-appearance='onDark'] { + background: white !important; + color: #222 !important; +} + +[tuiLink] { + color: var(--tui-link) !important; + + &:hover { + color: var(--tui-link-hover) !important; + } +} diff --git a/frontend/projects/ui/src/app/app.component.html b/frontend/projects/ui/src/app/app.component.html index 29c7e11a3..dcc65b8c6 100644 --- a/frontend/projects/ui/src/app/app.component.html +++ b/frontend/projects/ui/src/app/app.component.html @@ -7,7 +7,7 @@
@@ -84,3 +84,7 @@ + + + + diff --git a/frontend/projects/ui/src/app/app.component.ts b/frontend/projects/ui/src/app/app.component.ts index af049e130..68e77ffee 100644 --- a/frontend/projects/ui/src/app/app.component.ts +++ b/frontend/projects/ui/src/app/app.component.ts @@ -1,5 +1,6 @@ import { Component, inject, OnDestroy } from '@angular/core' -import { merge } from 'rxjs' +import { Router } from '@angular/router' +import { combineLatest, map, merge } from 'rxjs' import { AuthService } from './services/auth.service' import { SplitPaneTracker } from './services/split-pane.service' import { PatchDataService } from './services/patch-data.service' @@ -15,6 +16,10 @@ import { THEME } from '@start9labs/shared' import { PatchDB } from 'patch-db-client' import { DataModel } from './services/patch-db/data-model' +function hasNavigation(url: string): boolean { + return !url.startsWith('/loading') && !url.startsWith('/diagnostic') +} + @Component({ selector: 'app-root', templateUrl: 'app.component.html', @@ -25,8 +30,13 @@ export class AppComponent implements OnDestroy { readonly sidebarOpen$ = this.splitPane.sidebarOpen$ readonly widgetDrawer$ = this.clientStorageService.widgetDrawer$ readonly theme$ = inject(THEME) + readonly navigation$ = combineLatest([ + this.authService.isVerified$, + this.router.events.pipe(map(() => hasNavigation(this.router.url))), + ]).pipe(map(([isVerified, hasNavigation]) => isVerified && hasNavigation)) constructor( + private readonly router: Router, private readonly titleService: Title, private readonly patchData: PatchDataService, private readonly patchMonitor: PatchMonitorService, diff --git a/frontend/projects/ui/src/app/app.module.ts b/frontend/projects/ui/src/app/app.module.ts index 215c97e83..c3f9c6fb1 100644 --- a/frontend/projects/ui/src/app/app.module.ts +++ b/frontend/projects/ui/src/app/app.module.ts @@ -16,6 +16,7 @@ import { ResponsiveColModule, SharedPipesModule, LightThemeModule, + LoadingModule, } from '@start9labs/shared' import { AppComponent } from './app.component' @@ -32,7 +33,6 @@ import { ConnectionBarComponentModule } from './app/connection-bar/connection-ba import { WidgetsPageModule } from 'src/app/apps/ui/pages/widgets/widgets.module' import { ServiceWorkerModule } from '@angular/service-worker' import { environment } from '../environments/environment' -import { LoadingModule } from './common/loading/loading.module' @NgModule({ declarations: [AppComponent], diff --git a/frontend/projects/ui/src/app/app/menu/menu.component.html b/frontend/projects/ui/src/app/app/menu/menu.component.html index bd9a2ce2c..a6305090d 100644 --- a/frontend/projects/ui/src/app/app/menu/menu.component.html +++ b/frontend/projects/ui/src/app/app/menu/menu.component.html @@ -54,9 +54,9 @@ Play Snek diff --git a/frontend/projects/ui/src/app/app/preloader/preloader.component.html b/frontend/projects/ui/src/app/app/preloader/preloader.component.html index f20fe4a96..5c1c4f388 100644 --- a/frontend/projects/ui/src/app/app/preloader/preloader.component.html +++ b/frontend/projects/ui/src/app/app/preloader/preloader.component.html @@ -63,7 +63,6 @@ - @@ -83,5 +82,4 @@

a

a

a

-

a

diff --git a/frontend/projects/ui/src/app/app/preloader/preloader.component.ts b/frontend/projects/ui/src/app/app/preloader/preloader.component.ts index df0ae29b7..bb08430b1 100644 --- a/frontend/projects/ui/src/app/app/preloader/preloader.component.ts +++ b/frontend/projects/ui/src/app/app/preloader/preloader.component.ts @@ -82,9 +82,11 @@ const ICONS = [ 'settings-outline', 'shield-checkmark-outline', 'stop-outline', + 'stopwatch-outline', 'storefront-outline', 'swap-vertical', 'terminal-outline', + 'trail-sign-outline', 'trash', 'trash-outline', 'warning-outline', diff --git a/frontend/projects/ui/src/app/app/snek/snake.page.html b/frontend/projects/ui/src/app/app/snek/snake.page.html index 9e037ce8d..1fc48c47c 100644 --- a/frontend/projects/ui/src/app/app/snek/snake.page.html +++ b/frontend/projects/ui/src/app/app/snek/snake.page.html @@ -1,28 +1,8 @@ - - - Play Snek! - Score: {{ score }} - - - - -
- -
-
- - - - High Score: {{ highScore }} - - - Save and Quit - - - - +
+ +
+
+ Score: {{ score }} + High Score: {{ highScore }} + +
diff --git a/frontend/projects/ui/src/app/app/snek/snake.page.scss b/frontend/projects/ui/src/app/app/snek/snake.page.scss index c07d3a2b7..50605f1dc 100644 --- a/frontend/projects/ui/src/app/app/snek/snake.page.scss +++ b/frontend/projects/ui/src/app/app/snek/snake.page.scss @@ -1,6 +1,14 @@ .canvas-center { + min-height: 50vh; padding-top: 20px; display: flex; align-items: center; justify-content: center; -} \ No newline at end of file +} + +.footer { + display: flex; + align-items: center; + justify-content: space-between; + padding-top: 32px; +} diff --git a/frontend/projects/ui/src/app/app/snek/snake.page.ts b/frontend/projects/ui/src/app/app/snek/snake.page.ts index 6c671201d..eeadb9df0 100644 --- a/frontend/projects/ui/src/app/app/snek/snake.page.ts +++ b/frontend/projects/ui/src/app/app/snek/snake.page.ts @@ -1,15 +1,22 @@ -import { Component, HostListener, Input } from '@angular/core' -import { ModalController } from '@ionic/angular' -import { pauseFor } from '../../../../../shared/src/public-api' +import { + AfterViewInit, + Component, + HostListener, + Inject, + OnDestroy, +} from '@angular/core' +import { pauseFor } from '@start9labs/shared' +import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' +import { TuiDialogContext } from '@taiga-ui/core' +import { DOCUMENT } from '@angular/common' @Component({ selector: 'snake', templateUrl: './snake.page.html', styleUrls: ['./snake.page.scss'], }) -export class SnakePage { - @Input() - highScore = 0 +export class SnakePage implements AfterViewInit, OnDestroy { + highScore = this.dialog.data.highScore score = 0 @@ -30,11 +37,16 @@ export class SnakePage { private bitcoin: { x: number; y: number } = { x: NaN, y: NaN } private moveQueue: String[] = [] + private destroyed = false - constructor(private readonly modalCtrl: ModalController) {} + constructor( + @Inject(DOCUMENT) private readonly document: Document, + @Inject(POLYMORPHEUS_CONTEXT) + private readonly dialog: TuiDialogContext, + ) {} - async dismiss() { - return this.modalCtrl.dismiss({ highScore: this.highScore }) + dismiss() { + this.dialog.completeWith(this.highScore) } @HostListener('document:keydown', ['$event']) @@ -57,7 +69,11 @@ export class SnakePage { this.init() } - ionViewDidEnter() { + ngOnDestroy() { + this.destroyed = true + } + + ngAfterViewInit() { this.init() this.image = new Image() @@ -68,10 +84,10 @@ export class SnakePage { } init() { - this.canvas = document.querySelector('canvas#game')! + this.canvas = this.document.querySelector('canvas#game')! this.canvas.style.border = '1px solid #e0e0e0' this.context = this.canvas.getContext('2d')! - const container = document.getElementsByClassName('canvas-center')[0] + const container = this.document.querySelector('.canvas-center')! this.grid = Math.min( Math.floor(container.clientWidth / this.width), Math.floor(container.clientHeight / this.height), @@ -139,13 +155,15 @@ export class SnakePage { // game loop async loop() { + if (this.destroyed) return + await pauseFor(this.speed) requestAnimationFrame(async () => await this.loop()) this.context.clearRect(0, 0, this.canvas.width, this.canvas.height) - // move snake by it's velocity + // move snake by its velocity this.snake.x += this.snake.dx this.snake.y += this.snake.dy diff --git a/frontend/projects/ui/src/app/app/snek/snek.directive.ts b/frontend/projects/ui/src/app/app/snek/snek.directive.ts index 5c8cc76b4..246db7c09 100644 --- a/frontend/projects/ui/src/app/app/snek/snek.directive.ts +++ b/frontend/projects/ui/src/app/app/snek/snek.directive.ts @@ -1,7 +1,9 @@ import { Directive, HostListener, Input } from '@angular/core' -import { LoadingController, ModalController } from '@ionic/angular' -import { ErrorToastService } from '@start9labs/shared' +import { ErrorService, LoadingService } from '@start9labs/shared' import { ApiService } from 'src/app/services/api/embassy-api.service' +import { TuiDialogService } from '@taiga-ui/core' +import { filter } from 'rxjs' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' import { SnakePage } from './snake.page' @Directive({ @@ -9,45 +11,40 @@ import { SnakePage } from './snake.page' }) export class SnekDirective { @Input() - appSnekHighScore: number | null = null + appSnekHighScore = 0 constructor( - private readonly modalCtrl: ModalController, - private readonly loadingCtrl: LoadingController, - private readonly errToast: ErrorToastService, + private readonly dialogs: TuiDialogService, + private readonly loader: LoadingService, + private readonly errorService: ErrorService, private readonly embassyApi: ApiService, ) {} @HostListener('click') async onClick() { - const modal = await this.modalCtrl.create({ - component: SnakePage, - cssClass: 'snake-modal', - backdropDismiss: false, - componentProps: { highScore: this.appSnekHighScore || 0 }, - }) - - modal.onDidDismiss().then(async ({ data }) => { - if (data?.highScore <= (this.appSnekHighScore || 0)) return - - const loader = await this.loadingCtrl.create({ - message: 'Saving high score...', + this.dialogs + .open(new PolymorpheusComponent(SnakePage), { + label: 'Snake!', + closeable: false, + dismissible: false, + data: { + highScore: this.appSnekHighScore, + }, + }) + .pipe(filter(score => score > this.appSnekHighScore)) + .subscribe(async score => { + const loader = this.loader.open('Saving high score...').subscribe() + + try { + await this.embassyApi.setDbValue( + ['gaming', 'snake', 'high-score'], + score, + ) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } }) - - await loader.present() - - try { - await this.embassyApi.setDbValue( - ['gaming', 'snake', 'high-score'], - data.highScore, - ) - } catch (e: any) { - this.errToast.present(e) - } finally { - this.loadingCtrl.dismiss() - } - }) - - modal.present() } } diff --git a/frontend/projects/ui/src/app/app/snek/snek.module.ts b/frontend/projects/ui/src/app/app/snek/snek.module.ts index 73f4d0e8f..8bb81a01e 100644 --- a/frontend/projects/ui/src/app/app/snek/snek.module.ts +++ b/frontend/projects/ui/src/app/app/snek/snek.module.ts @@ -4,9 +4,10 @@ import { IonicModule } from '@ionic/angular' import { SnekDirective } from './snek.directive' import { SnakePage } from './snake.page' +import { TuiButtonModule } from '@taiga-ui/core' @NgModule({ - imports: [CommonModule, IonicModule], + imports: [CommonModule, IonicModule, TuiButtonModule], declarations: [SnekDirective, SnakePage], exports: [SnekDirective, SnakePage], }) diff --git a/frontend/projects/ui/src/app/apps/diagnostic/diagnostic.module.ts b/frontend/projects/ui/src/app/apps/diagnostic/diagnostic.module.ts new file mode 100644 index 000000000..ddb8d4def --- /dev/null +++ b/frontend/projects/ui/src/app/apps/diagnostic/diagnostic.module.ts @@ -0,0 +1,32 @@ +import { NgModule } from '@angular/core' +import { RouterModule, Routes } from '@angular/router' +import { WorkspaceConfig } from '@start9labs/shared' +import { DiagnosticService } from './services/diagnostic.service' +import { MockDiagnosticService } from './services/mock-diagnostic.service' +import { LiveDiagnosticService } from './services/live-diagnostic.service' + +const { useMocks } = require('../../../../../../config.json') as WorkspaceConfig + +const ROUTES: Routes = [ + { + path: '', + loadChildren: () => + import('./home/home.module').then(m => m.HomePageModule), + }, + { + path: 'logs', + loadChildren: () => + import('./logs/logs.module').then(m => m.LogsPageModule), + }, +] + +@NgModule({ + imports: [RouterModule.forChild(ROUTES)], + providers: [ + { + provide: DiagnosticService, + useClass: useMocks ? MockDiagnosticService : LiveDiagnosticService, + }, + ], +}) +export class DiagnosticModule {} diff --git a/frontend/projects/ui/src/app/apps/diagnostic/home/home.module.ts b/frontend/projects/ui/src/app/apps/diagnostic/home/home.module.ts new file mode 100644 index 000000000..62f6394e5 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/diagnostic/home/home.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' +import { RouterModule, Routes } from '@angular/router' +import { TuiButtonModule } from '@taiga-ui/core' +import { HomePage } from './home.page' + +const ROUTES: Routes = [ + { + path: '', + component: HomePage, + }, +] + +@NgModule({ + imports: [CommonModule, TuiButtonModule, RouterModule.forChild(ROUTES)], + declarations: [HomePage], +}) +export class HomePageModule {} diff --git a/frontend/projects/ui/src/app/apps/diagnostic/home/home.page.html b/frontend/projects/ui/src/app/apps/diagnostic/home/home.page.html new file mode 100644 index 000000000..9accfe6ce --- /dev/null +++ b/frontend/projects/ui/src/app/apps/diagnostic/home/home.page.html @@ -0,0 +1,53 @@ + +

StartOS - Diagnostic Mode

+ + +

StartOS launch error:

+ +

{{ error.problem }}

+

{{ error.details }}

+
+ + View Logs + +

Possible solutions:

+

{{ error.solution }}

+ +
+ + + + + + + +
+
+
+ + +

Server is restarting

+

+ Wait for the server to restart, then refresh this page. +

+ +
diff --git a/frontend/projects/ui/src/app/apps/diagnostic/home/home.page.scss b/frontend/projects/ui/src/app/apps/diagnostic/home/home.page.scss new file mode 100644 index 000000000..15ec44f64 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/diagnostic/home/home.page.scss @@ -0,0 +1,35 @@ +:host { + display: block; + padding: 32px; + overflow: auto; +} + +.title { + text-align: center; + padding-bottom: 24px; + font-size: calc(2vw + 14px); +} + +.subtitle { + padding-top: 16px; + padding-bottom: 16px; + font-size: calc(1vw + 12px); + font-weight: bold; +} + +.code { + display: block; + color: var(--tui-success-fill); + background: rgb(69, 69, 69); + padding: 1px 16px; + margin-bottom: 32px; +} + +.warning { + color: var(--tui-warning-fill); +} + +.buttons { + display: flex; + gap: 16px; +} diff --git a/frontend/projects/diagnostic-ui/src/app/pages/home/home.page.ts b/frontend/projects/ui/src/app/apps/diagnostic/home/home.page.ts similarity index 59% rename from frontend/projects/diagnostic-ui/src/app/pages/home/home.page.ts rename to frontend/projects/ui/src/app/apps/diagnostic/home/home.page.ts index bbda6939f..8af9be855 100644 --- a/frontend/projects/diagnostic-ui/src/app/pages/home/home.page.ts +++ b/frontend/projects/ui/src/app/apps/diagnostic/home/home.page.ts @@ -1,6 +1,10 @@ -import { Component } from '@angular/core' -import { AlertController, LoadingController } from '@ionic/angular' -import { ApiService } from 'src/app/services/api/api.service' +import { Component, Inject } from '@angular/core' +import { WINDOW } from '@ng-web-apis/common' +import { LoadingService } from '@start9labs/shared' +import { TuiDialogService } from '@taiga-ui/core' +import { TUI_PROMPT } from '@taiga-ui/kit' +import { filter } from 'rxjs' +import { DiagnosticService } from '../services/diagnostic.service' @Component({ selector: 'app-home', @@ -8,19 +12,19 @@ import { ApiService } from 'src/app/services/api/api.service' styleUrls: ['home.page.scss'], }) export class HomePage { + restarted = false error?: { code: number problem: string solution: string details?: string } - solutions: string[] = [] - restarted = false constructor( - private readonly loadingCtrl: LoadingController, - private readonly api: ApiService, - private readonly alertCtrl: AlertController, + private readonly loader: LoadingService, + private readonly api: DiagnosticService, + private readonly dialogs: TuiDialogService, + @Inject(WINDOW) private readonly window: Window, ) {} async ngOnInit() { @@ -86,10 +90,7 @@ export class HomePage { } async restart(): Promise { - const loader = await this.loadingCtrl.create({ - cssClass: 'loader', - }) - await loader.present() + const loader = this.loader.open('').subscribe() try { await this.api.restart() @@ -97,15 +98,12 @@ export class HomePage { } catch (e) { console.error(e) } finally { - loader.dismiss() + loader.unsubscribe() } } async forgetDrive(): Promise { - const loader = await this.loadingCtrl.create({ - cssClass: 'loader', - }) - await loader.present() + const loader = this.loader.open('').subscribe() try { await this.api.forgetDrive() @@ -114,71 +112,60 @@ export class HomePage { } catch (e) { console.error(e) } finally { - loader.dismiss() + loader.unsubscribe() } } async presentAlertSystemRebuild() { - const alert = await this.alertCtrl.create({ - header: 'Warning', - message: - '

This action will tear down all service containers and rebuild them from scratch. No data will be deleted.

A system rebuild can be useful if your system gets into a bad state, and it should only be performed if you are experiencing general performance or reliability issues.

It may take up to an hour to complete. During this time, you will lose all connectivity to your Start9 server.

', - buttons: [ - { - text: 'Cancel', - role: 'cancel', - }, - { - text: 'Rebuild', - handler: () => { - try { - this.systemRebuild() - } catch (e) { - console.error(e) - } - }, + this.dialogs + .open(TUI_PROMPT, { + label: 'Warning', + size: 's', + data: { + no: 'Cancel', + yes: 'Rebuild', + content: + '

This action will tear down all service containers and rebuild them from scratch. No data will be deleted.

A system rebuild can be useful if your system gets into a bad state, and it should only be performed if you are experiencing general performance or reliability issues.

It may take up to an hour to complete. During this time, you will lose all connectivity to your Start9 server.

', }, - ], - cssClass: 'alert-warning-message', - }) - await alert.present() + }) + .pipe(filter(Boolean)) + .subscribe(() => { + try { + this.systemRebuild() + } catch (e) { + console.error(e) + } + }) } async presentAlertRepairDisk() { - const alert = await this.alertCtrl.create({ - header: 'Warning', - message: - '

This action should only be executed if directed by a Start9 support specialist.

If anything happens to the device during the reboot, such as losing power or unplugging the drive, the filesystem will be in an unrecoverable state. Please proceed with caution.

', - buttons: [ - { - text: 'Cancel', - role: 'cancel', - }, - { - text: 'Repair', - handler: () => { - try { - this.repairDisk() - } catch (e) { - console.error(e) - } - }, + this.dialogs + .open(TUI_PROMPT, { + label: 'Warning', + size: 's', + data: { + no: 'Cancel', + yes: 'Repair', + content: + '

This action should only be executed if directed by a Start9 support specialist.

If anything happens to the device during the reboot, such as losing power or unplugging the drive, the filesystem will be in an unrecoverable state. Please proceed with caution.

', }, - ], - cssClass: 'alert-error-message', - }) - await alert.present() + }) + .pipe(filter(Boolean)) + .subscribe(() => { + try { + this.repairDisk() + } catch (e) { + console.error(e) + } + }) } refreshPage(): void { - window.location.reload() + this.window.location.reload() } private async systemRebuild(): Promise { - const loader = await this.loadingCtrl.create({ - cssClass: 'loader', - }) - await loader.present() + const loader = this.loader.open('').subscribe() try { await this.api.systemRebuild() @@ -187,15 +174,12 @@ export class HomePage { } catch (e) { console.error(e) } finally { - loader.dismiss() + loader.unsubscribe() } } private async repairDisk(): Promise { - const loader = await this.loadingCtrl.create({ - cssClass: 'loader', - }) - await loader.present() + const loader = this.loader.open('').subscribe() try { await this.api.repairDisk() @@ -204,7 +188,7 @@ export class HomePage { } catch (e) { console.error(e) } finally { - loader.dismiss() + loader.unsubscribe() } } } diff --git a/frontend/projects/diagnostic-ui/src/app/pages/logs/logs.module.ts b/frontend/projects/ui/src/app/apps/diagnostic/logs/logs.module.ts similarity index 68% rename from frontend/projects/diagnostic-ui/src/app/pages/logs/logs.module.ts rename to frontend/projects/ui/src/app/apps/diagnostic/logs/logs.module.ts index da4d046b4..7cb2cc2e1 100644 --- a/frontend/projects/diagnostic-ui/src/app/pages/logs/logs.module.ts +++ b/frontend/projects/ui/src/app/apps/diagnostic/logs/logs.module.ts @@ -4,7 +4,7 @@ import { Routes, RouterModule } from '@angular/router' import { IonicModule } from '@ionic/angular' import { LogsPage } from './logs.page' -const routes: Routes = [ +const ROUTES: Routes = [ { path: '', component: LogsPage, @@ -12,11 +12,7 @@ const routes: Routes = [ ] @NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - ], + imports: [CommonModule, IonicModule, RouterModule.forChild(ROUTES)], declarations: [LogsPage], }) -export class LogsPageModule { } +export class LogsPageModule {} diff --git a/frontend/projects/diagnostic-ui/src/app/pages/logs/logs.page.html b/frontend/projects/ui/src/app/apps/diagnostic/logs/logs.page.html similarity index 100% rename from frontend/projects/diagnostic-ui/src/app/pages/logs/logs.page.html rename to frontend/projects/ui/src/app/apps/diagnostic/logs/logs.page.html diff --git a/frontend/projects/diagnostic-ui/src/app/pages/logs/logs.page.ts b/frontend/projects/ui/src/app/apps/diagnostic/logs/logs.page.ts similarity index 84% rename from frontend/projects/diagnostic-ui/src/app/pages/logs/logs.page.ts rename to frontend/projects/ui/src/app/apps/diagnostic/logs/logs.page.ts index 317cd1ea3..7aaf0f519 100644 --- a/frontend/projects/diagnostic-ui/src/app/pages/logs/logs.page.ts +++ b/frontend/projects/ui/src/app/apps/diagnostic/logs/logs.page.ts @@ -1,17 +1,16 @@ import { Component, ViewChild } from '@angular/core' import { IonContent } from '@ionic/angular' -import { ApiService } from 'src/app/services/api/api.service' -import { ErrorToastService, toLocalIsoString } from '@start9labs/shared' +import { ErrorService, toLocalIsoString } from '@start9labs/shared' +import { DiagnosticService } from '../services/diagnostic.service' -var Convert = require('ansi-to-html') -var convert = new Convert({ +const Convert = require('ansi-to-html') +const convert = new Convert({ bg: 'transparent', }) @Component({ selector: 'logs', templateUrl: './logs.page.html', - styleUrls: ['./logs.page.scss'], }) export class LogsPage { @ViewChild(IonContent) private content?: IonContent @@ -22,8 +21,8 @@ export class LogsPage { isOnBottom = true constructor( - private readonly api: ApiService, - private readonly errToast: ErrorToastService, + private readonly api: DiagnosticService, + private readonly errorService: ErrorService, ) {} async ngOnInit() { @@ -89,7 +88,7 @@ export class LogsPage { this.needInfinite = false } } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } } } diff --git a/frontend/projects/diagnostic-ui/src/app/services/api/api.service.ts b/frontend/projects/ui/src/app/apps/diagnostic/services/diagnostic.service.ts similarity index 90% rename from frontend/projects/diagnostic-ui/src/app/services/api/api.service.ts rename to frontend/projects/ui/src/app/apps/diagnostic/services/diagnostic.service.ts index 562d486c3..e8bd20a28 100644 --- a/frontend/projects/diagnostic-ui/src/app/services/api/api.service.ts +++ b/frontend/projects/ui/src/app/apps/diagnostic/services/diagnostic.service.ts @@ -1,6 +1,6 @@ import { LogsRes, ServerLogsReq } from '@start9labs/shared' -export abstract class ApiService { +export abstract class DiagnosticService { abstract getError(): Promise abstract restart(): Promise abstract forgetDrive(): Promise diff --git a/frontend/projects/diagnostic-ui/src/app/services/api/live-api.service.ts b/frontend/projects/ui/src/app/apps/diagnostic/services/live-diagnostic.service.ts similarity index 91% rename from frontend/projects/diagnostic-ui/src/app/services/api/live-api.service.ts rename to frontend/projects/ui/src/app/apps/diagnostic/services/live-diagnostic.service.ts index bbde6e5ba..dc4d3e9c4 100644 --- a/frontend/projects/diagnostic-ui/src/app/services/api/live-api.service.ts +++ b/frontend/projects/ui/src/app/apps/diagnostic/services/live-diagnostic.service.ts @@ -5,11 +5,11 @@ import { RpcError, RPCOptions, } from '@start9labs/shared' -import { ApiService, GetErrorRes } from './api.service' import { LogsRes, ServerLogsReq } from '@start9labs/shared' +import { DiagnosticService, GetErrorRes } from './diagnostic.service' @Injectable() -export class LiveApiService implements ApiService { +export class LiveDiagnosticService implements DiagnosticService { constructor(private readonly http: HttpService) {} async getError(): Promise { diff --git a/frontend/projects/diagnostic-ui/src/app/services/api/mock-api.service.ts b/frontend/projects/ui/src/app/apps/diagnostic/services/mock-diagnostic.service.ts similarity index 91% rename from frontend/projects/diagnostic-ui/src/app/services/api/mock-api.service.ts rename to frontend/projects/ui/src/app/apps/diagnostic/services/mock-diagnostic.service.ts index 5d8c13a4f..4a16f3e58 100644 --- a/frontend/projects/diagnostic-ui/src/app/services/api/mock-api.service.ts +++ b/frontend/projects/ui/src/app/apps/diagnostic/services/mock-diagnostic.service.ts @@ -1,10 +1,10 @@ import { Injectable } from '@angular/core' import { pauseFor } from '@start9labs/shared' -import { ApiService, GetErrorRes } from './api.service' import { LogsRes, ServerLogsReq, Log } from '@start9labs/shared' +import { DiagnosticService, GetErrorRes } from './diagnostic.service' @Injectable() -export class MockApiService implements ApiService { +export class MockDiagnosticService implements DiagnosticService { async getError(): Promise { await pauseFor(1000) return { diff --git a/frontend/projects/ui/src/app/apps/loading/loading.module.ts b/frontend/projects/ui/src/app/apps/loading/loading.module.ts index 9c7ae1bc9..3de110846 100644 --- a/frontend/projects/ui/src/app/apps/loading/loading.module.ts +++ b/frontend/projects/ui/src/app/apps/loading/loading.module.ts @@ -1,6 +1,6 @@ import { NgModule } from '@angular/core' import { RouterModule, Routes } from '@angular/router' -import { LoadingModule } from '@start9labs/shared' +import { InitializingModule } from '@start9labs/shared' import { LoadingPage } from './loading.page' const routes: Routes = [ @@ -11,7 +11,7 @@ const routes: Routes = [ ] @NgModule({ - imports: [LoadingModule, RouterModule.forChild(routes)], + imports: [InitializingModule, RouterModule.forChild(routes)], declarations: [LoadingPage], }) export class LoadingPageModule {} diff --git a/frontend/projects/ui/src/app/apps/loading/loading.page.html b/frontend/projects/ui/src/app/apps/loading/loading.page.html index 5b9740f3d..c4ac56866 100644 --- a/frontend/projects/ui/src/app/apps/loading/loading.page.html +++ b/frontend/projects/ui/src/app/apps/loading/loading.page.html @@ -1,4 +1,4 @@ - +> diff --git a/frontend/projects/ui/src/app/apps/login/login.page.ts b/frontend/projects/ui/src/app/apps/login/login.page.ts index c86f6057e..9e0b2f42b 100644 --- a/frontend/projects/ui/src/app/apps/login/login.page.ts +++ b/frontend/projects/ui/src/app/apps/login/login.page.ts @@ -1,26 +1,32 @@ -import { Component } from '@angular/core' -import { LoadingController, getPlatforms } from '@ionic/angular' +import { Component, Inject } from '@angular/core' +import { getPlatforms } from '@ionic/angular' import { ApiService } from 'src/app/services/api/embassy-api.service' import { AuthService } from 'src/app/services/auth.service' import { Router } from '@angular/router' import { ConfigService } from 'src/app/services/config.service' +import { LoadingService } from '@start9labs/shared' +import { TuiDestroyService } from '@taiga-ui/cdk' +import { takeUntil } from 'rxjs' +import { DOCUMENT } from '@angular/common' @Component({ selector: 'login', templateUrl: './login.page.html', styleUrls: ['./login.page.scss'], + providers: [TuiDestroyService], }) export class LoginPage { password = '' unmasked = false error = '' - loader?: HTMLIonLoadingElement secure = this.config.isSecure() constructor( + @Inject(DOCUMENT) private readonly document: Document, + private readonly destroy$: TuiDestroyService, private readonly router: Router, private readonly authService: AuthService, - private readonly loadingCtrl: LoadingController, + private readonly loader: LoadingService, private readonly api: ApiService, private readonly config: ConfigService, ) {} @@ -35,10 +41,6 @@ export class LoginPage { } } - ngOnDestroy() { - this.loader?.dismiss() - } - toggleMask() { this.unmasked = !this.unmasked } @@ -46,13 +48,13 @@ export class LoginPage { async submit() { this.error = '' - this.loader = await this.loadingCtrl.create({ - message: 'Logging in...', - }) - await this.loader.present() + const loader = this.loader + .open('Logging in...') + .pipe(takeUntil(this.destroy$)) + .subscribe() try { - document.cookie = '' + this.document.cookie = '' if (this.password.length > 64) { this.error = 'Password must be less than 65 characters' return @@ -71,7 +73,7 @@ export class LoginPage { // code 7 is for incorrect password this.error = e.code === 7 ? 'Invalid Password' : e.message } finally { - this.loader.dismiss() + loader.unsubscribe() } } } diff --git a/frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.html b/frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.html new file mode 100644 index 000000000..e0dac9074 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.html @@ -0,0 +1,32 @@ + + + Completed: {{ timestamp | date : 'medium' }} + + + +

System data

+

+ {{ system.result }} +

+
+ +
+ + +

{{ pkg.key }}

+

+ + {{ pkg.value.error ? 'Failed: ' + pkg.value.error : 'Succeeded' }} + +

+
+ +
+
diff --git a/frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.page.ts b/frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.ts similarity index 55% rename from frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.page.ts rename to frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.ts index 7434f5152..bbf0ceff4 100644 --- a/frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.ts @@ -1,24 +1,26 @@ -import { Component, Input } from '@angular/core' -import { ModalController } from '@ionic/angular' +import { Component, Inject } from '@angular/core' import { BackupReport } from 'src/app/services/api/api.types' +import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' +import { TuiDialogContext } from '@taiga-ui/core' @Component({ selector: 'backup-report', - templateUrl: './backup-report.page.html', + templateUrl: './backup-report.component.html', }) -export class BackupReportPage { - @Input() report!: BackupReport - @Input() timestamp!: string - - system!: { +export class BackupReportComponent { + readonly system: { result: string icon: 'remove' | 'remove-circle-outline' | 'checkmark' color: 'dark' | 'danger' | 'success' } - constructor(private readonly modalCtrl: ModalController) {} - - ngOnInit() { + constructor( + @Inject(POLYMORPHEUS_CONTEXT) + private readonly context: TuiDialogContext< + void, + { report: BackupReport; timestamp: string } + >, + ) { if (!this.report.server.attempted) { this.system = { result: 'Not Attempted', @@ -40,7 +42,11 @@ export class BackupReportPage { } } - async dismiss() { - return this.modalCtrl.dismiss(true) + get report(): BackupReport { + return this.context.data.report + } + + get timestamp(): string { + return this.context.data.timestamp } } diff --git a/frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.module.ts b/frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.module.ts index f21ff0918..a41a63e53 100644 --- a/frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.module.ts @@ -1,11 +1,11 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { IonicModule } from '@ionic/angular' -import { BackupReportPage } from './backup-report.page' +import { BackupReportComponent } from './backup-report.component' @NgModule({ - declarations: [BackupReportPage], + declarations: [BackupReportComponent], imports: [CommonModule, IonicModule], - exports: [BackupReportPage], + exports: [BackupReportComponent], }) export class BackupReportPageModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.page.html b/frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.page.html deleted file mode 100644 index 4ecf064d9..000000000 --- a/frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.page.html +++ /dev/null @@ -1,44 +0,0 @@ - - - Backup Report - - - - - - - - - - - - Completed: {{ timestamp | date : 'medium' }} - - - -

System data

-

{{ system.result }}

-
- -
- - -

{{ pkg.key }}

-

- - {{ pkg.value.error ? 'Failed: ' + pkg.value.error : 'Succeeded' }} - -

-
- -
-
-
diff --git a/frontend/projects/ui/src/app/apps/ui/modals/form/form.module.ts b/frontend/projects/ui/src/app/apps/ui/modals/form/form.module.ts index 814655fa0..464f60770 100644 --- a/frontend/projects/ui/src/app/apps/ui/modals/form/form.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/modals/form/form.module.ts @@ -1,6 +1,7 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { ReactiveFormsModule } from '@angular/forms' +import { RouterModule } from '@angular/router' import { TuiValueChangesModule } from '@taiga-ui/cdk' import { TuiButtonModule, TuiModeModule } from '@taiga-ui/core' import { FormModule } from 'src/app/common/form/form.module' @@ -10,6 +11,7 @@ import { FormPage } from './form.page' imports: [ CommonModule, ReactiveFormsModule, + RouterModule, TuiValueChangesModule, TuiButtonModule, TuiModeModule, diff --git a/frontend/projects/ui/src/app/apps/ui/modals/form/form.page.html b/frontend/projects/ui/src/app/apps/ui/modals/form/form.page.html index 58854a691..3bd7567a9 100644 --- a/frontend/projects/ui/src/app/apps/ui/modals/form/form.page.html +++ b/frontend/projects/ui/src/app/apps/ui/modals/form/form.page.html @@ -7,14 +7,26 @@ diff --git a/frontend/projects/ui/src/app/apps/ui/modals/form/form.page.ts b/frontend/projects/ui/src/app/apps/ui/modals/form/form.page.ts index c36cf0dd0..f7fcb1def 100644 --- a/frontend/projects/ui/src/app/apps/ui/modals/form/form.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/modals/form/form.page.ts @@ -17,7 +17,8 @@ import { FormService } from 'src/app/services/form.service' export interface ActionButton { text: string - handler: (value: T) => Promise | void + handler?: (value: T) => Promise | void + link?: string } export interface FormContext { @@ -65,12 +66,12 @@ export class FormPage> implements OnInit { this.markAsDirty() } - async onClick(handler: ActionButton['handler']) { + async onClick(handler: Required>['handler']) { tuiMarkControlAsTouchedAndValidate(this.form) this.invalidService.scrollIntoView() if (this.form.valid && (await handler(this.form.value as T))) { - this.context?.$implicit.complete() + this.close() } } @@ -78,6 +79,10 @@ export class FormPage> implements OnInit { this.dialogFormService.markAsDirty() } + close() { + this.context?.$implicit.complete() + } + private process(patch: Operation[]) { patch.forEach(({ op, path }) => { const control = this.form.get(path.substring(1).split('/')) diff --git a/frontend/projects/ui/src/app/apps/ui/modals/generic-input/generic-input.component.html b/frontend/projects/ui/src/app/apps/ui/modals/generic-input/generic-input.component.html deleted file mode 100644 index 308afd7dc..000000000 --- a/frontend/projects/ui/src/app/apps/ui/modals/generic-input/generic-input.component.html +++ /dev/null @@ -1,67 +0,0 @@ - -
- - -

{{ options.title }}

-
-

{{ options.message }}

- -
-

- {{ options.warning }} -

-
-
-
- -
-
-

{{ options.label }}

- - - - - - - -

- {{ error }} -

-
- -
- Cancel - - {{ options.buttonText }} - -
-
-
-
diff --git a/frontend/projects/ui/src/app/apps/ui/modals/generic-input/generic-input.component.module.ts b/frontend/projects/ui/src/app/apps/ui/modals/generic-input/generic-input.component.module.ts deleted file mode 100644 index d2b1faab4..000000000 --- a/frontend/projects/ui/src/app/apps/ui/modals/generic-input/generic-input.component.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { GenericInputComponent } from './generic-input.component' -import { IonicModule } from '@ionic/angular' -import { RouterModule } from '@angular/router' -import { SharedPipesModule } from '@start9labs/shared' -import { FormsModule } from '@angular/forms' - -@NgModule({ - declarations: [GenericInputComponent], - imports: [ - CommonModule, - IonicModule, - FormsModule, - RouterModule.forChild([]), - SharedPipesModule, - ], - exports: [GenericInputComponent], -}) -export class GenericInputComponentModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/modals/generic-input/generic-input.component.ts b/frontend/projects/ui/src/app/apps/ui/modals/generic-input/generic-input.component.ts deleted file mode 100644 index 2ebf80539..000000000 --- a/frontend/projects/ui/src/app/apps/ui/modals/generic-input/generic-input.component.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { Component, inject, Input, ViewChild } from '@angular/core' -import { ModalController, IonicSafeString, IonInput } from '@ionic/angular' -import { getErrorMessage, THEME } from '@start9labs/shared' -import { mask } from 'src/app/util/mask' - -@Component({ - selector: 'generic-input', - templateUrl: './generic-input.component.html', -}) -export class GenericInputComponent { - @ViewChild('mainInput') elem?: IonInput - - @Input() options!: GenericInputOptions - - value!: string - masked!: boolean - - maskedValue?: string - - error: string | IonicSafeString = '' - - readonly theme$ = inject(THEME) - - constructor(private readonly modalCtrl: ModalController) {} - - ngOnInit() { - const defaultOptions: Partial = { - buttonText: 'Submit', - required: true, - useMask: false, - initialValue: '', - } - this.options = { - ...defaultOptions, - ...this.options, - } - - this.masked = !!this.options.useMask - this.value = this.options.initialValue || '' - } - - ngAfterViewInit() { - setTimeout(() => this.elem?.setFocus(), 400) - } - - toggleMask() { - this.masked = !this.masked - } - - cancel() { - this.modalCtrl.dismiss() - } - - transformInput(newValue: string) { - let i = 0 - this.value = newValue - .split('') - .map(x => (x === '●' ? this.value[i++] : x)) - .join('') - this.maskedValue = mask(this.value) - } - - async submit() { - const value = this.value.trim() - - if (!value && this.options.required) return - - try { - const response = await this.options.submitFn(value) - this.modalCtrl.dismiss({ response, value }, 'success') - } catch (e: any) { - this.error = getErrorMessage(e) - } - } -} - -export interface GenericInputOptions { - // required - title: string - message: string - submitFn: (value: string) => Promise - // optional - label?: string - warning?: string - buttonText?: string - placeholder?: string - required?: boolean - useMask?: boolean - initialValue?: string | null -} diff --git a/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html b/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html new file mode 100644 index 000000000..788210973 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html @@ -0,0 +1,40 @@ +

{{ options.message }}

+

{{ options.warning }}

+
+ + {{ options.label }} + * + + +
+ + +
+
+ + + + diff --git a/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.scss b/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.scss new file mode 100644 index 000000000..d95d85925 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.scss @@ -0,0 +1,13 @@ +.warning { + color: var(--tui-warning-fill); +} + +.button { + pointer-events: auto; + margin-left: 0.25rem; +} + +.masked { + font-family: text-security-disc; + -webkit-text-security: disc; +} diff --git a/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.ts b/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.ts new file mode 100644 index 000000000..9842afe02 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.ts @@ -0,0 +1,49 @@ +import { ChangeDetectionStrategy, Component, Inject } from '@angular/core' +import { + POLYMORPHEUS_CONTEXT, + PolymorpheusComponent, +} from '@tinkoff/ng-polymorpheus' +import { TuiDialogContext } from '@taiga-ui/core' + +@Component({ + selector: 'prompt', + templateUrl: 'prompt.component.html', + styleUrls: ['prompt.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class PromptComponent { + masked = this.options.useMask + value = this.options.initialValue || '' + + constructor( + @Inject(POLYMORPHEUS_CONTEXT) + private readonly context: TuiDialogContext, + ) {} + + get options(): PromptOptions { + return this.context.data + } + + cancel() { + this.context.$implicit.complete() + } + + submit(value: string) { + if (value || !this.options.required) { + this.context.$implicit.next(value) + } + } +} + +export const PROMPT = new PolymorpheusComponent(PromptComponent) + +export interface PromptOptions { + message: string + label?: string + warning?: string + buttonText?: string + placeholder?: string + required?: boolean + useMask?: boolean + initialValue?: string | null +} diff --git a/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.module.ts b/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.module.ts new file mode 100644 index 000000000..12cd96f6b --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.module.ts @@ -0,0 +1,21 @@ +import { CommonModule } from '@angular/common' +import { NgModule } from '@angular/core' +import { FormsModule } from '@angular/forms' +import { TuiButtonModule, TuiTextfieldControllerModule } from '@taiga-ui/core' +import { TuiInputModule } from '@taiga-ui/kit' +import { TuiAutoFocusModule } from '@taiga-ui/cdk' +import { PromptComponent } from './prompt.component' + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + TuiInputModule, + TuiButtonModule, + TuiTextfieldControllerModule, + TuiAutoFocusModule, + ], + declarations: [PromptComponent], + exports: [PromptComponent], +}) +export class PromptModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/directives/backup-create.directive.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/directives/backup-create.directive.ts index 50ee7f8a8..91769e709 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/directives/backup-create.directive.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/directives/backup-create.directive.ts @@ -1,77 +1,60 @@ import { Directive, HostListener } from '@angular/core' -import { LoadingController, ModalController } from '@ionic/angular' +import { LoadingService } from '@start9labs/shared' +import { TuiDialogService } from '@taiga-ui/core' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' +import { BackupTarget } from 'src/app/services/api/api.types' import { ApiService } from 'src/app/services/api/embassy-api.service' import { TargetSelectPage } from '../modals/target-select/target-select.page' -import { - CifsBackupTarget, - DiskBackupTarget, -} from 'src/app/services/api/api.types' import { BackupSelectPage } from '../modals/backup-select/backup-select.page' @Directive({ selector: '[backupCreate]', }) export class BackupCreateDirective { - serviceIds: string[] = [] - constructor( - private readonly loadingCtrl: LoadingController, - private readonly modalCtrl: ModalController, + private readonly loader: LoadingService, + private readonly dialogs: TuiDialogService, private readonly embassyApi: ApiService, ) {} - @HostListener('click') onClick() { + @HostListener('click') + onClick() { this.presentModalTarget() } - async presentModalTarget() { - const modal = await this.modalCtrl.create({ - presentingElement: await this.modalCtrl.getTop(), - component: TargetSelectPage, - componentProps: { type: 'create' }, - }) - - modal.onDidDismiss().then(res => { - if (res.data) { - this.presentModalSelect(res.data.id) - } - }) - - await modal.present() + presentModalTarget() { + this.dialogs + .open(new PolymorpheusComponent(TargetSelectPage), { + label: 'Select Backup Target', + data: { type: 'create' }, + }) + .subscribe(({ id }) => { + this.presentModalSelect(id) + }) } - private async presentModalSelect(targetId: string) { - const modal = await this.modalCtrl.create({ - presentingElement: await this.modalCtrl.getTop(), - component: BackupSelectPage, - componentProps: { - btnText: 'Create Backup', - }, - }) - - modal.onWillDismiss().then(res => { - if (res.data) { - this.createBackup(targetId, res.data) - } - }) - - await modal.present() + private presentModalSelect(targetId: string) { + this.dialogs + .open(new PolymorpheusComponent(BackupSelectPage), { + label: 'Select Services to Back Up', + data: { btnText: 'Create Backup' }, + }) + .subscribe(pkgIds => { + this.createBackup(targetId, pkgIds) + }) } private async createBackup( targetId: string, pkgIds: string[], ): Promise { - const loader = await this.loadingCtrl.create({ - message: 'Beginning backup...', - }) - await loader.present() + const loader = this.loader.open('Beginning backup...').subscribe() await this.embassyApi .createBackup({ 'target-id': targetId, 'package-ids': pkgIds, }) - .finally(() => loader.dismiss()) + .finally(() => loader.unsubscribe()) } } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/directives/backup-restore.directive.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/directives/backup-restore.directive.ts index 3b1710030..b762c6fe0 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/directives/backup-restore.directive.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/directives/backup-restore.directive.ts @@ -1,28 +1,42 @@ import { Directive, HostListener } from '@angular/core' -import { - LoadingController, - ModalController, - NavController, -} from '@ionic/angular' +import { NavController } from '@ionic/angular' +import { TuiDialogService } from '@taiga-ui/core' +import { ErrorService, LoadingService } from '@start9labs/shared' import { ApiService } from 'src/app/services/api/embassy-api.service' -import { - GenericInputComponent, - GenericInputOptions, -} from 'src/app/apps/ui/modals/generic-input/generic-input.component' import { BackupInfo, BackupTarget } from 'src/app/services/api/api.types' import * as argon2 from '@start9labs/argon2' import { TargetSelectPage } from '../modals/target-select/target-select.page' -import { RecoverSelectPage } from '../modals/recover-select/recover-select.page' +import { + RecoverData, + RecoverSelectPage, +} from '../modals/recover-select/recover-select.page' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' +import { + PROMPT, + PromptOptions, +} from 'src/app/apps/ui/modals/prompt/prompt.component' +import { + catchError, + EMPTY, + exhaustMap, + map, + Observable, + of, + switchMap, + take, + tap, +} from 'rxjs' @Directive({ selector: '[backupRestore]', }) export class BackupRestoreDirective { constructor( - private readonly modalCtrl: ModalController, + private readonly errorService: ErrorService, + private readonly dialogs: TuiDialogService, private readonly navCtrl: NavController, private readonly embassyApi: ApiService, - private readonly loadingCtrl: LoadingController, + private readonly loader: LoadingService, ) {} @HostListener('click') onClick() { @@ -30,92 +44,81 @@ export class BackupRestoreDirective { } async presentModalTarget() { - const modal = await this.modalCtrl.create({ - presentingElement: await this.modalCtrl.getTop(), - component: TargetSelectPage, - componentProps: { type: 'restore' }, - }) - - modal.onDidDismiss().then(res => { - if (res.data) { - this.presentModalPassword(res.data) - } - }) - - await modal.present() + this.dialogs + .open(new PolymorpheusComponent(TargetSelectPage), { + label: 'Select Backup Source', + data: { type: 'restore' }, + }) + .subscribe(data => { + this.presentModalPassword(data) + }) } - async presentModalPassword(target: BackupTarget): Promise { - const options: GenericInputOptions = { - title: 'Password Required', + presentModalPassword(target: BackupTarget) { + const data: PromptOptions = { message: 'Enter the master password that was used to encrypt this backup. On the next screen, you will select the individual services you want to restore.', label: 'Master Password', placeholder: 'Enter master password', useMask: true, - buttonText: 'Next', - submitFn: async (password: string) => { - const passwordHash = target['embassy-os']?.['password-hash'] || '' - argon2.verify(passwordHash, password) - return this.getBackupInfo(target.id, password) - }, } - const modal = await this.modalCtrl.create({ - componentProps: { options }, - cssClass: 'alertlike-modal', - presentingElement: await this.modalCtrl.getTop(), - component: GenericInputComponent, - }) + this.dialogs + .open(PROMPT, { + label: 'Password Required', + data, + }) + .pipe( + exhaustMap(password => + this.getRecoverData( + target.id, + password, + target['embassy-os']?.['password-hash'] || '', + ), + ), + take(1), + switchMap(data => this.presentModalSelect(data)), + ) + .subscribe(() => { + this.navCtrl.navigateRoot('/services') + }) + } - modal.onDidDismiss().then(res => { - if (res.data) { - const { value, response } = res.data - this.presentModalSelect(target.id, response, value) - } - }) + private getRecoverData( + targetId: string, + password: string, + hash: string, + ): Observable { + return of(password).pipe( + tap(() => argon2.verify(hash, password)), + switchMap(() => this.getBackupInfo(targetId, password)), + catchError(e => { + this.errorService.handleError(e) - await modal.present() + return EMPTY + }), + map(backupInfo => ({ targetId, password, backupInfo })), + ) } private async getBackupInfo( targetId: string, password: string, ): Promise { - const loader = await this.loadingCtrl.create({ - message: 'Decrypting drive...', - }) - await loader.present() + const loader = this.loader.open('Decrypting drive...').subscribe() return this.embassyApi .getBackupInfo({ 'target-id': targetId, password, }) - .finally(() => loader.dismiss()) + .finally(() => loader.unsubscribe()) } - private async presentModalSelect( - targetId: string, - backupInfo: BackupInfo, - password: string, - ): Promise { - const modal = await this.modalCtrl.create({ - componentProps: { - targetId, - backupInfo, - password, - }, - presentingElement: await this.modalCtrl.getTop(), - component: RecoverSelectPage, - }) - - modal.onWillDismiss().then(res => { - if (res.role === 'success') { - this.navCtrl.navigateRoot('/services') - } + private presentModalSelect(data: RecoverData): Observable { + return this.dialogs.open(new PolymorpheusComponent(RecoverSelectPage), { + label: 'Select Services to Restore', + data, }) - - await modal.present() } } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.module.ts index be840eff2..bcb9ed156 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.module.ts @@ -1,12 +1,19 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { BackupSelectPage } from './backup-select.page' import { FormsModule } from '@angular/forms' +import { TuiButtonModule, TuiGroupModule } from '@taiga-ui/core' +import { TuiCheckboxBlockModule } from '@taiga-ui/kit' +import { BackupSelectPage } from './backup-select.page' @NgModule({ declarations: [BackupSelectPage], - imports: [CommonModule, IonicModule, FormsModule], + imports: [ + CommonModule, + FormsModule, + TuiButtonModule, + TuiGroupModule, + TuiCheckboxBlockModule, + ], exports: [BackupSelectPage], }) export class BackupSelectPageModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.html b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.html index 457152a45..f79a9d0f8 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.html @@ -1,57 +1,31 @@ - - - Select Services to Back Up - - - - - - - +
+ +
+ + {{ pkg.title }} +
+
+
- - - - - - - {{ selectAll ? 'Select All' : 'Deselect All' }} - - - - - - - - -

{{ pkg.title }}

-
- -
-
-
- -

No services installed!

-
-
+ +

No services installed!

+
- - - - - {{ btnText }} - - - - +
+ + +
diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.scss b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.scss index 854c0ba4e..89ba0a7aa 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.scss +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.scss @@ -1,5 +1,25 @@ .center { - display: flex; - align-items: center; - justify-content: center; -} \ No newline at end of file + display: flex; + align-items: center; + justify-content: center; +} + +.pkgs { + width: 100%; + margin-top: 24px; +} + +.label { + display: flex; + align-items: center; + gap: 16px; +} + +.icon { + width: 40px; + height: 40px; +} + +ion-item { + --background: transparent; +} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.ts index 6c1f84614..f21a5ca7f 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.ts @@ -1,8 +1,9 @@ -import { Component, Input } from '@angular/core' -import { ModalController } from '@ionic/angular' +import { Component, Inject, Input } from '@angular/core' import { PatchDB } from 'patch-db-client' import { firstValueFrom, map } from 'rxjs' import { DataModel, PackageState } from 'src/app/services/patch-db/data-model' +import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' +import { TuiDialogContext } from '@taiga-ui/core' @Component({ selector: 'backup-select', @@ -10,11 +11,9 @@ import { DataModel, PackageState } from 'src/app/services/patch-db/data-model' styleUrls: ['./backup-select.page.scss'], }) export class BackupSelectPage { - @Input() btnText!: string @Input() selectedIds: string[] = [] hasSelection = false - selectAll = false pkgs: { id: string title: string @@ -24,10 +23,15 @@ export class BackupSelectPage { }[] = [] constructor( - private readonly modalCtrl: ModalController, + @Inject(POLYMORPHEUS_CONTEXT) + private readonly context: TuiDialogContext, private readonly patch: PatchDB, ) {} + get btnText(): string { + return this.context.data.btnText + } + async ngOnInit() { this.pkgs = await firstValueFrom( this.patch.watch$('package-data').pipe( @@ -51,13 +55,8 @@ export class BackupSelectPage { ) } - dismiss() { - this.modalCtrl.dismiss() - } - - async done() { - const pkgIds = this.pkgs.filter(p => p.checked).map(p => p.id) - this.modalCtrl.dismiss(pkgIds) + done() { + this.context.completeWith(this.pkgs.filter(p => p.checked).map(p => p.id)) } handleChange() { @@ -65,7 +64,7 @@ export class BackupSelectPage { } toggleSelectAll() { - this.pkgs.forEach(pkg => (pkg.checked = this.selectAll)) - this.selectAll = !this.selectAll + this.pkgs.forEach(pkg => (pkg.checked = !this.hasSelection)) + this.hasSelection = !this.hasSelection } } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.module.ts index 3cf866171..0f7e63288 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.module.ts @@ -1,13 +1,20 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' import { FormsModule } from '@angular/forms' +import { TuiButtonModule, TuiGroupModule } from '@taiga-ui/core' +import { TuiCheckboxBlockModule } from '@taiga-ui/kit' import { RecoverSelectPage } from './recover-select.page' import { ToOptionsPipe } from './to-options.pipe' @NgModule({ declarations: [RecoverSelectPage, ToOptionsPipe], - imports: [CommonModule, IonicModule, FormsModule], + imports: [ + CommonModule, + FormsModule, + TuiButtonModule, + TuiGroupModule, + TuiCheckboxBlockModule, + ], exports: [RecoverSelectPage], }) export class RecoverSelectPageModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.html b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.html index 09a055650..8fd2e77ce 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.html @@ -1,61 +1,36 @@ - - - Select Services to Restore - - - - - - - +
+ +
+ {{ option.title }} +
Version {{ option.version }}
+
Backup made: {{ option.timestamp | date : 'medium' }}
+
+ Ready to restore +
+
+ Unavailable. {{ option.title }} is already installed. +
+
+ Unavailable. Backup was made on a newer version of StartOS. +
+
+
+
- - - - -

{{ option.title }}

-

Version {{ option.version }}

-

Backup made: {{ option.timestamp | date : 'medium' }}

-

- Ready to restore -

-

- - Unavailable. {{ option.title }} is already installed. - -

-

- - Unavailable. Backup was made on a newer version of StartOS. - -

-
- -
-
-
- - - - - - Restore Selected - - - - +
diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.scss b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.scss index e69de29bb..4897866d3 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.scss +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.scss @@ -0,0 +1,31 @@ +.items { + width: 100%; + margin: 12px 0 24px; +} + +.label { + padding: 8px 0; + font-size: 14px; +} + +.title { + font-size: 16px; + margin-bottom: 4px; + display: block; +} + +.success { + color: var(--tui-success-fill); +} + +.warning { + color: var(--tui-warning-fill); +} + +.danger { + color: var(--tui-error-fill); +} + +.button { + float: right; +} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.ts index 85989cc45..5052d9eb9 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.ts @@ -1,10 +1,7 @@ -import { Component, Input } from '@angular/core' -import { - LoadingController, - ModalController, - IonicSafeString, -} from '@ionic/angular' -import { getErrorMessage } from '@start9labs/shared' +import { Component, Inject } from '@angular/core' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' +import { TuiDialogContext } from '@taiga-ui/core' import { BackupInfo } from 'src/app/services/api/api.types' import { ApiService } from 'src/app/services/api/embassy-api.service' import { PatchDB } from 'patch-db-client' @@ -12,31 +9,33 @@ import { AppRecoverOption } from './to-options.pipe' import { DataModel } from 'src/app/services/patch-db/data-model' import { take } from 'rxjs' +export interface RecoverData { + targetId: string + backupInfo: BackupInfo + password: string +} + @Component({ selector: 'recover-select', templateUrl: './recover-select.page.html', styleUrls: ['./recover-select.page.scss'], }) export class RecoverSelectPage { - @Input() targetId!: string - @Input() backupInfo!: BackupInfo - @Input() password!: string - @Input() oldPassword?: string - readonly packageData$ = this.patch.watch$('package-data').pipe(take(1)) hasSelection = false - error: string | IonicSafeString = '' constructor( - private readonly modalCtrl: ModalController, - private readonly loadingCtrl: LoadingController, + @Inject(POLYMORPHEUS_CONTEXT) + private readonly context: TuiDialogContext, + private readonly loader: LoadingService, + private readonly errorService: ErrorService, private readonly embassyApi: ApiService, private readonly patch: PatchDB, ) {} - dismiss() { - this.modalCtrl.dismiss() + get backupInfo(): BackupInfo { + return this.context.data.backupInfo } handleChange(options: AppRecoverOption[]) { @@ -45,22 +44,20 @@ export class RecoverSelectPage { async restore(options: AppRecoverOption[]): Promise { const ids = options.filter(({ checked }) => !!checked).map(({ id }) => id) - const loader = await this.loadingCtrl.create({ - message: 'Initializing...', - }) - await loader.present() + const loader = this.loader.open('Initializing...').subscribe() try { await this.embassyApi.restorePackages({ ids, - 'target-id': this.targetId, - password: this.password, + 'target-id': this.context.data.targetId, + password: this.context.data.password, }) - this.modalCtrl.dismiss(undefined, 'success') + + this.context.completeWith(undefined) } catch (e: any) { - this.error = getErrorMessage(e) + this.errorService.handleError(e) } finally { - loader.dismiss() + loader.unsubscribe() } } } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.module.ts index 7cfa69407..3b88319de 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.module.ts @@ -1,6 +1,7 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { IonicModule } from '@ionic/angular' +import { TuiButtonModule } from '@taiga-ui/core' import { TargetSelectPage, TargetStatusComponent } from './target-select.page' import { TargetPipesModule } from '../../pipes/target-pipes.module' import { TextSpinnerComponentModule } from '@start9labs/shared' @@ -12,6 +13,7 @@ import { TextSpinnerComponentModule } from '@start9labs/shared' IonicModule, TargetPipesModule, TextSpinnerComponentModule, + TuiButtonModule, ], exports: [TargetSelectPage], }) diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.html b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.html index ea2a34953..8aa08a50a 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.html @@ -1,55 +1,40 @@ - - - - Select Backup {{ type === 'create' ? 'Target' : 'Source' }} - - - - - - - - + + - - - - - - - - Saved Targets - - - - -

{{ displayInfo.name }}

- -

{{ displayInfo.description }}

-

{{ displayInfo.path }}

-
-
-
+ > + + + +

{{ displayInfo.name }}

+ +

{{ displayInfo.description }}

+

{{ displayInfo.path }}

+
+
+ -
-

No saved targets

- Go to Targets -
-
-
-
+
+

No saved targets

+ +
+ +
diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.scss b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.scss index e69de29bb..bfffad405 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.scss +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.scss @@ -0,0 +1,3 @@ +ion-item { + --background: transparent; +} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.ts index 176c40d4e..353fcdc14 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.ts @@ -1,10 +1,17 @@ -import { ChangeDetectionStrategy, Component, Input } from '@angular/core' -import { ModalController, NavController } from '@ionic/angular' +import { + ChangeDetectionStrategy, + Component, + Inject, + Input, +} from '@angular/core' +import { NavController } from '@ionic/angular' import { BehaviorSubject } from 'rxjs' import { BackupTarget } from 'src/app/services/api/api.types' import { ApiService } from 'src/app/services/api/embassy-api.service' -import { ErrorToastService } from '@start9labs/shared' +import { ErrorService } from '@start9labs/shared' import { BackupType } from '../../pages/backup-targets/backup-targets.page' +import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' +import { TuiDialogContext } from '@taiga-ui/core' @Component({ selector: 'target-select', @@ -13,36 +20,36 @@ import { BackupType } from '../../pages/backup-targets/backup-targets.page' changeDetection: ChangeDetectionStrategy.OnPush, }) export class TargetSelectPage { - @Input() type!: BackupType - @Input() isOneOff = true - targets: BackupTarget[] = [] loading$ = new BehaviorSubject(true) constructor( - private readonly modalCtrl: ModalController, + @Inject(POLYMORPHEUS_CONTEXT) + private readonly context: TuiDialogContext< + BackupTarget, + { type: BackupType } + >, private readonly navCtrl: NavController, private readonly api: ApiService, - private readonly errToast: ErrorToastService, + private readonly errorService: ErrorService, ) {} - async ngOnInit() { - await this.getTargets() + get type(): BackupType { + return this.context.data.type } - dismiss() { - this.modalCtrl.dismiss() + async ngOnInit() { + await this.getTargets() } select(target: BackupTarget): void { - this.modalCtrl.dismiss(target) + this.context.completeWith(target) } goToTargets() { - this.modalCtrl - .dismiss() - .then(() => this.navCtrl.navigateForward(`/backups/targets`)) + this.context.$implicit.complete() + this.navCtrl.navigateForward(`/backups/targets`) } async refresh() { @@ -54,7 +61,7 @@ export class TargetSelectPage { try { this.targets = (await this.api.getBackupTargets({})).saved } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { this.loading$.next(false) } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.ts index 48f5dafdf..0cec0874d 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.ts @@ -1,11 +1,12 @@ import { Component } from '@angular/core' import { Pipe, PipeTransform } from '@angular/core' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { TuiDialogService } from '@taiga-ui/core' import { BackupReport, BackupRun } from 'src/app/services/api/api.types' -import { LoadingController, ModalController } from '@ionic/angular' import { ApiService } from 'src/app/services/api/embassy-api.service' -import { ErrorToastService } from '@start9labs/shared' import { BehaviorSubject } from 'rxjs' -import { BackupReportPage } from 'src/app/apps/ui/modals/backup-report/backup-report.page' +import { BackupReportComponent } from '../../../../modals/backup-report/backup-report.component' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' @Component({ selector: 'backup-history', @@ -18,9 +19,9 @@ export class BackupHistoryPage { loading$ = new BehaviorSubject(true) constructor( - private readonly modalCtrl: ModalController, - private readonly loadingCtrl: LoadingController, - private readonly errToast: ErrorToastService, + private readonly dialogs: TuiDialogService, + private readonly loader: LoadingService, + private readonly errorService: ErrorService, private readonly api: ApiService, ) {} @@ -28,7 +29,7 @@ export class BackupHistoryPage { try { this.runs = await this.api.getBackupRuns({}) } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { this.loading$.next(false) } @@ -42,15 +43,16 @@ export class BackupHistoryPage { return Object.keys(this.selected).length } - async presentModalReport(run: BackupRun) { - const modal = await this.modalCtrl.create({ - component: BackupReportPage, - componentProps: { - report: run.report, - timestamp: run['completed-at'], - }, - }) - await modal.present() + presentModalReport(run: BackupRun) { + this.dialogs + .open(new PolymorpheusComponent(BackupReportComponent), { + label: 'Backup Report', + data: { + report: run.report, + timestamp: run['completed-at'], + }, + }) + .subscribe() } async toggleChecked(id: string) { @@ -71,20 +73,16 @@ export class BackupHistoryPage { async deleteSelected(): Promise { const ids = Object.keys(this.selected) - - const loader = await this.loadingCtrl.create({ - message: 'Deleting...', - }) - await loader.present() + const loader = this.loader.open('Deleting...').subscribe() try { await this.api.deleteBackupRuns({ ids }) this.selected = {} this.runs = this.runs.filter(r => !ids.includes(r.id)) } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { - loader.dismiss() + loader.unsubscribe() } } } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts index 3ef154196..b26d01ed4 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts @@ -1,13 +1,17 @@ +import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' +import { FormsModule } from '@angular/forms' import { RouterModule, Routes } from '@angular/router' -import { CommonModule } from '@angular/common' import { IonicModule } from '@ionic/angular' +import { + TuiButtonModule, + TuiNotificationModule, + TuiWrapperModule, +} from '@taiga-ui/core' +import { TuiInputModule, TuiToggleModule } from '@taiga-ui/kit' import { BackupJobsPage } from './backup-jobs.page' -import { NewJobPage } from './new-job/new-job.page' -import { EditJobPage } from './edit-job/edit-job.page' -import { JobOptionsComponent } from './job-options/job-options.component' +import { EditJobComponent } from './edit-job/edit-job.component' import { ToHumanCronPipe } from './pipes' -import { FormsModule } from '@angular/forms' import { TargetSelectPageModule } from '../../modals/target-select/target-select.module' import { TargetPipesModule } from '../../pipes/target-pipes.module' @@ -26,13 +30,12 @@ const routes: Routes = [ FormsModule, TargetSelectPageModule, TargetPipesModule, + TuiNotificationModule, + TuiButtonModule, + TuiInputModule, + TuiToggleModule, + TuiWrapperModule, ], - declarations: [ - BackupJobsPage, - ToHumanCronPipe, - NewJobPage, - EditJobPage, - JobOptionsComponent, - ], + declarations: [BackupJobsPage, ToHumanCronPipe, EditJobComponent], }) export class BackupJobsPageModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.html b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.html index 516b0ad7d..871fc55eb 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.html @@ -8,20 +8,16 @@ - - - -

- Scheduling automatic backups is an excellent way to ensure your - Embassy data is safely backed up. Your Embassy will issue a - notification whenever one of your scheduled backups succeeds or fails. - - View instructions - -

-
-
+
+ + Scheduling automatic backups is an excellent way to ensure your Embassy + data is safely backed up. Your Embassy will issue a notification whenever + one of your scheduled backups succeeds or fails. + View instructions + +
+ Saved Jobs (click)="presentModalCreate()" > - New Job + Create New Job diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.ts index a84a3c1b7..2399239c0 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.ts @@ -1,15 +1,13 @@ import { Component } from '@angular/core' -import { - AlertController, - LoadingController, - ModalController, -} from '@ionic/angular' -import { BehaviorSubject } from 'rxjs' +import { TuiDialogService } from '@taiga-ui/core' +import { TUI_PROMPT } from '@taiga-ui/kit' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' +import { BehaviorSubject, filter } from 'rxjs' import { BackupJob } from 'src/app/services/api/api.types' import { ApiService } from 'src/app/services/api/embassy-api.service' -import { ErrorToastService } from '@start9labs/shared' -import { EditJobPage } from './edit-job/edit-job.page' -import { NewJobPage } from './new-job/new-job.page' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { EditJobComponent } from './edit-job/edit-job.component' +import { BackupJobBuilder } from './edit-job/job-builder' @Component({ selector: 'backup-jobs', @@ -25,10 +23,9 @@ export class BackupJobsPage { loading$ = new BehaviorSubject(true) constructor( - private readonly modalCtrl: ModalController, - private readonly alertCtrl: AlertController, - private readonly loadingCtrl: LoadingController, - private readonly errToast: ErrorToastService, + private readonly dialogs: TuiDialogService, + private readonly loader: LoadingService, + private readonly errorService: ErrorService, private readonly api: ApiService, ) {} @@ -36,86 +33,64 @@ export class BackupJobsPage { try { this.jobs = await this.api.getBackupJobs({}) } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { this.loading$.next(false) } } - async presentModalCreate() { - const modal = await this.modalCtrl.create({ - presentingElement: await this.modalCtrl.getTop(), - component: NewJobPage, - componentProps: { - count: this.jobs.length + 1, - }, - }) - - modal.onWillDismiss().then(res => { - if (res.data) { - this.jobs.push(res.data) - } - }) - - await modal.present() + presentModalCreate() { + this.dialogs + .open(new PolymorpheusComponent(EditJobComponent), { + label: 'Create New Job', + data: new BackupJobBuilder({ + name: `Backup Job ${this.jobs.length + 1}`, + }), + }) + .subscribe(job => this.jobs.push(job)) } - async presentModalUpdate(job: BackupJob) { - const modal = await this.modalCtrl.create({ - presentingElement: await this.modalCtrl.getTop(), - component: EditJobPage, - componentProps: { - existingJob: job, - }, - }) - - modal.onWillDismiss().then((res: { data?: BackupJob }) => { - if (res.data) { - const { name, target, cron } = res.data - job.name = name - job.target = target - job.cron = cron - job['package-ids'] = res.data['package-ids'] - } - }) - - await modal.present() + presentModalUpdate(data: BackupJob) { + this.dialogs + .open(new PolymorpheusComponent(EditJobComponent), { + label: 'Edit Job', + data: new BackupJobBuilder(data), + }) + .subscribe(job => { + data.name = job.name + data.target = job.target + data.cron = job.cron + data['package-ids'] = job['package-ids'] + }) } - async presentAlertDelete(id: string, index: number) { - const alert = await this.alertCtrl.create({ - header: 'Confirm', - message: 'Delete backup job? This action cannot be undone.', - buttons: [ - { - text: 'Cancel', - role: 'cancel', - }, - { - text: 'Delete', - handler: () => { - this.delete(id, index) - }, - cssClass: 'enter-click', + presentAlertDelete(id: string, index: number) { + this.dialogs + .open(TUI_PROMPT, { + label: 'Confirm', + size: 's', + data: { + content: 'Delete backup job? This action cannot be undone.', + yes: 'Delete', + no: 'Cancel', }, - ], - }) - await alert.present() + }) + .pipe(filter(Boolean)) + .subscribe(() => { + this.delete(id, index) + }) } private async delete(id: string, i: number): Promise { - const loader = await this.loadingCtrl.create({ - message: 'Deleting...', - }) - await loader.present() + const loader = this.loader.open('Deleting...').subscribe() try { await this.api.removeBackupTarget({ id }) this.jobs.splice(i, 1) } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { - loader.dismiss() + loader.unsubscribe() } } } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.html b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.html new file mode 100644 index 000000000..1e599bfb3 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.html @@ -0,0 +1,47 @@ +
+ + Job Name + + + + + + + + + Schedule + + + +

+ {{ human.message }} +

+ +
+ Also Execute Now + +
+ +
diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.scss b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.scss new file mode 100644 index 000000000..18b650d0c --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.scss @@ -0,0 +1,33 @@ +.button { + height: var(--tui-height-l); + display: flex; + align-items: center; + justify-content: space-between; + margin: 1rem 0; + padding: 0 1rem; + border-radius: var(--tui-radius-m); + font: var(--tui-font-text-l); + font-weight: bold; +} + +.value { + font: var(--tui-font-text-m); + color: var(--tui-positive); +} + +.toggle { + height: var(--tui-height-l); + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 1rem; + box-shadow: inset 0 0 0 1px var(--tui-base-03); + font: var(--tui-font-text-l); + font-weight: bold; + border-radius: var(--tui-radius-m); +} + +.submit { + float: right; + margin-top: 1rem; +} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.ts new file mode 100644 index 000000000..1553dd541 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.ts @@ -0,0 +1,75 @@ +import { Component, Inject } from '@angular/core' +import { TuiDialogContext, TuiDialogService } from '@taiga-ui/core' +import { + POLYMORPHEUS_CONTEXT, + PolymorpheusComponent, +} from '@tinkoff/ng-polymorpheus' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { BackupJob, BackupTarget } from 'src/app/services/api/api.types' +import { TargetSelectPage } from '../../../modals/target-select/target-select.page' +import { BackupSelectPage } from '../../../modals/backup-select/backup-select.page' +import { BackupJobBuilder } from './job-builder' + +@Component({ + selector: 'edit-job', + templateUrl: './edit-job.component.html', + styleUrls: ['./edit-job.component.scss'], +}) +export class EditJobComponent { + constructor( + @Inject(POLYMORPHEUS_CONTEXT) + private readonly context: TuiDialogContext, + private readonly dialogs: TuiDialogService, + private readonly loader: LoadingService, + private readonly api: ApiService, + private readonly errorService: ErrorService, + ) {} + + get job() { + return this.context.data + } + + async save() { + const loader = this.loader.open('Saving Job').subscribe() + + try { + const { id } = this.job.job + let job: BackupJob + + if (id) { + job = await this.api.updateBackupJob(this.job.buildUpdate(id)) + } else { + job = await this.api.createBackupJob(this.job.buildCreate()) + } + + this.context.completeWith(job) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } + + presentModalTarget() { + this.dialogs + .open(new PolymorpheusComponent(TargetSelectPage), { + label: 'Select Backup Target', + data: { type: 'create' }, + }) + .subscribe(target => { + this.job.target = target + }) + } + + presentModalPackages() { + this.dialogs + .open(new PolymorpheusComponent(BackupSelectPage), { + label: 'Select Services to Back Up', + data: { btnText: 'Done' }, + }) + .subscribe(id => { + this.job['package-ids'] = id + }) + } +} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.page.html b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.page.html deleted file mode 100644 index f3cdbb119..000000000 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.page.html +++ /dev/null @@ -1,33 +0,0 @@ - - - Edit Job - - - - - - - - - - - - - - - - - - - Save - - - - diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.page.scss b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.page.scss deleted file mode 100644 index 5255d7814..000000000 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.page.scss +++ /dev/null @@ -1,3 +0,0 @@ -h2 { - font-weight: bold; -} \ No newline at end of file diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.page.ts deleted file mode 100644 index f9a484412..000000000 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.page.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Component, Input } from '@angular/core' -import { BackupJob } from 'src/app/services/api/api.types' -import { LoadingController, ModalController } from '@ionic/angular' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { ErrorToastService } from '@start9labs/shared' -import { BackupJobBuilder } from '../job-options/job-options.component' - -@Component({ - selector: 'edit-job', - templateUrl: './edit-job.page.html', - styleUrls: ['./edit-job.page.scss'], -}) -export class EditJobPage { - @Input() existingJob!: BackupJob - - job = {} as BackupJobBuilder - - saving = false - - constructor( - private readonly modalCtrl: ModalController, - private readonly loadingCtrl: LoadingController, - private readonly api: ApiService, - private readonly errToast: ErrorToastService, - ) {} - - ngOnInit() { - this.job = new BackupJobBuilder(this.existingJob) - } - - async dismiss() { - this.modalCtrl.dismiss() - } - - async save() { - this.saving = true - const loader = await this.loadingCtrl.create({ - message: 'Saving Job', - }) - await loader.present() - - try { - const job = await this.api.updateBackupJob( - this.job.buildUpdate(this.existingJob.id), - ) - this.modalCtrl.dismiss(job) - } catch (e: any) { - this.errToast.present(e) - } finally { - loader.dismiss() - this.saving = false - } - } -} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/job-builder.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/job-builder.ts new file mode 100644 index 000000000..b84e4d369 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/job-builder.ts @@ -0,0 +1,41 @@ +import { BackupJob, BackupTarget, RR } from 'src/app/services/api/api.types' + +export class BackupJobBuilder { + name: string + target: BackupTarget + cron: string + 'package-ids': string[] + now = false + + constructor(readonly job: Partial) { + const { name, target, cron } = job + this.name = name || '' + this.target = target || ({} as BackupTarget) + this.cron = cron || '0 2 * * *' + this['package-ids'] = job['package-ids'] || [] + } + + buildCreate(): RR.CreateBackupJobReq { + const { name, target, cron, now } = this + + return { + name, + 'target-id': target.id, + cron, + 'package-ids': this['package-ids'], + now, + } + } + + buildUpdate(id: string): RR.UpdateBackupJobReq { + const { name, target, cron } = this + + return { + id, + name, + 'target-id': target.id, + cron, + 'package-ids': this['package-ids'], + } + } +} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/job-options/job-options.component.html b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/job-options/job-options.component.html deleted file mode 100644 index b220b7ead..000000000 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/job-options/job-options.component.html +++ /dev/null @@ -1,34 +0,0 @@ -
-

Job Name

- - - -
- - - -

Target

-
- - {{ job.target.type || 'Select target' }} - -
- - - -

Packages

-
- - {{ job['package-ids'].length + ' selected' }} - -
- -
-

Schedule

- - - -

- {{ human.message }} -

-
diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/job-options/job-options.component.scss b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/job-options/job-options.component.scss deleted file mode 100644 index dbb2f1b60..000000000 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/job-options/job-options.component.scss +++ /dev/null @@ -1,9 +0,0 @@ -h2 { - font-weight: bold; -} - -.input-label { - margin-bottom: 6px; - font-size: medium; - font-weight: bold; -} \ No newline at end of file diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/job-options/job-options.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/job-options/job-options.component.ts deleted file mode 100644 index fef1920fb..000000000 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/job-options/job-options.component.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { Component, Input } from '@angular/core' -import { ModalController } from '@ionic/angular' -import { BackupJob, BackupTarget, RR } from 'src/app/services/api/api.types' -import { BackupSelectPage } from '../../../modals/backup-select/backup-select.page' -import { TargetSelectPage } from '../../../modals/target-select/target-select.page' - -@Component({ - selector: 'job-options', - templateUrl: './job-options.component.html', - styleUrls: ['./job-options.component.scss'], -}) -export class JobOptionsComponent { - @Input() job!: BackupJobBuilder - - constructor(private readonly modalCtrl: ModalController) {} - - async presentModalTarget() { - const modal = await this.modalCtrl.create({ - presentingElement: await this.modalCtrl.getTop(), - component: TargetSelectPage, - componentProps: { type: 'create' }, - }) - - modal.onWillDismiss().then(res => { - if (res.data) { - this.job.target = res.data - } - }) - - await modal.present() - } - - async presentModalPackages() { - const modal = await this.modalCtrl.create({ - presentingElement: await this.modalCtrl.getTop(), - component: BackupSelectPage, - componentProps: { - btnText: 'Done', - selectedIds: this.job['package-ids'], - }, - }) - - modal.onWillDismiss().then(res => { - if (res.data) { - this.job['package-ids'] = res.data - } - }) - - await modal.present() - } -} - -export class BackupJobBuilder { - name: string - target: BackupTarget - cron: string - 'package-ids': string[] - now = false - - constructor(readonly job: Partial) { - const { name, target, cron } = job - this.name = name || '' - this.target = target || ({} as BackupTarget) - this.cron = cron || '0 2 * * *' - this['package-ids'] = job['package-ids'] || [] - } - - buildCreate(): RR.CreateBackupJobReq { - const { name, target, cron, now } = this - - return { - name, - 'target-id': target.id, - cron, - 'package-ids': this['package-ids'], - now, - } - } - - buildUpdate(id: string): RR.UpdateBackupJobReq { - const { name, target, cron } = this - - return { - id, - name, - 'target-id': target.id, - cron, - 'package-ids': this['package-ids'], - } - } -} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/new-job/new-job.page.html b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/new-job/new-job.page.html deleted file mode 100644 index f740e44d8..000000000 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/new-job/new-job.page.html +++ /dev/null @@ -1,40 +0,0 @@ - - - Create New Job - - - - - - - - - - - - - - -

Also Execute Now

-
- -
-
-
- - - - - - Save Job - - - - diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/new-job/new-job.page.scss b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/new-job/new-job.page.scss deleted file mode 100644 index 5255d7814..000000000 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/new-job/new-job.page.scss +++ /dev/null @@ -1,3 +0,0 @@ -h2 { - font-weight: bold; -} \ No newline at end of file diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/new-job/new-job.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/new-job/new-job.page.ts deleted file mode 100644 index e87a3af85..000000000 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/new-job/new-job.page.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Component, Input } from '@angular/core' -import { LoadingController, ModalController } from '@ionic/angular' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { ErrorToastService } from '@start9labs/shared' -import { BackupJobBuilder } from '../job-options/job-options.component' - -@Component({ - selector: 'new-job', - templateUrl: './new-job.page.html', - styleUrls: ['./new-job.page.scss'], -}) -export class NewJobPage { - @Input() count!: number - - readonly docsUrl = - 'https://docs.start9.com/latest/user-manual/backups/backup-jobs' - - job = {} as BackupJobBuilder - - saving = false - - constructor( - private readonly modalCtrl: ModalController, - private readonly loadingCtrl: LoadingController, - private readonly api: ApiService, - private readonly errToast: ErrorToastService, - ) {} - - ngOnInit() { - this.job = new BackupJobBuilder({ name: `Backup Job ${this.count}` }) - } - - async dismiss() { - this.modalCtrl.dismiss() - } - - async save() { - const loader = await this.loadingCtrl.create({ - message: 'Saving Job', - }) - await loader.present() - this.saving = true - - try { - const job = await this.api.createBackupJob(this.job.buildCreate()) - this.modalCtrl.dismiss(job) - } catch (e: any) { - this.errToast.present(e) - } finally { - loader.dismiss() - this.saving = false - } - } -} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/pipes.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/pipes.ts index dc7afc3fb..0e756aa9a 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/pipes.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/pipes.ts @@ -8,7 +8,7 @@ export class ToHumanCronPipe implements PipeTransform { transform(cron: string): { message: string; color: string } { const toReturn = { message: '', - color: 'success', + color: 'var(--tui-positive)', } try { @@ -26,7 +26,7 @@ export class ToHumanCronPipe implements PipeTransform { toReturn.message = human } catch (e) { toReturn.message = e as string - toReturn.color = 'danger' + toReturn.color = 'var(--tui-negative)' } return toReturn diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.module.ts index 9c3f65886..fb507215d 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.module.ts @@ -6,6 +6,7 @@ import { UnitConversionPipesModule } from '@start9labs/shared' import { SkeletonListComponentModule } from 'src/app/common/skeleton-list/skeleton-list.component.module' import { FormPageModule } from 'src/app/apps/ui/modals/form/form.module' import { BackupTargetsPage } from './backup-targets.page' +import { TuiNotificationModule } from '@taiga-ui/core' const routes: Routes = [ { @@ -23,6 +24,7 @@ const routes: Routes = [ UnitConversionPipesModule, FormPageModule, RouterModule.forChild(routes), + TuiNotificationModule, ], }) export class BackupTargetsPageModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.html b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.html index c8819ed62..655bf28e6 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.html @@ -8,21 +8,17 @@ - - - -

- Backup targets are physical or virtual locations for storing encrypted - backups. They can be physical drives plugged into your server, shared - folders on your Local Area Network (LAN), or third party clouds such - as Dropbox or Google Drive. - - View instructions - -

-
-
+
+ + Backup targets are physical or virtual locations for storing encrypted + backups. They can be physical drives plugged into your server, shared + folders on your Local Area Network (LAN), or third party clouds such as + Dropbox or Google Drive. + View instructions + +
+ Unknown Physical Drives diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.ts index 7571b9974..fb5e193a3 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.ts @@ -16,7 +16,7 @@ import { import { BehaviorSubject, filter } from 'rxjs' import { TuiDialogService } from '@taiga-ui/core' import { TUI_PROMPT } from '@taiga-ui/kit' -import { ErrorService } from '@start9labs/shared' +import { ErrorService, LoadingService } from '@start9labs/shared' import { InputSpec, unionSelectKey, @@ -24,7 +24,6 @@ import { } from '@start9labs/start-sdk/lib/config/configTypes' import { FormDialogService } from 'src/app/services/form-dialog.service' import { FormPage } from 'src/app/apps/ui/modals/form/form.page' -import { LoadingService } from 'src/app/common/loading/loading.service' import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' type BackupConfig = diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.module.ts index 5c56787df..c4c53f140 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.module.ts @@ -4,7 +4,6 @@ import { CommonModule } from '@angular/common' import { IonicModule } from '@ionic/angular' import { BadgeMenuComponentModule } from 'src/app/common/badge-menu-button/badge-menu.component.module' import { InsecureWarningComponentModule } from 'src/app/common/insecure-warning/insecure-warning.module' -import { GenericInputComponentModule } from 'src/app/apps/ui/modals/generic-input/generic-input.component.module' import { BackupCreateDirective } from '../../directives/backup-create.directive' import { BackupRestoreDirective } from '../../directives/backup-restore.directive' import { @@ -15,6 +14,7 @@ import { BackupSelectPageModule } from '../../modals/backup-select/backup-select import { RecoverSelectPageModule } from '../../modals/recover-select/recover-select.module' import { TargetPipesModule } from '../../pipes/target-pipes.module' import { BackupsPage } from './backups.page' +import { PromptModule } from 'src/app/apps/ui/modals/prompt/prompt.module' const routes: Routes = [ { @@ -33,7 +33,7 @@ const routes: Routes = [ BadgeMenuComponentModule, InsecureWarningComponentModule, TargetPipesModule, - GenericInputComponentModule, + PromptModule, ], declarations: [ BackupsPage, diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.module.ts index 918fe65a5..7a7e19e81 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.module.ts @@ -14,9 +14,9 @@ import { ItemModule, SearchModule, SkeletonModule, + StoreIconComponentModule, } from '@start9labs/marketplace' import { BadgeMenuComponentModule } from 'src/app/common/badge-menu-button/badge-menu.component.module' -import { StoreIconComponentModule } from 'src/app/common/store-icon/store-icon.component.module' import { MarketplaceStatusModule } from '../marketplace-status/marketplace-status.module' import { MarketplaceListPage } from './marketplace-list.page' import { MarketplaceSettingsPageModule } from './marketplace-settings/marketplace-settings.module' diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.html b/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.html index 734cb8910..235d1b368 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.html @@ -27,6 +27,7 @@

class="icon" size="80px" [url]="details.url" + [marketplace]="config.marketplace" >

{{ details.name }}

diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.ts index fe9281485..813e9109b 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.ts @@ -41,7 +41,7 @@ export class MarketplaceListPage { if (url === start9) { color = 'success' description = - 'Services from this registry are packaged and maintained by the Start9 team. If you experience an issue or have a question related to a service from this registry, one of our dedicated support staff will be happy to assist you.' + 'Services from this registry are packaged and maintained by the Start9 team. If you experience an issue or have questions related to a service from this registry, one of our dedicated support staff will be happy to assist you.' } else if (url === community) { color = 'tertiary' description = @@ -75,7 +75,7 @@ export class MarketplaceListPage { @Inject(AbstractMarketplaceService) private readonly marketplaceService: MarketplaceService, private readonly dialogs: TuiDialogService, - private readonly config: ConfigService, + readonly config: ConfigService, private readonly route: ActivatedRoute, ) {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.module.ts index 9eaebbd34..0304046c2 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.module.ts @@ -7,9 +7,9 @@ import { TuiHostedDropdownModule, TuiSvgModule, } from '@taiga-ui/core' -import { StoreIconComponentModule } from 'src/app/common/store-icon/store-icon.component.module' import { FormPageModule } from 'src/app/apps/ui/modals/form/form.module' import { MarketplaceSettingsPage } from './marketplace-settings.page' +import { StoreIconComponentModule } from '@start9labs/marketplace' @NgModule({ imports: [ diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.html b/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.html index 8d0da271a..77dde15e7 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.html @@ -8,7 +8,10 @@ (click)="s.selected ? '' : connect(s.url)" > - +

{{ s.name }}

@@ -42,7 +45,11 @@

{{ s.name }}

> - +

{{ a.name }}

diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.ts index 09d30780e..a5fee0e90 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.ts @@ -1,5 +1,10 @@ import { ChangeDetectionStrategy, Component, Inject } from '@angular/core' -import { ErrorService, sameUrl, toUrl } from '@start9labs/shared' +import { + ErrorService, + LoadingService, + sameUrl, + toUrl, +} from '@start9labs/shared' import { AbstractMarketplaceService } from '@start9labs/marketplace' import { ValueSpecObject } from '@start9labs/start-sdk/lib/config/configTypes' import { TuiDialogService } from '@taiga-ui/core' @@ -11,7 +16,7 @@ import { DataModel, UIStore } from 'src/app/services/patch-db/data-model' import { MarketplaceService } from 'src/app/services/marketplace.service' import { FormDialogService } from 'src/app/services/form-dialog.service' import { FormPage } from 'src/app/apps/ui/modals/form/form.page' -import { LoadingService } from 'src/app/common/loading/loading.service' +import { ConfigService } from 'src/app/services/config.service' @Component({ selector: 'marketplace-settings', @@ -47,6 +52,7 @@ export class MarketplaceSettingsPage { private readonly marketplaceService: MarketplaceService, private readonly patch: PatchDB, private readonly dialogs: TuiDialogService, + readonly config: ConfigService, ) {} async presentModalAdd() { diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.ts index 732427cf2..9dc921ea8 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.ts @@ -4,17 +4,19 @@ import { Inject, Input, } from '@angular/core' -import { AlertController, LoadingController } from '@ionic/angular' import { AbstractMarketplaceService, MarketplacePkg, } from '@start9labs/marketplace' import { Emver, - ErrorToastService, + ErrorService, isEmptyObject, + LoadingService, sameUrl, } from '@start9labs/shared' +import { TuiDialogService } from '@taiga-ui/core' +import { filter, firstValueFrom, of, Subscription, switchMap } from 'rxjs' import { DataModel, PackageDataEntry, @@ -27,7 +29,7 @@ import { ApiService } from 'src/app/services/api/embassy-api.service' import { Breakages } from 'src/app/services/api/api.types' import { PatchDB } from 'patch-db-client' import { getAllPackages } from 'src/app/util/get-package-data' -import { firstValueFrom } from 'rxjs' +import { TUI_PROMPT } from '@taiga-ui/kit' @Component({ selector: 'marketplace-show-controls', @@ -50,13 +52,13 @@ export class MarketplaceShowControlsComponent { readonly PackageState = PackageState constructor( - private readonly alertCtrl: AlertController, + private readonly dialogs: TuiDialogService, private readonly ClientStorageService: ClientStorageService, @Inject(AbstractMarketplaceService) private readonly marketplaceService: MarketplaceService, - private readonly loadingCtrl: LoadingController, + private readonly loader: LoadingService, private readonly emver: Emver, - private readonly errToast: ErrorToastService, + private readonly errorService: ErrorService, private readonly embassyApi: ApiService, private readonly patch: PatchDB, ) {} @@ -112,39 +114,26 @@ export class MarketplaceShowControlsComponent { } return new Promise(async resolve => { - const alert = await this.alertCtrl.create({ - header: 'Warning', - message: `This service was originally ${ - originalName ? 'installed from ' + originalName : 'side loaded' - }, but you are currently connected to ${name}. To install from ${name} anyway, click "Continue".`, - buttons: [ - { - text: 'Cancel', - role: 'cancel', - handler: () => { - resolve(false) - }, + this.dialogs + .open(TUI_PROMPT, { + label: 'Warning', + size: 's', + data: { + content: `This service was originally ${ + originalName ? 'installed from ' + originalName : 'side loaded' + }, but you are currently connected to ${name}. To install from ${name} anyway, click "Continue".`, + yes: 'Continue', + no: 'Cancel', }, - { - text: 'Continue', - handler: () => { - resolve(true) - }, - cssClass: 'enter-click', - }, - ], - cssClass: 'alert-warning-message', - }) - - await alert.present() + }) + .subscribe(response => resolve(response)) }) } private async dryInstall(url: string) { - const loader = await this.loadingCtrl.create({ - message: 'Checking dependent services...', - }) - await loader.present() + const loader = this.loader + .open('Checking dependent services...') + .subscribe() const { id, version } = this.pkg.manifest @@ -157,49 +146,47 @@ export class MarketplaceShowControlsComponent { if (isEmptyObject(breakages)) { this.install(url, loader) } else { - await loader.dismiss() + loader.unsubscribe() const proceed = await this.presentAlertBreakages(breakages) if (proceed) { this.install(url) } } } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } } - private async alertInstall(url: string) { - const installAlert = this.pkg.manifest.alerts.install - - if (!installAlert) return this.install(url) - - const alert = await this.alertCtrl.create({ - header: 'Alert', - message: installAlert, - buttons: [ - { - text: 'Cancel', - role: 'cancel', - }, - { - text: 'Install', - handler: () => { - this.install(url) - }, - cssClass: 'enter-click', - }, - ], - }) - await alert.present() + private alertInstall(url: string) { + of(this.pkg.manifest.alerts.install) + .pipe( + switchMap(content => + content + ? of(true) + : this.dialogs.open(TUI_PROMPT, { + label: 'Alert', + size: 's', + data: { + content, + yes: 'Install', + no: 'Cancel', + }, + }), + ), + filter(Boolean), + ) + .subscribe(() => this.install(url)) } - private async install(url: string, loader?: HTMLIonLoadingElement) { + private async install(url: string, loader?: Subscription) { const message = 'Beginning Install...' + if (loader) { - loader.message = message + loader.unsubscribe() + loader.closed = false + loader.add(this.loader.open(message).subscribe()) } else { - loader = await this.loadingCtrl.create({ message }) - await loader.present() + loader = this.loader.open(message).subscribe() } const { id, version } = this.pkg.manifest @@ -207,46 +194,34 @@ export class MarketplaceShowControlsComponent { try { await this.marketplaceService.installPackage(id, version, url) } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { - loader.dismiss() + loader.unsubscribe() } } private async presentAlertBreakages(breakages: Breakages): Promise { - let message: string = + let content: string = 'As a result of this update, the following services will no longer work properly and may crash:
    ' const localPkgs = await getAllPackages(this.patch) const bullets = Object.keys(breakages).map(id => { const title = localPkgs[id].manifest.title return `
  • ${title}
  • ` }) - message = `${message}${bullets.join('')}
` + content = `${content}${bullets.join('')}` return new Promise(async resolve => { - const alert = await this.alertCtrl.create({ - header: 'Warning', - message, - buttons: [ - { - text: 'Cancel', - role: 'cancel', - handler: () => { - resolve(false) - }, - }, - { - text: 'Continue', - handler: () => { - resolve(true) - }, - cssClass: 'enter-click', + this.dialogs + .open(TUI_PROMPT, { + label: 'Warning', + size: 's', + data: { + content, + yes: 'Continue', + no: 'Cancel', }, - ], - cssClass: 'alert-warning-message', - }) - - await alert.present() + }) + .subscribe(response => resolve(response)) }) } } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/notifications/notifications.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/notifications/notifications.module.ts index dfbb6036d..2f50677a3 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/notifications/notifications.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/notifications/notifications.module.ts @@ -2,9 +2,10 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { IonicModule } from '@ionic/angular' import { RouterModule, Routes } from '@angular/router' +import { SharedPipesModule } from '@start9labs/shared' +import { TuiPromptModule } from '@taiga-ui/kit' import { NotificationsPage } from './notifications.page' import { BadgeMenuComponentModule } from 'src/app/common/badge-menu-button/badge-menu.component.module' -import { SharedPipesModule } from '@start9labs/shared' import { BackupReportPageModule } from '../../modals/backup-report/backup-report.module' const routes: Routes = [ @@ -22,6 +23,7 @@ const routes: Routes = [ BadgeMenuComponentModule, SharedPipesModule, BackupReportPageModule, + TuiPromptModule, ], declarations: [NotificationsPage], }) diff --git a/frontend/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.ts index e47b95276..909ffcc75 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.ts @@ -1,21 +1,19 @@ import { Component } from '@angular/core' +import { ActivatedRoute } from '@angular/router' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { TuiDialogService } from '@taiga-ui/core' +import { TUI_PROMPT } from '@taiga-ui/kit' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' +import { PatchDB } from 'patch-db-client' +import { filter, first } from 'rxjs' import { ApiService } from 'src/app/services/api/embassy-api.service' import { ServerNotifications, NotificationLevel, ServerNotification, } from 'src/app/services/api/api.types' -import { - AlertController, - LoadingController, - ModalController, -} from '@ionic/angular' -import { ActivatedRoute } from '@angular/router' -import { ErrorToastService } from '@start9labs/shared' -import { BackupReportPage } from 'src/app/apps/ui/modals/backup-report/backup-report.page' -import { PatchDB } from 'patch-db-client' +import { BackupReportComponent } from '../../modals/backup-report/backup-report.component' import { DataModel } from 'src/app/services/patch-db/data-model' -import { first } from 'rxjs' @Component({ selector: 'notifications', @@ -33,10 +31,9 @@ export class NotificationsPage { constructor( private readonly embassyApi: ApiService, - private readonly alertCtrl: AlertController, - private readonly loadingCtrl: LoadingController, - private readonly modalCtrl: ModalController, - private readonly errToast: ErrorToastService, + private readonly loader: LoadingService, + private readonly dialogs: TuiDialogService, + private readonly errorService: ErrorService, private readonly route: ActivatedRoute, private readonly patch: PatchDB, ) {} @@ -66,77 +63,55 @@ export class NotificationsPage { return notifications } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } return [] } async delete(id: number, index: number): Promise { - const loader = await this.loadingCtrl.create({ - message: 'Deleting...', - }) - await loader.present() + const loader = this.loader.open('Deleting...').subscribe() try { await this.embassyApi.deleteNotification({ id }) this.notifications.splice(index, 1) this.beforeCursor = this.notifications[this.notifications.length - 1]?.id } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { - loader.dismiss() + loader.unsubscribe() } } - async presentAlertDeleteAll() { - const alert = await this.alertCtrl.create({ - header: 'Delete All?', - message: 'Are you sure you want to delete all notifications?', - buttons: [ - { - text: 'Cancel', - role: 'cancel', + presentAlertDeleteAll() { + this.dialogs + .open(TUI_PROMPT, { + label: 'Delete All?', + size: 's', + data: { + content: 'Are you sure you want to delete all notifications?', + yes: 'Delete', + no: 'Cancel', }, - { - text: 'Delete', - handler: () => { - this.deleteAll() - }, - cssClass: 'enter-click', - }, - ], - }) - await alert.present() + }) + .pipe(filter(Boolean)) + .subscribe(() => this.deleteAll()) } async viewBackupReport(notification: ServerNotification<1>) { - const modal = await this.modalCtrl.create({ - component: BackupReportPage, - componentProps: { - report: notification.data, - timestamp: notification['created-at'], - }, - }) - await modal.present() + this.dialogs + .open(new PolymorpheusComponent(BackupReportComponent), { + label: 'Backup Report', + data: { + report: notification.data, + timestamp: notification['created-at'], + }, + }) + .subscribe() } - async viewFullMessage(header: string, message: string) { - const alert = await this.alertCtrl.create({ - header, - message, - cssClass: 'notification-detail-alert', - buttons: [ - { - text: `OK`, - handler: () => { - alert.dismiss() - }, - cssClass: 'enter-click', - }, - ], - }) - await alert.present() + viewFullMessage(label: string, message: string) { + this.dialogs.open(message, { label }).subscribe() } truncate(message: string): string { @@ -159,10 +134,7 @@ export class NotificationsPage { } private async deleteAll(): Promise { - const loader = await this.loadingCtrl.create({ - message: 'Deleting...', - }) - await loader.present() + const loader = this.loader.open('Deleting...').subscribe() try { await this.embassyApi.deleteAllNotifications({ @@ -171,9 +143,9 @@ export class NotificationsPage { this.notifications = [] this.beforeCursor = undefined } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { - loader.dismiss() + loader.unsubscribe() } } } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.html b/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.html index da8cc7be5..ed8babcc0 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.html @@ -1,35 +1,22 @@ - - - Execution Complete - - - - - - - +

{{ actionRes.message }}

- -

{{ actionRes.message }}

- -
-
- -
- -

{{ actionRes.value }}

- - {{ actionRes.value }} - - - - +
+
+
- + +

{{ actionRes.value }}

+ + {{ actionRes.value }} + + + + +
diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.ts index 48adb138a..f4b390269 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.ts @@ -1,38 +1,21 @@ -import { Component, Input } from '@angular/core' -import { ModalController, ToastController } from '@ionic/angular' +import { Component, Inject } from '@angular/core' +import { CopyService } from '@start9labs/shared' +import { TuiDialogContext } from '@taiga-ui/core' +import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' import { ActionResponse } from 'src/app/services/api/api.types' -import { copyToClipboard } from '@start9labs/shared' @Component({ selector: 'action-success', templateUrl: './action-success.page.html', }) export class ActionSuccessPage { - @Input() - actionRes!: ActionResponse - constructor( - private readonly modalCtrl: ModalController, - private readonly toastCtrl: ToastController, + @Inject(POLYMORPHEUS_CONTEXT) + private readonly context: TuiDialogContext, + readonly copyService: CopyService, ) {} - async copy(address: string) { - let message = '' - await copyToClipboard(address || '').then(success => { - message = success - ? 'Copied to clipboard!' - : 'Failed to copy to clipboard.' - }) - - const toast = await this.toastCtrl.create({ - header: message, - position: 'bottom', - duration: 1000, - }) - await toast.present() - } - - async dismiss() { - return this.modalCtrl.dismiss() + get actionRes(): ActionResponse { + return this.context.data } } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.ts index e8eaa1010..42e354d06 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.ts @@ -6,27 +6,30 @@ import { PipeTransform, } from '@angular/core' import { ActivatedRoute } from '@angular/router' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { AlertController, ModalController, NavController } from '@ionic/angular' +import { NavController } from '@ionic/angular' +import { + isEmptyObject, + getPkgId, + WithId, + ErrorService, + LoadingService, +} from '@start9labs/shared' +import { TuiDialogService } from '@taiga-ui/core' import { PatchDB } from 'patch-db-client' +import { filter, switchMap, timer } from 'rxjs' +import { ApiService } from 'src/app/services/api/embassy-api.service' import { Action, DataModel, PackageDataEntry, PackageState, } from 'src/app/services/patch-db/data-model' -import { - isEmptyObject, - getPkgId, - WithId, - ErrorService, -} from '@start9labs/shared' import { ActionSuccessPage } from './action-success/action-success.page' import { hasCurrentDeps } from 'src/app/util/has-deps' -import { filter } from 'rxjs' import { FormDialogService } from 'src/app/services/form-dialog.service' import { FormPage } from 'src/app/apps/ui/modals/form/form.page' -import { LoadingService } from 'src/app/common/loading/loading.service' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' +import { TUI_PROMPT } from '@taiga-ui/kit' @Component({ selector: 'app-actions', @@ -43,8 +46,7 @@ export class AppActionsPage { constructor( private readonly route: ActivatedRoute, private readonly embassyApi: ApiService, - private readonly modalCtrl: ModalController, - private readonly alertCtrl: AlertController, + private readonly dialogs: TuiDialogService, private readonly errorService: ErrorService, private readonly loader: LoadingService, private readonly navCtrl: NavController, @@ -54,13 +56,12 @@ export class AppActionsPage { async handleAction(action: WithId) { if (action.disabled) { - const alert = await this.alertCtrl.create({ - header: 'Forbidden', - message: action.disabled, - buttons: ['OK'], - cssClass: 'alert-error-message enter-click', - }) - await alert.present() + this.dialogs + .open(action.disabled, { + label: 'Forbidden', + size: 's', + }) + .subscribe() } else { if (action['input-spec'] && !isEmptyObject(action['input-spec'])) { this.formDialog.open(FormPage, { @@ -77,24 +78,20 @@ export class AppActionsPage { }, }) } else { - const alert = await this.alertCtrl.create({ - header: 'Confirm', - message: `Are you sure you want to execute action "${action.name}"? ${ - action.warning || '' - }`, - buttons: [ - { - text: 'Cancel', - role: 'cancel', - }, - { - text: 'Execute', - handler: async () => this.executeAction(action.id), - cssClass: 'enter-click', + this.dialogs + .open(TUI_PROMPT, { + label: 'Confirm', + size: 's', + data: { + content: `Are you sure you want to execute action "${ + action.name + }"? ${action.warning || ''}`, + yes: 'Execute', + no: 'Cancel', }, - ], - }) - await alert.present() + }) + .pipe(filter(Boolean)) + .subscribe(() => this.executeAction(action.id)) } } } @@ -102,34 +99,26 @@ export class AppActionsPage { async tryUninstall(pkg: PackageDataEntry): Promise { const { title, alerts, id } = pkg.manifest - let message = + let content = alerts.uninstall || `Uninstalling ${title} will permanently delete its data` if (await hasCurrentDeps(this.patch, id)) { - message = `${message}. Services that depend on ${title} will no longer work properly and may crash` + content = `${content}. Services that depend on ${title} will no longer work properly and may crash` } - const alert = await this.alertCtrl.create({ - header: 'Warning', - message, - buttons: [ - { - text: 'Cancel', - role: 'cancel', + this.dialogs + .open(TUI_PROMPT, { + label: 'Warning', + size: 's', + data: { + content, + yes: 'Uninstall', + no: 'Cancel', }, - { - text: 'Uninstall', - handler: () => { - this.uninstall() - }, - cssClass: 'enter-click', - }, - ], - cssClass: 'alert-warning-message', - }) - - await alert.present() + }) + .pipe(filter(Boolean)) + .subscribe(() => this.uninstall()) } private async uninstall() { @@ -155,20 +144,23 @@ export class AppActionsPage { const loader = this.loader.open('Executing action...').subscribe() try { - const res = await this.embassyApi.executePackageAction({ + const data = await this.embassyApi.executePackageAction({ id: this.pkgId, 'action-id': actionId, input, }) - const successModal = await this.modalCtrl.create({ - component: ActionSuccessPage, - componentProps: { - actionRes: res, - }, - }) + timer(500) + .pipe( + switchMap(() => + this.dialogs.open(new PolymorpheusComponent(ActionSuccessPage), { + label: 'Execution Complete', + data, + }), + ), + ) + .subscribe() - setTimeout(() => successModal.present(), 500) return true } catch (e: any) { this.errorService.handleError(e) diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.html b/frontend/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.html index 4c9a8b41f..f2f9ecb18 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.html @@ -43,7 +43,7 @@

{{ cred.key }}

size="small" > - + { - const success = await copyToClipboard(text) - const message = success - ? 'Copied. Clearing clipboard in 20 seconds' - : 'Failed to copy.' - - const toast = await this.toastCtrl.create({ - header: message, - position: 'bottom', - duration: 2000, - }) - await toast.present() - } - mask(value: string) { return mask(value, 64) } @@ -64,7 +45,7 @@ export class AppCredentialsPage { id: this.pkgId, }) } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { this.loading = false } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces-item.component.html b/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces-item.component.html index 0e5942b6a..c04293e09 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces-item.component.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces-item.component.html @@ -26,7 +26,7 @@

{{ address | addressType }}

name="qr-code-outline" >
- + diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces.page.ts index 86650d044..52537ac0e 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces.page.ts @@ -1,11 +1,12 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core' import { ActivatedRoute } from '@angular/router' -import { ModalController, ToastController } from '@ionic/angular' -import { getPkgId, copyToClipboard } from '@start9labs/shared' +import { getPkgId, CopyService } from '@start9labs/shared' import { AddressInfo, DataModel } from 'src/app/services/patch-db/data-model' import { PatchDB } from 'patch-db-client' import { map } from 'rxjs' import { QRComponent } from './qr.component' +import { TuiDialogService } from '@taiga-ui/core' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' @Component({ selector: 'app-interfaces', @@ -39,38 +40,20 @@ export class AppInterfacesItemComponent { addressInfo!: AddressInfo constructor( - private readonly toastCtrl: ToastController, - private readonly modalCtrl: ModalController, + private readonly dialogs: TuiDialogService, + readonly copyService: CopyService, ) {} launch(url: string): void { window.open(url, '_blank', 'noreferrer') } - async showQR(text: string): Promise { - const modal = await this.modalCtrl.create({ - component: QRComponent, - componentProps: { - text, - }, - cssClass: 'qr-modal', - }) - await modal.present() - } - - async copy(address: string): Promise { - let message = '' - await copyToClipboard(address || '').then(success => { - message = success - ? 'Copied to clipboard!' - : 'Failed to copy to clipboard.' - }) - - const toast = await this.toastCtrl.create({ - header: message, - position: 'bottom', - duration: 1000, - }) - await toast.present() + showQR(data: string) { + this.dialogs + .open(new PolymorpheusComponent(QRComponent), { + size: 'auto', + data, + }) + .subscribe() } } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/qr.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/qr.component.ts index 8f34aa01d..a87e43863 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/qr.component.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/qr.component.ts @@ -1,9 +1,14 @@ -import { Component, Input } from '@angular/core' +import { Component, Inject } from '@angular/core' +import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' +import { TuiDialogContext } from '@taiga-ui/core' @Component({ selector: 'qr', - template: '', + template: '', }) export class QRComponent { - @Input() text!: string + constructor( + @Inject(POLYMORPHEUS_CONTEXT) + readonly context: TuiDialogContext, + ) {} } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.html b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.html index 4fc0eea32..e337dd202 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.html @@ -13,7 +13,7 @@

Installed

*ngIf="manifest['git-hash'] as gitHash; else noHash" button detail="false" - (click)="copy(gitHash)" + (click)="copyService.copy(gitHash)" >

Git Hash

diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.ts index 3b4e84787..a61101cd0 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.ts @@ -1,6 +1,7 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core' -import { ModalController, ToastController } from '@ionic/angular' -import { copyToClipboard, MarkdownComponent } from '@start9labs/shared' +import { CopyService, MarkdownComponent } from '@start9labs/shared' +import { TuiDialogService } from '@taiga-ui/core' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' import { from } from 'rxjs' import { ApiService } from 'src/app/services/api/embassy-api.service' import { PackageDataEntry } from 'src/app/services/patch-db/data-model' @@ -15,40 +16,26 @@ export class AppShowAdditionalComponent { pkg!: PackageDataEntry constructor( - private readonly modalCtrl: ModalController, - private readonly toastCtrl: ToastController, + readonly copyService: CopyService, + private readonly dialogs: TuiDialogService, private readonly api: ApiService, ) {} - async copy(address: string): Promise { - const success = await copyToClipboard(address) - const message = success - ? 'Copied to clipboard!' - : 'Failed to copy to clipboard.' - - const toast = await this.toastCtrl.create({ - header: message, - position: 'bottom', - duration: 1000, - }) - await toast.present() - } - - async presentModalLicense() { + presentModalLicense() { const { id, version } = this.pkg.manifest - const modal = await this.modalCtrl.create({ - componentProps: { - title: 'License', - content: from( - this.api.getStatic( - `/public/package-data/${id}/${version}/LICENSE.md`, + this.dialogs + .open(new PolymorpheusComponent(MarkdownComponent), { + label: 'License', + size: 'l', + data: { + content: from( + this.api.getStatic( + `/public/package-data/${id}/${version}/LICENSE.md`, + ), ), - ), - }, - component: MarkdownComponent, - }) - - await modal.present() + }, + }) + .subscribe() } } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.ts index c3ad71beb..91eb1f7f0 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.ts @@ -4,6 +4,11 @@ import { Input, ViewChild, } from '@angular/core' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { TuiDialogService } from '@taiga-ui/core' +import { TUI_PROMPT } from '@taiga-ui/kit' +import { PatchDB } from 'patch-db-client' +import { filter } from 'rxjs' import { PackageStatus, PrimaryRendering, @@ -16,8 +21,6 @@ import { PackageDataEntry, PackageState, } from 'src/app/services/patch-db/data-model' -import { ErrorToastService } from '@start9labs/shared' -import { AlertController, LoadingController } from '@ionic/angular' import { ApiService } from 'src/app/services/api/embassy-api.service' import { FormDialogService } from 'src/app/services/form-dialog.service' import { @@ -27,7 +30,6 @@ import { import { DependencyInfo } from '../../pipes/to-dependencies.pipe' import { hasCurrentDeps } from 'src/app/util/has-deps' import { ConnectionService } from 'src/app/services/connection.service' -import { PatchDB } from 'patch-db-client' import { LaunchMenuComponent } from '../../../launch-menu/launch-menu.component' @Component({ @@ -51,9 +53,9 @@ export class AppShowStatusComponent { readonly connected$ = this.connectionService.connected$ constructor( - private readonly alertCtrl: AlertController, - private readonly errToast: ErrorToastService, - private readonly loadingCtrl: LoadingController, + private readonly dialogs: TuiDialogService, + private readonly errorService: ErrorService, + private readonly loader: LoadingService, private readonly embassyApi: ApiService, private readonly formDialog: FormDialogService, private readonly connectionService: ConnectionService, @@ -122,33 +124,25 @@ export class AppShowStatusComponent { async tryStop(): Promise { const { title, alerts, id } = this.pkg.manifest - let message = alerts.stop || '' + let content = alerts.stop || '' if (await hasCurrentDeps(this.patch, id)) { const depMessage = `Services that depend on ${title} will no longer work properly and may crash` - message = message ? `${message}.\n\n${depMessage}` : depMessage + content = content ? `${content}.\n\n${depMessage}` : depMessage } - if (message) { - const alert = await this.alertCtrl.create({ - header: 'Warning', - message, - buttons: [ - { - text: 'Cancel', - role: 'cancel', - }, - { - text: 'Stop', - handler: () => { - this.stop() - }, - cssClass: 'enter-click', + if (content) { + this.dialogs + .open(TUI_PROMPT, { + label: 'Warning', + size: 's', + data: { + content, + yes: 'Stop', + no: 'Cancel', }, - ], - cssClass: 'alert-warning-message', - }) - - await alert.present() + }) + .pipe(filter(Boolean)) + .subscribe(() => this.stop()) } else { this.stop() } @@ -158,99 +152,71 @@ export class AppShowStatusComponent { const { id, title } = this.pkg.manifest if (await hasCurrentDeps(this.patch, id)) { - const alert = await this.alertCtrl.create({ - header: 'Warning', - message: `Services that depend on ${title} may temporarily experiences issues`, - buttons: [ - { - text: 'Cancel', - role: 'cancel', - }, - { - text: 'Restart', - handler: () => { - this.restart() - }, - cssClass: 'enter-click', + this.dialogs + .open(TUI_PROMPT, { + label: 'Warning', + size: 's', + data: { + content: `Services that depend on ${title} may temporarily experiences issues`, + yes: 'Restart', + no: 'Cancel', }, - ], - cssClass: 'alert-warning-message', - }) - - await alert.present() + }) + .pipe(filter(Boolean)) + .subscribe(() => this.restart()) } else { this.restart() } } private async start(): Promise { - const loader = await this.loadingCtrl.create({ - message: `Starting...`, - }) - await loader.present() + const loader = this.loader.open(`Starting...`).subscribe() try { await this.embassyApi.startPackage({ id: this.id }) } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { - loader.dismiss() + loader.unsubscribe() } } private async stop(): Promise { - const loader = await this.loadingCtrl.create({ - message: 'Stopping...', - }) - await loader.present() + const loader = this.loader.open(`Stopping...`).subscribe() try { await this.embassyApi.stopPackage({ id: this.id }) } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { - loader.dismiss() + loader.unsubscribe() } } private async restart(): Promise { - const loader = await this.loadingCtrl.create({ - message: `Restarting...`, - }) - await loader.present() + const loader = this.loader.open(`Restarting...`).subscribe() try { await this.embassyApi.restartPackage({ id: this.id }) } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { - loader.dismiss() + loader.unsubscribe() } } - private async presentAlertStart(message: string): Promise { + private async presentAlertStart(content: string): Promise { return new Promise(async resolve => { - const alert = await this.alertCtrl.create({ - header: 'Alert', - message, - buttons: [ - { - text: 'Cancel', - role: 'cancel', - handler: () => { - resolve(false) - }, + this.dialogs + .open(TUI_PROMPT, { + label: 'Warning', + size: 's', + data: { + content, + yes: 'Continue', + no: 'Cancel', }, - { - text: 'Continue', - handler: () => { - resolve(true) - }, - cssClass: 'enter-click', - }, - ], - }) - - await alert.present() + }) + .subscribe(response => resolve(response)) }) } } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.ts index f606d067e..14596b7b8 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.ts @@ -1,16 +1,15 @@ import { Component, Inject } from '@angular/core' import { endWith, firstValueFrom, Subscription } from 'rxjs' -import { tuiIsString } from '@taiga-ui/cdk' -import { - TuiAlertService, - TuiDialogContext, - TuiDialogService, - TuiNotification, -} from '@taiga-ui/core' +import { TuiDialogContext, TuiDialogService } from '@taiga-ui/core' import { TUI_PROMPT, TuiPromptData } from '@taiga-ui/kit' import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' import { ApiService } from 'src/app/services/api/embassy-api.service' -import { getErrorMessage, isEmptyObject } from '@start9labs/shared' +import { + ErrorService, + getErrorMessage, + isEmptyObject, + LoadingService, +} from '@start9labs/shared' import { InputSpec } from '@start9labs/start-sdk/lib/config/configTypes' import { DataModel, @@ -22,7 +21,6 @@ import { hasCurrentDeps } from 'src/app/util/has-deps' import { getAllPackages, getPackage } from 'src/app/util/get-package-data' import { Breakages } from 'src/app/services/api/api.types' import { InvalidService } from 'src/app/common/form/invalid.service' -import { LoadingService } from 'src/app/common/loading/loading.service' import { DependentInfo } from 'src/app/types/dependent-info' import { ActionButton } from 'src/app/apps/ui/modals/form/form.page' @@ -63,7 +61,7 @@ export class AppConfigPage { @Inject(POLYMORPHEUS_CONTEXT) private readonly context: TuiDialogContext, private readonly dialogs: TuiDialogService, - private readonly alerts: TuiAlertService, + private readonly errorService: ErrorService, private readonly loader: LoadingService, private readonly embassyApi: ApiService, private readonly patchDb: PatchDB, @@ -99,9 +97,7 @@ export class AppConfigPage { this.spec = spec } } catch (e: any) { - const message = getErrorMessage(e) - - this.loadingError = tuiIsString(message) ? message : message.value + this.loadingError = getErrorMessage(e) } finally { this.loadingText = '' } @@ -119,7 +115,7 @@ export class AppConfigPage { await this.configure(config, loader) } } catch (e: any) { - this.showError(e) + this.errorService.handleError(e) } finally { loader.unsubscribe() } @@ -186,16 +182,4 @@ export class AppConfigPage { this.dialogs.open(TUI_PROMPT, { data }).pipe(endWith(false)), ) } - - private showError(e: any) { - const message = getErrorMessage(e) - - this.alerts - .open(tuiIsString(message) ? message : message.value, { - status: TuiNotification.Error, - autoClose: false, - label: 'Error', - }) - .subscribe() - } } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/to-buttons.pipe.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/to-buttons.pipe.ts index 02113250d..cf8252b75 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/to-buttons.pipe.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/to-buttons.pipe.ts @@ -1,7 +1,8 @@ import { Pipe, PipeTransform } from '@angular/core' import { ActivatedRoute } from '@angular/router' -import { ModalController, NavController } from '@ionic/angular' +import { NavController } from '@ionic/angular' import { MarkdownComponent } from '@start9labs/shared' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' import { DataModel, PackageDataEntry, @@ -14,6 +15,7 @@ import { import { ApiService } from 'src/app/services/api/embassy-api.service' import { from, map, Observable } from 'rxjs' import { PatchDB } from 'patch-db-client' +import { TuiDialogService } from '@taiga-ui/core' export interface Button { title: string @@ -31,7 +33,7 @@ export class ToButtonsPipe implements PipeTransform { constructor( private readonly route: ActivatedRoute, private readonly navCtrl: NavController, - private readonly modalCtrl: ModalController, + private readonly dialogs: TuiDialogService, private readonly formDialog: FormDialogService, private readonly apiService: ApiService, private readonly patch: PatchDB, @@ -110,19 +112,19 @@ export class ToButtonsPipe implements PipeTransform { .setDbValue(['ack-instructions', id], true) .catch(e => console.error('Failed to mark instructions as seen', e)) - const modal = await this.modalCtrl.create({ - componentProps: { - title: 'Instructions', - content: from( - this.apiService.getStatic( - `/public/package-data/${id}/${version}/INSTRUCTIONS.md`, + this.dialogs + .open(new PolymorpheusComponent(MarkdownComponent), { + label: 'Instructions', + size: 'l', + data: { + content: from( + this.apiService.getStatic( + `/public/package-data/${id}/${version}/INSTRUCTIONS.md`, + ), ), - ), - }, - component: MarkdownComponent, - }) - - await modal.present() + }, + }) + .subscribe() } private viewInMarketplaceButton(pkg: PackageDataEntry): Button { diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts new file mode 100644 index 000000000..1670fde80 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts @@ -0,0 +1,34 @@ +import { Config } from '@start9labs/start-sdk/lib/config/builder/config' +import { Value } from '@start9labs/start-sdk/lib/config/builder/value' + +export const domainSpec = Config.of({ + provider: Value.select({ + name: 'Provider', + required: { default: null }, + values: { + namecheap: 'Namecheap', + googledomains: 'Google Domains', + duckdns: 'Duck DNS', + changeip: 'ChangeIP', + easydns: 'easyDNS', + zoneedit: 'Zoneedit', + dyn: 'DynDNS', + }, + }), + domain: Value.text({ + name: 'Domain Name', + required: { default: null }, + placeholder: 'yourdomain.com', + }), + username: Value.text({ + name: 'Username', + required: { default: null }, + }), + password: Value.text({ + name: 'Password', + required: { default: null }, + masked: true, + }), +}) + +export type DomainSpec = typeof domainSpec.validator._TYPE diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/lan/lan.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.module.ts similarity index 57% rename from frontend/projects/ui/src/app/apps/ui/pages/system/lan/lan.module.ts rename to frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.module.ts index dc0216ce2..39af70e92 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/lan/lan.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.module.ts @@ -1,14 +1,15 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' -import { Routes, RouterModule } from '@angular/router' import { IonicModule } from '@ionic/angular' -import { LANPage } from './lan.page' +import { RouterModule, Routes } from '@angular/router' +import { DomainsPage } from './domains.page' +import { TuiNotificationModule } from '@taiga-ui/core' import { SharedPipesModule } from '@start9labs/shared' const routes: Routes = [ { path: '', - component: LANPage, + component: DomainsPage, }, ] @@ -16,9 +17,10 @@ const routes: Routes = [ imports: [ CommonModule, IonicModule, + TuiNotificationModule, RouterModule.forChild(routes), SharedPipesModule, ], - declarations: [LANPage], + declarations: [DomainsPage], }) -export class LANPageModule {} +export class DomainsPageModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html new file mode 100644 index 000000000..9ce477592 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html @@ -0,0 +1,126 @@ + + + + + + Domains + + + + +
+ + Adding domains to StartOS enables you to access your server and service + interfaces over clearnet. + View instructions + +
+ + + + Start9.me + + + Claim + + + +
+ + + Domain + Added + Provider + In Use + + + + {{ start9Me.value }} + {{ start9Me.createdAt| date: 'medium' }} + Start9 + + + {{ qty }} Interfaces + + + N/A + + + + + + + + + + + +
+ + + Custom Domains + + + Add Domain + + + +
+ + + Domain + Added + Provider + In Use + + + + {{ domain.value }} + {{ domain.createdAt| date: 'medium' }} + {{ domain.provider }} + + + {{ qty }} Interfaces + + + N/A + + + + + + + + + + + +
+
+
diff --git a/frontend/projects/diagnostic-ui/src/app/pages/logs/logs.page.scss b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.scss similarity index 100% rename from frontend/projects/diagnostic-ui/src/app/pages/logs/logs.page.scss rename to frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.ts new file mode 100644 index 000000000..4ccaed895 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.ts @@ -0,0 +1,215 @@ +import { Component } from '@angular/core' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { TuiDialogOptions, TuiDialogService } from '@taiga-ui/core' +import { TUI_PROMPT } from '@taiga-ui/kit' +import { combineLatest, filter, first, map, switchMap } from 'rxjs' +import { PatchDB } from 'patch-db-client' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { FormDialogService } from 'src/app/services/form-dialog.service' +import { DomainSpec, domainSpec } from './domain.const' +import { ConnectionService } from 'src/app/services/connection.service' +import { FormContext, FormPage } from '../../../modals/form/form.page' +import { getClearnetAddress } from 'src/app/util/clearnetAddress' + +@Component({ + selector: 'domains', + templateUrl: 'domains.page.html', + styleUrls: ['domains.page.scss'], +}) +export class DomainsPage { + readonly docsUrl = 'https://docs.start9.com/latest/user-manual/domains' + + readonly server$ = this.patch.watch$('server-info') + readonly pkgs$ = this.patch.watch$('package-data').pipe(first()) + + readonly domains$ = this.connectionService.connected$.pipe( + filter(Boolean), + switchMap(() => + combineLatest([this.server$, this.pkgs$]).pipe( + map(([{ ui, network }, packageData]) => { + const start9MeSubdomain = network.start9MeSubdomain + const start9Me = !start9MeSubdomain + ? null + : { + value: `${start9MeSubdomain.value}.start9.me`, + createdAt: start9MeSubdomain.createdAt, + provider: 'Start9', + usedBy: usedBy( + start9MeSubdomain.value, + getClearnetAddress('https', ui.domainInfo), + packageData, + ), + } + const custom = network.domains.map(domain => ({ + value: domain.value, + createdAt: domain.createdAt, + provider: domain.provider, + usedBy: usedBy( + domain.value, + getClearnetAddress('https', ui.domainInfo), + packageData, + ), + })) + + return { start9Me, custom } + }), + ), + ), + ) + + constructor( + private readonly errorService: ErrorService, + private readonly dialogs: TuiDialogService, + private readonly api: ApiService, + private readonly loader: LoadingService, + private readonly formDialog: FormDialogService, + private readonly connectionService: ConnectionService, + private readonly patch: PatchDB, + ) {} + + async presentModalAdd() { + const options: Partial>> = { + label: 'Custom Domain', + data: { + spec: await domainSpec.build({} as any), + buttons: [ + { + text: 'Save', + handler: async value => this.save(value), + }, + ], + }, + } + this.formDialog.open(FormPage, options) + } + + presentAlertClaimStart9MeDomain() { + this.dialogs + .open(TUI_PROMPT, { + label: 'Confirm', + size: 's', + data: { + content: 'Claim your start9.me domain?', + yes: 'Claim', + no: 'Cancel', + }, + }) + .pipe(filter(Boolean)) + .subscribe(() => this.claimStart9MeDomain()) + } + + presentAlertDelete(hostname: string) { + this.dialogs + .open(TUI_PROMPT, { + label: 'Confirm', + size: 's', + data: { + content: 'Delete domain?', + yes: 'Delete', + no: 'Cancel', + }, + }) + .pipe(filter(Boolean)) + .subscribe(() => this.delete(hostname)) + } + + presentAlertDeleteStart9Me() { + this.dialogs + .open(TUI_PROMPT, { + label: 'Confirm', + size: 's', + data: { + content: 'Delete start9.me domain?', + yes: 'Delete', + no: 'Cancel', + }, + }) + .pipe(filter(Boolean)) + .subscribe(() => this.deleteStart9MeDomain()) + } + + presentAlertUsedBy(domain: string, usedBy: string[]) { + this.dialogs + .open( + `${domain} is currently being used by:
    ${usedBy.map( + u => `
  • ${u}
  • `, + )}
`, + { + label: 'Used by', + size: 's', + }, + ) + .subscribe() + } + + private async claimStart9MeDomain(): Promise { + const loader = this.loader.open('Saving...').subscribe() + + try { + await this.api.claimStart9MeDomain({}) + return true + } catch (e: any) { + this.errorService.handleError(e) + return false + } finally { + loader.unsubscribe() + } + } + + private async save(value: DomainSpec): Promise { + const loader = this.loader.open('Saving...').subscribe() + + try { + await this.api.addDomain(value) + return true + } catch (e: any) { + this.errorService.handleError(e) + return false + } finally { + loader.unsubscribe() + } + } + + private async delete(hostname: string): Promise { + const loader = this.loader.open('Deleting...').subscribe() + + try { + await this.api.deleteDomain({ hostname }) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } + + private async deleteStart9MeDomain(): Promise { + const loader = this.loader.open('Deleting...').subscribe() + + try { + await this.api.deleteStart9MeDomain({}) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } +} + +function usedBy( + domain: string, + serverUi: string | null, + pkgs: DataModel['package-data'], +): string[] { + const list = [] + if (serverUi && serverUi.includes(domain)) list.push('StartOS Web Interface') + return list.concat( + Object.values(pkgs) + .filter(pkg => + Object.values(pkg.installed?.['address-info'] || {}).some(ai => + ai.addresses.some(a => a.includes(domain)), + ), + ) + .map(pkg => pkg.manifest.title), + ) +} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/email/email.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/email/email.page.ts index a7ea7a233..fb8ae298e 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/email/email.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/email/email.page.ts @@ -1,6 +1,6 @@ import { Component } from '@angular/core' import { UntypedFormGroup } from '@angular/forms' -import { ErrorService } from '@start9labs/shared' +import { ErrorService, LoadingService } from '@start9labs/shared' import { InputSpec } from '@start9labs/start-sdk/lib/config/configTypes' import { customSmtp } from '@start9labs/start-sdk/lib/config/configConstants' import { TuiDialogService } from '@taiga-ui/core' @@ -9,7 +9,6 @@ import { switchMap } from 'rxjs' import { ApiService } from 'src/app/services/api/embassy-api.service' import { DataModel } from 'src/app/services/patch-db/data-model' import { FormService } from 'src/app/services/form.service' -import { LoadingService } from 'src/app/common/loading/loading.service' import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' @Component({ diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.module.ts index 86e374b17..436a9ed06 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.module.ts @@ -2,8 +2,10 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { Routes, RouterModule } from '@angular/router' import { IonicModule } from '@ionic/angular' -import { ExperimentalFeaturesPage } from './experimental-features.page' import { EmverPipesModule } from '@start9labs/shared' +import { TuiCheckboxLabeledModule, TuiPromptModule } from '@taiga-ui/kit' +import { ExperimentalFeaturesPage } from './experimental-features.page' +import { FormsModule } from '@angular/forms' const routes: Routes = [ { @@ -16,8 +18,11 @@ const routes: Routes = [ imports: [ CommonModule, IonicModule, + TuiPromptModule, RouterModule.forChild(routes), EmverPipesModule, + TuiCheckboxLabeledModule, + FormsModule, ], declarations: [ExperimentalFeaturesPage], }) diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.html b/frontend/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.html index 69f82ff43..fefb783c7 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.html @@ -34,3 +34,18 @@

{{ server.zram ? 'Disable' : 'Enable' }} zram

+ + +

+ You are currently connected over Tor. If you reset the Tor daemon, you will + lose connectivity until it comes back online. +

+

Reset Tor?

+

+ Optionally wipe state to forcibly acquire new guard nodes. It is recommended + to try without wiping state first. +

+ + Wipe state + +
diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.ts index ae0025204..c45646993 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.ts @@ -1,14 +1,17 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' import { - AlertController, - LoadingController, - ToastController, -} from '@ionic/angular' + ChangeDetectionStrategy, + Component, + TemplateRef, + ViewChild, +} from '@angular/core' import { PatchDB } from 'patch-db-client' import { ApiService } from 'src/app/services/api/embassy-api.service' import { ConfigService } from 'src/app/services/config.service' import { DataModel } from 'src/app/services/patch-db/data-model' -import { ErrorToastService } from '@start9labs/shared' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { TuiAlertService, TuiDialogService } from '@taiga-ui/core' +import { TUI_PROMPT } from '@taiga-ui/kit' +import { filter } from 'rxjs' @Component({ selector: 'experimental-features', @@ -19,138 +22,84 @@ import { ErrorToastService } from '@start9labs/shared' export class ExperimentalFeaturesPage { readonly server$ = this.patch.watch$('server-info') + @ViewChild('tor') + template?: TemplateRef + + wipe = false + constructor( - private readonly toastCtrl: ToastController, + private readonly alerts: TuiAlertService, private readonly patch: PatchDB, private readonly config: ConfigService, - private readonly alertCtrl: AlertController, - private readonly loadingCtrl: LoadingController, + private readonly dialogs: TuiDialogService, + private readonly loader: LoadingService, private readonly api: ApiService, - private readonly errToast: ErrorToastService, + private readonly errorService: ErrorService, ) {} + get isTor(): boolean { + return this.config.isTor() + } + async presentAlertResetTor() { - const isTor = this.config.isTor() - const shared = - 'Optionally wipe state to forcibly acquire new guard nodes. It is recommended to try without wiping state first.' - const alert = await this.alertCtrl.create({ - header: isTor ? 'Warning' : 'Confirm', - message: isTor - ? `You are currently connected over Tor. If you reset the Tor daemon, you will loose connectivity until it comes back online.

${shared}` - : `Reset Tor?

${shared}`, - inputs: [ - { - label: 'Wipe state', - type: 'checkbox', - value: 'wipe', - handler: val => { - console.error(val) - }, - }, - ], - buttons: [ - { - text: 'Cancel', - role: 'cancel', - }, - { - text: 'Reset', - handler: (value: string[]) => { - console.error(value) - this.resetTor(value.some(v => 'wipe')) - }, - cssClass: 'enter-click', + this.wipe = false + this.dialogs + .open(TUI_PROMPT, { + label: this.isTor ? 'Warning' : 'Confirm', + data: { + content: this.template, + yes: 'Reset', + no: 'Cancel', }, - ], - cssClass: isTor ? 'alert-warning-message' : '', - }) - await alert.present() + }) + .pipe(filter(Boolean)) + .subscribe(() => this.resetTor(this.wipe)) } - async presentAlertZram(enabled: boolean) { - const alert = await this.alertCtrl.create({ - header: enabled ? 'Confirm' : 'Warning', - message: enabled - ? 'Are you sure you want to disable zram?' - : 'zram on StartOS is experimental. It may increase performance of you server, especially if it is a low RAM device.', - buttons: [ - { - text: 'Cancel', - role: 'cancel', - }, - { - text: enabled ? 'Disable' : 'Enable', - handler: () => { - this.toggleZram(enabled) - }, - cssClass: 'enter-click', + presentAlertZram(enabled: boolean) { + this.dialogs + .open(TUI_PROMPT, { + label: enabled ? 'Confirm' : 'Warning', + data: { + content: enabled + ? 'Are you sure you want to disable zram?' + : 'zram on StartOS is experimental. It may increase performance of you server, especially if it is a low RAM device.', + yes: enabled ? 'Disable' : 'Enable', + no: 'Cancel', }, - ], - cssClass: enabled ? '' : 'alert-warning-message', - }) - await alert.present() + }) + .pipe(filter(Boolean)) + .subscribe(() => this.toggleZram(enabled)) } private async resetTor(wipeState: boolean) { - const loader = await this.loadingCtrl.create({ - message: 'Resetting Tor...', - }) - await loader.present() + const loader = this.loader.open('Resetting Tor...').subscribe() try { await this.api.resetTor({ 'wipe-state': wipeState, reason: 'User triggered', }) - const toast = await this.toastCtrl.create({ - header: 'Tor reset in progress', - position: 'bottom', - duration: 4000, - buttons: [ - { - side: 'start', - icon: 'close', - handler: () => { - return true - }, - }, - ], - }) - await toast.present() + this.alerts.open('Tor reset in progress').subscribe() } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { - loader.dismiss() + loader.unsubscribe() } } private async toggleZram(enabled: boolean) { - const loader = await this.loadingCtrl.create({ - message: enabled ? 'Disabling zram...' : 'Enabling zram', - }) - await loader.present() + const loader = this.loader + .open(enabled ? 'Disabling zram...' : 'Enabling zram') + .subscribe() try { await this.api.toggleZram({ enable: !enabled }) - const toast = await this.toastCtrl.create({ - header: `Zram ${enabled ? 'disabled' : 'enabled'}`, - position: 'bottom', - duration: 4000, - buttons: [ - { - side: 'start', - icon: 'close', - handler: () => { - return true - }, - }, - ], - }) - await toast.present() + this.alerts.open(`Zram ${enabled ? 'disabled' : 'enabled'}`).subscribe() } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { - loader.dismiss() + loader.unsubscribe() } } } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/lan/lan.page.html b/frontend/projects/ui/src/app/apps/ui/pages/system/lan/lan.page.html deleted file mode 100644 index 5c11fea02..000000000 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/lan/lan.page.html +++ /dev/null @@ -1,43 +0,0 @@ - - - Secure LAN - - - - - - - - - - - -

- For a secure local connection, - - follow instructions - - to download and trust your server's Root Certificate Authority -

-
-
- - - - -

Download Certificate

-
-
-
- - - -
diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/lan/lan.page.scss b/frontend/projects/ui/src/app/apps/ui/pages/system/lan/lan.page.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/lan/lan.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/lan/lan.page.ts deleted file mode 100644 index b07b3f2f1..000000000 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/lan/lan.page.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' -import { PatchDB } from 'patch-db-client' -import { map } from 'rxjs' -import { DataModel } from 'src/app/services/patch-db/data-model' - -@Component({ - selector: 'lan', - templateUrl: './lan.page.html', - styleUrls: ['./lan.page.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class LANPage { - readonly crtName$ = this.patch - .watch$('server-info', 'lan-address') - .pipe(map(addr => `${new URL(addr).hostname}.crt`)) - - constructor(private readonly patch: PatchDB) {} - - installCert(): void { - document.getElementById('install-cert')?.click() - } -} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.module.ts new file mode 100644 index 000000000..5eb444af1 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' +import { Routes, RouterModule } from '@angular/router' +import { IonicModule } from '@ionic/angular' +import { OSAddressesPage, OsClearnetPipe } from './os-addresses.page' + +const routes: Routes = [ + { + path: '', + component: OSAddressesPage, + }, +] + +@NgModule({ + imports: [CommonModule, IonicModule, RouterModule.forChild(routes)], + declarations: [OSAddressesPage, OsClearnetPipe], +}) +export class OSAddressesPageModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.page.html b/frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.page.html new file mode 100644 index 000000000..1f24cbd57 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.page.html @@ -0,0 +1,228 @@ + + + + + + StartOS Web Interface + + + + +
+ + Clearnet + + + +

+ Clearnet provides a fast and convenient experience. It not not + provide anonymity, and the addresses can be discovered and accessed + by anyone. + + View instructions + +

+
+
+ + + +

Clearnet

+

{{ clearnetAddress }}

+
+ + Update + + + Remove + +
+
+
+ + + + + + +
+
+
+ +
+ + + Add Clearnet Address + +
+
+
+ + + Tor + + + +

+ Tor offers privacy and anonymity at the expense of speed and + reliability. A Tor-enabled browser is required to use a Tor address. + + View instructions + +

+
+
+ + +

Tor

+

{{ torHostname }}

+
+
+ + + + + + +
+
+
+ + + LAN + + + +

+ LAN offers a fast and private experience. These addresses can only + be accessed from a device connected to the same LAN as your server, + either directly or using a VPN. + + View instructions + +

+
+ + + Download Root CA + +
+
+
+ + +

Local

+

{{ lanHostname }}

+
+
+ + + + + + +
+
+ + + +

{{ iface.key }} (IPv4)

+

{{ ipv4 }}

+
+
+ + + + + + +
+
+ + +

{{ iface.key }} (IPv6)

+

{{ ipv6 }}

+
+
+ + + + + + +
+
+
+
+
+ + + +
diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.page.scss b/frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.page.scss new file mode 100644 index 000000000..fab7b4db2 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.page.scss @@ -0,0 +1,15 @@ +ion-item-divider { + text-transform: unset; + padding-bottom: 12px; + padding-left: 0; +} + +ion-item-group { + background-color: #1e2024; + border: 1px solid #717171; + border-radius: 6px; +} + +ion-item { + --background: #1e2024; +} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.page.ts new file mode 100644 index 000000000..36c5c16b3 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.page.ts @@ -0,0 +1,168 @@ +import { ChangeDetectionStrategy, Component, Inject } from '@angular/core' +import { LoadingService, CopyService, ErrorService } from '@start9labs/shared' +import { Config } from '@start9labs/start-sdk/lib/config/builder/config' +import { Value } from '@start9labs/start-sdk/lib/config/builder/value' +import { InputSpec } from '@start9labs/start-sdk/lib/config/configTypes' +import { TuiDialogOptions, TuiDialogService } from '@taiga-ui/core' +import { PatchDB } from 'patch-db-client' +import { filter, map } from 'rxjs' +import { + DomainInfo, + DataModel, + NetworkInfo, + ServerInfo, +} from 'src/app/services/patch-db/data-model' +import { FormDialogService } from 'src/app/services/form-dialog.service' +import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { FormContext, FormPage } from '../../../modals/form/form.page' +import { TUI_PROMPT } from '@taiga-ui/kit' +import { DOCUMENT } from '@angular/common' +import { Pipe, PipeTransform } from '@angular/core' +import { getClearnetAddress } from 'src/app/util/clearnetAddress' + +export type ClearnetForm = { + domain: string + subdomain: string | null +} + +@Component({ + selector: 'os-addresses', + templateUrl: './os-addresses.page.html', + styleUrls: ['./os-addresses.page.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class OSAddressesPage { + readonly server$ = this.patch.watch$('server-info') + + readonly crtName$ = this.server$.pipe( + map(server => `${server.ui.lanHostname}.crt`), + ) + + constructor( + readonly copyService: CopyService, + private readonly loader: LoadingService, + private readonly formDialog: FormDialogService, + private readonly patch: PatchDB, + private readonly errorService: ErrorService, + private readonly api: ApiService, + private readonly dialogs: TuiDialogService, + @Inject(DOCUMENT) private readonly document: Document, + ) {} + + launch(url: string): void { + this.document.defaultView?.open(url, '_blank', 'noreferrer') + } + + installCert(): void { + this.document.getElementById('install-cert')?.click() + } + + async presentModalAddClearnet(server: ServerInfo) { + const domainInfo = server.ui.domainInfo + const options: Partial>> = { + label: 'Select Domain/Subdomain', + data: { + value: { + domain: domainInfo?.domain || '', + subdomain: domainInfo?.subdomain || '', + }, + spec: await this.getClearnetSpec(server.network), + buttons: [ + { + text: 'Manage domains', + link: '/system/domains', + }, + { + text: 'Save', + handler: async value => this.saveClearnet(value), + }, + ], + }, + } + this.formDialog.open(FormPage, options) + } + + presentAlertRemoveClearnet() { + this.dialogs + .open(TUI_PROMPT, { + label: 'Confirm', + size: 's', + data: { + content: 'Remove clearnet address?', + yes: 'Remove', + no: 'Cancel', + }, + }) + .pipe(filter(Boolean)) + .subscribe(() => this.removeClearnet()) + } + + private async saveClearnet(domainInfo: ClearnetForm): Promise { + const loader = this.loader.open('Saving...').subscribe() + + try { + await this.api.setServerClearnetAddress({ domainInfo }) + return true + } catch (e: any) { + this.errorService.handleError(e) + return false + } finally { + loader.unsubscribe() + } + } + + private async removeClearnet(): Promise { + const loader = this.loader.open('Removing...').subscribe() + + try { + await this.api.setServerClearnetAddress({ domainInfo: null }) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } + + private async getClearnetSpec({ + domains, + start9MeSubdomain, + }: NetworkInfo): Promise { + const start9MeDomain = `${start9MeSubdomain?.value}.start9.me` + const base = start9MeSubdomain ? { [start9MeDomain]: start9MeDomain } : {} + + return configBuilderToSpec( + Config.of({ + domain: Value.dynamicSelect(() => { + return { + name: 'Domain', + required: { default: null }, + values: domains.reduce((prev, curr) => { + return { + [curr.value]: curr.value, + ...prev, + } + }, base), + } + }), + subdomain: Value.text({ + name: 'Subdomain', + required: false, + }), + }), + ) + } + + asIsOrder(a: any, b: any) { + return 0 + } +} + +@Pipe({ + name: 'osClearnetPipe', +}) +export class OsClearnetPipe implements PipeTransform { + transform(clearnet: DomainInfo): string { + return getClearnetAddress('https', clearnet) + } +} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.module.ts new file mode 100644 index 000000000..b81c53fc3 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.module.ts @@ -0,0 +1,26 @@ +import { NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' +import { Routes, RouterModule } from '@angular/router' +import { IonicModule } from '@ionic/angular' +import { PortForwardsPage } from './port-forwards.page' +import { PrimaryIpPipeModule } from 'src/app/common/primary-ip/primary-ip.module' +import { FormsModule } from '@angular/forms' + +const routes: Routes = [ + { + path: '', + component: PortForwardsPage, + }, +] + +@NgModule({ + imports: [ + CommonModule, + IonicModule, + RouterModule.forChild(routes), + PrimaryIpPipeModule, + FormsModule, + ], + declarations: [PortForwardsPage], +}) +export class PortForwardsPageModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.page.html b/frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.page.html new file mode 100644 index 000000000..a25127a9a --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.page.html @@ -0,0 +1,153 @@ + + + + + + Port Forwards + + + + +
+ + + + +

+ UPnP Disabled +

+

+ Below are a list of ports that must be + manually + forwarded in your router in order to enable clearnet access. +
+
+ Alternatively, you can enable UPnP in your router for automatic + configuration. + + View instructions + +

+
+ + +

+ UPnP Enabled! +

+

+ The ports below have been + automatically + forwarded in your router. +
+
+ If you are running multiple servers, you may want to override + specific ports to suite your needs. + + View instructions + +

+
+
+
+ + + + + Port + + + Target + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

{{ ip }}:{{ pf.target }}

+
+ + + +
+
+
+
+
+
+
diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.page.scss b/frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.page.scss new file mode 100644 index 000000000..50f21298d --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.page.scss @@ -0,0 +1,26 @@ +ion-item-divider { + padding-bottom: 8px; + padding-left: 0px; +} + +ion-item-group { + background-color: #1e2024; + border: 1px solid #717171; + border-radius: 6px; +} + +ion-item { + --inner-padding-end: 0; +} + +ion-buttons { + margin-left: 0; + margin-right: 8px; + ion-button::part(native) { + padding: 0 2px; + } +} + +.larger-icon { + font-size: 20px; +} \ No newline at end of file diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.page.ts new file mode 100644 index 000000000..fcb977bba --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.page.ts @@ -0,0 +1,46 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core' +import { PatchDB } from 'patch-db-client' +import { DataModel, PortForward } from 'src/app/services/patch-db/data-model' +import { LoadingService, CopyService, ErrorService } from '@start9labs/shared' +import { ApiService } from 'src/app/services/api/embassy-api.service' + +@Component({ + selector: 'port-forwards', + templateUrl: './port-forwards.page.html', + styleUrls: ['./port-forwards.page.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class PortForwardsPage { + readonly server$ = this.patch.watch$('server-info') + editing: Record = {} + overrides: Record = {} + + constructor( + readonly copyService: CopyService, + private readonly patch: PatchDB, + private readonly loader: LoadingService, + private readonly errorService: ErrorService, + private readonly api: ApiService, + ) {} + + async editPort(pf: PortForward) { + this.editing[pf.target] = !this.editing[pf.target] + this.overrides[pf.target] = pf.override || pf.assigned + } + + async saveOverride(pf: PortForward) { + const loader = this.loader.open('Saving...').subscribe() + + try { + await this.api.overridePortForward({ + target: pf.target, + port: this.overrides[pf.target], + }) + delete this.editing[pf.target] + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } +} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.html b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.html index 011a5cc51..e2eaebcfb 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.html @@ -1,43 +1,13 @@ - - -
- - StartOS {{ versions[0].version }} - -
- - Release Notes - -
- - - - - -
-
+

StartOS {{ versions[0].version }}

+

Release Notes

- -
- -

{{ v.version }}

-
-
-
-
-
+ + +

{{ v.version }}

+
+
+
- - - - - Begin Update - - - - + diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts index 2d3e0176a..426dc846d 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts @@ -1,12 +1,22 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' +import { MarkdownPipeModule, SafeLinksModule } from '@start9labs/shared' +import { TuiButtonModule, TuiScrollbarModule } from '@taiga-ui/core' +import { TuiAutoFocusModule } from '@taiga-ui/cdk' +import { NgDompurifyModule } from '@tinkoff/ng-dompurify' import { OSUpdatePage } from './os-update.page' -import { MarkdownPipeModule } from '@start9labs/shared' @NgModule({ declarations: [OSUpdatePage], - imports: [CommonModule, IonicModule, MarkdownPipeModule], + imports: [ + CommonModule, + MarkdownPipeModule, + TuiButtonModule, + TuiAutoFocusModule, + TuiScrollbarModule, + SafeLinksModule, + NgDompurifyModule, + ], exports: [OSUpdatePage], }) export class OSUpdatePageModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.scss b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.scss index 586a54126..d2f78caf7 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.scss +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.scss @@ -1,6 +1,24 @@ -.underline { - margin: 6px 0 8px 16px; - border-style: solid; - border-width: 0px 0px 1px 0px; - border-color: #404040; - } \ No newline at end of file +.title { + margin-top: 0; + font-weight: bold; +} + +.subtitle { + color: var(--tui-text-02); + font-weight: normal; +} + +.scrollbar { + margin: 24px 0; + max-height: 50vh; +} + +.version { + box-shadow: 0 1px var(--tui-base-02); + margin: 0 24px 0 0; + padding: 6px 0; +} + +.button { + float: right; +} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.ts index ffc544459..d87a3856e 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.ts @@ -1,6 +1,7 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' -import { LoadingController, ModalController } from '@ionic/angular' -import { ErrorToastService } from '@start9labs/shared' +import { ChangeDetectionStrategy, Component, Inject } from '@angular/core' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' +import { TuiDialogContext } from '@taiga-ui/core' import { ApiService } from 'src/app/services/api/embassy-api.service' import { EOSService } from 'src/app/services/eos.service' @@ -14,9 +15,9 @@ export class OSUpdatePage { versions: { version: string; notes: string }[] = [] constructor( - private readonly modalCtrl: ModalController, - private readonly loadingCtrl: LoadingController, - private readonly errToast: ErrorToastService, + @Inject(POLYMORPHEUS_CONTEXT) private readonly context: TuiDialogContext, + private readonly loader: LoadingService, + private readonly errorService: ErrorService, private readonly embassyApi: ApiService, private readonly eosService: EOSService, ) {} @@ -27,35 +28,22 @@ export class OSUpdatePage { this.versions = Object.keys(releaseNotes) .sort() .reverse() - .map(version => { - return { - version, - notes: releaseNotes[version], - } - }) - } - - dismiss() { - this.modalCtrl.dismiss() + .map(version => ({ + version, + notes: releaseNotes[version], + })) } async updateEOS() { - const loader = await this.loadingCtrl.create({ - message: 'Beginning update...', - }) - await loader.present() + const loader = this.loader.open('Beginning update...').subscribe() try { await this.embassyApi.updateServer() - this.dismiss() + this.context.$implicit.complete() } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { - loader.dismiss() + loader.unsubscribe() } } - - asIsOrder() { - return 0 - } } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.module.ts index f12152c8a..18799d6b5 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.module.ts @@ -8,7 +8,7 @@ import { TextSpinnerComponentModule } from '@start9labs/shared' import { BadgeMenuComponentModule } from 'src/app/common/badge-menu-button/badge-menu.component.module' import { InsecureWarningComponentModule } from 'src/app/common/insecure-warning/insecure-warning.module' import { OSUpdatePageModule } from './os-update/os-update.page.module' -import { GenericInputComponentModule } from 'src/app/apps/ui/modals/generic-input/generic-input.component.module' +import { PromptModule } from 'src/app/apps/ui/modals/prompt/prompt.module' import { ThemeSwitcherModule } from '../theme-switcher/theme-switcher.module' import { BackupColorPipe } from './backup-color.pipe' @@ -29,7 +29,7 @@ const routes: Routes = [ OSUpdatePageModule, ThemeSwitcherModule, InsecureWarningComponentModule, - GenericInputComponentModule, + PromptModule, RouterModule.forChild(routes), ], declarations: [ServerShowPage, BackupColorPipe], diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.html b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.html index cc0d96c74..9c9dc22fb 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.html @@ -7,14 +7,18 @@ - + - +
@@ -23,46 +27,48 @@ {{ cat.key }} - - - - -

{{ button.title }}

-

{{ button.description }}

+ + + + + +

{{ button.title }}

+

{{ button.description }}

- -

- - Update Complete. Restart to apply changes - - - - - - Update Available - - - - - - Check for updates - + +

+ + Update Complete. Restart to apply changes + + + + + + Update Available + + + + + + Check for updates + + - -

-
-
+

+
+
+
- +
diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.scss b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.scss index e69de29bb..84f709c07 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.scss +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.scss @@ -0,0 +1,15 @@ +ion-item-divider { + text-transform: unset; + padding-bottom: 12px; + padding-left: 0; +} + +ion-item-group { + background-color: #1e2024; + border: 1px solid #717171; + border-radius: 6px; +} + +ion-item { + --background: #1e2024; +} \ No newline at end of file diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.ts index 7dd200e63..d7915d551 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.ts @@ -1,28 +1,22 @@ import { DOCUMENT } from '@angular/common' import { Component, Inject } from '@angular/core' -import { - AlertController, - LoadingController, - NavController, - ModalController, - ToastController, -} from '@ionic/angular' +import { NavController } from '@ionic/angular' import { ApiService } from 'src/app/services/api/embassy-api.service' import { ActivatedRoute } from '@angular/router' import { PatchDB } from 'patch-db-client' -import { firstValueFrom, Observable, of } from 'rxjs' -import { ErrorToastService } from '@start9labs/shared' +import { filter, Observable, of, switchMap, take } from 'rxjs' +import { ErrorService, LoadingService } from '@start9labs/shared' import { EOSService } from 'src/app/services/eos.service' import { ClientStorageService } from 'src/app/services/client-storage.service' import { OSUpdatePage } from './os-update/os-update.page' import { getAllPackages } from 'src/app/util/get-package-data' import { AuthService } from 'src/app/services/auth.service' import { DataModel } from 'src/app/services/patch-db/data-model' -import { - GenericInputComponent, - GenericInputOptions, -} from 'src/app/apps/ui/modals/generic-input/generic-input.component' import { ConfigService } from 'src/app/services/config.service' +import { TuiAlertService, TuiDialogService } from '@taiga-ui/core' +import { PROMPT } from 'src/app/apps/ui/modals/prompt/prompt.component' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' +import { TUI_PROMPT } from '@taiga-ui/kit' @Component({ selector: 'server-show', @@ -35,31 +29,30 @@ export class ServerShowPage { readonly server$ = this.patch.watch$('server-info') readonly showUpdate$ = this.eosService.showUpdate$ - readonly showDiskRepair$ = this.ClientStorageService.showDiskRepair$ + readonly showDiskRepair$ = this.clientStorageService.showDiskRepair$ readonly secure = this.config.isSecure() constructor( - private readonly alertCtrl: AlertController, - private readonly modalCtrl: ModalController, - private readonly loadingCtrl: LoadingController, - private readonly errToast: ErrorToastService, + private readonly dialogs: TuiDialogService, + private readonly loader: LoadingService, + private readonly errorService: ErrorService, private readonly embassyApi: ApiService, private readonly navCtrl: NavController, private readonly route: ActivatedRoute, private readonly patch: PatchDB, private readonly eosService: EOSService, - private readonly ClientStorageService: ClientStorageService, + private readonly clientStorageService: ClientStorageService, private readonly authService: AuthService, - private readonly toastCtrl: ToastController, + private readonly alerts: TuiAlertService, private readonly config: ConfigService, @Inject(DOCUMENT) private readonly document: Document, ) {} addClick(title: string) { switch (title) { - case 'Manage': - this.addManageClick() + case 'Security': + this.addSecurityClick() break case 'Power': this.addPowerClick() @@ -70,164 +63,118 @@ export class ServerShowPage { } private async setBrowserTab(): Promise { - const chosenName = await firstValueFrom(this.patch.watch$('ui', 'name')) - - const options: GenericInputOptions = { - title: 'Browser Tab Title', - message: `This value will be displayed as the title of your browser tab.`, - label: 'Device Name', - useMask: false, - placeholder: 'StartOS', - required: false, - initialValue: chosenName, - buttonText: 'Save', - submitFn: (name: string) => this.setName(name || null), - } - - const modal = await this.modalCtrl.create({ - componentProps: { options }, - cssClass: 'alertlike-modal', - presentingElement: await this.modalCtrl.getTop(), - component: GenericInputComponent, - }) - - await modal.present() + this.patch + .watch$('ui', 'name') + .pipe( + switchMap(initialValue => + this.dialogs.open(PROMPT, { + label: 'Browser Tab Title', + data: { + message: `This value will be displayed as the title of your browser tab.`, + label: 'Device Name', + placeholder: 'StartOS', + required: false, + buttonText: 'Save', + initialValue, + }, + }), + ), + take(1), + ) + .subscribe(name => this.setName(name || null)) } - private async updateEos(): Promise { - const modal = await this.modalCtrl.create({ - component: OSUpdatePage, - }) - modal.present() + private updateEos() { + this.dialogs.open(new PolymorpheusComponent(OSUpdatePage)).subscribe() } - private async presentAlertLogout() { - const alert = await this.alertCtrl.create({ - header: 'Confirm', - message: 'Are you sure you want to log out?', - buttons: [ - { - text: 'Cancel', - role: 'cancel', - }, - { - text: 'Logout', - handler: () => this.logout(), - cssClass: 'enter-click', + private presentAlertLogout() { + this.dialogs + .open(TUI_PROMPT, { + label: 'Confirm', + size: 's', + data: { + content: 'Are you sure you want to log out?', + yes: 'Logout', + no: 'Cancel', }, - ], - }) - - await alert.present() + }) + .pipe(filter(Boolean)) + .subscribe(() => this.logout()) } - private async presentAlertRestart() { - const alert = await this.alertCtrl.create({ - header: 'Restart', - message: - 'Are you sure you want to restart your server? It can take several minutes to come back online.', - buttons: [ - { - text: 'Cancel', - role: 'cancel', - }, - { - text: 'Restart', - handler: () => { - this.restart() - }, - cssClass: 'enter-click', + private presentAlertRestart() { + this.dialogs + .open(TUI_PROMPT, { + label: 'Restart', + size: 's', + data: { + content: + 'Are you sure you want to restart your server? It can take several minutes to come back online.', + yes: 'Restart', + no: 'Cancel', }, - ], - }) - await alert.present() + }) + .pipe(filter(Boolean)) + .subscribe(() => this.restart()) } - private async presentAlertShutdown() { - const alert = await this.alertCtrl.create({ - header: 'Warning', - message: - 'Are you sure you want to power down your server? This can take several minutes, and your server will not come back online automatically. To power on again, you will need to physically unplug your server and plug it back in.', - buttons: [ - { - text: 'Cancel', - role: 'cancel', + private presentAlertShutdown() { + this.dialogs + .open(TUI_PROMPT, { + label: 'Warning', + size: 's', + data: { + content: + 'Are you sure you want to power down your server? This can take several minutes, and your server will not come back online automatically. To power on again, You will need to physically unplug your server and plug it back in', + yes: 'Shutdown', + no: 'Cancel', }, - { - text: 'Shutdown', - handler: () => { - this.shutdown() - }, - cssClass: 'enter-click', - }, - ], - cssClass: 'alert-warning-message', - }) - await alert.present() + }) + .pipe(filter(Boolean)) + .subscribe(() => this.shutdown()) } private async presentAlertSystemRebuild() { const localPkgs = await getAllPackages(this.patch) const minutes = Object.keys(localPkgs).length * 2 - const alert = await this.alertCtrl.create({ - header: 'Warning', - message: `This action will tear down all service containers and rebuild them from scratch. No data will be deleted. This action is useful if your system gets into a bad state, and it should only be performed if you are experiencing general performance or reliability issues. It may take up to ${minutes} minutes to complete. During this time, you will lose all connectivity to your server.`, - buttons: [ - { - text: 'Cancel', - role: 'cancel', - }, - { - text: 'Rebuild', - handler: () => { - this.systemRebuild() - }, - cssClass: 'enter-click', + + this.dialogs + .open(TUI_PROMPT, { + label: 'Warning', + size: 's', + data: { + content: `This action will tear down all service containers and rebuild them from scratch. No data will be deleted. This action is useful if your system gets into a bad state, and it should only be performed if you are experiencing general performance or reliability issues. It may take up to ${minutes} minutes to complete. During this time, you will lose all connectivity to your server.`, + yes: 'Rebuild', + no: 'Cancel', }, - ], - cssClass: 'alert-warning-message', - }) - await alert.present() + }) + .pipe(filter(Boolean)) + .subscribe(() => this.systemRebuild()) } - private async presentAlertRepairDisk() { - const alert = await this.alertCtrl.create({ - header: 'Warning', - message: `

This action should only be executed if directed by a Start9 support specialist. We recommend backing up your device before preforming this action.

If anything happens to the device during the reboot, such as losing power or unplugging the drive, the filesystem will be in an unrecoverable state. Please proceed with caution.

`, - buttons: [ - { - text: 'Cancel', - role: 'cancel', + private presentAlertRepairDisk() { + this.dialogs + .open(TUI_PROMPT, { + label: 'Warning', + size: 's', + data: { + content: `This action should only be executed if directed by a Start9 support specialist. We recommend backing up your device before preforming this action.

If anything happens to the device during the reboot, such as losing power or unplugging the drive, the filesystem will be in an unrecoverable state. Please proceed with caution.

`, + yes: 'Rebuild', + no: 'Cancel', }, - { - text: 'Repair', - handler: () => { - try { - this.embassyApi.repairDisk({}).then(_ => { - this.restart() - }) - } catch (e: any) { - this.errToast.present(e) - } - }, - cssClass: 'enter-click', - }, - ], - cssClass: 'alert-warning-message', - }) - await alert.present() + }) + .pipe(filter(Boolean)) + .subscribe(() => this.systemRebuild()) } private async setName(value: string | null): Promise { - const loader = await this.loadingCtrl.create({ - message: 'Saving...', - }) - await loader.present() + const loader = this.loader.open('Saving...').subscribe() try { await this.embassyApi.setDbValue(['name'], value) } finally { - loader.dismiss() + loader.unsubscribe() } } @@ -239,29 +186,21 @@ export class ServerShowPage { private async restart() { const action = 'Restart' - - const loader = await this.loadingCtrl.create({ - message: `Beginning ${action}...`, - }) - await loader.present() + const loader = this.loader.open(`Beginning ${action}...`).subscribe() try { await this.embassyApi.restartServer({}) this.presentAlertInProgress(action, ` until ${action} completes.`) } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { - loader.dismiss() + loader.unsubscribe() } } private async shutdown() { const action = 'Shutdown' - - const loader = await this.loadingCtrl.create({ - message: `Beginning ${action}...`, - }) - await loader.present() + const loader = this.loader.open(`Beginning ${action}...`).subscribe() try { await this.embassyApi.shutdownServer({}) @@ -270,40 +209,33 @@ export class ServerShowPage { '.

You will need to physically power cycle the device to regain connectivity.', ) } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { - loader.dismiss() + loader.unsubscribe() } } private async systemRebuild() { const action = 'System Rebuild' - - const loader = await this.loadingCtrl.create({ - message: `Beginning ${action}...`, - }) - await loader.present() + const loader = this.loader.open(`Beginning ${action}...`).subscribe() try { await this.embassyApi.systemRebuild({}) this.presentAlertInProgress(action, ` until ${action} completes.`) } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { - loader.dismiss() + loader.unsubscribe() } } private async checkForEosUpdate(): Promise { - const loader = await this.loadingCtrl.create({ - message: 'Checking for updates', - }) - await loader.present() + const loader = this.loader.open('Checking for updates').subscribe() try { await this.eosService.loadEos() - await loader.dismiss() + loader.unsubscribe() if (this.eosService.updateAvailable$.value) { this.updateEos() @@ -311,44 +243,43 @@ export class ServerShowPage { this.presentAlertLatest() } } catch (e: any) { - await loader.dismiss() - this.errToast.present(e) + loader.unsubscribe() + this.errorService.handleError(e) } } - private async presentAlertLatest() { - const alert = await this.alertCtrl.create({ - header: 'Up to date!', - message: 'You are on the latest version of StartOS.', - buttons: [ - { - text: 'OK', - role: 'cancel', - cssClass: 'enter-click', - }, - ], - cssClass: 'alert-success-message', - }) - alert.present() + private presentAlertLatest() { + this.dialogs + .open('You are on the latest version of StartOS.', { + label: 'Up to date!', + size: 's', + }) + .subscribe() } - private async presentAlertInProgress(verb: string, message: string) { - const alert = await this.alertCtrl.create({ - header: `${verb} In Progress...`, - message: `Stopping all services gracefully. This can take a while.

If you have a speaker, your server will ♫ play a melody ♫ before shutting down. Your server will then become unreachable${message}`, - buttons: [ + private presentAlertInProgress(verb: string, message: string) { + this.dialogs + .open( + `Stopping all services gracefully. This can take a while.

If you have a speaker, your server will ♫ play a melody ♫ before shutting down. Your server will then become unreachable${message}`, { - text: 'OK', - role: 'cancel', - cssClass: 'enter-click', + label: `${verb} In Progress...`, + size: 's', }, - ], - }) - alert.present() + ) + .subscribe() } settings: ServerSettings = { - Manage: [ + General: [ + { + title: 'About', + description: 'Basic information about your server', + icon: 'information-circle-outline', + action: () => + this.navCtrl.navigateForward(['specs'], { relativeTo: this.route }), + detail: true, + disabled$: of(false), + }, { title: 'Software Update', description: 'Get the latest version of StartOS', @@ -369,88 +300,97 @@ export class ServerShowPage { disabled$: of(false), }, { - title: 'LAN', - description: `Download and trust your server's certificate for a secure local connection`, - icon: 'home-outline', + title: 'Email', + description: + 'Connect to an external SMTP server to send yourself emails', + icon: 'mail-outline', action: () => - this.navCtrl.navigateForward(['lan'], { relativeTo: this.route }), + this.navCtrl.navigateForward(['email'], { relativeTo: this.route }), detail: true, disabled$: of(false), }, { - title: 'SSH', - description: - 'Manage your SSH keys to access your server from the command line', - icon: 'terminal-outline', + title: 'Sideload a Service', + description: `Manually install a service`, + icon: 'push-outline', action: () => - this.navCtrl.navigateForward(['ssh'], { relativeTo: this.route }), + this.navCtrl.navigateForward(['sideload'], { + relativeTo: this.route, + }), detail: true, disabled$: of(false), }, { - title: 'Email', - description: 'Provide an external SMTP server for sending emails', - icon: 'mail-outline', + title: 'Experimental Features', + description: 'Try out new and potentially unstable new features', + icon: 'flask-outline', action: () => - this.navCtrl.navigateForward(['email'], { relativeTo: this.route }), + this.navCtrl.navigateForward(['experimental-features'], { + relativeTo: this.route, + }), detail: true, disabled$: of(false), }, + ], + Network: [ { - title: 'WiFi', - description: 'Add or remove WiFi networks', - icon: 'wifi', + title: 'StartOS Web Interface', + description: 'Addresses for accessing this StartOS web interface', + icon: 'desktop-outline', action: () => - this.navCtrl.navigateForward(['wifi'], { relativeTo: this.route }), + this.navCtrl.navigateForward(['addresses'], { + relativeTo: this.route, + }), detail: true, disabled$: of(false), }, { - title: 'Sideload a Service', - description: `Manually install a service`, - icon: 'push-outline', + title: 'Domains', + description: + 'Add domains to your server to enable clearnet connections', + icon: 'globe-outline', action: () => - this.navCtrl.navigateForward(['sideload'], { - relativeTo: this.route, - }), + this.navCtrl.navigateForward(['domains'], { relativeTo: this.route }), detail: true, disabled$: of(false), }, { - title: 'Experimental Features', - description: 'Try out new and potentially unstable new features', - icon: 'flask-outline', + title: 'Port Forwards', + description: + 'A list of ports that should be forwarded through your router', + icon: 'trail-sign-outline', action: () => - this.navCtrl.navigateForward(['experimental-features'], { + this.navCtrl.navigateForward(['port-forwards'], { relativeTo: this.route, }), detail: true, disabled$: of(false), }, - ], - Insights: [ { - title: 'About', - description: 'Basic information about your server', - icon: 'information-circle-outline', + title: 'WiFi', + description: 'Add or remove WiFi networks', + icon: 'wifi', action: () => - this.navCtrl.navigateForward(['specs'], { relativeTo: this.route }), + this.navCtrl.navigateForward(['wifi'], { relativeTo: this.route }), detail: true, disabled$: of(false), }, + ], + Security: [ { - title: 'Monitor', - description: 'CPU, disk, memory, and other useful metrics', - icon: 'pulse', + title: 'SSH', + description: + 'Manage your SSH keys to access your server from the command line', + icon: 'terminal-outline', action: () => - this.navCtrl.navigateForward(['metrics'], { relativeTo: this.route }), + this.navCtrl.navigateForward(['ssh'], { relativeTo: this.route }), detail: true, disabled$: of(false), }, { title: 'Active Sessions', description: 'View and manage device access', - icon: 'desktop-outline', + icon: 'stopwatch-outline', action: () => this.navCtrl.navigateForward(['sessions'], { relativeTo: this.route, @@ -458,6 +398,17 @@ export class ServerShowPage { detail: true, disabled$: of(false), }, + ], + Logs: [ + { + title: 'System Resources', + description: 'CPU, disk, memory, and other useful metrics', + icon: 'pulse', + action: () => + this.navCtrl.navigateForward(['metrics'], { relativeTo: this.route }), + detail: true, + disabled$: of(false), + }, { title: 'OS Logs', description: 'Raw, unfiltered operating system logs', @@ -510,11 +461,7 @@ export class ServerShowPage { description: 'Get help from the Start9 team and community', icon: 'chatbubbles-outline', action: () => - window.open( - 'https://start9.com/contact', - '_blank', - 'noreferrer', - ), + window.open('https://start9.com/contact', '_blank', 'noreferrer'), detail: true, disabled$: of(false), }, @@ -576,18 +523,18 @@ export class ServerShowPage { ], } - private async addManageClick() { + private addSecurityClick() { this.manageClicks++ + if (this.manageClicks === 5) { this.manageClicks = 0 - const newVal = this.ClientStorageService.toggleShowDevTools() - const toast = await this.toastCtrl.create({ - header: newVal ? 'Dev tools unlocked' : 'Dev tools hidden', - position: 'bottom', - duration: 1000, - }) - - await toast.present() + this.alerts + .open( + this.clientStorageService.toggleShowDevTools() + ? 'Dev tools unlocked' + : 'Dev tools hidden', + ) + .subscribe() } } @@ -595,7 +542,7 @@ export class ServerShowPage { this.powerClicks++ if (this.powerClicks === 5) { this.powerClicks = 0 - this.ClientStorageService.toggleShowDiskRepair() + this.clientStorageService.toggleShowDiskRepair() } } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.html b/frontend/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.html index 2cebf019e..0c3b24f92 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.html @@ -21,68 +21,18 @@

Version

Git Hash

{{ gitHash }}

- + - Web Addresses - - -

Tor

-

{{ torAddress }}

-
-
- - - - - - -
-
- - -

LAN

-

{{ lanAddress }}

-
-
- - - - - - -
-
- - - -

{{ iface.key }} (IPv4)

-

{{ ipv4 || 'n/a' }}

-
- - - -
- - -

{{ iface.key }} (IPv6)

-

{{ ipv6 || 'n/a' }}

-
- - - -
-
- Device Credentials @@ -94,7 +44,7 @@

CA fingerprint

diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.ts index d4efca83d..7e09f38f8 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.ts @@ -1,8 +1,7 @@ import { ChangeDetectionStrategy, Component } from '@angular/core' -import { ToastController } from '@ionic/angular' import { PatchDB } from 'patch-db-client' import { ConfigService } from 'src/app/services/config.service' -import { copyToClipboard } from '@start9labs/shared' +import { CopyService } from '@start9labs/shared' import { DataModel } from 'src/app/services/patch-db/data-model' @Component({ @@ -15,7 +14,7 @@ export class ServerSpecsPage { readonly server$ = this.patch.watch$('server-info') constructor( - private readonly toastCtrl: ToastController, + readonly copyService: CopyService, private readonly patch: PatchDB, private readonly config: ConfigService, ) {} @@ -28,22 +27,6 @@ export class ServerSpecsPage { window.open(url, '_blank', 'noreferrer') } - async copy(address: string) { - let message = '' - await copyToClipboard(address || '').then(success => { - message = success - ? 'Copied to clipboard!' - : 'Failed to copy to clipboard.' - }) - - const toast = await this.toastCtrl.create({ - header: message, - position: 'bottom', - duration: 1000, - }) - await toast.present() - } - asIsOrder(a: any, b: any) { return 0 } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.module.ts index be0905775..444321c36 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.module.ts @@ -4,6 +4,7 @@ import { IonicModule } from '@ionic/angular' import { RouterModule, Routes } from '@angular/router' import { PlatformInfoPipe, SessionsPage } from './sessions.page' import { SharedPipesModule } from '@start9labs/shared' +import { TuiLetModule } from '@taiga-ui/cdk' const routes: Routes = [ { @@ -18,6 +19,7 @@ const routes: Routes = [ IonicModule, RouterModule.forChild(routes), SharedPipesModule, + TuiLetModule, ], declarations: [SessionsPage, PlatformInfoPipe], }) diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.html b/frontend/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.html index 631d9aaee..d8579c6fa 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.html @@ -18,16 +18,10 @@ Platform Last Active - - - - - - - - - + + + + + + + + +
- - Other Sessions - - Terminate Selected - - + + + Other Sessions + + Terminate Selected + + -
- - - -
- -
- User Agent -
- Platform - Last Active -
- - - - - - - - - - - +
+ + -
+
- {{ session['user-agent'] }} - - - - -   {{ info.name }} - - - - {{ session['last-active']| date: 'medium' }} + User Agent + Platform + Last Active -

- You are not logged in anywhere else -

- - -
+ + + + +
+ +
+ {{ session['user-agent'] }} +
+ + + +   {{ info.name }} + + + + {{ session['last-active']| date: 'medium' }} + +
+

+ You are not logged in anywhere else +

+
+ + + + + + + + +
+
+ diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.ts index 6a4a565a5..607d4ce29 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.ts @@ -1,10 +1,9 @@ import { Component } from '@angular/core' import { Pipe, PipeTransform } from '@angular/core' -import { LoadingController } from '@ionic/angular' -import { ErrorToastService } from '@start9labs/shared' +import { ErrorService, LoadingService } from '@start9labs/shared' import { ApiService } from 'src/app/services/api/embassy-api.service' import { PlatformType, Session } from 'src/app/services/api/api.types' -import { BehaviorSubject } from 'rxjs' +import { Observable, Subject, from, map, merge, shareReplay } from 'rxjs' @Component({ selector: 'sessions', @@ -12,14 +11,37 @@ import { BehaviorSubject } from 'rxjs' styleUrls: ['sessions.page.scss'], }) export class SessionsPage { - currentSession?: Session - otherSessions: SessionWithId[] = [] + private readonly sessions$ = from(this.api.getSessions({})) + private readonly localOther$ = new Subject() + private readonly remoteOther$: Observable = + this.sessions$.pipe( + map(s => + Object.entries(s.sessions) + .filter(([id, _]) => id !== s.current) + .map(([id, session]) => ({ + id, + ...session, + })) + .sort( + (a, b) => + new Date(b['last-active']).valueOf() - + new Date(a['last-active']).valueOf(), + ), + ), + ) + + readonly currentSession$ = this.sessions$.pipe( + map(s => s.sessions[s.current]), + shareReplay(), + ) + + readonly otherSessions$ = merge(this.localOther$, this.remoteOther$) + selected: Record = {} - loading$ = new BehaviorSubject(true) constructor( - private readonly loadingCtrl: LoadingController, - private readonly errToast: ErrorToastService, + private readonly loader: LoadingService, + private readonly errorService: ErrorService, private readonly api: ApiService, ) {} @@ -31,31 +53,6 @@ export class SessionsPage { return Object.keys(this.selected).length } - async ngOnInit() { - try { - const sessionInfo = await this.api.getSessions({}) - this.currentSession = sessionInfo.sessions[sessionInfo.current] - delete sessionInfo.sessions[sessionInfo.current] - this.otherSessions = Object.entries(sessionInfo.sessions) - .map(([id, session]) => { - return { - id, - ...session, - } - }) - .sort((a, b) => { - return ( - new Date(b['last-active']).valueOf() - - new Date(a['last-active']).valueOf() - ) - }) - } catch (e: any) { - this.errToast.present(e) - } finally { - this.loading$.next(false) - } - } - async toggleChecked(id: string) { if (this.selected[id]) { delete this.selected[id] @@ -64,30 +61,29 @@ export class SessionsPage { } } - async toggleAll() { + async toggleAll(otherSessions: SessionWithId[]) { if (this.empty) { - this.otherSessions.forEach(s => (this.selected[s.id] = true)) + otherSessions.forEach(s => (this.selected[s.id] = true)) } else { this.selected = {} } } - async kill(): Promise { + async kill(otherSessions: SessionWithId[]): Promise { const ids = Object.keys(this.selected) - const loader = await this.loadingCtrl.create({ - message: `Terminating session${ids.length > 1 ? 's' : ''}...`, - }) - await loader.present() + const loader = this.loader + .open(`Terminating session${ids.length > 1 ? 's' : ''}...`) + .subscribe() try { await this.api.killSessions({ ids }) this.selected = {} - this.otherSessions = this.otherSessions.filter(s => !ids.includes(s.id)) + this.localOther$.next(otherSessions.filter(s => !ids.includes(s.id))) } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { - loader.dismiss() + loader.unsubscribe() } } } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.ts index 4674b7bb2..f60b62ca9 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.ts @@ -1,9 +1,9 @@ import { Component } from '@angular/core' -import { isPlatform, LoadingController, NavController } from '@ionic/angular' +import { isPlatform, NavController } from '@ionic/angular' import { ApiService } from 'src/app/services/api/embassy-api.service' import { Manifest, MarketplacePkg } from '@start9labs/marketplace' import { ConfigService } from 'src/app/services/config.service' -import { ErrorToastService } from '@start9labs/shared' +import { ErrorService, LoadingService } from '@start9labs/shared' import cbor from 'cbor' interface Positions { @@ -28,10 +28,10 @@ export class SideloadPage { invalid = false constructor( - private readonly loadingCtrl: LoadingController, + private readonly loader: LoadingService, private readonly api: ApiService, private readonly navCtrl: NavController, - private readonly errToast: ErrorToastService, + private readonly errorService: ErrorService, private readonly config: ConfigService, ) {} @@ -52,12 +52,7 @@ export class SideloadPage { async handleUpload() { if (!this.pkgData) return - const loader = await this.loadingCtrl.create({ - message: 'Uploading package', - cssClass: 'loader', - }) - await loader.present() - + const loader = this.loader.open('Uploading package').subscribe() const { pkg, file } = this.pkgData try { @@ -66,13 +61,13 @@ export class SideloadPage { icon: pkg.icon, size: file.size, }) - this.api.uploadPackage(guid, file).catch(e => console.error(e)) + this.api.uploadPackage(guid, file!).catch(e => console.error(e)) this.navCtrl.navigateRoot('/services') } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { - loader.dismiss() + loader.unsubscribe() this.clear() } } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.module.ts index 6192f8f11..84114149a 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.module.ts @@ -3,8 +3,9 @@ import { CommonModule } from '@angular/common' import { IonicModule } from '@ionic/angular' import { RouterModule, Routes } from '@angular/router' import { SharedPipesModule } from '@start9labs/shared' -import { GenericInputComponentModule } from 'src/app/apps/ui/modals/generic-input/generic-input.component.module' +import { PromptModule } from 'src/app/apps/ui/modals/prompt/prompt.module' import { SSHKeysPage } from './ssh-keys.page' +import { TuiNotificationModule } from '@taiga-ui/core' const routes: Routes = [ { @@ -18,7 +19,8 @@ const routes: Routes = [ CommonModule, IonicModule, SharedPipesModule, - GenericInputComponentModule, + PromptModule, + TuiNotificationModule, RouterModule.forChild(routes), ], declarations: [SSHKeysPage], diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.html b/frontend/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.html index ce2c35b62..ff61301a0 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.html @@ -8,20 +8,15 @@ - - - - -

- Adding SSH keys to StartOS is useful for command line access, as well - as for debugging purposes. - - View instructions - -

-
-
+
+ + Adding domains to StartOS enables you to access your server and service + interfaces over clearnet. + View instructions + +
+ Saved Keys (click)="presentModalAdd()" > - Add New Key + Add Key diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.ts index 794e5dd47..68383b86b 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.ts @@ -1,17 +1,11 @@ import { Component } from '@angular/core' -import { - AlertController, - LoadingController, - ModalController, -} from '@ionic/angular' -import { ErrorToastService } from '@start9labs/shared' -import { BehaviorSubject } from 'rxjs' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { TuiDialogService } from '@taiga-ui/core' +import { BehaviorSubject, filter, take } from 'rxjs' import { SSHKey } from 'src/app/services/api/api.types' import { ApiService } from 'src/app/services/api/embassy-api.service' -import { - GenericInputComponent, - GenericInputOptions, -} from 'src/app/apps/ui/modals/generic-input/generic-input.component' +import { PROMPT } from 'src/app/apps/ui/modals/prompt/prompt.component' +import { TUI_PROMPT } from '@taiga-ui/kit' @Component({ selector: 'ssh-keys', @@ -24,10 +18,9 @@ export class SSHKeysPage { loading$ = new BehaviorSubject(true) constructor( - private readonly loadingCtrl: LoadingController, - private readonly modalCtrl: ModalController, - private readonly errToast: ErrorToastService, - private readonly alertCtrl: AlertController, + private readonly loader: LoadingService, + private readonly dialogs: TuiDialogService, + private readonly errorService: ErrorService, private readonly embassyApi: ApiService, ) {} @@ -39,77 +32,61 @@ export class SSHKeysPage { try { this.sshKeys = await this.embassyApi.getSshKeys({}) } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { this.loading$.next(false) } } async presentModalAdd() { - const options: GenericInputOptions = { - title: 'SSH Key', - message: - 'Enter the SSH public key you would like to authorize for root access to your Embassy.', - label: '', - submitFn: (pk: string) => this.add(pk), - } + this.dialogs + .open(PROMPT, { + label: 'SSH Key', + data: { + message: + 'Enter the SSH public key you would like to authorize for root access to your Embassy.', + }, + }) + .pipe(take(1)) + .subscribe(pk => this.add(pk)) + } - const modal = await this.modalCtrl.create({ - component: GenericInputComponent, - componentProps: { options }, - cssClass: 'alertlike-modal', - }) - await modal.present() + presentAlertDelete(key: SSHKey, i: number) { + this.dialogs + .open(TUI_PROMPT, { + label: 'Confirm', + size: 's', + data: { + content: 'Delete key? This action cannot be undone.', + yes: 'Delete', + no: 'Cancel', + }, + }) + .pipe(filter(Boolean)) + .subscribe(() => this.delete(key, i)) } - async add(pubkey: string): Promise { - const loader = await this.loadingCtrl.create({ - message: 'Saving...', - }) - await loader.present() + private async add(pubkey: string): Promise { + const loader = this.loader.open('Saving...').subscribe() try { const key = await this.embassyApi.addSshKey({ key: pubkey }) this.sshKeys.push(key) } finally { - loader.dismiss() + loader.unsubscribe() } } - async presentAlertDelete(key: SSHKey, i: number) { - const alert = await this.alertCtrl.create({ - header: 'Confirm', - message: 'Delete key? This action cannot be undone.', - buttons: [ - { - text: 'Cancel', - role: 'cancel', - }, - { - text: 'Delete', - handler: () => { - this.delete(key, i) - }, - cssClass: 'enter-click', - }, - ], - }) - await alert.present() - } - - async delete(key: SSHKey, i: number): Promise { - const loader = await this.loadingCtrl.create({ - message: 'Deleting...', - }) - await loader.present() + private async delete(key: SSHKey, i: number): Promise { + const loader = this.loader.open('Deleting...').subscribe() try { await this.embassyApi.deleteSshKey({ fingerprint: key.fingerprint }) this.sshKeys.splice(i, 1) } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { - loader.dismiss() + loader.unsubscribe() } } } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/system.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/system.module.ts index ff4093f02..77bb24b69 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/system.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/system.module.ts @@ -10,8 +10,18 @@ const routes: Routes = [ ), }, { - path: 'lan', - loadChildren: () => import('./lan/lan.module').then(m => m.LANPageModule), + path: 'addresses', + loadChildren: () => + import('./os-addresses/os-addresses.module').then( + m => m.OSAddressesPageModule, + ), + }, + { + path: 'port-forwards', + loadChildren: () => + import('./port-forwards/port-forwards.module').then( + m => m.PortForwardsPageModule, + ), }, { path: 'logs', @@ -56,6 +66,11 @@ const routes: Routes = [ m => m.ServerSpecsPageModule, ), }, + { + path: 'domains', + loadChildren: () => + import('./domains/domains.module').then(m => m.DomainsPageModule), + }, { path: 'ssh', loadChildren: () => diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.ts index 71f1e285d..842853177 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.ts @@ -1,17 +1,18 @@ -import { Component } from '@angular/core' -import { ToastController } from '@ionic/angular' -import { TuiDialogOptions } from '@taiga-ui/core' +import { Component, Pipe, PipeTransform } from '@angular/core' +import { + TuiAlertService, + TuiDialogOptions, + TuiNotification, +} from '@taiga-ui/core' import { ToggleCustomEvent } from '@ionic/core' import { ApiService } from 'src/app/services/api/embassy-api.service' import { AvailableWifi, RR } from 'src/app/services/api/api.types' -import { pauseFor, ErrorToastService } from '@start9labs/shared' +import { ErrorService, LoadingService, pauseFor } from '@start9labs/shared' import { FormDialogService } from 'src/app/services/form-dialog.service' import { FormContext, FormPage } from 'src/app/apps/ui/modals/form/form.page' -import { LoadingService } from 'src/app/common/loading/loading.service' import { PatchDB } from 'patch-db-client' import { DataModel } from 'src/app/services/patch-db/data-model' import { ConnectionService } from 'src/app/services/connection.service' -import { Pipe, PipeTransform } from '@angular/core' import { BehaviorSubject, catchError, @@ -38,12 +39,14 @@ interface WiFiForm { }) export class WifiPage { readonly connected$ = this.connectionService.connected$.pipe(filter(Boolean)) - readonly enabled$ = this.patch.watch$('server-info', 'wifi-enabled').pipe( - distinctUntilChanged(), - tap(enabled => { - if (enabled) this.trigger$.next('') - }), - ) + readonly enabled$ = this.patch + .watch$('server-info', 'network', 'wifi', 'enabled') + .pipe( + distinctUntilChanged(), + tap(enabled => { + if (enabled) this.trigger$.next('') + }), + ) readonly trigger$ = new BehaviorSubject('') readonly localChanges$ = new Subject() readonly wifi$ = merge( @@ -53,10 +56,10 @@ export class WifiPage { constructor( private readonly api: ApiService, - private readonly toastCtrl: ToastController, + private readonly alerts: TuiAlertService, private readonly loader: LoadingService, private readonly formDialog: FormDialogService, - private readonly errToast: ErrorToastService, + private readonly errorService: ErrorService, private readonly patch: PatchDB, private readonly connectionService: ConnectionService, ) {} @@ -70,7 +73,7 @@ export class WifiPage { try { await this.api.enableWifi({ enable }) } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { loader.unsubscribe() } @@ -85,7 +88,7 @@ export class WifiPage { await this.api.connectWifi({ ssid }) await this.confirmWifi(ssid) } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { loader.unsubscribe() } @@ -100,7 +103,7 @@ export class WifiPage { this.localChanges$.next(wifi) this.trigger$.next('') } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) } finally { loader.unsubscribe() } @@ -152,51 +155,27 @@ export class WifiPage { private getWifi$(): Observable { return from(this.api.getWifi({}, 10000)).pipe( catchError((e: any) => { - this.errToast.present(e) + this.errorService.handleError(e) return [] }), ) } - private async presentToastSuccess(): Promise { - const toast = await this.toastCtrl.create({ - header: 'Connection successful!', - position: 'bottom', - duration: 4000, - buttons: [ - { - side: 'start', - icon: 'close', - handler: () => { - return true - }, - }, - ], - cssClass: 'success-toast', - }) - - await toast.present() + private presentToastSuccess() { + this.alerts + .open('Connection successful!', { + status: TuiNotification.Success, + }) + .subscribe() } private async presentToastFail(): Promise { - const toast = await this.toastCtrl.create({ - header: 'Failed to connect:', - message: `Check credentials and try again`, - position: 'bottom', - duration: 4000, - buttons: [ - { - side: 'start', - icon: 'close', - handler: () => { - return true - }, - }, - ], - cssClass: 'warning-toast', - }) - - await toast.present() + this.alerts + .open('Check credentials and try again', { + label: 'Failed to connect', + status: TuiNotification.Warning, + }) + .subscribe() } private async save( @@ -218,7 +197,7 @@ export class WifiPage { this.trigger$.next('') return true } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) return false } finally { loader.unsubscribe() @@ -243,7 +222,7 @@ export class WifiPage { await this.confirmWifi(ssid) return true } catch (e: any) { - this.errToast.present(e) + this.errorService.handleError(e) return false } finally { loader.unsubscribe() diff --git a/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts index 8fc07fd36..d557ae7bb 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts @@ -2,16 +2,20 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { IonicModule } from '@ionic/angular' import { RouterModule, Routes } from '@angular/router' -import { MimeTypePipeModule } from '@start9labs/marketplace' +import { + MimeTypePipeModule, + StoreIconComponentModule, +} from '@start9labs/marketplace' import { EmverPipesModule, MarkdownPipeModule, + SafeLinksModule, SharedPipesModule, } from '@start9labs/shared' +import { NgDompurifyModule } from '@tinkoff/ng-dompurify' import { RoundProgressModule } from 'angular-svg-round-progressbar' import { BadgeMenuComponentModule } from 'src/app/common/badge-menu-button/badge-menu.component.module' import { SkeletonListComponentModule } from 'src/app/common/skeleton-list/skeleton-list.component.module' -import { StoreIconComponentModule } from 'src/app/common/store-icon/store-icon.component.module' import { UpdatesPage } from './updates.page' import { InstallProgressPipe } from './install-progress.pipe' import { FilterUpdatesPipe } from './filter-updates.pipe' @@ -37,6 +41,8 @@ const routes: Routes = [ StoreIconComponentModule, EmverPipesModule, MimeTypePipeModule, + SafeLinksModule, + NgDompurifyModule, ], }) export class UpdatesPageModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.page.html b/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.page.html index a4c4cc8f0..e0daac362 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.page.html @@ -11,7 +11,11 @@
- +   {{ host.name }} @@ -87,7 +91,8 @@

What's new

, private readonly navCtrl: NavController, - private readonly loadingCtrl: LoadingController, - private readonly alertCtrl: AlertController, + private readonly loader: LoadingService, + private readonly dialogs: TuiDialogService, + readonly config: ConfigService, ) {} viewInMarketplace(event: Event, url: string, id: string) { @@ -82,11 +82,9 @@ export class UpdatesPage { } private async dryUpdate(manifest: Manifest, url: string) { - const loader = await this.loadingCtrl.create({ - message: 'Checking dependent services...', - }) - await loader.present() - + const loader = this.loader + .open('Checking dependent services...') + .subscribe() const { id, version } = manifest try { @@ -94,7 +92,7 @@ export class UpdatesPage { id, version: `${version}`, }) - await loader.dismiss() + loader.unsubscribe() if (isEmptyObject(breakages)) { this.update(id, version, url) @@ -112,6 +110,7 @@ export class UpdatesPage { } catch (e: any) { delete this.marketplaceService.updateQueue[id] this.marketplaceService.updateErrors[id] = e.message + loader.unsubscribe() } } @@ -119,38 +118,26 @@ export class UpdatesPage { title: string, breakages: Breakages, ): Promise { - let message: string = `As a result of updating ${title}, the following services will no longer work properly and may crash:
    ` + let content: string = `As a result of updating ${title}, the following services will no longer work properly and may crash:
      ` const localPkgs = await getAllPackages(this.patch) const bullets = Object.keys(breakages).map(id => { const title = localPkgs[id].manifest.title return `
    • ${title}
    • ` }) - message = `${message}${bullets.join('')}
    ` + content = `${content}${bullets.join('')}
` return new Promise(async resolve => { - const alert = await this.alertCtrl.create({ - header: 'Warning', - message, - buttons: [ - { - text: 'Cancel', - role: 'cancel', - handler: () => { - resolve(false) - }, - }, - { - text: 'Continue', - handler: () => { - resolve(true) - }, - cssClass: 'enter-click', + this.dialogs + .open(TUI_PROMPT, { + label: 'Warning', + size: 's', + data: { + content, + yes: 'Continue', + no: 'Cancel', }, - ], - cssClass: 'alert-warning-message', - }) - - await alert.present() + }) + .subscribe(response => resolve(response)) }) } diff --git a/frontend/projects/ui/src/app/common/form/form-select/form-select.component.ts b/frontend/projects/ui/src/app/common/form/form-select/form-select.component.ts index b36b1c417..1c4525f86 100644 --- a/frontend/projects/ui/src/app/common/form/form-select/form-select.component.ts +++ b/frontend/projects/ui/src/app/common/form/form-select/form-select.component.ts @@ -21,7 +21,7 @@ export class FormSelectComponent extends Control { } get selected(): string | null { - return this.value && this.spec.values[this.value] + return (this.value && this.spec.values[this.value]) || null } set selected(value: string | null) { diff --git a/frontend/projects/ui/src/app/common/form/form-text/form-text.component.html b/frontend/projects/ui/src/app/common/form/form-text/form-text.component.html index 55acd437f..e466d16aa 100644 --- a/frontend/projects/ui/src/app/common/form/form-text/form-text.component.html +++ b/frontend/projects/ui/src/app/common/form/form-text/form-text.component.html @@ -1,5 +1,5 @@ diff --git a/frontend/projects/ui/src/app/common/os-welcome/os-welcome.page.scss b/frontend/projects/ui/src/app/common/os-welcome/os-welcome.page.scss index 0dc939f99..ae9b93b7b 100644 --- a/frontend/projects/ui/src/app/common/os-welcome/os-welcome.page.scss +++ b/frontend/projects/ui/src/app/common/os-welcome/os-welcome.page.scss @@ -26,4 +26,9 @@ h2 { h4 { font-style: italic; -} \ No newline at end of file +} + +.begin { + display: block; + margin: 0 auto; +} diff --git a/frontend/projects/ui/src/app/common/os-welcome/os-welcome.page.ts b/frontend/projects/ui/src/app/common/os-welcome/os-welcome.page.ts index f9a6ecd7b..678705446 100644 --- a/frontend/projects/ui/src/app/common/os-welcome/os-welcome.page.ts +++ b/frontend/projects/ui/src/app/common/os-welcome/os-welcome.page.ts @@ -1,5 +1,6 @@ -import { Component, Input } from '@angular/core' -import { ModalController } from '@ionic/angular' +import { Component, Inject } from '@angular/core' +import { TuiDialogContext } from '@taiga-ui/core' +import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' @Component({ selector: 'os-welcome', @@ -7,9 +8,7 @@ import { ModalController } from '@ionic/angular' styleUrls: ['./os-welcome.page.scss'], }) export class OSWelcomePage { - constructor(private readonly modalCtrl: ModalController) {} - - async dismiss() { - return this.modalCtrl.dismiss() - } + constructor( + @Inject(POLYMORPHEUS_CONTEXT) readonly context: TuiDialogContext, + ) {} } diff --git a/frontend/projects/ui/src/app/common/primary-ip/primary-ip.module.ts b/frontend/projects/ui/src/app/common/primary-ip/primary-ip.module.ts new file mode 100644 index 000000000..941518ab2 --- /dev/null +++ b/frontend/projects/ui/src/app/common/primary-ip/primary-ip.module.ts @@ -0,0 +1,8 @@ +import { NgModule } from '@angular/core' +import { PrimaryIpPipe } from './primary-ip.pipe' + +@NgModule({ + declarations: [PrimaryIpPipe], + exports: [PrimaryIpPipe], +}) +export class PrimaryIpPipeModule {} diff --git a/frontend/projects/ui/src/app/common/primary-ip/primary-ip.pipe.ts b/frontend/projects/ui/src/app/common/primary-ip/primary-ip.pipe.ts new file mode 100644 index 000000000..4cfa98552 --- /dev/null +++ b/frontend/projects/ui/src/app/common/primary-ip/primary-ip.pipe.ts @@ -0,0 +1,17 @@ +import { Pipe, PipeTransform } from '@angular/core' +import { IpInfo } from '../../services/patch-db/data-model' + +@Pipe({ + name: 'primaryIp', +}) +export class PrimaryIpPipe implements PipeTransform { + transform(ipInfo: IpInfo): string { + return getPrimaryIp(ipInfo) + } +} + +export function getPrimaryIp(ipInfo: IpInfo): string { + return Object.values(ipInfo) + .filter(iface => iface.ipv4) + .sort((a, b) => (a.wireless ? -1 : 1))[0].ipv4! +} diff --git a/frontend/projects/ui/src/app/common/store-icon/store-icon.component.ts b/frontend/projects/ui/src/app/common/store-icon/store-icon.component.ts deleted file mode 100644 index 076311697..000000000 --- a/frontend/projects/ui/src/app/common/store-icon/store-icon.component.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - Input, - Pipe, - PipeTransform, -} from '@angular/core' -import { ConfigService } from 'src/app/services/config.service' -import { sameUrl } from '@start9labs/shared' - -@Component({ - selector: 'store-icon', - templateUrl: './store-icon.component.html', - styleUrls: ['./store-icon.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class StoreIconComponent { - @Input() - url: string = '' - @Input() - size?: string -} - -@Pipe({ - name: 'getIcon', -}) -export class GetIconPipe implements PipeTransform { - constructor(private readonly config: ConfigService) {} - - transform(url: string): string | null { - const { start9, community } = this.config.marketplace - - if (sameUrl(url, start9)) { - return 'assets/img/icon_transparent.png' - } else if (sameUrl(url, community)) { - return 'assets/img/community-store.png' - } - return null - } -} diff --git a/frontend/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.component.html b/frontend/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.component.html index 6e7f7c6fa..d75364715 100644 --- a/frontend/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.component.html +++ b/frontend/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.component.html @@ -1,17 +1,8 @@ - New notifications - - - View - - + View + diff --git a/frontend/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.html b/frontend/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.html index 20985c11e..db2480687 100644 --- a/frontend/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.html +++ b/frontend/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.html @@ -1,4 +1,8 @@ - + Your user interface is cached and out of date. Hard refresh the page to get the latest UI.
    @@ -11,5 +15,13 @@ : ctrl + shift + R
- Ok -
+ + diff --git a/frontend/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.ts b/frontend/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.ts index e9a2e75ae..3a2740af9 100644 --- a/frontend/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.ts +++ b/frontend/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectionStrategy, Component, Inject } from '@angular/core' -import { Observable, Subject, merge } from 'rxjs' +import { Observable, Subject, merge, debounceTime } from 'rxjs' import { RefreshAlertService } from './refresh-alert.service' @@ -11,7 +11,7 @@ import { RefreshAlertService } from './refresh-alert.service' export class RefreshAlertComponent { private readonly dismiss$ = new Subject() - readonly show$ = merge(this.dismiss$, this.refresh$) + readonly show$ = merge(this.dismiss$, this.refresh$).pipe(debounceTime(0)) constructor( @Inject(RefreshAlertService) private readonly refresh$: Observable, diff --git a/frontend/projects/ui/src/app/common/toast-container/toast-container.module.ts b/frontend/projects/ui/src/app/common/toast-container/toast-container.module.ts index e23fcc454..86294542a 100644 --- a/frontend/projects/ui/src/app/common/toast-container/toast-container.module.ts +++ b/frontend/projects/ui/src/app/common/toast-container/toast-container.module.ts @@ -1,15 +1,24 @@ import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' import { RouterModule } from '@angular/router' -import { AlertModule, ToastModule } from '@start9labs/shared' +import { TuiAlertModule } from '@start9labs/shared' import { ToastContainerComponent } from './toast-container.component' import { NotificationsToastComponent } from './notifications-toast/notifications-toast.component' import { RefreshAlertComponent } from './refresh-alert/refresh-alert.component' import { UpdateToastComponent } from './update-toast/update-toast.component' +import { TuiButtonModule, TuiDialogModule } from '@taiga-ui/core' +import { TuiAutoFocusModule } from '@taiga-ui/cdk' @NgModule({ - imports: [CommonModule, ToastModule, AlertModule, RouterModule], + imports: [ + CommonModule, + RouterModule, + TuiDialogModule, + TuiButtonModule, + TuiAutoFocusModule, + TuiAlertModule, + ], declarations: [ ToastContainerComponent, NotificationsToastComponent, diff --git a/frontend/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.html b/frontend/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.html index b7a4af51b..350b0fff9 100644 --- a/frontend/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.html +++ b/frontend/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.html @@ -1,11 +1,21 @@ - Restart your server for these updates to take effect. It can take several minutes to come back online. - - - + + diff --git a/frontend/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.ts b/frontend/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.ts index 676aa0dc6..0b02faa4e 100644 --- a/frontend/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.ts +++ b/frontend/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.ts @@ -1,6 +1,5 @@ import { ChangeDetectionStrategy, Component, Inject } from '@angular/core' -import { LoadingController } from '@ionic/angular' -import { ErrorToastService } from '@start9labs/shared' +import { ErrorService, LoadingService } from '@start9labs/shared' import { Observable, Subject, merge } from 'rxjs' import { UpdateToastService } from './update-toast.service' @@ -19,8 +18,8 @@ export class UpdateToastComponent { constructor( @Inject(UpdateToastService) private readonly update$: Observable, private readonly embassyApi: ApiService, - private readonly errToast: ErrorToastService, - private readonly loadingCtrl: LoadingController, + private readonly errorService: ErrorService, + private readonly loader: LoadingService, ) {} onDismiss() { @@ -30,18 +29,14 @@ export class UpdateToastComponent { async restart(): Promise { this.onDismiss() - const loader = await this.loadingCtrl.create({ - message: 'Restarting...', - }) - - await loader.present() + const loader = this.loader.open('Restarting...').subscribe() try { await this.embassyApi.restartServer({}) } catch (e: any) { - await this.errToast.present(e) + await this.errorService.handleError(e) } finally { - await loader.dismiss() + await loader.unsubscribe() } } } diff --git a/frontend/projects/ui/src/app/routing.module.ts b/frontend/projects/ui/src/app/routing.module.ts index d835713bc..f8b67c9f9 100644 --- a/frontend/projects/ui/src/app/routing.module.ts +++ b/frontend/projects/ui/src/app/routing.module.ts @@ -4,6 +4,13 @@ import { AuthGuard } from './guards/auth.guard' import { UnauthGuard } from './guards/unauth.guard' const routes: Routes = [ + { + path: 'diagnostic', + loadChildren: () => + import('./apps/diagnostic/diagnostic.module').then( + m => m.DiagnosticModule, + ), + }, { path: 'loading', loadChildren: () => diff --git a/frontend/projects/ui/src/app/services/api/api.fixures.ts b/frontend/projects/ui/src/app/services/api/api.fixures.ts index 800eb6914..063e91d5a 100644 --- a/frontend/projects/ui/src/app/services/api/api.fixures.ts +++ b/frontend/projects/ui/src/app/services/api/api.fixures.ts @@ -1354,7 +1354,7 @@ export module Mock { 'dependency-info': { bitcoind: { title: 'Bitcoin Core', - icon: 'assets/img/service-icons/bitcoind.svg', + icon: 'assets/img/service-icons/bitcoind.png', }, }, 'marketplace-url': 'https://registry.start9.com/', @@ -1416,7 +1416,7 @@ export module Mock { 'dependency-info': { bitcoind: { title: 'Bitcoin Core', - icon: 'assets/img/service-icons/bitcoind.svg', + icon: 'assets/img/service-icons/bitcoind.png', }, 'btc-rpc-proxy': { title: 'Bitcoin Proxy', diff --git a/frontend/projects/ui/src/app/services/api/api.types.ts b/frontend/projects/ui/src/app/services/api/api.types.ts index 8ec0ecf59..a0a0454ba 100644 --- a/frontend/projects/ui/src/app/services/api/api.types.ts +++ b/frontend/projects/ui/src/app/services/api/api.types.ts @@ -4,9 +4,11 @@ import { InputSpec } from '@start9labs/start-sdk/lib/config/configTypes' import { DataModel, DependencyError, + DomainInfo, } from 'src/app/services/patch-db/data-model' import { StartOSDiskInfo, LogsRes, ServerLogsReq } from '@start9labs/shared' import { customSmtp } from '@start9labs/start-sdk/lib/config/configConstants' +import { DomainSpec } from 'src/app/apps/ui/pages/system/domains/domain.const' export module RR { // DB @@ -55,6 +57,9 @@ export module RR { export type UpdateServerReq = { 'marketplace-url': string } // server.update export type UpdateServerRes = 'updating' | 'no-updates' + export type SetServerClearnetAddressReq = { domainInfo: DomainInfo | null } // server.set-clearnet + export type SetServerClearnetAddressRes = null + export type RestartServerReq = {} // server.restart export type RestartServerRes = null @@ -105,6 +110,25 @@ export module RR { export type DeleteAllNotificationsReq = { before: number } // notification.delete-before export type DeleteAllNotificationsRes = null + // domains + + export type ClaimStart9MeReq = {} // net.domain.me.claim + export type ClaimStart9MeRes = null + + export type DeleteStart9MeReq = {} // net.domain.me.delete + export type DeleteStart9MeRes = null + + export type AddDomainReq = DomainSpec // net.domain.add + export type AddDomainRes = null + + export type DeleteDomainReq = { hostname: string } // net.domain.delete + export type DeleteDomainRes = null + + // port forwards + + export type OverridePortReq = { target: number; port: number } // net.port-forwards.override + export type OverridePortRes = null + // wifi export type GetWifiReq = {} diff --git a/frontend/projects/ui/src/app/services/api/embassy-api.service.ts b/frontend/projects/ui/src/app/services/api/embassy-api.service.ts index 168a7692b..683c3bbe9 100644 --- a/frontend/projects/ui/src/app/services/api/embassy-api.service.ts +++ b/frontend/projects/ui/src/app/services/api/embassy-api.service.ts @@ -99,6 +99,10 @@ export abstract class ApiService { abstract updateServer(url?: string): Promise + abstract setServerClearnetAddress( + params: RR.SetServerClearnetAddressReq, + ): Promise + abstract restartServer( params: RR.RestartServerReq, ): Promise @@ -145,6 +149,26 @@ export abstract class ApiService { params: RR.DeleteAllNotificationsReq, ): Promise + // domains + + abstract claimStart9MeDomain( + params: RR.ClaimStart9MeReq, + ): Promise + + abstract deleteStart9MeDomain( + params: RR.DeleteStart9MeReq, + ): Promise + + abstract addDomain(params: RR.AddDomainReq): Promise + + abstract deleteDomain(params: RR.DeleteDomainReq): Promise + + // port forwards + + abstract overridePortForward( + params: RR.OverridePortReq, + ): Promise + // wifi abstract enableWifi(params: RR.EnableWifiReq): Promise @@ -158,7 +182,7 @@ export abstract class ApiService { abstract connectWifi(params: RR.ConnectWifiReq): Promise - abstract deleteWifi(params: RR.DeleteWifiReq): Promise + abstract deleteWifi(params: RR.DeleteWifiReq): Promise // email diff --git a/frontend/projects/ui/src/app/services/api/embassy-live-api.service.ts b/frontend/projects/ui/src/app/services/api/embassy-live-api.service.ts index 3fb8f5a47..f2cb5b57e 100644 --- a/frontend/projects/ui/src/app/services/api/embassy-live-api.service.ts +++ b/frontend/projects/ui/src/app/services/api/embassy-live-api.service.ts @@ -191,6 +191,12 @@ export class LiveApiService extends ApiService { return this.rpcRequest({ method: 'server.update', params }) } + async setServerClearnetAddress( + params: RR.SetServerClearnetAddressReq, + ): Promise { + return this.rpcRequest({ method: 'server.set-clearnet', params }) + } + async restartServer( params: RR.RestartServerReq, ): Promise { @@ -276,6 +282,36 @@ export class LiveApiService extends ApiService { }) } + // domains + + async claimStart9MeDomain( + params: RR.ClaimStart9MeReq, + ): Promise { + return this.rpcRequest({ method: 'net.domain.me.claim', params }) + } + + async deleteStart9MeDomain( + params: RR.DeleteStart9MeReq, + ): Promise { + return this.rpcRequest({ method: 'net.domain.me.delete', params }) + } + + async addDomain(params: RR.AddDomainReq): Promise { + return this.rpcRequest({ method: 'net.domain.add', params }) + } + + async deleteDomain(params: RR.DeleteDomainReq): Promise { + return this.rpcRequest({ method: 'net.domain.delete', params }) + } + + // port forwards + + async overridePortForward( + params: RR.OverridePortReq, + ): Promise { + return this.rpcRequest({ method: 'net.port-forwards.override', params }) + } + // wifi async enableWifi(params: RR.EnableWifiReq): Promise { diff --git a/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts b/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts index a94564b74..d12f98389 100644 --- a/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts +++ b/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts @@ -307,6 +307,20 @@ export class MockApiService extends ApiService { return this.withRevision(patch, 'updating') } + async setServerClearnetAddress( + params: RR.SetServerClearnetAddressReq, + ): Promise { + await pauseFor(2000) + const patch = [ + { + op: PatchOp.REPLACE, + path: '/server-info/ui/domainInfo', + value: params.domainInfo, + }, + ] + return this.withRevision(patch, null) + } + async restartServer( params: RR.RestartServerReq, ): Promise { @@ -424,6 +438,88 @@ export class MockApiService extends ApiService { return null } + // domains + + async claimStart9MeDomain( + params: RR.ClaimStart9MeReq, + ): Promise { + await pauseFor(2000) + + const patch = [ + { + op: PatchOp.REPLACE, + path: '/server-info/network/start9MeSubdomain', + value: { + value: 'xyz', + createdAt: new Date(), + }, + }, + ] + return this.withRevision(patch, null) + } + + async deleteStart9MeDomain( + params: RR.DeleteStart9MeReq, + ): Promise { + await pauseFor(2000) + const patch = [ + { + op: PatchOp.REPLACE, + path: '/server-info/network/start9MeSubdomain', + value: null, + }, + ] + return this.withRevision(patch, null) + } + + async addDomain(params: RR.AddDomainReq): Promise { + await pauseFor(2000) + + const patch = [ + { + op: PatchOp.REPLACE, + path: '/server-info/network/domains', + value: [ + { + value: params.domain, + provider: params.provider, + createdAt: new Date(), + }, + ], + }, + ] + return this.withRevision(patch, null) + } + + async deleteDomain(params: RR.DeleteDomainReq): Promise { + await pauseFor(2000) + const patch = [ + { + op: PatchOp.REPLACE, + path: '/server-info/network/domains', + value: [], + }, + ] + return this.withRevision(patch, null) + } + + // port forwards + + async overridePortForward( + params: RR.OverridePortReq, + ): Promise { + await pauseFor(2000) + + const patch = [ + { + op: PatchOp.REPLACE, + path: '/server-info/network/wanConfig/forwards/0/override', + value: params.port, + }, + ] + return this.withRevision(patch, null) + } + // wifi async enableWifi(params: RR.EnableWifiReq): Promise { @@ -431,7 +527,7 @@ export class MockApiService extends ApiService { const patch = [ { op: PatchOp.REPLACE, - path: '/server-info/wifi-enabled', + path: '/server-info/network/wifi/enabled', value: params.enable, }, ] @@ -472,7 +568,7 @@ export class MockApiService extends ApiService { const patch = [ { op: PatchOp.REPLACE, - path: '/server-info/email', + path: '/server-info/smtp', value: params, }, ] diff --git a/frontend/projects/ui/src/app/services/api/mock-patch.ts b/frontend/projects/ui/src/app/services/api/mock-patch.ts index 4f678ecb5..c6c387d9e 100644 --- a/frontend/projects/ui/src/app/services/api/mock-patch.ts +++ b/frontend/projects/ui/src/app/services/api/mock-patch.ts @@ -37,21 +37,55 @@ export const mockPatchData: DataModel = { id: 'abcdefgh', version: '0.3.4', country: 'us', - 'last-backup': new Date(new Date().valueOf() - 604800001).toISOString(), - 'lan-address': 'https://adjective-noun.local', - 'tor-address': 'http://myveryownspecialtoraddress.onion', - 'ip-info': { - eth0: { - ipv4: '10.0.0.1', - ipv6: null, + ui: { + lanHostname: 'adjective-noun.local', + torHostname: 'myveryownspecialtoraddress.onion', + ipInfo: { + eth0: { + wireless: false, + ipv4: '10.0.0.1', + ipv6: null, + }, + wlan0: { + wireless: true, + ipv4: '10.0.90.12', + ipv6: 'FE80:CD00:0000:0CDE:1257:0000:211E:729CD', + }, }, - wlan0: { - ipv4: '10.0.90.12', - ipv6: 'FE80:CD00:0000:0CDE:1257:0000:211E:729CD', + domainInfo: null, + }, + network: { + domains: [], + start9MeSubdomain: null, + wifi: { + enabled: false, + lastRegion: null, + }, + wanConfig: { + upnp: false, + forwards: [ + { + assigned: 443, + override: null, + target: 443, + error: null, + }, + { + assigned: 80, + override: null, + target: 80, + error: null, + }, + { + assigned: 8332, + override: null, + target: 8332, + error: null, + }, + ], }, }, - 'last-wifi-region': null, - 'wifi-enabled': false, + 'last-backup': new Date(new Date().valueOf() - 604800001).toISOString(), 'unread-notification-count': 4, 'eos-version-compat': '>=0.3.0 <=0.3.0.1', 'status-info': { @@ -60,7 +94,6 @@ export const mockPatchData: DataModel = { 'update-progress': null, 'shutting-down': false, }, - hostname: 'random-words', pubkey: 'npub1sg6plzptd64u62a878hep2kev88swjh3tw00gjsfl8f237lmu63q0uf63m', 'ca-fingerprint': 'SHA-256: 63 2B 11 99 44 40 17 DF 37 FC C3 DF 0F 3D 15', 'system-start-time': new Date(new Date().valueOf() - 360042).toUTCString(), diff --git a/frontend/projects/ui/src/app/services/form-dialog.service.ts b/frontend/projects/ui/src/app/services/form-dialog.service.ts index b44218f75..69df946bb 100644 --- a/frontend/projects/ui/src/app/services/form-dialog.service.ts +++ b/frontend/projects/ui/src/app/services/form-dialog.service.ts @@ -3,7 +3,7 @@ import { TuiDialogOptions, TuiDialogService } from '@taiga-ui/core' import { TuiDialogFormService, TuiPromptData } from '@taiga-ui/kit' import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' -export const PROMPT: Partial> = { +const PROMPT: Partial> = { label: 'Unsaved Changes', data: { content: 'You have unsaved changes. Are you sure you want to leave?', diff --git a/frontend/projects/ui/src/app/services/patch-data.service.ts b/frontend/projects/ui/src/app/services/patch-data.service.ts index 9efe05699..4eb2e166d 100644 --- a/frontend/projects/ui/src/app/services/patch-data.service.ts +++ b/frontend/projects/ui/src/app/services/patch-data.service.ts @@ -1,5 +1,6 @@ import { Inject, Injectable } from '@angular/core' -import { ModalController } from '@ionic/angular' +import { AbstractMarketplaceService } from '@start9labs/marketplace' +import { TuiDialogService } from '@taiga-ui/core' import { filter, share, switchMap, take, tap, Observable } from 'rxjs' import { PatchDB } from 'patch-db-client' import { DataModel } from 'src/app/services/patch-db/data-model' @@ -8,8 +9,8 @@ import { OSWelcomePage } from '../common/os-welcome/os-welcome.page' import { ConfigService } from 'src/app/services/config.service' import { ApiService } from 'src/app/services/api/embassy-api.service' import { MarketplaceService } from 'src/app/services/marketplace.service' -import { AbstractMarketplaceService } from '@start9labs/marketplace' import { ConnectionService } from 'src/app/services/connection.service' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' // Get data from PatchDb after is starts and act upon it @Injectable({ @@ -33,7 +34,7 @@ export class PatchDataService extends Observable { private readonly patch: PatchDB, private readonly eosService: EOSService, private readonly config: ConfigService, - private readonly modalCtrl: ModalController, + private readonly dialogs: TuiDialogService, private readonly embassyApi: ApiService, @Inject(AbstractMarketplaceService) private readonly marketplaceService: MarketplaceService, @@ -47,22 +48,21 @@ export class PatchDataService extends Observable { this.marketplaceService.getMarketplace$().pipe(take(1)).subscribe() } - private async showEosWelcome(ackVersion: string): Promise { + private showEosWelcome(ackVersion: string) { if (this.config.skipStartupAlerts || ackVersion === this.config.version) { return } - const modal = await this.modalCtrl.create({ - component: OSWelcomePage, - presentingElement: await this.modalCtrl.getTop(), - backdropDismiss: false, - }) - modal.onWillDismiss().then(() => { - this.embassyApi - .setDbValue(['ack-welcome'], this.config.version) - .catch() - }) - - await modal.present() + this.dialogs + .open(new PolymorpheusComponent(OSWelcomePage), { + label: 'Release Notes', + }) + .subscribe({ + complete: () => { + this.embassyApi + .setDbValue(['ack-welcome'], this.config.version) + .catch() + }, + }) } } diff --git a/frontend/projects/ui/src/app/services/patch-db/data-model.ts b/frontend/projects/ui/src/app/services/patch-db/data-model.ts index 01629667b..6221a773d 100644 --- a/frontend/projects/ui/src/app/services/patch-db/data-model.ts +++ b/frontend/projects/ui/src/app/services/patch-db/data-model.ts @@ -3,6 +3,7 @@ import { Url } from '@start9labs/shared' import { Manifest } from '@start9labs/marketplace' import { BackupJob } from '../api/api.types' import { customSmtp } from '@start9labs/start-sdk/lib/config/configConstants' +import { DomainSpec } from 'src/app/apps/ui/pages/system/domains/domain.const' export interface DataModel { 'server-info': ServerInfo @@ -54,16 +55,12 @@ export interface ServerInfo { id: string version: string country: string + ui: StartOsUiInfo + network: NetworkInfo 'last-backup': string | null - 'lan-address': Url - 'tor-address': Url - 'ip-info': IpInfo - 'last-wifi-region': string | null - 'wifi-enabled': boolean 'unread-notification-count': number 'status-info': ServerStatusInfo 'eos-version-compat': string - hostname: string pubkey: string 'ca-fingerprint': string 'system-start-time': string @@ -71,8 +68,49 @@ export interface ServerInfo { smtp: typeof customSmtp.validator._TYPE } +export type StartOsUiInfo = { + ipInfo: IpInfo + lanHostname: string + torHostname: string + domainInfo: DomainInfo | null +} + +export type NetworkInfo = { + wifi: WiFiInfo + start9MeSubdomain: Omit | null + domains: Domain[] + wanConfig: { + upnp: boolean + forwards: PortForward[] + } +} + +export type DomainInfo = { + domain: string + subdomain: string | null +} + +export type PortForward = { + assigned: number + override: number | null + target: number + error: string | null +} + +export type WiFiInfo = { + enabled: boolean + lastRegion: string | null +} + +export type Domain = { + value: string + provider: DomainSpec['provider'] + createdAt: string +} + export interface IpInfo { [iface: string]: { + wireless: boolean ipv4: string | null ipv6: string | null } diff --git a/frontend/projects/ui/src/app/util/clearnetAddress.ts b/frontend/projects/ui/src/app/util/clearnetAddress.ts new file mode 100644 index 000000000..94d483ece --- /dev/null +++ b/frontend/projects/ui/src/app/util/clearnetAddress.ts @@ -0,0 +1,11 @@ +import { DomainInfo } from '../services/patch-db/data-model' + +export function getClearnetAddress( + protocol: string, + domainInfo: DomainInfo | null, + path = '', +) { + if (!domainInfo) return '' + const subdomain = domainInfo.subdomain ? `${domainInfo.subdomain}.` : '' + return `${protocol}://${subdomain}${domainInfo.domain}${path}` +} diff --git a/frontend/projects/ui/src/styles.scss b/frontend/projects/ui/src/styles.scss index 7159d6806..c98d52162 100644 --- a/frontend/projects/ui/src/styles.scss +++ b/frontend/projects/ui/src/styles.scss @@ -52,13 +52,6 @@ src: url('/assets/fonts/Open_Sans/OpenSans-Light.ttf'); } -@font-face { - font-family: 'Redacted'; - font-style: normal; - font-weight: normal; - src: url('/assets/fonts/Redacted/redacted.regular.ttf'); -} - @font-face { font-family: 'Courier New'; font-style: normal; @@ -278,7 +271,6 @@ ion-loading { .rec-item { margin: 20px; - border-style: solid; border-width: 1px; border-style: groove; border-color: dimgrey; @@ -368,29 +360,6 @@ ul { list-style-type: disc; } -// Taiga UI overrides - -tui-dialog { - transform: translate3d(0, 0, 0); -} - -tui-opt-group[data-label^='⚠️']:before { - color: var(--tui-warning-fill); -} - -tui-hint[data-appearance='onDark'] { - background: white !important; - color: #222 !important; -} - -[tuiLink] { - color: var(--tui-link) !important; - - &:hover { - color: var(--tui-link-hover) !important; - } -} - .checkbox { cursor: pointer; margin: 0 12px 6px 0; diff --git a/frontend/tsconfig.lib.json b/frontend/tsconfig.lib.json index 0dd228bf9..2d527a362 100644 --- a/frontend/tsconfig.lib.json +++ b/frontend/tsconfig.lib.json @@ -7,7 +7,6 @@ "declaration": true, "declarationMap": false, "inlineSources": true, - "types": [], "paths": { "@start9labs/marketplace": ["dist/marketplace"], "@start9labs/shared": ["dist/shared"] From b9316a4112b266c86ee092afcd2aea96340d2e7f Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Tue, 11 Jul 2023 03:35:53 +0800 Subject: [PATCH 003/169] Update angular (#2343) * chore: update to Angular 15 * chore: update to Angular 16 * chore: update Taiga UI --- frontend/package-lock.json | 21493 ++++++++++++---- frontend/package.json | 49 +- frontend/projects/shared/styles/global.scss | 22 +- .../apps/ui/pages/updates/updates.module.ts | 4 +- .../apps/ui/pages/updates/updates.page.html | 11 +- .../projects/ui/src/app/guards/auth.guard.ts | 4 +- .../ui/src/app/guards/unauth.guard.ts | 4 +- 7 files changed, 15984 insertions(+), 5603 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 8d70ccebf..56b0c114d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,37 +1,34 @@ { "name": "startos-ui", "version": "0.3.4.3", - "lockfileVersion": 3, + "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "startos-ui", "version": "0.3.4.3", "dependencies": { - "@angular/animations": "^14.1.0", - "@angular/common": "^14.1.0", - "@angular/compiler": "^14.1.0", - "@angular/core": "^14.1.0", - "@angular/forms": "^14.1.0", - "@angular/platform-browser": "^14.1.0", - "@angular/platform-browser-dynamic": "^14.1.0", - "@angular/pwa": "^14.1.0", - "@angular/router": "^14.1.0", - "@angular/service-worker": "^14.2.2", + "@angular/animations": "^16.1.4", + "@angular/common": "^16.1.4", + "@angular/compiler": "^16.1.4", + "@angular/core": "^16.1.4", + "@angular/forms": "^16.1.4", + "@angular/platform-browser": "^16.1.4", + "@angular/platform-browser-dynamic": "^16.1.4", + "@angular/pwa": "^16.1.4", + "@angular/router": "^16.1.4", + "@angular/service-worker": "^16.1.4", "@ionic/angular": "^6.1.15", - "@maskito/angular": "^0.10.0", - "@maskito/core": "^0.10.0", "@materia-ui/ngx-monaco-editor": "^6.0.0", "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc5", - "@taiga-ui/addon-charts": "3.33.1", - "@taiga-ui/cdk": "3.33.1", - "@taiga-ui/core": "3.33.1", - "@taiga-ui/icons": "3.33.1", - "@taiga-ui/kit": "3.33.1", + "@taiga-ui/addon-charts": "3.36.0", + "@taiga-ui/cdk": "3.36.0", + "@taiga-ui/core": "3.36.0", + "@taiga-ui/icons": "3.36.0", + "@taiga-ui/kit": "3.36.0", "@tinkoff/ng-dompurify": "4.0.0", - "angular-svg-round-progressbar": "^9.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", "cbor": "npm:@jprochazk/cbor@^0.4.9", @@ -47,7 +44,7 @@ "marked": "^4.0.0", "monaco-editor": "^0.33.0", "mustache": "^4.2.0", - "ng-qrcode": "^7.0.0", + "ng-qrcode": "^16.0.0", "node-jose": "^2.1.1", "patch-db-client": "file: ../../../patch-db/client", "pbkdf2": "^3.1.2", @@ -56,13 +53,13 @@ "ts-matches": "^5.2.1", "tslib": "^2.3.0", "uuid": "^8.3.2", - "zone.js": "^0.11.5" + "zone.js": "^0.13.1" }, "devDependencies": { - "@angular-devkit/build-angular": "^14.1.0", - "@angular/cli": "^14.1.0", - "@angular/compiler-cli": "^14.1.0", - "@angular/language-service": "^14.1.0", + "@angular-devkit/build-angular": "^16.1.4", + "@angular/cli": "^16.1.4", + "@angular/compiler-cli": "^16.1.4", + "@angular/language-service": "^16.1.4", "@ionic/cli": "^6.19.0", "@types/cron": "^2.0.0", "@types/dompurify": "^2.3.3", @@ -76,13 +73,13 @@ "@types/uuid": "^8.3.1", "husky": "^4.3.8", "lint-staged": "^13.2.0", - "ng-packagr": "^14.1.0", + "ng-packagr": "^16.1.0", "node-html-parser": "^5.3.3", "prettier": "^2.6.1", "raw-loader": "^4.0.2", "ts-node": "^10.7.0", "tslint": "^6.1.3", - "typescript": "^4.8.4", + "typescript": "^5.1.6", "webpack-bundle-analyzer": "^4.8.0" } }, @@ -108,19 +105,13 @@ "rxjs": ">=7.0.0" } }, - "node_modules/@adobe/css-tools": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz", - "integrity": "sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==", - "dev": true - }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { @@ -128,132 +119,128 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1402.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.11.tgz", - "integrity": "sha512-RuSZrBQ+QbipAESZ4aXCyAMQHaEaDyyV/FDS9J2HJWfEFbRD5oxlEt/tBC8XjmJQsktaUOh07GT8MNJjPKVAQw==", + "version": "0.1601.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1601.4.tgz", + "integrity": "sha512-OOSbNlDy+Q3jY0oFHaq8kkna9HYI1zaS8IHeCIDP6T/ZIAVad4+HqXAL4SKQrKJikkoBQv1Z/eaDBL5XPFK9Bw==", "devOptional": true, "dependencies": { - "@angular-devkit/core": "14.2.11", - "rxjs": "6.6.7" + "@angular-devkit/core": "16.1.4", + "rxjs": "7.8.1" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/architect/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "devOptional": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@angular-devkit/architect/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "devOptional": true - }, "node_modules/@angular-devkit/build-angular": { - "version": "14.2.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-14.2.11.tgz", - "integrity": "sha512-O3X7GXcCBCGceVSHT+GIJ2JrRCg2YcO7HtNavpmPrraNr1o+aCdTkmT5WTS2cqWkZBm/z0wqKR8PsX/ZoD2r1A==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "2.2.0", - "@angular-devkit/architect": "0.1402.11", - "@angular-devkit/build-webpack": "0.1402.11", - "@angular-devkit/core": "14.2.11", - "@babel/core": "7.18.10", - "@babel/generator": "7.18.12", - "@babel/helper-annotate-as-pure": "7.18.6", - "@babel/plugin-proposal-async-generator-functions": "7.18.10", - "@babel/plugin-transform-async-to-generator": "7.18.6", - "@babel/plugin-transform-runtime": "7.18.10", - "@babel/preset-env": "7.18.10", - "@babel/runtime": "7.18.9", - "@babel/template": "7.18.10", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.1.4.tgz", + "integrity": "sha512-LiHM7R20fTHg/eM+Iabotj08edP5wVBQahRfVNLxERo8X6VJgSjVChnsh3AQJkRywlGuFe20AOQYpyLyN367Ug==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.2.1", + "@angular-devkit/architect": "0.1601.4", + "@angular-devkit/build-webpack": "0.1601.4", + "@angular-devkit/core": "16.1.4", + "@babel/core": "7.22.5", + "@babel/generator": "7.22.7", + "@babel/helper-annotate-as-pure": "7.22.5", + "@babel/helper-split-export-declaration": "7.22.5", + "@babel/plugin-proposal-async-generator-functions": "7.20.7", + "@babel/plugin-transform-async-to-generator": "7.22.5", + "@babel/plugin-transform-runtime": "7.22.5", + "@babel/preset-env": "7.22.5", + "@babel/runtime": "7.22.5", + "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "14.2.11", + "@ngtools/webpack": "16.1.4", + "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", - "babel-loader": "8.2.5", + "autoprefixer": "10.4.14", + "babel-loader": "9.1.2", "babel-plugin-istanbul": "6.1.1", - "browserslist": "^4.9.1", - "cacache": "16.1.2", + "browserslist": "^4.21.5", + "cacache": "17.1.3", + "chokidar": "3.5.3", "copy-webpack-plugin": "11.0.0", - "critters": "0.0.16", - "css-loader": "6.7.1", - "esbuild-wasm": "0.15.5", - "glob": "8.0.3", + "critters": "0.0.19", + "css-loader": "6.8.1", + "esbuild-wasm": "0.17.19", + "fast-glob": "3.2.12", "https-proxy-agent": "5.0.1", "inquirer": "8.2.4", - "jsonc-parser": "3.1.0", + "jsonc-parser": "3.2.0", "karma-source-map-support": "1.4.0", "less": "4.1.3", - "less-loader": "11.0.0", + "less-loader": "11.1.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.2.1", - "mini-css-extract-plugin": "2.6.1", - "minimatch": "5.1.0", - "open": "8.4.0", + "magic-string": "0.30.0", + "mini-css-extract-plugin": "2.7.6", + "mrmime": "1.0.1", + "open": "8.4.2", "ora": "5.4.1", - "parse5-html-rewriting-stream": "6.0.1", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "2.3.1", "piscina": "3.2.0", - "postcss": "8.4.16", - "postcss-import": "15.0.0", - "postcss-loader": "7.0.1", - "postcss-preset-env": "7.8.0", - "regenerator-runtime": "0.13.9", + "postcss": "8.4.24", + "postcss-loader": "7.3.2", "resolve-url-loader": "5.0.0", - "rxjs": "6.6.7", - "sass": "1.54.4", - "sass-loader": "13.0.2", - "semver": "7.3.7", - "source-map-loader": "4.0.0", + "rxjs": "7.8.1", + "sass": "1.63.2", + "sass-loader": "13.3.1", + "semver": "7.5.3", + "source-map-loader": "4.0.1", "source-map-support": "0.5.21", - "stylus": "0.59.0", - "stylus-loader": "7.0.0", - "terser": "5.14.2", + "terser": "5.17.7", "text-table": "0.2.0", "tree-kill": "1.2.2", - "tslib": "2.4.0", - "webpack": "5.76.1", - "webpack-dev-middleware": "5.3.3", - "webpack-dev-server": "4.11.0", - "webpack-merge": "5.8.0", + "tslib": "2.5.3", + "vite": "4.3.9", + "webpack": "5.86.0", + "webpack-dev-middleware": "6.1.1", + "webpack-dev-server": "4.15.0", + "webpack-merge": "5.9.0", "webpack-subresource-integrity": "5.1.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.15.5" + "esbuild": "0.17.19" }, "peerDependencies": { - "@angular/compiler-cli": "^14.0.0", - "@angular/localize": "^14.0.0", - "@angular/service-worker": "^14.0.0", + "@angular/compiler-cli": "^16.0.0", + "@angular/localize": "^16.0.0", + "@angular/platform-server": "^16.0.0", + "@angular/service-worker": "^16.0.0", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", "karma": "^6.3.0", - "ng-packagr": "^14.0.0", + "ng-packagr": "^16.0.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=4.6.2 <4.9" + "typescript": ">=4.9.3 <5.2" }, "peerDependenciesMeta": { "@angular/localize": { "optional": true }, + "@angular/platform-server": { + "optional": true + }, "@angular/service-worker": { "optional": true }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, "karma": { "optional": true }, @@ -268,152 +255,12 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "node_modules/@angular-devkit/build-angular/node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", "dev": true }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, "node_modules/@angular-devkit/build-angular/node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -439,40 +286,16 @@ "ajv": "^6.9.1" } }, - "node_modules/@angular-devkit/build-angular/node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, "node_modules/@angular-devkit/build-angular/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@angular-devkit/build-angular/node_modules/schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -488,28 +311,28 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", "dev": true }, "node_modules/@angular-devkit/build-angular/node_modules/webpack": { - "version": "5.76.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz", - "integrity": "sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==", + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", + "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@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.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.14.1", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -518,9 +341,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.1.2", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, @@ -541,16 +364,16 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1402.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1402.11.tgz", - "integrity": "sha512-Ajyg1O6B6JSHsDlPdh165uy3glW4IiUlRXu8VVAOSA88WIT1Dl17f4Oun0/t27ip0/CNceiVY9MzOqIwGL1E6g==", + "version": "0.1601.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1601.4.tgz", + "integrity": "sha512-GC1y//ScAYbYQ68Wri2QgTEekC4hRxBC+xEkYL9OFiAMQ4mcN+eYvbkQBX8enJwDMXpkYfLR6VV8cChjAVYIgg==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1402.11", - "rxjs": "6.6.7" + "@angular-devkit/architect": "0.1601.4", + "rxjs": "7.8.1" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -559,37 +382,19 @@ "webpack-dev-server": "^4.0.0" } }, - "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@angular-devkit/build-webpack/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@angular-devkit/core": { - "version": "14.2.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.11.tgz", - "integrity": "sha512-cBIGs6y9rykOQqnuAQOB1DgIRyBFYtvKRJb7QNUfIJ0qUfARKkuV/yikv3lrb95ePGkmoRzmjkFqcFZiYU+r7A==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.4.tgz", + "integrity": "sha512-WCAzNi9LxpFIi2WVPaJQd2kHPqCnCexWzUZN05ltJuBGCQL1O+LgRHGwnQ4WZoqmrF5tcWt2a3GFtJ3DgMc1hw==", "dependencies": { - "ajv": "8.11.0", + "ajv": "8.12.0", "ajv-formats": "2.1.1", - "jsonc-parser": "3.1.0", - "rxjs": "6.6.7", + "jsonc-parser": "3.2.0", + "rxjs": "7.8.1", "source-map": "0.7.4" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -602,132 +407,98 @@ } } }, - "node_modules/@angular-devkit/core/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@angular-devkit/core/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/@angular-devkit/schematics": { - "version": "14.2.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.11.tgz", - "integrity": "sha512-OTEOu4uf3kZDcSGYkuESxf/IOlJSn/GdLt63Sd1QwJu6pJSeFxkANw/WEWICZyJfRLNW6fdLJLEGPM9Zt5ZqAg==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.4.tgz", + "integrity": "sha512-yjRgwHAfFaeuimgbQtjwSUyXzEHpMSdTRb2zg+TOp6skoGvHOG8xXFJ7DjBkSMeAQdFF0fkxhPS9YmlxqNc+7A==", "dependencies": { - "@angular-devkit/core": "14.2.11", - "jsonc-parser": "3.1.0", - "magic-string": "0.26.2", + "@angular-devkit/core": "16.1.4", + "jsonc-parser": "3.2.0", + "magic-string": "0.30.0", "ora": "5.4.1", - "rxjs": "6.6.7" + "rxjs": "7.8.1" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/schematics/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@angular-devkit/schematics/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/@angular/animations": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-14.3.0.tgz", - "integrity": "sha512-QoBcIKy1ZiU+4qJsAh5Ls20BupWiXiZzKb0s6L9/dntPt5Msr4Ao289XR2P6O1L+kTsCprH9Kt41zyGQ/bkRqg==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.1.4.tgz", + "integrity": "sha512-QdqmnMEYsrZK1BB+/TGteyoQVRwIpRdBP4Jg+hX/BDhVpt35dptSwvNZj7+9zoYLwNo5DuGlttljEaLOs1UcUw==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "14.3.0" + "@angular/core": "16.1.4" } }, "node_modules/@angular/cli": { - "version": "14.2.11", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.2.11.tgz", - "integrity": "sha512-k4Epob8Xz+9oyC6Ty9SNntTa2wHAvzxfcCi7itefPMcwEU9pqBcAv4XYfyawb5d7n/S5RBNwdsDpjoh2DPtmow==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.1.4.tgz", + "integrity": "sha512-coSOLVLpOCOD5q9K9EAFFMrTES+HtdJiLy/iI9kdKNCKWUJpm8/svZ3JZOej3vPxYEp0AokXNOwORQnX21/qZQ==", "devOptional": true, "dependencies": { - "@angular-devkit/architect": "0.1402.11", - "@angular-devkit/core": "14.2.11", - "@angular-devkit/schematics": "14.2.11", - "@schematics/angular": "14.2.11", + "@angular-devkit/architect": "0.1601.4", + "@angular-devkit/core": "16.1.4", + "@angular-devkit/schematics": "16.1.4", + "@schematics/angular": "16.1.4", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", - "debug": "4.3.4", - "ini": "3.0.0", + "ini": "4.1.1", "inquirer": "8.2.4", - "jsonc-parser": "3.1.0", - "npm-package-arg": "9.1.0", - "npm-pick-manifest": "7.0.1", - "open": "8.4.0", + "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": "13.6.2", - "resolve": "1.22.1", - "semver": "7.3.7", + "pacote": "15.2.0", + "resolve": "1.22.2", + "semver": "7.5.3", "symbol-observable": "4.0.0", - "uuid": "8.3.2", - "yargs": "17.5.1" + "yargs": "17.7.2" }, "bin": { "ng": "bin/ng.js" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@angular/common": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-14.3.0.tgz", - "integrity": "sha512-pV9oyG3JhGWeQ+TFB0Qub6a1VZWMNZ6/7zEopvYivdqa5yDLLDSBRWb6P80RuONXyGnM1pa7l5nYopX+r/23GQ==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.1.4.tgz", + "integrity": "sha512-SDA8GZVY0nXCJaNUy13L22jAKuk1LZgQ6QzqOpqQc50C25bfBQbYv68PKjHCjQ62VxGKnDSTT85xCMNx+y/U4g==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "14.3.0", + "@angular/core": "16.1.4", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-14.3.0.tgz", - "integrity": "sha512-E15Rh0t3vA+bctbKnBCaDmLvc3ix+ZBt6yFZmhZalReQ+KpOlvOJv+L9oiFEgg+rYVl2QdvN7US1fvT0PqswLw==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.1.4.tgz", + "integrity": "sha512-5iKx8g+6/LtiRhbqMS2Jw1AshFUb4M8LO9WQKfRoE+5mZrDOYkAQYgOlAO7fk0mOCXeZcHJBbq2nuwDfwsZIiw==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "14.3.0" + "@angular/core": "16.1.4" }, "peerDependenciesMeta": { "@angular/core": { @@ -736,90 +507,88 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.3.0.tgz", - "integrity": "sha512-eoKpKdQ2X6axMgzcPUMZVYl3bIlTMzMeTo5V29No4BzgiUB+QoOTYGNJZkGRyqTNpwD9uSBJvmT2vG9+eC4ghQ==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.1.4.tgz", + "integrity": "sha512-JerJOZeOLaHFHrfWMm4m9tEw+MdNNIMPj3TSauJ6uZPbFokGeqS2GsUBMjuQlwh5xY4duh1HtRsohvshpl306A==", "dev": true, "dependencies": { - "@babel/core": "^7.17.2", + "@babel/core": "7.22.5", + "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", - "dependency-graph": "^0.11.0", - "magic-string": "^0.26.0", "reflect-metadata": "^0.1.2", "semver": "^7.0.0", - "sourcemap-codec": "^1.4.8", "tslib": "^2.3.0", "yargs": "^17.2.1" }, "bin": { "ng-xi18n": "bundles/src/bin/ng_xi18n.js", "ngc": "bundles/src/bin/ngc.js", - "ngcc": "bundles/ngcc/main-ngcc.js" + "ngcc": "bundles/ngcc/index.js" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/compiler": "14.3.0", - "typescript": ">=4.6.2 <4.9" + "@angular/compiler": "16.1.4", + "typescript": ">=4.9.3 <5.2" } }, "node_modules/@angular/core": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-14.3.0.tgz", - "integrity": "sha512-wYiwItc0Uyn4FWZ/OAx/Ubp2/WrD3EgUJ476y1XI7yATGPF8n9Ld5iCXT08HOvc4eBcYlDfh90kTXR6/MfhzdQ==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.1.4.tgz", + "integrity": "sha512-eWs++peAp+Lm2SHGfMsHAye2IOmlDKkVJ4dFf4TaZXW+AEev3FXKXLFp+dBUq8YkCKly7iAV26NXEUBOFFtplQ==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.11.4 || ~0.12.0" + "zone.js": "~0.13.0" } }, "node_modules/@angular/forms": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-14.3.0.tgz", - "integrity": "sha512-fBZZC2UFMom2AZPjGQzROPXFWO6kvCsPDKctjJwClVC8PuMrkm+RRyiYRdBbt2qxWHEqOZM2OCQo73xUyZOYHw==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.1.4.tgz", + "integrity": "sha512-JLhO7gM0WyTfr6tEWZMiCGikWLgaC/a2+tuxWsSlXUjlrbE4DyLzSAA6JqyDCFTvm9B/QzRPDfgExLTTZJY4eQ==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "14.3.0", - "@angular/core": "14.3.0", - "@angular/platform-browser": "14.3.0", + "@angular/common": "16.1.4", + "@angular/core": "16.1.4", + "@angular/platform-browser": "16.1.4", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-14.3.0.tgz", - "integrity": "sha512-Sij3OQzj1UGs1O8H9PxVAY/o27+oqZwQRnib66rsWvtbIBTjHp4FV3dTs5iVcr62GGv4V4Mff/2I82NP10GPQg==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-16.1.4.tgz", + "integrity": "sha512-FmasGUt77+GS2AFspVJR8Sg0NNlxCJJKHCHO4cch2fKXnwLZxd4aeHU0ttlVCA/hTFN50+03S3CBvru25L+74A==", "dev": true, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" } }, "node_modules/@angular/platform-browser": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.3.0.tgz", - "integrity": "sha512-w9Y3740UmTz44T0Egvc+4QV9sEbO61L+aRHbpkLTJdlEGzHByZvxJmJyBYmdqeyTPwc/Zpy7c02frlpfAlyB7A==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.1.4.tgz", + "integrity": "sha512-eQ1dBh/6ZwJVeiNGrcW6ePFmWeS+Oheu1RpuZSsvM/fI6qfsZE+or9IJ61SFvsMs65SbrO90Akc+ZXmpEidPdA==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/animations": "14.3.0", - "@angular/common": "14.3.0", - "@angular/core": "14.3.0" + "@angular/animations": "16.1.4", + "@angular/common": "16.1.4", + "@angular/core": "16.1.4" }, "peerDependenciesMeta": { "@angular/animations": { @@ -828,38 +597,38 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.3.0.tgz", - "integrity": "sha512-rneZiMrIiYRhrkQvdL40E2ErKRn4Zdo6EtjBM9pAmWeyoM8oMnOZb9gz5vhrkNWg06kVMVg0yKqluP5How7j3A==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.1.4.tgz", + "integrity": "sha512-OIszPs3NLCZWL8BEvn458JotNMdXPGyEVToNa2cEVgtakVxkhrhmoFlwJTWJN4GRkHNL5h2Vb0JLEYICwr7sgg==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "14.3.0", - "@angular/compiler": "14.3.0", - "@angular/core": "14.3.0", - "@angular/platform-browser": "14.3.0" + "@angular/common": "16.1.4", + "@angular/compiler": "16.1.4", + "@angular/core": "16.1.4", + "@angular/platform-browser": "16.1.4" } }, "node_modules/@angular/pwa": { - "version": "14.2.11", - "resolved": "https://registry.npmjs.org/@angular/pwa/-/pwa-14.2.11.tgz", - "integrity": "sha512-n5fJqkz/zpOmOhpK4sv0OhkacS994r0LQY98IJkJFTsoqo1E7hbIyRZKkKOskKKFGOwy0chcEsfg7C6rusbfiQ==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/pwa/-/pwa-16.1.4.tgz", + "integrity": "sha512-dBtTBiTZPhmHIcNHc5puCurAke2X2Z18MtqTI1JJqYl2vg+PBZqo0eZVRcEHv2+nqXx5JzPyk1frbaU11C8cVw==", "dependencies": { - "@angular-devkit/schematics": "14.2.11", - "@schematics/angular": "14.2.11", - "parse5-html-rewriting-stream": "6.0.1" + "@angular-devkit/schematics": "16.1.4", + "@schematics/angular": "16.1.4", + "parse5-html-rewriting-stream": "7.0.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/cli": "^14.0.0 || ^14.0.0-next || ^14.1.0-next" + "@angular/cli": "^16.0.0" }, "peerDependenciesMeta": { "@angular/cli": { @@ -868,26 +637,26 @@ } }, "node_modules/@angular/router": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-14.3.0.tgz", - "integrity": "sha512-uip0V7w7k7xyxxpTPbr7EuMnYLj3FzJrwkLVJSEw3TMMGHt5VU5t4BBa9veGZOta2C205XFrTAHnp8mD+XYY1w==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.1.4.tgz", + "integrity": "sha512-ooAK7XsY7fLW80htej9jHmct37biK77aNApCdiY+KlLdd45x//ObGxRYXcSSyvs7mRS0AMTGuA/G7/5AMcqcZg==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "14.3.0", - "@angular/core": "14.3.0", - "@angular/platform-browser": "14.3.0", + "@angular/common": "16.1.4", + "@angular/core": "16.1.4", + "@angular/platform-browser": "16.1.4", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/service-worker": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-14.3.0.tgz", - "integrity": "sha512-i5O7m1gQijWm7cgva0XTmOVBFrPrttNxFDwoMLMYCh8rHOCQUQ4DcVO1qTBPWU4SrY5BYPEvR+r05dYQLFYCBw==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-16.1.4.tgz", + "integrity": "sha512-ShP3nD3UOER1gf6daYkQqwfKCz/2/NhzsJIRxL9AonBB4qLDU/MzYWC3nts43+AESZfdibnF1LCWkvUmceqvGA==", "dependencies": { "tslib": "^2.3.0" }, @@ -895,11 +664,11 @@ "ngsw-config": "ngsw-config.js" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "14.3.0", - "@angular/core": "14.3.0" + "@angular/common": "16.1.4", + "@angular/core": "16.1.4" } }, "node_modules/@assemblyscript/loader": { @@ -909,46 +678,46 @@ "dev": true }, "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.3.tgz", - "integrity": "sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", + "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", + "json5": "^2.2.2", "semver": "^6.3.0" }, "engines": { @@ -969,68 +738,55 @@ } }, "node_modules/@babel/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz", + "integrity": "sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==", "dev": true, "dependencies": { - "@babel/types": "^7.18.10", + "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.3.tgz", - "integrity": "sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", + "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", "dev": true, "dependencies": { - "@babel/types": "^7.22.3" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz", - "integrity": "sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", + "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.0", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "@babel/compat-data": "^7.22.6", + "@babel/helper-validator-option": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1" }, "engines": { "node": ">=6.9.0" @@ -1039,30 +795,21 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz", - "integrity": "sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.22.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.22.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6", - "semver": "^6.3.0" + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.6.tgz", + "integrity": "sha512-iwdzgtSiBxF6ni6mzVnZCF3xt5qE6cEA0J7nFt8QOAWZ0zjCFceEgpn3vtb2V7WFR6QzP2jmIFOHMTRo7eNJjQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@nicolo-ribaudo/semver-v6": "^6.3.3" }, "engines": { "node": ">=6.9.0" @@ -1071,24 +818,27 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz", - "integrity": "sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.6.tgz", + "integrity": "sha512-nBookhLKxAWo/TUCmhnaEJyLz2dekjQvv5SRpE9epWQBcpedWLKt8aZdsuT9XV5ovzR3fENLjRXVT0GsSlGGhA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1", - "semver": "^6.3.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "regexpu-core": "^5.3.1" }, "engines": { "node": ">=6.9.0" @@ -1097,177 +847,130 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz", + "integrity": "sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@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", - "semver": "^6.1.2" + "resolve": "^1.14.2" }, "peerDependencies": { "@babel/core": "^7.4.0-0" } }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz", - "integrity": "sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name/node_modules/@babel/template": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", - "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/parser": "^7.21.9", - "@babel/types": "^7.21.5" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz", - "integrity": "sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.3" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, "dependencies": { - "@babel/types": "^7.21.4" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz", - "integrity": "sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-simple-access": "^7.21.5", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/template": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", - "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/parser": "^7.21.9", - "@babel/types": "^7.21.5" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", - "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz", + "integrity": "sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1277,149 +980,121 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz", - "integrity": "sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-member-expression-to-functions": "^7.22.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers/node_modules/@babel/template": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", - "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz", + "integrity": "sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/parser": "^7.21.9", - "@babel/types": "^7.21.5" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", - "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dev": true, "dependencies": { - "@babel/types": "^7.20.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", + "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", - "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz", + "integrity": "sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.3.tgz", - "integrity": "sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==", - "dev": true, - "dependencies": { - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/template": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", - "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/parser": "^7.21.9", - "@babel/types": "^7.21.5" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -1428,9 +1103,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.4.tgz", - "integrity": "sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1440,12 +1115,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1455,14 +1130,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz", - "integrity": "sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-transform-optional-chaining": "^7.22.3" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1472,13 +1147,13 @@ } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", - "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^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" }, @@ -1489,214 +1164,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", - "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, "engines": { "node": ">=6.9.0" }, @@ -1784,12 +1256,27 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1798,6 +1285,18 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", @@ -1912,30 +1411,29 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", - "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1944,13 +1442,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz", + "integrity": "sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { "node": ">=6.9.0" @@ -1959,13 +1460,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1974,21 +1477,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1997,14 +1492,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", - "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", + "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/template": "^7.20.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2013,43 +1507,54 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/template": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", - "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/parser": "^7.21.9", - "@babel/types": "^7.21.5" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", + "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.12.0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" @@ -2058,29 +1563,26 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2089,13 +1591,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", - "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", + "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2104,15 +1606,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2121,13 +1622,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2136,13 +1637,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", + "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2151,14 +1653,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2167,15 +1669,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", - "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", + "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-simple-access": "^7.21.5" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2184,16 +1685,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz", - "integrity": "sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2202,14 +1700,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2218,29 +1717,29 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz", - "integrity": "sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", + "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz", - "integrity": "sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2249,14 +1748,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", + "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -2265,15 +1764,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz", - "integrity": "sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2282,13 +1779,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz", - "integrity": "sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2297,13 +1795,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2312,14 +1812,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", - "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "regenerator-transform": "^0.15.1" + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2328,13 +1830,240 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", + "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", + "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", + "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", + "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz", + "integrity": "sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==", + "dev": true, + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", + "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", + "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2344,16 +2073,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", - "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.5.tgz", + "integrity": "sha512-bg4Wxd1FWeFx3daHFTWk1pkSWK/AyQuiyAoeZAOkAOUBjnZPH6KT7eMxouV47tQ6hl6ax2zyAWBdWZXbrvXlaw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.3", + "babel-plugin-polyfill-corejs3": "^0.8.1", + "babel-plugin-polyfill-regenerator": "^0.5.0", "semver": "^6.3.0" }, "engines": { @@ -2373,12 +2102,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2388,13 +2117,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2404,12 +2133,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2419,12 +2148,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2434,12 +2163,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2449,12 +2178,28 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", - "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", + "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2464,13 +2209,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2479,39 +2224,43 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/preset-env": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", - "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.10", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.9", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.5.tgz", + "integrity": "sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@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.18.6", + "@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", @@ -2521,44 +2270,61 @@ "@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-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.9", - "@babel/plugin-transform-classes": "^7.18.9", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.8", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.9", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@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.5", + "@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.5", + "@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.5", + "@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.18.10", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "core-js-compat": "^3.22.1", + "@babel/types": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.3", + "babel-plugin-polyfill-corejs3": "^0.8.1", + "babel-plugin-polyfill-regenerator": "^0.5.0", + "core-js-compat": "^3.30.2", "semver": "^6.3.0" }, "engines": { @@ -2600,45 +2366,45 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", + "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", "dev": true, "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.4.tgz", - "integrity": "sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.22.3", - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.22.4", - "@babel/types": "^7.22.4", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2646,43 +2412,26 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.3.tgz", - "integrity": "sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==", + "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/types": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.4.tgz", - "integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2711,301 +2460,261 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", - "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, - "dependencies": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" - }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=10.0.0" } }, - "node_modules/@csstools/postcss-color-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=12" } }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=12" } }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=12" } }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=12" } }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=12" } }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", - "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=12" } }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=12" } }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=12" } }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" + "node": ">=12" } }, - "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=12" } }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", - "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=12" } }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=12" } }, - "node_modules/@csstools/postcss-unset-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=12" } }, - "node_modules/@csstools/selector-specificity": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", - "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss-selector-parser": "^6.0.10" + "node": ">=12" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10.0.0" + "node": ">=12" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz", - "integrity": "sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==", + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", "cpu": [ - "loong64" + "x64" ], "dev": true, "optional": true, @@ -3016,44 +2725,134 @@ "node": ">=12" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "devOptional": true - }, - "node_modules/@iarna/toml": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@ionic/angular": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.7.4.tgz", - "integrity": "sha512-E41OEAXZFe7rhtseD0R+cEsE2qOxMBGeCGwNNdnoiWtU35+I60YM0M1NaXUd8iiSCUX6v794CETQQeazBxSORg==", - "dependencies": { - "@ionic/core": "6.7.4", - "ionicons": "^6.1.3", - "jsonc-parser": "^3.0.0", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "@angular/core": ">=12.0.0", - "@angular/forms": ">=12.0.0", - "@angular/router": ">=12.0.0", - "rxjs": ">=6.6.0", - "zone.js": ">=0.11.0" + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@ionic/cli": { - "version": "6.20.9", - "resolved": "https://registry.npmjs.org/@ionic/cli/-/cli-6.20.9.tgz", - "integrity": "sha512-sItLCi7zXq1zARWIpZDinHhK8hvy+wzOx176QMOJV90BjDybkjGYu3rGu5TBjoqn104dRIZTC8rtCsnD/P3cQw==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@ionic/cli-framework": "5.1.3", - "@ionic/cli-framework-output": "2.2.5", - "@ionic/cli-framework-prompts": "2.1.10", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" + }, + "node_modules/@ionic/angular": { + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.7.5.tgz", + "integrity": "sha512-nV8HP7RedjYkIAT8nVr5ifHNT0D3XzA74RPG3/WCCFJKunERNJ9SBiNkCTWhUpSkqsYYwEB4+SOOHz+R5NLk/w==", + "dependencies": { + "@ionic/core": "6.7.5", + "ionicons": "^6.1.3", + "jsonc-parser": "^3.0.0", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/core": ">=12.0.0", + "@angular/forms": ">=12.0.0", + "@angular/router": ">=12.0.0", + "rxjs": ">=6.6.0", + "zone.js": ">=0.11.0" + } + }, + "node_modules/@ionic/cli": { + "version": "6.20.9", + "resolved": "https://registry.npmjs.org/@ionic/cli/-/cli-6.20.9.tgz", + "integrity": "sha512-sItLCi7zXq1zARWIpZDinHhK8hvy+wzOx176QMOJV90BjDybkjGYu3rGu5TBjoqn104dRIZTC8rtCsnD/P3cQw==", + "dev": true, + "dependencies": { + "@ionic/cli-framework": "5.1.3", + "@ionic/cli-framework-output": "2.2.5", + "@ionic/cli-framework-prompts": "2.1.10", "@ionic/utils-array": "2.1.5", "@ionic/utils-fs": "3.1.6", "@ionic/utils-network": "2.1.5", @@ -3409,9 +3208,9 @@ } }, "node_modules/@ionic/core": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.7.4.tgz", - "integrity": "sha512-IG6vQtt4xrJdas6k1CwqahD/BWsYK6Gi/BAIN8TumBmtfNMu38iOG6Dh05q4hCQzmDm2xDS/BVD3Qz7AmOKArA==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.7.5.tgz", + "integrity": "sha512-zRkRn+h/Vs3xt/EVgBdShMKDyeGOM4RU31NPF2icfu3CUTH+VrMV569MUnNjYvd1Lu2xK90pYy4TaicSWmC1Pw==", "dependencies": { "@stencil/core": "^2.18.0", "ionicons": "^6.1.3", @@ -3541,6 +3340,102 @@ "node": ">=10.3.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "devOptional": true, + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "devOptional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "devOptional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "devOptional": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "devOptional": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "devOptional": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "devOptional": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -3589,13 +3484,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" @@ -3620,34 +3516,19 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.18", @@ -3672,9 +3553,9 @@ "dev": true }, "node_modules/@maskito/angular": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-0.10.0.tgz", - "integrity": "sha512-RpwN4zj//IV1Lnm1kkDlxej7XuhSlkr3VfkG+dAkl7gJsqdnLnrSFesnId564vwI6oxXZHEGzSpujXdQwje7Kg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-1.2.0.tgz", + "integrity": "sha512-2YD/MWxESVn5/nckZj4F3GArzxjN3M4V8SHhtxI4c3wtg1m8ewoO8r7o3HYk/4aVLxxR0y2bz6cOWJtawt4KoQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -3682,14 +3563,22 @@ "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@angular/forms": ">=12.0.0", - "@maskito/core": "^0.10.0", + "@maskito/core": "^1.2.0", "rxjs": ">=6.0.0" } }, "node_modules/@maskito/core": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@maskito/core/-/core-0.10.0.tgz", - "integrity": "sha512-ChCGFiA5uIOVetctbFaWjv1EDj4WdHW2cWtOFuqGbTB4+NcIn//ubccjuTEV41Pb/gR4pyO0Fkv2RRzV+cLOmA==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@maskito/core/-/core-1.2.0.tgz", + "integrity": "sha512-RFSydWYujxbVBbMzQVZ0zR77ROY3MbcuyKFWLomJWw3rDujl65M2ppz5KMeDSogAGkKnqzWudozjmBAQf2DgcA==" + }, + "node_modules/@maskito/kit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-1.2.0.tgz", + "integrity": "sha512-sMUZ3vMp3RCAcw+H/TuxyrJDgz6J5TTUCc+2/inTCE1gr33FsmhzLqoi5PaYrD146VcOKdtAxd3NJ1RK/g1ZHw==", + "peerDependencies": { + "@maskito/core": "^1.2.0" + } }, "node_modules/@materia-ui/ngx-monaco-editor": { "version": "6.0.0", @@ -3704,9 +3593,9 @@ } }, "node_modules/@ng-web-apis/common": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@ng-web-apis/common/-/common-2.1.0.tgz", - "integrity": "sha512-6DLtrsk59z9YwfR8Pm1DiExXpxvMk/RVry/mfsAKkyRmgCGICgDdyQ+eWMVhrOIyUAtt9V+DRvHUeC6iYaHKNQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@ng-web-apis/common/-/common-3.0.1.tgz", + "integrity": "sha512-pk0ibndaku/uip6MNST3/SA+sUcQZoajV2y4Mg6frfJzLq3wnKMQH25voL7wgG+XTaWvsS2OPDddPRFLn6qM7g==", "dependencies": { "tslib": "^2.2.0" }, @@ -3717,9 +3606,9 @@ } }, "node_modules/@ng-web-apis/intersection-observer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@ng-web-apis/intersection-observer/-/intersection-observer-3.0.1.tgz", - "integrity": "sha512-oTQ+oA6eFt46xs5EQcpAZTlwxabEAeAcNm0/bzo/60WPX+003HUgkHO2ipwrVia2gF+w7oJa/zCFsQ4+agql9w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@ng-web-apis/intersection-observer/-/intersection-observer-3.1.1.tgz", + "integrity": "sha512-DjJK2LiZlfoS5IxeYCV8Qq+ebgEg5sAXRGWYyh/URDzKM6zZeYl+Wf09KVFW4NXgRUPcpBanhOL3DFAdMKEpaQ==", "dependencies": { "tslib": "^2.2.0" }, @@ -3729,9 +3618,9 @@ } }, "node_modules/@ng-web-apis/mutation-observer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-2.0.0.tgz", - "integrity": "sha512-f51Cu2DloNze1HaTWdUbtYFnt9VXhzpEnHDd9KFdiKOUNfEDx7wrSXIEQqv810hrq7F2jcIAERCdiqV6ItH7Pg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-3.0.1.tgz", + "integrity": "sha512-ChzNd/Q4R+wZEHBIqnffX9BsWlHgLxhA0BtJ5OLLnBeUQ/A1O+6v20qfrVmjMzgFqB8SpF+0c9j6SpWpsZHjWw==", "dependencies": { "tslib": "^2.2.0" }, @@ -3741,9 +3630,9 @@ } }, "node_modules/@ng-web-apis/resize-observer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@ng-web-apis/resize-observer/-/resize-observer-2.0.0.tgz", - "integrity": "sha512-umuXJepTYBCI3ZcW9873fozO0qt1PeHLBNM+wXA+7Wphy35+RQcPNmkwfgkKqWceIjlYAvyuPTNWa5TM1OEeqg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@ng-web-apis/resize-observer/-/resize-observer-3.0.1.tgz", + "integrity": "sha512-2rtkX3EeS0Qk6s1lzI5PaLYvDPuC4FT4WBS0yhmI6e8ipoJttNNB+sCLgd5aWarcMXMFWIcWqpmcJxzFFF73Fg==", "dependencies": { "tslib": "^2.2.0" }, @@ -3753,21 +3642,30 @@ } }, "node_modules/@ngtools/webpack": { - "version": "14.2.11", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.2.11.tgz", - "integrity": "sha512-4enbLFAp98uTgWYF6OFceQqLcfv2/0brIrNN4iWT9xe/Mh3zdCt+eH42zvNRsqo9WXNWRSLvnx8I924p83LNlw==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.1.4.tgz", + "integrity": "sha512-+8bfavDH8eWxjlJFYr6bkjcRHhy95j+f8oNn7/sGLNu4L96nuE2AZ011XIu2dJahCnNiBvwc1EpkKa92t9rkaA==", "dev": true, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/compiler-cli": "^14.0.0", - "typescript": ">=4.6.2 <4.9", + "@angular/compiler-cli": "^16.0.0", + "typescript": ">=4.9.3 <5.2", "webpack": "^5.54.0" } }, + "node_modules/@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3804,36 +3702,34 @@ } }, "node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", "devOptional": true, "dependencies": { - "@gar/promisify": "^1.1.3", "semver": "^7.3.5" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/git": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.2.tgz", - "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", "devOptional": true, "dependencies": { - "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", + "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": "^2.0.2" + "which": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/git/node_modules/lru-cache": { @@ -3845,71 +3741,112 @@ "node": ">=12" } }, - "node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "node_modules/@npmcli/git/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "devOptional": true, "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" + "isexe": "^2.0.0" }, "bin": { - "installed-package-contents": "index.js" + "node-which": "bin/which.js" }, "engines": { - "node": ">= 10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", + "node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", "devOptional": true, "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/node-gyp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", - "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", "devOptional": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/promise-spawn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", - "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", "devOptional": true, "dependencies": { - "infer-owner": "^1.0.4" + "which": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "devOptional": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/run-script": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz", - "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", "devOptional": true, "dependencies": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "devOptional": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" } }, "node_modules/@polka/url": { @@ -3919,75 +3856,115 @@ "dev": true }, "node_modules/@rollup/plugin-json": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", - "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.0.0.tgz", + "integrity": "sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==", "dev": true, "dependencies": { - "@rollup/pluginutils": "^3.0.8" + "@rollup/pluginutils": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" }, "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", - "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.1.0.tgz", + "integrity": "sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA==", "dev": true, "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", - "is-builtin-module": "^3.1.0", + "is-builtin-module": "^3.2.1", "is-module": "^1.0.0", - "resolve": "^1.19.0" + "resolve": "^1.22.1" }, "engines": { - "node": ">= 10.0.0" + "node": ">=14.0.0" }, "peerDependencies": { - "rollup": "^2.42.0" + "rollup": "^2.78.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", "dev": true, "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">= 8.0.0" + "node": ">=14.0.0" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, "node_modules/@rollup/pluginutils/node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", "dev": true }, "node_modules/@schematics/angular": { - "version": "14.2.11", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.2.11.tgz", - "integrity": "sha512-tejU2BOc25bQO34mZmTwmtAfOiFtDE/io/yHqYgUsTn804kyMQbz2QOOXN0epdzRYrkAHvH4KV8c2LDyO6iijA==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.1.4.tgz", + "integrity": "sha512-XfoeL+aBVIR/DzgVKGVhHW/TGQnqWvngyJVuCwXEVWzNfjxHYFkchXa78OItpAvTEr6/Y0Me9FQVAGVA4mMUyg==", "dependencies": { - "@angular-devkit/core": "14.2.11", - "@angular-devkit/schematics": "14.2.11", - "jsonc-parser": "3.1.0" + "@angular-devkit/core": "16.1.4", + "@angular-devkit/schematics": "16.1.4", + "jsonc-parser": "3.2.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz", + "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==", + "devOptional": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.2.tgz", + "integrity": "sha512-vjwcYePJzM01Ha6oWWZ9gNcdIgnzyFxfqfWzph483DPJTH8Tb7f7bQRRll3CYVkyH56j0AgcPAcl6Vg95DPF+Q==", + "devOptional": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.1.0", + "tuf-js": "^1.1.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/@start9labs/argon2": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@start9labs/argon2/-/argon2-0.1.0.tgz", @@ -4021,35 +3998,35 @@ } }, "node_modules/@taiga-ui/addon-charts": { - "version": "3.33.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.33.1.tgz", - "integrity": "sha512-AL2rIt53hBq3fuV4wZjZvU/DXIz0bRMIS6IwN0/1J6J0dsawuvjAn71wVvTkI0ooI8OvDRsLyBSMPxl/QauN+w==", + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.36.0.tgz", + "integrity": "sha512-GZqhXUNNBtjX0jqPuYtYLjALTP0boV3cORnYt9/pXZ1DSXje6AyjLAmYXY/u7vlgcWAggLPd6A1GXszSOBDdIA==", "dependencies": { "tslib": ">=2.0.0" }, "peerDependencies": { "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", - "@ng-web-apis/common": ">=2.0.0", - "@taiga-ui/cdk": ">=3.33.1", - "@taiga-ui/core": ">=3.33.1", + "@ng-web-apis/common": ">=3.0.0", + "@taiga-ui/cdk": ">=3.36.0", + "@taiga-ui/core": ">=3.36.0", "@tinkoff/ng-polymorpheus": ">=4.0.0" } }, "node_modules/@taiga-ui/cdk": { - "version": "3.33.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.33.1.tgz", - "integrity": "sha512-Zo+3orOG9BrAgIxQhfWRU+arPYyZmOy7LNTOJzwc+jAw31mCcHZLBQ9Iys+DFBMUKhARO9PRytjKysKw0YR6QQ==", + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.36.0.tgz", + "integrity": "sha512-ipoL6/P8OqsVXTcP1kXP5qeQ4Dtno6893xioHmke+SQpoOYO7u9JUZgj9exdL8Zyy4SdXF456EzB9qib79GN6g==", "dependencies": { - "@ng-web-apis/common": "2.1.0", - "@ng-web-apis/mutation-observer": "2.0.0", - "@ng-web-apis/resize-observer": "2.0.0", + "@ng-web-apis/common": "3.0.1", + "@ng-web-apis/mutation-observer": "3.0.1", + "@ng-web-apis/resize-observer": "3.0.1", "@tinkoff/ng-event-plugins": "3.1.0", "@tinkoff/ng-polymorpheus": "4.1.0", - "tslib": "2.5.3" + "tslib": "2.6.0" }, "optionalDependencies": { - "ng-morph": "2.2.4", + "ng-morph": "2.2.5", "parse5": "6.0.1" }, "peerDependencies": { @@ -4061,11 +4038,11 @@ } }, "node_modules/@taiga-ui/core": { - "version": "3.33.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.33.1.tgz", - "integrity": "sha512-NIcjC9Sy0FDW8CUpq5KN803yM5XjTfoSqcbkrtHIYf90gDD/gWyJOQ6zBea+rlqjvfOcRlILu+/q+YJ48ldgWA==", + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.36.0.tgz", + "integrity": "sha512-X1l9kQLdVkN5oVNHgiFtKmCtPOneOtgI8SdPFgrhlTdNI9ve3cy4vhLWtVq441QYnTM/MIDPsTNXgRend/dDsg==", "dependencies": { - "@taiga-ui/i18n": "^3.33.1", + "@taiga-ui/i18n": "^3.36.0", "tslib": ">=2.0.0" }, "peerDependencies": { @@ -4075,19 +4052,19 @@ "@angular/forms": ">=12.0.0", "@angular/platform-browser": ">=12.0.0", "@angular/router": ">=12.0.0", - "@ng-web-apis/common": ">=2.0.0", - "@ng-web-apis/mutation-observer": ">=2.0.0", - "@taiga-ui/cdk": ">=3.33.1", - "@taiga-ui/i18n": ">=3.33.1", + "@ng-web-apis/common": ">=3.0.0", + "@ng-web-apis/mutation-observer": ">=3.0.0", + "@taiga-ui/cdk": ">=3.36.0", + "@taiga-ui/i18n": ">=3.36.0", "@tinkoff/ng-event-plugins": ">=3.1.0", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/i18n": { - "version": "3.33.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.33.1.tgz", - "integrity": "sha512-XWV+fWyIBi2sr5WK2W2MBVDE+0mxiiRMORBHkpSSl3bdUUakwKzBPktNn0Q7X8RSAhABemkmUKyGAsO5YbvU2w==", + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.36.0.tgz", + "integrity": "sha512-vl7rXDYR0LvDJrOimN+wR+7bZww7Cv1JxwsZpbrt5hxXhX5Ih36bMtBqJMEfziCL2XOuFbor2KjegllXreEHPA==", "dependencies": { "tslib": ">=2.0.0" }, @@ -4097,22 +4074,22 @@ } }, "node_modules/@taiga-ui/icons": { - "version": "3.33.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.33.1.tgz", - "integrity": "sha512-JPO/7vBXBtp1ryp0n8Al3wl6ah3mEb0GMKIPVycpX0fc8jccE7i/BtHc43ep1fMSWw/3Gg+6U4YWozMQkPbvNQ==", + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.36.0.tgz", + "integrity": "sha512-naXB46KRDfxYFxKllrpexy/+zQ1ki3IkhBfHhoFhi0WuSW3pZ2GV8kDpFI6B49FDHMQTM2FcZ2oHAC5HEGKjKw==", "dependencies": { "tslib": "^2.2.0" } }, "node_modules/@taiga-ui/kit": { - "version": "3.33.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.33.1.tgz", - "integrity": "sha512-l2OwxFitcDJe3D2YuCm/4FYI8EwWcb2Iifp1f7k9ZRn/bFcIbT90WdZMbNW2QSdIi+/8HRpyQEFwECjSejTk1Q==", - "dependencies": { - "@maskito/angular": "1.0.0", - "@maskito/core": "1.0.0", - "@maskito/kit": "1.0.0", - "@ng-web-apis/intersection-observer": "3.0.1", + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.36.0.tgz", + "integrity": "sha512-8aTKchdKmUfb6ud0iFsVnhQRg+d1zCla0coV+7n0GaHkfPd4Pp5DGiYaJMs6p9rixZM4sUyvRtYxO6p2bKaPQQ==", + "dependencies": { + "@maskito/angular": "1.2.0", + "@maskito/core": "1.2.0", + "@maskito/kit": "1.2.0", + "@ng-web-apis/intersection-observer": "3.1.1", "text-mask-core": "5.1.2", "tslib": ">=2.0.0" }, @@ -4121,44 +4098,16 @@ "@angular/core": ">=12.0.0", "@angular/forms": ">=12.0.0", "@angular/router": ">=12.0.0", - "@ng-web-apis/common": ">=2.0.0", - "@ng-web-apis/mutation-observer": ">=2.0.0", - "@ng-web-apis/resize-observer": ">=2.0.0", - "@taiga-ui/cdk": ">=3.33.1", - "@taiga-ui/core": ">=3.33.1", - "@taiga-ui/i18n": ">=3.33.1", + "@ng-web-apis/common": ">=3.0.0", + "@ng-web-apis/mutation-observer": ">=3.0.0", + "@ng-web-apis/resize-observer": ">=3.0.0", + "@taiga-ui/cdk": ">=3.36.0", + "@taiga-ui/core": ">=3.36.0", + "@taiga-ui/i18n": ">=3.36.0", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } }, - "node_modules/@taiga-ui/kit/node_modules/@maskito/angular": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-1.0.0.tgz", - "integrity": "sha512-y3uMog1Ez5l/dvWmCpiC4LnZvDvQK/JDdsVgg0YFZPQU+onnxIgdNp3S/3axN3LzuRG2bUa7xo5fBZXUt3R0JQ==", - "dependencies": { - "tslib": "^2.3.0" - }, - "peerDependencies": { - "@angular/common": ">=12.0.0", - "@angular/core": ">=12.0.0", - "@angular/forms": ">=12.0.0", - "@maskito/core": "^1.0.0", - "rxjs": ">=6.0.0" - } - }, - "node_modules/@taiga-ui/kit/node_modules/@maskito/core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@maskito/core/-/core-1.0.0.tgz", - "integrity": "sha512-zFfGkc3Ir+zNudJQF727RNkcPkwvIWI/F7UcOq4Ur2Zn/n09bYoQoW4jijJ8ZZpbf2ReCzvxFKtplGnR9s/K2Q==" - }, - "node_modules/@taiga-ui/kit/node_modules/@maskito/kit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-1.0.0.tgz", - "integrity": "sha512-LTgIPmJZk9VPv6/tC+goPbbM3tI/XCZBCuZGsPYiYuJdKZhyF0nIhPL/Aa7ymwcwSdkZZbFHZp2vub9xDsSoUA==", - "peerDependencies": { - "@maskito/core": "^1.0.0" - } - }, "node_modules/@tinkoff/ng-dompurify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@tinkoff/ng-dompurify/-/ng-dompurify-4.0.0.tgz", @@ -4265,6 +4214,28 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, + "node_modules/@tufjs/canonical-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "devOptional": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "devOptional": true, + "dependencies": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -4322,9 +4293,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.0.tgz", - "integrity": "sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", "dev": true, "dependencies": { "@types/estree": "*", @@ -4380,6 +4351,12 @@ "@types/node": "*" } }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "dev": true + }, "node_modules/@types/http-proxy": { "version": "1.17.11", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", @@ -4432,9 +4409,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.16.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.16.tgz", - "integrity": "sha512-NpaM49IGQQAUlBhHMF82QH80J08os4ZmyF9MkpCzWAGuOHqE4gTEbhzd7L3l5LmWuZ6E0OiC1FweQ4tsiW35+g==", + "version": "18.16.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.19.tgz", + "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==", "dev": true }, "node_modules/@types/node-jose": { @@ -4474,13 +4451,10 @@ "dev": true }, "node_modules/@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true }, "node_modules/@types/retry": { "version": "0.12.0", @@ -4508,11 +4482,12 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", "dev": true, "dependencies": { + "@types/http-errors": "*", "@types/mime": "*", "@types/node": "*" } @@ -4544,20 +4519,31 @@ "dev": true }, "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", "dev": true, "dependencies": { "@types/node": "*" } }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", + "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", + "dev": true, + "engines": { + "node": ">=14.6.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, - "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -4567,29 +4553,25 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, - "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -4600,15 +4582,13 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -4621,7 +4601,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, - "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -4631,7 +4610,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, - "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -4640,15 +4618,13 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -4665,7 +4641,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -4679,7 +4654,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -4692,7 +4666,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -4707,7 +4680,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" @@ -4757,9 +4729,9 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -4853,9 +4825,9 @@ } }, "node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -4895,18 +4867,6 @@ "ajv": "^8.8.2" } }, - "node_modules/angular-svg-round-progressbar": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/angular-svg-round-progressbar/-/angular-svg-round-progressbar-9.0.0.tgz", - "integrity": "sha512-q8d2AEG9u+GMAMrZY40NgejN5fHwR4iK+rRxtJ7NnMEvvuAMqt9UEtKe0SqVQHvZYE6W16L5J9yaO+TEtfRjpw==", - "dependencies": { - "tslib": "^2.3.0" - }, - "peerDependencies": { - "@angular/common": "^14.0.0", - "@angular/core": "^14.0.0" - } - }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -5089,18 +5049,6 @@ "node": ">= 4.0.0" } }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, "node_modules/autoprefixer": { "version": "10.4.14", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", @@ -5135,36 +5083,20 @@ } }, "node_modules/babel-loader": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", - "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", + "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", "dev": true, "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" + "find-cache-dir": "^3.3.2", + "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 8.9" + "node": ">= 14.15.0" }, "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/babel-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" + "@babel/core": "^7.12.0", + "webpack": ">=5" } }, "node_modules/babel-plugin-istanbul": { @@ -5184,48 +5116,39 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz", + "integrity": "sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.1", + "@nicolo-ribaudo/semver-v6": "^6.3.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz", + "integrity": "sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.2", - "core-js-compat": "^3.21.0" + "@babel/helper-define-polyfill-provider": "^0.4.1", + "core-js-compat": "^3.31.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz", + "integrity": "sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "@babel/helper-define-polyfill-provider": "^0.4.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -5430,9 +5353,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", - "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "dev": true, "funding": [ { @@ -5449,8 +5372,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001489", - "electron-to-chromium": "^1.4.411", + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", "node-releases": "^2.0.12", "update-browserslist-db": "^1.0.11" }, @@ -5521,32 +5444,26 @@ } }, "node_modules/cacache": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.2.tgz", - "integrity": "sha512-Xx+xPlfCZIUHagysjjOAje9nRo8pRDczQCcXb4J2O0BLtH+xeVue6ba4y1kfJfQMAnM2mkcoMIAyOctlaRGWYA==", + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.3.tgz", + "integrity": "sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==", "devOptional": true, "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", + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", "lru-cache": "^7.7.1", - "minipass": "^3.1.6", + "minipass": "^5.0.0", "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", + "ssri": "^10.0.0", "tar": "^6.1.11", - "unique-filename": "^1.1.1" + "unique-filename": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/cacache/node_modules/lru-cache": { @@ -5589,9 +5506,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001495", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001495.tgz", - "integrity": "sha512-F6x5IEuigtUfU5ZMQK2jsy5JqUUlEFRVZq8bO2a+ysq5K7jD6PPc9YXZj78xDNS3uNchesp1Jw47YXEqr+Viyg==", + "version": "1.0.30001514", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001514.tgz", + "integrity": "sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ==", "dev": true, "funding": [ { @@ -5849,14 +5766,17 @@ } }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "devOptional": true, "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/clone": { @@ -6133,29 +6053,10 @@ "node": ">=10.13.0" } }, - "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/core-js": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.2.tgz", - "integrity": "sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg==", + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.31.1.tgz", + "integrity": "sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -6163,12 +6064,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", - "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", + "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", "dev": true, "dependencies": { - "browserslist": "^4.21.5" + "browserslist": "^4.21.9" }, "funding": { "type": "opencollective", @@ -6238,16 +6139,17 @@ "dev": true }, "node_modules/critters": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", - "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "version": "0.0.19", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.19.tgz", + "integrity": "sha512-Fm4ZAXsG0VzWy1U30rP4qxbaWGSsqXDgSupJW1OUJGDAs0KWC+j37v7p5a2kZ9BPJvhRzWm3be+Hc9WvQOBUOw==", "dev": true, "dependencies": { "chalk": "^4.1.0", - "css-select": "^4.2.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "postcss": "^8.3.7", + "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" } }, @@ -6341,7 +6243,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, + "devOptional": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -6351,56 +6253,20 @@ "node": ">= 8" } }, - "node_modules/css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-blank-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-has-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, "node_modules/css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.7", + "postcss": "^8.4.21", "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.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.5" + "semver": "^7.3.8" }, "engines": { "node": ">= 12.13.0" @@ -6413,31 +6279,16 @@ "webpack": "^5.0.0" } }, - "node_modules/css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "dev": true, - "bin": { - "css-prefers-color-scheme": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, "dependencies": { "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", "nth-check": "^2.0.1" }, "funding": { @@ -6456,22 +6307,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/cssdb": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.6.0.tgz", - "integrity": "sha512-Nna7rph8V0jC6+JBY4Vk4ndErUmfJfV6NJCaZdurL0omggabiy+QB2HCQtu5c/ACLZ0I7REv7A4QyPIoYzZx0w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - } - ] - }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -6524,15 +6359,6 @@ "node": ">=0.10.0" } }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -6778,19 +6604,31 @@ } }, "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/dom7": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/dom7/-/dom7-4.0.6.tgz", @@ -6812,12 +6650,12 @@ ] }, "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "dependencies": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" }, "engines": { "node": ">= 4" @@ -6827,19 +6665,19 @@ } }, "node_modules/dompurify": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz", - "integrity": "sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==" + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.6.tgz", + "integrity": "sha512-RQ9Ue979JnMiQ3a5E9KT3DLbUj9NCeulCZvVqnFRy+lj8j8sL9fmsUaGJTkhRts/74IM5HxPal5jaPjrTpH8zQ==" }, "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" @@ -6894,7 +6732,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "devOptional": true }, "node_modules/ee-first": { "version": "1.1.1", @@ -6903,9 +6741,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.424", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.424.tgz", - "integrity": "sha512-KOfOIoEE0b3L0CTDgqS+NpokmcBdxpqLIPtp9PL0v5GAMZmZXa9uoUfWJdEy63MNy6jMvKHkBVUYY5DSuqqpdw==", + "version": "1.4.454", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz", + "integrity": "sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==", "dev": true }, "node_modules/elementtree": { @@ -6981,9 +6819,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.14.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", - "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -7039,11 +6877,10 @@ } }, "node_modules/es-module-lexer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", - "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", - "dev": true, - "peer": true + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "dev": true }, "node_modules/es6-promise": { "version": "4.2.8", @@ -7051,12 +6888,11 @@ "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, "node_modules/esbuild": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.5.tgz", - "integrity": "sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", "dev": true, "hasInstallScript": true, - "optional": true, "bin": { "esbuild": "bin/esbuild" }, @@ -7064,305 +6900,34 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/linux-loong64": "0.15.5", - "esbuild-android-64": "0.15.5", - "esbuild-android-arm64": "0.15.5", - "esbuild-darwin-64": "0.15.5", - "esbuild-darwin-arm64": "0.15.5", - "esbuild-freebsd-64": "0.15.5", - "esbuild-freebsd-arm64": "0.15.5", - "esbuild-linux-32": "0.15.5", - "esbuild-linux-64": "0.15.5", - "esbuild-linux-arm": "0.15.5", - "esbuild-linux-arm64": "0.15.5", - "esbuild-linux-mips64le": "0.15.5", - "esbuild-linux-ppc64le": "0.15.5", - "esbuild-linux-riscv64": "0.15.5", - "esbuild-linux-s390x": "0.15.5", - "esbuild-netbsd-64": "0.15.5", - "esbuild-openbsd-64": "0.15.5", - "esbuild-sunos-64": "0.15.5", - "esbuild-windows-32": "0.15.5", - "esbuild-windows-64": "0.15.5", - "esbuild-windows-arm64": "0.15.5" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz", - "integrity": "sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz", - "integrity": "sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz", - "integrity": "sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz", - "integrity": "sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz", - "integrity": "sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz", - "integrity": "sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz", - "integrity": "sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz", - "integrity": "sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz", - "integrity": "sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz", - "integrity": "sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz", - "integrity": "sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz", - "integrity": "sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz", - "integrity": "sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz", - "integrity": "sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz", - "integrity": "sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz", - "integrity": "sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz", - "integrity": "sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" } }, "node_modules/esbuild-wasm": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.5.tgz", - "integrity": "sha512-lTJOEKekN/4JI/eOEq0wLcx53co2N6vaT/XjBz46D1tvIVoUEyM0o2K6txW6gEotf31szFD/J1PbxmnbkGlK9A==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.19.tgz", + "integrity": "sha512-X9UQEMJMZXwlGCfqcBmJ1jEa+KrLfd+gCBypO/TSzo5hZvbVwFqpxj1YCuX54ptTF75wxmrgorR4RL40AKtLVg==", "dev": true, "bin": { "esbuild": "bin/esbuild" @@ -7371,54 +6936,6 @@ "node": ">=12" } }, - "node_modules/esbuild-windows-32": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz", - "integrity": "sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz", - "integrity": "sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz", - "integrity": "sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -7532,9 +7049,9 @@ } }, "node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, "node_modules/esutils": { @@ -7599,6 +7116,12 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "devOptional": true + }, "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -7889,14 +7412,42 @@ } } }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "devOptional": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "devOptional": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" }, "engines": { @@ -7960,15 +7511,15 @@ } }, "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz", + "integrity": "sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==", "devOptional": true, "dependencies": { - "minipass": "^3.0.0" + "minipass": "^5.0.0" }, "engines": { - "node": ">= 8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/fs-monkey": { @@ -8179,19 +7730,22 @@ } }, "node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", "devOptional": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -8225,14 +7779,14 @@ } }, "node_modules/globby": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", - "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "dependencies": { "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", "merge2": "^1.4.1", "slash": "^4.0.0" }, @@ -8243,6 +7797,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globby/node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -8367,15 +7937,15 @@ } }, "node_modules/hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", "devOptional": true, "dependencies": { "lru-cache": "^7.5.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/hosted-git-info/node_modules/lru-cache": { @@ -8430,10 +8000,51 @@ } }, "node_modules/html-entities": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.5.tgz", - "integrity": "sha512-72TJlcMkYsEJASa/3HnX7VT59htM7iSHbH59NSZbtc+22Ap0Txnlx91sfeB+/A7wNZg7UxtZdhAW4y+/jimrdg==", - "dev": true + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } }, "node_modules/http-cache-semantics": { "version": "4.1.1", @@ -8787,15 +8398,15 @@ } }, "node_modules/ignore-walk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", - "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", + "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", "devOptional": true, "dependencies": { - "minimatch": "^5.0.1" + "minimatch": "^9.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/image-size": { @@ -8860,12 +8471,6 @@ "node": ">=8" } }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "devOptional": true - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -8882,12 +8487,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.0.tgz", - "integrity": "sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", "devOptional": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/injection-js": { @@ -9262,6 +8867,24 @@ "semver": "bin/semver.js" } }, + "node_modules/jackspeak": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", + "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", + "devOptional": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -9300,6 +8923,15 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jiti": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", + "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/jose": { "version": "4.14.4", "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", @@ -9341,7 +8973,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "devOptional": true + "dev": true }, "node_modules/json-schema-traverse": { "version": "1.0.0", @@ -9361,9 +8993,9 @@ } }, "node_modules/jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" }, "node_modules/jsonfile": { "version": "6.1.0", @@ -9413,6 +9045,16 @@ "node": ">= 8" } }, + "node_modules/launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, "node_modules/leek": { "version": "0.0.24", "resolved": "https://registry.npmjs.org/leek/-/leek-0.0.24.tgz", @@ -9466,9 +9108,9 @@ } }, "node_modules/less-loader": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.0.0.tgz", - "integrity": "sha512-9+LOWWjuoectIEx3zrfN83NAGxSUB5pWEabbbidVQVgZhN+wN68pOvuyirVlH1IK4VT1f3TmlyvAnCXh8O5KEw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", "dev": true, "dependencies": { "klona": "^2.0.4" @@ -9499,16 +9141,6 @@ "node": ">=6" } }, - "node_modules/less/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } - }, "node_modules/less/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -9575,9 +9207,9 @@ "dev": true }, "node_modules/lint-staged": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.2.tgz", - "integrity": "sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==", + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.3.tgz", + "integrity": "sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==", "dev": true, "dependencies": { "chalk": "5.2.0", @@ -10010,11 +9642,11 @@ } }, "node_modules/magic-string": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", - "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", "dependencies": { - "sourcemap-codec": "^1.4.8" + "@jridgewell/sourcemap-codec": "^1.4.13" }, "engines": { "node": ">=12" @@ -10051,30 +9683,29 @@ "dev": true }, "node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "devOptional": true, "dependencies": { "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", + "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": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", + "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": "^9.0.0" + "ssri": "^10.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/make-fetch-happen/node_modules/lru-cache": { @@ -10217,9 +9848,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", - "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", "dev": true, "dependencies": { "schema-utils": "^4.0.0" @@ -10235,25 +9866,6 @@ "webpack": "^5.0.0" } }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -10261,15 +9873,18 @@ "dev": true }, "node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "devOptional": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -10282,13 +9897,10 @@ } }, "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "devOptional": true, - "dependencies": { - "yallist": "^4.0.0" - }, "engines": { "node": ">=8" } @@ -10305,18 +9917,36 @@ "node": ">= 8" } }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "devOptional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + }, "node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", + "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", "devOptional": true, "dependencies": { - "minipass": "^3.1.6", + "minipass": "^5.0.0", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, "optionalDependencies": { "encoding": "^0.1.13" @@ -10334,6 +9964,24 @@ "node": ">= 8" } }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "devOptional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + }, "node_modules/minipass-json-stream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", @@ -10344,6 +9992,24 @@ "minipass": "^3.0.0" } }, + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "devOptional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-json-stream/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + }, "node_modules/minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", @@ -10356,6 +10022,24 @@ "node": ">=8" } }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "devOptional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + }, "node_modules/minipass-sized": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", @@ -10368,7 +10052,19 @@ "node": ">=8" } }, - "node_modules/minipass/node_modules/yallist": { + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "devOptional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", @@ -10387,6 +10083,18 @@ "node": ">= 8" } }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "devOptional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minizlib/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -10584,9 +10292,9 @@ } }, "node_modules/ng-morph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/ng-morph/-/ng-morph-2.2.4.tgz", - "integrity": "sha512-4AIsjcvUAT6htnX56DsUPZDQuNhWxmi09exUS6TreD6hKghGuqT3QfRf+K9aFw1FJyCsLsh/0py3S/sMtarsIA==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/ng-morph/-/ng-morph-2.2.5.tgz", + "integrity": "sha512-plxrHfcz7aNRcTCxS9tUxI1F5Vfx5CZAAw8NAnJCyCb41Js6S+EyPDvn2v7H2QyfZzXU1H0BAqtiRQv/rE2zTA==", "optional": true, "dependencies": { "jsonc-parser": "3.0.0", @@ -10628,71 +10336,74 @@ } }, "node_modules/ng-packagr": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-14.2.2.tgz", - "integrity": "sha512-AqwHcMM6x+JkCHT++IsbulnTdyoXcC2Cr4tbPamuieacc77+fFbB195hdcqEFwsKX5410cymx/ZUyHird9rxlg==", - "dev": true, - "dependencies": { - "@rollup/plugin-json": "^4.1.0", - "@rollup/plugin-node-resolve": "^13.1.3", - "ajv": "^8.10.0", - "ansi-colors": "^4.1.1", - "browserslist": "^4.20.0", - "cacache": "^16.0.0", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-16.1.0.tgz", + "integrity": "sha512-NbgzDRtRiYJi98Ssky7U5GoicZz7VkR3OW5qd9q3dt3H/JNqLh2PwB745NFG2cT00lEvfrY6LJ1NAcOjoWDibA==", + "dev": true, + "dependencies": { + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^15.0.0", + "ajv": "^8.11.0", + "ansi-colors": "^4.1.3", + "autoprefixer": "^10.4.12", + "browserslist": "^4.21.4", + "cacache": "^17.0.0", "chokidar": "^3.5.3", - "commander": "^9.0.0", + "commander": "^10.0.0", + "convert-source-map": "^2.0.0", "dependency-graph": "^0.11.0", - "esbuild-wasm": "^0.15.0", + "esbuild-wasm": "^0.17.0", + "fast-glob": "^3.2.12", "find-cache-dir": "^3.3.2", - "glob": "^8.0.0", "injection-js": "^2.4.0", - "jsonc-parser": "^3.0.0", - "less": "^4.1.2", + "jsonc-parser": "^3.2.0", + "less": "^4.1.3", "ora": "^5.1.0", - "postcss": "^8.4.8", - "postcss-preset-env": "^7.4.2", + "piscina": "^3.2.0", + "postcss": "^8.4.16", "postcss-url": "^10.1.3", - "rollup": "^2.70.0", - "rollup-plugin-sourcemaps": "^0.6.3", - "rxjs": "^7.5.5", - "sass": "^1.49.9", - "stylus": "^0.59.0" + "rollup": "^3.0.0", + "rxjs": "^7.5.6", + "sass": "^1.55.0" }, "bin": { "ng-packagr": "cli/main.js" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "optionalDependencies": { - "esbuild": "^0.15.0" + "esbuild": "^0.17.0" }, "peerDependencies": { - "@angular/compiler-cli": "^14.0.0 || ^14.0.0-next || ^14.2.0-next", + "@angular/compiler-cli": "^16.0.0 || ^16.1.0-next.0", + "tailwindcss": "^2.0.0 || ^3.0.0", "tslib": "^2.3.0", - "typescript": ">=4.6.2 <4.9" + "typescript": ">=4.9.3 <5.2" + }, + "peerDependenciesMeta": { + "tailwindcss": { + "optional": true + } } }, - "node_modules/ng-packagr/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || >=14" - } + "node_modules/ng-packagr/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true }, "node_modules/ng-qrcode": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ng-qrcode/-/ng-qrcode-7.0.0.tgz", - "integrity": "sha512-Mx7nf8rtGMVYxGe2qfy8/JNiCnxKD7uFsqpP2Hm5eJSQrOEapQl9FR0yuK0I4MMQorJ7s8mZZDxmszQiH8R2Kg==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/ng-qrcode/-/ng-qrcode-16.0.0.tgz", + "integrity": "sha512-AVp3Tw1bAwqiHzt57x1Rp7YrnzkMUNlww1+ypjGvgbMPRYmy//cHOzMYsH3HPkFDDmPHwGerdAElmIA/X4SBiQ==", "dependencies": { - "qrcode": "^1.5.0", + "qrcode": "^1.5.1", "tslib": "^2.4.0" }, "peerDependencies": { - "@angular/common": ">=14 <15", - "@angular/core": ">=14 <15" + "@angular/common": ">=16 <17", + "@angular/core": ">=16 <17" } }, "node_modules/nice-napi": { @@ -10726,15 +10437,16 @@ } }, "node_modules/node-gyp": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", - "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", + "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", "devOptional": true, "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", + "make-fetch-happen": "^11.0.3", "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", @@ -10813,6 +10525,65 @@ "he": "1.2.0" } }, + "node_modules/node-html-parser/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/node-html-parser/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/node-html-parser/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/node-html-parser/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/node-jose": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/node-jose/-/node-jose-2.2.0.tgz", @@ -10838,9 +10609,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/nopt": { @@ -10859,18 +10630,18 @@ } }, "node_modules/normalize-package-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", - "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", "devOptional": true, "dependencies": { - "hosted-git-info": "^5.0.0", + "hosted-git-info": "^6.0.0", "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/normalize-path": { @@ -10892,117 +10663,96 @@ } }, "node_modules/npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", "devOptional": true, "dependencies": { - "npm-normalize-package-bin": "^1.0.1" + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-install-checks": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", - "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.1.1.tgz", + "integrity": "sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==", "devOptional": true, "dependencies": { "semver": "^7.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "devOptional": true - }, - "node_modules/npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "devOptional": true, - "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-packlist": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", - "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", + "node_modules/npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", "devOptional": true, "dependencies": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "bin": { - "npm-packlist": "bin/index.js" + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-packlist/node_modules/npm-bundled": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", - "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", + "node_modules/npm-packlist": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", "devOptional": true, "dependencies": { - "npm-normalize-package-bin": "^2.0.0" + "ignore-walk": "^6.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", - "devOptional": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-pick-manifest": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz", - "integrity": "sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", + "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", "devOptional": true, "dependencies": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^9.0.0", + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", "semver": "^7.3.5" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-registry-fetch": { - "version": "13.3.1", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz", - "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", "devOptional": true, "dependencies": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", + "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": "^9.0.1", - "proc-log": "^2.0.0" + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-run-path": { @@ -11120,9 +10870,9 @@ } }, "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "devOptional": true, "dependencies": { "define-lazy-prop": "^2.0.0", @@ -11430,38 +11180,35 @@ "dev": true }, "node_modules/pacote": { - "version": "13.6.2", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.2.tgz", - "integrity": "sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", "devOptional": true, "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", + "@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": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", + "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" }, "bin": { "pacote": "lib/bin.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/pako": { @@ -11511,32 +11258,75 @@ "node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "optional": true }, "node_modules/parse5-html-rewriting-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", - "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", "dependencies": { - "parse5": "^6.0.1", - "parse5-sax-parser": "^6.0.1" + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, + "node_modules/parse5-html-rewriting-stream/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dependencies": { - "parse5": "^6.0.1" + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parse5-sax-parser": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", - "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-sax-parser/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parse5-sax-parser/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dependencies": { - "parse5": "^6.0.1" + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parseurl": { @@ -11579,7 +11369,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, + "devOptional": true, "engines": { "node": ">=8" } @@ -11590,6 +11380,31 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "devOptional": true }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "devOptional": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", + "devOptional": true, + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -11651,12 +11466,13 @@ } }, "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, + "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, "node_modules/piscina": { @@ -11703,9 +11519,9 @@ } }, "node_modules/postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", "dev": true, "funding": [ { @@ -11715,10 +11531,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -11726,813 +11546,12301 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "node_modules/postcss-loader": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.2.tgz", + "integrity": "sha512-c7qDlXErX6n0VT+LUsW+nwefVtTu3ORtVvK8EXuUIDcxo+b/euYqpuHlJAvePb0Af5e8uMjR/13e0lTuYifaig==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.10" + "cosmiconfig": "^8.1.3", + "jiti": "^1.18.2", + "klona": "^2.0.6", + "semver": "^7.3.8" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/csstools" + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "postcss": "^8.2" + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" } }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" }, "engines": { - "node": ">=7.6.0" + "node": ">=14" }, - "peerDependencies": { - "postcss": "^8.4.6" + "funding": { + "url": "https://github.com/sponsors/d-fischer" } }, - "node_modules/postcss-color-functional-notation": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "node": "^10 || ^12 || >= 14" }, "peerDependencies": { - "postcss": "^8.2" + "postcss": "^8.1.0" } }, - "node_modules/postcss-color-hex-alpha": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "node": "^10 || ^12 || >= 14" }, "peerDependencies": { - "postcss": "^8.4" + "postcss": "^8.1.0" } }, - "node_modules/postcss-color-rebeccapurple": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "postcss-selector-parser": "^6.0.4" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "node": "^10 || ^12 || >= 14" }, "peerDependencies": { - "postcss": "^8.2" + "postcss": "^8.1.0" } }, - "node_modules/postcss-custom-media": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "icss-utils": "^5.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "node": "^10 || ^12 || >= 14" }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.1.0" } }, - "node_modules/postcss-custom-properties": { - "version": "12.1.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", - "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=4" } }, - "node_modules/postcss-custom-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "node_modules/postcss-url": { + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-10.1.3.tgz", + "integrity": "sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.4" + "make-dir": "~3.1.0", + "mime": "~2.5.2", + "minimatch": "~3.0.4", + "xxhashjs": "~0.2.2" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "node": ">=10" }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.0.0" } }, - "node_modules/postcss-dir-pseudo-class": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "node_modules/postcss-url/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/postcss-double-position-gradients": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "node_modules/postcss-url/node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" + "bin": { + "mime": "cli.js" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=4.0.0" } }, - "node_modules/postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "node_modules/postcss-url/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" + "node": "*" } }, - "node_modules/postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" + "node": ">= 0.8.0" } }, - "node_modules/postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" + "bin": { + "prettier": "bin-prettier.js" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=10.13.0" }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "dev": true, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/postcss-gap-properties": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-image-set-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, + "node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "devOptional": true, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/postcss-import": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.0.0.tgz", - "integrity": "sha512-Y20shPQ07RitgBGv2zvkEAu9bqvrD77C9axhj/aA1BQj4czape2MdClCExvB27EwYEJdGgKZBpKanb0t1rK2Kg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" + "node": ">= 0.6.0" } }, - "node_modules/postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "dev": true, - "peerDependencies": { - "postcss": "^8.0.0" - } + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true }, - "node_modules/postcss-lab-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", - "dev": true, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "devOptional": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "devOptional": true, "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" + "err-code": "^2.0.2", + "retry": "^0.12.0" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=10" } }, - "node_modules/postcss-loader": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", - "integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==", + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.7" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" + "node": ">= 0.10" } }, - "node_modules/postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" + "node": ">= 0.10" } }, - "node_modules/postcss-media-minmax": { + "node_modules/proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", "dev": true, - "engines": { - "node": ">=10.0.0" + "dependencies": { + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^5.0.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" }, - "peerDependencies": { - "postcss": "^8.1.0" + "engines": { + "node": ">= 8" } }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "node_modules/proxy-agent/node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">= 6" } }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "node_modules/proxy-agent/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">= 6" } }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "node_modules/proxy-agent/node_modules/socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.4" + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" }, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">= 6" } }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qrcode": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz", + "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==", + "dependencies": { + "dijkstrajs": "^1.0.1", + "encode-utf8": "^1.0.3", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" }, - "peerDependencies": { - "postcss": "^8.1.0" + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" } }, - "node_modules/postcss-nesting": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", - "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", - "dev": true, + "node_modules/qrcode/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" + "color-convert": "^2.0.1" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/qrcode/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/qrcode/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" }, - "peerDependencies": { - "postcss": "^8.2" + "engines": { + "node": ">=7.0.0" } }, - "node_modules/postcss-opacity-percentage": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", - "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", - "dev": true, - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], + "node_modules/qrcode/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/qrcode/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/qrcode/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "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" }, - "peerDependencies": { - "postcss": "^8.2" + "engines": { + "node": ">=8" } }, - "node_modules/postcss-overflow-shorthand": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "node_modules/qrcode/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "side-channel": "^1.0.4" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=0.6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "devOptional": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, - "peerDependencies": { - "postcss": "^8" + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" } }, - "node_modules/postcss-place": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-preset-env": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.0.tgz", - "integrity": "sha512-leqiqLOellpLKfbHkD06E04P6d9ZQ24mat6hu4NSqun7WG0UhspHR5Myiv/510qouCjoo4+YJtNOqg5xHaFnCA==", - "dev": true, - "dependencies": { - "@csstools/postcss-cascade-layers": "^1.0.5", - "@csstools/postcss-color-function": "^1.1.1", - "@csstools/postcss-font-format-keywords": "^1.0.1", - "@csstools/postcss-hwb-function": "^1.0.2", - "@csstools/postcss-ic-unit": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^2.0.7", - "@csstools/postcss-nested-calc": "^1.0.0", - "@csstools/postcss-normalize-display-values": "^1.0.1", - "@csstools/postcss-oklab-function": "^1.1.1", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "@csstools/postcss-stepped-value-functions": "^1.0.1", - "@csstools/postcss-text-decoration-shorthand": "^1.0.0", - "@csstools/postcss-trigonometric-functions": "^1.0.2", - "@csstools/postcss-unset-value": "^1.0.2", - "autoprefixer": "^10.4.8", - "browserslist": "^4.21.3", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^7.0.0", - "postcss-attribute-case-insensitive": "^5.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.4", - "postcss-color-hex-alpha": "^8.0.4", - "postcss-color-rebeccapurple": "^7.1.1", - "postcss-custom-media": "^8.0.2", - "postcss-custom-properties": "^12.1.8", - "postcss-custom-selectors": "^6.0.3", - "postcss-dir-pseudo-class": "^6.0.5", - "postcss-double-position-gradients": "^3.1.2", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.5", - "postcss-image-set-function": "^4.0.7", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.2.1", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.1.10", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.4", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.5", - "postcss-pseudo-class-any-link": "^7.1.6", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^6.0.1", - "postcss-value-parser": "^4.2.0" + "node": ">= 0.8" + } + }, + "node_modules/raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/csstools" + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "postcss": "^8.2" + "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "node_modules/raw-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "node_modules/raw-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, "peerDependencies": { - "postcss": "^8.0.3" + "ajv": "^6.9.1" } }, - "node_modules/postcss-selector-not": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "node_modules/raw-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/raw-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.10" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "node": ">=8.9.0" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "node_modules/raw-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/read-package-json": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", + "devOptional": true, + "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" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "devOptional": true, + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "devOptional": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "devOptional": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "devOptional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", + "dev": true + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" }, "engines": { "node": ">=4" } }, - "node_modules/postcss-url": { + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "devOptional": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "devOptional": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "devOptional": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "devOptional": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "devOptional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "devOptional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "devOptional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rollup": { + "version": "3.26.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.2.tgz", + "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true, + "engines": { + "node": "0.12.* || 4.* || 6.* || >= 7.*" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "devOptional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "devOptional": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "devOptional": true + }, + "node_modules/sass": { + "version": "1.63.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.63.2.tgz", + "integrity": "sha512-u56TU0AIFqMtauKl/OJ1AeFsXqRHkgO7nCWmHaDwfxDo9GUMSqBA4NEh6GMuh1CYVM7zuROYtZrHzPc2ixK+ww==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-loader": { + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.1.tgz", + "integrity": "sha512-cBTxmgyVA1nXPvIK4brjJMXOMJ2v2YrQEuHqLw3LylGb3gsR6jAvdjHMcy/+JGTmmIF9SauTrLLR7bsWDMWqgg==", + "dev": true, + "dependencies": { + "klona": "^2.0.6", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dev": true, + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "devOptional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true + }, + "node_modules/semver-regex": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", + "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "devOptional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "devOptional": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/sigstore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.7.0.tgz", + "integrity": "sha512-KP7QULhWdlu3hlp+jw2EvgWKlOGOY9McLj/jrchLjHNlNPK0KWIwF919cbmOp6QiKXLmPijR2qH/5KYWlbtG9Q==", + "devOptional": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.1.0", + "@sigstore/tuf": "^1.0.1", + "make-fetch-happen": "^11.0.1" + }, + "bin": { + "sigstore": "bin/sigstore.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/sirv": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "devOptional": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "devOptional": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "devOptional": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", + "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" + } + }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "devOptional": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "devOptional": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "devOptional": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "devOptional": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "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" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "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" + } + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/ssh-config": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/ssh-config/-/ssh-config-1.1.6.tgz", + "integrity": "sha512-ZPO9rECxzs5JIQ6G/2EfL1I9ho/BVZkx9HRKn8+0af7QgwAmumQ7XBFP1ggMyPMo+/tUbmv0HFdv4qifdO/9JA==", + "dev": true + }, + "node_modules/ssr-window": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-4.0.2.tgz", + "integrity": "sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ==" + }, + "node_modules/ssri": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", + "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", + "devOptional": true, + "dependencies": { + "minipass": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dev": true, + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-combiner2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "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" + } + }, + "node_modules/stream-combiner2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/stream-combiner2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "devOptional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "devOptional": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/superagent": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.3.1.tgz", + "integrity": "sha512-wjJ/MoTid2/RuGCOFtlacyGNxN9QLMgcpYLDQlWFIhhdJ93kNscFonGvrpAHSCVjRVj++DGCglocF7Aej1KHvQ==", + "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", + "dev": true, + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 7.0.0" + } + }, + "node_modules/superagent-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-3.0.0.tgz", + "integrity": "sha512-wAlRInOeDFyd9pyonrkJspdRAxdLrcsZ6aSnS+8+nu4x1aXbz6FWSTT9M6Ibze+eG60szlL7JA8wEIV7bPWuyQ==", + "dev": true, + "dependencies": { + "debug": "^4.3.2", + "proxy-agent": "^5.0.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "superagent": ">= 0.15.4 || 1 || 2 || 3" + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "devOptional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swiper": { + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-8.4.7.tgz", + "integrity": "sha512-VwO/KU3i9IV2Sf+W2NqyzwWob4yX9Qdedq6vBtS0rFqJ6Fa5iLUJwxQkuD4I38w0WDJwmFl8ojkdcRFPHWD+2g==", + "funding": [ + { + "type": "patreon", + "url": "https://www.patreon.com/swiperjs" + }, + { + "type": "open_collective", + "url": "http://opencollective.com/swiper" + } + ], + "hasInstallScript": true, + "dependencies": { + "dom7": "^4.0.4", + "ssr-window": "^4.0.2" + }, + "engines": { + "node": ">= 4.7.0" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "devOptional": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "devOptional": true, + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "devOptional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "devOptional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + }, + "node_modules/terser": { + "version": "5.17.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.7.tgz", + "integrity": "sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-mask-core": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/text-mask-core/-/text-mask-core-5.1.2.tgz", + "integrity": "sha512-VfkCMdmRRZqXgQZFlDMiavm3hzsMzBM23CxHZsaeAYg66ZhXCNJWrFmnJwNy8KF9f74YvAUAuQenxsMCfuvhUw==" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "devOptional": true + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "devOptional": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "devOptional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-matches": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ts-matches/-/ts-matches-5.4.1.tgz", + "integrity": "sha512-kXrY75F0s0WD15N2bWKDScKlKgwnusN6dTRzGs1N7LlxQRnazrsBISC1HL4sy2adsyk65Zbx3Ui3IGN8leAFOQ==" + }, + "node_modules/ts-morph": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-10.0.2.tgz", + "integrity": "sha512-TVuIfEqtr9dW25K3Jajqpqx7t/zLRFxKu2rXQZSDjTm4MO4lfmuj1hn8WEryjeDDBFcNOCi+yOmYUYR4HucrAg==", + "optional": true, + "dependencies": { + "@ts-morph/common": "~0.9.0", + "code-block-writer": "^10.1.1" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + }, + "node_modules/tslint": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.13.0", + "tsutils": "^2.29.0" + }, + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + }, + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" + } + }, + "node_modules/tslint/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/tslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/tslint/node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslint/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/tslint/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tslint/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/tslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tslint/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/tslint/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/tslint/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tuf-js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "devOptional": true, + "dependencies": { + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "devOptional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "devOptional": true, + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "devOptional": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "devOptional": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "devOptional": true, + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "dev": true, + "dependencies": { + "esbuild": "^0.17.5", + "postcss": "^8.4.23", + "rollup": "^3.21.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vm2": { + "version": "3.9.19", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.19.tgz", + "integrity": "sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==", + "dev": true, + "dependencies": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + }, + "bin": { + "vm2": "bin/vm2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webpack": { + "version": "5.88.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz", + "integrity": "sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==", + "dev": true, + "peer": true, + "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" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.0.tgz", + "integrity": "sha512-+bXGmO1LyiNx0i9enBu3H8mv42sj/BJWhZNFwjz92tVnBa9J3JMGo2an2IXlEleoDOPn/Hofl5hr/xCpObUDtw==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", + "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz", + "integrity": "sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ==", + "dev": true, + "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.1", + "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" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dev": true, + "dependencies": { + "typed-assert": "^1.0.8" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/webpack/node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true, + "peer": true + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "peer": true + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "devOptional": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" + }, + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "devOptional": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/windows-release": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", + "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", + "dev": true, + "dependencies": { + "execa": "^4.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/windows-release/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/windows-release/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/windows-release/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/windows-release/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "devOptional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "devOptional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "devOptional": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "devOptional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "devOptional": true + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "devOptional": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "devOptional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "devOptional": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "devOptional": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/xxhashjs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", + "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", + "dev": true, + "dependencies": { + "cuint": "^0.2.2" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "devOptional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "devOptional": true, + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "devOptional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zone.js": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.1.tgz", + "integrity": "sha512-+bIeDAFEBYuXRuU3qGQvzdPap+N1zjM4KkBAiiQuVVCrHrhjDuY6VkUhNa5+U27+9w0q3fbKiMCbpJ0XzMmSWA==", + "dependencies": { + "tslib": "^2.3.0" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@angular-devkit/architect": { + "version": "0.1601.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1601.4.tgz", + "integrity": "sha512-OOSbNlDy+Q3jY0oFHaq8kkna9HYI1zaS8IHeCIDP6T/ZIAVad4+HqXAL4SKQrKJikkoBQv1Z/eaDBL5XPFK9Bw==", + "devOptional": true, + "requires": { + "@angular-devkit/core": "16.1.4", + "rxjs": "7.8.1" + } + }, + "@angular-devkit/build-angular": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.1.4.tgz", + "integrity": "sha512-LiHM7R20fTHg/eM+Iabotj08edP5wVBQahRfVNLxERo8X6VJgSjVChnsh3AQJkRywlGuFe20AOQYpyLyN367Ug==", + "dev": true, + "requires": { + "@ampproject/remapping": "2.2.1", + "@angular-devkit/architect": "0.1601.4", + "@angular-devkit/build-webpack": "0.1601.4", + "@angular-devkit/core": "16.1.4", + "@babel/core": "7.22.5", + "@babel/generator": "7.22.7", + "@babel/helper-annotate-as-pure": "7.22.5", + "@babel/helper-split-export-declaration": "7.22.5", + "@babel/plugin-proposal-async-generator-functions": "7.20.7", + "@babel/plugin-transform-async-to-generator": "7.22.5", + "@babel/plugin-transform-runtime": "7.22.5", + "@babel/preset-env": "7.22.5", + "@babel/runtime": "7.22.5", + "@babel/template": "7.22.5", + "@discoveryjs/json-ext": "0.5.7", + "@ngtools/webpack": "16.1.4", + "@vitejs/plugin-basic-ssl": "1.0.1", + "ansi-colors": "4.1.3", + "autoprefixer": "10.4.14", + "babel-loader": "9.1.2", + "babel-plugin-istanbul": "6.1.1", + "browserslist": "^4.21.5", + "cacache": "17.1.3", + "chokidar": "3.5.3", + "copy-webpack-plugin": "11.0.0", + "critters": "0.0.19", + "css-loader": "6.8.1", + "esbuild": "0.17.19", + "esbuild-wasm": "0.17.19", + "fast-glob": "3.2.12", + "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.0", + "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": "3.2.0", + "postcss": "8.4.24", + "postcss-loader": "7.3.2", + "resolve-url-loader": "5.0.0", + "rxjs": "7.8.1", + "sass": "1.63.2", + "sass-loader": "13.3.1", + "semver": "7.5.3", + "source-map-loader": "4.0.1", + "source-map-support": "0.5.21", + "terser": "5.17.7", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.5.3", + "vite": "4.3.9", + "webpack": "5.86.0", + "webpack-dev-middleware": "6.1.1", + "webpack-dev-server": "4.15.0", + "webpack-merge": "5.9.0", + "webpack-subresource-integrity": "5.1.0" + }, + "dependencies": { + "@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "dev": true + }, + "webpack": { + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", + "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", + "dev": true, + "requires": { + "@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.14.1", + "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.1.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + } + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.1601.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1601.4.tgz", + "integrity": "sha512-GC1y//ScAYbYQ68Wri2QgTEekC4hRxBC+xEkYL9OFiAMQ4mcN+eYvbkQBX8enJwDMXpkYfLR6VV8cChjAVYIgg==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1601.4", + "rxjs": "7.8.1" + } + }, + "@angular-devkit/core": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.4.tgz", + "integrity": "sha512-WCAzNi9LxpFIi2WVPaJQd2kHPqCnCexWzUZN05ltJuBGCQL1O+LgRHGwnQ4WZoqmrF5tcWt2a3GFtJ3DgMc1hw==", + "requires": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "rxjs": "7.8.1", + "source-map": "0.7.4" + } + }, + "@angular-devkit/schematics": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.4.tgz", + "integrity": "sha512-yjRgwHAfFaeuimgbQtjwSUyXzEHpMSdTRb2zg+TOp6skoGvHOG8xXFJ7DjBkSMeAQdFF0fkxhPS9YmlxqNc+7A==", + "requires": { + "@angular-devkit/core": "16.1.4", + "jsonc-parser": "3.2.0", + "magic-string": "0.30.0", + "ora": "5.4.1", + "rxjs": "7.8.1" + } + }, + "@angular/animations": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.1.4.tgz", + "integrity": "sha512-QdqmnMEYsrZK1BB+/TGteyoQVRwIpRdBP4Jg+hX/BDhVpt35dptSwvNZj7+9zoYLwNo5DuGlttljEaLOs1UcUw==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/cli": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.1.4.tgz", + "integrity": "sha512-coSOLVLpOCOD5q9K9EAFFMrTES+HtdJiLy/iI9kdKNCKWUJpm8/svZ3JZOej3vPxYEp0AokXNOwORQnX21/qZQ==", + "devOptional": true, + "requires": { + "@angular-devkit/architect": "0.1601.4", + "@angular-devkit/core": "16.1.4", + "@angular-devkit/schematics": "16.1.4", + "@schematics/angular": "16.1.4", + "@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.3", + "symbol-observable": "4.0.0", + "yargs": "17.7.2" + } + }, + "@angular/common": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.1.4.tgz", + "integrity": "sha512-SDA8GZVY0nXCJaNUy13L22jAKuk1LZgQ6QzqOpqQc50C25bfBQbYv68PKjHCjQ62VxGKnDSTT85xCMNx+y/U4g==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/compiler": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.1.4.tgz", + "integrity": "sha512-5iKx8g+6/LtiRhbqMS2Jw1AshFUb4M8LO9WQKfRoE+5mZrDOYkAQYgOlAO7fk0mOCXeZcHJBbq2nuwDfwsZIiw==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/compiler-cli": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.1.4.tgz", + "integrity": "sha512-JerJOZeOLaHFHrfWMm4m9tEw+MdNNIMPj3TSauJ6uZPbFokGeqS2GsUBMjuQlwh5xY4duh1HtRsohvshpl306A==", + "dev": true, + "requires": { + "@babel/core": "7.22.5", + "@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/core": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.1.4.tgz", + "integrity": "sha512-eWs++peAp+Lm2SHGfMsHAye2IOmlDKkVJ4dFf4TaZXW+AEev3FXKXLFp+dBUq8YkCKly7iAV26NXEUBOFFtplQ==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/forms": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.1.4.tgz", + "integrity": "sha512-JLhO7gM0WyTfr6tEWZMiCGikWLgaC/a2+tuxWsSlXUjlrbE4DyLzSAA6JqyDCFTvm9B/QzRPDfgExLTTZJY4eQ==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/language-service": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-16.1.4.tgz", + "integrity": "sha512-FmasGUt77+GS2AFspVJR8Sg0NNlxCJJKHCHO4cch2fKXnwLZxd4aeHU0ttlVCA/hTFN50+03S3CBvru25L+74A==", + "dev": true + }, + "@angular/platform-browser": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.1.4.tgz", + "integrity": "sha512-eQ1dBh/6ZwJVeiNGrcW6ePFmWeS+Oheu1RpuZSsvM/fI6qfsZE+or9IJ61SFvsMs65SbrO90Akc+ZXmpEidPdA==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.1.4.tgz", + "integrity": "sha512-OIszPs3NLCZWL8BEvn458JotNMdXPGyEVToNa2cEVgtakVxkhrhmoFlwJTWJN4GRkHNL5h2Vb0JLEYICwr7sgg==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/pwa": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/pwa/-/pwa-16.1.4.tgz", + "integrity": "sha512-dBtTBiTZPhmHIcNHc5puCurAke2X2Z18MtqTI1JJqYl2vg+PBZqo0eZVRcEHv2+nqXx5JzPyk1frbaU11C8cVw==", + "requires": { + "@angular-devkit/schematics": "16.1.4", + "@schematics/angular": "16.1.4", + "parse5-html-rewriting-stream": "7.0.0" + } + }, + "@angular/router": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.1.4.tgz", + "integrity": "sha512-ooAK7XsY7fLW80htej9jHmct37biK77aNApCdiY+KlLdd45x//ObGxRYXcSSyvs7mRS0AMTGuA/G7/5AMcqcZg==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/service-worker": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-16.1.4.tgz", + "integrity": "sha512-ShP3nD3UOER1gf6daYkQqwfKCz/2/NhzsJIRxL9AonBB4qLDU/MzYWC3nts43+AESZfdibnF1LCWkvUmceqvGA==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", + "dev": true + }, + "@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dev": true, + "requires": { + "@babel/highlight": "^7.22.5" + } + }, + "@babel/compat-data": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", + "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", + "dev": true + }, + "@babel/core": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@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.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz", + "integrity": "sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", + "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", + "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-validator-option": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.6.tgz", + "integrity": "sha512-iwdzgtSiBxF6ni6mzVnZCF3xt5qE6cEA0J7nFt8QOAWZ0zjCFceEgpn3vtb2V7WFR6QzP2jmIFOHMTRo7eNJjQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@nicolo-ribaudo/semver-v6": "^6.3.3" + }, + "dependencies": { + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.6.tgz", + "integrity": "sha512-nBookhLKxAWo/TUCmhnaEJyLz2dekjQvv5SRpE9epWQBcpedWLKt8aZdsuT9XV5ovzR3fENLjRXVT0GsSlGGhA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "regexpu-core": "^5.3.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz", + "integrity": "sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "requires": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz", + "integrity": "sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-replace-supers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz", + "integrity": "sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", + "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz", + "integrity": "sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/helpers": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "dev": true, + "requires": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" + } + }, + "@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "dev": true + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "dev": true, + "requires": { + "@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": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "requires": {} + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-async-generator-functions": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz", + "integrity": "sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dev": true, + "requires": { + "@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-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", + "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-class-static-block": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", + "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", + "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-dynamic-import": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", + "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-export-namespace-from": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", + "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-json-strings": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", + "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", + "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", + "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-transform-numeric-separator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", + "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-transform-object-rest-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", + "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.5" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + } + }, + "@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", + "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-transform-optional-chaining": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz", + "integrity": "sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-private-property-in-object": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", + "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", + "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.1" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.5.tgz", + "integrity": "sha512-bg4Wxd1FWeFx3daHFTWk1pkSWK/AyQuiyAoeZAOkAOUBjnZPH6KT7eMxouV47tQ6hl6ax2zyAWBdWZXbrvXlaw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.3", + "babel-plugin-polyfill-corejs3": "^0.8.1", + "babel-plugin-polyfill-regenerator": "^0.5.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", + "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/preset-env": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.5.tgz", + "integrity": "sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@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.5", + "@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.5", + "@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.5", + "@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.3", + "babel-plugin-polyfill-corejs3": "^0.8.1", + "babel-plugin-polyfill-regenerator": "^0.5.0", + "core-js-compat": "^3.30.2", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "requires": { + "@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": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "@babel/runtime": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", + "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/traverse": { + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + } + } + }, + "@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + } + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true + }, + "@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "dev": true, + "optional": true + }, + "@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" + }, + "@ionic/angular": { + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.7.5.tgz", + "integrity": "sha512-nV8HP7RedjYkIAT8nVr5ifHNT0D3XzA74RPG3/WCCFJKunERNJ9SBiNkCTWhUpSkqsYYwEB4+SOOHz+R5NLk/w==", + "requires": { + "@ionic/core": "6.7.5", + "ionicons": "^6.1.3", + "jsonc-parser": "^3.0.0", + "tslib": "^2.0.0" + } + }, + "@ionic/cli": { + "version": "6.20.9", + "resolved": "https://registry.npmjs.org/@ionic/cli/-/cli-6.20.9.tgz", + "integrity": "sha512-sItLCi7zXq1zARWIpZDinHhK8hvy+wzOx176QMOJV90BjDybkjGYu3rGu5TBjoqn104dRIZTC8rtCsnD/P3cQw==", + "dev": true, + "requires": { + "@ionic/cli-framework": "5.1.3", + "@ionic/cli-framework-output": "2.2.5", + "@ionic/cli-framework-prompts": "2.1.10", + "@ionic/utils-array": "2.1.5", + "@ionic/utils-fs": "3.1.6", + "@ionic/utils-network": "2.1.5", + "@ionic/utils-process": "2.1.10", + "@ionic/utils-stream": "3.1.5", + "@ionic/utils-subprocess": "2.1.11", + "@ionic/utils-terminal": "2.3.3", + "chalk": "^4.0.0", + "debug": "^4.0.0", + "diff": "^4.0.1", + "elementtree": "^0.1.7", + "leek": "0.0.24", + "lodash": "^4.17.5", + "open": "^7.0.4", + "os-name": "^4.0.0", + "semver": "^7.1.1", + "split2": "^3.0.0", + "ssh-config": "^1.1.1", + "stream-combiner2": "^1.1.1", + "superagent": "^5.2.1", + "superagent-proxy": "^3.0.0", + "tar": "^6.0.1", + "tslib": "^2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@ionic/cli-framework": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework/-/cli-framework-5.1.3.tgz", + "integrity": "sha512-T2KN/TurzNoAcc3iDt1KHU6GeEa7x9kXngMnu5xs+DzJv5HhBKjVOoo74b8rgVxdPx+dLOV8aLrorlyvsHR/tQ==", + "dev": true, + "requires": { + "@ionic/cli-framework-output": "2.2.5", + "@ionic/utils-array": "2.1.5", + "@ionic/utils-fs": "3.1.6", + "@ionic/utils-object": "2.1.5", + "@ionic/utils-process": "2.1.10", + "@ionic/utils-stream": "3.1.5", + "@ionic/utils-subprocess": "2.1.11", + "@ionic/utils-terminal": "2.3.3", + "chalk": "^4.0.0", + "debug": "^4.0.0", + "lodash": "^4.17.5", + "minimist": "^1.2.0", + "rimraf": "^3.0.0", + "tslib": "^2.0.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@ionic/cli-framework-output": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.5.tgz", + "integrity": "sha512-YeDLTnTaE6V4IDUxT8GDIep0GuRIFaR7YZDLANMuuWJZDmnTku6DP+MmQoltBeLmVvz1BAAZgk41xzxdq6H2FQ==", + "dev": true, + "requires": { + "@ionic/utils-terminal": "2.3.3", + "debug": "^4.0.0", + "tslib": "^2.0.1" + } + }, + "@ionic/cli-framework-prompts": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework-prompts/-/cli-framework-prompts-2.1.10.tgz", + "integrity": "sha512-h8HbA0teR0vWtGKB3ahzRbDq4yYaxfukgbOqhu9CAEJHosoFlBmDB8PbPnGFYxUg2J1MuCqeiN2ftJQYV/BO1w==", + "dev": true, + "requires": { + "@ionic/utils-terminal": "2.3.3", + "debug": "^4.0.0", + "inquirer": "^7.0.0", + "tslib": "^2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@ionic/core": { + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.7.5.tgz", + "integrity": "sha512-zRkRn+h/Vs3xt/EVgBdShMKDyeGOM4RU31NPF2icfu3CUTH+VrMV569MUnNjYvd1Lu2xK90pYy4TaicSWmC1Pw==", + "requires": { + "@stencil/core": "^2.18.0", + "ionicons": "^6.1.3", + "tslib": "^2.1.0" + } + }, + "@ionic/utils-array": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.5.tgz", + "integrity": "sha512-HD72a71IQVBmQckDwmA8RxNVMTbxnaLbgFOl+dO5tbvW9CkkSFCv41h6fUuNsSEVgngfkn0i98HDuZC8mk+lTA==", + "dev": true, + "requires": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + } + }, + "@ionic/utils-fs": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.6.tgz", + "integrity": "sha512-eikrNkK89CfGPmexjTfSWl4EYqsPSBh0Ka7by4F0PLc1hJZYtJxUZV3X4r5ecA8ikjicUmcbU7zJmAjmqutG/w==", + "dev": true, + "requires": { + "@types/fs-extra": "^8.0.0", + "debug": "^4.0.0", + "fs-extra": "^9.0.0", + "tslib": "^2.0.1" + } + }, + "@ionic/utils-network": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-network/-/utils-network-2.1.5.tgz", + "integrity": "sha512-HUQ1Ec4Mh2MXzzKdbbbDS6xYKwpFJ2XRY7SYXbaZT8+jiNahfHbsOfe62/p8bk41Yil7E9EagzGC2JvIFJh01w==", + "dev": true, + "requires": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + } + }, + "@ionic/utils-object": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.5.tgz", + "integrity": "sha512-XnYNSwfewUqxq+yjER1hxTKggftpNjFLJH0s37jcrNDwbzmbpFTQTVAp4ikNK4rd9DOebX/jbeZb8jfD86IYxw==", + "dev": true, + "requires": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + } + }, + "@ionic/utils-process": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.10.tgz", + "integrity": "sha512-mZ7JEowcuGQK+SKsJXi0liYTcXd2bNMR3nE0CyTROpMECUpJeAvvaBaPGZf5ERQUPeWBVuwqAqjUmIdxhz5bxw==", + "dev": true, + "requires": { + "@ionic/utils-object": "2.1.5", + "@ionic/utils-terminal": "2.3.3", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "tree-kill": "^1.2.2", + "tslib": "^2.0.1" + } + }, + "@ionic/utils-stream": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.5.tgz", + "integrity": "sha512-hkm46uHvEC05X/8PHgdJi4l4zv9VQDELZTM+Kz69odtO9zZYfnt8DkfXHJqJ+PxmtiE5mk/ehJWLnn/XAczTUw==", + "dev": true, + "requires": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + } + }, + "@ionic/utils-subprocess": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.11.tgz", + "integrity": "sha512-6zCDixNmZCbMCy5np8klSxOZF85kuDyzZSTTQKQP90ZtYNCcPYmuFSzaqDwApJT4r5L3MY3JrqK1gLkc6xiUPw==", + "dev": true, + "requires": { + "@ionic/utils-array": "2.1.5", + "@ionic/utils-fs": "3.1.6", + "@ionic/utils-process": "2.1.10", + "@ionic/utils-stream": "3.1.5", + "@ionic/utils-terminal": "2.3.3", + "cross-spawn": "^7.0.3", + "debug": "^4.0.0", + "tslib": "^2.0.1" + } + }, + "@ionic/utils-terminal": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.3.tgz", + "integrity": "sha512-RnuSfNZ5fLEyX3R5mtcMY97cGD1A0NVBbarsSQ6yMMfRJ5YHU7hHVyUfvZeClbqkBC/pAqI/rYJuXKCT9YeMCQ==", + "dev": true, + "requires": { + "@types/slice-ansi": "^4.0.0", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "devOptional": true, + "requires": { + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "devOptional": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "devOptional": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "devOptional": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "devOptional": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "devOptional": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "devOptional": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + } + } + }, + "@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "@maskito/angular": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-1.2.0.tgz", + "integrity": "sha512-2YD/MWxESVn5/nckZj4F3GArzxjN3M4V8SHhtxI4c3wtg1m8ewoO8r7o3HYk/4aVLxxR0y2bz6cOWJtawt4KoQ==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@maskito/core": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@maskito/core/-/core-1.2.0.tgz", + "integrity": "sha512-RFSydWYujxbVBbMzQVZ0zR77ROY3MbcuyKFWLomJWw3rDujl65M2ppz5KMeDSogAGkKnqzWudozjmBAQf2DgcA==" + }, + "@maskito/kit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-1.2.0.tgz", + "integrity": "sha512-sMUZ3vMp3RCAcw+H/TuxyrJDgz6J5TTUCc+2/inTCE1gr33FsmhzLqoi5PaYrD146VcOKdtAxd3NJ1RK/g1ZHw==", + "requires": {} + }, + "@materia-ui/ngx-monaco-editor": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@materia-ui/ngx-monaco-editor/-/ngx-monaco-editor-6.0.0.tgz", + "integrity": "sha512-gTqNQjOGznZxOC0NlmKdKSGCJuTts8YmK4dsTQAGc5IgIV7cZdQWiW6AL742h0ruED6q0cAunEYjXT6jzHBoIQ==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@ng-web-apis/common": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@ng-web-apis/common/-/common-3.0.1.tgz", + "integrity": "sha512-pk0ibndaku/uip6MNST3/SA+sUcQZoajV2y4Mg6frfJzLq3wnKMQH25voL7wgG+XTaWvsS2OPDddPRFLn6qM7g==", + "requires": { + "tslib": "^2.2.0" + } + }, + "@ng-web-apis/intersection-observer": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@ng-web-apis/intersection-observer/-/intersection-observer-3.1.1.tgz", + "integrity": "sha512-DjJK2LiZlfoS5IxeYCV8Qq+ebgEg5sAXRGWYyh/URDzKM6zZeYl+Wf09KVFW4NXgRUPcpBanhOL3DFAdMKEpaQ==", + "requires": { + "tslib": "^2.2.0" + } + }, + "@ng-web-apis/mutation-observer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-3.0.1.tgz", + "integrity": "sha512-ChzNd/Q4R+wZEHBIqnffX9BsWlHgLxhA0BtJ5OLLnBeUQ/A1O+6v20qfrVmjMzgFqB8SpF+0c9j6SpWpsZHjWw==", + "requires": { + "tslib": "^2.2.0" + } + }, + "@ng-web-apis/resize-observer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@ng-web-apis/resize-observer/-/resize-observer-3.0.1.tgz", + "integrity": "sha512-2rtkX3EeS0Qk6s1lzI5PaLYvDPuC4FT4WBS0yhmI6e8ipoJttNNB+sCLgd5aWarcMXMFWIcWqpmcJxzFFF73Fg==", + "requires": { + "tslib": "^2.2.0" + } + }, + "@ngtools/webpack": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.1.4.tgz", + "integrity": "sha512-+8bfavDH8eWxjlJFYr6bkjcRHhy95j+f8oNn7/sGLNu4L96nuE2AZ011XIu2dJahCnNiBvwc1EpkKa92t9rkaA==", + "dev": true, + "requires": {} + }, + "@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "dev": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "devOptional": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "devOptional": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "devOptional": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "devOptional": true, + "requires": { + "semver": "^7.3.5" + } + }, + "@npmcli/git": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", + "devOptional": true, + "requires": { + "@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" + }, + "dependencies": { + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "devOptional": true + }, + "which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "devOptional": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "@npmcli/installed-package-contents": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "devOptional": true, + "requires": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + } + }, + "@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "devOptional": true + }, + "@npmcli/promise-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "devOptional": true, + "requires": { + "which": "^3.0.0" + }, + "dependencies": { + "which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "devOptional": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "@npmcli/run-script": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", + "devOptional": true, + "requires": { + "@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" + }, + "dependencies": { + "which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "devOptional": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true + }, + "@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "dev": true + }, + "@rollup/plugin-json": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.0.0.tgz", + "integrity": "sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^5.0.1" + } + }, + "@rollup/plugin-node-resolve": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.1.0.tgz", + "integrity": "sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.2.1", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + } + }, + "@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "dependencies": { + "@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + } + } + }, + "@schematics/angular": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.1.4.tgz", + "integrity": "sha512-XfoeL+aBVIR/DzgVKGVhHW/TGQnqWvngyJVuCwXEVWzNfjxHYFkchXa78OItpAvTEr6/Y0Me9FQVAGVA4mMUyg==", + "requires": { + "@angular-devkit/core": "16.1.4", + "@angular-devkit/schematics": "16.1.4", + "jsonc-parser": "3.2.0" + } + }, + "@sigstore/protobuf-specs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz", + "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==", + "devOptional": true + }, + "@sigstore/tuf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.2.tgz", + "integrity": "sha512-vjwcYePJzM01Ha6oWWZ9gNcdIgnzyFxfqfWzph483DPJTH8Tb7f7bQRRll3CYVkyH56j0AgcPAcl6Vg95DPF+Q==", + "devOptional": true, + "requires": { + "@sigstore/protobuf-specs": "^0.1.0", + "tuf-js": "^1.1.7" + } + }, + "@start9labs/argon2": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@start9labs/argon2/-/argon2-0.1.0.tgz", + "integrity": "sha512-Ng9Ibuj0p2drQRW013AkUz6TqWysXw/9OyoEoXQZL7kfac0LrxWIDj+xvg+orqQMxcvClWgzeQY/c+IgJtcevA==" + }, + "@start9labs/emver": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@start9labs/emver/-/emver-0.1.5.tgz", + "integrity": "sha512-1dhiG03VkfEwSLx/JPKVms6srAbYFQgwfSGhwpUKMDliMXuAHGVaueStmqzVxn3JpH/HEVz0QW8w/PXHqjdiIg==" + }, + "@start9labs/start-sdk": { + "version": "0.4.0-rev0.lib0.rc5", + "resolved": "https://registry.npmjs.org/@start9labs/start-sdk/-/start-sdk-0.4.0-rev0.lib0.rc5.tgz", + "integrity": "sha512-2hAJE1id0VgpU8DJt/I+m/IEePmnspzF8BxUoLO3C+ZgyOZU1tEri1f9QCsS6OLn3J11xPlpY1VuSjP5CyHC+Q==", + "requires": { + "@iarna/toml": "^2.2.5", + "ts-matches": "^5.4.1", + "yaml": "^2.2.2" + } + }, + "@stencil/core": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.22.3.tgz", + "integrity": "sha512-kmVA0M/HojwsfkeHsifvHVIYe4l5tin7J5+DLgtl8h6WWfiMClND5K3ifCXXI2ETDNKiEk21p6jql3Fx9o2rng==" + }, + "@taiga-ui/addon-charts": { + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.36.0.tgz", + "integrity": "sha512-GZqhXUNNBtjX0jqPuYtYLjALTP0boV3cORnYt9/pXZ1DSXje6AyjLAmYXY/u7vlgcWAggLPd6A1GXszSOBDdIA==", + "requires": { + "tslib": ">=2.0.0" + } + }, + "@taiga-ui/cdk": { + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.36.0.tgz", + "integrity": "sha512-ipoL6/P8OqsVXTcP1kXP5qeQ4Dtno6893xioHmke+SQpoOYO7u9JUZgj9exdL8Zyy4SdXF456EzB9qib79GN6g==", + "requires": { + "@ng-web-apis/common": "3.0.1", + "@ng-web-apis/mutation-observer": "3.0.1", + "@ng-web-apis/resize-observer": "3.0.1", + "@tinkoff/ng-event-plugins": "3.1.0", + "@tinkoff/ng-polymorpheus": "4.1.0", + "ng-morph": "2.2.5", + "parse5": "6.0.1", + "tslib": "2.6.0" + } + }, + "@taiga-ui/core": { + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.36.0.tgz", + "integrity": "sha512-X1l9kQLdVkN5oVNHgiFtKmCtPOneOtgI8SdPFgrhlTdNI9ve3cy4vhLWtVq441QYnTM/MIDPsTNXgRend/dDsg==", + "requires": { + "@taiga-ui/i18n": "^3.36.0", + "tslib": ">=2.0.0" + } + }, + "@taiga-ui/i18n": { + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.36.0.tgz", + "integrity": "sha512-vl7rXDYR0LvDJrOimN+wR+7bZww7Cv1JxwsZpbrt5hxXhX5Ih36bMtBqJMEfziCL2XOuFbor2KjegllXreEHPA==", + "requires": { + "tslib": ">=2.0.0" + } + }, + "@taiga-ui/icons": { + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.36.0.tgz", + "integrity": "sha512-naXB46KRDfxYFxKllrpexy/+zQ1ki3IkhBfHhoFhi0WuSW3pZ2GV8kDpFI6B49FDHMQTM2FcZ2oHAC5HEGKjKw==", + "requires": { + "tslib": "^2.2.0" + } + }, + "@taiga-ui/kit": { + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.36.0.tgz", + "integrity": "sha512-8aTKchdKmUfb6ud0iFsVnhQRg+d1zCla0coV+7n0GaHkfPd4Pp5DGiYaJMs6p9rixZM4sUyvRtYxO6p2bKaPQQ==", + "requires": { + "@maskito/angular": "1.2.0", + "@maskito/core": "1.2.0", + "@maskito/kit": "1.2.0", + "@ng-web-apis/intersection-observer": "3.1.1", + "text-mask-core": "5.1.2", + "tslib": ">=2.0.0" + } + }, + "@tinkoff/ng-dompurify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tinkoff/ng-dompurify/-/ng-dompurify-4.0.0.tgz", + "integrity": "sha512-BjKUweWLrOx8UOZw+Tl+Dae5keYuSbeMkppcXQdsvwASMrPfmP7d3Q206Q6HDqOV2WnpnFqGUB95IMbLAeRRuw==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@tinkoff/ng-event-plugins": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@tinkoff/ng-event-plugins/-/ng-event-plugins-3.1.0.tgz", + "integrity": "sha512-HqLBes/3MV469L1S08uBqmPUIwihx43py+8Lee1Me9jMFM1ZMuAC3NcS/njUFI1OzXU2kIPyUDEw2jmVbg8mWQ==", + "requires": { + "tslib": "^2.2.0" + } + }, + "@tinkoff/ng-polymorpheus": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@tinkoff/ng-polymorpheus/-/ng-polymorpheus-4.1.0.tgz", + "integrity": "sha512-rhe7Fe+rTK5cqfbeySy9fmwBilgMUGkSVX4rrkpmPRSTDhSh/djrRUW0q5ukbN56Rx/AKSYZ5B/nEqY+HL1jZg==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "devOptional": true + }, + "@ts-morph/common": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.9.2.tgz", + "integrity": "sha512-IPyg+c3Am0EBoa63W0f/AKeLrJhvzMzQ4BIvD1baxLopmiHOj1HFTXYxC6e8iTZ+UYtN+/WFM9UyGRnoA20b8g==", + "optional": true, + "requires": { + "fast-glob": "^3.2.5", + "minimatch": "^3.0.4", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "@tufjs/canonical-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "devOptional": true + }, + "@tufjs/models": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "devOptional": true, + "requires": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + } + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/cron": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/cron/-/cron-2.0.1.tgz", + "integrity": "sha512-WHa/1rtNtD2Q/H0+YTTZoty+/5rcE66iAFX2IY+JuUoOACsevYyFkSYu/2vdw+G5LrmO7Lxowrqm0av4k3qWNQ==", + "dev": true, + "requires": { + "@types/luxon": "*", + "@types/node": "*" + } + }, + "@types/dompurify": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-2.4.0.tgz", + "integrity": "sha512-IDBwO5IZhrKvHFUl+clZxgf3hn2b/lU6H1KaBShPkQyGJUQ0xwebezIPSuiyGwfz1UzJWQl4M7BDxtHtCCPlTg==", + "requires": { + "@types/trusted-types": "*" + } + }, + "@types/eslint": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "@types/fs-extra": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.2.tgz", + "integrity": "sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "dev": true + }, + "@types/http-proxy": { + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/js-yaml": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", + "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "@types/luxon": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.0.tgz", + "integrity": "sha512-uKRI5QORDnrGFYgcdAVnHvEIvEZ8noTpP/Bg+HeUzZghwinDlIS87DEenV5r1YoOF9G4x600YsUXLWZ19rmTmg==", + "dev": true + }, + "@types/marked": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.1.tgz", + "integrity": "sha512-vSSbKZFbNktrQ15v7o1EaH78EbWV+sPQbPjHG+Cp8CaNcPFUEfjZ0Iml/V0bFDwsTlYe8o6XC5Hfdp91cqPV2g==", + "dev": true + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "optional": true + }, + "@types/mustache": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/mustache/-/mustache-4.2.2.tgz", + "integrity": "sha512-MUSpfpW0yZbTgjekDbH0shMYBUD+X/uJJJMm9LXN1d5yjl5lCY1vN/eWKD6D1tOtjA6206K0zcIPnUaFMurdNA==", + "dev": true + }, + "@types/node": { + "version": "18.16.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.19.tgz", + "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==", + "dev": true + }, + "@types/node-jose": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@types/node-jose/-/node-jose-1.1.10.tgz", + "integrity": "sha512-7L0ucJTugW4x/sYpQ+c5IudAwr0pFuxDVnZLpHKWpff7p1lVa3wTuNvnrzFBNeLojE+UY0cVCwNGXLxXsMIrzw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/pbkdf2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true + }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dev": true, + "requires": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "@types/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", + "dev": true + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/trusted-types": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", + "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==" + }, + "@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "dev": true + }, + "@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@vitejs/plugin-basic-ssl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", + "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", + "dev": true, + "requires": {} + }, + "@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "requires": { + "@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": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "requires": { + "@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": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "requires": { + "@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": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "requires": { + "@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": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "requires": { + "@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": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "devOptional": true + }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "devOptional": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + } + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "devOptional": true, + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", + "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", + "devOptional": true, + "requires": { + "debug": "^4.1.0", + "depd": "^2.0.0", + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "devOptional": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "requires": { + "ajv": "^8.0.0" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "devOptional": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "devOptional": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansi-to-html": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.7.2.tgz", + "integrity": "sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==", + "requires": { + "entities": "^2.2.0" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "devOptional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "devOptional": true + }, + "are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "devOptional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "optional": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "optional": true + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "optional": true + }, + "ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "requires": { + "tslib": "^2.0.1" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "dev": true, + "requires": { + "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" + } + }, + "babel-loader": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", + "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.2", + "schema-utils": "^4.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@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": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz", + "integrity": "sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.1", + "@nicolo-ribaudo/semver-v6": "^6.3.3" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz", + "integrity": "sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.4.1", + "core-js-compat": "^3.31.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz", + "integrity": "sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.4.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "devOptional": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "devOptional": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + } + } + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + } + } + }, + "bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "dev": true, + "requires": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "devOptional": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "devOptional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true + }, + "builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "devOptional": true, + "requires": { + "semver": "^7.0.0" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "cacache": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.3.tgz", + "integrity": "sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==", + "devOptional": true, + "requires": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "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" + }, + "dependencies": { + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "devOptional": true + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "caniuse-lite": { + "version": "1.0.30001514", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001514.tgz", + "integrity": "sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ==", + "dev": true + }, + "cbor": { + "version": "npm:@jprochazk/cbor@0.4.9", + "resolved": "https://registry.npmjs.org/@jprochazk/cbor/-/cbor-0.4.9.tgz", + "integrity": "sha512-FWNnkOtWrFOLXKG2nzOHR/EnCCGZZPvatAvWXDmkTDxgjj9JHDK3DkMUHcFCY3a9weylMCSO/nLOUM170NAO0Q==" + }, + "cbor-web": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor-web/-/cbor-web-8.1.0.tgz", + "integrity": "sha512-2hWHHMVrfffgoEmsAUh8vCxHoLa1vgodtC73+C5cSarkJlwTapnqAzcHINlP6Ej0DXuP4OmmJ9LF+JaNM5Lj/g==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "devOptional": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "devOptional": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "devOptional": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "devOptional": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==" + }, + "cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "requires": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true + }, + "slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + } + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "devOptional": true + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "devOptional": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==" + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "code-block-writer": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-10.1.1.tgz", + "integrity": "sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==", + "optional": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "devOptional": true + }, + "colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "devOptional": true + }, + "connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "devOptional": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true + }, + "copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "requires": { + "is-what": "^3.14.1" + } + }, + "copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + } + } + }, + "core-js": { + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.31.1.tgz", + "integrity": "sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==" + }, + "core-js-compat": { + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", + "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", + "dev": true, + "requires": { + "browserslist": "^4.21.9" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "dependencies": { + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "critters": { + "version": "0.0.19", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.19.tgz", + "integrity": "sha512-Fm4ZAXsG0VzWy1U30rP4qxbaWGSsqXDgSupJW1OUJGDAs0KWC+j37v7p5a2kZ9BPJvhRzWm3be+Hc9WvQOBUOw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "cron": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/cron/-/cron-2.3.1.tgz", + "integrity": "sha512-1eRRlIT0UfIqauwbG9pkg3J6CX9A6My2ytJWqAXoK0T9oJnUZTzGBNPxao0zjodIbPgf8UQWjE62BMb9eVllSQ==", + "requires": { + "luxon": "^3.2.1" + } + }, + "cronstrue": { + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.27.0.tgz", + "integrity": "sha512-p+w818EttA27EfIeZP5Z3k3ps9hy6DlRv3txbWxysTIlWEAE6DdYIjCaaeZhWaNfcowuXZrg0HVFWLTqGb85hg==" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "devOptional": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css-loader": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "dev": true, + "requires": { + "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": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==", + "dev": true + }, + "data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "devOptional": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true + }, + "default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + }, + "dependencies": { + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "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" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + } + } + }, + "defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "requires": { + "clone": "^1.0.2" + } + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "devOptional": true + }, + "degenerator": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.4.tgz", + "integrity": "sha512-Z66uPeBfHZAHVmue3HPfyKu2Q0rC2cRxbTOsvmU/po5fvvcx27W4mIu9n0PUlQih4oUYvcG1BsbtVv8x7KDOSw==", + "dev": true, + "requires": { + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0", + "vm2": "^3.9.17" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "devOptional": true + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "devOptional": true + }, + "dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "dijkstrajs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", + "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==" + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "dns-packet": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "dev": true, + "requires": { + "@leichtgewicht/ip-codec": "^2.0.1" + } + }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "dependencies": { + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true + } + } + }, + "dom7": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/dom7/-/dom7-4.0.6.tgz", + "integrity": "sha512-emjdpPLhpNubapLFdjNL9tP06Sr+GZkrIHEXLWvOGsytACUrkbeIdjO5g77m00BrHTznnlcNqgmn7pCN192TBA==", + "requires": { + "ssr-window": "^4.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + }, + "dompurify": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.6.tgz", + "integrity": "sha512-RQ9Ue979JnMiQ3a5E9KT3DLbUj9NCeulCZvVqnFRy+lj8j8sL9fmsUaGJTkhRts/74IM5HxPal5jaPjrTpH8zQ==" + }, + "domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "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" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "devOptional": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.454", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz", + "integrity": "sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==", + "dev": true + }, + "elementtree": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", + "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", + "dev": true, + "requires": { + "sax": "1.1.4" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encode-utf8": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "devOptional": true + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "devOptional": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-module-lexer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "dev": true + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "esbuild-wasm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.19.tgz", + "integrity": "sha512-X9UQEMJMZXwlGCfqcBmJ1jEa+KrLfd+gCBypO/TSzo5hZvbVwFqpxj1YCuX54ptTF75wxmrgorR4RL40AKtLVg==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "devOptional": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "devOptional": true + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "eventemitter-asyncresource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + } + }, + "exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "devOptional": true + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "devOptional": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "devOptional": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-patch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "devOptional": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "devOptional": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "devOptional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "find-versions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", + "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", + "dev": true, + "requires": { + "semver-regex": "^3.1.2" + } + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true + }, + "foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "devOptional": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "dependencies": { + "signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "devOptional": true + } + } + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", + "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", + "dev": true + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-minipass": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz", + "integrity": "sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==", + "devOptional": true, + "requires": { + "minipass": "^5.0.0" + } + }, + "fs-monkey": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "devOptional": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "dev": true, + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "devOptional": true + }, + "fuse.js": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.6.2.tgz", + "integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==" + }, + "gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "devOptional": true, + "requires": { + "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": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "get-uri": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + }, + "dependencies": { + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "glob": { + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", + "devOptional": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "devOptional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "dependencies": { + "fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + } + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "devOptional": true + }, + "gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "requires": { + "duplexer": "^0.1.2" + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "devOptional": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "devOptional": true + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "hdr-histogram-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", + "dev": true, + "requires": { + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" + }, + "dependencies": { + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + } + } + }, + "hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", + "dev": true + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "devOptional": true, + "requires": { + "lru-cache": "^7.5.1" + }, + "dependencies": { + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "devOptional": true + } + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "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" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true + }, + "htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + }, + "dependencies": { + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true + } + } + }, + "http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "devOptional": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "devOptional": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "requires": { + "@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" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "devOptional": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "devOptional": true, + "requires": { + "ms": "^2.0.0" + } + }, + "husky": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.8.tgz", + "integrity": "sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^7.0.0", + "find-versions": "^4.0.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^5.0.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, + "requires": { + "find-up": "^5.0.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "devOptional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "requires": {} + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "ignore-walk": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", + "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", + "devOptional": true, + "requires": { + "minimatch": "^9.0.0" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true + }, + "immutable": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "devOptional": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "devOptional": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "devOptional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "devOptional": true + }, + "injection-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.4.0.tgz", + "integrity": "sha512-6jiJt0tCAo9zjHbcwLiPL+IuNe9SQ6a9g0PEzafThW3fOQi0mrmiJGBJvDD6tmhPh8cQHIQtCOrJuBfQME4kPA==", + "dev": true, + "requires": { + "tslib": "^2.0.0" + } + }, + "inquirer": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "devOptional": true, + "requires": { + "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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "devOptional": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "devOptional": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "devOptional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "devOptional": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "devOptional": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "devOptional": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "ionicons": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-6.1.3.tgz", + "integrity": "sha512-ptzz38dd/Yq+PgjhXegh7yhb/SLIk1bvL9vQDtLv1aoSc7alO6mX2DIMgcKYzt9vrNWkRu1f9Jr78zIFFyOXqw==", + "requires": { + "@stencil/core": "^2.18.0" + } + }, + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "devOptional": true + }, + "ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "devOptional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "requires": { + "builtin-modules": "^3.3.0" + } + }, + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "devOptional": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "devOptional": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "devOptional": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "devOptional": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "devOptional": true + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "devOptional": true + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" + }, + "is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "devOptional": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "devOptional": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "jackspeak": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", + "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", + "devOptional": true, + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jiti": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", + "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", + "dev": true + }, + "jose": { + "version": "4.14.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", + "integrity": "sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "devOptional": true + }, + "karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "requires": { + "source-map-support": "^0.5.5" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true + }, + "launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "dev": true, + "requires": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, + "leek": { + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/leek/-/leek-0.0.24.tgz", + "integrity": "sha512-6PVFIYXxlYF0o6hrAsHtGpTmi06otkwNrMcmQ0K96SeSRHPREPa9J3nJZ1frliVH7XT0XFswoJFQoXsDukzGNQ==", + "dev": true, + "requires": { + "debug": "^2.1.0", + "lodash.assign": "^3.2.0", + "rsvp": "^3.0.21" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "less": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "dev": true, + "requires": { + "copy-anything": "^2.0.1", + "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", + "parse-node-version": "^1.0.1", + "source-map": "~0.6.0", + "tslib": "^2.3.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "less-loader": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", + "dev": true, + "requires": { + "klona": "^2.0.4" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "dev": true, + "requires": { + "webpack-sources": "^3.0.0" + } + }, + "lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "lint-staged": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.3.tgz", + "integrity": "sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==", + "dev": true, + "requires": { + "chalk": "5.2.0", + "cli-truncate": "^3.1.0", + "commander": "^10.0.0", + "debug": "^4.3.4", + "execa": "^7.0.0", + "lilconfig": "2.1.0", + "listr2": "^5.0.7", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-inspect": "^1.12.3", + "pidtree": "^0.6.0", + "string-argv": "^0.3.1", + "yaml": "^2.2.2" + }, + "dependencies": { + "chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true + } + } + }, + "listr2": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", + "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true + }, + "loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", + "dev": true + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==", + "dev": true + }, + "lodash._createassigner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", + "integrity": "sha512-LziVL7IDnJjQeeV95Wvhw6G28Z8Q6da87LWKOPWmzBLv4u6FAT/x5v00pyGW0u38UoogNF2JnD3bGgZZDaNEBw==", + "dev": true, + "requires": { + "lodash._bindcallback": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash.restparam": "^3.0.0" + } + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==", + "dev": true + }, + "lodash.assign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", + "integrity": "sha512-/VVxzgGBmbphasTg51FrztxQJ/VgAUpol6zmJuSVSGcNg4g7FA4z7rQV8Ovr9V3vFBNWZhvKWHfpAytjTVUfFA==", + "dev": true, + "requires": { + "lodash._baseassign": "^3.0.0", + "lodash._createassigner": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "luxon": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", + "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==" + }, + "macos-release": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", + "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", + "dev": true + }, + "magic-string": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.13" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "devOptional": true, + "requires": { + "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" + }, + "dependencies": { + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "devOptional": true + } + } + }, + "marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==" + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true + }, + "memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "requires": { + "fs-monkey": "^1.0.4" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "devOptional": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "devOptional": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "dev": true, + "requires": { + "schema-utils": "^4.0.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "devOptional": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "devOptional": true + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "devOptional": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "devOptional": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + } + } + }, + "minipass-fetch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", + "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", + "devOptional": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^5.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "devOptional": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "devOptional": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + } + } + }, + "minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "devOptional": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "devOptional": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + } + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "devOptional": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "devOptional": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + } + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "devOptional": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "devOptional": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + } + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "devOptional": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "devOptional": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "devOptional": true + }, + "monaco-editor": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.33.0.tgz", + "integrity": "sha512-VcRWPSLIUEgQJQIE0pVT8FcGBIgFoxz7jtqctE+IiCxWugD0DwgyQBcZBhdSrdMC84eumoqMZsGl2GTreOzwqw==" + }, + "mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "devOptional": true + }, + "multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "requires": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + } + }, + "multimatch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "optional": true, + "requires": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "devOptional": true + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true + }, + "needle": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + } + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "devOptional": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true + }, + "ng-morph": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/ng-morph/-/ng-morph-2.2.5.tgz", + "integrity": "sha512-plxrHfcz7aNRcTCxS9tUxI1F5Vfx5CZAAw8NAnJCyCb41Js6S+EyPDvn2v7H2QyfZzXU1H0BAqtiRQv/rE2zTA==", + "optional": true, + "requires": { + "jsonc-parser": "3.0.0", + "minimatch": "3.0.5", + "multimatch": "5.0.0", + "ts-morph": "10.0.2" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "optional": true + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "ng-packagr": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-16.1.0.tgz", + "integrity": "sha512-NbgzDRtRiYJi98Ssky7U5GoicZz7VkR3OW5qd9q3dt3H/JNqLh2PwB745NFG2cT00lEvfrY6LJ1NAcOjoWDibA==", + "dev": true, + "requires": { + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^15.0.0", + "ajv": "^8.11.0", + "ansi-colors": "^4.1.3", + "autoprefixer": "^10.4.12", + "browserslist": "^4.21.4", + "cacache": "^17.0.0", + "chokidar": "^3.5.3", + "commander": "^10.0.0", + "convert-source-map": "^2.0.0", + "dependency-graph": "^0.11.0", + "esbuild": "^0.17.0", + "esbuild-wasm": "^0.17.0", + "fast-glob": "^3.2.12", + "find-cache-dir": "^3.3.2", + "injection-js": "^2.4.0", + "jsonc-parser": "^3.2.0", + "less": "^4.1.3", + "ora": "^5.1.0", + "piscina": "^3.2.0", + "postcss": "^8.4.16", + "postcss-url": "^10.1.3", + "rollup": "^3.0.0", + "rxjs": "^7.5.6", + "sass": "^1.55.0" + }, + "dependencies": { + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + } + } + }, + "ng-qrcode": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/ng-qrcode/-/ng-qrcode-16.0.0.tgz", + "integrity": "sha512-AVp3Tw1bAwqiHzt57x1Rp7YrnzkMUNlww1+ypjGvgbMPRYmy//cHOzMYsH3HPkFDDmPHwGerdAElmIA/X4SBiQ==", + "requires": { + "qrcode": "^1.5.1", + "tslib": "^2.4.0" + } + }, + "nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "dev": true, + "optional": true, + "requires": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true, + "optional": true + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" + }, + "node-gyp": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", + "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", + "devOptional": true, + "requires": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^11.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" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "devOptional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "devOptional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "devOptional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "node-gyp-build": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "dev": true, + "optional": true + }, + "node-html-parser": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", + "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", + "dev": true, + "requires": { + "css-select": "^4.2.1", + "he": "1.2.0" + }, + "dependencies": { + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + } + } + }, + "node-jose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-jose/-/node-jose-2.2.0.tgz", + "integrity": "sha512-XPCvJRr94SjLrSIm4pbYHKLEaOsDvJCpyFw/6V/KK/IXmyZ6SFBzAUDO9HQf4DB/nTEFcRGH87mNciOP23kFjw==", + "requires": { + "base64url": "^3.0.1", + "buffer": "^6.0.3", + "es6-promise": "^4.2.8", + "lodash": "^4.17.21", + "long": "^5.2.0", + "node-forge": "^1.2.1", + "pako": "^2.0.4", + "process": "^0.11.10", + "uuid": "^9.0.0" + }, + "dependencies": { + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + } + } + }, + "node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "devOptional": true, + "requires": { + "abbrev": "^1.0.0" + } + }, + "normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "devOptional": true, + "requires": { + "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": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "devOptional": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true + }, + "npm-bundled": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "devOptional": true, + "requires": { + "npm-normalize-package-bin": "^3.0.0" + } + }, + "npm-install-checks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.1.1.tgz", + "integrity": "sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==", + "devOptional": true, + "requires": { + "semver": "^7.1.1" + } + }, + "npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "devOptional": true + }, + "npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "devOptional": true, + "requires": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + } + }, + "npm-packlist": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", + "devOptional": true, + "requires": { + "ignore-walk": "^6.0.0" + } + }, + "npm-pick-manifest": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", + "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", + "devOptional": true, + "requires": { + "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": { + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", + "devOptional": true, + "requires": { + "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": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + }, + "dependencies": { + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + } + } + }, + "npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "devOptional": true, + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + } + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "devOptional": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "devOptional": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true + }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "requires": { + "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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "os-name": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", + "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", + "dev": true, + "requires": { + "macos-release": "^2.5.0", + "windows-release": "^4.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "devOptional": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "devOptional": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "requires": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "dependencies": { + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true + } + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "pac-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^5.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + }, + "dependencies": { + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + } + } + } + }, + "pac-resolver": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", + "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", + "dev": true, + "requires": { + "degenerator": "^3.0.2", + "ip": "^1.1.5", + "netmask": "^2.0.2" + }, + "dependencies": { + "ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true + } + } + }, + "pacote": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", + "devOptional": true, + "requires": { + "@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": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "optional": true + }, + "parse5-html-rewriting-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", + "requires": { + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" + }, + "dependencies": { + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "requires": { + "entities": "^4.4.0" + } + } + } + }, + "parse5-sax-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "requires": { + "parse5": "^7.0.0" + }, + "dependencies": { + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "requires": { + "entities": "^4.4.0" + } + } + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "patch-db-client": { + "version": "file:../patch-db/client", + "requires": { + "@types/node": "18.15.0", + "@types/uuid": "8.3.1", + "husky": "^4.3.8", + "lint-staged": "^13.2.0", + "prettier": "^2.8.4", + "sorted-btree": "1.5.0", + "ts-node": "^10.9.0", + "tslint": "6.1.3", + "typescript": "^4.8.4", + "uuid": "8.3.2" + } + }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "optional": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "devOptional": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "devOptional": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "devOptional": true + }, + "path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "devOptional": true, + "requires": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", + "devOptional": true + } + } + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "devOptional": true + }, + "pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true + }, + "piscina": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", + "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", + "dev": true, + "requires": { + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0", + "nice-napi": "^1.0.2" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==" + }, + "postcss": { + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "dev": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-loader": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.2.tgz", + "integrity": "sha512-c7qDlXErX6n0VT+LUsW+nwefVtTu3ORtVvK8EXuUIDcxo+b/euYqpuHlJAvePb0Af5e8uMjR/13e0lTuYifaig==", + "dev": true, + "requires": { + "cosmiconfig": "^8.1.3", + "jiti": "^1.18.2", + "klona": "^2.0.6", + "semver": "^7.3.8" + }, + "dependencies": { + "cosmiconfig": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", + "dev": true, + "requires": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-url": { "version": "10.1.3", "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-10.1.3.tgz", "integrity": "sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==", "dev": true, - "dependencies": { + "requires": { "make-dir": "~3.1.0", "mime": "~2.5.2", "minimatch": "~3.0.4", "xxhashjs": "~0.2.2" }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-url/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/postcss-url/node_modules/mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/postcss-url/node_modules/minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true + }, + "minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, - "node_modules/postcss-value-parser": { + "postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "node_modules/prelude-ls": { + "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } + "dev": true }, - "node_modules/prettier": { + "prettier": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } + "dev": true }, - "node_modules/pretty-bytes": { + "pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "dev": true }, - "node_modules/proc-log": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", - "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", - "devOptional": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "devOptional": true }, - "node_modules/process": { + "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" }, - "node_modules/process-nextick-args": { + "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "node_modules/promise-inflight": { + "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "devOptional": true }, - "node_modules/promise-retry": { + "promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "devOptional": true, - "dependencies": { + "requires": { "err-code": "^2.0.2", "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" } }, - "node_modules/proxy-addr": { + "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, - "dependencies": { + "requires": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "engines": { - "node": ">= 0.10" + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } } }, - "node_modules/proxy-agent": { + "proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", "dev": true, - "dependencies": { + "requires": { "agent-base": "^6.0.0", "debug": "4", "http-proxy-agent": "^4.0.0", @@ -12542,1004 +23850,694 @@ "proxy-from-env": "^1.0.0", "socks-proxy-agent": "^5.0.0" }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/proxy-agent/node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/proxy-agent/node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/proxy-agent/node_modules/socks-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", - "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", - "dev": true, "dependencies": { - "agent-base": "^6.0.2", - "debug": "4", - "socks": "^2.3.3" - }, - "engines": { - "node": ">= 6" + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + } + } } }, - "node_modules/proxy-from-env": { + "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, - "node_modules/prr": { + "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true, "optional": true }, - "node_modules/pump": { + "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, - "dependencies": { + "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, - "node_modules/punycode": { + "punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" - } + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" }, - "node_modules/qrcode": { + "qrcode": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz", "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==", - "dependencies": { + "requires": { "dijkstrajs": "^1.0.1", "encode-utf8": "^1.0.3", "pngjs": "^5.0.0", "yargs": "^15.3.1" }, - "bin": { - "qrcode": "bin/qrcode" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/qrcode/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/qrcode/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/qrcode/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/qrcode/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/qrcode/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/qrcode/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "node_modules/qrcode/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/qrcode/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } }, - "node_modules/qs": { + "qs": { "version": "6.11.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dev": true, - "dependencies": { + "requires": { "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/queue-microtask": { + "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "devOptional": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "devOptional": true }, - "node_modules/randombytes": { + "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, - "dependencies": { + "requires": { "safe-buffer": "^5.1.0" } }, - "node_modules/range-parser": { + "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } + "dev": true }, - "node_modules/raw-body": { + "raw-body": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, - "dependencies": { + "requires": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" } }, - "node_modules/raw-loader": { + "raw-loader": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", "dev": true, - "dependencies": { + "requires": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/raw-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/raw-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/raw-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/raw-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/raw-loader/node_modules/schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, "dependencies": { - "pify": "^2.3.0" + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, - "node_modules/read-package-json": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.2.tgz", - "integrity": "sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q==", + "read-package-json": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", "devOptional": true, - "dependencies": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "requires": { + "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" + }, + "dependencies": { + "json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "devOptional": true + } } }, - "node_modules/read-package-json-fast": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", + "read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", "devOptional": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" + "requires": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" }, - "engines": { - "node": ">=10" - } - }, - "node_modules/read-package-json/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", - "devOptional": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "dependencies": { + "json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "devOptional": true + } } }, - "node_modules/readable-stream": { + "readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { + "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" } }, - "node_modules/readdirp": { + "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "devOptional": true, - "dependencies": { + "requires": { "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" } }, - "node_modules/reflect-metadata": { + "reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", "dev": true }, - "node_modules/regenerate": { + "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, - "node_modules/regenerate-unicode-properties": { + "regenerate-unicode-properties": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dev": true, - "dependencies": { + "requires": { "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, - "node_modules/regenerator-transform": { + "regenerator-transform": { "version": "0.15.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", "dev": true, - "dependencies": { + "requires": { "@babel/runtime": "^7.8.4" } }, - "node_modules/regex-parser": { + "regex-parser": { "version": "2.2.11", "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", "dev": true }, - "node_modules/regexpu-core": { + "regexpu-core": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, - "dependencies": { + "requires": { "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.1.0", "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" } }, - "node_modules/regjsparser": { + "regjsparser": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, - "dependencies": { + "requires": { "jsesc": "~0.5.0" }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true + } } }, - "node_modules/require-directory": { + "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" }, - "node_modules/require-from-string": { + "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, - "node_modules/require-main-filename": { + "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, - "node_modules/requires-port": { + "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "devOptional": true, - "dependencies": { - "is-core-module": "^2.9.0", + "requires": { + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-from": { + "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-url-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", - "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", - "dev": true, - "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" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/resolve-url-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/resolve-url-loader/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "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" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, - "node_modules/restore-cursor": { + "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dependencies": { + "requires": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + } } }, - "node_modules/retry": { + "retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "devOptional": true, - "engines": { - "node": ">= 4" - } + "devOptional": true }, - "node_modules/reusify": { + "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "devOptional": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } + "devOptional": true }, - "node_modules/rfdc": { + "rfdc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "dev": true }, - "node_modules/rimraf": { + "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "devOptional": true, - "dependencies": { + "requires": { "glob": "^7.1.3" }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "devOptional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "devOptional": true, "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "devOptional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "devOptional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "devOptional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, - "node_modules/ripemd160": { + "ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dependencies": { + "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" } }, - "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "rollup": { + "version": "3.26.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.2.tgz", + "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==", "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { + "requires": { "fsevents": "~2.3.2" } }, - "node_modules/rollup-plugin-sourcemaps": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.6.3.tgz", - "integrity": "sha512-paFu+nT1xvuO1tPFYXGe+XnQvg4Hjqv/eIhG8i5EspfYYPBKL57X7iVbfv55aNVASg3dzWvES9dmWsL2KhfByw==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.0.9", - "source-map-resolve": "^0.6.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "@types/node": ">=10.0.0", - "rollup": ">=0.31.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/rsvp": { + "rsvp": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", - "dev": true, - "engines": { - "node": "0.12.* || 4.* || 6.* || >= 7.*" - } + "dev": true }, - "node_modules/run-async": { + "run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "devOptional": true, - "engines": { - "node": ">=0.12.0" - } + "devOptional": true }, - "node_modules/run-parallel": { + "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "devOptional": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { + "requires": { "queue-microtask": "^1.2.2" } }, - "node_modules/rxjs": { + "rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dependencies": { + "requires": { "tslib": "^2.1.0" } }, - "node_modules/safe-buffer": { + "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, - "node_modules/safer-buffer": { + "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "devOptional": true }, - "node_modules/sass": { - "version": "1.54.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.4.tgz", - "integrity": "sha512-3tmF16yvnBwtlPrNBHw/H907j8MlOX8aTBnlNX1yrKx24RKcJGPyLhFUwkoKBKesR3unP93/2z14Ll8NicwQUA==", + "sass": { + "version": "1.63.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.63.2.tgz", + "integrity": "sha512-u56TU0AIFqMtauKl/OJ1AeFsXqRHkgO7nCWmHaDwfxDo9GUMSqBA4NEh6GMuh1CYVM7zuROYtZrHzPc2ixK+ww==", "dev": true, - "dependencies": { + "requires": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/sass-loader": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", - "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", - "dev": true, - "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } - } - }, - "node_modules/sax": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", - "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", - "dev": true - }, - "node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "source-map-js": ">=0.6.2 <2.0.0" } }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "sass-loader": { + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.1.tgz", + "integrity": "sha512-cBTxmgyVA1nXPvIK4brjJMXOMJ2v2YrQEuHqLw3LylGb3gsR6jAvdjHMcy/+JGTmmIF9SauTrLLR7bsWDMWqgg==", "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" + "requires": { + "klona": "^2.0.6", + "neo-async": "^2.6.2" } }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "sax": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", "dev": true }, - "node_modules/select-hose": { + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + }, + "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "dev": true }, - "node_modules/selfsigned": { + "selfsigned": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", "dev": true, - "dependencies": { + "requires": { "node-forge": "^1" - }, - "engines": { - "node": ">=10" } }, - "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "devOptional": true, - "dependencies": { + "requires": { "lru-cache": "^6.0.0" }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "devOptional": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + } } }, - "node_modules/semver-compare": { + "semver-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", "dev": true }, - "node_modules/semver-regex": { + "semver-regex": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "devOptional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true + "dev": true }, - "node_modules/send": { + "send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, - "dependencies": { + "requires": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -13554,46 +24552,47 @@ "range-parser": "~1.2.1", "statuses": "2.0.1" }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "dependencies": { - "ms": "2.0.0" + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/serialize-javascript": { + "serialize-javascript": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dev": true, - "dependencies": { + "requires": { "randombytes": "^2.1.0" } }, - "node_modules/serve-index": { + "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, - "dependencies": { + "requires": { "accepts": "~1.3.4", "batch": "0.6.1", "debug": "2.6.9", @@ -13602,425 +24601,343 @@ "mime-types": "~2.1.17", "parseurl": "~1.3.2" }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "engines": { - "node": ">= 0.6" + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true + } } }, - "node_modules/serve-static": { + "serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, - "dependencies": { + "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" } }, - "node_modules/set-blocking": { + "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, - "node_modules/setprototypeof": { + "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, - "node_modules/sha.js": { + "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dependencies": { + "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" } }, - "node_modules/shallow-clone": { + "shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, - "dependencies": { + "requires": { "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" } }, - "node_modules/shebang-command": { + "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { + "devOptional": true, + "requires": { "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" } }, - "node_modules/shebang-regex": { + "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } + "devOptional": true }, - "node_modules/side-channel": { + "shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true + }, + "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, - "dependencies": { + "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { + "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, - "node_modules/sirv": { + "sigstore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.7.0.tgz", + "integrity": "sha512-KP7QULhWdlu3hlp+jw2EvgWKlOGOY9McLj/jrchLjHNlNPK0KWIwF919cbmOp6QiKXLmPijR2qH/5KYWlbtG9Q==", + "devOptional": true, + "requires": { + "@sigstore/protobuf-specs": "^0.1.0", + "@sigstore/tuf": "^1.0.1", + "make-fetch-happen": "^11.0.1" + } + }, + "sirv": { "version": "1.0.19", "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", "dev": true, - "dependencies": { + "requires": { "@polka/url": "^1.0.0-next.20", "mrmime": "^1.0.0", "totalist": "^1.0.0" - }, - "engines": { - "node": ">= 10" } }, - "node_modules/slash": { + "slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "dev": true }, - "node_modules/slice-ansi": { + "slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, - "dependencies": { + "requires": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } } }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/smart-buffer": { + "smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "devOptional": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } + "devOptional": true }, - "node_modules/sockjs": { + "sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, - "dependencies": { + "requires": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", "websocket-driver": "^0.7.4" } }, - "node_modules/socks": { + "socks": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "devOptional": true, - "dependencies": { + "requires": { "ip": "^2.0.0", "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" } }, - "node_modules/socks-proxy-agent": { + "socks-proxy-agent": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "devOptional": true, - "dependencies": { + "requires": { "agent-base": "^6.0.2", "debug": "^4.3.3", "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" } }, - "node_modules/source-map": { + "source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "engines": { - "node": ">= 8" - } + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" }, - "node_modules/source-map-js": { + "source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "dev": true }, - "node_modules/source-map-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.0.tgz", - "integrity": "sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw==", + "source-map-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", + "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", "dev": true, - "dependencies": { + "requires": { "abab": "^2.0.6", "iconv-lite": "^0.6.3", "source-map-js": "^1.0.2" }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.72.1" - } - }, - "node_modules/source-map-loader/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", - "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0" + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } } }, - "node_modules/source-map-support": { + "source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, - "dependencies": { + "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead" - }, - "node_modules/spdx-correct": { + "spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "devOptional": true, - "dependencies": { + "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, - "node_modules/spdx-exceptions": { + "spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "devOptional": true }, - "node_modules/spdx-expression-parse": { + "spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "devOptional": true, - "dependencies": { + "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, - "node_modules/spdx-license-ids": { + "spdx-license-ids": { "version": "3.0.13", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", "devOptional": true }, - "node_modules/spdy": { + "spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, - "dependencies": { + "requires": { "debug": "^4.1.0", "handle-thing": "^2.0.0", "http-deceiver": "^1.2.7", "select-hose": "^2.0.0", "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" } }, - "node_modules/spdy-transport": { + "spdy-transport": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, - "dependencies": { + "requires": { "debug": "^4.1.0", "detect-node": "^2.0.4", "hpack.js": "^2.1.6", @@ -14029,245 +24946,153 @@ "wbuf": "^1.7.3" } }, - "node_modules/split2": { + "split2": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dev": true, - "dependencies": { + "requires": { "readable-stream": "^3.0.0" } }, - "node_modules/sprintf-js": { + "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "node_modules/ssh-config": { + "ssh-config": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/ssh-config/-/ssh-config-1.1.6.tgz", "integrity": "sha512-ZPO9rECxzs5JIQ6G/2EfL1I9ho/BVZkx9HRKn8+0af7QgwAmumQ7XBFP1ggMyPMo+/tUbmv0HFdv4qifdO/9JA==", "dev": true }, - "node_modules/ssr-window": { + "ssr-window": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-4.0.2.tgz", "integrity": "sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ==" }, - "node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "ssri": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", + "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", "devOptional": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "requires": { + "minipass": "^5.0.0" } }, - "node_modules/statuses": { + "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } + "dev": true }, - "node_modules/stream-combiner2": { + "stream-combiner2": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", "dev": true, - "dependencies": { + "requires": { "duplexer2": "~0.1.0", "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-combiner2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "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" - } - }, - "node_modules/stream-combiner2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/stream-combiner2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, + }, "dependencies": { - "safe-buffer": "~5.1.0" + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "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" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "node_modules/string_decoder": { + "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { + "requires": { "safe-buffer": "~5.2.0" } }, - "node_modules/string-argv": { + "string-argv": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "dev": true, - "engines": { - "node": ">=0.6.19" - } + "dev": true }, - "node_modules/string-width": { + "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { + "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" } }, - "node_modules/strip-ansi": { + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "devOptional": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { + "requires": { "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylus": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.59.0.tgz", - "integrity": "sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg==", - "dev": true, - "dependencies": { - "@adobe/css-tools": "^4.0.1", - "debug": "^4.3.2", - "glob": "^7.1.6", - "sax": "~1.2.4", - "source-map": "^0.7.3" - }, - "bin": { - "stylus": "bin/stylus" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://opencollective.com/stylus" - } - }, - "node_modules/stylus-loader": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.0.0.tgz", - "integrity": "sha512-WTbtLrNfOfLgzTaR9Lj/BPhQroKk/LC1hfTXSUbrxmxgfUo3Y3LpmKRVA2R1XbjvTAvOfaian9vOyfv1z99E+A==", - "dev": true, - "dependencies": { - "fast-glob": "^3.2.11", - "klona": "^2.0.5", - "normalize-path": "^3.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "stylus": ">=0.52.4", - "webpack": "^5.0.0" - } - }, - "node_modules/stylus/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/stylus/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/stylus/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "devOptional": true, + "requires": { + "ansi-regex": "^5.0.1" } }, - "node_modules/stylus/node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true }, - "node_modules/superagent": { + "superagent": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.3.1.tgz", "integrity": "sha512-wjJ/MoTid2/RuGCOFtlacyGNxN9QLMgcpYLDQlWFIhhdJ93kNscFonGvrpAHSCVjRVj++DGCglocF7Aej1KHvQ==", - "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", "dev": true, - "dependencies": { + "requires": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.2", "debug": "^4.1.1", @@ -14280,109 +25105,67 @@ "readable-stream": "^3.6.0", "semver": "^7.3.2" }, - "engines": { - "node": ">= 7.0.0" + "dependencies": { + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + } } }, - "node_modules/superagent-proxy": { + "superagent-proxy": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-3.0.0.tgz", "integrity": "sha512-wAlRInOeDFyd9pyonrkJspdRAxdLrcsZ6aSnS+8+nu4x1aXbz6FWSTT9M6Ibze+eG60szlL7JA8wEIV7bPWuyQ==", "dev": true, - "dependencies": { + "requires": { "debug": "^4.3.2", "proxy-agent": "^5.0.0" - }, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "superagent": ">= 0.15.4 || 1 || 2 || 3" - } - }, - "node_modules/superagent/node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" } }, - "node_modules/supports-color": { + "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "dependencies": { + "requires": { "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" } }, - "node_modules/supports-preserve-symlinks-flag": { + "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "devOptional": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "devOptional": true }, - "node_modules/swiper": { + "swiper": { "version": "8.4.7", "resolved": "https://registry.npmjs.org/swiper/-/swiper-8.4.7.tgz", "integrity": "sha512-VwO/KU3i9IV2Sf+W2NqyzwWob4yX9Qdedq6vBtS0rFqJ6Fa5iLUJwxQkuD4I38w0WDJwmFl8ojkdcRFPHWD+2g==", - "funding": [ - { - "type": "patreon", - "url": "https://www.patreon.com/swiperjs" - }, - { - "type": "open_collective", - "url": "http://opencollective.com/swiper" - } - ], - "hasInstallScript": true, - "dependencies": { + "requires": { "dom7": "^4.0.4", "ssr-window": "^4.0.2" - }, - "engines": { - "node": ">= 4.7.0" } }, - "node_modules/symbol-observable": { + "symbol-observable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "devOptional": true, - "engines": { - "node": ">=0.10" - } + "devOptional": true }, - "node_modules/tapable": { + "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } + "dev": true }, - "node_modules/tar": { + "tar": { "version": "6.1.15", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", "devOptional": true, - "dependencies": { + "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", @@ -14390,316 +25173,238 @@ "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "devOptional": true, - "engines": { - "node": ">=8" + "dependencies": { + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "devOptional": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "devOptional": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + } } }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true - }, - "node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "terser": { + "version": "5.17.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.7.tgz", + "integrity": "sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==", "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } } }, - "node_modules/terser-webpack-plugin": { + "terser-webpack-plugin": { "version": "5.3.9", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, - "dependencies": { + "requires": { "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", "terser": "^5.16.8" }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } }, - "esbuild": { - "optional": true + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} }, - "uglify-js": { - "optional": true + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } } } }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/terser-webpack-plugin/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.17.7", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.7.tgz", - "integrity": "sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" }, - "engines": { - "node": "*" + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, - "node_modules/text-mask-core": { + "text-mask-core": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/text-mask-core/-/text-mask-core-5.1.2.tgz", "integrity": "sha512-VfkCMdmRRZqXgQZFlDMiavm3hzsMzBM23CxHZsaeAYg66ZhXCNJWrFmnJwNy8KF9f74YvAUAuQenxsMCfuvhUw==" }, - "node_modules/text-table": { + "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "node_modules/through": { + "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "devOptional": true }, - "node_modules/thunky": { + "thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "node_modules/tmp": { + "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "devOptional": true, - "dependencies": { + "requires": { "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" } }, - "node_modules/to-fast-properties": { + "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } + "dev": true }, - "node_modules/to-regex-range": { + "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "devOptional": true, - "dependencies": { + "requires": { "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" } }, - "node_modules/toidentifier": { + "toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } + "dev": true }, - "node_modules/totalist": { + "totalist": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", - "dev": true, - "engines": { - "node": ">=6" - } + "dev": true }, - "node_modules/tree-kill": { + "tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } + "dev": true }, - "node_modules/ts-matches": { + "ts-matches": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ts-matches/-/ts-matches-5.4.1.tgz", "integrity": "sha512-kXrY75F0s0WD15N2bWKDScKlKgwnusN6dTRzGs1N7LlxQRnazrsBISC1HL4sy2adsyk65Zbx3Ui3IGN8leAFOQ==" }, - "node_modules/ts-morph": { + "ts-morph": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-10.0.2.tgz", "integrity": "sha512-TVuIfEqtr9dW25K3Jajqpqx7t/zLRFxKu2rXQZSDjTm4MO4lfmuj1hn8WEryjeDDBFcNOCi+yOmYUYR4HucrAg==", "optional": true, - "dependencies": { + "requires": { "@ts-morph/common": "~0.9.0", "code-block-writer": "^10.1.1" } }, - "node_modules/ts-node": { + "ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, - "dependencies": { + "requires": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", @@ -14713,42 +25418,19 @@ "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } } }, - "node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" + "tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, - "node_modules/tslint": { + "tslint": { "version": "6.1.3", "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", "dev": true, - "dependencies": { + "requires": { "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", @@ -14763,632 +25445,522 @@ "tslib": "^1.13.0", "tsutils": "^2.29.0" }, - "bin": { - "tslint": "bin/tslint" - }, - "engines": { - "node": ">=4.8.0" - }, - "peerDependencies": { - "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" - } - }, - "node_modules/tslint/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/tslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/tslint/node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tslint/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/tslint/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/tslint/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/tslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tslint/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/tslint/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, - "node_modules/tslint/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { + "tsutils": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, - "dependencies": { + "requires": { "tslib": "^1.8.1" }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "tuf-js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "devOptional": true, + "requires": { + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.1" + } }, - "node_modules/type-check": { + "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, - "dependencies": { + "requires": { "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" } }, - "node_modules/type-fest": { + "type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "devOptional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "devOptional": true }, - "node_modules/type-is": { + "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, - "dependencies": { + "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" } }, - "node_modules/typed-assert": { + "typed-assert": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", "dev": true }, - "node_modules/typedarray-to-buffer": { + "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" + "requires": { + "is-typedarray": "^1.0.0" } }, - "node_modules/unicode-canonical-property-names-ecmascript": { + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "engines": { - "node": ">=4" - } + "dev": true }, - "node_modules/unicode-match-property-ecmascript": { + "unicode-match-property-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, - "dependencies": { + "requires": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" } }, - "node_modules/unicode-match-property-value-ecmascript": { + "unicode-match-property-value-ecmascript": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true, - "engines": { - "node": ">=4" - } + "dev": true }, - "node_modules/unicode-property-aliases-ecmascript": { + "unicode-property-aliases-ecmascript": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "engines": { - "node": ">=4" - } + "dev": true }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "devOptional": true, - "dependencies": { - "unique-slug": "^2.0.0" + "requires": { + "unique-slug": "^4.0.0" } }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "devOptional": true, - "dependencies": { + "requires": { "imurmurhash": "^0.1.4" } }, - "node_modules/universalify": { + "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } + "dev": true }, - "node_modules/unpipe": { + "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } + "dev": true }, - "node_modules/untildify": { + "untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "engines": { - "node": ">=8" - } + "dev": true }, - "node_modules/update-browserslist-db": { + "update-browserslist-db": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { + "requires": { "escalade": "^3.1.1", "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" } }, - "node_modules/uri-js": { + "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { + "requires": { "punycode": "^2.1.0" } }, - "node_modules/util-deprecate": { + "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "node_modules/utils-merge": { + "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } + "dev": true }, - "node_modules/uuid": { + "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, - "node_modules/v8-compile-cache-lib": { + "v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, - "node_modules/validate-npm-package-license": { + "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "devOptional": true, - "dependencies": { + "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, - "node_modules/validate-npm-package-name": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", - "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", + "validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", "devOptional": true, - "dependencies": { + "requires": { "builtins": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/vary": { + "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, + "vite": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", "dev": true, - "engines": { - "node": ">= 0.8" + "requires": { + "esbuild": "^0.17.5", + "fsevents": "~2.3.2", + "postcss": "^8.4.23", + "rollup": "^3.21.0" } }, - "node_modules/vm2": { + "vm2": { "version": "3.9.19", "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.19.tgz", "integrity": "sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==", "dev": true, - "dependencies": { + "requires": { "acorn": "^8.7.0", "acorn-walk": "^8.2.0" - }, - "bin": { - "vm2": "bin/vm2" - }, - "engines": { - "node": ">=6.0" } }, - "node_modules/watchpack": { + "watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, - "dependencies": { + "requires": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" } }, - "node_modules/wbuf": { + "wbuf": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, - "dependencies": { + "requires": { "minimalistic-assert": "^1.0.0" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webpack": { - "version": "5.86.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", - "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", - "dev": true, - "peer": true, - "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.14.1", - "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.1.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.0.tgz", - "integrity": "sha512-+bXGmO1LyiNx0i9enBu3H8mv42sj/BJWhZNFwjz92tVnBa9J3JMGo2an2IXlEleoDOPn/Hofl5hr/xCpObUDtw==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "chalk": "^4.1.0", - "commander": "^7.2.0", - "gzip-size": "^6.0.0", - "lodash": "^4.17.20", - "opener": "^1.5.2", - "sirv": "^1.0.7", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/webpack-bundle-analyzer/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "requires": { + "defaults": "^1.0.3" } }, - "node_modules/webpack-bundle-analyzer/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "webpack": { + "version": "5.88.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz", + "integrity": "sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" + "peer": true, + "requires": { + "@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" }, - "engines": { - "node": ">=8" + "dependencies": { + "@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true, + "peer": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peer": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "peer": true + }, + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "peer": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "webpack-bundle-analyzer": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.0.tgz", + "integrity": "sha512-+bXGmO1LyiNx0i9enBu3H8mv42sj/BJWhZNFwjz92tVnBa9J3JMGo2an2IXlEleoDOPn/Hofl5hr/xCpObUDtw==", "dev": true, + "requires": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", + "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", + "dev": true, + "requires": { "colorette": "^2.0.10", - "memfs": "^3.4.3", + "memfs": "^3.4.12", "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" } }, - "node_modules/webpack-dev-server": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz", - "integrity": "sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw==", + "webpack-dev-server": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz", + "integrity": "sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ==", "dev": true, - "dependencies": { + "requires": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", "@types/express": "^4.17.13", @@ -15408,557 +25980,372 @@ "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.0.1", + "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.4.2" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true + "ws": "^8.13.0" + }, + "dependencies": { + "webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + } }, - "utf-8-validate": { - "optional": true + "ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "requires": {} } } }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "webpack-merge": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", "dev": true, - "dependencies": { + "requires": { "clone-deep": "^4.0.1", "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" } }, - "node_modules/webpack-sources": { + "webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } + "dev": true }, - "node_modules/webpack-subresource-integrity": { + "webpack-subresource-integrity": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", "dev": true, - "dependencies": { + "requires": { "typed-assert": "^1.0.8" - }, - "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", - "webpack": "^5.12.0" - }, - "peerDependenciesMeta": { - "html-webpack-plugin": { - "optional": true - } - } - }, - "node_modules/webpack/node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "dev": true, - "peer": true - }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peer": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "peer": true - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" } }, - "node_modules/websocket-driver": { + "websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, - "dependencies": { + "requires": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" } }, - "node_modules/websocket-extensions": { + "websocket-extensions": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } + "dev": true }, - "node_modules/which": { + "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "devOptional": true, - "dependencies": { + "requires": { "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" } }, - "node_modules/which-module": { + "which-module": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" }, - "node_modules/which-pm-runs": { + "which-pm-runs": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", - "dev": true, - "engines": { - "node": ">=4" - } + "dev": true }, - "node_modules/wide-align": { + "wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "devOptional": true, - "dependencies": { + "requires": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "node_modules/wildcard": { + "wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, - "node_modules/windows-release": { + "windows-release": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", "dev": true, - "dependencies": { + "requires": { "execa": "^4.0.2" }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/windows-release/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/windows-release/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/windows-release/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/windows-release/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + } } }, - "node_modules/word-wrap": { + "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "dev": true }, - "node_modules/wrap-ansi": { + "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "devOptional": true, - "dependencies": { + "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "devOptional": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "devOptional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "devOptional": true + } } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "devOptional": true, - "dependencies": { - "color-name": "~1.1.4" + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, - "engines": { - "node": ">=7.0.0" + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "devOptional": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "devOptional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "devOptional": true + } } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true - }, - "node_modules/wrappy": { + "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "devOptional": true }, - "node_modules/write-file-atomic": { + "write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, - "dependencies": { + "requires": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, - "node_modules/ws": { + "ws": { "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } + "requires": {} }, - "node_modules/xregexp": { + "xregexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", - "dev": true, - "engines": { - "node": "*" - } + "dev": true }, - "node_modules/xxhashjs": { + "xxhashjs": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", "dev": true, - "dependencies": { + "requires": { "cuint": "^0.2.2" } }, - "node_modules/y18n": { + "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "devOptional": true, - "engines": { - "node": ">=10" - } + "devOptional": true }, - "node_modules/yallist": { + "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, - "node_modules/yaml": { + "yaml": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", - "engines": { - "node": ">= 14" - } + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==" }, - "node_modules/yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "devOptional": true, - "dependencies": { - "cliui": "^7.0.2", + "requires": { + "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.0.0" - }, - "engines": { - "node": ">=12" + "yargs-parser": "^21.1.1" } }, - "node_modules/yargs-parser": { + "yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "devOptional": true, - "engines": { - "node": ">=12" - } + "devOptional": true }, - "node_modules/yn": { + "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } + "dev": true }, - "node_modules/yocto-queue": { + "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "dev": true }, - "node_modules/zone.js": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz", - "integrity": "sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA==", - "dependencies": { + "zone.js": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.1.tgz", + "integrity": "sha512-+bIeDAFEBYuXRuU3qGQvzdPap+N1zjM4KkBAiiQuVVCrHrhjDuY6VkUhNa5+U27+9w0q3fbKiMCbpJ0XzMmSWA==", + "requires": { "tslib": "^2.3.0" } } diff --git a/frontend/package.json b/frontend/package.json index c96e73d45..e3788040e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -30,29 +30,26 @@ "build-config": "node build-config.js" }, "dependencies": { - "@angular/animations": "^14.1.0", - "@angular/common": "^14.1.0", - "@angular/compiler": "^14.1.0", - "@angular/core": "^14.1.0", - "@angular/forms": "^14.1.0", - "@angular/platform-browser": "^14.1.0", - "@angular/platform-browser-dynamic": "^14.1.0", - "@angular/pwa": "^14.1.0", - "@angular/router": "^14.1.0", - "@angular/service-worker": "^14.2.2", + "@angular/animations": "^16.1.4", + "@angular/common": "^16.1.4", + "@angular/compiler": "^16.1.4", + "@angular/core": "^16.1.4", + "@angular/forms": "^16.1.4", + "@angular/platform-browser": "^16.1.4", + "@angular/platform-browser-dynamic": "^16.1.4", + "@angular/pwa": "^16.1.4", + "@angular/router": "^16.1.4", + "@angular/service-worker": "^16.1.4", "@ionic/angular": "^6.1.15", - "@maskito/angular": "^0.10.0", - "@maskito/core": "^0.10.0", "@materia-ui/ngx-monaco-editor": "^6.0.0", "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", - "@taiga-ui/addon-charts": "3.33.1", - "@taiga-ui/cdk": "3.33.1", - "@taiga-ui/core": "3.33.1", - "@taiga-ui/icons": "3.33.1", - "@taiga-ui/kit": "3.33.1", + "@taiga-ui/addon-charts": "3.36.0", + "@taiga-ui/cdk": "3.36.0", + "@taiga-ui/core": "3.36.0", + "@taiga-ui/icons": "3.36.0", + "@taiga-ui/kit": "3.36.0", "@tinkoff/ng-dompurify": "4.0.0", - "angular-svg-round-progressbar": "^9.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", "cbor": "npm:@jprochazk/cbor@^0.4.9", @@ -68,7 +65,7 @@ "marked": "^4.0.0", "monaco-editor": "^0.33.0", "mustache": "^4.2.0", - "ng-qrcode": "^7.0.0", + "ng-qrcode": "^16.0.0", "node-jose": "^2.1.1", "patch-db-client": "file: ../../../patch-db/client", "pbkdf2": "^3.1.2", @@ -78,13 +75,13 @@ "ts-matches": "^5.2.1", "tslib": "^2.3.0", "uuid": "^8.3.2", - "zone.js": "^0.11.5" + "zone.js": "^0.13.1" }, "devDependencies": { - "@angular-devkit/build-angular": "^14.1.0", - "@angular/cli": "^14.1.0", - "@angular/compiler-cli": "^14.1.0", - "@angular/language-service": "^14.1.0", + "@angular-devkit/build-angular": "^16.1.4", + "@angular/cli": "^16.1.4", + "@angular/compiler-cli": "^16.1.4", + "@angular/language-service": "^16.1.4", "@ionic/cli": "^6.19.0", "@types/cron": "^2.0.0", "@types/dompurify": "^2.3.3", @@ -98,13 +95,13 @@ "@types/uuid": "^8.3.1", "husky": "^4.3.8", "lint-staged": "^13.2.0", - "ng-packagr": "^14.1.0", + "ng-packagr": "^16.1.0", "node-html-parser": "^5.3.3", "prettier": "^2.6.1", "raw-loader": "^4.0.2", "ts-node": "^10.7.0", "tslint": "^6.1.3", - "typescript": "^4.8.4", + "typescript": "^5.1.6", "webpack-bundle-analyzer": "^4.8.0" }, "husky": { diff --git a/frontend/projects/shared/styles/global.scss b/frontend/projects/shared/styles/global.scss index 7fc729952..a2a4de5e0 100644 --- a/frontend/projects/shared/styles/global.scss +++ b/frontend/projects/shared/styles/global.scss @@ -10,20 +10,20 @@ */ /* Core CSS required for Ionic components to work properly */ -@import "~@ionic/angular/css/core.css"; +@import '@ionic/angular/css/core.css'; /* Basic CSS for apps built with Ionic */ -@import "~@ionic/angular/css/normalize.css"; -@import "~@ionic/angular/css/structure.css"; -@import "~@ionic/angular/css/typography.css"; -@import '~@ionic/angular/css/display.css'; +@import '@ionic/angular/css/normalize.css'; +@import '@ionic/angular/css/structure.css'; +@import '@ionic/angular/css/typography.css'; +@import '@ionic/angular/css/display.css'; /* Optional CSS utils that can be commented out */ -@import "~@ionic/angular/css/padding.css"; -@import "~@ionic/angular/css/float-elements.css"; -@import "~@ionic/angular/css/text-alignment.css"; -@import "~@ionic/angular/css/text-transformation.css"; -@import "~@ionic/angular/css/flex-utils.css"; +@import '@ionic/angular/css/padding.css'; +@import '@ionic/angular/css/float-elements.css'; +@import '@ionic/angular/css/text-alignment.css'; +@import '@ionic/angular/css/text-transformation.css'; +@import '@ionic/angular/css/flex-utils.css'; /* Import swiper styles for slides */ -@import '~swiper/scss'; +@import 'swiper/scss'; diff --git a/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts index d557ae7bb..e5d1970bb 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts @@ -13,7 +13,7 @@ import { SharedPipesModule, } from '@start9labs/shared' import { NgDompurifyModule } from '@tinkoff/ng-dompurify' -import { RoundProgressModule } from 'angular-svg-round-progressbar' +import { TuiProgressModule } from '@taiga-ui/kit' import { BadgeMenuComponentModule } from 'src/app/common/badge-menu-button/badge-menu.component.module' import { SkeletonListComponentModule } from 'src/app/common/skeleton-list/skeleton-list.component.module' import { UpdatesPage } from './updates.page' @@ -37,12 +37,12 @@ const routes: Routes = [ SharedPipesModule, SkeletonListComponentModule, MarkdownPipeModule, - RoundProgressModule, StoreIconComponentModule, EmverPipesModule, MimeTypePipeModule, SafeLinksModule, NgDompurifyModule, + TuiProgressModule, ], }) export class UpdatesPageModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.page.html b/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.page.html index e0daac362..bb576c8f4 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.page.html @@ -60,15 +60,12 @@

- + [value]="local['install-progress'] | installProgress" + > Date: Tue, 11 Jul 2023 12:53:42 -0600 Subject: [PATCH 004/169] fix errors in shared and marketplace --- .../release-notes/release-notes.component.ts | 10 +-- .../show/additional/additional.component.ts | 4 +- .../projects/marketplace/src/public-api.ts | 1 + .../projects/shared/src/classes/http-error.ts | 4 +- .../projects/shared/src/classes/rpc-error.ts | 4 +- .../responsive-col-viewport.directive.ts | 14 ++-- .../ui/pages/system/domains/domain.const.ts | 76 ++++++++++++++----- .../services/api/embassy-mock-api.service.ts | 2 +- 8 files changed, 77 insertions(+), 38 deletions(-) diff --git a/frontend/projects/marketplace/src/pages/release-notes/release-notes.component.ts b/frontend/projects/marketplace/src/pages/release-notes/release-notes.component.ts index 49da475d9..c075d09ea 100644 --- a/frontend/projects/marketplace/src/pages/release-notes/release-notes.component.ts +++ b/frontend/projects/marketplace/src/pages/release-notes/release-notes.component.ts @@ -10,17 +10,17 @@ import { AbstractMarketplaceService } from '../../services/marketplace.service' changeDetection: ChangeDetectionStrategy.OnPush, }) export class ReleaseNotesComponent { + constructor( + private readonly route: ActivatedRoute, + private readonly marketplaceService: AbstractMarketplaceService, + ) {} + private readonly pkgId = getPkgId(this.route) private selected: string | null = null readonly notes$ = this.marketplaceService.fetchReleaseNotes$(this.pkgId) - constructor( - private readonly route: ActivatedRoute, - private readonly marketplaceService: AbstractMarketplaceService, - ) {} - isSelected(key: string): boolean { return this.selected === key } diff --git a/frontend/projects/marketplace/src/pages/show/additional/additional.component.ts b/frontend/projects/marketplace/src/pages/show/additional/additional.component.ts index 8ac6164ae..6814aad6c 100644 --- a/frontend/projects/marketplace/src/pages/show/additional/additional.component.ts +++ b/frontend/projects/marketplace/src/pages/show/additional/additional.component.ts @@ -37,8 +37,6 @@ export class AdditionalComponent { @Output() version = new EventEmitter() - readonly url = this.route.snapshot.queryParamMap.get('url') || undefined - readonly displayEmver = displayEmver constructor( @@ -50,6 +48,8 @@ export class AdditionalComponent { private readonly route: ActivatedRoute, ) {} + readonly url = this.route.snapshot.queryParamMap.get('url') || undefined + presentAlertVersions(version: TemplateRef) { this.dialogs .open(version, { diff --git a/frontend/projects/marketplace/src/public-api.ts b/frontend/projects/marketplace/src/public-api.ts index 605b76ebe..c8863886f 100644 --- a/frontend/projects/marketplace/src/public-api.ts +++ b/frontend/projects/marketplace/src/public-api.ts @@ -24,6 +24,7 @@ export * from './pages/show/package/package.module' export * from './pipes/filter-packages.pipe' export * from './pipes/mime-type.pipe' +export * from './components/store-icon/store-icon.component' export * from './components/store-icon/store-icon.component.module' export * from './services/marketplace.service' diff --git a/frontend/projects/shared/src/classes/http-error.ts b/frontend/projects/shared/src/classes/http-error.ts index df5d66806..8c7153ba3 100644 --- a/frontend/projects/shared/src/classes/http-error.ts +++ b/frontend/projects/shared/src/classes/http-error.ts @@ -1,8 +1,8 @@ import { HttpErrorResponse } from '@angular/common/http' export class HttpError { + constructor(private readonly error: HttpErrorResponse) {} + readonly code = this.error.status readonly message = this.error.statusText - - constructor(private readonly error: HttpErrorResponse) {} } diff --git a/frontend/projects/shared/src/classes/rpc-error.ts b/frontend/projects/shared/src/classes/rpc-error.ts index 848fd5f4d..d8d3de816 100644 --- a/frontend/projects/shared/src/classes/rpc-error.ts +++ b/frontend/projects/shared/src/classes/rpc-error.ts @@ -1,11 +1,11 @@ import { RPCErrorDetails } from '../types/rpc.types' export class RpcError { + constructor(private readonly error: RPCErrorDetails) {} + readonly code = this.error.code readonly message = this.getMessage() - constructor(private readonly error: RPCErrorDetails) {} - private getMessage(): string { let message: string diff --git a/frontend/projects/shared/src/directives/responsive-col/responsive-col-viewport.directive.ts b/frontend/projects/shared/src/directives/responsive-col/responsive-col-viewport.directive.ts index 0ebb564c8..aeded81ac 100644 --- a/frontend/projects/shared/src/directives/responsive-col/responsive-col-viewport.directive.ts +++ b/frontend/projects/shared/src/directives/responsive-col/responsive-col-viewport.directive.ts @@ -46,13 +46,6 @@ export class ResponsiveColViewportDirective extends Observable { @Input() responsiveColViewport: Observable | '' = '' - private readonly stream$ = this.resize$.pipe( - map(() => this.elementRef.nativeElement.clientWidth), - map(width => this.breakpoints.find(([step]) => width >= step)?.[1] || 'xs'), - distinctUntilChanged(), - tuiZonefree(this.zone), - ) - constructor( @Inject(BREAKPOINTS) private readonly breakpoints: readonly [number, Step][], @@ -64,4 +57,11 @@ export class ResponsiveColViewportDirective extends Observable { (this.responsiveColViewport || this.stream$).subscribe(subscriber), ) } + + private readonly stream$ = this.resize$.pipe( + map(() => this.elementRef.nativeElement.clientWidth), + map(width => this.breakpoints.find(([step]) => width >= step)?.[1] || 'xs'), + distinctUntilChanged(), + tuiZonefree(this.zone), + ) } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts index 1670fde80..fade1dedd 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts @@ -1,25 +1,8 @@ import { Config } from '@start9labs/start-sdk/lib/config/builder/config' import { Value } from '@start9labs/start-sdk/lib/config/builder/value' +import { Variants } from '@start9labs/start-sdk/lib/config/builder/variants' -export const domainSpec = Config.of({ - provider: Value.select({ - name: 'Provider', - required: { default: null }, - values: { - namecheap: 'Namecheap', - googledomains: 'Google Domains', - duckdns: 'Duck DNS', - changeip: 'ChangeIP', - easydns: 'easyDNS', - zoneedit: 'Zoneedit', - dyn: 'DynDNS', - }, - }), - domain: Value.text({ - name: 'Domain Name', - required: { default: null }, - placeholder: 'yourdomain.com', - }), +const ddnsOptions = { username: Value.text({ name: 'Username', required: { default: null }, @@ -29,6 +12,61 @@ export const domainSpec = Config.of({ required: { default: null }, masked: true, }), +} +const ipv4Option = { + ipv4: Value.toggle({ + name: 'Enable IPv4', + default: false, + description: + 'Enable IPv4 if:
  1. Your ISP or router does not support IPv6
  2. You want those who lack IPv6 to reach your site
Warning! IPv4 addresses are closely correlated with geographic areas. If you are not using a reverse proxy, everyone will be able to determine the general location of your server on Earth.', + }), +} + +const options = Config.of(ddnsOptions) +const optionsPlus = Config.of({ ...ddnsOptions, ...ipv4Option }) + +export const domainSpec = Config.of({ + hostname: Value.text({ + name: 'Hostname', + required: { default: null }, + placeholder: 'yourdomain.com', + }), + provider: Value.union( + { + name: 'Dynamic DNS Provider', + required: { default: 'start9' }, + }, + Variants.of({ + start9: { + name: 'Start9', + spec: Config.of(ipv4Option), + }, + duckdns: { + name: 'Duck DNS', + spec: optionsPlus, + }, + dyn: { + name: 'DynDNS', + spec: optionsPlus, + }, + easydns: { + name: 'easyDNS', + spec: optionsPlus, + }, + googledomains: { + name: 'Google Domains', + spec: optionsPlus, + }, + namecheap: { + name: 'Namecheap (IPv4 only)', + spec: options, + }, + zoneedit: { + name: 'Zoneedit', + spec: optionsPlus, + }, + }), + ), }) export type DomainSpec = typeof domainSpec.validator._TYPE diff --git a/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts b/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts index d12f98389..fa305e16a 100644 --- a/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts +++ b/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts @@ -481,7 +481,7 @@ export class MockApiService extends ApiService { path: '/server-info/network/domains', value: [ { - value: params.domain, + value: params.hostname, provider: params.provider, createdAt: new Date(), }, From e35a8c942b9cdda0dfca521478fbb43417855d35 Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Wed, 12 Jul 2023 05:28:05 +0800 Subject: [PATCH 005/169] fix: libraries build (#2346) --- frontend/projects/marketplace/src/public-api.ts | 1 + frontend/tsconfig.lib.json | 1 + 2 files changed, 2 insertions(+) diff --git a/frontend/projects/marketplace/src/public-api.ts b/frontend/projects/marketplace/src/public-api.ts index c8863886f..e554361aa 100644 --- a/frontend/projects/marketplace/src/public-api.ts +++ b/frontend/projects/marketplace/src/public-api.ts @@ -26,6 +26,7 @@ export * from './pipes/mime-type.pipe' export * from './components/store-icon/store-icon.component' export * from './components/store-icon/store-icon.component.module' +export * from './components/store-icon/store-icon.component' export * from './services/marketplace.service' diff --git a/frontend/tsconfig.lib.json b/frontend/tsconfig.lib.json index 2d527a362..55393940a 100644 --- a/frontend/tsconfig.lib.json +++ b/frontend/tsconfig.lib.json @@ -7,6 +7,7 @@ "declaration": true, "declarationMap": false, "inlineSources": true, + "useDefineForClassFields": false, "paths": { "@start9labs/marketplace": ["dist/marketplace"], "@start9labs/shared": ["dist/shared"] From 19f5e92a7405d65cd99c7bac7d963987ae9f43f0 Mon Sep 17 00:00:00 2001 From: Matt Hill Date: Wed, 12 Jul 2023 17:09:49 -0600 Subject: [PATCH 006/169] drop ipv4 from specific domain config --- .../ui/pages/system/domains/domain.const.ts | 29 ++++++------------- .../ui/pages/system/domains/domains.page.html | 6 ++-- 2 files changed, 12 insertions(+), 23 deletions(-) diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts index fade1dedd..0074d9030 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts @@ -2,7 +2,7 @@ import { Config } from '@start9labs/start-sdk/lib/config/builder/config' import { Value } from '@start9labs/start-sdk/lib/config/builder/value' import { Variants } from '@start9labs/start-sdk/lib/config/builder/variants' -const ddnsOptions = { +const ddnsOptions = Config.of({ username: Value.text({ name: 'Username', required: { default: null }, @@ -12,18 +12,7 @@ const ddnsOptions = { required: { default: null }, masked: true, }), -} -const ipv4Option = { - ipv4: Value.toggle({ - name: 'Enable IPv4', - default: false, - description: - 'Enable IPv4 if:
  1. Your ISP or router does not support IPv6
  2. You want those who lack IPv6 to reach your site
Warning! IPv4 addresses are closely correlated with geographic areas. If you are not using a reverse proxy, everyone will be able to determine the general location of your server on Earth.', - }), -} - -const options = Config.of(ddnsOptions) -const optionsPlus = Config.of({ ...ddnsOptions, ...ipv4Option }) +}) export const domainSpec = Config.of({ hostname: Value.text({ @@ -39,31 +28,31 @@ export const domainSpec = Config.of({ Variants.of({ start9: { name: 'Start9', - spec: Config.of(ipv4Option), + spec: Config.of({}), }, duckdns: { name: 'Duck DNS', - spec: optionsPlus, + spec: ddnsOptions, }, dyn: { name: 'DynDNS', - spec: optionsPlus, + spec: ddnsOptions, }, easydns: { name: 'easyDNS', - spec: optionsPlus, + spec: ddnsOptions, }, googledomains: { name: 'Google Domains', - spec: optionsPlus, + spec: ddnsOptions, }, namecheap: { name: 'Namecheap (IPv4 only)', - spec: options, + spec: ddnsOptions, }, zoneedit: { name: 'Zoneedit', - spec: optionsPlus, + spec: ddnsOptions, }, }), ), diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html index 9ce477592..2369d135c 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html @@ -36,7 +36,7 @@ Domain Added - Provider + DDNS Provider In Use @@ -87,7 +87,7 @@ Domain Added - Provider + DDNS Provider In Use @@ -97,7 +97,7 @@ > {{ domain.value }} {{ domain.createdAt| date: 'medium' }} - {{ domain.provider }} + {{ domain.provider.unionSelectKey }} Date: Fri, 14 Jul 2023 12:53:26 -0600 Subject: [PATCH 007/169] round out adding new domains --- .../ui/pages/system/domains/domain.const.ts | 59 +++++++++++--- .../ui/pages/system/domains/domains.page.html | 50 +++++++----- .../ui/pages/system/domains/domains.page.ts | 77 ++++++++++++++----- .../ui/src/app/services/api/api.types.ts | 21 ++++- .../services/api/embassy-mock-api.service.ts | 6 +- .../src/app/services/patch-db/data-model.ts | 6 +- 6 files changed, 162 insertions(+), 57 deletions(-) diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts index 0074d9030..63ad3777e 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts @@ -2,7 +2,7 @@ import { Config } from '@start9labs/start-sdk/lib/config/builder/config' import { Value } from '@start9labs/start-sdk/lib/config/builder/value' import { Variants } from '@start9labs/start-sdk/lib/config/builder/variants' -const ddnsOptions = Config.of({ +const auth = Config.of({ username: Value.text({ name: 'Username', required: { default: null }, @@ -14,7 +14,46 @@ const ddnsOptions = Config.of({ }), }) -export const domainSpec = Config.of({ +const strategyUnion = Value.union( + { + name: 'Networking Strategy', + required: { default: 'router' }, + }, + Variants.of({ + router: { + name: 'Router', + spec: Config.of({ + ip: Value.select({ + name: 'IP Strategy', + description: ` +
IPv6 Only
Pros: Ready for IPv6 Internet. Enhanced privacy, as IPv6 addresses are less correlated with geographic area +Cons: Your website is only accessible to people who's ISP supports IPv6 +
IPv6 and IPv4
Pros: Ready for IPv6 Internet. Anyone can access your website +Cons: IPv4 addresses are closely correlated with geographic areas +
IPv4 Only
Pros: Anyone can access your website +Cons: IPv4 addresses are closely correlated with geographic areas +`, + required: { default: 'ipv6' }, + values: { + ipv6: 'IPv6 Only', + both: 'IPv6 and IPv4', + ipv4: 'IPv4 Only', + }, + }), + }), + }, + reverseProxy: { + name: 'Reverse Proxy', + spec: Config.of({}), + }, + }), +) + +export const start9MeSpec = Config.of({ + strategy: strategyUnion, +}) + +export const customSpec = Config.of({ hostname: Value.text({ name: 'Hostname', required: { default: null }, @@ -32,30 +71,32 @@ export const domainSpec = Config.of({ }, duckdns: { name: 'Duck DNS', - spec: ddnsOptions, + spec: auth, }, dyn: { name: 'DynDNS', - spec: ddnsOptions, + spec: auth, }, easydns: { name: 'easyDNS', - spec: ddnsOptions, + spec: auth, }, googledomains: { name: 'Google Domains', - spec: ddnsOptions, + spec: auth, }, namecheap: { name: 'Namecheap (IPv4 only)', - spec: ddnsOptions, + spec: auth, }, zoneedit: { name: 'Zoneedit', - spec: ddnsOptions, + spec: auth, }, }), ), + strategy: strategyUnion, }) -export type DomainSpec = typeof domainSpec.validator._TYPE +export type Start9MeSpec = typeof start9MeSpec.validator._TYPE +export type CustomSpec = typeof customSpec.validator._TYPE diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html index 2369d135c..3bb2065bb 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html @@ -24,7 +24,7 @@ class="ion-padding-start" strong size="small" - (click)="presentAlertClaimStart9MeDomain()" + (click)="presentModalClaimStart9Me()" > Claim @@ -34,20 +34,24 @@
- Domain - Added - DDNS Provider - In Use - + Domain + Added + DDNS Provider + Network Strategy + IP Strategy + In Use + - {{ start9Me.value }} - {{ start9Me.createdAt| date: 'medium' }} - Start9 - + {{ start9Me.value }} + {{ start9Me.createdAt| date: 'short' }} + Start9 + {{ start9Me.networkStrategy }} + {{ start9Me.ipStrategy || 'N/A' }} + N/A - + @@ -85,20 +89,24 @@
- Domain - Added - DDNS Provider - In Use - + Domain + Added + DDNS Provider + Network Strategy + IP Strategy + In Use + - {{ domain.value }} - {{ domain.createdAt| date: 'medium' }} - {{ domain.provider.unionSelectKey }} - + {{ domain.value }} + {{ domain.createdAt| date: 'short' }} + {{ domain.provider }} + {{ domain.networkStrategy }} + {{ domain.ipStrategy || 'N/A' }} + N/A - + combineLatest([this.server$, this.pkgs$]).pipe( @@ -35,6 +40,8 @@ export class DomainsPage { value: `${start9MeSubdomain.value}.start9.me`, createdAt: start9MeSubdomain.createdAt, provider: 'Start9', + networkStrategy: start9MeSubdomain.networkStrategy, + ipStrategy: start9MeSubdomain.ipStrategy, usedBy: usedBy( start9MeSubdomain.value, getClearnetAddress('https', ui.domainInfo), @@ -45,6 +52,8 @@ export class DomainsPage { value: domain.value, createdAt: domain.createdAt, provider: domain.provider, + networkStrategy: domain.networkStrategy, + ipStrategy: domain.ipStrategy, usedBy: usedBy( domain.value, getClearnetAddress('https', ui.domainInfo), @@ -69,10 +78,10 @@ export class DomainsPage { ) {} async presentModalAdd() { - const options: Partial>> = { + const options: Partial>> = { label: 'Custom Domain', data: { - spec: await domainSpec.build({} as any), + spec: await customSpec.build({} as any), buttons: [ { text: 'Save', @@ -84,19 +93,20 @@ export class DomainsPage { this.formDialog.open(FormPage, options) } - presentAlertClaimStart9MeDomain() { - this.dialogs - .open(TUI_PROMPT, { - label: 'Confirm', - size: 's', - data: { - content: 'Claim your start9.me domain?', - yes: 'Claim', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => this.claimStart9MeDomain()) + async presentModalClaimStart9Me() { + const options: Partial>> = { + label: 'start9.me', + data: { + spec: await start9MeSpec.build({} as any), + buttons: [ + { + text: 'Save', + handler: async value => this.claimStart9MeDomain(value), + }, + ], + }, + } + this.formDialog.open(FormPage, options) } presentAlertDelete(hostname: string) { @@ -143,11 +153,17 @@ export class DomainsPage { .subscribe() } - private async claimStart9MeDomain(): Promise { + private async claimStart9MeDomain(value: Start9MeSpec): Promise { const loader = this.loader.open('Saving...').subscribe() + const networkStrategy = value.strategy.unionSelectKey + try { - await this.api.claimStart9MeDomain({}) + await this.api.claimStart9MeDomain({ + networkStrategy, + ipStrategy: + networkStrategy === 'router' ? value.strategy.unionValueKey.ip : null, + }) return true } catch (e: any) { this.errorService.handleError(e) @@ -157,11 +173,30 @@ export class DomainsPage { } } - private async save(value: DomainSpec): Promise { + private async save(value: CustomSpec): Promise { const loader = this.loader.open('Saving...').subscribe() + const networkStrategy = value.strategy.unionSelectKey + const providerName = value.provider.unionSelectKey + try { - await this.api.addDomain(value) + await this.api.addDomain({ + hostname: value.hostname, + provider: { + name: providerName, + username: + providerName === 'start9' + ? null + : value.provider.unionValueKey.username, + password: + providerName === 'start9' + ? null + : value.provider.unionValueKey.password, + }, + networkStrategy, + ipStrategy: + networkStrategy === 'router' ? value.strategy.unionValueKey.ip : null, + }) return true } catch (e: any) { this.errorService.handleError(e) diff --git a/frontend/projects/ui/src/app/services/api/api.types.ts b/frontend/projects/ui/src/app/services/api/api.types.ts index a0a0454ba..595282334 100644 --- a/frontend/projects/ui/src/app/services/api/api.types.ts +++ b/frontend/projects/ui/src/app/services/api/api.types.ts @@ -8,7 +8,10 @@ import { } from 'src/app/services/patch-db/data-model' import { StartOSDiskInfo, LogsRes, ServerLogsReq } from '@start9labs/shared' import { customSmtp } from '@start9labs/start-sdk/lib/config/configConstants' -import { DomainSpec } from 'src/app/apps/ui/pages/system/domains/domain.const' +import { + CustomSpec, + Start9MeSpec, +} from 'src/app/apps/ui/pages/system/domains/domain.const' export module RR { // DB @@ -112,13 +115,25 @@ export module RR { // domains - export type ClaimStart9MeReq = {} // net.domain.me.claim + export type ClaimStart9MeReq = { + networkStrategy: string + ipStrategy: string | null + } // net.domain.me.claim export type ClaimStart9MeRes = null export type DeleteStart9MeReq = {} // net.domain.me.delete export type DeleteStart9MeRes = null - export type AddDomainReq = DomainSpec // net.domain.add + export type AddDomainReq = { + hostname: string + provider: { + name: string + username: string | null + password: string | null + } + networkStrategy: string + ipStrategy: string | null + } // net.domain.add export type AddDomainRes = null export type DeleteDomainReq = { hostname: string } // net.domain.delete diff --git a/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts b/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts index fa305e16a..310ded003 100644 --- a/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts +++ b/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts @@ -452,6 +452,8 @@ export class MockApiService extends ApiService { value: { value: 'xyz', createdAt: new Date(), + networkStrategy: params.networkStrategy, + ipStrategy: params.ipStrategy, }, }, ] @@ -482,7 +484,9 @@ export class MockApiService extends ApiService { value: [ { value: params.hostname, - provider: params.provider, + provider: params.provider.name, + networkStrategy: params.networkStrategy, + ipStrategy: params.ipStrategy, createdAt: new Date(), }, ], diff --git a/frontend/projects/ui/src/app/services/patch-db/data-model.ts b/frontend/projects/ui/src/app/services/patch-db/data-model.ts index 6221a773d..64ef1cf98 100644 --- a/frontend/projects/ui/src/app/services/patch-db/data-model.ts +++ b/frontend/projects/ui/src/app/services/patch-db/data-model.ts @@ -3,7 +3,7 @@ import { Url } from '@start9labs/shared' import { Manifest } from '@start9labs/marketplace' import { BackupJob } from '../api/api.types' import { customSmtp } from '@start9labs/start-sdk/lib/config/configConstants' -import { DomainSpec } from 'src/app/apps/ui/pages/system/domains/domain.const' +import { CustomSpec } from 'src/app/apps/ui/pages/system/domains/domain.const' export interface DataModel { 'server-info': ServerInfo @@ -104,7 +104,9 @@ export type WiFiInfo = { export type Domain = { value: string - provider: DomainSpec['provider'] + provider: string + networkStrategy: string + ipStrategy: string createdAt: string } From 9c0c6c1bd60a9ec4566c587da7b16fd2dff41a6a Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Sun, 16 Jul 2023 23:50:56 +0800 Subject: [PATCH 008/169] feat: basis for portal (#2352) --- .../shared/assets/img/background_dark.jpeg | Bin 0 -> 2754888 bytes .../shared/assets/img/background_light.jpeg | Bin 0 -> 2720635 bytes frontend/projects/shared/styles/taiga.scss | 12 ++++ .../projects/ui/src/app/app.component.html | 6 +- frontend/projects/ui/src/app/app.component.ts | 6 +- .../components/header/header.component.html | 11 ++++ .../components/header/header.component.scss | 12 ++++ .../components/header/header.component.ts | 13 +++++ .../navigation/navigation.component.html | 28 +++++++++ .../navigation/navigation.component.scss | 29 ++++++++++ .../navigation/navigation.component.ts | 26 +++++++++ .../navigation/navigation.service.ts | 29 ++++++++++ .../src/app/apps/portal/portal.component.html | 5 ++ .../src/app/apps/portal/portal.component.scss | 8 +++ .../src/app/apps/portal/portal.component.ts | 8 +++ .../ui/src/app/apps/portal/portal.module.ts | 37 ++++++++++++ .../services/service/service.component.html | 1 + .../services/service/service.component.scss | 0 .../services/service/service.component.ts | 36 ++++++++++++ .../routes/services/service/service.module.ts | 18 ++++++ .../routes/services/services.component.html | 7 +++ .../routes/services/services.component.scss | 0 .../routes/services/services.component.ts | 23 ++++++++ .../portal/routes/services/services.module.ts | 23 ++++++++ .../routes/services/services.service.ts | 36 ++++++++++++ .../refresh-alert.component.html | 54 +++++++++--------- .../projects/ui/src/app/routing.module.ts | 7 +++ 27 files changed, 406 insertions(+), 29 deletions(-) create mode 100644 frontend/projects/shared/assets/img/background_dark.jpeg create mode 100644 frontend/projects/shared/assets/img/background_light.jpeg create mode 100644 frontend/projects/ui/src/app/apps/portal/components/header/header.component.html create mode 100644 frontend/projects/ui/src/app/apps/portal/components/header/header.component.scss create mode 100644 frontend/projects/ui/src/app/apps/portal/components/header/header.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html create mode 100644 frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.scss create mode 100644 frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.service.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/portal.component.html create mode 100644 frontend/projects/ui/src/app/apps/portal/portal.component.scss create mode 100644 frontend/projects/ui/src/app/apps/portal/portal.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/portal.module.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/services/service/service.component.html create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/services/service/service.component.scss create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/services/service/service.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/services/service/service.module.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/services/services.component.html create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/services/services.component.scss create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/services/services.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/services/services.module.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/services/services.service.ts diff --git a/frontend/projects/shared/assets/img/background_dark.jpeg b/frontend/projects/shared/assets/img/background_dark.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..59ed7d7d731f7a5ae6d669c4896fe4215dcf7781 GIT binary patch literal 2754888 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

<}{$TXk~j1iN;Bw%sV2N}p1=s_pH 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 wd1ui@%m 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%0AYdV_Gtgv~X@Nl_^EJLB?82PSJCX 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%0Akr`J{68j%^D~hT>X=Vu+YQj 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 $9Fr~u>=-#Z3X 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 Iw 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�A`IG`E0^piI(xOB2DGOy6sXE`L~qj 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

Na~!s9G>3-cm|36Q4=oC4)k@yTE| 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

G4dZJDj- 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%0D?1q&tDoXwVxdR&b|=vSHM4xD-HF`S3U}` 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%0DpV>T8eKg{z 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Ãk()?SX_~*uc64&jt-wjy!hfLP=JCUSox=)L5 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 z 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%0D3+M0P~-h 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%0AU3l3Z>q^TNUs=&~6? zkp1kM)V7+f&9{a1om;>fLK8lhqiVX{ua9)gRG9-V8u!D3?%iaDS+1?*wz8gB!yu9t zb!TgLJ}mKxvACaBweWtsqb0*5>e@es^h@cL-^+{3xUh~5D^P}MBw&soPFWZ^l*1CX z^&slXUi)!QF>SRb(oPpnRHp}Jt@)cx-K(BeN-%EJ?`S<7TvF4OHr$iCcK-ktz4r6y ztfhq$9wqSY%NLF_i)-jqG2Gj{%ZnC_1Gmg8_J-aVI>h@t!P98A+N$anzh}4b-mQy^ zca1EsE-s9-vxuT0A)eZEF7g%_-*g0pW&sq!bs^StE6C!8Uk*v9pFR^LejmHC&@VSM zdwlDCGV4s#niQL&{{Y0nVS9wgww_;T9+09*59lTG+F@K0IQHC58$Bs5Fo zFOD8Q)jV}=rL-3~j{g8o@Rx`6y;69C+c${(IdFH{^1d$dM}s_5aT?s|8aIJ7hzf-G zfAF(M*EO9E2TrAhI46(={ok@^%)!@!yQMMPUpDfFn+@G3}B@f(XL2vec8ro)z%2t6g~e;b(^K z5y6q57oQR}xe9M>lS^U!rDqA)1YUldX=?*Bk17;JFvY=6IUO2}yi}U9ic_gBS9c3q z?M3YEFNv+>)$i(K^WG!OsKSj*H40Spx}`!Yqh9W=Q1_CTT5w9ARIj7xQXhrbKiS_4 zz9{&fMjdr88bzeSLZdcieK$)<1dX_FRg`TgN`Nz0W7B**%)D!5I=F^ns*RwUp7?6#lq zOP}~CmcJvfhQDBsj#Eatl534eNxGgrvmlfAmlNLT>ls98Lz$23 z6EF7V_<5(zs(ADEdhqXp1*}p|_P#Ut@%uV>Cs>9URT-p%Lh+x)skK|#6=X(^!o~}$ z+2k?74XfSBhZZzMtUDZ%{}=Ali*3hlI4v6__Z>v);Uy3z-&2jE6nVkHRmA@-SO}haMn> zG6{J6DHWh_Ff;qh@Ku{T6qrDb%N>A?we|Q+b!xDTxi1%H++6LvcS>#-*3DZ@{Ew5Z zg~nmz)a7lixuMFEQND`KHtO~5*x_!cx4KYuNj!0{85A;`i?~ZjtU*%I8E27HmQrye z5559}$Zfu!#S7ScKEGJ_&EBbVJaGVXhIwbSSOCak#b(C@XBpk@noqzVidPHut%;9w@$4OO!Ye`yZr>u3n zQ*GU)vTb*@&ygdBTZ8+p13zjYskH#^TO;6)z!v6pZz^XwW9q|16 ztf-60*wQtgT~7dq8R|Cd&Vn!55K5ybY>~{{U*#l}6CV z{Xsy0DaVbBUz3%t5uiLg##bI?(oL<^l-8(Js1e(70Z%gj1&ygUH zT7if5r^jzK7X_`nC*Ub%x+*t~vD{B#q@-@6b|hv)f(c}7lX>+I4wWD1zZ5)cFdWI^ zFA?d!8Pi#SJs`5Yy}3xkDcY{N2&51T1Yfiu{gVD1x`S~K#{U2kDsDf%n@Z5FP8&IQ zpG$&Zq!LL&r9zw%*bBL3`zm}TLPK~}OKP#;Zi>?(p8%%N z4vR3U7~7S-7OBclM7m8%E4$Xm6@wvyNG(``5SNB$E{PSiYlW{2>* z!C(Lu?)y@?*L76FuqMi>e<`8gN^IQeVz??nBZz7c7xB(nHd;Qc|@Kfcy{LjV8h?-Uhwb$Z552h&~`L z6@uG%Us%+UfhTJ(oo*0@DhOk_cJr1T*L|ma5AiNg+ITy}im$>?;%^S=z8r{vSY;;E znHvC~n26bi#$ud+-=o+5C-_}#r6c&Mtn1B^Jg*FVKk+@?wg<`#Zx)`G!>0kI#{?2V z+<2SI`#b3wyga@;xKa+=i~j%x+v%~APD8Wnx|}hqa7QInV{jyvQ_~6*rSE&Z&d&PX zd?~w5Q`=OpZSJqrjpjA(lvHeupUIYA0envxEqmfGg}xjI8>H2B zOL-+lKX^LmdK{sOs{l&AO5pD&l-sxXFX20OSMfLPIpM7<7!p|cE5SY`@g2qh04JL3 zX&&x&h8EA%9lLpNqT$dyT{8xb;_@PL&NW-l0K*VoKxa!kElT7CKX@CAj360jC5!W- zX$j_dkHp>xwA;jud*n`t6qa-3CZTHs6d3;imsu3HP$RK8xiw9t%#ux8S9h{qZL783 zw%gHtcNHr&3ngpWDC_R%thukJTPLidR)R zAucr7S~!`8LOsaGB*@Ca*S4_mcf%tXlfxeazA@_X54(Hfcnz(-03W=b=HTAKpsq<| zfq(?DjIaw{h2fiP&lr&x!+S4^KM+R$052a3J{0(}eLWl=5?xx;O19G?W4N-s*ZZSf zFu>Z!-}Hak3-+e*Ex-1RpR=cl^vxn2vq`V~c=(;8_zy$1g%}AZni+gSZ8UL1m1l-o zJiy??J>qQ%b@S?L*Q_Ko+_`tvt?z0$GsG&&u$ zduP-B7JL}+Wts&iRPnEgWWBtAla0pC3mC1-qXW4XB2ObfE=AjUZuJ=!$4Bvonc{1J zbdM7z4qnG(s7G? z()e_=UFCJx?@MCimSXC(qURRcZSQTB+ifJg+SRANw*1++_)p?LIX}1UyjP=HTmoaZ z@o&YC0C;)_Mg>HPWubUs^V$BMocLufdX4NF|S z@xG#~E=-TRN%1B6nE)&!BSN<9}_>|ncfqg<4$Yu+IRN2y^GA2@c2D1 zyg%UUxgvCt*7H~vUk$XYyGbNu#M2F05+Mxo%jUx~bFce%d^7NTQ0ZT@=lm0|;h%)y zj!7QZS@@@}T=>fQBNrw>W={`knhl4W4cU=rhr}K&)WXXoaNbDKtVHEQiDOb+l=6C$ zlG>!IX#N)c-dAL-ukSnEosh|D?^`pKEj}4@K9KFqy&qospFZi|4EzVK+Dm=lPYL+L z;uejk#yuwBjbmOZH}?v zui1Z2@b`yfD6#7vD$<}DS}9MKq#;&4RG=4r6WIx@GHG>HcGvEwh>zxJ-z zbqMucZ{t7g{)qQ6pPhNjx>7c*^6$@GOtfg_dvO`P@gAdVrD(RwkXx5J zyV=;81H|^0cMBq>^Um`(r7R^pI#zB{oMxhzEBB((lD6w*W#xA>$ndHzQpVMYHi$KAy=Z!QU6@7Oi*VzuG_cc=$J^q*2W&weilWt?OwNqEqF=qIiE# z)h=baWsI2ZY(yYJ;gU#VEKdt*7wk);YBJ5Jc-Quh{jL01cgE0sJ@7=H2k^Xd#RJG7 zeQ(E)tazU8)lP9NI!tkGhD8AqP*=b3C+vmduM=Kdn?DQaHj_^BOzrUw^Ta+k)#8Z} zp622Y3HUwjd@@-ShPamF#6e(T8c!0&V`1(Z2kf)(=Tn;FN!LC#c$3C0Xl9F4@Mpn0 z3p+TKw=kB@UkH35@UMvV*p(mmj|Yi7S8Rb6NUp`D$CMk+#AlUbZ?58Hh*~!abbXq# zOKC;l(XDjXMvP&WVm11<5>SFyjaN50D>&cXZYf{+Twa^A=1Z@Ro)7Sy%+Po%_EG(p zJ{fA3%Ca95e$d`4)Vy=7*#(9tf?JOc>5rpn(O$K?D>c0O62)%8QQhPzBVgM8)!!OC zb*(>#{5AVZc;8vPwtbTLJN7g952pBj%E^4(c_&}7(Yz;jZEdwwEYj-IA_ge;5lJJv zex3X>{gpl)=rbmv@Za_z)%-`O*~j*&e0}>x%i!+_==M;deb?7X0kc^U6g+F#yaaMlqo85d@)!E$q*3&;^@7jmsZN!@Ecn9Oov*#k)jeGWx z_=}`zmOJKg9G4SlcUJy9);Uq{cwQ;2{w4m={{R5= zE6^c|KMd#^_k&X2$)Wp8O9ken<5KZ9+l7JSTRk??eMMYak)~W;tH*El#)I)2z<(Na z*VcX%e#GDKQeXHeg`8IDe4aD->*EVAfj_g7TSIN;e`{-6oxY(LfMU{81d?ZiR`AxL z1Xl1&S?=Lk3i=;{ynFjp>bGg?c?}i@HgHE&DJ0eGxB4h#GjNBua*L8qYH3BQ^0d@0-Ljh_;15n zpNc#^qRR!oq2n3;8~jtzz8PtEvzR8aJ|_5s@fYGR!@VQK_FB^JirDyf!g{`&rZX_s zV7s%DH$JbZ{1)&(!Ru>nL*hT}TmJwA?ERP$C}8^(cApOPuZ^D(EG6=zX+)P0cw@qv zCY>yewj^6LxwSHrZ*6_4IxW+C9=-6B_LsTveg6Q(AKH8Nko~uOSK*BpOtrZlEcml z*TVd3`&j<~!8bo=e-L<^MED~ghjndEEmrE{{{Z4A?3?g!P4R!mzZ1f!u?sCn_PhPE zykq0NU*Tn@v3CX2UTQxJz8_2CH@0D^>H0r`?Cu)hQsSQ#X4si~3_UvD`dpl`r8Vxl zeDR#4PI0E)(uXxIc9V)zlI_D}8GSUWR;?D|{?wXFMQt3TC2MNc`rDgC{X;^$@Qm8s zpNG6Z`&@q7-x4+HT1)tCejNVC-XHiWpk1Y%{j$e-py?kKtb7^bZC^(TbzzNb!hRR= zCx$f3EbCf}OL*3LUGLJK82D51hFu`|tKqlB4~;(z{25_u1bU~%-y8TpL-+~dD=1~t zp`BC2f3%P7XW}m&d}{csVXn<_FO%Xwg+C1R?+CPWF0mEl@LTCq+oQ{IqWq_?yPp-xI%VKaA4JYjGvUpMB#Wi(eJA(fzY|X{nzs4-UoP zX}liyi}nY(*7Ro6bc;XD?~Gp?zA$`m)GmBg`$+s^__O;;X%Ne-OuCoE{{R?Tcq`%m z0EV^3)r;)#r-m#b)hv8oZ?31AFCg&OhpiycH9JQCZf}yB?V6D`_bi;oOD-eOxC<|%1YFnYRWd!7g1U(E_#(5(r)*Bs`A-J$-mt1 ziQf}{;GRAf@d8+Ub^WJ&P5W#7SJIWPV)%XVet(G{00BY%zO{|i8l|)sT7Bi!=fw|= zdinjE{5fk4!?MSt_+P?tL8l@cXz%qbwDElX;*a<$jjn-lH-|rGFWF<@=YjtKvSXNO z_umz-H6Pkf;#Qd#*;ZI@t-L9rCX4XT!}HtRfi=yPkZU@82{PEV+0&y-W&GRlhr%Bp z_~S&kO-jN)hJOzlWk1+Dc^)2ydF&v*chxmXyh7d>zt`?88XL=2^R;a|PiX$p9GAKc zx?0~$^>4yogr5z(H+;v$UKiB-SE6a>TYWD=(k-s+^f-K7;rQ0~!yr}$3ZFBNLK z4w)>G>RPp~ovZ44$B3-sfL`0%J;mIXKF%91#?(qUyhTYZRFjlr?zI)j;}-a#)ts zHQiTElkJz*@L4&%j2nMG_>1FD9ehvJd{f}x5cpfeko-8b)U>Pr01Yj^qkrI?PhSmv zW2r$5eiHE9_r4qO&xy3%CrFz?(e#VGKG(zA9n+huyDRNkM!P?t{5JRx;m;OnTJ`?` z#NUUub3&S)ihL>Ij|J)1ku>^@x|`eIL#p0tw=!zJA#ElbtvgLfkiiZ9xiV_nY?0gO zmij)W?M_&1uMXs@Q%W4EN7=@#=BDFk6syr~Dakp>rjk;-S4@n*DaYouX;Pg!)2UWb zYgssQsK!@vl9XdKuNIsd=1bg7wDokagOg~#ZI4sed^M!a4v{vosc5<;t!v|76YR;q zYYDXtBUBnrlXU3`y7M)?ePO+p@+Gs5?%|D@_df%8C&RH^-c4`tZ^yqAAimM3xqWlT zJ~z|;2>dFxbcvQ*CAYNEHIEp0mQ7+QA-L1-^$lCYkm>QYjkLOTvATQ8_fH7^&KjkS zh1KKcvji1n+pVR5OQBT?6{JVR|~sNFcZ zUlHEv);cYOCM`Y<7Fetxib(vdE_Cs=Wf;|^%9K?|$Cb6sWS=A|N_?rS>rrakN^sQu zPY2=cd>uGd#M6>(Cr(u(DJiz&+BBniCamJQQgOQYk=5zq>%iKT&X=crJpGV95o&sM z%e1<5$Hd)G`giJIDbT~Zh!wump=t?#6R zRJQQlBSecxzDS|c^b0tkV>PagZ7M|$jXbL($Es`BHm!YotTl{tGzlx*MrYWv8|R2c zZ3oi-01v(&_@7+9vDU9=*ZzC8k+o|r9c^^`KKa74U*K|ukHMORz;uvkFmD*VCW^e3`FHKal zhUU`lOMBIqR+CbWJwhp(;cjO#*V)>az$)VyNTc#d5= z!@eJe*7dZT-A%4wYcYSX>)Iq%7Lad~QU1r&?om<~HtFgf3ivPJFA70#EtiIECK4nv zOE$SQ+O^|PhiN3bxYVvMnM*lBkw#&JW#-=GDyO%2NX-?!`pED_FWc@d?HUO@^^VCl zT(b!g+8Ayfu3jdE3J4;%ixEdLn?H>4Umklm31!u4Q*q{uxuZ%En_P|$*}=5kI;+}2 z$-Q2_U()#xhBPqLFOH2lx^{Ak_iWyli;R_hmrD3opr(^;EtHpA zr29qHg`u>x@}6NTSlPhW6I?}O0Xd2ZE@dwul3=h2ObO{oB#efgyv9Ew{ECDf_#CRE zo^TWq(2NWcD!5|NgpGlWFgXB{SQ1zgaKIMlk}_90#wk=P1Lcy$;1by!7C1R7asVZU z12Oj`XYriNh^u2=N!P0DRhx30=gOqpX}w~UU9PT`m9#$Z0g&Oays@K35R6o8qXd$( zR!P5w^>=MH{Mn{ z90CPE(hLmn3FtQsx$bgEz$B5hl5#W9hk+>1JBS4I9AM{=rzaWUk%sHsiuw5BZ#LEW zp3c_OPoIBxW7esLgc4rv%S{{6uG)OB-*L7kT{Z`SSjew&d3JLCU=m$iy~Ke|)d;bf zLL!Ay5mXJ>Ig%ZS?IFUvxh1kg9FkijoSndAk%N#BO-JxEc5j1Gs?V*a4di+k{x6!P}A+LXM}BNf5ExI4W0hASixVmH3!qRBI;W)uxrxeb-ys z&qZ$9t&=|}#8+ypz2{{&tYylQR_WUN-8Ht_+vUHBe+~ZtvtyG`(}a$TBgrT}SyheK z%wjf_Qg;D{QY2+0Fmj=*=3PeCSq9e*C0~(MvO*lI62Z@zmQVnFxd49yU9|1!u6~2VS(2+CWm&0IO>)cK_n~Op(Z82n z^*k!#+UfVg+gCexGI>RUf(noU`=g_tGn{ZuaDF4wG^;c-Ux=bP0GORafN+mC!8k6V zWKz3N%;R8HFT8rS$(uX=R@eyJ$s?g7X;wct1LkAK2N+@(lhxs~)X^iniYb_Xs!NDt zl~ZsIjq_oUx_}ES#>5U-Du6#@z}Af^)2QV%n_SKf^K!c`WoDCaTdUi;N41{hGR-hm zAsTe#r3U$2UarxydOahVnyWec~x@bg6DLv3}L4T*os%nFIZ#==ZY0eQ76~Bv2*1asvW9 zHz_i!Zq}Q^{#(krZ0AZ)a#GZZU=fKTkU56)&WmCsJMWt9= z>NeLh_(Ak%h8V5&i(eE1#z!q?C$*cyI)#H;p;ZfWJoeV`wxI{w1dSV;ek^!%;Whh9 zrZ0#sJV`VUG;rJ5c&|$M>y;g6b!GjW&J>3dka#okF-B<|IncI_wb=%?9l)ODZjgKOaXCA!gdE59ZP zWCvIAmb}n-X5I^l=Z^DEx3<=5=;a>>Fac3R8*S8VJXQ+9~A+pmWzMkR!&*~Q%zs4PYJvz_g zMURKPXQAo#T9jI6g!TUb5?X6|9i+`Clcrx>YX1Q6u5_(h{{T^j$=Vqwy^g`|((ZSk z`$9-wOP!Aj__N}Ng0$;>H^Z@LIzNOgE}{^46HC>1==OGYWTI(09pwHT(zTrdQFmNG zG-;x?u)atx7fLp&@rs6bm{Ccrd|OFbEM#gzap#rNoT=NHrw{pa8K#}_4OshZH-lIl zMh~A8LY>@sns9_~@VPE~PF&iwy~!=xl6s#w-$C$}E4@QRnY?S_5sNEjvC}*Uv;QKJN(`>%Mtm?KpalE>_j@|W75?w?fxVURwKGy!`(JhZrsLkSN zZM1&F|3x(~JF|Qi?8$nf5MRjyTHy00M;7Dy~xIbkmH}e#V-; z*E5W&yDdAPA&cUFR#pys9}=lqVG^^1o*l8>^@|&2@H9l~? z(R2~u?*@1)LDAO!`|a@f%I&qeY_F~*{?MPqzA4wWMbvexh-Z#Stu6H}N6Ut5X`{7k zG-!4hL7PnbEu?JY?G~2SS5w6_k!eJ< z7TQR+R-PDcWYq05eQ(RZjh|H8{{RTj!bm(-4W^@}+3GSw@khy$9}xj1_1=!QX`w@R zWhI5Q$t1V>ot~Ftrir37MRg#5kM;Wa8@7jN=69)Wj*cPo6a+QZvL(q?Btb z^KG|t#Ny5Z;QYcgB~Jl`p*Tgpd^}}E$t4uj+$q{prrKKFCvSNzSI4qxvCfm)Ec#vS zDGaZuteSbaM{PObzPyIg=3A{QOSx>s)-uX1;5+V2DAvYl?ey~PN5HzqnQt|wso_mx z@;weqYaL!~GfGV(SZxY-pHQ`)?(0|3@3ooM_Q*{XSJt<0E!;0ES>8wnnryy{(e=Gg z;sn|!h-`iwc$ZGnqqy-VqpZyY=KkMOy`IJ6@V&l}-YC&D>n&UR8B_aKZxCu1FhaIA zR_4;nP!7>c)yZm_40@yMmwyrTol`}B4_<0RScAmct@9?r!}URrRf@epKOOz(%KC^;h^+!JZFe*5QZL{rv5rkq-s=EIpZCEuNb7AnodqC z^NZ%P)8Mea6XiDNc$$%fnsHI33&kY8;cpM$YW^Jfv+&=* zE92|^Qrktc@Q1`d4tS5l8s3L-p;+2KhV|1nhv2z%NOg@pF5uKJ?N-&Vyg{YGZr6`@ zeXL6N{G=Wb@U(K===zt#e-7!E@OYBuT{FQJ+FfEfM@pvf z7v2oA@M{kQ_)}4{pT-&nr*)$IR`_G_CrH)&L*xGd8ELDg_>WPs_}8po{7Aaj?v382 z+Fg&0ekJKzMbC;gy;oM!^k)kuhoNCZh;f*P{iX>;dyuH%jdA2o9LcIlPuV2mskK2> zljgs*-M^X7I0r4kR8WRs!-xRz<6!$uNd@I&`Iq_TKc877{y$?&X7y5UCJWnse>-Es@ zC)6~nUkXJ$x@ocC4~Tp?H0@)erJj}J&mDNp{{UqzKjAlxAfHC~k*3>Te17mR?A2qh_)=EV ze0kvOEiX>J@EyJX0PO%8ON~>;{w#LZBk=>qJPYAZ3)$&S;#SIBRfBF3cxs%nbRWaZ6iNk!Rvv1waI zr0lKvHG6U4)QEU@#g>;^9o?RtZ>ad6S@0&MplX)dwWX9%#o+s24?`8dh!f%8i9X$} zO>yHmpT_!*gB8PH+T3Y&_mOFq>#G&_#Jx(;>Q`Eyg}h;Ut{hGHwWB8}SP4M5tS~rHg zN%4PJ_;K*;#eMM)_Hn!M?y2FA9e8ub*4kf*v}iS-i+abyjS}MPS|=~@jb?wZ}2}t@II~J zj}3TR;opl}!*)l;cODwh{u^k19)av^j;G@P01tSyYFej-?`?EFH(7&LgTy+ni}cuD zB*9`Saw-#1=60zXIIK!?j{!xR-O;iJP|kA;%z1vzQd+#7g|Iz>O@-$g}u{!d&8IB5dOp#T1Js+ZJ=ohsyz0Z zpqoy<)#i@gXf)*i0ECyso*=rC=fgG=UtZt;0BFmrzMHGaiEjiDTPtcU^!3lf--6|I zZw%c0R-fU{nWJg(>Ru|;wBLpr{{W6WA>mDCX(6}Ld@bO;JH&oEhsXXd@k~A;*C4ys zG@lmP>Anl_)y}B|R~qu_Hx`Yl`k#&d19-Q<6W;iH;}*H`Tj2iy#62OrHDj;ozYzRC zrF>A-^p6&J$HUfouYhCFZG02)6HA)kTGuqKTT{8#Z}lt9BE!K~U-2f?lHXMDzPqT7 zm!DuGIP(Q%d@?k;4G(*DO%8q?fFjQdQio;lFGbK?I13ix(yT5Fwcts3*ho*_1E zX98*v=@${)+uCzlPs3k^zAKmF&Yf@Z*GbUz-vC&69`8)kd_kaTe`4_k$B4XHsQ4>V zu+cSD)?&5P^%(p`r^0mY96ptQE|;t6`kKQ$Npo*B{{V007Uz_)30YtLp0uo`QZ!n$ zDM=^J?D=%-bgb5r;mpno$y1iM{wj)kMejJq`ZV=P-Rr&I%u?yeD0pq`^n2u05-Pm1 zSrx<#gyrRk$hxYbtY$9@8|VSP3Jr+H(A;2+t__u|*U-yi&O_;=%9hnE^> z!yBted`aN{02g@w0Kwl5z9mbiKA3fFM_KUifILB~e`t7zNP^ByIB9oQmvL%7BfPqw zOwx3#jaJ0i&ess-S5f-UB1(h3NI0l_ZdFG099$PQ^s~CUPS-|M_;)f(nc?}9QfbDg zHPm@|l1f%~)orUyUweF&HkyRUV|}lMZLrR}*<0t@%E$=80}P}-NN>H!p)?w-A1qfJ zv(GY0%ty`&gm6%>Anx}KxQq}x53}jlC=7B)q>#Y*MF{z1Any>iK?{O7AP@%NRmOCd zF{V{+M#IQgIE;hxvY5+~PB6)|g2Wyd10JW==HvUfb!%O{+qL!UeRcBNYjDd8ZB%V% ztG=IR_quyN{{X4ynxK~PJgr(5eDn`(8jSEsLb1ajTmV7ZR|SZ`VV*K=A52C+W)4qQ zNM)5I%J%Z#XewElGb6Y~0ZNt|SJ|epfJV=Hmhz)1C8C9=bps(>jnR{|a7UI^dXuyk zJf@?gTg+SR1R?WGN6dLGVp#|bqhT@>BnCNmP)1lN7~Rh))t%dqHrKxQcD0Py0)RG&V)J?xx2J~n$K^OA5(4fD z%s~nQs)U{)#aT|9?3CcFtdqT-=_RAq_I5_ml%o|3$~Llb=I?8zXRpmQx@Twq01GQx zx*zGE1HKCDC8RFakD_bZFu5%o?h)R2f5bX$ku&`7xtS21@8%}Z<0|vUe+TbM#p6HO zo5r6H7w;ABG&>vlVzJaOAr6wQik}cidf_6EOPVxw8BV=*@u$j_<#h>Y?a@I` zMSUZEZrf_+RdDc{lay(_z2_C8PB*l!;-8$FYjj-GZ9W8ef=J=;Z|y_lZ-o9PI7s|E z@yp?)_r4pInnqMZ;|~Q#;;U;=5UMoVw}y1+cDC~>0_`7neeiGNwx6d-t&axy592R} zqDFZ3(YphKNV;XXrt{`{vgn!y?gx>+cHUS9-(J9_FE)zDY{GBi#u7ly%SEb z(Dg{Q--cSQtDx)fn5IV1wXIh}*OFM?CyBJ1>wmJevD?kQStE{EVkoc>@EFiZtS1)~ zoUEH|UAt(a^ow(gY1>Gs>3wghG+?1GbvUG!@rz2?-p;~pQq-S$5Y zY3nMM4++$6wEKY~mst_)<|0WNCM&))k#md!a2UsNY2g?fZ-_h_;uus88%>{8R8jy? zS)`Wk-d;kn-EETLm@+FJy;6L3_<^fIIrx#_KZlr9EPm4be z9hu#uvbNMTyG;kiI(@g4*4FEBeWL5_3}Ixrx^fKb5{i;?N;)NU;S}5VZkIZYQ%Ud6 z-J9#7+4ZGPJg#m%Ri`;cSx42a_Hf?%YH$sw{5#YoF=;+E@i&I<*s{lCs%e7q9PJDh zriFC*lNfMWqjJHr-*lR}FN5HOE8KiW&@JJ2WQywg8Lpys3S99e?bL`$?FCJ;?JmO# z12FX6Ti}nxoij?f)nc-;_^IItceUS&z73r>;%1#`Y^cxntyT#nYx@YL#H?eI-%gGV zvc%Ig(U}{^>@-axX(w+3c(1{_wxp6eTzF5$5o#U-lH-{Xqc-~KxbUsy#~5hf)Y@3( zWmuyO0IQ~wNu<2na*MaSs*f|2p08xJ-SshfhMF|u?Pqq|_;+?nHn&u~wXteX0c<7h zbsY;;`GH2#9buiu=F7quz@u>GcQ{gVFfvK0KZIa_f2R)_=?jt`;$0wJS^`GXw&n|$ ziIb2@?+^EKpn#_)e+ofs3twyA0QiaU*^c76r-fwy0ECOe(mr{eZiThJV#ps!6u)w7e9So$o8&+78rw5Y}v_PZR355tWWj z_g)j$Eu#p><^KRlwuzC3-KC}9v%YbPr5}XsrXd%`Iu)#h<89Eqj^VIaY-E)rl~}L< zBSsF^>H?B8<=1?7;pHM-TgILZkzKJgQm&z(Ncd9nn`^is0vQ7a@?s9i&+;SSZRue6 zlkpnrB!))#Veu6*3q`5vwi-^X`=pXrSwwJJJa;8nMt4F6!x-9d87a8QXtvVIGImdu zZ_m%A?!R~I*7X{XOUd7BH6Jd!CF_5^YmIf_O;!a4`%=)Y(`bFyI*pW;CW{d@{Ml(sV2NwXFrD+}V4iRj{Az&Zhxwu2s<(zU(Lmv$DUs)~$p1d&A!hek4LL zKFM$5jYGh`Au0>6&uOUMUBxV_2x25lg>s~k8GbpcQd4>))7I+lUuN%@k;z|g;p?wm z?loLmaqHIWm!_^<$~&#o^={{df5H>0pvAqnh%CVjQKOC<_`Y5+8WA=~`G8*F@q#Nl zTQ3l4uE}vU@}~pK)b!clARbOJXtC~KPEOH+8zcdN^oY=GuOl~JAoywV55u!5ZPy+g zys*~nZA$J?P0f_rebHg%fLL2LN6nUTxXd(-Ht36g4t!9)(A^HxYvY!^x5>+&C7WKc zy0Q)!vTY9>WB5qHk$8TmEq6-#N1e9zv*muxCu?Zd?)zCC(8t;-SvJ>1o6*M2*-K3w zns#08e6G>MJM6i%vw#@@Eo}C$fLMIRrk2zwBocmEFf!Rwk}ON3Xz|7xISPo!-M%}k-SM5ofZ_&Gmd*hu>Z{L!-Z9nUmgYD#twm8$#M%U28}TGBlOq|KY~(ix zk}Pvbs}fJOau^I`d6n*%L@eNX-oojv0rcIz5-=7TdGsz3=dLmLB;xTH!3Lk)-S z%E3)rXWH`R($U>3zRznneZgbYl1|H}{au^YtM%8n<>MDxUA2$~;UKurA+6&%InL6u zTS{Pj0uJDZamfcIiAZ$VuLdnYwCzX$kiTcS8%8%DDL|NX&oSeULf}`iTKpREif?@j zM$xYZH{(U|RF>-N_qPRU{E&wmwy{(gUE4v;MRD-U#WAo=Yr-Biw_rgMSY2D*LZlJ2 ziES=sXW(!d0Vh2hq)LTI=;G3Lvr&|9@Y~+yi+?7b*J|WC@pqM*(#v}#qt@3?=C}Ey z$3=_^`()Q{B4yxxr$~_i+7EHCDH!X5e~2FATH4mza3AoL+JVRlV7kvvg+;>v4muPk zvo9I0{k$Q1?UvW?Eb)vcx{z6w#?TjS#00wx^7}?e$bNEeTl_uLr#XkjJ`bOf!LzfP zL!L5PIkC8oIY3Tw3b4Rl#%-q<-S4EDcYLd*N2a~EzJiV-I<;qOCfj~XXr-s3R_=1^ zrCUf4r-(EwvIauk>DO@#_2JoNUc56F8Od(BCq~~uo<+*(z8BO71Q;*wEsK1omD?MI zEO0Vc9D$4}16jTm_=Oa-dR&nYz2^9TQbyc4JN%iOp~E&83V1w>HDg@(GsgC0{hMF$ zo}TNIhqj7z7z8i;vB6A&3c2JC58Vs0p;33cw?xw0XHlk}wzj=qmNut|r255ozKOjq z^>6S`XTF8>&=9CHcp`gJG7Or2v1N3mWy#qT(Azl}1868S-v^TOqgcW-CZFP4Pyxw% zW|lB8a732UNCq>(Wec=2wm})@B{TW~D21x5dh?udUwNbUHB>mZXU8Z!Pk_^4d3vfgIud)d9I&1uUQtGHOMF z9El;-VtEEIX0wXymHCDa$9BdJNipDpNgQIbm&Tfdjh8+jg@=E#YBo27C z+grD7JojDPD>zG_DOv8eN#5_x>*=&t7CI)O#qF(xtO+5_niMUPbGk^x(UL|( za#yKl$IY>)-s}1#Ne_oLoo3DjU}Ln?yho~7z>K@dPwe@Lu<})$A0h4KhDP}sGD{Un zr(|F+bp1*&asL1x7H086j)i8nW?(uE#jr7)Gjh&`=TBAwE68DPKX*OMmaH%rAlqD# zBV(==_#T6bnu>))<0!*bWq8HOYOnDwYk4ho)2Z)ZxTi3{CG0U(=*~9eoF?NW(~mB< z(I&Ri*0a}sp4-PhD|C__d&A!ez9rjEr6#lZh2YIUP1Gdb&$%J-cfVJPuN z{yq~iNg;M3Q8l$#^tkmFQ#XY4&k!k64yU1N-`V=i3dFWeznaN#s&Gta8}Z8>#1wGufAr)YxxC5{Oh8{`sgY#cK)FbLl}i{ZQ_M=7s$OHOD? z*4ym3@7LXy>1cgU2gMF2ok+tm%+@l3UWR`zTc*5_Inf!AH~)>M!jO&QNWH1txDQUyKD&wNm1=& zDnk;bOp)+2ct1t8yj$CCD_Zz}sQJQW)O;a3>$(A#4g1E@X1R}0wO09~4P|gVgqlNd z4seU}Se_b`IbAGF?FY?eDRW7yTURQPSGrrpy>veFFXNsH#HhzR$f;M9+*L}{>dK6{ zU6(SArxxRWZ4_?S>qFdrB!17|8a@&n{AK-_{{U+rgW!WB-(7q;m&JNA@~tGzel)KH z$0C006LB5R=?a$|paa2^Q}|tZBU@VhW;#U6Gb7sg*Wpi%^r>QCWepUsquBV?&M8Eh zia{mfEPiH7HXWe)cj2e)cl%^~8HHQnXYEVz%i-OU{+Aj|MYVmJ^BVWYd!7{pJp~DJe9i%LeA8+$Ch=B(Ao;$HK5#SQYN&Fog47wNcXJR*& z+`qnPU0Iuw!0|>e6L?u47QQXiw5ygXO3&fNO(VUoBY4Caj;oPEIyWSy`=i*pA~~w3UM$ zYByb@44Qm!GmZ-uNTYy-WAiFtx`rUL512FicT4~&)nqPC3X2Pj5KDIpoRG?Kz&o(V z8-Uoc@HVw@jU#BDAGnMcVr(ufZ{{(ONhVth$xyHnmQ_eql>ze^3+`w?;TsXiVwc00 zVZkbVgi*AGI0YQY=OIZsh_}iDlo?T!sLJhL+VxZNwyR}p_4PT{Wrk@rIBu?!O{VOg zt=j%cH|KK^wcA62yp9H1&IbSt2|$;rx=sM}byeCFEDOcpz4(xY%V8C=Gv z8NlSOST-`at)|j6@Ni(eTxD1^5vD#;NW;SjBp;ZAj0_cG0A`UieKfD#nOh_P3=M#% z3P;R(gU&IA0Y=fCvGqAhF8r&}>(hN*x?cWQvRd>9vxz*~z}4 zrA!Jofun$M4q#~c$s}Mv0;mUt3UPs)<26QWJq~c#(k&tPhfuk*=jJ165=N&0^lNj- zQdc<#y*d@499~`^#tAlR%bXl%%aD~Fj~hYHVY#bIp+(P^suP|+du1^g9Aoa60D6Es zfzXPGVWz#-(|TE6D{E=-H)OSce&;mtbld5^=_LAY(su85`u5+?AHy2FXPdbtk8UBNjr%ctZDQ;U<2gNj-vz*?H45V#&?{YoE#8G1Y?dhSZ8Nw z%ci&IeKfV2R`t^MT`Wfyo{g(n+nU!~cYmez>W(T)ZJ=$25t2q#-3|#ma%Fh=ljcH6$30K3 zKZS=qa~FsKDn7zbY|Us1+HgQ90noWm^ zTIq$scDJ_HBb_aD-#C?7t~B309r(lH-KUA6@UFRk;p=Y@*tUC=}j z*Ol!Re}>wm+S6T{ZG4VjB1I0p!C=LB89W{fkVxbJaC#7S!Q`G!8TRWw1{C!f3PuJ2QWz8RmJRa+ z!VHWs;C5kMX~$SuyF0yOvTbO!-$k<1U5>gqOdV#I))XoV5O8@=181+y2_W)*U|Hqd5(2V}F>*ErDh>f7<{2Plh1vllw^1~gI#C%( z25^6cup46*Rvu7N#ANe=+esW1YNK~?YaBAlvX&8tYzSl+Xw{o(-lQu?cum_?r7^~= z4h?6Csr6^gCata7v)1w5Hq-8!w_9k5tCeG^W8p@ftJcKI5r?vqpEHw;QnGqBt#xfL zw`|+{i)}rm(>0a8{@c1C6G^d!E+t6BX>n{PmMf)8Irj+WxVJ!)!w5F_i@sT)i`sOb zf<7<1u!~*s$BaH7{2J4>98cx=fLv>yD=@}gKG7eA^m|Dpws`^qE##8M;g6QG+wPG~ zdQZULgtp!vx6}M{<93_FCsop}{9G)ppf|tpj{H2)R!v959y##`oR^n35}P=re+=mp zt-Kn?iZu-(Zf&QE-7MS6b&uLZR9#+8U&Fr(yajir>ZbbhM!xZ^2U*t>O18XhI?_w| zWz-hd*pY3vD94p*pgFM(9IE#}FN@DyiK zOM%7ldsOilxO39NHC7cAeb(Jr(^9V~d+P7^QPr!r7jCjIhF`OVkln2Q);>18B_2Z` zhks{nLKxZhNJ_^hspCsz2*k#U&l)nUf?0tuNgC}(;Qs*F;xyfR@$dG6zbIWdLGYWy z77@3WZX;F#_r$WiF{zC=7u;Y1WF=Y_j=Zq`)t?m=F%N{k3s@=LwbQ|QlQ;~-kG3jr zQ@0_kDFe zoBIRy4Uc$#jsF0&I~=P-W%x(n$ms`kx6~5w=sN7yM{6X!@ND41Lw*@DTFKdS^c4YG&wK-00~!y6@YNe zp9;PiwnvuhAm1m1$s{9<#E=-0-eF}8RwDhPJ~dmm_wgTsu9)W$>K_L_5?#d7HueY0 zyzoS-8GPm{_}CbRJGRDFYGE^qElFmzWv-EGo4ZacYh7>E+vTCvOFQuXtZ)9UP&GrPEECvF@kApRoPF-D~j=_Jh-z!tA+k34A`fLQV;DY&Cc!F`ddvw6U>1 zU^!JX8j}1v{gvimG_TsP$Jz!!+ZT#H3q^bYJJ?2L@b8W1F4zbH3sPHgkVk|d_+;N4 zHK}%s&x5}JFN&@jbog5@nlJiXGUkv)_pkCw%p+lH1#XL8cB$k|hTPt)(g7hkjg z0KzFtjI(KRYC2;#-#e9IzME@df|W$tK*K2*+u1@HpEcDY;f@z7*=Pj23UQc-Cpi0Iv|RDhpXC8webbQ$hVOO3^GKKLd0Zn5S68->Yoer z>!iH!{kO#51z)M(7N??X_ETI!a=S_|kznKjkU*X?sCP4R0{TOIXxH^S2{gYHYC2!W z-55q9v$yz-qNj(xAn7rH>MlGnU!3%qFzZ9F<~LOM zy5Kf&qa{cnjis~bKyAeFpS(s!)~3U3u@JyFBO6ZRfr1r|PURti2Q8mcMi#d9jV?y~Ng&}t8B#~gP5}h{UJkTtq~hai-$bmHlef#aeQn?6b1bTs5`5g(lDkRkeHORg z{dc#{*I*dNag&jfc{u2D4?N=w)4Jds(gEwvep8O)up|-&K>+dUI`C&y&tFm3p$bVq zd2&GLc;^Qs)3#)d*%%yk7$hEt?*W6l3(&fG8E1%j?r44k<*I0LR{wy~D+gkf?{0&eI_ZX+v= z!#DtK496q^f^%*pbvr(NyfbhcfLN(LKmfKt`FJA)mjL$KE}r(`u1O)1CYLC2C{#?O zjhrf}atQ^|wt`BI4NNfZONvrkr&N%v2!mAtpUtu1ziN6IlE!j0UVlYo2YrvRyC z&+vuamMZDaHvx`Z1RXF59EK+clbjLI=O7K3^xG|@12HO_vWVno4B00Dl?#K6;~Cmi z0g2m8vL%3G0Ntw9c6#crpG)eOTR)!9eyVX& zPV!3jx=pUvwc6gzHt)I2O2Ri#xjA3GjEolh%-aFuBnBr5 z&Osv~k3riY;~49Xf|FaU{{XwlR|*8^u2BwImLvPdJqwT+K^ak{8M#GT?WC2R?_~9RZtj}4{Vpt46Aq;bDM@o##V6fI;^>z4 zeOH<@{ImpZISK|h5CF)*BLohF79qJKBc3YH+FcindKG2>3x0S8dUYeHchH`D4a(dcfyc^zVV<8aeocA0 zb?dv=O<&*t00-2`N=whnf0EnfvJ)reImj3vF)#9hGI|a+<%R*yFgIWdo7W&`7#tG7 z=Y_)zfJW>P0Q(u&!0pJ2E zE|P4DY}RP6OYRzW4guwW z7o*iKqX-FXg&6J>AZ5vHa5CF+aC$E}<21CRIbaSpu>f$n!0ZU*o~i~w&n->!TaFlT zMi(Fq4p@K)1OOM@5CA0P?xd7-eqA2AUHR$XuXVFhcGFIpHuiDTSKp?+t<~2fxR7!P0~s052P#{dvTtpmQi=~jzyKVaFDHOT3Fm{5Htk`yxu!q{6qVh# z83=)L7XXO#~5Hs3}XWzke_cOpge$}mB=gx zJ9hx%si_uWk3&(|tADZIfG(l{m*48R|#f+l=rr z)Z^6goc-buM`av`0|O@*;Z%%d;2sGi?IWD+oQ3JM{J%NCT=G*ssQ&=qEnmrM$dYzhJhQX| zfEckVyl}6a4Wt0OK_u=|jBXV6*p0iMK<>_f00-Yd>PQC!F#v<|^Y@Y?=CNR)5<20- zk+*Jt<(m$ik^yWHh5%;flcu(@s2fnsszc?RD8dyWI|$Qv$&h|UX$c)y=F4(c)!Umz zeYLW-joZ4ttorYDd+npWwO*Ij?P+J#cWTQ@?GhC)5Y8}h@|>KWdXlFnEsSJxbAwT- zX+Bpf2p!6k_ltXA91b!DF~}zsXHnDc^eeBj%)y^%0IIlRyN?u|Wmpq#8^u8sqy?o@ zLZrK-M5F~&q*IU_V{{8jH`3D54FVgZJESECBR5KVBL@ur@7}N5r|o*K=X&mQpYuD< zS!mKktw)X6zbS(*B_DqMYW z811XIr@*Kq2n6uJiaL+$*A`lOQ-}#FNa%K$+JkGjV+%^oJ=MjVMC9hP(&Nbv>z|6q z5}mLPHtLG~vQ1IjoM2ztz%C6VA|B$sX7cdRYoK3Ic`6cONa7*#>stWT=_V(ds7#MQ za-N|SVA9=fRDC*LDv zrpED^jNK@0Q~!y7QDlE*oUsa4t~^2sX#x=VgvsD~DHwv~IvtaFpPN^qJGO|CnzIa9o;-4LWh z(+2Ra>RguN{+3!&1)olJzB1L}_B-)vTLsy4EsW-V2^(VYASU|zLp%vdKS|H(LHGHP zc*C06fs>&RyYy$cVwa~`;4!R)ewWLZo`B(Yg&>!V89in2i(~f}QHtmf@fE6-056tE z86rO*>tMx%GAGfef*4X)-B^e+d|N*adoL)$GbZ}Il}t!2AS(^KTnskf|%aJ zC%RvW`;NHc`SR7(@T`BdlF2H#=M(oF7#bMKY@Pk#ZVL6=WZ&Ajq5A$8Uu}i#h{bch z5$_Xa^1hX4Z1PH!?upF;0*k)I-Vmw=kjU^eu{H&45 z*E|P5G~_qsbJ5=7EK2=9*r9OAzp zBt|`)FJXyhkloAcPn~jyvAey-`}WeU!z>*RU2h(p0GxKNb&^-|LP{5Ioi7^Kb@H0K zU@m$MZ?V*w8#L2wmH%S)(@DdU3Vd*|1^N=geZ0!UBkMeKRYE#nG5-H+c?S}DRO25U632Es4IN3?}X8Iv<5uR&u| zT=1Pn*Q4gvR44FFL8AjJH+sRT&(D>)HaZ+77V*k^@8cNiQ)kIb!*JAI8@;#wsupn< z$bUWiX1NjrK!=%POe$-KqKfxsddo)Y72-`3I$#;US20oAa}w9b#ew#-Le?3R>&9KQ zV*MTt;B0cCJv%2C)IG4=Oc~(dnDI9{qK4RMr!mZ3KE+`o--wtY#gfV9$RJjfk??uY z!X8X#zE_&x_G=>?{vv(T#NK>_J@IAFYx$+P#_NU%ifDocQ4#V&5W*suOXNjrMY3xp z^W*}xnx*>dQ+p=@|51EyAMv*gvDK-T^YW7P+%GD5Uk=JzsAmZpT+G+G9`XMRqLrp9 zutEKN*G~5;T?Avt6IFg#$f~NJvL{pOSN_PcI}-Mx-QgvN0Rf%NbG23U?hm!s?Cm0W zwlZVVGP@iG;a+s?FPU27nY|}p$L~6^d8NyaET_CaM4~cdxs-&XTx0N~g|{mVKeXg_ zpzyR1>h#w#z2*y@-QR*fZG{X(JPT`y5fbeOt7Z^T@mhdV!qrnV(VvJ#=@j-&xz`5Xrla{E=NzAX&zNnPU16bF^mDb)SK6 z%JQ=wk=lw*y_jKn{jib?+bvE=^hP)eUYS-6cNBf1>+9U8VTR{GNbtLHi;&|j-|#mI z)pvjyZPOoG>m5znHe+SGl-L)(x6%3!Z#V;~IrS*C0?+!1 zE|IHgc*BpoN8X#J(*bi)G!T8-`*BC6mz zyF;+0+Yvwal4BMkJX{$8V~0tC?LJTHje0I7=X#DYMEPn7XD_UFew}X%P_VMNfU3}> z8YP~Yni-Z>Uj;OSap<;ds{tdO7FSv#`3;~-{KmHxK4xk^_9w&au9IhWUUFHKV-BJh zr^P>*zeh5xM$)t35#gRguqJ;5-hX&1&6^Ck*sH^j753gqvmeUzlkP1rpt+jf4Ko8h z-s7zi8+sQz9y}dhH3Le-w-+b5E^h3#%zLSXCHrRQ$v@$Q7^0r+96?9X;ehO6{3E^%kJI z{0V#eV&T&AD@*&iLbe}$3s+Ij{n<{y@+iEsx#?Uztu*(g`{lnLX0~%RnI1B=`H03X z{7~F5lRBicxXIAd(d;36eSZB#c?@shF5xts)gAVYP?=z!14Z29S+f7=8Au3)RH$fm zNhQe*>fbeacEZ5LmjXAuCxP;rc(s;(vL_qbav{iN;4)ld?K8UaAg>Iq(fC;D+(Fwl zLv?@-u(Hp;G!00rUtbSF3#+gN><_MkP&{o;I70M~e5UJ}Hp z2)@eq45sP5t4zEHO*LkrO=VduE!T}!E=ES8cfXjaLwtH3!PQBaI#3fkkWGyRD}sLo z%=gbt>Yiw#ayBTSRc0c1BE*4$gUJb_p}qi^VVv-Dr6uTP9vaZg78&vdv`kCPJ%UE1_ROoi^BxfM$H1oQF&YXc})GNpVB$5|ed3K)X_S`j0gsG@rZ zemk|@)gWSrv%Zbt(ThKznz+Q7XTIF8!;9LWksQ6Ox7tYWo!WB`Pwx8k`E!_8;B`m@v%8`Dpg!Ve zrd(I6#Li@Pw{1H>O=m9%xGLJSfdtx>O^6r`?hIEwn9=kR(7LPAJL&m zxj<1V9L+v2Bsrm{4-=Bex!uFAa%zKH%*bD`keo_4Wsc5es6pohbr$jfq-*Od7QxAY z5R~qJc*_8_h79=0Wy)O=mOJpVm~)%OR2;7KWzFed!)TF79rnY9f+DY>oC$%B=V$JL zh8>0vW$jM8tTaer3{Uxy+~;R;pV3p7j+lhv(E>nACki^uM&e|c5b%8!n7=;o3KRih zYTq?^k+S~hcZOVv=m_(WS-VD^edaUNk&(`jD|Tef`Gb*py#?s2FC_2c?7}ZK60^$` z=BL$4*A&6$q2D1A8&s>mYd#&Dde1Ca|4Osd42XSBX6l}ODad*pXd$aC1_x-{y(;T% zR&QyFBsJO0RW#)leD_hcilC`;IkU znuGBwxRax&7XA(+s?@|{r%T7a)PgNKcfaKCwXZ`}uK&Y(8d0lOtL5!)`!RO~XHh%_ z&un*I0L;7$|1N#iQ;VnMF@^m~k=g8NY3c|yc-j9&YhvffarH@4$)N4E1y{&R83<)` z-G;z(v=45{{lf7CjP~6Tmlz&TGmjw#PUQWfZjWO}n8*%>ZrHv`c`H)-E)-X6*g@z| zG?CX^AnWqL_!0Lf398-TmPJEOs=gOC>r!r&0q*gkkCS{~Klx(&Hz7bQ-oKdUD{b=( zdf|TB2lf^=Q9hJsT#n|3q?OV*xK23L>v%P{E!W)7&N6U<=YZ!EZ=?iyTbgD-DQCOz z$7jHcT1ojL9}$XA#gTS=r(&Aj8ww;ar1StAIfjsu8pGd{5zK)mj6p00spE(Wdi`y* zF@PFpA5){t-575cK0((@ayIo_O`NH+5i$oc1}~fB(+ji6XPj*}hxZhG32e{wbu-ma ztx;_Y>nQ!xyLDtd#;R$Xn@8+&PMRfHTPLKNcNp8y#?=g;dpBN{!mk!%+bG*h%%yw! z+hNgC7k_JD@Kam@4ZY^_my85%S3ooNVzpbmnA|9%#2lVx`_fX(!zeOQQ&SUAb~%4_ zaO>@lW4}gWq&LPErh^4SdVRXBaUYoNZK=2eP`y|kG{`ubZ>US}k~O{B&wiv-(Jxly z%JGVLdxUS8ze@1xE*w~H*$JBlYk=*4#*rHGxxNLyNk#`7_ zGppjan*A@Q$IpMhGBxXHJZe_qxDUYc+{FY7?Mt~Itg)i#B0HWsR4vwsIV(!Qgu%qF z5(f~6GuXTQz@%rx6znNc2KVK2&936;1f@AQE5?cUzxg@ zxz?n1o3W`-JRfzdllrx4R^2)&9;%(r?br)tVbmNkS!$JIow6;*g-ag<(Fhk5-H)<0 zH_E>1trQl4v3FYwsH9jZVi$KQbpLwq0&Y%+i%Lg z5*_i4BrG-0rRuCJ_*(P#oV+hUX`tYV$xqu*Gyh$fJOB~$WVq6N=z#0ko5kLQtQv&> z=_i$Nnp1a!dY?O&FDoymVKa%|q9(cV-~EHXTN%<~d>xVNW@tV=x-6lcY?bo808f#u zzS{1zzk>$>4u_p6@qW?T?e1Q36RQUr7s4#&7MMgpV|=eReC@#LA$QcDZkxtPLhf(j z;ft>pRKCR}NjSHHb21g)uB66xq`2ck77o?8$5EYdcu{90Yiz3Ki{e0jRm;;9GpB2> zSK22SVV)!JGPt%KY8U}KM4)o?C^$IZpzJftjo(aj4!|D3fp1`X{wfmHTM4Y65{aZx z{hm+!1v})-amNLU`$yG-UutuQ7eLnP3kAo1!Za{eI5&f7T*@iIcE5XZkRnjEl>FKI zfpz#}*6A%Al9&|e(6vLNkMf=pS<3AeQyb8u9(Siapq*_n!l93)|0 z`VM`1>eqx6J~BcEI&GSWqd5nlxDXB&_l#Q6M>sny;Jz&8EJKSMXG4=fr`^7Z?l<2d7t&3||=<5R(3 zD{zfa-z1&>!;G21!@04kZ;~ z2#^WmI^Uol{Wx|;7v9-@)9!w@($CD!vg_S7^nt-clU=wea@5U>dOKbqyIZ*Jer!hT z1EBVzD{m@)yrnq0!OaavkTKL$1utt3TF$1Ww#}OXgQf}!F?LlzHdOxoTnG*Jv)s_b zWaF|-1b_j@nHOF9*TveJt!mF5CVA0MD=;AtMYe3}&^PsflXez1Y`VnYP+&0UZBpzi zVm#(eUP3Z4xe39ydCd?6?e5)Bu=y*IotR#XG3DylR*LKR`fHC#{oR;d@%p~+hpN== zaDdzRM(F4YMTkK=#-dz{6V@dgBrt1FK~vkI1Vmb~S<-O#FhEllB<(p*Mu2=tB4tx) z6_-x){ra(?x<*_(wWVCwf^cz(q89iDJYH^1vE{; zdMp{6#zOkU%S?|~VV31`lF8Insu|W zM9-GD;~Rf^qfN-&ue!m~Jvk1%KoFW1i!z!BQ=3@{3;k~M8=CuVRDav|x>yZZAogI@ z<&~z(YE9|GO!do@S!l6rS7luL?#EQ!nV`L8<94eoDai4qkJ0?a5iXTxe7V;==CiD* zT!iKC0^6}GYGj%~nxF|W3~x-O7!1j(BZ(ivM3Z?g>EgKwWOUR`QIkooGJjMdGZ(Vi zt5SI_=^FUNc-?}1!{~zEo8M;=1yO8t7fjZzVvY^!E~TEikek}R_-{k%#F&%mV-$=yMe&$YdxoYiUYZD~|cA2|Nd`~AfDAlwW z`q=GQ&SWVk%g+UMx;9gB_R~7n)DqR~WRuLF?n>T)eWh-n`Ewq3=e(g+wA+t+e4bzT z5K5z!5``t-GqE$n&6XeR{=k1u@Z_r7o$vs4&5cES0n|wq#93$L!Y} zXSx~cj|Wca>8^bW(yIOHVs5Q5pn=p0%6_&bvLN7`;Lpf*)EukK{P}@(RW+k?Tjx}0 zS#yMR^F>~%-vWK6klJ46+$LuC7O<=atw)hw+TP`XspvBp?)fk{%x1>pVxdNj-zs0p zmqn8M!E}r+9~s`fosKW2P|yBcEM(>>C{XNMyIG51Pz41Wao54~+{Sk1a#GrwnzRH} zCBJNb7#wk}YpdrhNu0GpGnT{e1^vzj3P-EV{CIlrpU=OGxPRXO-^*4jV2)HZ;QPML zp3d;bI6x@kRs?f-&ou`I;oMVT+Ok>1!hsRS9mfw-kvChD?<(IcX>9A4x)2wakK!&8 z&YMS1MTY<=;~J2#VI^o?&S&T717EvanIMkYy83bkA|NzY@{aUvGc>Jr`7+L5=$GBs z!K_TLcpU#b|1JSyAtk32yT*dMzrWqjHB}Irg|GzAEZjdvS#c$u5z)ZCm}CUQ54U&+1KQHx~Hv zY`AMg!SGITbFPaJU`fp{oCui;Wg{#UZF0pxZdLx#!c&Uk{~VNH0^hgVJ;zft=n#|6 z5^Jn}`^bN-bhBV7u%9l(8qIUWk28gt?;{vt8$92GxiJ&FKg7aV>S~eP(_S23k{4vk zzt?TP%^ZI|;2O1cBz_6MOATi03dRKxdU?AYsH*kC+s&z;x%kNLw4|bHd(1 zn8s7&DwE6PRJF+bj^{7`2KmN-yqPCEJz4_)QoA&=7zqK<^ognb6@ zCG?06^0}rZKJ4_wqLm^PS(g9#Y;cuSBnTco`F1Mtqi{Fo_g!4KQ%Edh9}d(dF*XuB z&q1n(F|p+RJqwX*&wA?e*adhjuZi?yI+|8_9;ZL^>()HEhJ0&#)6)6p&CJ3_Q@Ejr zM^|Mj0Ni$%)10s<>DKnh0cKDgU%PbJb!UN`|oGX2~XAhn;mC9l^vZCwWXs{yb zpaHT{>pi+3w8FnQiLrd)IFF;Os5YT%ZoDUk5$N|)3f(AKl*;= zmpW=vISyvJ3zM*p<6i4VhaPiqrLC1m9o4#e6Jw7~XgZ`8h(X0nWroq(HO}0&El%96 z%_ha)*Rx(N#*~g<-AX}L!85KSf+?|cF*a^scxpMFLV8X{{_(!15b%`=G_ZDx5bc0{ zrhb`*CQQ4*#cptb^>1A?i$sfxkAq~usIe8HftQ5!6~h(I$s?>EgZYmiexwWkuRS>cHH);b457Ym)C3~yABBMW-te51qZQf!ADljiZm%ERygXy} z_Z$d;IjuRdK0?hksaFOG&pTvOg4uJ1yP;}12z}7D!nmT{WFF$kYLIa$hTvs#t=D25 zdm1hZ3~uq;NNUT_-AUUX-|o-{*ZVZ<2h~rsU@x1+rYiKEMZ+{5muCd!f-Fa5+k?wT zZ|DxCZ(n2bcXeSeP$3cbUo6jIAn)tq+86Y&tqA*;y}*_mJ0&NdYvnw-p%M>J2d!IPj>C)|}W+byuLlU8LTdMsM_ z9fusZ_z%x7t$2*pKCO_B$JY-!4ugyt*byi=1Wvah zCRIuq?%mqOKZS5wAa_zE_(xvtC*FH?>60n_1~$mXa{q#%<5B5o?3Y34cZt@EpS3gE zU&YntOjT!dkX8}vO-h4G(b=HLL-6Aug-tzT(^Z}7rGxdS+p`^{%l4!XaTn4X<=Cgb+L)4jwkTxMPywz8 z4%*yQ-Vyg16}Z6`T7(I?<-<^pv?ThUJ3@R}2{BBiy$>4`-e`cUbzWHs&D>0`_rat6 z40i{|8?G&goU`Kc@^(qwb5nhFR@ZcR+Tu%zmCJHVTQ9S$9@{q5JDl+jG;3G03s`r}-pmFWH%m zxa*Pek~;cs8DbJQu5l>kLs{%ir7f6W#avQfqM6wLJ1?8BTq5w3TT z=dV{>r|ITLOqO)`JsyThb%sH;X~Yh-i*SJ_4e$euafTneO}*#`1EVQUbW#Cw3>%pz zdeQ68aHTVPi_#jIs+i7OmEht31D$>ipjNOP7+*rjtwxZ0A~I0f30ORVl14mmVx|77 z=7dEEwWHnqmV0WxK*Mk)v2l8{9BNo7dKXKle`$ydSPK4!ci4T)=r?Y2(=1c!pCWKPH8H`Vv&=Et_cV&ljHB9sw0TL|#EC8= zs)9c7yg;`=`ls~Pot1U*4`2je%7<9@`O{WS&Gig*nBMcAZC-gbvD}hY*+N#!5&o8T zkFE^hQt7n#te4dyU0*j?s=U}qQR%MoKRlPI=ra|bA^4n ze91X?e(T2#?YJxUCRe&VylXzMc+n~ax2#2gqB0mMvJfm!Eh1QeN9?HbzN8pa+Dr+k zFV#e?vZGKjR`{+6=Un=&gnGXYj|Iq4#wtNG;}mHy1V*#oIi2b~Ax(7Ov6?8JKGr8V z{nOy@A=tP;6FRNP8)OZ7@-N%2tHF+<98HDgDO+@I{;;noJY5g;){)c2c1;U($dwr{ zu46b6c0cc7vnN|t(MnIf^(*%81)Hp>rhZxZRqHe*2*`65!;M#0gz|iCLqd>aw-)MJ zoh>ui_b{LA^ohC_SGEap&A@k-Jo`U@_d6mxy5zM?AHo?Mx0}l40RD(pFs71zT$Yf*`xnw6+%^@76eRugIqRVQI$tXsojIcO{@6hR-+Qe7$L; z!ms@@4qaQ1J0ybtGC%AU@e2m_SrN*Mtx4UF0BsiL)|Sc|P*<9;{F#a6{^X@z$<-pP zC)((q`X7kZC52vSSN54Y@x%TpY`W@5peF~ z+S9jrKbh%$LiSV6Pm~k=Udus~VA$m4II5bRN&X zJHoLbPp^=PwQRA9f|yO@@UY&KUe-d{g?kyS1uU4|*)-hJcWJjJl>Q+rE6O!ZXuwmi zY^(xsl?wU&+c9$jy5NNgk}JlVp@s68*N9L8@Z&6+!9Tx~BNI?(2%-opU1-~_3Luyp zCIn7U8oY^!j_@XGp1(jpe8G|33)^iy1uBsC6g-mG-&6$#!``5v;T@t1eS;yJASUO7 z!l0L^Kh3ze_R>_bI+9)zHUMot_(RRDkR3$DP^nx)nq2^peKITH%sd!Jj^5F9Q*Q7q_ zSxtbOL_u)wDYljCU#rfNdIs-lx3A`YF`Lv@`x-poj=5WGSP4KJ2-UTm0XkkAAZW&9 z&A>I+4 z4p3NSRC%bplI=#PFLJ7%GCZGZ8a(mw46)v?w{)|MBrHUd^W6FXEoXFS*ObVe7-`c( zHg(<{!};~-f;2Hn^?p}FrdT_97N6|k1gA=!3Wt3quu;FvR;v#GjQKX{Igm-Q?_%wv4kQ+ zV%I40*{GavYJv&>cCiiO_E8TVO*^smk5(*&B4>{Gcl%c36(6>Apsu1XC}~UptQ^fK zgM$8QK*1r1=^$UGV_r}`L}4fo@h^y~&QIkQ$I^Y-Hj7nt@I(qThS=;kpE@YFsH1tEMA{6AL!ZX^@RDl5UEY@|VQv$Y-K zB@?y#R!h*2nww@VLXcHc7O|ZfCjs!0`g?HaKF+o3k_30&S(Eb%aU|7y2v_+W;)&=c z3X;SCP?HSu(q+y!4Ro*6@-Mp>=YRr-btmsA4CK{6BT1`cTz1g}J!2%jXJ`5ThHlQK zk0>4I%y$Zf9Y|v8G!ZZ7joyPL)BGiLO)WzVGB!j^-_(39NwXEwnALZJ^LE+s*i96D z^qmDxA23pe%A4S5pwKXRZlr};|NEv`I07q*ni`0*Xd~n=n?E}4`26)nYB7BO2Vp+1 zt0dFiM*#mcZAJFP!I-PS4Y|?A?m!;DN*gN|YN35&XKuHlF%$Q$*bE_?@GKe*tW+&) zE-qej6xk1eG&wN_|4OZg|C$BX3&o4nG+m1>S_COo23g@MWk-$*7lL`P=4kKp%PBix zEoR-a^RK+zC4Vocc7;?X;z&vDcew7vqrv9fS;u^xYQ+pmkm5dn%-2jrL5w^Q0WdqV z)B)(C<<^`TeIs0hl!_dm#sN)t6h4wJNhBzr>(CkUf34sKw*`aVDsoH^ zw_pr!Y59<6f)pA3pq)*vU;9y0@=LYar(!1VkhSUjYO}S2^W!I@zcKN_B&3wl@d`yA zY0nwmLtUkI3{%1SI!->2)xFDg+{hH#^$4)a>=>Z48S_Wh!8xKlu&mT(DN&CoJ@}LasaTXp%%OH7-?XL;X zvV%-oXfSzWVyV4+2Fx{h!Uz^I*{@|Dm2#Tw2k zGC7(m6hsGcIw2^d6?r1z%gU(Z0>w;Q95-JKOnd2uap=GFghR90rCulgjP59#!lh@tz z7qyCgqwD?f$RABOQtv~PnvnG``QT%Yo1FE;huh|*S3~XsIF&tn(T_L(+F3oH@C0XaYpnxI18YP+K07OLi;>e}nd~7gwt?b5F1_5a)?>Vsw zu(u;Pg=tPolPqQNk6xs_w#yf7H4YQ{wSURlmw?|@l_C~dF&mDY_Q3z}vfOEXV+U*j zMt*rbA4?EKmZ)&MmrMFO!x?QcK#TyN9Q>iWdX z=H}=bwNE?Q`!IU>di0X%zdHmycGBWNXQ;hC#ivg&k*bL!`D`dlF@HwqYm116-M&~u zYH)MvXKWf6dBt+MSL(tRHfpS2eu8GKu|F21S5@1lXA_^ps-RFyV|O{5bM~DkwbqHV z%4lr?a;6er*FC}4xQ~E!SZ3;v8vUQf9JqnY0_KiT4el;n-R6A>b*2wY#S#+** zmk&EA%g+BeJS40exUTACft9m3s6J|MT*)fVA`JQ^ruPV?Ou*fBK$R=Vsd)erZ z#%Le#U?kC6cPo664~0?@vc=}VRSnL5##6g}YqC#*GxZqiG-;ruhc$`a9@O{f#rcek zk)=uBQ#)o_JA55X#y3x?`BSG>;$@C@-3x5eYjPels5XLLr>cuADF}hP+aT_1x@!gb zQNN2xeel+oBRIK6pIekbM+qM!mL^IG5q%u@G-`|#`FKxE`b-~UkV*FGOJgLH&kr?{ z3t4Oa-K7wKQslyGt^)E9$I8h~=wWx$)L_g?TQ18OT|{H}HofcU_K4t+T35oYC6?a_ zPl=@4DQfYWa2Iz4R)VM>|0JIf=weG`FAm=LU}uky1^e(Nfj3!=d~qie&E00&j*}fj zy0uw@KmUY_?U*m0oHK=-;;B-};@SPgaWC6E>9iGOma zT>Tx0qm7%%p`j#IjG8fa0%FDPKI~zqhqCMlO(M>nb;|oiHhk|}i9D<(n(o>+CcK>LyVmm-QB~IOJiWGjKE9BxsS5#{C3@Nf5k2aT0 zlot4^6q<_>)q&|BH^HC3jnUx|)=#<1Xw2k*GsRMUaGM{HZ}EOT&ob;ZNR2b2*f1ky zUJVCGy0$2qmuXJFQ9S}qwjGm-70Sn)QG5}m`jIle2siop$NVB_ONK#)KjO3?+SD)) zDahMEHo+xheEE$;6z}fuxaPGAc9af(!mLXA2u>rEN9yOEW;#qC?}PM(5bkLhKA>6*@!lEj6D*!~b=qb

    G(O(`EUOqZ$b185$0`(*41T0k^!@`IY5e(#YpJEq$vqs1@$(~ef)NP18}>h!8MDzbFG1SkYEX-T|BcAifB*pgSR;P7iltX@S4)^4Hd69qfG ztA~B>B7A`rnt`Pw2)foNgVwwmSpQ9asAT)C+Vlk}zo5kY_$-ooBRZO5^B7De#PsgFpmr*GS ze4B&w;t<^i1m@`*Nd-jKtbd*na}PRL&(Sv@Q7c89NYl{~X7A|onL1}m)UB=r(}~=K z4ePsqnhkR{Gz5+e)~4rxGW2)a7YucrDBsaVzBMitr5pYBsaf=gZ6;T1coW@N;d_Hj z%F}JJ_%}2JP`rHECwrjb=QebWk6;m(mM>(CdWBU$&yw@3(=<>m~@ z`t+)f!65kK_1LD}`?}G^lC@sF>M? z8)y%Y?0n0EFCDt03g3LPnVSLfufGLrH|oNcw-2VA$BNWxb|7_*rl4p;1qJY4Jx&AC zY;DnDMXDzPWFGwuXL2Gf@uh8Cp((gZYTi-v+rBmgkzz@v509x&;cRrIc}_Jtk?oIi z+k8^VYn#m9*|jvaf}yuB^1OZT3Y~xm4A-1st@Tfnb?4t}YtDutW}OhozNM299r0)8 zX>(JB=95>N=|v8XrGn3(eNT~cCLb=D%@p}` ze~qghn!PGu-PUOlJgd8WSLhx0Q(~IF@pnt&n$LG`Kal=@OQ4`}%w*cG;ghg1*QeWB zuRQqWMqxWM*_~@u%lG8S9Uk&D0m2v0e$Q9w;z%Q^Z3(4x{4x;we<`j;aiGAaX(SpJ zW(~V=l9xsk>7(tAn_bop`hy8E0i4Z1!3WU*dx1_*TYEVJHfTQNNQdq-=8{lZ45opyrZA>6EEx-72JnUO04ttwzdZL`Ow+Y)(! z^tRB2Zz(_8UY4L*Dmhf>%|8Khwrj*44V@`aYT%{?#kC~q+rLXe6KZQ)EJ_1X zo&u*?gR3{|Id@WokkG3may#zMyvC41oD--n!RAxTX-v?E5SJoam_vr+=QvMNa*iRl zKZj-8Z{7Od&5Tc5)XhcG|9oqMSN5-A8_n9-K5g6Hk`PL7)0Qm%b4T=fg2PN9)UlXV zcN!=@!7Tc1M&MnY#SLfb=j?=knw^5eAWJ2(x#o0jp-iB~y4~!K6D}V^-_lPbq?VBw z&u0Qo>)adC9W#WaG)=Eucy4xTs|#{Nzty;WapZ_5O`>+@bq#m5qeVHvAJv4|Cpyk( z`v5evb`v!RZnN^2r#kF5@5}~jDgzNAq#dG~PQGMxiqGeE1qri-iosCYhJCnq?TmmT zptOe3Q*s@CB5=X!``J6NY@~N(jj7eGQpftl;WEXUIwdX&7n5P=NFdc9n^kt5CI540_*%h~L6?L-`xA9u ziq2f^#HD3D{2zF2PtaS@Qv@ln$-paXBf9|)>PRc4Jx=XJu3b8r9yzBc=_YMv)Z;$Ywi*>*xDdrUI`@-m?srT2OVmvGN@;OjDNt@&!ckb#zU+hxV z{=<9yyWkxvZ{i$&29RG%y4A(%qAsGsJB&81h|HX=7~~Z^s}3@(Xdof+8K$cDImPDv zK!6iMm>esBrVIOp+Aaul1y869WaKl?oPaANPAI49aJ2vh#m=n!GfA-*9a-4tNJ-RA z!{&Dch!msLbLn$qhFf&-WAcy*>O+j!w!6-Yog_OuCxqTp=dKsHl~?-_=ZD!s6u5ga zyLRGY{8ia6uL-JO^AM6KM8H2r-EQx%o5H03f@P-lb(*?Sf>+;z?2y_MhOm$G;Do0Z zbKsN2fQ0Yr+rh)q8}uYK81NlH!m zFTiHn>AiPmPi5bvdUI3{4t_{=^A;}L`|Rl|eo1Q#|6S_vvQmZeVg2E{WYuT5t9*Tm z)>&v*rGn2z_p&cCBCBf}eDeK2Jc4RL3DR?sw$?n{($b)1g@q=Qb*kg23ZB@ zGfI~3lsi<*!=!E$lQ#L~?g;w-YLZ9BA>@c@$KEAv?P7M(tYf!|`^Y{EMIGsPGd7Ja z^Y>gBOnD?-KW*DwfaFyaR_mSz43jWB5Olf_e7n*ebL=e`IPgQI!nyckEIp6HRz5XK zsFr&t!Zr{I^c^q^fLuiY59O(fEd1I?frbmbUmBa|!L=&=Yfl%>E$oq`Qr#hx%X>HB zmr{=|7QJa3Ej}KPB{rg<{i0G0U-FgEg1K#~Lq*9}s;K#T7yC@Txnr=gE3&;2E#{J` zKZh{(GPa!YFPVE0_ik<%f+oupS@uFWyA4sGBlyzpN{V(eVO6}kf~FI5l~ubyK%ll6 zPx++%GfX?nN3rVY1jFlGyNR%}Vg|0(FDp)EhY;sGp)p!32;C7SLhgj#+0?$%y;L~i z+!u8W0oASPZ7vIHt8`hsRPin!Ml;<8&yeeVL=&bf#T;GSNtpy`f{?cpz815`he9VO zFWNSqUPhsh;;(dSG0R8p&aCo^5>hD`@!mDASfwX-akymm<_u8S%MmMG`0pm6^J42& zVqW2%NPh)fPMOSo_;SP&0HO$D$++Q{#hM|3uZ(MtOYPb)a!3VLA;z^e{Acg$;)JT@ zF9Xs?X^C=NV~Rk%xT zGV(m}yCLc7>4bTl%c}bNfA6WBb-SI>Cj$vKe#M;`eX>dp6MCwVNE5-@iTT6=PY{wt znI{*g#4RN6?KwDbpDq_P>y(5OnkJP6;X_ljzxod2wkProg@rA#K>LGBZ}e0=E%k@p znIp!9seufr)U5g1V!x;N^GJGdrZm5RbR5t_SpKBOZJ_k!S3~B;B!SABhow5@+&q4_ zgasY-uAk~_^HK~^=GvoGvx5_3a9#`hXPxB|wvXXr207vWE;%3sOdBxdmxL^j3j%=v zB>?yYBtPBx#_l-p^XH9%M@|_TuvdDQp?gLFEEy4qMX%N8UvdoRT#vVAj%pR>tM`53 zSt=nRe2}pdX1^2tzd-rtHGb_z=#X%UJ5`X&c{lY$IiSsYPVnT>QCDFg`A#0oaiKq` z;(Nugf7KW_VvfTEJ2N8!i0dE}Rf8sZOkA@lDaL7_w1tL)$X;HwQC?$>HkTdvL;XYHfhvoao6D zIB)AW#2*b-_zS)DC+N^_$A9IDENM>gyq9mp^vkxx-N4|WgZx}(o^ms(F7-T1S*$`y zl?`7dTr|gT)Eh)$tR)%*;VP+H%}Z}y_m|h+Jc&`1m=m~Aq7TwR!{R{a2QLM@ZtI^N zs9UA1>qU>Sbe4cBAS*+UJC;z9`Xn)B)G6Z{TM%9Wh%6`2LHn;{+?cPEV4e4^9AH9g z#z5qE_8*0TH}jiz37?c7aD6smRA>}yp5f`2vbKSu`My6my97~Z2=x396hZ600t`@D zJTf68b04%YkP{f4<7m-#;h*88B#7=jSCm;u^E@x&S>qmABoDMUy=55=RnFmS5@uG0 zUB5hMM6y`&`x;9}9$3?%$rWc7l5t5{U(a^$)$>AGwB4%LsVL3+_pc<~)H*h=b)&aL zv^gO){IGuH+st_wNLDui2ms{DWmViy0aP8T3i*J_W0L1ofeE>aJ|>rnHY!yp~Y=5u&;% z$&%T_hpLzQ-@w^m&W+)Ji#`pxM=V)>CipYPiUT+*5-od7(={Z)IXiE_SIn%UHE~xg zMH+HYr5V0;dvf!8$t&GxlF{ngU6I#Ll}8q*IIAf8uU=@rSzR?LYxi5fLyx+PQZs7N zxU_>&wp|&t{Xz+C^?9`@wMcDm_ob|G!xJ^Wmva`OGPqE-@l9@ITaB=`MxbrpO-j`+ zqqWmjyxXld_InGRPU_;zcvBF9#N1iN_a)|v+9IhGPLbbSOpq6k+jSj(;FpQKIq=U| zhgA55;Y}yPx*v)>52#$r7lSqZf5g5h)4Wp$iDmI#x1~j?>DF4VktUtuTa6CeMzWL( zOD#K2lJ8fZcv=ltown2b4XE2Rr}m-nPla_q^l$9#0`K6biz3nzC}X>|w@a(tGRI$n z!Nrtz@h1Cu65@IGM+`nplE;hAAxg=J|tNk*HflZ3fclZ0mmq@#N&CbiVnWvRYc z%9D#xl9Z~#GPIOkttq&ttKMz3Yb5l3D?9=_duif}PZw~-GzL3stCXFQrAbn0V}+%) z^CbII!!oO*?ST?VmN{dU@ujl6A}#uKyOJqk3Fc)yxkx5R%&H#)YVDZ4G_UR^+i*(G?OD6sc^tJew+8fAPRVmcwyu+D^DQ4no6+viohR`4KXwU5 zRd*LCzy@G`Y)2a-DFkdmf;QpE#bHn3m6Q~c2=+3uDyTs`9D@6|s9}sckfadB0|8#6 zb*Jk^NpB?Z#H?DR54+|$3O6GZ1zYD>!jcI>2G$(y#lE)*8@7$RalY;%q~MG(^G{4| zBrJWDHUgU7SlCJla=9ztNWHz^cJ1H2wB3FBQoyFIXBO?hOEi|LwWI0Rx#rTvs9fA> zH=2F5wdacE)Za<)xUtlyo5WWV+s|r^Z+&+i&F!wgrd{c;EU%#Wg5ONkpi6B+EiLsM zTWgdU*U`s4-l=6iihLD+uiR-@ItBdK*D&}_-up>JZBE+K>h9ZES?sSNBwA@#7tvhl zS5jN~I=q&!&1-S>5u4y%ui)#wFXB$S<8L4QL%6onHBD~+0A15OckurJPt&H-^!tlX z4R}xC-nroITgN^h*ROmvCFFLk<6jtfH$g3HG}jBMTTf~w)Oh?!$!Jq^m}?8QKa>#-wDT zuABCr^My4R%F=G~Qj^iPcu<>Jv)1)36Isxw(R@i`y>$t6T}IyW%KjC$D=fEO9Moom z?NUg;WMio4clNg^7AuPe`#@@KxsrV*>h37*HNOnSkL_I^XpXae1n_K*ONemxn$C|f z$J%Y^B2c&Fj_g&^@%o(T9Q@oz);jo{rk%b!f~2aYu9ehc_s?(R!l zM8CJubdQR6`bMXtT*Espy9o7j{jkbs(^esFLV4!14~R4^P7OC!wTnsdjhkDhn7X~p zH~LSBEMa$zZFK(t66q8F0A=cyH%lQ{7`+n7S6EJQsG}F8F!l z9~F2jQ-m*><39u4UTMjviA;9O2Dzq5KAouPsEsT^g!0Q_IG4(fcR*#Ye~070iM8z} zDZV58D)>qJOjtH!xbdfir?~iG@u{Sk+{A)^5cp~tbgf!jcX%h3(^~Lvh#uxRV`)i% z+{ipzOSsegPd}64-y9DCc;*i{U3@NVo9B?`}ksL8<9}CeXDgH0!u-7&wh5(Qb5! z?aJLIux5tBczU5yF7i!wva(nAdR@jY{Ush{x${beNXaUZdb`?JZQGS6c-xsRHH?zG z>#9DIvAg&U;%!3HNBCLs+r&Q)d~@a7E$_q6+G|38h8Fi1S!OzJo$(LBw;J!lzp_GM zMvqYOtbYydbtIZ0GsS-qk?nZH;o(0WH7k7U zzX|>#X!bgff_z13dXfFBOV@lc;*C4Ro&oVSoUzRF0j=rDE!1w0YNW#iQFSV|v$IQ^ zb!#hIR~IYEr=zo1=@(y`{{O-cNJrxIP&8(%()00ECCa zTF~)sm17xgYe>{4gU1?4u$~zZe`{NKLG}F()f(L;iOr~j=E5WqU0Ugr#{)l`YF`iZ zOQ&f3JLA{g!p_*@NO7Z>Kb$9=~CK5$awY(d=%d5y$r3fA(wf?}#pZ2YC(Kn3~{t z58@ZX^F`>r=v_;9Xz%J6HIlqmL!!ZDKfAWQvt{IdZtQ@^7k+w$&%qH1=BErt_P#BBhd6w4r`2PUGmYyK7w77;PGeb1D+7_MSEjn0YFs#O1 zJY6IU6w&QTE$(8yqH5k9@gv6{g$Kfa7tHc(Yim2B;f+OKV+N8-8-sAkc094VHi{-G zBw>~^3}?CuHnr1jE$=NfyX8`C$8O!aiZY$O=(eBpUD@dOQC7X}eN$Zzn{*vF;mzgH zkHTLY^gAn{O0JjURn)vL@<@3RMRj#^X*hC0C6-3U^iu9}7t!SK4!LBhd8upK){Sc- z6CS;%NWTz#J2I4H-6LBpmv+&}%e5M7DdUf8=IpN0{)6HV0%!_k)4W;mdf!NjUCQvh zIzF?c1uf*Uk5q{*B(@`ZAQ8%4B#=g-W!kUifAFgOE8!crzVIHc@gLzm)yo-J_-(GW z{Q`LiC|d7Cxi@j$TNh~+e90k%Mjc~@G)ImCGEvi&O8dCELd)HaC`?c6;q;yYHovBed{Vt9dAwMAtkQ;u*3YJB<^>*7_EzPIni3TbN>FKJCNG zYj}#tq-Hi1wI-4ATT77^`&97^5CgTL*R-o&6zOAz1x?L}o>GdV?*&|L!P>|I;9u+7 z0!`$6U-(Die~a2vDf9es;5F1d1>=~b+~PZ{{U!-uvD9WqbZHXSSd(J10*a2X`d5Rz zC-7s&2wUNXy{T&ZSA5&@Ya-iKh`f0oQF&rW-^qL^^6txSWN5=5 znyP=oA>+*qDbs!?*lUo68(Uk_HET3gRsa@zYl-ZL=LHrhw=w`-Mnz2N#@FSw)tsXw zn)p-x9OE?g*IoANQmEp!c5SU1c6uhSbmQ{r)wFn>vV3H7w?O#0;6E2H8!YwP4Jz8< zhSH;Q&uEjQ$i#i=L#uJ0kYSpI=f@o_hxYfuj{tbKFiA6M7j{;&I;kMZ88182PGr>e{Y`q?3;->rS}TY*mOM1GIMPGVDxbkh!WcT&_}@c2Am9 zx=ASS?PF1W^X-11t2n1?P1@Y8X!g5GEj71vuV>XBRQ~`G{3oXnJZJD{#(oAW#LIPJ zFZBy3*yQdPR;CY-a7joTX$){k80$2T6nr%CBB}7#j-yE=I9m-*#S>Xvf>^4L?Cnt^ zoH-yOh6+f+wgVjQfGe?{5kM%icEm+m9*1mc_NkMt=^i`qPE^Q28~x}>98mjC|!HYrt#&w_g}{s zYiqKnWu~o}y7Ib@SQCF_K9notL{CNk51A+!DWUW!K8& zds(N2bjpnw%_1?gy6R3;;PH#?X4HYcG&0U#Fv_Maqc7*FL84uE`ucbYanL9MZwCBS>Sn^ ze34hSjYU~rJ6e*uPkUdj-q+R`tu$`>J1%eTtsUBZEz?EQQ_5Gt*E)DDrKgO1JjzB) zO)d4QAdkNbt-|fjPs$Xr80(BInvaca4nN|X@iMO>4SvE~IoOg(-lZdqGh=S`P)0NI zkT!cvHku{c2C{8CS{Ufp*ZNK9Tpge~dC@bk@i9@InJTi&)NAePr&h&C^J=edYHp z^gL=W73k5R9w7J=6NSk)z7X+c^_=K1`<)_Kt~tp@RdiJaPD+Q}9+jt$z7aH{C-Lva z&xUSxtajcY(VNA(Tr5$PqIp)*Jc<|y*LooeLpenSM`d%N%`@i9OYp~t5N;=Q6X^G( z=d;D;AUqskpaguNV+oyk;cID?*5kuk?v*R?B1Vz;qfG!34&+t)Oe$Ar?+lqtmMXvz zQ!Kv`W|pZnX4877DcGB0nlWVTp-Ro_xTk4uc#@4a; zjqr!Y>c^(PZK-%iP+^c%8>WKV%uK+H6>b<3#NdVKwEYVI08%aXUx(J$U;sYT;NOXQ zPN!-zq?vxrEzQKO3_>v>h(o-Aw8a=Xi^eq{h5BTmm^6#u54Jnl-p^#@5LM+{y(T5v z-+06>BN3J%SYWx~?*13*@sll{pP*{aj!H>us$F<~?FyDENJ*|^1qlQoBY9DsrH(i! zfUg(rCa#lGeQuLY?+UYPevisq8mvVci7C!e_q4aVmE3>77`~3p^=SG^>qDQciE}33 zm6qzk90CVBnKOj}*lr*ItXp$C8JnG(MAO-sWVBUcGRy9&gJ zwOgzEg>lNa?rx@F+lSpTMpUZ}pfaOJyxtOUQJo9PD{D>3-`%&_R?^FB`aSli$xhOv zjcxjJzq0LhCx5?tU35J*@51VffqMa| z6#)mIQvrjickFp~yOd{b;5mVjwZKqpXt?t*& z@c#e}JahXDctZ9KN8(3={{U&9jki|C9bZP*^bdqK5SYMaFvVeGuWL%tvv0}OB2O+X zNgEbfBm3V${i(m;kUlQc(@61uhd*mCgmNNz3jQwBye0AH!!Se~?H3YX7<^{&E)dD~ zWR_(h7?uYIKNMwnbA<8T6uQ}zo+E$$`Y;3Kh zX+=g$-LzjcpzUX~y_(Z==hb?ZYfWM?b!F{0=H+hg&9y1gb58x5O}pCX>8wAqr~DGj z<4ww4d>{R${sJbsDPJN#6YHN4e`bAhS>***7_|QYh}QCWX5w~b3n$oPSXi>M#$2ZD z4R`(tP4O%2M^f-{@mGy>31g7i>V6UNFNS_3Y4;IF8pv8bOGa%y=e8=P#OIIPGb*tR zhw=|s_z~iU-ximrcn`!-I8=Ew4-nbgNH=T>TFY3D&u-%C4%xm(7%~PgC2`&x@PEc{ zg_^_aUIn%Iq2X;nNU}WM3f25U;hVDYhhzz?_)_{XqBAQ>8_i`$`Bb1h^u~2*t2o8V zQTLy-<#+dP?G)~vw@uqk4o8Eo<;@&LRUTxc3-iUrwDgpuqXx9HakI7CTOWRS=k`hX zukhuZ_=m$DD~jGWA*I#)AL7d>mum!I(>9kCvk+8=WNb8rnO9?Gyi$J(%K;n*;e2qF>J705~Qw=fJjZVn_yQ!+gJ`;x%QFT5 z0-`DAj1og0S;5!0h9M}5 zXkfHAZH8#en8I%A^xq7B!7IKdF}CH@4A;+YP==k^UEU`QPrRI=Qk!&$k|=E%3a!OQRf9NY!=e!V>wd3Qf?q^Rv;0K62Jz= zb?%>P5SzOz>q!8}XVK!gw_%P>BbMG$0R)49PebWnrwji81nc;n<8aV?6aA>aVGr7^ z-3O6nqx@3v{{VwLRdA#kVo0t0jSk^1wuCGnQkE1Y<9PtJl#e3uf9whSb9^!L&x(I! zPmY#$F{zkpe+WEL;r{@M`Xs1%N-Y{Qm%(Pt$H&{T^LD<$?K>B>El7 z;EoY*Vr6MKJtiQYG6@x%d86APB1?^0$xCHf^zA=Vk3F+AQcdy^w314K2`h{dUa{jz z$Af3`z97f(i{Z%((6IQI@HW%zsUoYESG=%C)K3bny=>kk5f7CZ-Abbr35oW~ll37rO=ifQAS6I_DcS5GPlCl3^B7>tR`fdXgFwF@sB zTPnwO;T=`LDH)&3hHN%TCpu-l>a?3kjKm7aq$1(jmDkIspJmkMqdL@+*;JVjJuFA zEbc=vDqxv1sGBmS_X!GugarYxJx}28!|gN09xeXT*DaDy4*WdQQ^wvig`|~W)ugz& zx3ut=gZB^+Tx(a-MAI#(Yp1cBQ1YW`>=6@$*R8cfD(U*Blc`$W#_`W2H+pZ`E`H52 zEa>uET>Y7ZZwnTM;T#I+%(xH%G$XJ6fIkpeTU#zvJLcU!wb=-(Oq zR^BQ2m3U;iNp#%>&xW+vk}(_+*y(96+h>Vv;kSS-)yMXY(uIg~a~h;e7nK_L#Mjpi zEcf&7W_?0y=D<{GAxRx0Xyup8!x`klxg{j|JkAOT{u2euQqEWRpSx|8TvEGfTivo+ ztJxnvon?8Y!++sI;oi5KZ6O*Of|%>2%b3A%Kv931zsQl-=e$ zJZEzShzuj6v0pTk8W|2lM-(j4naL!w$0H&}*+Nt)DgvtqU>vb7r}u0&u_T34U7w1+ z9DG*zRigYe_=WKc!J3|%p#ISw6W4rK;92!;I_}r|V?&Eszwqt0vtqYa=^_i6?QM0P z9!4AWJr4Ir)*#=eYSuTGTv565aJj~&ID+?$pltg>85G1(lb%e|i77?BjPNQyH$ zlBL-DcnnS!qP;rGag3Z>gp*3mCuXdhU0$|-Gw}+T3d(%5r&60qO4Cz}tnF(itnR(! zz8gI}k@M-?4AN{{Rbq(SNn)?C<+N zc;Cc&=Y>2U@ten5e}#2zZ^KrWm);?YJDY3Un=L;?x4VY+%3WVq)a|W2KVdD+z2q=n z>T%skWqagFWjD+TbcQ#OTKS)8VdVvtK1m(6JYo`(5F6!CiU1%7OqNRYe}lgg{73ME z;?KdKi@p@nV%Gdq@PFc0guWzbntlDn&8DAwci`U==>8_R(=V=Ik_+2=9ZKg+Hg|K| zTtPf*aPI`mEOE6?V_7OQ_I0Hh`#EySYT+c3jFOVqUW-fHPTuZOm(EpaDZ$y!5|nKw z+!WxZno7zuO|+M8%^vmpZTtc7U+mxU-Mkm@w^H%HjC>7q;ad%DpT}A?o{8eS3-s1} zOW`jO==aH`Mz){vEAbD7b(nPBTG zIL#?v=Iv+jUe4Cl+W!D~ z;LyR(l1da^?ylmSa#o6tudHmC+w?SBAxn@EWsZD-*ot7+m5EBBk$PlvuWy|#-~v{hy~w$OZA zs95SL8UPjiRjW+9NRZZt*~P`p-O82nbrWlFNhgo9TdW9uL3UHPuPuYScKnPlgcris z;x3(OGlbK;W2EZe4|V;=2-;tW?A|L`q++ErXQ{!b-J{^fjckAbfY)(nrrg=+!q(|A zdG?s$1ymGRH1(PZvB?2tx|?i35_ZN&%AK|MxgA(Wlp!Z+M#(nfm7S7Sw$WSnYR=s- z#^gBcTwPjpYRVRGnNyQ@icKV}-l#VCRrV2xFWBjy_H|Fc@41n??kd1PqO% z0Awiuj1itNeqaCt0H`?!>p7`OCCwJn-Ah+%bX}K6=i0}`Vz5=HT~3tY%cHzytI=zF zea}nk%=Cf?NGKSeatGc#^%*PB@Vt}wR*Gtu@dA;#SeXoL3}cwsZE?zz^DgCP10-$= zP%{dZAh$nsm2L(ip#mh2+A(%{)s(ycWVCt@HQ~cou@bvgWu*b2)FC_o17mjqumBOK*&0mc)LE4-q#OL=m>mcM%~ z6Y|>EG=vl0De9Yd<-MBL(%m+nuIs5z+eEvyjCq%K)0G6Eks@u5Hy{elZWN3#z)2zcKE{)*~fiQd{nT4o*M-ZUphvsG}Jql2%`9M(-b%&3C@q z-p8$jqwTBHp%nS5N;K7yZ&wtpwfyY%OB{9YP|ThKfe zdp?~LIhS3Bazr2GnKfr2W!@N-YkkEe+5kpl^5R7E3m*k&*BT9^@=bb<%3{L#3IU2@ zj8G4qlPJx|&hUo{2vg)>GZkK>;^5-c<$hbqUNYrP-QS{a%XZbRbL@EM!|ZnrEIuZt zA{8j&Xi=I{m$RH(rAl^D-TZr9Ej#LS@+I=OnGrI_^0NTxAzj^=Y&*9C+lkn?1m`4Y zy72z111hANHlKAW#H)s~^Fp4WsZGo`U@MZl{^;`tKx}yY5u?W6WwP-Orjj`uB)Nmi zgq-7h%Az8;7~n?RSQ3B|Nc8^z2Y5w19=95Xp{YZDl3VSBsU)kgMg^QYiIf08g$90n zf>}paF1txuExBFY=&YL3(!K3>Z7sKJ9~**ta!I))l5NTpidK!4lao!f^lI0>`X4I; zl5_9aet(}F`VynPF5Yv~9k4*oGI``2_dH`f9Bwp#WZ(`P85rXqG3SGxc?TIiPYsaq zk-+r8I41|3a!3ar#2jwV2Q}g-JF7iY?cb*V0Oh&ot#-Y;+hwP{zfEqMEyWd}ux4Ig zaXAMP51q5Y0EIwE03EsHuOQVpgneG?KoH zyK7GUE#z++SBjOJ(YMRB)wR*S{Vdk@waj&MB+KStDZt73R05bIk(J;9mLZ53{w5VF z?@7pr7u*V#z$bBBa0Urr2qBb=5!A*OsZ01{Qpkz}b zjmv-u00F}*6VI2y9XDqqrWkQ|*Q2xY(QWIi>f3!Dj~5i3oBLl9chc*-ZFSR?_9VEq zo;X7?xCG=EQloC-M)1Sr0Fk$M-o^nZkcx`XuHw6}cL2&x)of(&0l_1uKsoD?t9_`) zaR@|4Rv<)60)F8}+z90F#v5=w@xTVNHlHUdK*0xMpP5N3zy}470As3;m}9A@2YnUp zv`xG8*4lUev_rID?4LE$`CYA3z1nxbeQfm9np+v5fgF|ELhV%`?F1G=#E=x8$%gNe zrz=qfk&qm5oB_bWQW$N|UNA`+&T!ez4ax7MxU~SX3@WGq6DtM48D0)Ds$1pkH+r1Y zJE|@Z%5XU9H!$h|Ck#$DCIU&hSmYxoARr?c1Tf?rU=9x_*9VyPYVG=K*QZK-{e=kfh$3OHWe+WB!HkKWw3a`IT!`G2RO(ijGUU99V1zg;Vk4F z1`Q#KJdLE1Ga{U+9S9g11U7S5$nKP0zFO&~-7nhz0IDMC-p^;f{S#d^*H@+Osai7| zO5ZCE!vtiKgl+`mAQCb%peZ?1(zP@lP8~N@idR+$Uu!nzjk`Jdl}-!e1HKM06l6X> z4C_VkVzrC_ID43|pD6^Ejhv}DJTT>x3R#ItxI7!GI|+^6lM&}2+)D2m!!CBLU~VKf zc-pL>3~nG)V=L_1=F?9ldtauWO+9V3>MqS{?wZlX^z?6|-+NhThHKN>UFrfztz-xy zh!ty*DF=^*%g zfy9z)_#^^6n-Z(K@^#Hjg<^7v1VaQ9oNsm~oa1oe zw&w&ZbSU#H*(%L|yT;&f+-{pKa2j$RmS zD5)YaCkFr%uzl=?Rcfaq+DPo)VM4^VFw6IVAYpcn6gLA38|7WS`)Irgr@H`dwH$8G z{CuDo+NFUWPDU3XDwC2)X2(r+@CJn%e9~UKZ&8zQ&Zi`m2W(1M<7oK~FzwWTt0fDi zWVCy4XJoZk{C4Z+Tq(+SR<_FaeQnh}JNetTrg; z-Mw{5S?-?Ox9j0>^3q=I`CL-6mXeC*Z%gSJKblWX8RC-24;mTl5D=0KP&^JIgZ@qxw$)ds$bZ-qV;zngy9vOhdr88ANmIO#qk_Re10?hJVbQ~+<$hM}ZBk3&cj>>Dr(`K& zt5a0e9Mw5q8@n%cTKZkvvc0;qaIYJ`Q|2k7;Nx zWh8>Y#~Tf*&5~K2+%V4@ag2iP_d;_wgoC`NWutFRRnxuHmrd9F3%Ky!I~A;9O(yic z@6+Voul4MFN4=Dt`lB#jPwpZ^-~EBkIlxd3Ffs_HdG^c0U9;flj5#D{qO58_A5u6x z;GN%nTYM_`cL`FS8QyBv!;I8%{vp54a)LM8G!VrZP{tnTQsa!q9 zs?6gXm>;^#cAVq|#y|+8Xu&+sDy0?5rztC4-uHg(?W^?HWd83$j{;+Ba;f7f(oW9a z&ZO+$FI&e>x?KF*OQev5Tc(iX7)wal?dOq*@=4(GaC!NTIo5{5Rh*9|(^t947#8|O z(yM*$a~ymY=Wiqv$OQHMEVt1#%Vxqog}DQjwA1{dz#ypE0v2sF3Nc!x~N_bGlRGEFsK6yCzeRg=ks@ykT(tJ z0VI;DayTuQehnyez)`3HyCFcgE(i+U2#P`pJ8-1{<#CYNOe*JisK=U}Ds4SAi<8l< z(vw>2)2Er&Ps2R2DXN(I)mnNes#Mc@ZuPov%H20U54HF!@dDt1Dq27Y3PxpePfTu( z78%b2I8lHy4n=g_mX0us zww8vASi9d;yzlFxI$^+BO*Lf+)Yjb6sV3d6eG^OOmDgQwf0V8N0B1Ys&h10RF(Uk- zmK{7JWcF8<@quCp|*y#yZ}QuJs1(ukKf_Ida{;buw&9XrLh^}m_ZPlR&1D(am!tgf#)HEU~j^jfvHyL$L7m%mIOa@;Dih8hq1(Wf4f zv$|4pyVqaD;>U!vmFUIYy zI&3^L!_IAeYMn-`lwk^P+QnPwu0cpLNx=YN zLktBx4Cl=(iMW4jUC4J8C+smQvwZt^V$85Sk`=NE=v1B(=f!$jDQk@jQ2}>lu5V(u zjH0O8S>D+lSCPBSARt^3g=uS&y!f@?T`ZAxZ{gc=p?9_SiY1;!13STsPLUnk=J}%v z@+n=cg^5_D<_b2IOidU;J*7CSD@Co^S4zuuZMq$GFw|;YDitL5=Js;aZM1qW-+8eu z##-6k^#t>?d@w+FVSm*19ls`HuOn8r~t*^3q(xAyP5J znG}U2fH8sQr{mYd3%TR4)93MTitpzkA=3O8;rZ;OXVwE1(Glc2XN0YtZ`f& zws+@KbGQRzqfHDewT{qbzLL#~o>;hxgs zPYqjb+vog3_>J)6!4bl$IeBe-W8zNzTrpN|D!>n$9tHYTaL3`JRp+g1Cdk z7+^e%6ofbm%1dPL#_h`Au^K=85rg9h3f?^Zy*>^2Cf{lqB=85oi@zAD+Zc8bUHF#& z0K!r>-gdf7t+a{cSoV#+fouN&1d#ofv`EW*M*jeUkNj%a?vOW{-VN}ci}3E<{J$|@ z%Rs(3`zjr*ep{kfYbVU|2OQGzlY^yYh5FtmS4rBFNy*tebIvkr(l1wjtoJE+F~?P$ zWr@JU2^N*P>r<0S^8WzOmo%QKwDq>S?0y=)oDi>*d#bAuxOrL(TbP}|g!5-n@`4)! zYcB1?2Uqg(FT@t^ziYj}#_yT+9Y)VZMPIys(c`wenqasgk|K?eLa=h6e?Sm_!973V zk{%r~{{X^q`$2xu-w;^sAKALEkNi<`E?WVbCARR#fUKoG7_zO*Oj~)v#)oHNrThi| z0D?C7KM&!5*!#zy6rKUNY91`{U&S}Fm6YyDnhz0p#>&~FSrvuTeD4oOMdM#S2T*ULi6Oo13Nh|$7TYPibw3n%U%=NotZtrDERtX9J{FezN)#(AEyS{b(d}T_c(msK0D`P|;?e`6 zd_S}BM}zG^SfS9q8faG@A(%u_WAc+u&@_oHqQG)hT02$w)Fg%^Em0mTe!zxXAu{1k6qRJgSLlQeGt*+{BeQuv+m%i%0DLmApj+}KI2O{^=RR^F?mZ&tzx zRkE^vpK9N?H|<^GyLOp8KjVn(6+E}sykT*o{5kO45uqETmj3`=)qFY@C1iAD8hq0v zkxY^A%1>V}c-Qu@)wJ1u(eV@Z?D!Ax&BhnvJ`=9~*Wa?ckw1-pY@gc0;)UCwc{Kk31biOwhkAd8-@?qb z^HIrZROHq(sf_1xUhSKvs@GR*UxLeRT0Y_*@J^4|Gs5g8_=Ed({BH3)iL|_467VmB zyb|pytU#=Hn(F*O*rCGgacvW!autMt7SPgvXK(l;mYZ`erla8BjX$()?XWUP-x2=+ zXnzyfTU#t@m?p#Ft)GG+w6{&HT_s(y2;MEK!DAno7oYG@{{R|W$m!r8*{k+g_-la8 z9rmZ8c(>xOi0zYLR94kISK>#rGAiXvg3UoJuEkw){%@`R-(R&Zu^Zc8{9@2-bn_~@ z=-MxXd?BT2Q0*838wjkKZT70Fp))|}q#!UUYheq7c;^u~EKYA$r54vTWf*euu2=B5 zNjGPsz3=96)bVe_{0tp9aK;v-m6bVrNHqz2ww2=;N-aHhyV=T0ix`IX#MdLpWc*FLI@j#IkPswlM`20nGJ;ZVaO`yykSIV;?mO<-YAN{HP zC!!Jm01AuX<^GVkQ)fTIkJ#_QUkiLZenmcNYTBcCO7<0vBXZNu@x);gT>0hU@>ltP zx&5<0X^115I}eZApM>Lfe>r?1Z>H&&1Z)Zwj*;XpOJRp~zNOeg6POh2RRX zl9QbI?3|ypzdXIv+k=E!zgWfDednJ1e9Q1EUsk|jV;*0DP>qsyl8-#+ChYXqF7Kt! z>U+i?xA%#(xMx2Qe`$|`KL*XZ$>wSPH~5L8_@l;_$lD}khrwP4x7BqPoiZZ|rg$cI z^C0sr$J!s}JzM??ZSV$2=a*Ievwl1H;g(1HPy8tF*?`ztOiRWcTU+>r;;#cjW0FPL z_Nfp=b0Z{H{%*+s00ulY`#pSoE~mj?1N>nFumNtbJOd7h4(>AAuZk`0G8dIrl2EDl z!Q5CMWU>8?e{0QtHJe$|JUgL=$PxI9$KDjSkwX^e?7ke-ujPr1fmKpCgXNhDJZ&gG z%{~OxMsnqgOPQr6+V^&puN5cPs!G>9JXg|(8%OteTow`z_FU8&c$)1QR?k!T&-+k(N%46qk;e=%$)V}GPLrgF zfwzsLvsv2R5(JLWMH0e`2VeMbHeN8VKb08U$WLcGXk zFoz{pWLaM_bi>2$ALg}MlWjEAZr-iMHtdwWR;%tj$$cld>YQ7rn$x2hZ5Uy&)`GNJ zOPY+VwM*WW)~6|}{{X>KJbM<~e+vG~{{XUAfFzAV+uqptBgZ<{vkRfvvwgbb#(re8 ztblEu?fz2W#kCX)^6gLd{{67LLvtn0nc~}T4y4|22f_aU5A-bpDAM3GZezHYN&eH= z@kR^EbtRF4L?@7x0=~4d{f<5nX$nzqek}OO(MoQT*TNnRw2_oxGZA}#sKi`y>hZH6 zh%1)evbU4=bNE|o10RHUs(i&BcCqm{QMqR2w{D6Hy9gCV)lyYJ++6G+5PfVv0Py53 zB@bxr8*?g+D>&OpUzOe6z3#Wx>)|usq&FVs{M6oWS`d_6Waz?$CnWh(e9(&0&FdRz z{Ey2o7I=r_H^r@Nc)#M0#UG2m6gAjw;nU!4P5ejVYx^BK0#Y3^#`jif62ivWNRk_S zCTl3fo1=#hx}Rt8ug5yz{?V}bbK@KJbxqUj+LT&y%ey0dr&Ed*MJfnXSqWAgF^m9z zRBgTt{4$Q|UA`FTH);`qbZzM*u|HswHk6rGDZ)BpR&`*apkB0*)`~K-xN!ppm9^rwvfJxsPstr>ES!CiiH{HXuKS$f|BB<;i0d6F8@52k{?WH!pWxI^Eti&)q50D zQ620KI>oY)UPN^jpC^BPYpE@w#{KGBpW-)zkoKBsbsNDgz{z#uWEv$@cqgRqvsx~*$PL>7OS5+2^ktFc?VA7L}_ z?Bx4DxgGu!amF}#B>ti#RBxq=3^Cqhu@CZ9y&a{1SQ--zRq6$mT~_sJhW@c zlVuCRcPAcNuvw$Kq~eH1Y@!#B9F_@rl~KITR5OBeA~}8aOa@b{_=cqE%AH* zJ2`VVzqnIz99}u+UY(LmD9w%&Olm&Q+rOE+BwEymool&jjCVB#s16O?(|q)hr-lb( z-9)^u{9bZM&P?Ot*qHAyJ;b)NEhsbx+uV}w(eSdefQ+oOG;gwlc)9i~qO9MDjG|-+S=QH;C(!ci`!tcl^|-S57_OyPi|E%mcrJ z=$vG2e~%}0-FP+Z{HIS0t)4_qAz?4%3y1g-~tcu-sBf0Q?6@TtQ!wz&BuwOhsC$5%m-PrlsHRa?Fn{3KJP3;Z0 z56Mv4R$myPhfj?Cf2Z8X-&tN*Z+##3vVFxoTV$xf)ajdw=i=YBXN7E%Y9=%>=Kx{OPNCYj?F;oL zQ_)Shwa}@Y&5iQe0!6)1;y6K<{$`rJqJYK+6f5;@18M zQH0bo4>Jsg1>yfYWkE~tcj5k#J$)h#x1*i?qxo2*r2vr9YyxtBq_IB_e}wfwyh?p> zm0)sR<;B(XjL2_{*GCs3rQ+5U7FM&+EEcbPF5By zL%hZU*ZYx*p%R!V)R}0CyVwOBtzZ-zyLq@MEZHZEGd|Xhu*E?Q>SSyca~CYvQ5LGh zsBQ2c^TqY#tSlGtEDt%Ez}n3zgk1KN&xUd9AV@N+d=iJ5S*u^X`uC4NHFR)ldzxuX z;`Gv+Quo!7V2rMIbHOzxPe)fd#V06`+VVoP9k>PZI{Nosx%b)$S8pQzg9F0(vKyEV zQ(F49=JK}Hq~*8y{0SYQsxy6)1|Jsm$?U&_7Dac!qEH-VS5HY<()eilp%?)xCfL0a z%}TFU^_+HfW_ppQvkEW>H>ZG3`Zt{y%}|5oJybaD((GmTYMw&oI+v z7qt=r(nx^33rCI4XqghZl zzt07{zfUg6%o#{I*GJ6JYz!8Vl}WTqRK5&;6nDPX5||N)6!OnU`xb(1syo#RuVr@S z*!kGQdX3F02*$EH-kT_zG_tfCr$8unq2lPkI+97gk@GVSMjRJtsAq{x(a@9WC3Yh&itdqHRF4*` zA1}xc98mDx7k1%;g%2RE-NdAiQ;MZD$+xN*UR79$QWPZZDlUSs$-msWdn z3BY=Ot>cn|3sdmWBU`2i&7i2-;5&kg!DHRT&?ey;@95`Dvq%wU2$Dwd>H1HuJHsc2 zw`u34yc~3VzjwRurk~txFK}q3)`Gzyz2pd&!LZo+WR<4wotQnTtsji8<2P1v?Y{%H z3PNh?x33pH8N6D4uewe9nfQ+t3Z#0^VQJ%NB4cUO;B)ci%L-;nO%q*Me?}HkDl%10 zVfM$d4{OV|n;~w9&sm@q(2tKXQN9$i%`H;!&Ieee|vM&{U|DJ6`Weok+LQI zf!w;d%6;D`AO*g;N@rDQ(a)L6+0br}U52z+48{Rkn5@eiIkBWolSv8ou1xuqbg;kS zN?T|R54=v1s)6J?;f5uyf)<9)vhVH2>An!--sDe~N$FB@c<6}}9-^8@tJ=0^vUheA z+4U_`)5|T(*5E(C%RD;uN{t!6jCPrKS>bJ#oeSDcbh(Or>NJ=Pk5cz$8-& zLgKwBz-QB1Y?OUX;ox%3?PAupxX`a`2N{S-K&oar`S_Q4D6(#&w$=sr8`iRc?7&InjyjxB1n=_axaRF)0t#Y$6Uxh6C({CM<|aC2%Y_IuYQxb}Cr2B1XY zd-*F!@qNE*&hsjsQfw@$E$F^{9l(`%J-SP5R_7K2K`z?z5hDmKrv%FcjH6)1QG86B zIqCO&avUyxlb=3g<_jh4vAI_U`tLGPNBpGa*r-czAzBYfH)i<^6A;068ek5h(m#-) z;7hS`l3f07fS*$}|2rkJ#vFTmyA^EI+F(^M_^%@SY*PfSh59C^-$njYI>mLX_1Lv85Qy}}sm=OBgt z^(X4DP{a%;>G2w&-SHz|l@^DSnz?)?yWL&HeyD_{_b;lOGI*Zv^{0!#LmBB(^vW7e zT3p&V$t4<{`e>c7v#O)tg$S)Ce3bkkWc+h4U;WrTDq#}xKDL7vKd2~Tf8%yB50&=> zyTW;H!J#F}2iCP^L49J?)0UDk;-{S-D-4fMb!C^%rYZcw2aE)gxMKd<&+r-Sk*0aR z9EwWDoR#~v#B`&@r!bw!!gE$Pc^nVNm!2W zy1oe4rj`zlVEP<)(|V;AOJv`w2tKM|!*Lr5r6aY@9Vs#|PI{%WQY`P`7>Fu;Ili_u z?~aG(I;zgZwa;d-00~tV4~uP!x2yagc|rLfk&VJntR8HWfx?nu7<1dIImx%;<mcHbA!LeFJy8#FHDl9+p!KZWQz()v9~?4@VUJOQ+p-Zp~InpfKdGAy^B(T zDFmTJChq`&DlNAC_9{x{CRN0L1Xw6(AE2AMMs>k6))S*aOb`Q60>{=LCZ z^0t8lD10Qe@ScT=(V#2*-u14Vv`jIM-^F(s%QU`6jQd>C2Q1iNl;^)Zz( zuC*vJfesPwu4QNcg@zRG9Cp@4$dJbg@hr$&!!BGmn3nvgou*J&uh_vw1@#aH8c+@+ z(9=U&{6bj-+wS!tq0{d3|3p{dtzO^44ab)59OHBZ9UaUASwH3}SjNd1n|>Lrb~Q9n zb)0L!>%WnQC2(!vXlS44?T#StXom%GzFn@e^j5(sNgF&PxDpOvr2AbipemDoQ6i2! z1-U^^;v*}%cx^el^KoG;0d2br4rFnm+oNJI0AD=iqGvIEcuYB{A|xL?Yd2lHZ@9t& zjs2qU(~yfr>qXQpy4-PmZjc%kM$kRAxr~XTC{}zCDQ`^^aU-Wv8LyF>{4I6ekgh52 z(9fPc;E4*?Xfbu(zP~mCd!*apG@recw$*Q_4x9R^N#g-y2b5LY&U1#MYJ-#&?`6k8 zY(G?-QUe;8JDBo3(7omIjCC37uw=X~-HYAsiXw~#JuEP&i!n}atQjktiPcw*dx_nx7R${Sqw`}XY%mV*%^VcZAR50|)jFo+ z+gUtai>a$e+|HGAgdnq9+79d^*+?(7RqaF^vu+QT|5#sB_smtOxlb6+`G*bqP)WUT z!WMeu#Dw6&S@hlI#_rfIK3ITp&WI@kcLZk?IMEvV_)g|NKRtB5$^cPYxHw^5UV)Z*QHid=>=r(%MYt=kX5z~3MuC9LHh3B_WENV~e*E@O@ zt5hh7>UkIiIjSBUOeb2A2e713pW#E(PR2uOzg>J}!`LQe$0XzLfDRFe6tf;)i4C|6Oa&<*XYlMplF9XsCLguz)z01aFr4zgNCtxCcfAbfoj{#0IuefTTT*3A)b!;L zBh^`5z{4&{pGa})PT@b-c6;LrCNDJ&QwMXMGnqo6WFpjAtZgWXqHNlZevMvcSE~&S zmhXPwjqzgg7SI{TbyiO&Pn1uHI!fKtWYFL>vH!ZgI62_b48`(=QSp!aP)pql&tMK( zrWKB?L@ZX+QQV(F$7Dlg!m~}=W)PZh`Eox=kkjKNoC_!VV&a$4UGY6*OF3sPc!a{raxRpJ3`wx?H zZD+%vn1gY`t~mAU+yOvs`mx8Wt)KSi`IRKY;!w~E(4a@}< zxxb$YRu?LLSksBA>xC)GyHT0>=T7o!9tJ}Kc{>NN{-mwWJtgDQ%geI)VovcS^Q2&z ziJ+0y7okXN#YUfy z*?(q*|J?nLAyjN{mmuQ;O}XD$A>M(N*kV?~!hs3G9EFRlPOdOiY|*raI0dF68I)|V z46oVAI%?BgQP5mi01I?kuv?kpYq!mSd7vgj~Uq|*6&Z$UaE1B!Dt88Lt<{lPag_Lf~b zsL%L>N}p|tN`A*caQghsa7(J+wiWg6fhj-Tfa=$WAYfPJf&a~Qdv~Y4@2_I&L<7Mr z9I~v6aD_=3^quh`r?b@WWUw zc4}y^x}xG+rd%lPUH^t8B#;$EmoTdiSSb*!(^?NdmM~}q&3mMqW$2=b3&OIPvqqI^ z!Xs4{R}5=m!&8F<{1)P>Y6CaZd@iL~SdrcPf|dDY@3-<@1ZYoJ6BtF2PXhH#Y=pGG zOyy9LH1~IR?f5)_n}FNYKKcM8pQX;mNDx_aVMTH!Sd0TLknvbz=zMj}COy=V-f&5) z7nnPRE{HdJ+x(fYjx#HwK`b>tT}48~G9#s~{)g2%6k9eqIkBDdtMc8D62l53I9>SH zx^PY3I;06aQ0U&~7CQXnN8N0-a<~QKokB_7U{o+mT4RRNrq$#>JUIL?&lH)GCwXxX ziWX0Kx2xt9T*99l{UIlHJoisUR*SFXW@}u1X9SHn7~;m$gL; zs<^~mooC44n{ghcm9uh z4G4Q)U_zC_n+vc|JDpPm(2r+^+RLe`ADMFg5w(vdzq#iB{b{T?Z=z5Zr~AX>{;*|w z+qj&8GeuqfJf-1w$F6VJ<{!i6=;6DRKNf*>cvDK5z?jl2cy3C0i|ve*jOaKJrO3vV zr0FjnjK_CyzMzid?W!en99O0>08O$>x)dhUswv%A#++Ii)1m)@Bx3B*-poQXuj0~N zG%e7Ot=}b6D7~(9R>``W+TO5e&+3QfG}W@TJPkl z;WVO;&^Uz=JXqM-`G!3dBj(4x+dM4h#Wmu(aedT-o$SlFm80KU>@=4F(aYEf(Z>*) z70Eo22`+~uhQDkfIOmlzH2b0i6!ry!7ES)G&#X-Qmd8z5pznV|Je&!7ej+w~yfZ=? zOot1WZiwUVB!p~Fias%7mnnJbs&1T?vQtqutrk_9gPG#$dJhf5o-j4x;oir${6 z-|diH0VtbdX7(BB32-2debp{ezCM`0{U`)m2MHxyz(bWNn62ap9>ex7+?1cf0cfQ2 z_Of-R_5Gid#~r~~-DcKp3zw_@Ep)xTC6C5#!KZGQyTo;jPz<8z_Blqz`qj+qAlxD# zp2ga8rA^a85&A#dW-#Ze-@;T*q^M1dO#3N}2I2`~a2qbMLX0re=Ir8T=nVGV_e%83 z=<{*J#?&z%`_(`5K2&Dd^~h2cAF{Gl0!ueTuzaCH+qPYbG?xSwpyI{fSjXK&1*Uct ziy8}ML@h8CSSkJ4pEknynbNxG<%E59Z6U%%Em`UzJseBb`QY|Cii6O(IMC*CU8oB| zc5j>t8o8(d2cGZxhiqR&<}*HdPl5)c{>*>Ft7ZoKkbi#O>sY%uQ?n{Cte8`peVf^KmhpjU+6r z$o~T-w~~%$kMJ3!s0A=>81bxrE1`Ky`G@1;gZwlE5`ta2Ht|x`aBBHTd~Vw=4D)@) z*KN8iLlcIIZ7BS`B*1VW%c20mqoH4xZsA(fAR;n71l^=Mtrs;u{3g9)fV)~epO}7g zC_96R8?E_HQFcueJKN;O&p7~1)128g1u?q^46fDAn`jV%gQ?;d%L9wkJk}xqA)CO3 zzX$K~|4ymptU!=bT})<3G@ZAog?_Lb#IN1~7Rn-2J8kh8^GEyo2I1UUT?%PA27%`M zK7o$V?R9KvDA%HG@aMC@?G)A3^mxLz{5qwG3Ue+Xd4!_b=U9QP1W!1QuH#9%akQ?^ zP(PInClD*LHyTI^jRUEu%jPse6ksY(NGzXgv{YHh0VLX_MaV0{2n?V~R z#^LA}W#cOMEa`oHiGPO{kP+69$DB)(Q?+UNI_m`c-Ji6u8rn2iozh1#hthA zsAzmfSoJP(Fsex|7Z@OX*Ih=gA2oWsH%$Ah!K9X98G|muZ_(D)-5yIh;1Y$&_0Bo& zeMpS?fUSZWxmfIRa9e+HLZm(CB9Rb_4Dcg@nL$PJWp6&nPO++vv~#)o<$*wL%c zN%QHR{Mfq)(jZm{u=D{E45+Uy10ddMsnHMb%io#zxs_ppUFJ&Ye<77rm?dmkJFXbz z0L+8zOr>x;K~*CnD7y!kJ11lD%2`OEyX`Tm(eMcqT9&oKO!kcNkPI@j{rJXY2~EF0 zHDAsF7HTflzBU7UKFvmlkOT&gu$msC~rilXYX8M34{0HO3#|Q$0hI7&JbH8|9eOe*A!z&BL)EC zJ9kA{HW89Hq~$YFQv!I#d4u2l<%pzZVR^3Q`BqnoQJ~s5Oz@WX^pxrfbsc} zRAGadjN!e81O?{z)|>7|W7z>WE}O7u2r-1Gz#A`AasjTi*p%m+(L-##ybdz0`p@m* z^`D8#zP6{%|Fga5wlvCf#&Up$0bZ88z&k>z#!&4<-i6WWpVnLNC?h-0abwU;@_r-Xeo)1pPZ zG_2>4x&HPe%S*w1=6FOYW`Ye5Ee7=&7$dNen?Uak)M$P8gghmzT8;tCd ztfJ{FiT>BUd9i|a0etxmrjD5=IZDTo=h27Zd-chslr}}tl3nYvZHg~sy8M5qa_zzj zak$^hW|i~Y;H7)5*{A}G*634te{P^BLSNav@%sGnjq&wrz}_393mggva>474clDd^ zPBjL74=RY=`+J5p8}qW(c**_bVWNO5+x&8_r~)IF8ucZ2=>@A1cZnp-VHG9cvlj>p z18nbIWM})M0MNO&8DMxVY4ugnHRul~rEfF%MV4&q^zwhFh_Wo#Qu=Y7!Vbqn=3keG zxli5Sf24`a^o@+98Cgl1XJVDa1p=kQ0Jk^#wft_$y%3i>DKb|Fnra5*6H3S!QWckd3-zY1QvT^3F)i0tWi_9PTE62Mq`l-$CTR4vj3*^r)jjQ{ z9nbgb3%t2wzQzqJ6@QEBj(=u`YsyNkHv}HKn7kv$=&>)_85=bg>O|N7X*VoTO!n6HkFvSlu$a26|w%%$oPpxytorW*I0wrh8)}BZ-FnPNly-j8v zadwpY^1a9f63Ry8>pfTfVJ*Y#fWEIvk26em&QGxfmFHUO=<;PMu$$=YK@u2T0Vpw3 z?h@*nm)R}~bDg^rD|Ts7Y`uo+8Gf&uem^j@sYN`?cTUk}^dF?Fa%j5GHmj{H26axM z<9!<4&(3Beauiy#89C`B)j1Pm`v;c9|L4hz_w$Z;c@mQA9mmn|*8x@NTcx#-8nqpt zXCV8>!B;`^KP{#7EaV$oy=SzrZXAu*B#j>5wUdAJMu}v&s)e9Bj9)fXQCOxvX&@4$ z|6Ek+r{auKa~`E)!I=)RSuK+dtz~L+XIpJ;Yx$Xcxq8z~)AM=!OdhL~OX8H<#sUQ= zyxO1MN~$4z9@BGY`H1pwc2l0^8FO9t@AwUcTz`y9C>V; zi?Qgpt9)&e8fjfv@YHlamXSFk@AJf6 zPSX|Ue5c%f=c0}f0~J(D?!E#}FMC*hv0|#6|Bg#`R~)EF*$kIN2Es_LE#7;B*8=P$xb(s&@(k2(nEswa>&Y85|AMs3i zrtI)3Lp|yBi?n@ZQyDI10rQUmYlukfUoq~zjqri z47XvqWxfWo{*HzxoK6moXtAbUO7EX%`nR9ub+N(7=FR%SH{CP9@T{enTlTAkkM_P! zKHB_Yr1t5!i6!A#PC|~B7aHi_o2MTU(JdJ#qfz`t&g*&!UHOOqv<^RyiL!AP4oDYI zTpu16yw#jO|9fWe#jXCiit66s%g???xGuL>{LS2Ip0hgerg>TbKHInyG zZkW*KC$_G$%n%n<#ZWzJm00~^)FxFl} zU)j96xa=(?HBcRebRMr6tac>y>3~^|{38CR6TbUSUW3@`6_B<>&(cky>{(0%dG{Q6 z&iQ(Vsh3gPXO_R`t$w+V08Mo;9j(hSMpNttt`O`Yx&JUN4Z$Kg`T6GYXvB0>biQ4W zE`c2{ryHy5>6Z|BiTb5QT{)_Em0?&9SHZUBvoqF@I4hD@jb3!jRPg)cZhqfTzyD;r zcYFECSgP)2pSST~3BEfX ze|F9ymwv_)dh*5Ot`6ooUp=~AOu*QiO5GYRQuLfL8X*|as- zwd*a{GGl9B|J1*2JEd(P8*YnPdNa7b{?||QbU2iT=nWh1lT({x@=)h`5LXZ6P|oH; zLnRlf z8uZI^h7hff%P-)Mt$P0zw%f&P$&u6FIP=W7(Gc<9G6tb_4vbacjJ*88;=>?Zr`kV% zaw>ms`;XnKo^xxI7EA>@%kE~xx_sTE-q?m^)4Rb`AZZCv?ekgg$7a4wR|zDrrmto9 z48g~^VtL;6`xhH-7S{}eEgXu1LLskjwu-Sw5_HdYU18pHIfY*_kBbzhb`S`#;XhVW z9m?V4d-A*DQ!1T;EDOJy1N4AzQtEsCAidpwp$?4du)DGh)X3i`_&&rKy!~y9M4hNk zj5U6AWj&TdT`o(4%@9Gbt(qx0C#cR>u{c%9>#@fKTHPCd6->K!cc$>BsF#52-K*&f zV8aEop*Br90Qbzxac)GP&b`j5^3T((7}BWAOGM*973Co))$yL6OjC{nic*rlX)d-K zEgUbWdJsKN1Q#gC2aSXqKaX>=TuzuqF%|vk(le22j+?HFGOb{7hEjgm((r_#veUCg zecCw%KVP@Jd8x(ixnzz|@g?tuiIl`Y%=Y4v^NdPc9?7>qv432#o#FO^h;PxdBu_30 zS@NAJlRc%TuQl^PNI`OH;1hJXrW{zIG!ve?WNm!*3gO3+v+=7v&b@vp;wI==RC2TG~%3b;4D4kpG;OG?7 zfoq{f(Q8~DR+>j>bO9l$A$yRrNV@HY6i(!BKs}o4vOTfZg=xU06{=ayt@s8z=!M5bU5Cgi@rga@|YJFYqKlI$^4Z`K@GUtS@ zQ7_fCV`^J5qkFYPgM#Ju z#)%XDAK=+sFm2ofz4rn)eZa|Yf1If!?Lzoa1*`?#X`co#f#);*D>sJxJpBEjRi?b( zPQzG3)qtLW934Xlw0tYq9~|n~9W4(4bR4&jb^2H1gI~$mpeGgfaZce+BDiNwbtHj| z{VmFwr%i3Rr1hzzfLSAyOxL@oQ~MV|);V7uH}rt(j*~cDdJTTzPp)Be=(0ICRfLjz zBHSf#5F@C{sF8h7#iwaL?}}HcZU!E&myS_>in|hNXZ`la(e~aGKLF){&xi}gfq~?C z^pK_DTgT1OmuSjuc4N1b?>Y0wrMhN0%F1P?ZR;9^Pkb~9NO>s*n{pKYqttue1yJi9 zdJBR->C4*ZS4lmjsy*YQ@4;RaUQ)NpUv6W7wJn|acpBAlud0ES;csX>OR?$~D#bUz zGRf)DXqScPUxUqyKF!39Nd9PIk8L;C?ui&<(2xp(MLnK{Yq&EKNeNo#K0RZk+fDcd zLwx~K`w<8M#wvL*LFL+HaCZWb<~4Y@B%ut6RO+NPB%r3pSnG_L)k5rsSgH$koZegOL4;@o?W0{&dND`+g*VQGb z&0;~C%v-I8tI6s#GsLICh|tpCI$Gb?C$yY`%YXkvQAUTKEipj7I$~3bUHx@K=SIN% z?K`zbk4yBXI@Db*AJjUak5a>*O=+11la5_%aMZLiawi+=W*c=jn@lk`dmL5ao#Epw zlKf>>rk`#ufXyci;wSoFbLIKiKnARyW_?;IJxGFIxhWDT#*vLLmbyq=Mwi>9^)lp+V0!^Q7%$s z(UIv!q!{g7>P-AQrh70HWX5>6G9T0(U#!#V$G(y7Uj=KxFX?o4GorjAE@#&<{48lw zT_0dYB?$6p+FRC?dP#ChN0e!CT)NBDTv?^gt#+nU)X4$>EjB9o04{qWNk@RlI8Ps2 zCC&Bc9gLo_rl}=XZv8WBM1f1kpV7FIN~T|GIe3Aq)yM9~9>$}zbfvngNeAsYVr-l5 zw{#?^2Q3-!|6aeM^M?xYA>GO!le)P!|74m{}^XFO-zqgvZt%t7nqIU zqo{d|4Bayhj3!|h9-n;5?px-~DoCU(6JfEZRQa30IT(#LI?!e4`zq`oxm;P? zoXy1hKw0h^o=2|1qn6`_?FT+<^}|7%x6H1tCk3sSz>d^q2^s}eCUY#>TA`FrAw})= z{uWY7(F?ZNrf=ilxt)#tMn<}~iL|x1nQUCyL^SDA08%+wgs3-K0F)yv+NK5F{*In} zjNl-oVmi#BlJ~XO8)$|=SwE5fw36%o8(2H6TBw@(zu-Q*uoR2!9KQucI(l--p1O{r zE`JHTh{YwXNzpD)&Kzl|Cn)ULI}`fL>>*Zgy|yl3f4GwgWb`fzGBcLUJ#csx1o{!E zqt0+^U_=?rQb?Gl?>muV8zEhH4Z3OZ_$cll&h|ZI2e?vBm`-CE#4#e~)#m66GStO} zYW`LpGrL#MV=;}k`TS>BczpwIka!6%T|ip2T=#+;woh;GgQb)0GZyJXRbtz6AlS~5 zZJND%K4`AXC}0Yxk{HTmCI%S4d*x7>Lpi2y+E#ER(%8Vn{OU-vDKUSmKIw-*p|7c# z^9j$D@=54X@Q5@*B6+Ry8*-FCRC+B!xVhrPx^6H&_c}yM-q8@&6zMf_NqK4qY zqLcsc)M-`k-G=qZ|YXSTXEC-F6>=rPNsP__z--o zX+gnCND&!z|H!7LWy+jlxB?X(zygq3Ibk)X7m_P8@pj8TlfE9s-VN{vtSfK6S)QAK zilr2xyLkr5!7&EV{f3J@*JQSHZ{_QJ{I2x}(`)jyJY>>okQY4{LUUY1v#6{=Ir6l+ zi5~6U_+1IkDC#n)qRrQpWsY*`Q5&xUz2^SUy9o#l=EWDlES>;Vnu<!f_3w!tpGSei<&xS4H{-#f5s zKvO7yUN2YeY|GqkI_>%v^)vdOXBy~GREgomGTTPsH5eC(5yhK|+ooJ(M1QA{fM?cw zEGjs-erw7sXdQ2OHm3nFyDIVxC7c2^$#Hvh2Wc@`yPf%L*t)vfIG__;6SC_8RfOQg zG}Fo(Tk{X@O#DnW*0+jvxL=s8_v07DY)2Mn0FbULDk{%e-&7M2y_pzt+Wp8ZHJp1b z(!qf7$?XjEa${ZjK!I_qn{ZCuzoimE9kYh2fmH$ZcAMDVPwekqk5sqoXtmcVdpY_f z4j*BNIm^GT{>9-Uu=_2GYO}A!E#$(*^lYCy1^*gpgwZ|kusg38Y0Wcq!^j~~0oeBT zVE4_+eMe(jx8a9Jyx5#0JfWu7Ub$$v9a`QX{XHeMlYK4G^)WK6_5Oj|h)@>sSv4`= zRQj(k@*0UZ!igA)V|7ESYxB9ZTe4WbLZ8QWrMPVLBmwN3pZ5n=<`k0^-|zS`=1ptc z_l}Q}@+QAhHEsk*Ubqo!JM?$#zy1!|WmK>*a=MGHWBJd=6Fl@9F5tr|8%Mw?!AH;^ z*3qP__!pve`ISAml)o$&&JZ%kSRk=OT25o4LjGc;D`>NnzYk1L3v~upw`hri(OEV6-ZK=hNbHku5#jjH-t9W?WZp1UueAp` zju;1f)HBMUYXh}azyQT1mO=sQNE1%T0)275xRRp(vQh6nD1C`Mq8tD1)j+Z6RL^3Dg||5jcg@3*W_Q;?J;z5Z|q{ufWS*6ZMkDYwtZZ zcK4?>Lw!TQlCdSv1YJ#g)@hZgz16CQoQ|AB7#S0w?Ue6qnD$NqHk_A(PrNKO2KPI5d87ygl)?7B#PYOl`LBc=7WY!_PvY2Dcq4 zV^7fgR`v6J&htCwi!J>(r$44Gs5QzwjO2i!kH^n2%xLG&Xdm{67es$l;yUnLF-%dk zFEM0Z;>9|qnGpBAH(FoLX!lKtWmOn0 zJtUy!q*>X6F*4-rH{ygNl2nE=^a|Kng_=_C`{&d%pZjXa8(%nTs`qFa<3Ryxtd@eQ=f*Y=Gt~sozco)C419zVjRDqwb$bP2lG5+65KTI zNe#2?y(ct*w+V+jdnSL=E=qUg`{9*u7B6%-oh80e!XteYdiczHGJvh0^XTs`r&j9Og@mNvb$>C_b81fGA6FlH;-!&l zSfs~_2%#^K`1yTY6>2oq zuzoeMpbk+Lx%V;$_YYLlPCN3uwn0DSd|eKAXQX<-B)rE9!cqNq&K$cd_&#^#araNO zAw2vnsrMQL;c})$Vo+!Nbo-A@$=oX4G|lFTh8bkQ^{=75O?3!`1@^&C{P_`Xn}`$L z%Wz9VFR_;((K~E+n12#`M_%vvL5s~Bv86QNl~c#0yLH*QuS;Pqg7!XLm#IGj{`$3* zWeDftp-)ZF+&~WBnyZnp(sK^fYiE)wFN81lFZg7w5DuL)te{cZ`=IL>VHi-tR^n z*}G?kEcfLui8bFDMSAD2C33K?XzytH3ot9LrE^LVy|HaOyWw<|;Qpe^$n8glK#6zf z_>r*f6>W6n#pxSO9Ce3|FC77W@8y$aeqg3wWJo<75wB8K91(pWHLO?wBz1FaU{mEC zu?e4Am)lUmx|}}k!FBaYn+g@*56qi^qF-mt)ntv&fNv-C>i=E?OP8g*Cv<^Uo4 zU?($JCoX8w32@M9Xp~wxwY&a$cV!CxumV=&vORQTLKQg9ZRk<$quy$HEu-HxgN%PR zW%<>|mRp}h5p$%eMbFMQji|+wO;xt^)DrL7C5<~a&bR>uBr^VY$~abWcFUmUw{&C6 zj6#sV*D6Z*!OV89O%tT{cZdG@TP&LQY3Jh;yOC~UAOtM9-J;sV?to^>@ zb6b1YdM;iRK+P%p#AtZ@)-XXOZkqcDe?O$0PB5s!N^QH?QY({#z-a}Q%g@RZ3(T>& zmKJb^O%pZ<3j)Sc+)?49gxeD>wTn1g=#sjx1+Ehz4{ExHWRn6rYYh!8-FHDw8cWFm ztS!^ho>fCqIm+tA?}fE@*By+USRn5968n|%H|z3-dt+OgA*{5kvkJFZGL ziG!BeW72-^wPz8u{N*?NUT$$r07c76Mr>4NM6;{eD^k5cQNj$(;5dZ;E1`$i z@|RLW-NLI%S-~}Q95%;uls1R2_ALdY!^JLd?&Y-dbzjlp|C?U%HQKv~Omo3QaKSn1 zd1u|95kZ86^#^+_h|rVd=}K>Dl=P%2AUqV3{SssBxb!F7zvfCxTYd%@1%N>Kj-lPo zwORYx%JlK$GPRBNsDTFl9#(wE3N~dliY8%7{gvAB0tx;AsxJepR;Kv=iV|A*(I?6G z8MG-X+d5UA_bX{>cE?aHK5WjM!A8@?dmi?lTyLh?CQJ3%sYeRhbWU_Y%3O@bL?I%U z1BxvmeXl%GO~{bS7JrVh^GMJmW6)Z+pf?p3cO0Cmw6v@@vn}3etfJ0uC#2d7>Q8ie z*q$S(pt2QV_IvT!I3)1)sQY34hfRf+ouMxpcbkMPKe@LVxO&wo*gb(&^B50O& zFO-L-e544OHcFoJ%;=@xDs44B(+K;?efJWJ#cUCfY}w&Hjqb3?CfI_zyj!MPa$4FA zRPqA?*D|tRJ0_btX>QcDJDJErCcMWxJ9Jml1sw^iE6W2o$kC(IEVBk$yCXDb?gsje zJ$OmBi2c7SfYZc>s;%7eP}Qy1(MCHio2<>#%Tv02y9;L=`EJ)wZbhBd3Yg2+9*!OW zetj{qbI{#{Z;>okEhfu+KsgeONW!DtW1^hL<@+uD=>y%T7hsb!v#@eTEp=8y1;Ove zc699b=xTjx&AFgvr6HeouiQ(oZ%YT>(KUi8lG9@p1QjBM7^4SAo=L{~Iq7Q6m9T+n z{LAY5%P{}qNnL62;y_c*cMdAI^gE=sJMzN7t2d=QWLcH73{FmS(0kg-N3Ikp#oj6Q za?>JP$LqHBmaOX0Y(+M@^VbElKbhces2DiZ%cCS034hAaB!dx#6FM4@rL!}7L}5Ha zpyRT{2-&n{YO~@V6qV0r9Pi(q_@hb1U#l3}Z%B4|+a);TmhMOsO-4d;GK>)Jw5Z{y{2+c!;_<$K7LESHfw2k*LE*!ki#cDPv@rh@>Qr5Yg3ZCn+UZiLnDl6 z1KA`>fVDR%8MeoXN>4yK+;daA5G}!z#>(y z3Ul!jM@h?kgua^|Kt;^xtBKBmNz||9k843Tfb0J9dHG_5Gx}3I`VDC+tiYP<(=1a+ zSa1=~QDE=hh|fJEGkt2 zml~MemwyoBD00I)9oE>QEW;HZNDZ`Cvs0^kyW~*L^0m_Af>INdlT&Y&ee-pn2Yy5` zA~z29^QU?cg8N)a_rn!OR?-ts#FC9@&=haf`a?R)7KqFDp3d0&0n)I%I?T6t<##L$ z>s7X((QWE@=$3w1hdi}{VEE~MH0$HibHPma1ct)LX?jg zQ>8YWt8H7lwe9Zjcyo1qt!-~)!AiHfy_&tWZWqyVuT-|y?_FA2TcES}>F}I^7Qf;@ zjUE!o3%kc243l26Mnq=X*BT|eUJ{HW0F}vK-a4xXHQH&~_kp}l%Dx!!-@@-2E8s1) z&)R%3t#R@x`wpxY=_Gx-6-+>ozz_neSB!tcRq=C6lkD^OkHq>aF;(*?pF#1aipi3y z%QehXO3@T$DrSl)Nj#_{BO_e!&EJb5dyQtp;opuO@??=Tdp{3qgmgY_#+hkui2DM8 zAdu}JafZUtr3!I;%6!RdX1QLRuU9F}_3299siQ~FE??caUrD)H{{SwkJg|-R(K+kX z`cnS@!bWI_Ol|gl)YgQA;PII{=SJSTJ-NPcL_c#CyfI{iM8T)a^g*D$C>0vgvlX}`e zh%7d#%P-k(h5n%ekQi?=$F+WCVYmU}x>lv}Ht6|LXrBnKWo8PX#vW%09GtOz#*8KSgBn~ zFn8Un%|3};#uxb}mfd&T>NZI>-PcWjmg%O}{{Wq|@9I~utPas?+RuX}Wo@tj00|b6 zK8WjrcR$(72=f6NyqU~F78-4&>sRK!7mDE#I zJ#}kD;d?nHeIEKgn=KTulva|c)A{vr?Ay^_r&q62+y4Nvw0M{I8n=lplXEF+%@0tL zHhebW<;yC-N8Zla4$wCS3QJaP<+q39Bkhl+Ux38<+NXz1Es}Y}$*k`HHaHgTi~)ea zlj3V}aimB-)%#|AI<{0L5O_<$Ejp1>}%J->(DfHocj+mfJMYWlsTfMYo@ z{ehHZu-wK{SeN9GMOL4~z81Pr&!hM?-GB_Xo+g|zJGOuY)sf}<2H=pu6O4`cHNS|L zE{h+;Pub7Ka&82}t$1?Y!daMPknJ9y1`&@>Fr$6wv5jr4jqs<%@gX>{Wm zTVAcjJ+^X5C%v8j05*Be*TWqO=>e0%H#lIdO@+>js3=ps?nc`Swnjk6$pdjyyCask z_$~1MMrXOv{6}LU=`Z$rLKKsXGr$@w6Ug8OG6uWC5vd4;aRT#60F{?Fb6 z)EKmWFS)gp457Q5O|x`toG5oOKgqx+X~!fME1Kvuzkwb!u>pJ~@uS7oiPAXquMxv} z8iD*PY?_QmfY~4*z$A?Ht;^3J_yK-RTUzn$k`4=M-UdtUqbD1hZ5HW^4ZB#oGY`B- zD%+^Ts{AO_*iB>cAH}wEobGKqz?U}jDZ>oxvC^Pyf;a5iHk>YV%VO}jX*cgi_F6`# zEVoOea!*TLYj*oHvXrVNdo7aEOO+*VlTCT|(%n(F7sKz`2Sjx`ckMx_X+Ury@ppwk zv~9O3k#@Ds%o>yce9WL_xqaJ;fJZ>OckM+qUSIqr-?R6`kQ?t^%yetnR2(sQ5-mCq zxZ0ox2P-3P@GJeWb1n zHr=O+wCm7`Y4K;^zmKD06rU3KOHlBRp&$|!0n4mWBc4@D+efuk2?T-{o>)2@%lDGA zX>xmc$tR|&oa$6dM`YDK-QAwu4z&3-g*LicohZs%SxTikag$fK+jsftu`h>zYE&WD z;ore+ZE!zxX{~8He)DdOgRR-PA2H}kkTR@5U9Y#%em=%X)&BryF9&MGZX0|*@f9>_ zSg>L8l<_Um((ct-3{w>t3W{mE};{>SXUl z5H_v1jAWdQUx&t%Ee-0)0Ax%m7{l} zyjR+jdUvwwv`5dkUjn`p>PHsdHSwm8D&z#$d>wOSu@bxmTQhGQZdNI#>yok- zVlx>8WDf%svbC*e6yWTwqiSi}e*FdYnKqo0U0v+sy4^QrZkDt1?eZ1x?A7C)J8`k_ z{{Vt~V3CDolf&L3mr0p|#Qt268^*S@E<-G_g0ePa8&u$f*Z5cBSM7W75Ch;Zh+nlY z!Mkg6C4w&s_^ZS>8VnBz-4p$q%1aF@;sMJD%yJ<)3=iF3pwr?d%H5fN;S%u0^oNF% zNxRfMC91aln~_W+NFNRWAs_d+zydZPY)A2HOVh4D(>3oO_!V4X&CQVU7L>UJE^joM zR_@@o3WlE0fxLoPBcyK}!O|%g(B%IBf{^?x@%d>!KmP#1B7b3@i<3@R-s`^y^{r3g7Qb{@ z&LxyKfZio=&z6^Ut+lV1Lac2V@|qtdlf_;e@dh4EU&31QmJjxASHt=)qRu#G^CG*_ zgt4n0H!LB}=@FVTqI%`^e}$h0JYM^?-vZj1*x|0c8KlpnPNNxSHt}i}w$lzvg*s{- z*$c8kh4X6QWhmM*oOQBMsZtSkwvEZwZ6$pz%Y9O|-Lx|)#&4NLscX&4duW>Egk2~l zcI>UP?9X`BJZt{|1RL@5$9>}8*<1GA{fm5EBRIL&J`(uy-{P-??5CKlax8K9<5Siy z9xpCcFAkrf=|P#=&_m>qBkFXY*_Zwa?ePg?z5SR!;IG;jgY_3-6h0sQsy-Wd@8N8O z%<@GHH@+)^$5Zgd&CHRb!!Mbot+ZCGrbLJ-o*#}b{{Uxih7B>3!+#QW{UcC2NQ2@A zhpgM_&QJgnM$<1ZZRUwmGO|6)QHeoF!B8ZwM^^okB$zejuCeed#8=N76Xa`}mxr!y z1d$|4raOquqs#YDhK=3^Qo$o+D!g*au@aT()sz!@Z*{l5De^f=U)@ki-RrgeN?DaE ziAJ)OO``9~XR=8}wBV9$Uz*$6HfQMWqyGQ|pZ&IV3wys2d@b<@?9=;IX(kk%^`C)1 z7`z9oUrxNnmlmkg_)M84h9F|Mx4LHpOuN=NuG+q1@i)WYjDNCMjeZpTM)>9Mzv2hN zyYGiSJ=CMOu=tQS1{>!z(aF=r+AA`(ELqlZ+UfX;oU&pLj}#<&7qr9 zeG_-ahxS_W_k+dev*F){J}A)jZ7b{zZ{iP!{{RrQ{d`6Co4ClD)hw>1)-Fke6-2jK z{HJ3y#y=~2d)BA%^Y-NMUV(k!jVt2!#_emv{w>neLBH_V#JxV>$DSO!u(>eDFud^h z#Ay6apu{G&ac*wsMvmN~v^Oyov};}r%Ok{NFtuTIBMC=l{hdl~UhGuiYwO86jXqf|b~?X|{{RyFA$8+V ziGCxK#d?|Zd5d1;Vr|_=5tZ4DyN2yJvOQ%{vq{8#+c8V_aT|ZI1F>21t zuKHd5f1`yC9}D>(jBhC-?gBMZ7xgiIqx+4mAt)4{{RZ&42v0rsN)wn>#SEZYAM<+-dAr` z7kyUt(O>;J;eQ^o4C{(=iDq;ogu^ICoLx0d#+0SV{iNcTI)YrUmJU%$HdIyQ*V!}A z;tdB@)MmOD7neyK)`Dm*ubKgFq(KWU(oCEmk{0E+O_Sq-Nn$iKU(8P@v&EOY2xjNy((zl$4y@pYmGw({qLK2Z8<=YiXz5-pAq%9_G^C z>6-UOn#Cu$ig|w0#!-20>3$5aaBil)y|QTJm+V&i?fj1~$u52ocyi%y6HM{enRN}p z`xUjeyJM+%dhRr}A8D9N>IrU{#FVy`&cR zw<6t?0W7;5MDFm!h_cBo$ZG(blzH<25=u?3=&dZa*KlguQ%5brwDuy;#CHBwtg@)a z{{Z+$l~ysemSww`#NewfJpif2B>O_>WQXEH9aEEwx_{+;~PwZa|UUvy)8JB02#P0M10PZl zBJCkVH^{^8?p7=rHY50HWhe^wS2qokM(7S#k`8?E;Y+gQe5_T58B~KB{<8QU+u;VO z8bK$AJSxxrtrFUO9^@#FAi<Ht)(nHX;q9=qspwDD_ymFZGD}Q_;kMuEfx36X{gD7r{=r1MhZ%T z#ZA1j63oOY5^i-H@?%m3=J<1?00U^U=Oh-E_F!<#8##^w91uYx$^dL27u|^e0C+6E z1AHaF3fBJs4*VWN5;&Vug`*)0ZgCyt48VhtCe>Zhs3YfAewR-DoqicB75@N*VWPec zN7?*Eu3NJ88&@~-DRp!5DNqzggM!Cz6+aNF(zKO4WF3{1We7#TcY9RZUdsNdpL2rx zB5)2Z$_*mnh2E(@NG7)4!?oRQ`#69$_IDEFKF>J5$2p-Toev zqh0<1bu z++Px3xWKe$+qWF4Q-BUOkPq|%pR%vR$pJ`pUlZH0Qkgm>q9X74!{R$(hLGWjIc?nw z036th_CxTTpqpgR$W2t<7+tKn|HH%uKFYJ8c&117>U768uHZS zVU3O3karBQQEJM^XwJ~3QF&Pp&$nw%_(!IEvBPnxKnV=12A^?qq@Dw9j>-vRBoZ=V zlW1Zh8-@q(gkP~^-eBpU67)NVC_Yo+-9prI&4vdNyUI{yu%xk22P71`{{Re6@gWhD zP4TaU=Z#L#yEP@~3+ne-Xu|I|H6nww$O*B(Mfh*#thqTW_4+{3!7TjO>?M zY}!1C=WmsHW3ETI5EOan*^K4D4v{Oq?s61HJ#4?lJj)9>xz}ySPFbs_)vlXq)P9NC zUrh{g{{TZj1Gx7MQaDTo9*tKUdu%0FN~~{dH3ultZ96-S|{bObnJ(keM6h%BhF{r*|wg#_ut9Yc~WB`Vb9ryF~_ z({_?tt696QnxDtsC;rXsZe3obP72H(BAwf(hQ-0f?3#+MlZ#y+G&*Y5&+-~bS|u%X zvsrB)>q5zSZ0(#9WQ`YNJ{W-H02}X}rxV3&l4RS$x5p%gQr4wF+yU7k0hMq#^2r1b zx^a)Xd{6rnc*C9)reBWBmwVa(q2qPS)NBNmx(+Hbp@xy4-a^kz!F@}_V)AZnpF2%HPp-2D=lkGwU!Ia09SpOzS=j*Dj?qQgOs;*kD%}W-N?cU}TV-axyt;Q^g<*cd$IE*&}c; zxg{iRm>qWQ+yVQmxaXjr+{UXYV%F?FN#QQ`(t@Rd6O|CCB!V)kPwxRt<;*JxWGq3$ zAp;~iQ->f1$Sg1kEHH=V2LuJLq@{_$;_2O1PU&)`EiTf!=+~{fTKhBbI(U5B16@Y0 z8nzC-DXB&^At*`{O}c?Jyr(J)mdb(&+8M}fvj9OjQ^C==frO^y zuq(oys0YZU6acCN6Y?l*$GNvPUz7$Uu#f;0I-R8b(S;xY5U|O}#|v)%09lsfN{-86+aJm|qTx#I zJCmn51ePjTj!NJHYdl_32-_!dA1?(;mRvbT;~{~{uH2E6!5}ehkt5tywx5&b#^6Eu zg8*`NxJ+Q=XXPgh!?wN+)r#hdZTv0UOQfF8%T=}d>)i3+rl~pMYASP-BC1ABD?2Td zwVJZ&W5ZU-fa8O=JurIr82%zbOC_jFDSNif~Gd z4tkToZca0gyYmtVY+wwM1zA|v2l&4*-k_cV86b7}bA!k6cGM8lDWkS z&J8zxUb;7Qt`YrcQqVqbTi|MoJb+w+ar)2cMdv#f}>G8P0Vn%YqDxikO03c%^lgT4F zILYR#u8M~Z)bdFH5~BnGwDL$JIbudX8r<@U9QqzG2~asC9A_UW2L~7fKX{r@U2p+8 z9Ass(0R@2@PXL||UUAM%9GCl*+p@mTR{sFcUHcE7_mjH6mF%>AJhs1GdKjyufOiwr z02G{L;AetBAb?Na`A$jVr(GxMm~Ydvs~tTjzH5 zYpweuA#|&J;N)~>$KB_s#&Q8%XPkl?Z#^eXD%^eS?r)Uw>5Oza8-_E}fHTKU1%ZwM z$mEVl?l1x1cg_m{K^-=o)hgSzK2^ZvoRtKeo_J${oQw9@`| z*q0`}^-F7NlJ(!^zL)7*Jv!My!P++x6ong(0Af^fa-d_O$m%%@X&`|}%PA^ON%^n` z_dy?ffJxvGHu1nNMP37QxB?l21AqY>kXb=d$s}jfAT3%*6^=nWK?jd4jtZ-1cS1^z zc7ULAHsA;B(zDan-dn9ap4MG@iB9@kcD3KPqF3&`wBGf>+(%w;H#YIpA2#JsQJ5SZ zx!gKsLClJ|&NpB&W6ll<0N`@D8*)ZRJ$c9)F#FW&iv2T*xlP6=WGrOO#R==!9N$F0J`> z-+NuHZuV}^bCyd9dHF~@5O`yef}nAcob@>!atN9Oysx+y0nujOUeW!C-r-+wFHlaEY!0R>nN4&n#Q2>Yr?10almF~&*x zNUapGXpTL8OocAHv!0`$;>QQ5Jd9v;dwigyV`Yg0A)9a@6SQq?l>p=ABoYrN1R~0^ zF&jed>VtChBRN)F5rLmxK)}ztl+gv ze)rMaw*5T5XRm~&?v=XRU0$}bTB}_x_1vih7a7ZxIbt|PW*zn^RN=aUr;LG)xjQgH zZZISYGqZBCI`TjV0zJUD8;ay|KqTbtd=X9?5|Du5NF_%K$^ps(a5K|y1OlTt&c(V~ z60wl1?0)2E?pU@)0;wReeu_@g22RtGI4a}RG;LnVEqA|leSaU!_UPd~qfeIUwRF|p z?w-v)Tk5~1a@q@LU4vqhNZ>G0fJiFE0ME<@2_TcubsP2?VyR-UHz6F2kg|YOgM%28 zs{pDp20;X#wF4V_Mh5+&wOzkA+b$B_aH^y_2|_q!$WTI(2_UJ%D@S?aj{w;wF14K+ z5~MRZylDb*S#q}J+>ildwkP9(9E_z0onI9uxxJ)RTGyIOOId5Gx?L@9nyVi{grP#4 zhcp*5ww7`JUXj0Tovr9}@LRSs9f%npCgpRCXYUfIM&JR$5WIp27;4jw$5A6cX0uQZ zGR#H*B)7@9hbTcMSY!Y)9GowZ-u!6zPi9D87--wExQOlbX-4haw>DurS(UJND>m69 zcT#-9oXyYeAMno2hn3=(*|=~myep|)upnTny!I%d9oYZ{QpA(<170O;#|sACY<3Nto`-dwG;l)I;OuKjF}YMmU$x=M~qjh)hI!wp)btob$NgeB7M_OtZ6I_I|4p&Ne9 zZEqPNveR0?QyC-ok`SSR-MEv0Q9)q)g7f#9zK5lJ+P1x;+c_$HtM3x&F|bk&RUk>y z>yQTDEk+9s*(JAn9*zG11l0ckf~NSv(e%&QgTmezf_80Kro=c>KGh{hoXT(qPGCzB};eoQyKUGX4wj{{V_v z2q?suZk|HX?U1_#Bh9Je7YWd6DzcN)mQcN~c>S%L(JL;Wap_Uv&LPCpQ-)cKgm+P^ z2T7%Pt!ULylGm$``9GBJJZ<4S8%v9q)O1}fZl<D_I=*I31 zwn#BqEwYXV)0u>TgSg`WW&Z%e%kj0rA7#=!H)IO}9_BlXiII-tb|kk=9ux-oWK)y3 zg^Y5p72Z5LMz2zqFZBlAYU-P;7jw6XPo4HRH zUXooQ7*n>fU1_?F*;`lA_enNk$>V>BmjEr_i!E)HxDn~LI!2!SvEaNAnSNFSEO-M0 zBPSTL>Kc{Xmb&o)rm(KQUsiE!vsinN2O^ekQlV;T@DH27$TL1%z{IOI8CGYX~P4CX*EhI z>1EO1mt>OZ)710o@h)X6sbXu?OI6QOZ7+vgscZ8~(#M-7ooXFeXctpD=Pz*0BMj%} z26SfIlaIUW!6L2wp6zgA(5z!qlbfR{f8ro0x3@_^89X3WEr1(9>9qgkZoZIPT_w85vTzql( zB|2W1VfcUW+u#?(e~CJs+z|-8$Yl7XsKI;S)VRENk}Gz!(iYm-GThvSX%$Zqd5L@SB?th0yplEtQ&Pc0;YhiHxx3ETC_tJO}ar0R9O9@ZRMu z{vLkL-?GM#mTp=-N5>uyPl#IOxIvhuI){y+_=Bw62$>j6*BZ5`^HAk2r6vRX^UdO` zOAqvwxcFnFIZe~aec~NETh%Tc;iZ;k)S7pZ<#v$lS3$Z)1S{d zF~7?ngnSpH+yprT_Y&MeZEl5tA!KRT7}YYd5#%rC`JaPWY|Z}ri!o4BvzC!c)`r}& zPTISzeD2TKGT$B^TL@8HErXPFSN5~jHyu=4s zzAN|x!WM0mO*`Q~z&{dcF@;-yDOx*iJHuLivd9pXiA3nKA&FsoXqIcpa3=LOHhq+i0ImVyx}2lC+z-ga3AHke%KnO zn7cI3g<9URIUj$-J}tBG>?(d@9NTz)%_j>h2a;Hl{TR0N5&%|M?I-QM@s`y?+IT16 zuZ5xc2pX(>V_)$U zamyN*mh#3e0@h@8i5RqzwWaOj68>R^*H4+?jUEW(xR*1><&pm19~eAto_E8~26)3( zw4V||cj3>5J|Xcl$gYkORlmKnw1F5Xoy&p$(quZhV1kdsJ_Q=(v zaX-WBpAXu$^_x)mkAL7_hnjpWtXR9-KCCqu;~NN-O2|C*X%&Qulb;;%AMFd{KMYLL zc-!`@{gXZz%$RwtwEL|O#~Rc|IQl$VW|OX8H132bk}zgxo+jAs1LN?HZ-*ZjJbG4H z{2}pc#*RoP3hevMm2uhVAF`Ll>!ngWAMo$P=tkwY z)OFkKb;d$3Gih*M+X(<8c5mWM?X~a;HSW>iUJa*c;j$W3YIU5YHt%??J;b}c?XIWC zWBh&Nd{UZO#ZE~(sHnmU`fbXiB)77?{%7f?vHNlU&-O1U@qg{Pi;x7yYWfG6i5(>&Ct{ zi@_QW3Em|82ZyzY8_Q)2h~`y{2pI0z zAf2&Ht}v>kf(i8L@P!DaPYcOH7fLEL(vs0>%@-+od>=ce&x^+Ruf_PL-Ar9cDK#A> zQm&VZyM*N>rLNunM>Ti<00jls#kp?=e#-v<3@uf*s%m~RN7Wp#MFxAT?-E>jk2@+d zyR4@GB%zs3^X5AD?dkhc>T0&upAuJrqDWLvXs5s4wZ zfFjAYK#V9)r>(zZkA^x+EV_rnBjP!c0+;b8#mV%@!CbKnbm;9jlYzW}v*ZDC%uDsQ z-V5+If)I@t;Lq%_;mx3rGsWI0PZnPipn?qAly_74ih8_ly`OF*ZKy}1hT!Uyr5Ss9 zRJEO@&m^C^oxRw!@8@qWhs;;w{N}5FSjN?S&)$o*JKe?F=~~at^t(?}^54WhJn@&0 zZsR`?ekOcG@$KZeYkOTz=T+80Cus)W*8c!gNTXNV7T>em??ysS-vUjiLU=O-YflUZq?WD-E!LCXT%ZBfkXzZUgh5ZnumSK`g@j;1a*xbRQe zZPyqIt88rMm63>2+(dS$3PEy>^tgPktrVl|;`UtEinWwg+LW7D^0DG#c&*lqlZ%~6 zS#vq_UEV7E$@{u=dOo|KHRwOF*T?&vpKPDuUxI^zTb6k|X%fvI47Fd^8cd<7$i>Gu=xpT*=CZHJWdhagXwE%QWr1 z?w!v9SnNes?X4iZ#q3N?a zAP&nNzMF4wk-HMet9`vdky_*BFJ7&n{>fjn_K^~eANG0Ebv>*U-FUCYmzs>k5`K4C zwM|wY03!m$MnP4LNx<-?@NS`Y2tN|OJ8HQhipSy$T?Z;~M$;Cb6p-g}Y^i+-{7h&5?WSKmoFB=p%iN3OoMKC)i~{4DTVi;FJXeEW#6d`ER50DxXgn6BlKj!+hn zipW7O=LsWrI%mUQ3+X#o!~Ov9c||-+Y2n=mOLZeVq*D5A&GdmlU;wupumNRkgR9Hh zwWAf^;-1MZl{$T%&HC(NDbs>ebCi?Srxh1{Hg~A3p6=03+HG@xR{gO*W>^pJzBu@U z#7;B+03!bY!;cc($ad@)N$;&KV$o8RV4{*E*Thd#H(cEvV+6-HrQ(|7sIwB5JQ^{GC5-;5s(FywjUh)stS-W z&IanVDue(_EMuL+YKF+CH|;UuN!b4YWPZWl8N5nZsPlYD@jqSDCfcpIVQe({ zkx=(Vjdt?6AOl{Alh|+C<)$sr+v>KnmSQ@C4XVb9$DEQ==FaBo+A&F`5Cdu2t-@u1 zU$za07$gH6L5AQ!7-i!mjC9H6S$g-SCkZQCRIh$rUow(+>vgwXna=Cetn|Ywk#^E@ znu^=3WSiObOKp4kA^oHE_{e=D{t4*<1>_xj;I>TVBuBE0n1WdUU+iWCzfp^ORiB`bocY{mHnnaX%{;z zzh+;CwtI^OSp0u!lx7(V99Ht%kC$*e`7ATb0$8{H7x(RTc7M=*1o#pS!zhd6MVJh! z+6xPZj1|Y-+^QJ!xkf9t)_x^?C(`6L{{Zlocp;>ARsR4+xm$o_Vya_fXL8c{i!1qG zG)fB*yDsc1bl3E`B1`>0?I~+G8!wkjveC5XLRqhQVvE zjD8NcvV?3ZKG3pjmbOsDh2z{E;0TDwWrzlN`+Yh51LAE(bou;O@gv0Aq~HkjZvsuJ zYE$L5?Tc@RydaTYvgDPwx4W`CRl&MfB%iOo8~((97(O7&9G?zHNj*?$SW zcK&ZRdeo;y#W#kfc9XJLnS0NdqOWy*EVgf_L*qRc#y_;Z$A#qa--{>sJvV~?0JE=~ zNb$y{sd!hw-Vwdkk)yJ{v+(jkElxp%(j||whwls@Rh6{3%0U~C5G+V`h73MehD+iLoKwHx{b?OM$VCW z^SERBQR1K3Ufbb^h@kQ3?F;)se!@Qmd}VK^TS2DkpA>v$p!`|!hlQ;nw1yP6@K3_~ z-7UN`p?!#Lg2oLd%F%3hFk}nL}{8YP7h8h%e*q2MpQdpYtdNvwJ#AvGnbzGMwUooVs0(&3^w!m?}>llrJo1< zJ2aO600sX5VS9fV-de_sZQ{S$cj9KZ@djNe!Xj85ydk4mX&J@ zj;_h8bU#gWui1J%I^Fe~oe#v(M-#6902+K}OYa8wE+tml9qv3;s`zT+cw|+{lG8=J z5vVN?nkgI0@$VaWqxMMnXstiQ&)V<6dbXpvka#!X4}vvc9NrftBWq~&tsdEQoV00= z_?T*%U=Wg@XcDxfesIP6KYrX_v{m$a$Bpm&e=d&FJcq>}9=ugQhP3F~;RK&(xA6Y0 zbE^2lcv+%GX3@MgDmy|I@sqOVsH66I5|-SnUTH-?`*(Z2Eo;)A4h#NWDK1+n zN=oZS8tgg3KD|oB+$M_9qk;Cw_;K#&&h$blslUexR@dZ2s;bhq$cx98q zUk|0Z)pZEjB6g8)e0`^*7|3O3U`B3<{{RI*{ikBOwM2$d^?XDwy#u7J1++Ix;3{_p^(vn-<-tIakoEo~a zX}MYL(UC0I4M`;hc`X(BQu{iz`P7!`Dcegoy_e+Y#NQEq)?c(f>u-*~6#oEhzl`=$ zMhu!iizWDpuW2I;t~{#`5$Y?WSs{E%Be&9oaS|8hSfrJ4JRkcWc>ZNY@VD&A@m~5S z1RITB`W+HB3`s24H`WlrY@v56JX0d6JCv-29=~er&Go7khW`DcISn1XkB4+Pl;Ma& zvfe3vT!u#_n0X+FKQpy=Iz`00ueE2ibY^Bt-xtq*?7*(lH0xbYMS%bTay;n}76p(g zA-bvMikj!C9e2_k%`2w2rOPd?&Gw~aWGp!zUDou1tW#PS6H@CaEwDC2U+&X3T zkB9UN1dF3C-8)aQw4F-x=3KSx+dx;D&Q`aLYy}&tloOLySBhG$U4NB&TTa`J)Tvoo z60^}geeG?sTD0!%X>I0sR9bI?{vE<&k`IO+00KNUzuWAtd_dqRTs?-8vR_?Iw3TF& zdXU&+&I^ho;&+ExgnCu?i#$T$029N01=l0DKQ1v8_fSTxq=Kr!mA0Wf)8-ZQ=82&E zJ<@keqUint@Rw54L!jwerShGw+oBNYwg}QN1gT4jS+{2ntC8E=S|+MZy|wp_HOPkI zKd}4`+I^<%?>m{MvkIF=cg##mh#0uo1bWlNVgCT<++!Bj{MJo4?9xkL$tKmTdG#{- z?($U=yXfNEZASLIll&Un=kbzw%Urxa=syj&7K z+P;?aUY4=S@EE>ioTTEKwwBY~R%v$AZksou;jNt#$q%D$Axtd-w z%_|ZZ*zsrWE%1lJ5zlktuZf-l_-PzVhKEzryhGz(6~qFgJZl!Q9Cj^qseqDNcolzm zM3E!ymO%dihn_U}llwdw>VrwUrBD&IU{A;WJ(fl(krFNnG??5prN z#}u)Bt(#2n=Cua597zFodr1Bz+1%}lZzd$USSOR@^FI(UG}NOCUeZd|m8E9gteie5 zzU!0csrGp{gt?9}Mx{!=%A0A+ov5~#BX(`1-_N?et#8gR75s1bckuCE>*6oPuZ15C zw6OMx4uj!4r}&rgS67LUDrFj+A+<~pF?saV=M$>Kl<+_tmfWq*(d*Y9c^gHe905*-3zI@v??p0WFQ{{X=eKj5D?aM*kS(R>T>JK`<66^`%rWcW>_d_?gG zV%tajT>k(RURY>tJdF!SEQiOM*0P~3uCDFpl*uH&34C<_0E3P{Xulb17uLVCC&3Sf zUjeka4dU2*Ncj1y-TZd=m-dNeDGsxx_&yyv4~N|xx*4BRml5aW zYG?S2!ctVDQ7JpelANuwX*QElzM9IE6g1BcX<@WVqR-_`7)FscVQRcgYX*X-y zQd+e3(f*-)J^uiLSAN@{8T9=_T=>=dUuvHVz7y#18{K0~{gk{jr+fZqzYi?r=L=8c1ZR=glKit8l`F3ZTH*V zbMpp4V<4}r#oBV{bp-63f5e((|3_ui435rF#q!oX?1p}3(O|symdnYobpr6GryL=f z&Q!T|6t8ghDiFvzx^wuBBvg8J!)WfgtRh<$f6SQ{lNC`Dy%Ndf9+bX!Pacf zET}i_Fm0TIADzr35nCd#Gyq^LQKLN3|2Tc6s^RR;25X4#c--EXq0(}|W#QwDX%mp; zAO@4{lqU2+w+JEsnrN0T_(uwi>koo#*=j;YZOZ(*mhRux;>?U*seB2l=bwH5@WWKk zLGKmB)wiUHEZ?Hd2@hNGz35+{PTH!TNplZn?9y~BP)s23tRE%3t#@k*FngRY)lT!^ zMZNH+GM}^9V9~(MGyM3EvuC4+XIc=W)hVbqcVmWwbhLOQ$?@jAG4e(Xb*x=*hD%6j zdE4S!UFx%^Pb++Nbu=fcbu`>YYf;-^Kk|$jpdS0IcTg*RzgMRTkB2~}Llvt6#l)lv zI#+F#CT~~%lh&gxc0aKL$6L*Tg))@4l`&1T%OLhY2^Mp7vTy1jk;;RT`i)}_4%pf; zD3UnCa@oi7gM#e_6x2q7Q9z%_8GkR$1DpEV*uEs;48#js$?Z_u7AHz-?%sp2vo<^W zL+Bm2lj2iZb``;M`|+0Q8W~1FKb`)h&KE%1hE0uh!}JS^MT7|n=MbA(^@q&OPf3I@ zT@HoPPKbrZ&9eu2pQ*X|RdRkl=OfiF@kX@J0njmu$#3sBTpY(P(fJ*-&$J2?&lMMA z1B+PT7>ODk;56h=WGKd6DI-7At=DB~yR_*Pl;%5?EySl=-9*$Qo^GSJ!EKvhG367O ziW`o!(ukOHHP0xBx^amKNYcn9hiuGuggk0Vb`-5;@l$|we3*+~ITNs(T8z6+N$@yK zyH&Vl1o3KFT=uD`M&6d$2K{VsZa1Kw1$72x40o&Eb>(G1St3@lFNq*t+WO|b)q2K` zyHgjnQ#Glnf+GsL(^|B4j%0o{a`JbwG%pX?Zh^8^=a7Z|qxwlx`pg{@B73eiUQrgp zPg%oXW%n+zG+$3N$2ODC_T>B*>Kk#93{id@&?u-wy5N|vB;B-Ddi|Lyk$+*WZMeoZ zWYCVzJ>(&LX+g^y6EZfBl|`e+SLO;iTTsR4O61ol+^K3L=ApLHc7>8123}|!M|^pL zOe_&F_c8D2GxGV{cA`%$_@^dl60}>;G(IwpT9B04SiisA00~AhyA;C8W6mo4XY&IX zT2+6WXh84Skn_4SPCnQ0MrxBbP|bpoXL@7?lD%=ZBC>82<47T~Wr^-~&pob2EX{8n zpJdP>3+Xyb29TFrKw$c=dkAVY^u65_>e!~L+p+l)wiVj`vN4u)H`n%suhA3G6z2yB-x4$UV-F8ZshG=!?fBm@k*x|r*jAKXR zF*`pU*Ju+4(@?CJp4|Colr0bWWbMPMqVE?`bsGPzO6OrTax(Erg?z72=BKxTpkx(y zhf(w9=54&p(P@!dOe*&ywRM5|dA!h9*|>Ly<3s`sw4Hk_-=R9quf8W&;k`u1yQq8; zgLTY$X?4>19~C#4M}C|gl18{~Q;4l=`Le#UQjf#NT7y6$ax`@E>Udx#?%*umzI&cg z=8J6BE3*C149D#6ZxW{48pM<{I~n^Qhkr z3lf07)lH8>zrWlSPzcH5UeaRYv)9u+VgpI1dsX(|FE5YV7by2o`Gmvb#?JZunYZK> z28bc(yiK`^kSN1I9f>0`5I9(Kf}O86nhq}zXU1l)!}GLP^HU#_RVue2OGO`AU&7rW z-PSO%Z7b_I< zxD{NtUC+|t12@#JsTQaC@R{R*el|(APfy?xzc%1u)BdMqMXhJgkF#U~d@pm0JL&WM z^QKw>vt6^gK(Xn+xnT1;4Zck!!QVlfE@j)>1+$*CiQJv%m94bMU!*~edL3`H zvoA+{vkf;Q)(tp1XMWavcCGz4m+TD=PwU-e5w!?mzf_wQ(VDMcv#>f|hgO&;fJ-46 zlbIP;ij*+i&cLYz@s{4;0gy{EbJwLTIin3-n0nDSlJrLnME%WJt`Z2dj$zk4g32pi zk^e0>DeBv(bhm|8Hz&nzt4IzgzNn-8_reHW$k7L2nSIfC=?o8 zG0SLc@x<2@8R-(LYEz97db?s+N-3gU@yMk@knQCAAoH8J#n~sFA)I&r$}7x;=bb+% z$1l=xz61?gb*nW@9C7B{dgWMKPmYlV&eOx2*E$r6n#SxWkLe85qRRoYl0KmvWb@Z8 z6Xi;#XVP$nRvwl;Kv%52=VH9#BD5`(6CT?Z;2wd-Ad^d7LmAH9+qKaMghUZjXC6qP(Cw+|-WlZ#AYf zEJzdbW#w_j(=u+2M>rlg-x3q+7JQR->k_4;G@m)Ys3cmk5DmPfINVftJ?ZUVG|*$7cdx1O~8C>U^Qu#&Jaj}+&?3wsFS)s z1t|v?yvW<&n2cvy%1+$V3DR0N+%B4(+X#?|a2ARU^oO8bQs8Rf+edWj#-~j!E(}v* zok)UsP7N$pMp=|_Vl^pLMez`|4aeBt7*&$>%E&^Zh2ksZBUQLuU~?jw+GCC=(}@Rr zstNh^InU2-Bvs)E+glY|sD)c?2K2M=dF?ROs0P4fv;=@>=3I09y=*Acv|GUSotWcE z4{L+c&cY2dIdkIg8Y~C4Ak6(cE=p5lk8S{ovioj#E7U$T!aTrQMRad>tCf`af*cF; zF49>8%492y%HlgUDshzM*%$Md<0cjw9D^xjC74xSy6ohK26V}e zm1s>4KT|XcqX5eiUpMaw<(3!((;9C~3bea@WeBH~RxPAc4!HHdg7nUu;igA=vO9+m z$yY7pk398->k6z<(`WX&1PYu5Z+8{`?#74@{D@6rq4wAAuD61vl^YCqnt+m0Eyt-= znYUp_WU{WkB;O;=0mRxv1ai!wG#k`TwTUtnw8!yyTsNGlmGB~qV` z;(i;!q~N&0ef>Z(gxE4v%8;N+(z_7BbfV7hGwEWRm_VsxWk(by%_a;s2aL!*u&W|_ zJD1ID;MAM~)3IXH)A-nE`xF}K=j(IlIu{fx&>M#6OL{^O=Q0EN5gLPzOs*iqI?SH9 zW-E-;#P<4D(1II6s`K=UEoR9Ir~MrwH!Jcio)Ezt?s?9zKULPCnSX@p%NX3&6sdQY zWn+HPoYLYsbhRbC<{HoQ>w2__F4Z(uG4>gLX>rLrG3q~V4-L+5{UaS%-SM@HxV)Y! zR((x4;t)TeBW1+jRo#AuOHQ`@Y{GY^e0L>6_u%ak1N{)?qG|%_^oniwCg;5x0))~K zqb06;%hjRa``L2FRjY|I9x+C)g3LQ32^d+@P9|Q5m+P-8#eTb$n=4H@u7yQfZhUO!HI|pkXbw&J}W;SP|pVP)wN;!B|^v3N6Z@88dLfWw; z%_#TVEQKFi_m>=Pxr&XiO1bMe0fzgobjjN!wg)`aWk9Ik9C{`3jf?q#bnReWkFp2- zd}>Z+M-+<#2LGbVSf60*hp)EsI^4%rphw@Y6vv|dDwJ8ZO={yo0s7m!&HqseHCx6W zH(lg>5ZYYc$?@bUe%IX|utkGo@2lZqOMGzN%{Szk)XnxZpm00ujIZ@!dGX#_yQem% zg!|h)0ez+KGKMHd(AgCwlQU862gr$(14ie zoPPDJV3%9S$AB%1AmDi?&GC`&7g@PP0ln`t zA7v~=&sraRu(*Z~Hm5vIX(4TuC^5>P*vMQ1)>liH5~=Uz2Q^!RnbTW)gk8e&RqWs&M3Nk_F43a#iQ~4>$(C zda?*9Vf}tm*Y09Y*v<01&H32p7k6c8m!|g0^|;&` z!ALK2_Umb;uq#$6mpmqC{2Kd-6peJ@H&xhGcx=1=<0lBIg2yxn*yCH*Bly0E<^*IO zyIml4E>0*Zb$ZRY`~LIPLAMko- zxqFwJ0hXKYn7_xt3`_=Ok;JV~FVmFEI}9X$w!_eE1BOVh_@Dl#R%uWa+k-SV0Y=Sj z3)O}1s#OvFV%?OR!cW$^v%*$F@k=sfKDgV-K=g6F%?J^ziz}&fcxLfCAn5|7>c}3= z%3CG5bvhkQtM##w@eL zR{o*O_5-#L-H~i7q}O}Ed)X^e=EvT8Hnp3IrH^oV0aJd#mqAz$S%2R)qbg7rn;&5m zAM9JL)8tp#4x$`tU#L3#5{(1q_5{)m$rbIwn?BsB1m)<`suOMI6H_w|H5<|$6e{AtPnzw+xJYRVDZVCtBW zUKK_?UkjHH>KFE?8ye)bzC%C*;#l6h+04Hj!r)-6ef=so84-`Sp zA$@D9dS^Z%{blp}L8`X^NnVw$OY^s1YTkyXe-e}9%A+a+#{aze?&E;*}gn_aDEp7iB!#MBEfb=m5bsCRg6qo3F4@ME0ES1%pi;ur+)pBT3*bFx@WQW z;nFteEYgzpn<#|4QQW6MAa+mFn@;t88>lED>Fe zsyrb5Qa>GAk?BP}8y!WJ3z=Pv);%_zr@u<3u@?gh(`mcg+yv|~4&*YNaTGeOb!?ns z+`tlwyVdsQQ>Q{VbQyFbnmXdjBvL9SdaOiR#gTc zf7qLQ-C5Tw>#5|g%MydBDMU%g!5R{q^ImX3s!4ii}@o5)mO8=d9%oo-76_Gz~yp?ffNUV7}IuM$c z$!J|b^*TxOCeuK@FtlegW6I+7lUf4G&TC=dq!iVpz%M-_L@I4QSpb#6_1PjP|gM=Pnn zo7leV^RDaZu91y{uN14RoFh`UKbhO95@fr z4+x~0eQtpX`Is{mcU!+mex{o&Qvr z?&(!vBtrnYQZZ(Yun@xWF8ZW)=h9tKB|##tc;aWhn!BhcmR+-N*a_jj3B<1DIUk^w za;V7OZ5)xAX!vG#Hbd=5R|*E+N2B~;Bm2>~lJ`Qy=%F?S%G)IchrJrb$netJ&D9nH z250<;T}>tMsGnDdJC!)eB&yA9Sxo`umu||zIA;U!)Wy7+w3B~tCAa644CREtS@_UlYym8oh z#?1y?Ob~y`Co-BIThzMX-^jes(U94lxR`aV-Ksl^vKjb~isGNx;6Qx}l6D#ovd<%* z4x6FWMh>|(j@SkE2JYGftt>;QHd{m3_t2Mk2^OWnxoX&=nV2@z{Q)i0#a3#qkzSXJGS!Kt`A@neS4B3}H$$vbUX z!p$=!Ud8E8Y9agU_8MYSrmt;rp`I7|h+XKKXiUTp3++kI_=*EikhZET-j>bYMWr=|VDrh*_#OSbP&A@b+@d!OQB=rSY=nq2jmK{n~~t z8dD6C?5y&kcRGt~Z2UE4&aTlwO8=vpnqS<>DRj+oAUiK}I+HHLbCadp_m*GbvoJ?C zR*JzQ^RGxhS|q)}MeWeC<}BFFv=uc61k0H8MgO4+0{0F8^1 znUdI%nHc5R=)1uy0>{2D3j)HFJ6k?F?D6*@G?rg1ms0ea*lq>ot=@}_IbkGqBhdc4 z|EkwRg3lg+VBOC*CNVhnUGCJxl%(1U5!TDJJ~)^1&7YnwC_skrkwf>Y<}aCmsg)M) zJ~U94?h*x;j5zrpuI6Xw{4n(T$)sPXePhg-LB@`vq{^5*`AGp~5b8!o>5|Nf7Y5Bp zfUJn7?v6nUr3S1I091r7QiFk@%wb-w#pz|b;m=T6&L+!bcSsqALy-nN{h4wM5F7A# z{m)rH`yqC@f5!we6taY{ov4mU%RF(KWp-HJ%_FJa6KR-9U9q|Y@$O1l%X+Gnpz&9x_F*&y$Qu=TaI zNM&_{^k;Z*rmGP6riOGi_8ex9gtem?KuYYI zkDd$|*uD6I;)tRom^5tLPRIX@b@(+vk9$Xb3L^M!xD)t6B-bB$S1{PEM zoW+C9sxwP6La&B`fiOAT(zd-m>!To>#d=B`EYE|gy_-3(#V_VoHo`WMcD3M60ISB> z&N*e_WRFDZ?qcIOu9Ko?y343~Bm4 zLynoW4mSdE28Zmvs>2y9vX)`N{K3{%Mlka#Pa}80-|d5=%dC7WqU#B2j%mb^@|xOl zTe}?u@slI=u32I^oU&#AL3tF5e0W*^#zRWDRk}cttge6`5kAFwsi?`aufIo|*|hv= zhnIG_$@)9T8^Je!!TZ}O0Vx9}!&PK*fbm_Ul-d8iJ4dTf(Kq7>P<>Gm+7{epZ@&>+UN|eM+GVl%1ms1$%>SqFJ&zX{V!UFj7`f*eWRF$U3?w~?!(`gCZ&JP`w+IE&Z(ghrjBjSzY4o>q9H>6rw1X?pQ!2K;@a;@kQy zt0;p#zcgpr{02yEaY1eALyNzYUYaA?2d?i=LS#LetY1zlBz~%4X$EQ@V3qmXYvqrn zdsCF!L}X&M^DM6uZX7_8)F~`m)939^-wGx~=vzI_*!u+88P^vP(*!)~lY&^euHU_QRY1F}jbfkW70C+|Ae%0a0-A8=d^niU^}3{Z#jZTf=`m-Ov8g|`IKuj%H2fadOhYhF8RM?OdV^S`r)<{J&&@=1=A9zb0hbkr^uAD zY^H_@(BVQ>VgQ_Lr1wc~wMLd?Td_g8HN8q$CNKlAPy>6Tw%;iuJtI&S&y~#l(IFUN zJ*=QEFqgXb^b8!En$ti4`eX#m+RhR~8hBp)uwa*2j>vK?UA0=08hwfnSzKTk2v z31!1`8&*Tw7tgvin(S`V>u<&o-C zfwEX_OR6y(w%_K&Kf__I=8BCp{n>LQD(sRpD4oZB`ZvTV}Afjei zXk229KnddoPc?%Lx_@a5T2b?O7Zws62jY5UO8~qyYismy{l^ z9xYez-HN`HhqJsmc65pXL$3C%_G`o_deRsiTS&e$n9=sVeW*P$M@RZHFspV4d&Afy zW-X52rO*X0ipWI!oCboXL51Ee+-<)V;2WeuW0~T%yr`OtG|i<{)21w$jh&2G!xeXV zh*;hl2&k-fe5yz%y=<9qtPNS#Qw~y**l~EW6Iv@&_Ult!jGD7WT$^B+PxQSNMe0gl zXho;&YNk-0H{g%-vtUjmQlH>PiHruOpq{WT@wz-T@L}UV^y`=N*tbHXhgu1jf}KmD z^knZB6ax9I7uu$nBlc5NnG4Vb7wiNR7Lr?pMD%P2d*R7nS{)L)sSJ#H;9 z-qpMG0(zh0rB!)z-^lM-q4Z+-%|WZ4+xL*;h1Dtg4f`Gbjo{RJyw=kiMQ z<0)wY0yT1Ljt$uyDQu7W#8)W{TsXnz<=JSUEMgM7er-_ zDKRm(X?O~M5>VSJd2>de=*i&C|7HF)b)9G$Jh{O2)qB3c&m&h(fmVCq4Hj5H0C{{@ zO5k(tFS1{^R^=B=YqI@*`C@$wN9J9J27FCz?VIlwgjKbrCquDeL3J&@K9^qBy%NcV zjV^|bp3L%(Z8~g%e!e@1yE&&Fh8N%O)A`%Jw22o@eeDBz`fL{Bu(Ncuk(P!WB9hap z-qXobLb!jnns%Kg6~KOI#r05)=6LME7c%S(KR~{n8iVVq63E2d%TJCiNt=CBayR1Y z16vFJ1bN8co^scm$W!Yo?P|D|;fIcdm3NU>dwwpNdQdp1Dlhul?}`5G2{F|=m9!j> zI|*>%k#q%8h7rj&R`ZrxS1g@ZS1oGJTpg1KifeDyHAri&q%PAQHTIX*`66+duj=+? z{yIr#Vzel7jkdgsOQ6Nt7yLg6)91Y36?Na><3g_+HtZTt3iae2YOzOF(~yA8z$wL} z6$=iTKg;*0V|8XV3d+#X*@E({*$N-b_sWAtO4qv2YweCX`ubS`FX=MGJfETTS!>MQ z+h%X_Z-{-FO8X*OV>nEjd>;9X2YRLF<(mrmfU2@U`CA9qx|=|OMaFVTrmzpXX(z#e zqtZGVnoJwx$L==J*?tGF=l<9*H<@Qn*lsaEEs#A6?3l5!Z6|(m9mVD#*L;@=wfzUE!5@zBR&!K< z=19l=K59p1PZideFDgNgd^zu@p;&-ug9phugNB6Gf?f|!Zygy|h5ozkivH@Ws`_&q z9F?RkB5S-%Y#`@9?yz~lP;LfyNU|n8Zs@FCCsoys& zd%TJeT5RvQQrL{G6cZyF1gJd~z?XcrSpVeOY1iX@t%q7|-L%n=!Tze`HUFxanVo0Q zM$QReMLqA=96rY|1=IZj!K9Zb<|c*NFLl=+8i)@eUVaR-L?*srEbZo(mdTFzW&y?# zS&&s^{+A8u*;@YMzSLW?S|ERchyr96#HsI(){`$U>Ic7fvFJ2+3P4tS3VEFc`{`uH z1fDWYMxJylc6#UwCzyR6Jhqdt8TqCIrH*FQ`0``s{B`-A+dHyw zzTadXNY*DWplFd7+n@|9>n#9}rRl2$s=kU*7d-lYsxzl>X++A3c>^jtQ;~nT7-BzUs!|Sf?=%XWBTyq+7-OoZ$4R zXFmp-B0kazrbsADX(h5<$we;2#M1&mq1%L*1Y5n$#Qu)HE|T`{jc%%je|f|m346I* zdi)~3ZP6q%(87T)J>7K5If)%~XL!H(Ena*;t;EXp%Ju+)Y^AIz$8LG}2YLI~BS;@t z^g~gbWySM!)`6*mhma|^1l%eFy)$Qm&5YkF^bKwK<7wWvKB&y$*EE)bYlWDr^!3f2 zPc6XARqq~7SjuuL#v)@~#9#%WIsaT0zYqP78yoKRWNN2b0$)Cli__e5bFpKVdBJZ< z#AHew6t2{t+CTkWHT0ExcXhDQoKMu{(FqVagWd6wVRgjouu69 z`+XtT>xf0S;{omv34YbblAg*{Q8dv!I<#&_&~r|-+j4((#CG{dI_|E_5~8JBEur-R z+~LDU7~dM`JVopJ`*=yDDVi_cq+F`z-Pjn$X*@HS32MrmN0?>asqpSBMU2I)g?o+5 zGY8fX^k!{Ejv(j)3`c`sBE^jNIfUnOl%$$)D;ltnAddu#nMHMQ82>|j*)GQjhHsyG zY4-gF;X_4Vx62$jSmTnxDy(}s5xK~vO-;h3uuI2FrP!W7QRX#QrWU;Yp?vAjeFt1U z-B}h#?zD|03p8+4wC%DH^_7fVd2(TxDXEl87U%Xeqs3wNDb}=mi+hQY;=(D~&Bl4s zGp)2O#Cu&d8%$!)?4FZCJ8f(U@WYB|m20C)Fai6m!mf~Ofx*08Bj2-jJ(n1$20f6t zC%53)8;WcQ*PtH|fV2Q|N_XE3ky2%r8gQ=IHux7)YHagoSg736ims0)ZElAV`hUAD zPRwjX(#v>!zm)g!aKRLq<5NRdI(qgmZd14k5{%+&c4%!{Q=8cvLS2Xa()JE7PaGy4}cF^ORUG;O$9`SdkI;vyX4U;PNi zEZ=)o%BjN`+`c6FshNhH=tS&p-@ONN<;Y%j2qPY%T;n2dg&Y3_x~xeHtl!a6s_+@= zL#(XUhp!B?!PUF6ufb~e(pC$vNf>jh={+0OZ;WQ&SH)^i{!rODrQcc1?fOjYQ@i^NIiJmMBV@o_*oz zB?$V%$BLmq9~)JdcIjQLLffDT?d=M)AAtoFkpdKal900DEn{XCQs`OemZA9#(zxu; zISsV;X3m$=f!fmzm@9nvm)8;RSmCm#IxX27-rvenizJoZRRGmUMen?GDHnXc&EGB_ zGy~|VO1dHZX@cVQQkFEfQMsIfR}tBO|1x|E^%y1Wlb7`Li7aPoRbQtKXkmV$)ne-2 zun#7E+0Isa>*0UL%A&AnPsZ!8%w@yQ6(JA)Fu)Z@MA$t%%+7Anqj*!0Tx>NV$y8%4o$} zQ-T;;^M`qZBLnw#wH_@Xc)%)%X$*>?B-;;FXzbrb;bN$ko^8 z=F<2a-+hIG98u~$9<*CBb8>xuXrkR+B~{-%7aoR5-~QdJE`Ccx^KGH`Y*p|6RmhjN z4sHlkwg=YV$j2reFHR8e`LA{GMQ*Tf7f7L7=2aP*#Y1{|6zle6qq>JV$x+9SkR7eM@oohX+9em!UMhQrb6-@px%d{Cv8ZB4C2a7rkzq`7AqtKIvowbcD0>#I$Q z-wI9uQ}IMU*odTzN>p{Rqw8t|wcK~BUG9r}L2=dHn$xv-dG&VZ@^5X;d!{hXq>X#8 z@8JTrEJH@J0oADfJ>GT*4~fb&6R4-Im6p&(L-nApMqG#1^i3QiUjLr9T}^IFgPC15 zIQ!v;x27y&pZgzQf4A&pe7EYVwBd)schR;Q1Lk%nQmSdN<@&|6c~!^p8ax>5CuGaj z#qoS5yv>;o-_IGTU}j`&_NVw!soM^^)W~4DXnG%;h63~3ZF9Un@)@5?ApL3D4t!M9 zseDu&sA`ugp`t*(`PY397J11J=M~NGk%?7?=~0FMh(*+*q&1)aM`a}*%@<2G?QN{J zJpU;J*&C$1$DrBZ@%x_JDJ@Zuz=c5bY!K!&gGfOsXV~}I+NP&LG;FLQit8W4Q7(u5 zbRgYKffW9yqvPWaf)wFK8y!u%b-f}Ybdli>_?5flIVWkpa|7m&kVApdwn-so573!1 z?T?h+wnYaEQc7z$FdP;8)PI zrSA_>>LhfB!wq)a=)6}-{O>@J*bi-5Pfqc0clo3e&G2&uvL*Y03JE#9h6X*t zY0vv|Qxqc|LRmv(&Q(3K#R$6A3?YP223f<(O=Gugt~#%v$xL9_aZj~93T!BuW|$zw zw15mk03|EeRrpC0_2G+6f$DqwJ!m9A`dCpc|LIc(S7{n-7rn7Y;#*qkI8vZ1khbh1 zo>@$AplEdUOs=M$sR^0UjOWpmK+4VrT9wN+=wtNlsvAKo>!njJnE9$Wtv9r069JHh zioVMAIi69>)epDtdx{)A76-Z+w`2SYALsw1cEMqhtsucack-~yQ?AF5~^$!7qXEu9q_N7$N&Sb?gy z)8x_@aRQ-j^506`S0Ym7;&j*q%FNVcxjZ8T;n1924r#cF4vgVu6qF}G`Rg%q9r08# zo5&6qzP>GxB)0$&&KJ<8$}wsFNY&1^^Ii1YzEqYh%sI_BnKf?Tdyw5{ki*Lg$^^dm zhnbH%8MZB22d!=le0-bVWij*ZLO7#Oh0Bx+G9kkX4cXbsK68WUy&loMkc7AF90GU# zHYlc{+Hq!QFFouYehe!#OL)yMEPNFd@;GEa?577hT0onqvGss5M)K$h08CUU6g`MA zkwk@Z6nQaFrsa?GIK%Dd$qZWKH_1W3@_}3M#j1t}ObGhdkB5G-v2}AjHhk>gtHSMy zekBdhc_SFEQR-T|_b(zXTar=JnN23F-~a|Q|3 zO%<;Y7{`=A3q_|&12Csge*GCecj$ZhgUo99DyZ1ALO%laly}qF!|TOxU&jaf)x|{F z;Ke3gF9$qXV*z8+BkYG-zP$ydrt-YM9tf3rrL|X*^(~C;v1riV<(+ep54cRy>IfSx z`(Xtq*f^5i!{UWfC0o0@*`uPO{6&xaB^k073FY-29%xsYl#?nMqdi-ZA*l~dzs-77t<&{=eYTV7^$Z8_Q0X=2kfSaNLLB!8ka5;v} zR%iq}4Ks~0+%s}VhN#kYf+aoHB8;X%!iw$J@V_a0nHlq!OIFEMJ} z&%hS8^M0NfmHQ2?ajj|Mx2l`RdWr8W)lxVkXGMlMF72y370!ep?mW1imrFo*>>&;8 zeRI;JU&c_D2c=*X;uLwV`E$qA#z<}V-RoyPb5->eX>=r4DE)hWHZ)TreFNnlUyPlJyIRV(JST@F| zC&{)IIbBsNiM9P!8&I>?gxwy>DYDQ@7K&H`@N108`~y0qojK)vUmw^QMrlf^wa1S< zrb-YtB1@7oP3l=Q5?k$P*J0m~HYRP&@_U-u+@vc>>%7oFZEeS%yHnpw8T}p;MJMcH zfwP_l!H%N(LxWa6>tk6H$Bp8rTVPrLWJdLB4De0TobqQRygre zvFuT^D5>J(rPMSij2+8+bDsR9Bkr1e-@L_o<@)CZk(ZBAao>y0q;}eu$(^LGj%&*d z5xg8BEV^vi@zprobv4_-+e+Ae{Rz2lG+g`LXFoqyz*4f+s2CSk3O& zoV%!xby>5L8}K@wVc>^O?08gbPMd|(ZC|C7}jlzS5oDMUJ+4e>FOp3e=Y*nXY6 zv$uw|a5V#Y7bUkn;)OFNRaLb9#g6I=A@Y`;Q*$lJJa z*!OU4@d;%8@t{_GRegi1^2Up{XYbrzJn9u9oP4!j?^RY^nLe%r2ey<6H`O#q!{5sS z>kdZk9Od=DSFg;W*PAO0>?zyBzsl}&^ZM$P!nKu(XvlZtzr+DmT1mi4toucq_Zz1l zId5)bDAZVy=$p(RQFkVFNkcUZ=X{||m+a&$wA0I9=ccaS3)_~VE9oC2W=K)VeG9m$ zF^LsJ_U6~CG6o!%1eLqVc5N*+Ts#8R@hQ$xDi6sf`V$yuDY5TbLX~vr!4oZy3NB=~ z2ct~mqxx$1-HsJ<*XguCC9ibyy-)Pc~C-d10fCUp0#rS#GPp2|6XWYA1yDC;+3Wa%=e*CQujetO2pZD z@btI}E1A&s_%yNY(YNSS1vehny@=FbbxwRvpCg?_JFaj(xz>88^JF=bhi4ox?bf@; zs^+2cLSV$MBdRFgiq+pn|4Lie{RL)2zlCaY@fjDIFl{*-AVWk)(4 zx+T?X&psah60<5|H(R9UV9()hdNfGMpD@H*$&y2thbgUp%w1#*C!*WNlW+tX_DL0;7f#D}IcanplzF0*+jdf8XX$;FTS?Pmp+#0D-leeBDM!GP|%U*i1es z73ev+%GUd!l=p{bNz?Od{1wwCp4I!K*&f&oKX3+P6QzW!#pV@9G22wJpa22_sV(U} z-X>fO+~3>YNS0mwNZPcNJZtrIhAcs;W6_GWLnj%^gB^;Fv#U2if2X2FSHi00R$97v zS=TH5ZMkv38lSPh!M|5BT^h8^W%wk?dfZj<)}2|}L0bagzT_XaqLhD6B8cbSXt=hF z@{@L=Yidm-FAY5AR+y`WlV!n=3>W+0IUj(<+ii)~P zW&lRlLY>XB<~D(@JaOdiC4*>LI{T%B!sTIhFpfuj5*wR)d|?XkiH2Mb)3Oj9Q=^%) z!mQM*hV>$8EZt=`pAFmt3}?wKxjIq;^{j9?Z2)@0r%7VdFmjza?QZbbSP^yvXQ|h5 zgoCD|lYh{#@*i^mhi1OUE{>PpP!DGBnEQRILm*ke(kIqGFTwB0Kgj))eLZox{eiYe zZ)4y+kd7xoRh|oOr*4{FV4Pm2rK)ZPIU#Psq?tU(;m_ z@2|blz5JvMku9a~6%N4(efz$`ZYlq$STbPH4O5$06Wq)c!yntxhP^{5G*(J>+qnat zG17Z6m$_m--tAMP+dYUR2Do*tg5d7kt2HsV+^?~{MZhsDbzi9;s#qDw@Tv4fnwtao zC75k_DPcVoxIyku@~zTUmXR; zQ-f0wdZobhrfuKSmiYC9nW3^u;>-;!E+g2=Lc+||9iT2y@`DBB4J{VGLHF&+?Hx)w zOSAIdrrc^;UOxt&*d}ESKDCX9EV)8tVpZ?C{Y74~63m}~)whm@ z47SxqOAIfU*7)}_`7b-y00y(iwOjUe>F4k>{kcy`kYMF8vjZw=xtb#UIrE+Vj_-4) zVk!wBZwq2{C^vK+!}!*Yx6K2^%lq~EkZi_K_?9`nSuk%p2K z9eIiD(JhNzV*X3-h^pi`Za%fm+$-CA5{qYa1jFp~u9d%!()qv*u9|lAIF79)2XvU+1a@)@G*54 zCaQQF>nwV4%U1_rmbd+TmZ7K1(drCfKKq!})#Z1#P@t;iRxkXe4q|z(w63>nre;(9 zakPASqxFv%SDqbdH}Hd!L>P)^qpj zRbU@VbCDVAxf*uLNr;Dixhljr5iA1F6|vBCmhk+B6@9_)GaoEIe{WD~Vyy0>xwE~OSo)?r@K6NyU{-~E zuBjFZCXz2n0w`&yp%h zpz3V4Xf!<(=W8*NnX!|YXw_kA`|P+H>!G(|uyFDSEKR{DYHHbYrdS9ZB@$7WI-kEE znZQ>ZrY67^x|y(u{Nqpy@0ZOvXo3cI)93h$1t+%bA9hJxuJ6!wz@&ja4Dk+c_VmEB z*%|#cRqv$zF1Y&{ zK~}p+3;%p~*5yi0>Q63u1qF&CfD3y=35eg)`uysBiw;4d9ttlt>)?S7$fgs4 zeoHpRUaS__Q-qaLWg2`nzQDNnQ=qr?Pp{AI0r+c8up(!;oKeS4;p}unP~t%z#jOLv z&{8ALBWkI{Jg`zDt4NRFu5)xguD0iQudR3T125=4c#aH5b=z(S_a*yf-1A}fn8`9$ zEJfltA6^;)zPB%%eh1IQ*kChKby(BkQ>xmZw0&pxeaoM}|}1T@_mow%b=PsUJO)-)9hR6_d9dse_=PX~8c9yC&TzFQy6e%?$^E@^ZArvaPEiE{YkOW|XFYCLx*;vW<;bK@dFGmXHp zv9nbl&3D(qGXN(;)cQz~(vSkl(HMoLx#)IDz`J<;?j_pNf`}Xw7eK31Kz@Odxk7gm zd7w3{+*yRjf+cX-RuUkIjs0Yl)*V2>tWP#+iY}VA?j5#fdO^}Z-kyys#9+hYHY`MV zI;BFu(kl-_O*|C+d{~NXBFo`=iT2UX{FBD&K~}aB;U4Tg7A~oW<34R-vBHVUcRZPu zm3c0N&p=k^j>Q%~hM;4{#rAf>wFJ5^bpC3GI_DZs7OxeN$kSe!RB8jj`>ig8=F$km z=UEA)r%osS+n>KEVya$A3C5sVv{#5wUD?>Pa&irwYKeV4 zG~=7(AYrgW;fH6|=P$qh{$fMZ%GhjiGRkF5Ql9+w=Sl&ZaE6NG?SSo67HoL=*LZ=U zp*>&Kmy#sIz)GHgpz;z}5xlx-@s>X^XCgR-jw(`1GDq2mm#v+9s!(&KD70ba6i|OX zpT!w|nn|mLv=6JnOc&DKa?NEtE|SFkT)cawJ17b3Gc!@pl3jgq76htpF+&^&BNgs0 z*-$CG&}g5(JkeHJV8WX`_mbl@oX^ni`PQcLz5_Fj7x*{-E4uL__!`yv&;m;xtvm?E z?rha7R7T2YBh;IR2{_#r16zfEa z;*ZaE>IOfbiMVY}lLsY82_=Wp{z?~L9&3sL&5gSs_s4BfoMh`6rqW(}CFIlZoG;CJ zoSQS{Ve;(V7Nl1o)!RP;pH8^Ia(4oboC_!CJ41WSJ#R!%k_AMnS#4o8;qr|;24miv*Y zKVQq3F(Ie3Z^>%F7V)sEd%%nUS&yx}DJoCmtqxg-f{-Mu^RP^|cd=8U@!NXfMCEYhVXu(IEM|Nt_ERJG&@hLQN5{>JA*a<@ ztGF}`W>fYGGs}be?o(V^?sPN`Za4A(&3W`v;!U6736*h889L7&e6m;ZNzrpI=Je@Y zJR7Y|GG3dsEMGP|$S^!(Sv5ZLmgsQWYrN_QWQ7qH<$#kUvvj@+O%s=cu^XXCJhG6nEQGW>VK>J}YN>SANf z+6ISfJ($~QaZy-`aTo94(1DNcFlw(?kQd@a3pTmdZjFC(DE%V9Yl_s_clfy)4JRi} z74<%X6D#gY{$WJ+h1u{3?M*DyjpO*N^jPYL;D{%07PSLE-%62$Yej}%z`~A9G?i=>oNlA_)=swPBfy45u^yivy{XD_{mId2y zI&!d|Kiei?&AD79j0;ugtgDCOb0+n)kM<2%3jLumwa)vopA}oNn@7reCZM7%pNqFP z_1q&#h<#u7Lb zd+t9{nx0IXyXuo;Q75PUdh(UdX_q)p3eOF958yLhVyUYF{d)_CsE%`~h?}2Y!xvkp zwOThwzl~V26=`U}*5(al+SW$ipZQ>dI$kxCPXoMY;)R~k%BYWH6`v3r=MXzfVm)aq z$4zghb-u}5`uuAxg6n7Uc^HStKY5)u!%{m0SM<^o!RN--az=ZEZ$Aa=72wc?yFR#U z>|zm-bkZ}LETzh)Y@NMwsIR|+ON3v=8?uNer=IiYdYsqw@pvEWU>Vw+?`OTs-m5SV zGg_M>;IBE|?Sb?rAI)s_FjsGv+e*S8q`;Py%|R~%$4IMsCws!?bQ+8ex4aD6AR^2{ z98rf2*fxZXl%%g_Rfe!1O4X8ITuDYPH236Ab}3kPwwWn%B>A~3I?iNMBq)(FY1QEg zvz`FSr6jQw#-1OCJPVdbM|(*+^$?>+w7-GgJvx_^9rADh8KgvT#cxgB$MW7gdGQR_ zn-pSp)}rA|>-z{7OfvV!qa0X)OrQz$`EdrZB~ParumvMr41x^3r& z!JjHzqLRpa+1;F_z6s>Vg}bH|CF-`C^tS}0ehf=(l$8bt%#`VgnFJp$D0bfzb+qQz z_}!cuWxK9XMNJD&m_Pewu%}nU&}Eh4X4Dav3l9K(PV0KK>s%11PRsK3gz>+Xywj=^ z6!7(?jnhC-x-0S2#YbG^e4_eL9;oT!#+gBMXi~t$4I*G`4U=^JlK}rcI?uCL1K=W7 z9DecuL3M@AJO-dk@ZU_ng*vlQbb>&6?)C)2SJTlyFB87v1{g zMRlgzu=kj(KUbj3oMl1?W1u$L1F=3NbZ+wRwR6>u-20()K3D*3<)1Wrc4621apyT6 znn4Jq4xfTt)J_j=(P_wMjpCNQ5|!eIJ?EtOj7cCcKV_#&Z)*ZiB!Q(WRj_QKUc@KX zFuq7j6Vkdre~%~8IKULKq=97Hi_m@BY3H-m!rM75lgelC&Xcb4RMugj6dnC;n(>?1 zKSZUWrs1g>hj6u-63rQ$>s>e)drM`4QXOB#_5sAX|i9N ziy3$%GI(toA3894Ik|nWbfP~6NqpohJi{d)pvr$=uAyc6HmGIYC{8Q3NF##9k%`~B z3?StW3^a?P+RxGH7g{llq-&amheo${FzXTvMGu#fBg4iKSZbyf=;z`oqDsZ)p>gg% zEEh&JoBaUP62W=Ag~Z#Y6SsD}hWiX)+U&kgUew#^a)s;HL;l|vpYQ7-t3IcE2z&N{ zCz|yNP>bfbIIayT{BtjZC_4^APXBzZJpj{^=_PP5$66FM^ZBsg*=_f9@ybm4W^eAY z+)0cV=JK&U#yi4i4rcgE^)>(CQoaj<2PyH|@LT04;hUD?HA%_x%J|Y*_p~{!6(H|< zXVI15vx^*6%Kcu09XgU=+MnZV2FMo`g&t*;ds_NM$Ge3q7F{U-NL7CHI{ia#uY;35 zzG(jP^-f51S;`ak*~izu30%e$gguU}(vEH?j-Ao*6FfgIO+`oxyJ#_>PfVC1G|6{D zRX*%aAdwU#T$ro6Z80c_<*W1do0^Hwte65dM?KH`D%n{+f8UfnTM(Gw{OGJ|1I@b; zQ7VYRKaCt$-MxkAQGTjFeB?x&MMOJ7OU|%;Q!IHBGnFgfV5=$*q{XIoW8Nmqcg5V+ zSHTiO;7o43+mx|QbwWY0tD{X@5usap5KLUZQop@!MWsVBbNXZqxw$ZTZ#CGXoT68t zrO7d0-VQu3;T;2+pu9~yXEyG_Nc-||H@Q_{=3*65l{=K%b$_CVq)ZMfJ#BKEO*Bt@ zic~`n7!m5dE2>7HL4zUm7?#EpMLxH&gRQ*q@ zrtfDknzIND@**afV`0T5PQg)|@hD!JJ6(Y=@J;Od`c~p{HDUGbHLb-{L4o&f4ZP~u zZ-7j35o^vE{-^y(ZV0VF<`yQF0@-{hj1RrgL`230`cx0fyKL|}z`I`Sr*O=??pm~x zVC#H#KKp(L^Kj>YLE_U6GdNQ9w%8|}6gt~BB1i`m!XKYBDHFam7Est?nD^4f$1fEJ z=M1wE8u8cr+7CSPShG*^xesU=HlUj3tr4w-9fm=zjb_Oq@E)AK6vKgS4=UP#QLF7k z5BHU84C$(D--os&NV~X+5zXv#`~cx$qze4>P!xzs&~SUsUNK^$Wj~CSYou_*ZU-r6 zDK(t{l4jT(h5OVkLVovdCMeViM)EH@xuE=zX9-z!5~%#a+C+Kb*@Ae3v~LM{l#8-& z9IQ>xpfvoi6w-BzXxHD|D0@|)&y0xkI3EiC!}>h^LbL=20~#0(p&Fu`?ezZMRCR~X zAf(Y2&lGR`Wn>~PU3uI2k@o)0Je!2{N$MkSGRQAuI8O-47!^43F==+B;>hWl&kJC# z2DHr;_v^3+VrB4yHt&RQX<=MeYO26&FaNAtnrL-(ZtFp(T=PgUi6u0h=v!U0sotK~ z;X46TLW}32m`?yC1d!kC!-yBMiAloaWU?TszWj$}MT%<*EVSDgdgPpyXM;o;fmMP8 z2OoKmDpg`XnZuas+EQ2r2#hFTm=n7~`$%xM`DZuen@RqF8+~2K#y!hJa-fb=*xPaw z8OX!St)R5{Q3enNX)w82CGn5r+F=V)Rm54pmJMPmdy|yd^zALnlC|wE?$cVd__y#q8PCH&cy!g#b z!;8*5=C;yV{qxBveY1j@K*(n4I#EyLaUKQ29%GMt`r>JV9OtHzFVVmSpPOH2QO{DB zQK2TC^9v{gyD`hwyDDB%=>^PnQM4`$wrQNjJYZ-Vsiiv(khCTSOQR)J=1*;%IxTx= zF4uU6d{69kR{DiWkZee?1H>RVB4&5SRCpWn;Hol(62`|n3W&yClNyQrY% zkgSBl;rH$hQ|}|3kk#c|hObT{!*jTmhb=x1TG9C#$s!FN_HAK1T=0h+ijDP4*p9wc zcAV?0kLu+kB$1(*@Zyy4g5T6B{9kZ5gt4Xfggm=zjR<9jmLYm((}7ft?_mqnSi*ka z10oWkUBS3!=vdxc&2?q6GtanM8*bS?ln3+qMoztMJuyOJ`!4sFwDvQ8OECspDW|Hi zCWHtMwC(|!RH90D)F|Fjrfs)Hj9SMIG?#`(O{HX{6EEAv4i?bS+`TC$lxIQuz-px zwhzWX&S)JF(9PWpIcPHI>?XTahxs09+C!$v13exJ9c#iwLm@}vy{oTytCQfy=>Fkf zik;49Eg$x5Tt}u8N9Rk{!cdV&gW)_;IYE8&H8MnF0xX`f4PzKEMqJHP9z${S6&GbS zcX$mGq_F(3418zmVrGloNrz?fS9rH|_}z+qwSV@!NViCrIWcy~C+kw8;WCn9Lmgi^L-*JhA z(Svpq6ru+{pjC@BpJ0DPeW$W$#l+}qGr#!#hb6_)Hs74R)b`b}=8AKirl4sd5L|Ws z7Sj#a`0e~jaeaojG0BE+g79Q$b0g~ZcY;hlf$xA(BAenv$tx4eoXPk;=(B`HF64P` zgNDj)eJGCoC0z<%ZDgEZ)uI+RI|aAC;k9G;jee|QN3UR7Z2_8-8o5Ax+nC13@LC{X zbgoQ03w1>OF34X)d{pQF$rE{PCOmxaJbdsB(P@+R zR?Ki``*~Ybt-XsEGuu-qmF=l11D!$aLcdIZoHo(-SHtdViE3zmB)O--f@d!&I#?Vl zs;29$4R5GxDe3b*A8|iwfkU-Nt~I5EBh`o8rqX0vBvlN1;IAJmzCM85MP;d{B&Y43 z=2VWyK+U)~gD`Pw;l#Sq-SpGN#cMsImc+Hi+sk|Han2}+pRyTv>_K!^eI3rRa&_qU ze&c1}=btyy;aQf!pBS~&JHr@u8$YxV*txo5J+YBo15WRRFsx#YmvC zM~2(cdYmUc=#!Um9#&a|G7_C=9mw)lt#aXjyO4o7Uz1blBeFjgs56}qwS|TL8TQ#m zTOiu8i$k6}?*AM<$_*G?;!`pGLhPf_Re|>eYf814%ckrbfP&k&g|(#a>8j7C$kn?>J~1)op%Yzl5NU(e`4Tg z?UUxHXBAX6=;}=eq$Y(<(#^@1N`$=8ccLvi)J=z}k1o4#vwP=upK1!U?6<&*$3|*_pgnoOuAC$h=I^2y! zeVVDa)mwGG>SjfmB1>xw1Oqio;Qi|SRFU^`+d*DibZ2nrK5$~N!buD!>Bm0>I z1au-X2Vt-MblKjmyg6fS4<~iKKYVv1D-kK&E+&bnxnWk`a{u?=vi> z@Q~PBi~+a*L>RPO_tqbW`e>TkIy|6iKz@$%IG|vIrRA)dbMV3cxco_WS+ZyKcby?B zSuP!FC@;0`A~dkJ2<~(MaX9FNpI)ySPfodCm&o+=+@~#OKva6i*0lZSkA+276F!RKUhG zCo~;Nt5&Roo6m~%Ek|l7FjgVX6J*a~u^gtBnL(4_@&cXtg1+4b7acO;?lFEEv_(L? zBdo79WMX@EAMiN5{=9931$eIr`=xk;&;Zyw@8`C!7n8pd_xt#7Zs3Fgaucv_G^47y zIO^}91cpq~mY{4F*3-L-Ah$jL$|T^b3M-o@?}h_fJn6#7|qr?AP{2Ycg7m~S`7D*2?1sS;a@ zU~2E^i|UwBsib5lkQc+c3O1U#Ua-*0Gn_v92wLvEgf1D_2HQfG13Nwkq%C$L4v+s{ z?<5YLSh!A!9zg)OpH%rm*GGaUPIz7k`0;3e43`chYv*Y^?4`LH=98TFqSx==XLD~s zRDPZDKK@rGOGnD;65HEk=M6{GZW-q1cQ$G^cq=9J)n724reUS;Nxu7m&c6eGCvg^df~6Jom4h`4B+S6NYCH1(ok=L z8oKw4c3x~~8^Jn{4kA_2lJ|X^{0=*EZ1eWW=RfeD{^E;vP!bT|C0~iz@pv}cjlqP= z#E125!sP$#TITm>9o79jW4m=4cI|6t*WV(HORXi(7-DQryJM6XMx_@dsD;Auv#Ifz zt$rIbZtcF|WKGO@T?*$sQLLyFL<(PukbQ~8Tj#`zNKsAX49CH9Wqa|Xg;ydPM&LeI z!fP&lCs_p?>B5 zAaHiXL9^&P;V0B1l0R1^2>&FU8xd9o)bynrEIVzfJH0qvbrld4o##_ySClk;87`+i z>V7ZtP?Y8ofK&j+tFICslB+zq$#A7y6x#oqHn5M&@ceasDH?zby@_0r=l9KQaJ8a> z$5v;$w0F1GN@9_~<^y}hDSMmVkQt$bgF$kB0a|N}W`dB*_rjB6&;&RfbXV(BwRkq| z;~CWc*Wpdz>_7Oy4&k+beD@F6Co&OM;bfAMhl=aP$YkQII}n#Z4`UNivpS~wv!?sG zTgUK0I&`cxk;7~j-s z0uxamkX4}@aPMM!O9)JW8`A?-Ol}%A-m#k{Wp{mcGHyCMRn^yg4DG4CP7WD6sfD)O zLRSApfHc|8DqFj2F>NN7_g5yjH!}IA7Wdi+uUM-2t{_CskP%csRwV;k&NHS|?O`Kh z8}`&n&1reFZZHKEg;up0gWhW)j?b$qi~TtxWR+^)k1*Xs;fgF(bfLxZ;omL2<1pd$ zhxB_daAXUTG0b!OnIRzYx$1eI`gxX|!e>rgY}eJe9hMq}pZT%rOt9WzZ4$WPL?>Sp zZcvQUvsJcwMkb|E16F6k)1S|F@~zA=Sky(Up+T(1Ji#ctF_J`toK_;77=U}D@eUiwxXiL5`W~Q%f}o-mJnN}X zVk28OL0bvA8uN}Ib|cL~^Lj7ldL%l!{4LC~`iyD=jX*o>r8 zObu(d(45n3%Fay0LJ~^d(;8QgRC~KO2O6z_;G$hb9 z>3NQsq$l4?2SF4@7+;zV?SUB^hD*v#JDp>WhI+}p075bE+kw@yeZ;d|ZaL;^r&Sjs zA|fzM)+tJX-sy#Q1xAHF{go-zF=oYh{_Io$!{l4GW&sKaM7dWVk!JJO4LYb!cU z?YH$(Bd$kGYNIbhWvk*2Da~KH(YP@yI@y+*u9@y`s+CfwEeO4WmUdSuVwQgQ-_Nce zY4%i}yZLIDtuan4^KM2BD+F#jb${NlF6@b^ zfbFU8;G)_4Ein&H10SE@(R0tuoeYg)WMiG&%lCq+6r4+%-5*uw6(Ec+SOg6dv2N#~!#9oK#$c^Ws znI24w)y)dHklW*GTf(FjH0jp7IrBn67BCbv3_S!t*4t-E>Q~g_AxVdOiOiROp-_wz zVt1J@$+c^JONjtL<8njYvS=5l&7ZV}BGyvFz&$9Nvc->JDhw7*B~StZdfU{DcDcj7 z$6Jtfp(u8>2-HN6?C`s6i&vCS=|caWDv*NxwZDqOxCN-VUBGs9O6N@%=GraWZM=Ua zyiMUS`a?OnHMu{d0;6U065teV9Np2C<&tOFflV30UCvp##rHcCbB{(#+5?REU4q+0 zf0}}PP{|Kf!CZ$I#};Vi$LDBD%OKAwi8^(a`oK}=yYW|9GT?y`Dcfb5oFI&U0?qLe zoumXK{S&zjTmP;G)usrZv!KQ3i3nBz%=jJVN4^0hrygpNUho@(J!if#IKXI zOzZvd)v_?co)DxGD&wJ$0UXR7=!lVT6gb;FQ>sPB4#7{;IM$*@oeETav)JPtDXho_ zoGB?3zj;2*7^;nOhsMNZtGDdVfvULLH9qzluIjaPO`L|~&t0#nH66FJ(x~WatY2Kq zr7VLdb{C@=yR$L|rvHeb976&535?VVHVWY;;nCV6{R&tti}G&*HOQIas2%;LgdioY z4&|hDkFAJS3kec7h@)&T^Z)lBL;Bu4(rdEs_xCPSZEK$pY#V>jH9;3`FT$Rum92k> z%QH>pj4DOS?Y?L+&|3)PEK|ZF;Ul6Q+YM&>%-HxJRxGSU-E-rKF;KZf-0b7%AG(Cvo1G3d1}eiGNZ}|kwt~gE{hghSom-X0P{B3q{0H0CI)l;siO0@p?gU-JrQ447CgN{aGWb}MNedb}W8v2E`ORJ2QJIR(lTZ?^UtcF$kUh+X}WQ9VBJ z6;KmwM2vF#K}t}^fvTnV3h0!IUyW#=&DN;=6SnDxvK`z8gjZN~R6}fJ2l74KwtK>b z=4Dgm`wZ%jJ*wmR)^qYW=vKW5G34|x#-T=BjsI*%3*i!RwGl0SY#;G?7eY(xLOLSB zA|9aqO4MPp=_`YNz~lXsXzzRF^3ESL6V(|!9HNFC$Pu+I&zZeg! zgf$Y;sM%jwl*0^v7s1*SKnWh2SD*I2W6M$RosO!HtJFf+QT{bRnW~_g4FQwyF!l$|7OSF63s+&jdNH z^`WPC`su0$Ufy}nl5J8Mb9h!%w^gWxiL)p(W%9p^{Vnog-Gu@~y-~kMM%nM1;!RH# zWat{!qn(Y(aO=U*-2j1PXT4pX8e)jtNzMsTi^k22%1LtuWYCDe@~5(VtCLLCG93Qc z`gh|@a?eC>%|yb`^^+QQ>T0r4cJ7sIKu@E-q6nQQp8F$j)O^fLVkt?&pIn* zabJY$>0rHR5$;o6X5(wDc3kz|hIBGzcIQQ(0C2z>@LyK1h0MXU-iy4)tj^L)e=d2* zTGdf&#W5qI>+(J=E={= zK(|of`g%u9>zv{DQ19N&GVR1#>vcc|xnWw_m!>_aB>%kx{a|Ao zS@){mxCl?g_g^j3PJZR)-wTaW+0&{UN9i09RpFlvG{ioSWWO|InBKl_XIfnBP`3zx zto)VSv^LRAc%7>(Qw-gQ8oITdJ9U3tTr_*8a3Y0lSx1VFpi>Y710ugDCA*}ydWnF( z=_qx2oPwC!wX?u$AE$%oG+AKb!$S%l%=!!Fnuvp%1%-yhF!1;K@ENHzp+Q?9--Xy; zmAcKeYGO1$la(6SwC03wa48K#YfFo^PNe@X^(8@2RIjI6JzT&)d~y1udC|Swf-z@; z;tk+OTD05dBt|_od>g+zl`_}@@9vFo+I{n^t*0enn}G3>cFX7fr2^_2T~>DBgX(=I zD|W|vPrs1MT8B=)^Yrc2Mi@okzpt+E9``jufzcsVhZq(Y>%8O1z?#WtdC}gKJHJnf zQ(dk0>FXgYv}H$+Rf{K-1C8^I2GrO@fzly6<}_u*^dO6#MM(;bSmHC#a4b8 zX7+($$ZI5P(qW7(376Ee240qYRsmI2F5eVzH@2x_n>yFTm+wbC1z-C%_AkwS09qWM z(C-c9!_6r%Ux`Q{!Eb@;IaJ(3$qW6@Y+1k8p46JkaWSc~C9|!#t(@?%;(z3Uz5gR(TS$8^FkfYcNwtFA+DCW?H zFdyqnpt*?PK*-B`;fG{TKvNqiHe@;DXG<_S(yq~Y7KhlscSxJe!Z%}EdKGx{2E^Ba z7ZoT7@nEGraLh9#=bRX)9iqNz+p^XZwV8Ey>T@4YM;V$PtlzFLYJ1jRQ9DXJ-E#%d zXl_@{#i)ObO*K7*LQ`|}n$ylc!>X?>7QOTD1Vj4dF>#2duGHH=Qiw~4sSmp(Ki(z7rcDZ!uW`*)H+$LXjp5dFp=?4!1lGaFa$ zb7ww7{89kHoMvwpCFbO)mSc|Bxi?_Dm%(>nC{F?XwW0&V>WGttz>efakp>sMjj9ht zRlYHII$fQK!W4>P6XVWIUPNq8?QJ$0W&z85S420gS=0>pc@*)uJ>JW~V<_)`Ek7nP z&!(Z)d*A>D7i2LQE^jP*v}V6be;UL1LvvLS`o zR`FOce{*;I$Y5{utZzb)@F54~jCk{w4}$-py)*pB1jaRbPZZ-Gj z=n5p!_Imv*aS6j70rU{^B@i9Et-xy3T-QssY;w5HJnww$bKCf?EFKq8{qe8 z#KqMvMtBsbXvEQu!PvM^9C_pJlkrH|6fa7~{h(nzI#H+d%ZjNcgsDT# zGuAiFT=+GSUG{Vr;T#u$HubxI%J?2FkEdRIk^R`#$_=#pH21zUkN<;@tce%MUvBPz z9uymJ-MrY5GyL^4M@zPj-qg%P7S}hS(|D5;jz*~OHgTvAStdPhD0>8u;@j8zuZD2= zyK50xNwpofRm=Ny<-vfWaLa^e$uT3lqxdaJYDp997i=ppI&XqlRTH;LV~MFG7T2Ya zw*8ZPP2N7zoL`#600m-AIyY``-+hyu%)dry;-80@Nf^Hm#m%??eS5AoB5=0i1qT>N zA+9I|INUq?p>~^qGyf#c9K#^%a0)SM?K#GLL{gTKTo%%TsA8t*xilgG-G+UDakISo!p|7&Ly>AFdS{T4 zLe_)6cR4Zs>fhPvN!HXn2!7BJ@=cb*x+h)jM6^l`zGQ-wFDNM-v~77DZGO)7IA0Ie(QM&~2ofGxUV#V%l40v|{8%OTyvK^b7Ei2zSgfb?uA- zF(#aEfxM0k*%C!;eCv|J)a869IOdPPH|V|2j?YLP@KHWwu-*vKZu2R?#>???v+DYT zTgEV1{_U#q#xP=Ow>SL`j0?4&vj z$Hw{1CRCX79L|QOZHPEw;$Ifw%b=v0F5WFo9ysvK>-#--=_{{=X4=G7%&y4`v0rd% ze*WR_=@^(41O1#p79bivBzPHpx-H|yJ3uF{UK$WN5E5nhdkyaU5@q#}>3r{nq`Z|9 zbP~K$=|M+tKLNYQ2QLR~F+K;sIrzZ07QA>ZJzNU|>-I0Qeni~AM&$}rNyu=-A|$ph z)BV?WvwBC&ObBW@TaeR(6`;OgB8>6M$pkQ-Pw0!Mlkj*>!ZC{u%EP29P6AQMBfR4U z0!41(xg|cgwL|%F(k%&ras|Gql`ZZ5H6>6wX7QkJ<7t;f048DIf7|_--woZ-UV3-1 z&W+Bl1nX$q)U6!MI-tOK%gy+f00KTSddZqPm}L9;dGT!N?u{pg{=#)30U25EshGMJ z8$a(FZYq!(MpQ3}9=_8YErsg1>$zzic&MwUt!O46GQR409SBI^)dZo=9?CBNSI?|| z7s%dnjuc2irl4XMC)eg1MoN4`PyuLfCWOyG=cL`bI^PBeje&p$d3KKf34hF)1H;p* zDP^A^ar%3nFRds(q=nd9U{v)x{WIAVG)n!$(H8u}zCgSy${=I?<6lz9xZl0U$X{GvCkn&P}9 z@}Khvc!tW3I+9;n^psRsWUeV!GtrCBQznKiZzilSj?FXk>1j&dm%4Cp6{__wb(MvR zeLgMjnYn*cf#&U-6ji}*I*=8=Fj;AQk)p=j-Qb)3bf~1#^r3QDwq1V7Gig$`p)4X7 zW|PiKV(`OBgG+g^BUM=K9N<4wXgu_+S%ey{Z-cECBlA*P`IQWb|DO*Zz{7;Po$3NE zZj+<#8*uk#>b3O)Gx^rlbyE#01F10+42lH(C1I-GWs?%Sf*q2Br!)r@9$>IXpsr`NlnNvzB( zllC@Lgf@Q)bx$lBRR< zxV7|jJYx2)4Neg7lPagNY@_-M4Cl7(#XA!c=_#fHfa#IH=e@e@fJBHb2B{jMd>%&n z=0nlMr&*~;_d8U0F-;S_-RZvJY(XfTgxs102FnROm6BC_n%Nk08xWgqY}XCm3Oo6z z%&fNaWXmcr`l?Im2S;?p;X0LsNqyEb|7q6oKT2s~i*Y)mm+XU$Cc>&51u`Qvc?2w> z)b??_D%IHzsFWA6{qigg0FL%{%(^n|@U_Q8#vA^TIH#_2l#a0}+*yRZYjAb7ki3E| zVH&$S=lg^;EM3J_7n=J)Ov|@4yGXA@ytuopE2n0z(c9#7x_;DML-K>;0T=ryfQ-6? zt%xVJqEi{D8X#WN+?=*p2p^Dj2VWcdKg+c(F=1;Zhp$7B8Y#z(StlnpR4S0zwa=~Zw*S~4?I+nKMZQB;TXgI+vEp6YGon2tZmM#2F zv{h>C6Bk3y@wkn+5e;Xybv-G*-VvWBZ7`K)ac5V|`y6$;d^-?G5!dmrQafwb?%Vq1 zuBz86zk|r`_9o> ztZ&PcdQQpal0ET;mnaMtl?|RNF;thguV&gUs;*`C?Of|L>uJT*>)~yNz#ed9zdO5D zi3v}2`^UX+C3q5()07okK_89gnp!)**q!zFurIn? zaWloNZ-yelk8HCx3zs)e6i+LCp|?UqHD;tMCQE&>-(5-&L-Tra3nQ8Qxj%(XSxr~` zeBzvH*5^gh9ol(=T z83V_O#}?muajp_yuYy+KCgbd#egNJkNegaH&Aa*1VHQr}VpbU`!BCCYS1#cejm?;R zQ%!+9fW0l1Cd)XBjZg=RT7!y&R;6+#K`D&(VsGav|9^j&w0+VB-LUSacdoJB^Wq0| zEW7cOahLt&2IF+`d%3-QJI@6Q!oyWx#~7^L7>Q5ajvhBHlynA(i)~M_W7-rXJd)fW zy$W-zRiH7=sd^p&{p@B~H!R@K)+1#g5#su*V-e-z_+Li$b$i9XEx&&VZY1qUv2glf z*?lT_722y9OZ3LhT8N8K=gHUat~+Tr?zC9MCvp-(W1-@azp}-dei4NC;Rtm9(M}I0>`b4g67~$Wu_C=o)jA5PHOqQSr3l zrX(0KD>FWYuPys(zi;iLb!Mq+1*)E&+wf)z=_GluzQH9aelZh1H8V48E)%JLS5RP` z{6#yxI1T=;UAF3}tm}`s(~5#vn>X)QzrEKZSc87CNyp(N$*Y$8$`-aKJsSc(vCHcO zK^(hIf?xr3@^fnr$U9-p_0uJd+soOdIm5KUczv?-B-LQ07b>c(y{vz&muTH$>g;sz znLU1!l$EoFHF=K6p1UnIOId!fm%Esw8TS8#Oy50Wa$SWw&{z=$J?iKae^J4g9B{?^ zB$JX58V(#W2to5K1+C|4JZSl8XRe7?pLpiN8&2>3oi*nTjB~S+x3)RE!?3jk7Lu`Q zOmp@)Ga@C$DVy>q@434#+rx1=jvL#~irf<#Nhx}QX-+vjEF{*coWI)_KOCw38_f->&=r+nu}UJZGWAw)4>SaQLrgp?I%$DJGKllI6AUldu0nZ_RRXiS`Wk*7J&$@qQTDb+F0~<-e zA9R)Ma5ray6!%gy!Ke?1^pM{?F{vl!3WR4MAK?W_=m0zd-11I+3FlBrYVNG`ds^S6 z`ZelzOEiL3Yh4rN`Cr$2>1WjP%U~FR97iOvRwJWeedCN}v&I1g0g;jk>TRtxSpZn0 zVy9nsr0I$Nsuc&OO0WYQ0(j^#z{nn$BDCYTWB^8ysOUie zU<~otB~XAj!>&mSE0O0xR&)9q@YwL5rURIjDuX!&mm6Fp>Lk``r7!UyC zBa%SL#z7;gVs`D|j&KR7?1}TxfS~U}KrQm}KmazOljrA&DTBJRWho>gJ`)?WT_UB%e*!rLEsz zGx|RtFZNla_ou4=0Jl~D0IfeG?{9)()8UVW0pPqh^8CfP^L2eemuSub!zjQ50AmZt zuWaPJpk(~Xj{GW&jky>H{h`SDgJ1z(P4IdkzYRPhrv!gyD;>QFlJ0o`0EN#Cpo|WC zf!EjoK4haLg>9ss3XlLNsmLdcgTcb?=D#4~N6UyjWlvJLn zt=ex@%9`HYZ1nVcY2Z!SUf0^o(M9gQ{g$0KIr%jBZlv772)0?GF_jxoJIc%kapkOv zu{(uPzo9M|5%U(W;D*ybX}^QsFM&vgUxk0PZ--|9pbGciBmJ1~^!zSVtA)|EhC6bs ztOMm@g=_0pSjp5OjDX78d15yZ4ayL}1^{y!jldQdWBfw{oz!$iyVkrptDT$tJr{}K za@;#6y#|mGBgB|=GU>==4H?{HjkkQIo6?45QkwT=G~)*q%PC&+T#s#5iQlu@_9~V( zvYj;HnC)SI|%A&%bTSGTmgveNZNmJ7?T z>r2EoJK@v(q9M6$K%_(>v$pG5%fwz)Xyi#i81_yw}SR#R%X8=5+y4FF z?L2-qd9^B4<0mL#n^k1=vXX_IsnuM|-cIT&+BdoJd}EklsYeE=_Rnx9vXja13EgMAf zJombklHb~0{hL>?x6|OXxij6s`i`M?mp>;!lRlTB-rC=3*ESZf4EEYCk9Bt){+m6; z-M!`PX?<&^MR=Dn!>C1LcLt#?z175t4y0hWgj{{2w6plDxGu_9U6SXv7Z`d#Fn9=8^HZ2C*U+MUx~ZV!2LWp!*L zu(_5@T?%ZYU;RX*3^iC{K&_qxO>q-vVP^IGW;HlqVRn)X_ATG&r$ zmv&bRY|(v{EpZ|vJQok7xM1-PaH}cNbkd7)gey~%YAq@M03M_FRJrb?@5-Bf@uun5 zruisUP0QVyo0Zbm-t1CJ(sFG@YOn5|Q7^+UiIZu1KBHyfe+y{ZZ;E^+tXf*z>b^br zU19b{(sj*FHI_Sj{bV#+os4S)N+F6{D^Y(0vs{#gr>w6I_zT89DZIb1zVM%g^gFFD z!sAZ8)Ng(v_)AUHZ#6we`%!CKSG=(Co#Y2rx}QX}FzOLn$7X)fYRN1M6l-(xpuc#mEw%O&CVUA z{+^c_i)(g%8j8+qtxsMzQ|a1!UQJ~swAxs-vbuv)(cycTqKEC1MQ5c8*Sd}bOQ?*n zg!dr|@T9rr8@0_B2+g~xD6Vhb*{2(5o4%KQ9pUiO=4w>bHPX&-n^IP3OPRL*O)GrN z-yM88@xOum6{=i#m%^SX@b$Kx;f*HWTe(jbcwfYtb*`&_;)_id>F(}y4Rck!n%?m> z>$w`{?%PcpZHly!!D$_=J{ZtTaQ1R(*VAgtX=-%Fy3>4TZyW?9o_sOLlR+cK9URQy zs77?ej>@qx_3svVhfdUdGvX^_B5BiGLEu;{Ur)EbxPo0K+sB?3cw11mn#w7!4Z+lu z8DH$OO%l2dvbD5t<{FNl;Jd5)+pS-~9ux6XPpMqUE@i&f{3uMwfnMT7zSFIwFAS;X z$hPd!p@o{?dI=nQ*?ipT%5_{EqgF}lB^J3UE2Sw^mG0e=QnT4^aOQYv!n|Q>iF+ud z?4pyrG;Y?Lcd~r#+hm$Dkvw4;GFxjtA%&G5KQ+8h;gyf%4u#bV&nr%WC6r4fQLH{( zerqghzGlR__r#r7%8KJ!@x9AHpJ|By0Bd+nB$H#@JDU>*p&XZKZo)wDT`Wa*tI4=| zRTKDMLb)$Ko$yD(uL&_V#G}Q&co5ygayPv5>7cB01PrrG==TCJ1IXBgYfYkfP9Hz* ze+2v}vcH%mj^oEO>AQwyaL~+_$YP)Ov8aHmEZ$>p;Q@nQX-=iA+Iz-MqfO~%x#_M| zZi{QLo;2{&QMz+mUskVcYPl)PRQ&a`^iPvk_=gCZ*ZW7tiz;uqdsfxFA#)9twD#U) zQ^_*xt7h#vcam5fM(ARWBC#xaZYxpow~H;BE0_3@ttZNpOMN}pgdzUUTbV6mia)T! z;yc||*xXMd#9}&4v~ht1qEQj^2TC+w5ATXSBld3iZF2Uqt3zOXL#}HVT6svwHx7{L z=`@y&<{7@o__vl-jf5)X6N@ZQoJTPW=#)*<+8EN!hCIIXs|(Spge z?MnPxDhZ<0MdWisB3vY2Xt*~HPOGCURHI2~thu1mZN)`9(@k?)`s(*dop?M3aXBgA zXNhu)PBVlnJ4vP0MPFyi;_j_>_Gc4u@rT5%95L!&7&V^}+nd;<{>_iY8fDGmA}L0_ zc%CbVhT7`rhnB^lNeVBT_V?hd@g>iWb$ggveNV+NtZ2w&mg>qwWu{rjnO5TZJDdF* zR@N>dnidx{Vi-8Y>)?wv?e$JWMPQjWDDRr1H&mp|_&l~nC_PSR<+tr|xsr+h`y zJXd*bW#PSRNV}VCi(zTueJ=aM`hwi1XNyj4OvkHT-rmUs69~?qq}k2_B(LT?DGk^> zbs|Y`1;q1sM%HsJ#l6+vh~V+bS)o}bxe*DxH6`?GE6)ltrq*dzIiz@F4rBX2b5xhqu@;Qon@aIhdaEZ6T^-X~9#wVm0`W`& z^Tju2Gj8(QJbDI^W9LdFmMKyq(Mb)|QKj4=CW)uGk=_VHM##}kp9hU^Br>#Gt;ClS zyg(x}Pa{BOW|1IkjRHe%T})*f-|XM)+6YQK@KJj-`LD zO{nULbD-+$sOvh0xqSp0HMfPKxzkM7H}>$uB)XO2X|{F^rrTQxrjQ1i5a9nF&>#V?JuYl#`} zym@bLxtn@HX=;rkZD%Ea&{7xk3q++vzI@BK2%`aaH21o&F->V{rrZc2wSr$cb}hk+ z%Z$r**>;((5gW|6MS|JTglJhph4pKM>9(Yo;^q|75}T6Zv6 zU)#g5yok>&yhxC&QAR|$cYjms)u9#s#_A@O(y2*GHs!l&YRzwVeLFpmDPZuja)j~j zl;WO~p;^Xpjg`}<8Oz>J-MyOG+SWW0Ul(6IkhGr>{KiDM1=iBeG*xA0kIM&3x==T( zG+4=E5r|-c2RS~oE~MAtd}n!f&E-zJG}{@;TUZDMgj!T>AIi-eTnsAi3%UjYYuLZx zB-X8xD8;pycD5Gk_UmtLIh9~Bq=z=G8%oh4xm9(KJ0yh`U}UWy5By2j^hqyWbi}v~ zb8PJg_VvZF6I;V1a@^qQCR`%Pswn0(WPr& zsS(2AA1q^ys+^VNohq&|(K~6i^yzf2+2NyBzBcy|>0UUvv=)RNLi#-qPPmREAZV2Y zw|XfsM1V^ZqRktZnKLWQV`Z%;jP(_s+8b?l*lG(S!EbvWlW%W4?X)otMx8r-qDbyc zEoUIQn&n*_s>>>q>00-Vd{wXbgTy+vsbQ#Tej4!=osrW}Yxj45VY|_6tt{fXdtE;F zM2l_4qYB(CX3!Nfq)^^@Xi4?2hj4z;UN`u7bu9}_(|_Swd^5Myv{@#P#2yRNUgqb; zqDA{1--mVWa@WQ_HoIvxR)Wq=J4)BCbW2;bHqzKxTFEnKJY}O9G^w`X%%wN(-Njiu zTStF+rLNZ4mhS&*H6DU(xg( zHrnD-bPVmNrJ-=K+fLUlYO;Fmzl%ODX`cwZRi-Rc* zP+UiIWn?X7)rHod1k%ks+WwQQ-&k5(qgdZHy5DK(s5#>z)MAuh!td`%TJc=X!q<1Z z-Pvz$sje!(icD6WXjzJlwQVliV9KO2W>!hr7_ZM7m0jtx z3fp(>_>;sQF}v07rSVne-PO^VQh7Ch4cpvWn^qC5ZmjxswC`?4Jegj34kj!leaVhA z-RXs85cqb(QFA^W*G!K~iGqx=iAvtx`7CnGk)#eC0G8M}%0k4qd2*{?XgN16mWjq! zR<+Yk&uus1jB0Hu%FgXwy_$i36f9Ot4H_HCBOBgG;_)$(WQ_(LjBvPBM3BfNUnnl; zVKT8`E1i?~u}wedEt$7)WeTAo`RZ+RnFgC(nM3`mtCj^HZiYL#&u$tHv18GJP(+-mv_hlm8x z2%?gE{{RzP4>@E8OM5Hr16i{wSyV?flGYIN3FK zv)v@x(QI+W@ zZ7tQ-jOto={P#& z#a^u0pfS;cU=?y-HW-dyTeSJ!gs zR`<&Gnp_h}sp;A@Q%0LD?KNL2dz-0aP-FXb#K|n#1=J!(9dh$eb8jn4Yj$V0ndEzo zI(ClU-uU1v+RZaXYkO;`OoB-a>acmy%e%}m1&%!`VmWC!Mr)ZaYd?ES$EELXuij1B z*z)S&Y0XJJT70*YgnjgoAd>wt|G*+73&w;#2 z9sQ-mN{~I5#D52y31jhXjm-A)M}4n&O>VV46&@R@yfrPl7Cy%&nXBpVZJ>CYPWXG` z8$DKe?ewn`_-n;_U&K#_xd)s1+KTN+gRSmq%4NzZr;*r?!G#FO#c9ab@-Cr%US)6{sMe<{h7Q& z{j21BNAPcoJ|pTM5&Q%3Tf;KzTD``Rt7+Fao+3?u;g^kkDQymkb!%^DapErw-rVa~ z(CP4aX}mRUb>c584V_|Vid3r6oTQ`KeUz*ZSnOQ3~xPKe`1k*L;nf@QcC&I50g3`Z)^^IYCMd1sQ zOQHV3)ox*y@(5lxVQw$(HF)M8QrX@R)7;m~TK@or{8!-n#?z%IO*>w3mG@2i?kZ7zc_(K6CXdX!iwilB`9Nh@ zxko{SSs1BbFL8{R@ty^5iu8~>9PSdorJ-7uIcgn*Hy$07*kc4sr zGUFjW^YL%MJ3EJYygf9_aUu(dE#Z!5hE#m7pJ*hF-bnYw=DG>sTWLXwb|t*BH_p1( zg}hne$r>r*Sz}$wxVZrv8N)2BLX;%{K3FjWv?_pK9xg8~#8P~TK2(!(OPVcSDcxP$ zPM`3_(9EgbTS;z|z233X>RR31Uia5q-(N}a=f%(3gZ3)E_(!SuLs#(!!7WeX7sKTE zgKzNjRsPNK55vzHXj+c7tyyTg{;T0VZu3{u?QA?_rpKvBv0Yhcn#F~@ZFi^1XxfgS ze{uHLfd2q&PuQ#WftOC3COEYN{Vc(>#O|UEWWq#iPcTHTg;7%el30g}xBe?vAH;_Bf0=bZ7ifMQyBcqbTJysWCupDk5-$mOx;+N&MhxmK z@1wNTE;QDc%YBgQaTu7h%5P>%OPL42zXCoxd}sZeyi(Kr8}Y5j!(CG4zSZInhQ2ms z)&3KB;uCKT#1Or{tZr>0lU38?WQywftThXJXN1^zuFhMCF}QI1P4q2ZgW3(}|(MoA&_ z-dKEE45b$ zPFJaCG$$LmS<9~XZiTTQRt*G->kwckUjX;Y>@ ziEnhmyH$#*3>w*q3^JsG2G(NC>dY1`X2Kz|%6s^fkDVaC(B|VRFkrj9mNUs91pwe2 zW9G-ivV3guB+P%}-~2VxN`;Sg?7GeN8A%29=>i5$uZXFoYC%8ZBnEnkc`Dn^0g zeKSN*!GszYhpeumfUb73%YCJ4GeE1jh}o_I0HcK@3}rmVoT>9dGLv?^V-%g0wpAPx zd->?K=n=rwjk)I->a}k1SLJ%Rx|i3rt!p>i>Hh!}cn{&Xh{K(F4-T2ihBDq-{{Uy) zhi{#;cc9zbhmk-(ylaw$kD2B=fNRCIFWKhK=0{Hec#a!aB+K@DFBRKfAV|p}e#t$& zS5cgB8LlOGK{?BiYt7{GH^+N)X-A5DMQ{sl-Djle50Xhz-@Vf!V23VLEM$huWD~u4 zYp;mE7NM8RyYaV(EWsf}dY6Xun~QcLH&j9PYZiQ!W>s$_AXX=Gm0i9LBQV4{-B6q^ zxnIE_cJa06&21g5lU-f5JsLP#NiJ&9YBqeS)M?+9wyE+o_v;-y-)~60(tap>KS>4W zi9RX#P9z*(+NH;cv{=;$UHi}>h7+H<>bpy+QsHt9KjL@ADA&!>e`rlM^|DY!t=U-V zmq-TqfiY_Oe6iyN!6I-FfrnCweecZ_g5Yx)HKdArU`U?PR)}E^F6V%6F{Xt z;wzSqAO#Ey4T*jrUR=Z^@fU^s1LIYYeDc1PErzW!xMd{WX_7{)${U56H9NKh-Gx~B zzPpR5Wgcp2S-VQDJ3Sx5q@woH^!)F!tHWWUmE0um_l+676n2t~r2bD$G~FJjb@3DS zgs=rQUm8BJBvz6e-78A)Nw@OkS5Mwt!=z1RC_9w5l+d|isI0q7wp8C5K0N7|ZBts( zFKpPUQLlI>K#DMAW_&f?o1xo4#502;{j4@{RIFgFdB&Hlcsj^PG;afIx@0WM(@Ei< z6>5;r8?YtG(=|(HLQ$N6f>%XVI~`H-yLR3<(d_4C(fn=Vy(U&tvT5EY)8V+aXtuif zS8>lQntbr>EU13Y3I+PSJ~6HT$}0 zrF6O`psu{F)3fa#_J;A5lOgeEfIKg+#1(UMrD^l{en(fx47ZwmH#SPl&l~QB-)kPA zE3samN&Th#00Oj@{{Rs@Au}lwMP+qm;*C84#z0+3Ro*lAhTB-#PbfD0qmQz^vDFiP zjpDs7IYKUANi5dQow;?A!s(sLhTQCtd0A{L4sxq?pkH4)i{FR-8u3_QLrJ0B$)sv* z0&Zs86!7__LWwaP3K^7y+5rjK97Re{a)hNf6{XgZ*3zk#GH>7d^Mek`F#7`YeSWohG2>>^k@f}mIupa$tNW3MpfvJbzN%d zu8VaSZ+7-gP5tYtR@_e~pq0I%zWO&N-@ARJuGO9H-_LXJH-i2QGx%@DR*|rn|1Y;zQmf1gP?H`MMd*TEO7zIYBYZkQu zT(QBDcy$yia6o;Gqz33m8?5fTi%t&8`zX6#m34HJ(*3&nobN1aTeYgysWqdG-m#xg zJf?K3Ap#rS8P7l?xRwc3fa=J^GHxX2DngQ1E%(|$WFPAGHc12Q*APv(l0m{r zC}-dSf&c&&;|we1*t~oDMB5UYu8ZLR01*s=V(}M+bjT-Qxfn8ATWQiRKmdO5kT!w` z%4=rd;)jiu{{Z53`#0#?;9tKlh5T24;n`D``O+|&nDl0iBLRYewMpEv^Ty+8LQz+; z{nbe}{nfQ7RBNuz-f0&cwsK3CmiyjSAr)(`vz!z1w$AF?9``)fY~S%Px3`cCjn_Is zk^Ax_jb#Mn5K4e~Cwa=}9_Hi13fo%ARhM=a-VH+B{KEun3li57$T>?zgki^$6IWcLpG`tFNFAIs2`gM)w+2V4J@S zc(xKY<>K({(S`>HlWfTwVOS{u91oQC2N@*WvQfX2k5s#^@4dQoG*M}5%%0k{uG^=7 z!)+b+8>s5uAi9j&>UOc}*6sp%aYv=<@RedQn|aX;n}``zKuFF(V2xfw;vWJ0G}JRT zz2V(2PMammn|sd)PZW$;?i1M}*hm%0V4hr@kWqHv4^om(2hK~}Uh7fugZ-u9Td0Ed zWeoQ4B+M7(`B@G@A+mDD#54FJOzhNr5>Y?~J!4GQ?Dwbx7Y zXkQw5Q6dCGWIS_cuIZ?t6?o2*J>+)s$Ai0XlFGmZ!EL2`OV5qpwg!l%J$qL0cg46= zGMTkc1Ne64@WdKT&hMsKSRp%KW1qCiF#tlXzA{#|&xigMYm9!|@Uy~tfgq^3@Xw9o zx47UI5(`-%wx0}eKn)?vZ3J@lZqwoK!=(8%y$j-|f~DA>?CnM!O4Sq)+Y|jZT*icl zWHBz{2Jl~%e^Zof;VE*vYN}LGTE*Q{arS$B?PYr%F~ljymeFb5w&>Gx=+bpn{j@!bKXtf%Wf)-Z>j^w)!`ZG>CPWz$7t!CtrI@$cM@p!l2+5Mj@6>z9)0= zYeYM{hbydn6TEO3zlQu!!HdTB z-hYSnQO;5KEJXw)jIX!_#T0I3=s) z-MdF322|GZk@!)^vNP(^jAlTFq#?(IY5ruI=CnwFoU6-K%X0xzwr(cAu(z zeeeuyo)+=H#NQ2CfxGNJeEuNO8A@eG*lyPD+Epq@-0)@9Rg^Icvr13eW5>iTuaA5Y z@SEakLgnwZp9p`#CE__4yJe20;lrcGWk6am&u4HG0ZAx|M>S~S=X=7RHLlx?FE58? zpR~R2e{n5*&ip-DQ*lwK?3!Gva=dm|mo!yAoAYY8ixX2E?H~b-9F3{%k_1_72lSq#xV|B1w>k}{Ufb(aL zSYl)+%L-$8U5Gfz0yp~F+u}FCy?QsB#Geg3dGOM9$r5-!TC(wumV}lp@}=xrHnS8( zKs#c4*UN5g$e+AGG=wVHNujGemOtF_w4wS~-Q2OoLKCuHQ@noE~d)a;(=SvRKW z_>#`kQ?t~P+8eDd0X)YB?&jXr42(Wf?=95U{#alGt4kz7@|fJ>0hi((9`45D&U2>R z30;6TTBeybw4s|XDf=d^HPS^PBzcI53IJn?)nnMdVrzc|d`6RfqQl}Ym95A?D{ta| z3){~em~God@>oyikjz!(03iy%NN@~(JK`UPUN31KZ+r#dU2Gz;Giejg;prS44biG5 zpYt=7Bs5G!tPt!&w0M>BuWF^rpYuiUeV)-(9=@JdyVu@^bt%P0bsUniQFSEZtmF1( z)t;K|d!)}OlfoV~)BHXE011Y%@ZVRT;pd*oCyMlmFK5#sW|i$WuZSR zZ+xD<$=f(g|X;xNxY;B3a0eV=$Bfq-NyL zhBPgAUb&aye2t+=Dzn`91ID_Boo6(MU^7|h+J>Z-7Fw&T8AYTI9Cym?5)U$LpzyI7 zG@_KFt8VQz?>A_*%Xrh2qPoJ|$!e~Ssu{{{LQ+Xt*`;O6cr_WgT_ts-u9DgAdHO`# zgwe?hAPQBaKQV}GF`O0xUFsAUVoZ&MA*5p&m^?DbR^cZjEh7s=SivI<@1Pf#k7c$AP)o)x!)m#orI;sTgbpkY|n2b zO(koUw+tPS#ODsBp!+OCC0G{yfQhD+OAw$i zh8W5n!+b;L4b}Jp_u+=0Ag{5kN>gW?|)T{XOJZFI{RyiMXg z3q#X}s`0g}_=@85TK>ioe`+5NYt0GL?s!|MYKtXS!uAB5c8wVQZL!haDhB!+8e7fmOHej!Sl z4yk?z0BRRDA_-P0^z?@I3uuRhkEM!fu1Pl}leBqUQ?hMpqLNzcC*^Bt^chxbEImqd zTDnq%qMP?_q?~S)pxj>iUsYtC&$)aJ@#pqr(L6_Wd*QFyTfq1K01Yp1uIwysJ~;eJ z_?6;s5LiPgXRvGCf8p%@2hvkmwTu_Pn?mpgi)C|h9F1!oy_eb+Z=xdouY41yctc)a zhk76EoA7f?fL>Zz+S+_GyYX+t2A<|QzR5O`<1dMR8u+i{E2%6VB#sSSYW5=5;%M(| z?JNU5^|$8+t>IsQHugGpt*!XO;}hH&9?&~` zUwdBt59v-6@!LDe^3SV%TL9fSa#Ed2FisB9QInM_Jo18ZP4hI{cjn&y&HHS8dhq`M z#gE!k$9_Nff8xviL*eQsi)HZI;=@7z0EA98(sXYJXx0$DpN8#XveCRdJ;#VGudh5y z4T9P%`n}ezszGaUad9Ha^OeWNe~TAd&Bm$XJ#Sys{6Olddv)RsV^zD=B}pNSAi9$3 z=k0P2C81?$q-Bu`AKpagcPHarQ{lz;iF`$K@b^jaou|Wl-A7Q5;p`qS)pR{W#x`0+ zK`y4z{7W8-sKcfmLegDANEcPJ(xFXyG<*28yGgF(hRz?}q?d4Oce5Q@*5x6bz3N{p zi(6QrRb4_Gi-_(5z?SjBG*eA%APF1&P9Do?QllAjPnMiiT%?@sqxapD?6q$C zH>Hox@t!epraLsnVpbw}Xja5jttjEAQWUQ_DWv_R=B$$a-L0mJn)f=!_>=J(e3RlW zSg{9~<}rdZmr=D5i3Q7Hc?@&ZW}=hE-w@noyiMW|2Rv$5N&<|KK}&$4y7j;Wk-H^3>9w#U3h|K)lqo zyMvJw15T*KqSUkt13p!*j()! za#pUG?Ydjba#)P~(s^5fB;a|zQioiz<2wf7xrwK(j;{P$tg;Sqw^P!?02P2@Bw|YB zg~oC|W6)5toHP~VPB*f(l6SSbCbw7G_TA{u2EQBe7Adc9img@`N>^@o_*Jj@{ykZU zK4tyofDMHJBN4etCvhtjWs00*IcyE!fCIBqH5|31xd4o##)-57yGb#JM#wpENgy(o z1ZB46(e;%iGi@I>;B`GLCndq$R!|1qV`{%8iQK~lsomRZ5DXbCnC=n$+MTSRga_d1 z^y*hg8s#wvOK3qE^Q2j)TFd~zSbg#%OGWf z!4Z~Ct{wIUNlxRtcnamLttsbl+Z_ZGHpY&<_b%yx~a+{0&YajIP;bEcVM*AoPq`%r6JSP;oQ z#F0T9lBCXxqfO3ntm${uIx{4H_t#SoNofG?~gVVi~_2@Xp5Ci!C8i$yQp|)Sh<0`JEh(HKf8o6 zF)qJ%;uxHk3lEnTy=!jZLmpMqYulu_E*43O<}v2pB-`K}YU4!sx21eh_%-4v9gEP;*SYyc3~OB z*B833ldH!VXGql8+{BlWmXu&a9)obp8$~>e91)o=KUu(I_;WCvc`-L1CQb{QvNeK_YG0OO2|o~OCw6P`Cu-1j^jWHC4= z*FN1bjB~~opvm>XJw|&GoRT}7amP6C&TIpdv>f#6bDW(20JH{i$6VlyfHu-kYbB++ zdB?u`-|ye37UN!WeK0u~B=qAs89s#aM{2y0wgKt~C!y{^C!TS@82}z|2?0&A=>MA&_)2%XMCIl8#G^1@a>9Xj4hm!H84=I#qgUPUP zs~9VLUulR+QRUS-l^fR0^4rNZvHByV{Biw~d>%LGo*MX!-j1R#aZ?6Dbb$B@Kz=XT}_p+PPPCbXfr2tj4qNhrY~ zk(&y5BV(3R^I%{C#c-!52j?*!9bs_|O08=3qbGTO`cZanIzMLOx@*;4ZP)ASeIPjh z00l}kGTOKtB|9XPa2R@z?5*)Js@>8{duy^I2}P}voNKy1m_NA{(rPl0LHT#Px0Y}~45TjN zzcQSa%M0P>4&dr4iwQYSEpvNJMQX9Xy0(=`S-mf^?Az4%P9gC}i+Gxx>F3zk;-NpW z92ORuUkg@r=tb+Tz3o!Anp@}}6@JzK0JlHHi6s93gyZ)8`1!5DGPGvP!f{>rCdeUO zqByPeO;5x2Fe0pRVmS2BsH&&{+QmFGTJR>P=r6}J+qlH@a& zED6W}u1AGle0J3%{oEQuKrw~f@hJm<6!|cMS@L&26^ni5Ey?Gu{w#Q&_+~UQWRZoE zOaL+l((;d#UriVr*jci3oR9IM1 zj8t^z=DJ+G&FbE(OEqoUvGyglou*k5VY!Ogwgv==BXBBz@weP-GP@q82DrGFV-E?bIefr)w@XeCqe-P<*sxZLK zdvB1zK_o0vk%s{YQM{kxB~_lXZoV`8Ifyl&DR!x3qkPN{qwfsoQgXk!6}Hj?8T zff!^cJ{5~kn&E=MW#YY0B$4)QK1iZ0^U!k}y`t&I<#8-@F5+;&9csW$Qy ztlyjVn(;wmH1CC;9<%@wzuKNF)-_;po?1I4(FY+;a7WE6F$Dhcv*-PzzAIg^`!0d- z`$+_irpv?6Jg73v*qZlIxRIDCBP`6skO;sEHKO=K;aJWk)I33VwMI%yV`jyOY`6~bHD~hN^C`YFd~mowCyd3I zBof+Ym!;{Ak}wF8#>p-h8Bw_a2|@P0IA8(+pP1)K;(v=;)>`}GCyymp#_zJ~nzA7n z<}>^F)L;a_5+=aJg$l$szro=h9@t`E4%>mSf#uv>1{{D0{{U9ZLjk#@X(Vr$gMpKA zd^_Q{A%=kh6>Kv!reFs-I~qf{4cvugZOen4fH98`<&`DO@Z8dCNy={b)2-XR*QNZo znP$yfozz=us!8(gZ?yja;kU8!PNm_ULh*L^k4e|{WgtFv?-E`z9Dr5CVT%PIspPOE z5D6qOT|43JyM;P$gY>8r1|K9Eo$QK9bAZyS2Er?3fwzp4gI{CX=~fmbe`U{QxBvjS zvpO=P5_e&tQ!9`O+rQ;2k`M7!$)8b>{{W=x7Iv%|wynMV>J+(ApWNQZxf3c1$!-C_ zK%*O5qMk=al)1U%WRpr!O|OS%ZB>)I>21z=<0#aB?=>5GJM$-fG`qF!z3pzN%G!6s zopRvp5W#GpbhJ7~pdCR|jH21x9Jb;~$!)mka!*|c!F!pCneV(rj$4$p(%#NCC7sxB zx>(A&DozYYK{)`G74Gvz;symz#2Dd5L6zNhF&Qj!zErW~hEPdzLEX5qDoDzgNuF{A z$HgMAj!|rH=OZ5~u>#?njj91F-9|7NSE)*t29ioq=a!bVZLN}b)!O>2HQ&hd=Qy_7 zuP3VAOUtTu{I-3MIJEc|ro;1I=sM{w%RTP9XJ(EtL1_d~v+QCIR@_Edwm>7g(!Lt_ z8&4_+fjl!j!GekIwJXg^eZkm6O78<0%y=P4_TWYTH@`Mfow5 zCPh-fmdh0o;N3U;2p$BpAT8FkBA;I1A&FM(zdq@azb1lK^P23z{$=*sEm1Z zP-|Z$rPAoX4=$uCw$aKrU8N+tTXfT3J$s(79lg*WE}jRhp}Hjyvzf|5#Ecq1iN;O@fbC6z%V1EJ54kB9K7!u&(=z~F#Z*2*jb9|PvP zY$^j<>=emn?eZtIn+%gH^)D7W} z97mA{$6paijPWmkyeT2$b`Ki1a59-YF`QrkcAAX2UEEvp{oB3mt^KFXUeB$Trcz(t zj;(zA>C2_G>9WzD%t{Px5-R7C4gl%2=YLim$OIC3IpQX0hEB-|JQ748@-euv4sZrQ z0EXp8ab71chrS?#pZHz6`6Lma_*cFc=YkM7{7gm&;{fmuNCY36xzIi!_xRi51yHPb z_y57iB=kG7rm>xP!K-)`Q(OduyhJ)7>88UWJ2V+&Qg{*D+TaWv9LiPj0Afhb3UJt5ododVV61#7&CdkI0+EhM3@_Dl zo*OanSCGUwubVDBJ*7%Y&+%j9rmO(~C7z(REKkgKgAJv!p={&@>BcsIrD*>E!oK)* zdGl&ocgIb4_+*z;@%vgv-+w#Npi&bkPInA!BLQ29b!@JbUfascb=5+8Yuj}0K2_DU zv|j4w*{yeuo7wYzEc(54`@2**@a^0|0p>ks+SV|Mf%i;|6cP?g90tzg_k&Qomc#-t zbp1XxUzq;@X!yH8jO{zJU(S)36~V^kAQk60D_<+zd@lG25{Wf00qfFppZKVLE^1bT zp(R|PB=y7WIVE_`;!Xsb5A4IF7cKDP!Oo~oOy3fGX{}AuB$%wOm0LI;cgs0rv;u1< zi<){uE#BW8p8U7B?yc9Rz3-*kR9ds0Rp;#EWw!6zNqyJ0{=ZS)_?N*}XhgDnG19mo z$*Fuo(&gF);=!S`F^qG!<-sk^8|DL-xcHgylF74q@f+b~i=ia0n`LvXOg558^B{YH zDBJ-9YVOZWh6BLj@i*+>r5x!W1T-B=UN)jwc!yAoo^gpatzdkmK{+upkX6FmUJU+^N>it@$E3R8vCpFhgxBh;gbMf!t6hy7R#Bc2^X9G(3eXFn|FOV8r zAf?!C$z~bcu1-rD#GB*y!`;NiKZ|aaPJGC`D+Q+9`Iy38OCA@w+_@@@7!m@vpIm%@ zyacVMz|VymduIS%>UI|jz4(kl5)6V4S8j8a$lAvS=k|c{QaF+y1pFk@T^u?#kE7|c z-J#sX1QEp{aoB$BlYoXYLm=voCP^maIK^B3UCKIpy4zcKdoA?WR|+)0y4zRy)UN&A z+KsxUx>}y4AMGRH=`y-+{3iONVTYCdhi_tc9PUu@p#__kVapAJpPMTb{{SBBSce`A z@#`z{t9LZfTg$w$DIvGFX#qbXYzh}8&Nir1=k|XazBTJ-c9Gx>TgBlH({W{G2ZQV& zLUIg~>6%T0NSO+AJ=933fv_^wvVJCfXtPOY*1jNoDfl}gmM>#It2c|hPFYp){{Rx} zRPh759n7b3Q8b(LyBkuTGK*`PGjB%HrBX4ri(0Z#q~+BwYMM5TV+%InXQI7YGLp5G z{hVB?dHfdZex{_K8Z~=@vFU#b?``D3!Fc>huCnrWm4?>B$pYlZ7KW`Du86#Qy*tyh{v|cwfYy9)2h1 ze(R3|{4BBX&VWf*0KT`WSUj=DM)J~0Wf_e_NrqUxqpu@yan%11PwVx|{+gB)iSS#IGw|#ZpgRJcN zXB6IzHx<=w7Nb$!S!|v5@>`4V+KzDEZ-<{pLRHV&^}QEN0dVRvt#NN4E41+@;uL(j zZ3fmVZ@a^B(^DF-VCa+bh<%@kU)#=k?nogvilS17GoIy^!+XJ6iZ=+VPt=CsN{Z@DI}+Cg%AwhMB*xBw1MtIkgRuI;3wcBO4J zwM7NMR;-yo4Nms!44Ms19@UO@siiIU909oPYuPuHWG2hoe$8A0K%0 zRCXJ)qv@JIhah4>+y|Jt%<pG64$0 z7CeGOV+ZP~J`sF5UIMvI5FoS9Gt>b5KSnfOc8*2&p0 zyVGBh$#`qUUkLm)fft6fc%@LGZndpT`&#fwTX}Z7lTLXC3X+J45G}QV+yQSxKOTGn zh!kpi1)`%7<-={PU1czQ#48*KnEoKaHa6g_2wkSP{3^cy^z&}#D7!Y?=^A~QR8fEd z{>+WCFc`dno9nKr?c{RQ#5V11Eo9qPv$pn*ujj94u}uEZpAY09Cx~NHfT|(T_4Nya zK3^_dc-IP{_A8QbR6DTDf@uCecqc!**X2x*tjnO^FpWzbxkh}lq7p%5EJ7$Gl0|5* zhP*Qxl(*5elsE?oqS(BnEZ7Ww#1ys^f?0S0M&fucUk$+7Fj-2fIm~u?L{X}!J6mf; zP61Xp$6@k-#Mbep$!~Qwt!AS4zQ1jC)64HTojz;7d8^%~)3)7tJi9N!T3tWl_rpC$ zXtwyNqqKyRvr+Kosiu(s05XLl=Gx!pEs|K48SHl#JyoxWd_Q_aTKMb0cPPgzo8f08 z@5VtA$W93u3P2<=Zc36kTb~Zaau_`NWa>c5-0Aiz!x`b4(g$)tBmPn`bKcQV?JDDPQPu(1|M`WOlzyb;DfDSQ^nAUMxq}oeW7Zq(TpT9SMmc1;s9ALSU z+Bz#Y%=&hWWAe94K8MjZgiLX4nl$8qNA_=tZKN!~48GU8jAhFP$;brq&R2DHHoA7Z zAO;;DS(#4+!F6YFt%7rhYnKB%cq}jg`GCPE;hT?zw)=})=<%zwU>keuh*S~@;K^$q zc7wu&V!Qy%2IEaW9(b}Q&Yd2$0Q<^q{9`S!Q^^dg3&dCq?%jYl0IESeWh`=rkCip2 zyxLtlC?t|wJHDFleuad-s_(6|Nw0VN@7Lz^KS0vL<_smqov-O5l1YSW1fEGOEaq3o z1^TLh0DcHlu(p;e2H9k~oWCn{kXbqacIA@qTe+MJ^a%p73U{Dp2!B58v~P`uMziq# zq2ldMR0qtE_{UO)3qg&{*8*7~Pyk}A%_=Bd6>}gCmNj{PB={=TwI3ON)mk@zqXAL$ zYg@JP?zI~DsT={D<%H|cuS)5|8&19O{!~4Bt;F5jr^nZ6% zEVa$qCwA4el&;;hv{c&k<-PjbQ}j9wE?dMBSxKwira&=i(MJGoH%N^>p{R&lfCvmN z;!vydx~AfGwEqAMc!K53RvsF@vF8nUsozf~3o{k-Qp)XiZdG-_g5g^YpOru#1N=Jh zPsb09YSMf!@PF;O`$pfom4fr(*TbvN4)`utW950bJ|~M$)@}5=6=h#K?&nTa2(p1B zD$OikQrZ6i!7={;;H0{?l)9IV{u6vR_&MRpE&Rx}FWN8ml+nCHsw`_Yy`1tthkP62 z&2L?`m2SezC8gJbt!~;xbVwQzZwSJ^e@2v6s#9@oB&9dJT71;wI7fXHq^_@P?p$&V zOy$-oG@QNF{Hc;$x6OT0@# zF_z-SNUdYKno@0y()p6Xi?rPo@GSd!hk*Q7;f-=n4|s<_y;svF-KyKz-FS7cSM7G< z=4Oa$SK4IKG*T_4oNuiqg3m1MwhIJl37^X}-}oa3?JweG@i&URTk)^Lw;m19Y^`rK z9cSRjgSCxg!g_X$n<4QH+xU~l*8czubc;vRt?kUr)9Mq=e++Zp-CkQk3^D2-2>#N) z4*WU$EBMb^_;ui)h&m_7S^Q=2`@>7E_?JrYPlLQeqG>Sex^|zac#BNcFMI>9Yc|&U z-jlAtwi4K0>$;rM*jZZN>UN$Qn&vGIZV7Q6X}1bK%}RnyYT#=o{##=j5vHv3Xb#I~7d(f$_vFw}fOw{-XG9)foyH=9?M+1wbJDNT-W{z<^KQ$0v-j>z8~qo z7POJ4cymX!(d>1%_-pX!>mOjSiVJum)GzM5Iddn8BpQ8{y_MC+iXheopi*60_Rai7 zJ;t*C06F;k_Qn0Nek$4^|M?mt=rq^Iz{%Gq1&vG z`Dr9pT6LHZh~j@)uW z1i;ZI)9oSFHA!XAz9Ih9ek8N7mhVnix%f};>Mei9I+n9_XB~uXCy4xG@e1Hy%{|_= zqiM%Y)J^B)H|+)g00sE?DW$`AsQe`G7slV(saFWQgAcHa#C7-|^0?X~Afn;&qYxzZZ+Em^?Q;kil&w)t;*;`y5cpz(=Utc?%q8FxX3l zE#@p}@xjxE_Or4bZY#xM7baT@R1}g| zv}YxBp8T%*B=wA?7W!&_gnV-U0D`st-oLaRjF!6B$Da`VANX-~2!9c)7!7($hqittQ*P%I$8pZ25dfb(~_Sd`3F0MRxBg zUiY=)x^mk~`>NU{bar1AECr?hnWjf|cW|$v_-9zT8&Wk}{aZrPb*s!=r4IVd%;42!*7J;QB1`Q!xhK-I&kQC)@P&z7N=nJXOq+V*!TPTGtB0(aF5+G(J zTtrS4f~O?%c~Ec*gYHnJI9e3p6{gWi-9;g zx0Bn<>-46*iqyenG#2V3`$J05tKBKVP+ob0BM96Rl2LrZT}sLGCKUE|_Vbs&iSHyh zOtt%<+7_r?ZYMB}J0_&s+S29G+RE>4n%Sc+a#QUdNR1AB?$^qxnA4wLU6MXA9niQ^4jh9K46zpSa-0J(GbK;vL&q6 z)<{`U?Rdl@Nen7xaB*y@Bw(h^;zO&YX`V0f5*F~TgRA(GFEU63);1qu(PEe@49~0I zM%D=aQcB8?a}13fV`jnTh5IAIUkyAKHNWf+2zXmt_>SYwuPoz+$j5V>DI71+jUD3LMbP!O4530uC#Av z(p$g5+{IUvq||A<-|efXbsbb9(|1no#q{%R_#V&U7mRjk+KuIq zfq&ww)^85@c!F)!?i0rzH@Va0)eYy_3@S9;CsVSPTSzT*`?#Z97$oTRUyq&}@b;rF ztME7B<%X@|i7oao$M4#b(@XKMh-~h*D$RZ1kA!xRUw9kB(z%U1iS>W@SbC5kTw_Lg zBt)~~4+Lr+BJo6?DEP(W-x2=M{xP+TOjdw(=m2Q%th7M2v4w8Sb@0gOs%Qo{&qLE3UHcv{$v;)as{Bto{0vEckl63zBTd3h-C4n$NvC|8rQ{r zf5Y<3w;CpqWv5&CCq{_F_65ykagBw&)iqhotRXzDuv%R_5k8;{G8SkATdvvybnAUmy=wJj z?FmgnFOn%mChY|)yYKJwS+%9Ek5eqeQLUKZsLBxJsalmb+*IWG}jTz z^=YH@-}XWMp1vDv^ZWw%m#t`)UMcvM@zca!H`HwI_1^<{gT#LTJ_>jj;ar;2U3kC8 zHyWt7@c#geE-f@a32U0*w2xI2cvAX(H&U~=)2LwU8B$c01GeTH;5$h9rn6) zFB*7{QPKQquV~hO8`f;}j}u;9>JKM{yd!YaT4}H1n>YJxQArVlNz-)*H5D-4CCt~~ zvY)YU!p|0X@Ag>#0D^n#wt6g9Uk|(u;w^v1x3^8=KMm-974c;H{{X}(XT0#YjXVhY zpNG6z<8K=Hn$9f;P4G66XJM;&YFkegYkn%dveV(yJUMiKB78x9(s;|q@!aWfX*!ht zIPoRth;)|J0_nCI{-ttGv1#GgvXbs?UMpQ{3%xEsBqg!(wCJq-iCHCI%d#A9BDQIn zI<@_zW6KEB=Y*X&tW8@-nOVg+C|a7)Tim0Z8+)XB-wgkDpvbVgFC=qS$ z7Tz|NN!Hs*iKBP0w=at)HqfeRR$@!0p4Moa#Fvr1x>~uB83nzK)N3?uj>&Z_ml~2u zBM}=yOi*!hO%=WB>FFBJCC+5Pic6)mU$oramt?b=;g%sB)`EF%pH5qU?Kz@*Ru=kY zyp_aCB#F+QVJv0s$Xj!93rMiQEv{|glna}21;IsgaSDr|E&|IS2txh!3N+GEwWRFR zZL8kTN6mfLou22(U~!dULzbIdv5JM1V=h&7eH}LR-Cb<=ZpT3=g5ch{()9Tp+{j3{ z@g4MOCBe1bG?GU?p8KSX2$gOjf=JZH=(2zrg!+6I>!@ib`x{M^8;PZz?R--dZ6kRX zOdXPISYwV*8C)Yeh>->z%N4BKY3w|k)Lj6(dD8?Bt!jv4XM$D;=wi1YDJZBnD2>sH zlx|s9PTJPp?<^&62Y6t{lU%56Ls!(IS087P;pP*f$l!nwtblFu@`Z_2?5Bob6LZ=+ zCv^T7zct@$>8EC{YfBYV;!);&$@{dT-MN$dG_7v7d#7aCdq~lIKHB0kcvkbv`(4MB z*4{7D5Vw_Ss78F&67OX(Nh56xp`B0wc8Hhk@7XWHej|$S^FKD@={91Op_UXTzlD)5` z&!^$~u&Iv2q~Xk?R#vr0Nhe9C%X$%t+Sb0E-l(tfkKvDsJ`#A#UeJ7R;Mn{-s@wQu z!dkdZFU39)@kP5^Ut8)AZz!9=b6i^simI&6X==hG&vO=-JE$D*pfyJUyY4ckS%b{@Y%( zybGyKH;g_EL;nC12(>+0+1@`Ec(T#wdEG6cT{cULNR8SuI=!SbZxJe?Oz`t>B#i3G zPNSzmw-n-)rA4b#bt~Cut^3xWTW-C)vWlsn!w(rGr&_I(a%+{tRO&8Uwxw@{_FasP zKGynSVHBE_Wc{AtqomgMay{MOl^B9)pjl=z7xJNw;iHOqR3vCwl2ZrjXZ#aO!jgD{ z<1fUE(|8^&JK@|mEYiGpGRt?Xc!CsJT&!`-_U?4MxDd`|m1bFGPbp+nuZeAqir&ey zM7E7!isQ?QD@%kcBE>QZR!5B`b#+T&3^5dykR&qT#+dzh{{Vtq3ux_rENW*;M0u_} z3mvW0UVJ`&pDbP}co3|p?I~F8?Cxf{k?tB`@F8+wlH%j?t~<`^;qp98p>-z+#VaMO z>Qm;~@5;9%a!r3C;y9}x3{_iHlvG>zcj)zZec#W|K+U+{J*5dzp?8Qe5 zlZc}*1H6o9BP<_q8%W8{Ft||5*|y_xz|HWYbG2{|5iIJ-kah$G331^}6}lHtp3u2ud44$4hoy zliK=q>20-FLpC2no(>K{7|sqjBY->P`*12iqkuAUa6j3}B>NHS0mojTl_G=3Tyc|w z&UcLRIqEzA0KL+r2Y>*{B=rXXdgC2WQ^zC>ahjP_l5JY{cGCX6aTb7>RPqWl);;+*9Ple}>%d;BtrzuK}1uALASA%cb zI*RtQl7oes<(E5Yb8?;}@d?+2+|((;Z<|}GMW)ksyi$)ZGkQ%ZG@YdH{fe}T6an{m z$j;m@Nm4-1Tyz}{eF>#ma-bE)KpT)rW+iwID&> z&p6;>pbSVHk&}b7oPq!Zj!!469N=UQFljdv&hD82U~n?n<2V`aa>RGW?s(j#({J#t z6|~!?&sEdZtG8>vz3p;f>Hr{+0Q<)yBfp>-JP>~GIL=9<%pQjWIL{>WkPdN>IRv*o zNFxBs~EI5^~kw*&!hzKT-g| z=s5Y0PC+DR7@)6$e>~%njEoE%f(GCS9P&5^0$($NcKqI_oDfe@)1JqG03FE{8#bG> z^V>~dUB370p$$DPrR~>irK|a;(^kC;yN5W=aC6iQw?mKup1kwH<2V6oK;R5vv5tTf zk)BR@EIVhY13dJq3i;#j6WkC^MlqeZ$i{P=@zXpLCgQvf03#rPF_3ZwMh{E@@{_yN z;HJ}E^on~u6I#7rW}9E;XEfAakEh*!y6MwTGVVigGsqz16M#X%JRXN9r(6Otiji1k zbpr>0GshdTgU(3m2S9UK;rPJ>5r8l;jxokKEyxFwaguq!sTNK~P8W^`89nm2Am@TG z00EDB=6AbkHm;h!?KK@9s@G}jeU_-=sGD!iej9etbpDYBvft=8J4Vv6Gme{bpplG$ z(~@#Y>Pf)Oeqea4f#U6O43qZ#W9B7a$?0ajb#d3C{=V*72l)%+0gRoeAOcva1Nex@ z$ip@`$QUC>Ou?CZkVZMdJ91Rxk%ujV*CPWzHDSW%X#{h?C!FIX;DQRNA%Gbt0F2`q z8hU($N;0D?N8TKkUE8nXx%~^6&e&-# z)a?B^Qv7cF-+eVl=_kU}1L3!Xa5!xjO&K|0q1+Bn2ZBK4VLEXP{<-s!^D)D7 zg)H2R?JM^8Jlo-(Q{m@>6c$i)Z67B%&gVn4ot%OgcFKYQVVs{uEIigHXAQ?B z;E;LrJmio`1dw^?KM>-3%NtQ@+mxEp`!uYcy6N+8Tk3xr=Kl6!i+w)1ifQY1ooyR> z`s;oC^|D)#OK_zB00|%hM*v}g$4~(rf;tnKiNNQA0XSZBmLzeU;DS2x1~5))iG9az z3i8>;0K*^(JL9<-BLIaU;|2a_aKK|2?&K0l2Lk|%;}`@JgOV_O2u&(}d+zSEk6l{% z{pXg`l1p9J>224gwe6+1vR{mn01eY8jxm#ij&N~;FfdLsY6g6h#xv8BPdtKfNy*PS z&M*fVB-d$hNh2h4oTx4QxB!!qc)%d@QI`if10CQ%QNH~7r3CI~3Et8DnC#ONzk(}UyPB2RtjBRc+--3AqZa=+&l1mQQ z7&ymeI*quyS+=ylcD_yRZq~i@I-yOgTJGEE{I*Z;zf0(@bK0~}PIPf5Lnf%N9B22D z@A4)ErpO>fi4J&0p1-Ha{O;a+PIHG-Tr%a)Y-!<+PK%N2DB6 zS|qu;yW8?^EXs1s6T`ec=U3U@QF7Vy#VuB=MRuH$>14L`eS5<`H}JiOfiJXeTf!Pe zm&N}8hyEk+UaMv|UPiY+4{ofyI`-P_jm?&=s#@RQcs^eZ>bgq#6EnT^T8*?eTK&eU zdp`%P&EjUeT{>?P_-jGDLYE;F|=;mdTC~OI9bwCr)37xicdz;e7#fVZCP2~ zDOv5Uy>rFh3e)u8416%WhsHX$#9t9!cthfXME4#K(L4)bqub~{I@H=v5BQH$yq8tK z)ZW_D#5Pmt`o*r1ZKPa(Y2UmvTUa#uo~gk2D$l_>&6kK8{{Y2aH1N&Nk!_`aV%_O} z2)g*8ZzZH!c)Zm__ZNDek*C?*3%hu&;ktuOg;FUE)LM)PCWdc%)_x>-5>JD^54Ef*F^ACUM;fF^~Al@t;}|wAnLd zmqD0W-+2E3hP4P|v5Gh#u(O^&7U>4vblAK<;r{>*-S~P4(?=RL=D(-Spj_$Nhlu31 zvD2Q$)_aG#c_)@svuAtFI|j3p|rM*r&--WZKhsFl(|@SOH0s17gK$z%I?ZYZhn8&V!yO@Nj!hz zZGOQdlzool!_sNe22~-gKGS2OX^jkWBy!I8sI!}g@}`DXM)Q;EpBPPRKf`Ynwwm_( zRjFSDi<=!cTJxG&wLc&DGF?MWj3j0V>;DSjQ2#5j;sOu*oHdv%}JL zDAaX1?(q$`IrGV0oe3`7i)YJCw3~XnyXV9>XsVcLMhUe>D(Nm|tX=NoCYIM-Rjjnr zh`h0i^3wKcAn~5PBvIN+YkZgT+-YGF@&t{ZX*5flheQn^md?U0J{YegB3(txOKWq? zPpVr-J>Jb{P}1dF<1$AaI-09b6|{{YwYjs>G+(m12+Y$w?;=S18f*FGV{+b;sM~3` z04~0_kZ99t+I!FAJA3aF>e{Z7JoS)^KM(2mdcBR#u$EU7%$k0+8^fvIS<5b$BuxyK zb87rRv-ne^>EH2gKWQ%+d{nr&zko}i_^03(i#{G|HrhH*+*qWT$8_u``&%J;RRsY7#Y*EbqH@RG|=5v|K75b#V(bg5WzJ_0lMF zByDhtM%a(j9{_w^fSng-f1%SihIhG!rX(rU#rwb`b^4+%6mGnNWsOp^0=jT?%bl|Ce`0VN)_;h^v_L0z6}<60(3}O*dS3Br__vHq7p!qmYFN z%!)xDXw0(P^U~TpvwFyvhd9j^5mWZcC!z& z#{-@IVyMHt+$kYse2^3|J5fwdg%0&6jg6AT%GcS(o~d&6Y2MmfYu#;go{l1|OUsg< zD$z@lapivNvR>6WJsQ$IUz<9~d?TbCDYb<0=Yt`DdC`5A=Hf^$)uL}KMj^Q{$dd0K zXtz%?nZNZ)>N#P86c%{r>>gp;dkH zmd>6FMo^bAT}N_cUoJUqM3L^~p>`2Z3N!H7W5b+$<#)9Kj;;NJwS9bz-2L zv9^ZV1N*6h@{mkM2vl;Ql}cE-DMjKZC3MqN;+l=4be*jwtNbuEOca?spqP)3ivqDRDcS6*r;D2QWLRsleD+^t2g zhrZbIN2T6JXN8r))Gh>Y$iY*4rNzuJ!7rRxnB!KB8Rjg3R4)86bu=>shU(f_osk#` zwFOoNLP%M~m7UR=MUcn8$pu&`Wt9S>SCK8!NgDFv7<|Vn(VLrxLnEmylSa{8yE_FD z<{2SOy2%}~m607fHRPOLC8;E@E?A_OyKBbDU(|oaIeXWCypo^2Z+F^z z>es#1wzjrL#--q^?K<7AE-rLwaWsl{_?JmX+Xu)5Z)bka(Wx>jkk0N=qKubTl`7bL zH`leRPq*1#cy=hlq#Le0W2DYABz|furS73|<*@)amR)W<$5c5&H&TurDIzdhSVufS z<~f`?*$BD&IZK(WTumC3+Scz0ic);Vj7XuXDSxv3p&iAcicpB)#|%a#5vcOxhD#kD zA+vJt-#IZx3arTTk2Sg78tO@VdA7Q$Pu@-8%v1H%lrLrLenMkp&>F2<>jxK{%6RjkcLAnX|v6iGWOxsG!==A zTKeCxX-|`Jr(Mo`*x%-gNTEw`vISz#bYw|USY-%p%EY^}i6)r%jhac7klWd5mv?fw zo)z2{DJRN~5emG7+kzfF;y2%Xv6L4)uHCNVZ6l&makFbx-sxX$%cX~nCglokD8}#i zk>-k(wC7S=bkpzAkm_C$@ja|D{ifqjAz35cCyBIKOOXTp)@mRT6&DG*5`P}FWCOnFvnyP`Y3(W&VQz`Nwg1+vNjD&-Ko zVRB3!V@HKqRH4llxut6*WbLK3>t_77TJNcrCY+^Bq?{zVUb3^av)2qGG6j+K{W>7HizuHx+9>&30ssI6vLt?S1+U9@;=&oH)U>;_lXHlg=F;*q z8Md=D7PDsRLb+J2+9pAgL=IbM8n{zxS68~xUA4_^9iLRM z8zjFbc&eM#IJIZ)w7YWadt281e3E9MOPIA?9^&`G`Ubino>w;4aO)`@%g+Rn6mPM? zZ}Yo3lXP-2uG9fsGZ{86wI2%w)rIfDEh1Z+tBVNjbqh}x_{&T-Pj3|L3=xoHz+(`9 zIyI424W@9iN~_08(Qr+)@v2E2vAkNO#zBbR$ulglq-_+Tx5v1|tf=6=LcEyrYxb7% zBHVbpPq8-=#>}F7sS|XH8B$eg}7SI=3AJrEKFwY zmt=9pY_Leou5M(N@`;^rxUw6QYaCEUZUk%+MU%{qD5sK93=Fw} zBTyrbK_s>s%4-w0mto_rBJNw?Hpo5Ayz$#K?2}7v3rQxObqdJS!S-Oxm{$?5*h%{n zU(~)Dc;ida{2k&2(Ji%YGsU(V{mz$nV-dT8So}Y!jVku;=36^IJ{GnJjS)$VD-eaA zGr1+XDOH6x8g5Zdr^=-{S+x}3FFLb!i+0te+g5uta%#A&H0#o(I{aA)Q#^Id*1sT-Nu@H*$g)NcChZ`HNgJRvoZXV$}QVU({3#0Seq z8xCvV55+d8r%&Qbrjpa_vsr0cwY}Y(Qp+v5mTP!j?{5+*RLTT!8-W$eEP*aY`EBoF zRk@mPv&^;@G1}XmLA49x6{WIHu?ZsrNaCK&fr;m6pp{z6a*J}u&lay=T6`w>wQ=E{ zGvVm)eg6P}{v+#N6w`clcj7%4#lH$;(scbM+g`r4Xuq{QK^BD__l$J?8X4x7PSmyc zg40FRwQ{$yy@-HIg=}Q#-Ev9ZPCSjcMe?iixwthLwyn*6SgxHPl}jd;BN(YP=s_nb zRFoW*l;Z~%70EZs+i7yU*(+|(lWp|K^&dH`E_8h;+uO|_kuCLshxbh)dA2QfvCTY< zBrg=^+@ztJ$_Z|zlggT0^WpVK*hhD39Hv$hv&``23I^WFF% zArh5-P2y=5)_h1Hm`@WKV-1fca*{_ZMkWzBK@75@tH=zXCgj^AbW=)E=JshemokgG zPDwW7Jujw?QAs;q-47cRN}sfqCuyp4l{n3-DMd*|&z9GP(z;h~Z6CUG@8SJzV0}kT z(>~P|fw#7jOIx_zp`PqqJTD|~Fu9E`p|_c0mNeP4vPyYC(`Y^>)w~t2THW|o{{X~a z4K;hnU9`Ks8Ll;LCi_S+#}nD#+DmD4xB6JQOPHk6@1yY)Hx_ZivcV)x9nA6FX<7x$ zuLh`*SZaEKoLbyRYkPAF$!!FN-R>^pu@+Dy+ZHr4NgG6%F~Fp=$M#2pej)rDgW%u8 z-vW5A;0M8P7WlKl-VFV+?WOT{tKvDl1>!j`z9DE{5%FKbuNC-{QjFZ_pAa=)g!-ZJ z?Z3kB1AIr*^sO_+H`ls@F_vZY{hwVy?PosimTuy>CKD;M8TZN#wH8C4|SJYTnbVd@#T9 zXNOnCJ`=sreku4zRG#6qUmEx>OGVRlt4Lx=zQ-F`hl3Dy+Yo+SeI<3S@s%sXX@Q~WBtv|hm z&*;^PjMp@x;~J5iee|Ws*ECy-Tl=@SGQHO{Zhm8&@BsZl0>8~n9O^hn;cb5H-kas+ zi{!sEY3qA7xs&8=Hlfk@qrhybbz^4?+Ei{G9tb3vZDy6!i6E58DoqP{M9C^nvOFsB zNpBQ$NibgkztDBB4_;3KwxMquW(T@~;Dk&AEMfxiO7Y7IlAdH&D)2Z)Q7bHpSM)ba z_{-prjTWtCu`Q?BYXn|e1)6JlZ{@#= z!%pLTP2hVujM{zmtH~G)@jNlzA(00h8 z$txtRotk@hPTTdh&jOWt_&Hi>^4(vV`^o#MJH@!&E8h3KZPv%;jJU&xI>21C7H%HJkoioC|4e-90 zZNZM`#Mjq4=CgIET9d7f9(zq2NU*(*IP`d0#MUw6aELSfiw+e+NjJraN(8CSIi(1@94aeE;ZlRxb)0>ByH;|TwZ=bcxUlv4f z;PH&|MQv+6jJ6ttcG29WxUrJn)LCgW+r6}FC9a(=@iZ^KSfMaR!}daa0`7i!M_?to8ey)tdq#{ z&u5}t*dlm$#fu#4G`E_Tq5X*-Ww(y%WO*5z0nMoDR~FyeAGB}mb3UK&ms5`R7#+W~JZ11A?!x=wM!l?Ew$!`2 z(%a#z7NFl;+FM=D8Ys!A%!&I_F8yqa_r*>(AXv+PzG16d^RF2*t|R zw4W}n){>NLr6$_6Rpi%_K2q_2?9=0~0EM5$+8x!4KQZebMaT9d#u;NrxbZfRJ@1Cy zPUw|px76geRCGs_HgUzt@T121j3M8`+JA`j;lP^5#CmiwMq4t3A4~` zLP;LKsCe7p7MXG+_y^*D8EJZL#7JJxR`GlITK+kUgnL{601h{X_1hb`<5pIWZ;N)_ z0uWpW5zj7l&b?`=D%?#UgM3SNgU@N?vevYlsE8~~l3nT3YDsyp=W`{BMZH*v-cuxl z^gO-Mt4=eV>A1A6{luNrZ|=Tpt#@g)+ULvSy{uf6VJoMnyE`kjs&SN3+1;j=n!BUU z^zQ)NX{5-K>vpV!7LD0-_#%J#UK6$+sZGp`2uWq_pHS1}emE01V(2C)Sd}Q;OZT zma&B0@5^nIzRC34MzlENM-^9n7LQjIZ6R&smYsXQ#;p1aNON)a3&Y)S^owOYlG{zi zt)u~f_UVJvV74^g6455yZhSG}i;~*R z{u8px9J=_5+ENM511+`Q7XT5BgC)xhorN){@TbQ+f=YOk!`2(JN*ziogyT5E$!~a7 zl%JPs0x}C^aa^;O9qAf#mD=8$+uhgSeXVadxYZi*cjmUYw=+@uI;R&cHoocF%J(ST z{5{Za6bpSC-ZHD4FNif56*3W(EvB9jS_+>L?Ev>XE*J%Pf-BL^U z3I;#|3+VQ?a=G#wB#f?4Ix>7P_}MXUGsb=#fDf3U)u2|%-SaGIqz*Ep0Gyrf^{2t9qqm!#S*UXpG)x!k~VPI`EDUs;0EBv0Rxh8 zxK>M{q)0!uG+!ENu*Py_u)4(2@G&B6SmBq;3aq=L48kIwVsO!QGJGxgiDwu(eb0ln z1tb#^-dtIikZ%|%d2IktN6oh*e677Sk2|t< z+h?V`j?YK&Ux-pL{{RhsGOvs6)B!JsylJCc+3F>gnOf9ZYL@qqOk>E9N9F8DGs0ggn`?(Z!vNDN4Q zK0BL~Wyv9u0kw1YLj0q)vejXk7EcF$)V~hAVU|T2cf=0{UwB6GP`1WXaeb!9mjyvC z*^n~@PCzu~@h615Xe5gF#Qq4e*CkQp>Hh!_z8ctR`h4;L%&NXE@P)diyY5heZAEkY z!@q98k@=3f;FPiRu6$MSvdc`+!=1h`@OAxBP=l<_mKh0usje*Jp8=$Dwugj>M>5* zB|hA$>AExDN3NS{bR|h8etBD?f@!~ZT`I-?P3dd9A5^ZB@qHKf{{XV(_OrEViD!R;;)HT zIZ&#v;t8%*U5F~XOlS(^D_~@uqkupIHCmf$$vbv*)vaj%0MDvU{Wj@tw=kRQX1b+h zmi;c~)vs+|&iWqs_Z~NLJn`bKfCUlV+IV8L{iA6+Nu;fA zXj@BJTiW^P(q4O;Ex;pNwnxgHkqc~Z0Vc?vV=Ft zq!WO64aoqBf3bXAfUUpn1>+4H9TQOSEKv$Ahye-6 z8S9F{)@xL!9aFlT@AiL^r;@kJM7N$ zO+&$lPg9X5K{8uhDz_(d0gzR6Oa#Sc{z~GiE&-IC=tgE>7T=l1YV|^5-e?2twDN=HN_ab*& zLJ?O@Uh9=B=&tqA>7j1(LHM&82#<(7Cc)1vmwIGs(h^HH;b#)_xrk8AL2gMuFz2Vx zzAf2qX!U(MVU5|czcMGGC3NPETNuDBje-U?;9}EwzsAxH@9?tLE=fOUxxBRikT_gH zC?pULMgjg36_lK7zZUqi@a%tuU}HSZtxAC8v0Qn!VSwNeL}f`CVhaE^`qFAPi)*E$ zRo?19-D>`9r9~y9jsF0d@^!Ma)jhPm?|bWGQ%~1^KIwps4)r7e64vQ_mm7xG++NdF zmR9+IEI@|@V5tBCH01cr@jFbEFOGg4jZbS3_u3_-+77G(735!OBgk&V#x0@A2QAJM z&MtNT02LB^&kR{Qg}p z&Oib$wUkiAfT68b)kfel#~jrp?ArF1c5cyfT^5N!zP+}0y~e23ZYj<#E2EW_w6@c= ztsy?wae}U*5C&JYV;s2$aX5e2ej$;`E2S9N@g2psohy*r4@hLdVtEJUJv!i59ZW@A zzF0|FD_)$glTqICdb_<+Ps+zsFfLrTly9SL)Q-u;?3XQ?(`N0}qv?G=;?IJ0ITd2m zmesO8besDx1xkh}(%7noB@vL6gsBQQJgSm6pe6o?tlEXQ@h!BAA}LsPBcN+4T(b}l z+FIUrbGT&rNB}=5EHXYHlS9{GX4#@>(VQM*)NSo|9zY;sH3J8x;sGNkBr%&ygT-=O z7$aHXJy6^0I(L=}D8^b@kr)!WDgk1+!Q2!!KGw6cl6tS@vU(=(d$hII+uYS)soQwy zy2>u?+TS+y($+qp)Vu}ZYo%#*8$YoVlG13fX-J?PlQDaH`)Q;MLpPR@b9smFVf}kE4ZJ&Mf zJ2>gBl$(F{>=SPH`QFJ`N`i|?J!A0u$tB-eJ1cgz*_I>m{{V$^{{RT@iR6woV#Yl` z#4|$+kX3`Vyp#EC7<|ef%t6BBs;zVue;d9pSw>>MIzFhXNm#XgF3#>bNoL#(+H|&Z zhL8=SX)?%8;L27oG6m$45@Yy(YRpJ1Z1waCNLd?bF+N5yjiBxQ-a&2Kg*)HurpVO3 z9_!J$Vg#1j%yTM`SR6BwM%8G}Hxfu7;N&I}uG4o@YfrOMD`mTM)~fs7_e;p=r%kkz zm6Ns8oLsGCySo+3ID57u zFM=GdEM55X;LnIuF135&-2z4qSonv*mfEyP85u-NcczQC3Ryx25JZ4T(l8q^zBhBF z=@GIMCcSLLDN`}ChiT6%yUt&kIR%DSg5{fQnrP8&=Z#Ijh(rV{aeJuP7wNPXg|DMh z2nTXM%0R-Cw53#P-YHAoeL1b7(@Q~9y6JZB-uFA{(0a85uCL0Rw7s4E=}D#N?c{v} zZ{dFo>sE3vg#1bH`{F&TtE1`Kq|s@*n?|bOBFA$2cBgFNQA)DgJ3^`=1~}9Q^PN}W z_k}ImMY_>Eaq!OfcQe~OUMBF#MrSIrCa&66#AW-9{iP`pl02A-NRjz<=Z8OdA5zuy z#<(Zkq5jgj1FO z07P5BVHpY*DHWnB+a!sCN3)is@Y88df^tgAN*vNscKcDhqO8`w((QBwUR3?qzE+j{ zC3c&Q-P>;aS!;8l)P55q+}~Lbh*~b6d1Z5Mg8Ndiy@yO_?#hVeid_=p#hN*YE5v2F zw4UP0QQ~PQv^+`lAHc5*>Hh!@A^5BR01GGfZTM09Y-yf19tO73hlV~Uc!%NVj{F?@ z9J=J!y7$AqXTf(`W$ur2BzLx&UcY0mcnic@CankAFFwM**|SS=^HrCOyiH+l>th7k zMYgRf%WglUHTSaxcNu<~4mENEG2&I`C_w2F%00lt(n{_5#(Cb91JP-RJYtu~HC+&y(XIo}8wvxxi z-?B!5;#uvWUo~Tj=Klaf{h?tp2#hR|qS?ZT@rdJ$ECdgod_Vg@d{OX#5qM9>J~8m^ zxNrFM(EM$z+FFDp7eCpOPAudM3zd!HalL}b93t)XG5c8jVAPcpU--r1iMcJiS@8CS ztl*ZGR$sI(pQzjuCgn%ovBs$;#==01oNt5j%Cd9US!%4{lYFm57ZkSIJ(ZQV-SIAI zLB^JjF4ntNc2U#aQF?2uyIyy?*tqx+`z@(AE&E>lX@qWPcDnt5b!1}731)YT<7?Z< zcPIpz2HnmIos7~-zX-o&S<`LL?V0gqBezVt&HDxTmeM4S6Dz4{t-dPiAgb(VV>TCg zb#2~G=e1?~KzPegUp+i>p-O=)2^G4RUn_I8u~=y7u^h9sXvfTqmu3yIT-$Gn-Y?e4 ziVqpV=3udiwSbX^{IZBO4LDs5%;k55QrnqMTWXG~TqBl2rx!HU@4MA<+1bi1JuIE> zn%U@T_^TO45xf++*2%qWmEHO6qkVL}t*WujN$}(LG=LvJ_Tc!Hk1uiC`x5w?Ia>)K zC>8!ILZJMEEM-swE^rW(fxIL82*TxVe{D~X_rE^Unm_Dq6_JxBUE5Bj@zibHRZwq) zx6T}@lx1D^pH`ginp<*DB-=-50V~UlMGR4u1W0lfRDAg?L$QIZe$WV%%PvPH(%)(l zN@a;hI0qvK2j?W1is(%S8*=l=k$82QTajPBc3_K<09 zvUKNkmY;E!-WdM?f_&SkHy;`Q0Bt`JFh%nr(*6tlG4RYXk{kDszNh2OX`zYRVUK!B zR7x9C{QmjNq-Y)&2^s5w95sxUmJ{kB$1E^+YcOPq0fYGU9o?~%(&Z+RObX4$1 z?Ee7Z-wed8t|qlXS$@7m?$T?!S$Dxz!zH_|r$00nd@(3tdh z(!zpwS>9P{2_tUFaxOHr2&V^VXc+v;cLv&8%lr-Sw(@Rt`@KM`4Dj0%OuPAhouwFPI%NxLh_#u1gh-|jhEdnUEjyPkba{{RtD`}38Zud8>}Yi?%x zJshv(d~tHxUEV@`Iq;o^6oA&crNqjGLl9SeK zN>3xqCkC|Q_)Xy0*An;(OuhpEJ%@|6DCQvNC(62inCBlV5zoj-+|^HpXsvz5+E;2k z)?V(O?Jb?3&FZ_9^U9ICk2Th*^C-KnR=z1+J@oU^_p$IrosE^0qTS}XxcEu%*#o+GH^o+javB@E*MW1; z8Qw|Jh|d^@YN#JGWmBIl>NaLGpOmY|EE`z?+zPx;yZu|P8)(gN zj#-GMC0d;+DP3MPtlLUD$wDxd_tn2rC&l^IDzW61WRqJ~>1gZmeD>R_KCSRa{1+qs z3YX!10B9aL{h+=b{?ncajKdwrfIn$Jg1-+wCU}1OC031~yVfo|DQ)5vj&UOy8b1)n zE6ozG+8+xeba!9yQ$N`I;yg0V`$hi%!4!XG%l%^YK-BzW`!ak{@rUgBdvqC^S?AMy zH>YV{FVNziRFS1NvntzO0M_?0{h7y=@T}hlJS#i-vG}(4PSnE#7Nv9slPUn)l??h# zoEFSu7+m=gDZwBDU5#tsfZib1ZJOTa#XbS}gJN*;L#%3$*y}MmvlKSkwwAD68CP~1 zTeoFxxM<4mO8Lj(u1i+Gy73gRCe&zRYEg_Y%fBq8D7~zp`gh;yX!wbkQll3twBq2C zoTpATB{yXj=1CREwJ9_bvf<>fQff>m?aq@ye$j1bA z7|9(DM_gu$>Nfj9A^1IZJ^&|>N!l`YuK*L&WDM0~szID8oPrKQ90GcBTaC;?=yFEh zazlHn+bwOgTCSR{KN~%k>i6)L{d;SE%dV^OSM$-E@%@+_d0>nHIXKU6yMxX^* zbPE!W0K=;s;DC6`0nP_Oi~*bqFMYh5ZSL*ozP_nz(T}VD0D;+j{{XK;ufs6p;N#F| zX(Mg`By`CKf<^{%MMxt}xM#s!XM=?!CqH-`V3K&rINDBm;*POvF zaxm_=%9zI^BPTgL;9!clwl^m}U8|@m)say1j(OTYi|=qU2;G1QvNX&0&Qc^C;2Vg+ z11BUZmL~ucjk)z0B-2i9>nHj4)5+`AbX%pMmAdWP$v59bn*Od~zlc0dE_Tg4V;Ch_ zA;M#U@)a1)3C>RgxmKzzdE!|}Epsp#7zXc+!=WKqwnj0Weqpg)TIk2+{q!TJLP+RF zGxBs813AFJCz4EyrUAg4jxZDD$vuzHfzLS^A28fbO45AN*|yuW)$gZEEv^1#O=E)~xh1mqK}mwpGg z01GIH1oI$wIOm)oR>Gf@WOTzGNCQnQbo9f0io}t~A7iz4A#gHxMo9#a#FO`anXMS1 z(+5jnhai@Q-V|UnlfW3j4cn<0!Ba#bZj|F|FM)0D?)2@Zs_$L(Lrw1~Yp#;{d8PBz z&bIMC!?;cpPPAe+j2$}aKnck_FkVME9@+jZS6OG{&jUhGrKOAmB<^i0@d^^eoEX;y zMo%OR4ZIV$RX-`ROnT+SKy!noX`xp;@%IywPSV8VA&A|;CO~gf{a=VQ_u4QP_e6oo zJD-9AFFSB?zXTJtfEz~2a>91D#F&mN3*50I?0TBKi~z{RxpK&O z2Oe3$&j2we$*#4Xe%)A1o)f=}XNl}q-*6ZplB@D$9ixHQZH^QG>t)f(zMRO}B0NWqz0ICcb^2b0(ebe!X7XUsl@hqWlk_ zmsZmE1xVzLfdKAjUU!lK^J7K8$;tX*ijj-aUzWg*c)%kJAM9>OJgzw85B8gOG1q9X z13waNpCPPuh{sK*%DF^N094-Yqz*v@9N=<#(}%<@6|g0S?KwQQjR|4K8|R3lu{b0G zIXEOP2p1W?`fX=@wCL>g(@uo)%G$f?p1LHo+wlIiK7|*J!1JR_DFldNQVCqL;3MKLh)3PL01nny8%Z5-0Aex0 z9F4;xf@*Q`8%fB+%AgQWnPYkxM=Tg^R$ZqoTaTf}bFJX@e7fsxFQZ-c)1$Kloz}fA zv%9|gH>X=$WnG%;S-u?8^w9|TOowV88tG1h1 z_IJB@!1D#E1Ou0Ac!31`-wkzq1XU()G#@0=YkknO-o6Pk1tAybSmQ3 z+BVKl%eliaT%JiAKvRrx3+D88(^lKrJr$Bl-fvGME?c*wU9OsIqO*2dU!v^Zr>3`! zJSH3dMw?f_!G_yQxV&Tojij^@?jRQEq_Zk=NoGhS@y~{U3YxyBDcqn4JS8NE!=e4+ z*|Vz>aHMje=K!fAgI^L_ry*cMGqrZCOm?eqRx3suumL0F0Yl(OGMpp!dAA)oPMgw%nhm6@zqICrHv}vBZD0zoDt3IwEZJfRVxRDxX$o-0~Lxj+jKjVQoBvVKRSc+9G~u{dJ=LzQaI-(rye7R7;Q?_k4dAHmd4;oEE!dg z`yc>G#&Bz;NolUO_<3P&n_B%Y)!wM(oLY8TF8cXCo{zTsn_uvn!npqci%S3;oznQE z0&|hO9!!5J7z({uHv=T)KjAotFx&96PE*@HEK|VUjtK97z~ie7ADCA^_Ui(78w&H=z;$j0Fb5{r8ZbXKysMm%@*epmOUD|5!v`k> z91uF>g6B#?N{h(xyE`P7ATgg=PDifg>N<6$ef4d3vfk@u?AD)pAG5mN+iBPHeYLil z`JGgs6rD4l2Vdudg`6@2ka2-%nK|U{QWy=vjzOw3d{)Ap-VD@2fzIDJfsEvb`#1pP z0-*3oJg5e;n^A{o4|h6ok>{}6fC&TvZ|lioPZ$M>4AkGXSR5050Xe}YXN+zHfsoDz zAPg^;i~=+AkVNC(T{LNST{QE*e<1dH_txFD(`_1md*7vrB>23iD-VD*W6N@9od9AE z2w$*`pkQ!EB$7b~bx@Py&Z@^2{s6lf1O=W;xfdq@?!rVtKX|B88*w-b^47FhQ@I{R z#7Y2c0eYF^oy=K6fZVY?Gm)GwTSaBoLXaRwsgEiHCB^4g<7b82DRP)TYqmy1h%AWNF3Dw9*TJ~;AGM%}dlJ`^QNojb!yqC_#b!tu=(u5o3SCy~P z#`j4*HER27tG&-Le-nIA)ubxA$BK0pW+cU-=pINRfnpVfj4zA={Gj2LvxAVM!+#ca zX50S&2=Bx@y~6>uO;NPS8Ar@Z8;>S6VxWR{gS0R|-5)|&-JL=#FNw8HMO2ViN^2#F z0)TLa-QkWb9jpt^q>M2Ok2LmLH-oQrAKu#dU&Ok=$NYS2db=ACK6NbOJymVQdFql% zfHZOv$QUa1#|uN1IZ5i(<$G%RQdWM@^D5(O!d$91c2`Z!+55Zu(P>}G+W8+WL-1$E zbCoyxZ-e|llb&6iM#JFO%Y1h_FB;`;~(&qd|mM+&}35Z>AG&2qCgqQ!Z>S-gMwWd%D|r}+W0tg z+W33+RrpJK`*gW{YvMVw0~ljnKr-!jZ!zN2WAb+>bG-BdMsJsBf1h;^+ZV==MKzbh zuZRBt3;rI43}Dt9LX*e-EP+DcNglJ~x%GPmopQs^w$QC4CQZjODoQ+q#XlTAHh8)Q zw(*a}A02p_!hEY}_g*Z&(=<*(p;hqyku9#0kg~D^1Xd8oh4R1zGM_SerAW4;P09;J zDaQIPRb=12)2tKMQ`3e4&y~)ra+6n4e73ua(Jok}==x~c`WH9A{{VpA58wX)2^>ET zJS^y2c=6|n^w_S{s-qG#dt3LskbvPf8v@2a%)?-2PBT*R=j@r`lF(at-^1&18|;m~ z9Q-2H^&6%jK0@m{)rF;*+#Nzlip!P-0yIRY=9E_OMg!d1Z*EzNV-J#kVzFc9E5tS@%GIpC* zZC#~G7J4L~v~c#R*)CgDwfb2aEVm5P(MtTXi*8O!;kvV_$km>=h1%WT=e&5E<7e#) zW;yPxB81SZ&Vq=z#be$sGMzS%0tA%)Tv;e^XEnF3kfiHDAOr{ND z@>g%3dG(zxDVd0E&mftnnfDcA<_6u=F#v`%bnl4wHiH(nIu@$EOn1^=MuWck$Il@h?T3sPPBGdr1Hw7Sqk#r>F!b$<;x|0acG985k#OpIWbU}n%^m>xR@RLuO!F@YXx;e=QQ?-RR zZC%RFvBolU$XqBGJBY&${{Tq%Z>CuUNWL3bUa(~%d!G_S@~Pb+8H}{S@xj^U^2l-X zo^Z7P0Exc}6KHPC< z_mSWd8DGk~M=Z<2l>iZv4@`GbuB@)0o{O2N$9A>6q4K&`N-YV_ExAD6kXe*11c8*|{X=wPY3Pqm0@^Z1_H3!QIVm)R1M_5l`J++>aliq#feZ37F8079KUw*=PBt*vEY;llehT|Y}k&*{PoQ$sk6N7?N`%=SzHA_Y(fC-Sca&SVD zMm;j15^=kRu0-m#QGmzd1)QO>-1u&0By?;avw`0Pl~ImP2{@+yD$$~FjpN8mjQo&z zb=G3od<6p1XXhgrP(aSifr{l=zk2pdbM#Y?N(%n#YLcy=YDg5ha#|e{&16ZBT8bjn#=^pwpBB=O3MuXx_!rS;`M)X z015sE>7fI}zZAT6r~d$Mn304fpF{99uDz^V+^m}cx4zSoe=(y;k$^bG*HLZVU23Gf z?V{znUS9HVByuEi`O)7I6N0%lWy>>a(Hj;8;RRl2D z*de~!u>F|63wVBKPmO=IAC3G)XvrU&;J?}P!tr=sE22SZBb&zlJxlo~iL)6}JTV0B zvTjy^&?ktI+jfh)R@Ujab-TLg$%>njv|qf|yCjvhcE3w6 zhR)6O)ARGd+5>!2zmrG!QQ!|8d}7wEWI=VL{2K5t#2<;*cG7SOztk->Yb^syjh}P< zqFrj@2-JC#N~jui`xnC>@J{dAvgk#rc=N*F1HWbsHh9O_Q}%@Tr=<9U$CAaE;aiIz zh5rBz{{Z15xQ_SEk~qeP;zok(&nz)sM;ua#m)HD%`+WRIvapLs@dw9A{1@RrAyN+x zcp@JO{0i_~2@0!-EHobpXZ})!%&;?S6;oeuw)6{>|D<2^Yqn+AHIC z$1P{ffu->O0K+JBpMif2Ws*Q4ipgv=t1lgRzDrh96sdOs@TJV~hmHh{xSGDI@NdFD z*{Ak-(UZj<1NasDKYSF1)c{|Jem>Cj-yHbLCPt1Kt{dWK#_dPN*S0dSbdCQ2v(A|j znVMS|UMLig=F7!j@KR6OgT&UyNAP~FpnM+E!Fa=X4@QGl@i2jcvcUc;@gnOo*~mmn zP410r;n_)j$f~IXar`;s-x&DE#@ga)KNB_Y6nsIv*s{Z^_}|7Fr-^UkGe;s5Yj3LD z-8H;oR7H5L?qQ4fL5lfhA#V>6Ms=K;b8Tv+CuP&SZCUqLe{u9UcM4WgR<}l@WwqN) zS>D|jO%g}-oAJB;3YGgZcp^h-;@{dc#XlLf#Z`)b415`}e;hlc4F$ATPp;f*+8@H5 z7zi85Rj}4>?jsQh(%RxlE|GsTJaPX31)J5^Uca^dnZIU_hW-H63fu_(ApB?4wLgwu z5Wje=vESPGV8`L_hQ1!Vjy0Gqoz9Ko*dc!|K{+WBzv0ET)yi6nYiR83WCSsu7#`vG z#vCI50K~#c;D;*Aj9^Wtq^0b#U)!~=vjozj$ZitqJyY!{WC!JhY4ICtXdH~8 zkdz2A;aQ1|{K|A|xip-;=F>^Ens&YPx1HQ{Rz}q^u}LT>#>uAaowizC-u_#C$J2it ze`(L!XZDJ_xtrt1$3KX_6>MakUM~*cYnHk%fNe_3uLL$f4tzHbo#9O)!q_BITiI!v z1)^KDF~t?VvqT(u4zY8mH;4Q`r`XwBY13JMYc0XFmf_{PN$( zbIOpQvi!xvtd6P|or?Hu3!rwb(v94bNvm^m zySuG!{{1z(D=cy-nOVomGDJWo?YUH9s-!BI*lw3;kY=5tMQoB3gptt+ zEf_1lyIXxHNtVw|hT=gt*-gu!SBmMJmx-1@3?TqzMnsIt<8)4B3Wf%MV-1IOBI4qs z%@y{ySB~3sv$pzaq03hv8fm>| zxYV^0%A~iKr`THDPmQEWA&F#&`4TWl;TDvCFwYBSiiC*`5o*y59zqhUy`%%;-modkcvC(FdZISO_T1nQ@AmFCgmPS`0 zmD)^YkEQ6p4fF{NA-p{rc0=Jk)>AoWQI*GC1UC@Q!-Yi z*Tj#2e-A;mxcJHT*`h+ecf+rPTDGyON>$JSZ?AaH_rp(avgd45!lir#zi{@w8O=yuI5;-PxrcX4AV#`Zs$#Z3p2`jCBiG@29oA zxw8?+ooeFO!`~0QBOGgn3bCcOlqZa;tZ0!-E6A$H8;j$&vCw=u42ftpt3MK6qjRSC zO2+3}w1E-Omyn@bJCI~$nnada9iqf*4as=oUn|uA0BJvmFLILjXW-9|zAWnTGszaA z@t4QCZ-;bv+7L?2d@JFLTcwf&^43;{U1&3Tdl}Hm%sDR;{?q>e8udGP?5zAn;SYp5 zR7JLEUk3a?4W<6|2mNP=E+13X?Om9J7cgtqsTq_-1WO7nvgJHvU%O3BuAd$4E>^Xb zp!Mx1zOmIA{{Uy!t8RW(7OiXR87^C=7^fti^uH>;i&b;%d+RID59!wT{vx;Vufop^ z`A5s~kH+5;N2C7$Xh0q{l5Y$ADDbmd_=i-Ti7N%Y&E@*W?GVY@Wlu2HemHyq(e%ls z(>@pcQT?qo7^Ovm_s4qsd;n@5crOs6(k9F3mr^#)r-ptX;@wvR$F0I%U@@*OzttYklvqy)+)>pSTdOf_7 z-rPv?-s@V&{7m&(*z~WOY23M0l4J%F#F0O4g4-{WU@&&lm zrE3j29dbTfI31LzW4&W}pKAgnLd3LM$vZjnUJX9l5O9`Oi?Z8t3@&1YRir4PSTkp0 z`9m><+gj1X`^%X&k>$PN5XGIz7a)`O|2+wwV-=%`e%YftKd!Ot(&#F~lH@?UUw#x*re;CYQsg zph`}odnpnyw2*lgbGTUUr-dR(5>SY;KgtzWOmC59nwt1~#G1#4{vv7`Ux)NNq|TjbzgsI71CxG?ZN# z#kSOKCb?s*p7(37O>d(;OrC{WnT8LN9P)-HoRnglZnn3YJRtV&+z;> zxBZ^~0Ax#V4ty~1mxnLk!(K5@g#I7#XNYe;AnU#+_=cCd)|KNAh<-eS;xC2uUkZ48 z;a-`2F0ZB8Xcqnn)7#oyu*nWpN{4Sz?~wJX7I;tPE~Jrhn@G)uAlrQ)%rCC-^`uj#*y@ctfN(;ZTu zE1RtzO(fe+rB;``({R^IyG~ba@;IaWKg4$&R#C$EdAY(6!q$sd<&14l3wcU1=1N-o zwn;(_*(R)gMc}X5deZU_3F}`Gej{n04*VIfX2wheeRQ~ zUuiR0Xx2UvJ|vRz+HWsV)En$Dyi%3Cnq5NP(<9>N!7m4RGvP+5@khfy6?{+Po(RN4Do;3w5<-ScAb$W4+5YflcSd4O&7}kWjJ%t!k zbR{^qOH4*Vo=SM5;Fv1;G3nm`BSGB04>eC5UFAdWRe722 zx4UIqTYm|7_+Y*J2*@&-Ssg7U z*&?f!NX%YG!_TJbH?wLJ>e{8Yw)(t@9G}_$00%GhXl?$(582q+*~{ZE4!kKXvLQ*8 zOV2Va${l?8CH3!ze;2hs2KZB7@Me?X3q4wI5Np3})Q$JW4-@!0NY8?_$#knLIeb6= z00_s3mf7_~;@kU}?~_@a+zVeO;z*;0IZwxNOIX|sr%DY_(39uIjqHn#4)lKB%}gU@T_c;Da@ zR`bgw-fU~;pNba|OFgV{&o$5@FDf$dGrEy?de}lSLi!^@_+IX56ek)nq_UXIb(x6!Wb{pSaoV=FkqP=ayy zQPEk>9DM?+%Ex4wx-&TJ?dSkpz7>!qIjHogYSd3(F#ds_*ST1k}&5G=xx;T$| zu72+2aKHv;AbhwxxCf99++&Q9@I9~XC-H{mR!Bc$ua59OcbKpIVem@Ll##E(pNM3KTmo?YHeM@rfH{&+MDy9X#OSHJ^>Y0rbh3;!r_`R)P8`btTN2!(P7Niic#J%4qEF+j zl4|bluDu$u_q==C%O!&zepOW?IVwu>00c6Tz!=60XDzW~YDu?+V@ajDmOFT%2VjzU z9Z@4| zLYH$R+rY9Yo_lU$e;)m%Kj5Sm{{RF&0RGYc01~43eWU5#BKTwbKWaWd@a5&l?Hllu zR!MwW;w@g=z#a|J6HD-a_P>Z^@f2P!@dlN6mNxOpZ*s8P+b*T1%YS7&mzMZ@pXNA- zQmKZO4}P2*leM|!2)*Ld-)p;e?eJOEEKXlSrE0OJqM+Jw#b8@s3X8Ya;@WMmhAvNJ zwP(42XFv}c}tkXhI=f3@L2EoCP#^)&SypnSa4NFH$KX{j~lIz_J!dhNG!!dQ-bc3(gOhsrY`zLQFBd(QZ}qqQsDwNfqDV zDsWE_(vnll@i1+#iiD!Qcw6N$IOfSZvM}!J{{Y~ec9Hp)AGcq?$s_&XKViPrbtYqO51yrTtqSGVSoXi#RH0}T=5<8c$=`$E zejuvTS#}~;m)W6JyRKLKjr!in-E^^k+PPzVv#gYC)Aws$&euzpDcz*CZ8ndd@4g=Y z0KtFtlcj1t8~wDuVb2Trg59P_G>r%LZH_G>TZ^l(k$t;Y@n?s;QLM=Yt-PxQXGyd0 z>&h*n6GMA>E9z1I04E=^x50lBe%+rRJQ?9HhnlJQGq3!0@XzgMKDp!fxYi@_W}&TV zS9hK>xbcpmeWv)AN}Bsly-ia>wUffJ_?qVG8++ds*bQoZ4mJ<{ackf3SWoyRr-il6 zBKySOwFZ~sogQgd%)ann!~Xz|-YJ&eJ8>h3&Yj_phF)CJ+)X3J3nr;?a;qe>EH=?b z#lMfw_$7z!9q_~UPW`RE9sEiCslFuY+K0nWgnknEqoUix;D3eJJ~wyOJXhe468JjD zL9*AhjW*X;J|EOm#V>nzt2)}*TFYlOjjR^;x`oBWpV7V^@^t)Sc5?ku`{v7dYYI>c&-vFPw=YG zUlOOojYChH#Cqq0z7%+W$H&DF@f%w4yq5kc@Tb{cCI0||>VCx#cv8p1-UaYK?N#Fg zYvD;e8FrW61@KRVq4AxKz3#txr`+mVwzcDunr5|oZz}%)Xn2J*OS`v&?RRl$*7xZg z+IQwJ?G66`1y9nyX@A=1;OE8NOTv1`!VibP3n$agQ9d50Tt9SheEb{_}Sj!}; zLdZZ?LI^R55FpO=Ck@nXJEO~PAAlC$@NsYa60=9Kwb5*+{h&NCqj*0=vC{O-4(H%b zr7TieEsc~GR+hIKR04rtqh7>i5kKvtv=2XL1NC%8rnSyc#CCJg;}Hy zuCEbw8`I+DzuW2ns>yG4sk7n?k;O@7m^o;gwjz^ucDrfG zUf0^!zWpuxjPn5G2L$rUFnBp2bpU`uk^v_;02~ua^SS9D0044SDu8p4*$fHb41vxt za7Z=ya=-9!&-@b|jCk?a#mu@RpdSJLC?l@qd15|M(K4a1s|aj)z=n<4511+^{2Vv` z00hfMWj;6f(xpHl&%oaoTSOV+5(vZH#cCvC3baU$WOQKRRY_{7_R#3EZyhEOq zI%AvQd2bwL3v8`AZt_VsuIH=P-nuv6_fWL(oL)q-k-%j_ImU9!ouG}&mQ_#*X9^P) zItOLn17&i4Q;B0aXX*(Oj0NbDC|q)+Cwg^OYGikviQKYE?t!kwe-A6Iv4tNCjG0HGykVT8ddMpR|V`=@a81Yr8@UE_kG z&Ni65;Ih0;H;~y-qFZ?#7_yi9>fmw!S1QD=GBbmZ#P1D%!F@mAn?4}F@aBuDd_wrM z;k|FfQ$YrqXW}n{zAM*D-CbPAXKQNLKMiB?t-J>6St46w8U?Gs0ycMH-LHKQ={6yEhC$BaC0QPO(x8NOn;r6Eg0NL|3t<%rpuZkLXf;>fOZj&pu zwawjyq*u1a+V<2pEfc=BN&Xrglb@fJUyZyOp=nxFQp%Amm#;1Swoxib%@Av?V%9k1B2D`iH?>cZ3Zk?_8$t;?utjb!%;^cu(PWzoBY& zkPY`X`i6&nsY5lPiS6RKisCD|e?{PokJ?n4ql3gciA6N1){;u;$={W$wAJk<*JRee zqHs2Eg2^#;Dr55u9v+;z9C`6HqZZ_~ZYpi9BCX97^wV^Ggl^O_nD9;k$=r6a4f7n4 zmB#Ow{Jb#(Xas26Y8%-@u?l*q=o>A#5y1J52Ogy7IVbbkf8eBFu?!oR{ul2FhZy)V z@%kqLH~D~Czrw3|U6mDDNY~AlHIy{LGVZ-6hktMX0NA_4S8~N?@#^O0NUi6-n$pkU zkH_21K`m`9B)qtkSSQ06=8-L|;+}U7R4h?Q;E2GTzfs0;#%Sp&Qp<4`f;F(O(txKZgDvoNHbt@aMrn;I9psG~FKKQPl4y)qW)S z!^1+&Eo^P(xYRADf(O!LiJwxE7*<*0=&V2BvL6QTbx#WEH-8MZ?+)Miv&Q4W8h(f4 zPlz4|)4X81n&~aAV0bS~d;9zA#)s_IR$6V9)zy}#tlh_@*lUkGGL-x$hGsK@kt%Ut()p6^T+n){{VuGe$pSY*Nprt;O`6kF8F2f z9XwUxJAV^J;%!zd?F++czVb_LLdL~3eRIV6uB|SXkEh8z(n(|{ZA#2WimsB$;9z(^ zGsNO4;o};7^QACoJb2va@~g+?8UyiqER)xb`nct87C%L5sq0Hk-4$723&pC1ZSKMF_PF) z*vZX*7*T)0X8!rF+VhvMgfHMLb=^i5abkHU*M45fEGQMQ@kT{h?)%yt8QvK0x2 zEOs}$ctidRL;GREuAS)dPdQeR#66E z=-(IqAuN#GTg7p0v;Gr3UMZq5NhAftkj$@aBDxTUP$fkIGhLnU{2VR<MW%z4#aK z%XPSp<%A>07JxYN)zwYzw{alL?IB`~RifP_sVouZzaPFNe%bnm#IF^2=i+|1@T)?# z)Vy`$&3D9e#iV$T#1h-v-FTNPPRyIjd38WR|a?a2E=?oPsqh~#-ncheumG7-BrkRzm8aVbwv)lOhMw-RE zF{OA4-o|+(n@^8Xz1O}ZYB9+7E%t@7v9X@+`%jAc=IBOkC4*0$u9|(zy4~cNzH|Qo zh1G5#g6HxO6?((yBp&UpKk2-rqDq>lUopvX)JO=*0Oft@VTp%IZ6`c zi{)@tAeG|c)tn}--}tQBwwAN$2b@u-Ngl6%r(n)oTB#*>KZ$$XH`y77Lp9wS@pC5c!_#^OR;m3mf8gxqy zN8_i%FBSNE#9kWEJRaJGmYolY{w99U_Q^HIj=E;4s$SjrgT%iGwWxJX9`8}L)U0%! ze%r&3Eyuz?vIqPWpT{4v+k9QuJ`MiLz9{{od~@**%fSe2bq!lu@XVeW@V~>2OU8a8 z@h+pR*!X+l-;L$eVwm{mOUJvO^1xc$sqqe>tX!zP(={*AYd`obr-}X|=sqvjbkF!E zC&y0|_-|YAb+msTd|U9R_Kxspi*&yNXxfFAuWNCnYThu=G*#1n9(|U|J9zvmo+G;O zJ>H3Qz9;c6m8KnDOU8%bxSGCogwC-IN~f^3DbuGcO675Msi}J^Zlh`5GjfFCQZkxP z+1}UvnPcbib2hCP$yz?nnp!(9dbWIuQCDpEzv2dgW#Nwn-P>P$ zCwVJYmjI^5`25%?GMGi5Ac?;d*UYe(eTs5+RueNNu_wRM84KcYvIe=OYaeC zx=x_im);@L>~$!$2nUDgz6SC4#H-6&ABTSobuCLwTQ}7#HF4t2S6tHcI1>8uU+m3V zZ9dXp3ES(|+D?h9>H2+!qaK-Vmp0Jf3$uBvi0jfnYVX^-#virirIx4TuY($|?B(#| z;4X*bJpEZoDC#}JQd=9hu;o7 zU*XM5;#f8#Sk~w++yFesHxOe<#Expppsox`EeM&A9%$aT`W|oZv}djj3Law zcTs6BTSYX~WxceHtL{xN{t2i1RqHa^+TQ#oOFt0ZU2D2!mxDjybbKSxylri*=$c)% z-l3|^Wu{3DkBGEOo58N>_S(LkbK+Nt^c&RFWYfjXmEE7_mb++{S8_>jeRFwhIJH|_ z=r0BQg*KT=TrrRAt0d4$u!}W&Y4pPrui2I45wE>B{1%t?!nTN6YBrw_ppq-U6TA4M z!=4K8jh3OS$>Jsrs_3mfmGsc)QCZq*4Ht(Y(X>wv+DG>Ib!|q-YRe=xe+*uJ(SHr) zxSkIX{4DVohvc@>bh{lNOwu(w`1I{M))}I-1@4x^R+93^P153yRq|~T=Uu##S>IGy z1d?5SpA6wRyAM27OzO516Go>bsHznwDMnG8l-!kCsVF7v++_%>yZcRSc>G6?;Td7+ zQ_ExQF)66Za;I7j?OjUpjMc4cC9dshbb5@FOso6YT~}ZxX`2qp82<6fs}dcMlqWxM z5u9eJODJ%2ZkZskUo{Gmg#pkQ;w(=XB;m;i0In;`F`da1$L`amC|l5q+@kut502Rw@1tWV0NM70qdxj#k1DHU>?%*2$R*FeRVMlI>pK^>BY7E=v`jQ&0k)c+Wi^LI@F$utv2*ljcRwb)4jCY zw||p5-8WXZmi=tsNs-1|A}vzgij^NJBn&G2it&U;R&2QCO4jwpp{6a#w;CJyf@~m}KS5+)F$rZB3k^tZl z6tR#4WUDD-P~QAX_+Ko`s1F-kF?knr$D!*JxX22F{ydsR5#WC4JH8hIUNA*-)y7qn zmX1kTww1J!j<;HGe>HpGc6HIjVW`pftKpQRC4Op@6uDn6>B%(Pw!7;6PQmXjCA(&h z)xyW#TOC4O#RR1kNVgCto3nTf>cv!U+mb=XpH;OtAS9N|qiB*BYrAP!hlQV;i>sB4 zxZe`Uu`a?{y+;#|h+9v=j26GUB0gpp-yI1_REKqVmqW=Q!N z7%e~eS$_;*y=hOxYq|bV!Ow%Wml*^jI!t7BJB!B36;y)6pC}1{xMC|)iqclHyY_C~ z9hb5F{3nj zL9vN|kk1<{9F9`!;=h1omid3-FTIL5{?7`*{{RTiqb}&35C(=OwkoLboRWE`iJYf( z2Cr_9qKfUJy1nnBwVmF*PE?#z_PAE>XKJ*fwYHY#vrlXEeY8CS(KP+G(`sW+O()Kd z3z)P!%cs;HBy!Wno@K?vGfwUnLLeSl4uN85RTO$Ons2}@W$oecZl$gGS5t{xNps`9 z2HyKjxB^v{J9Bw)sA=F&Ado;nH*w1}zh;S80u#a{@!x>0?QMzpi*c_`1O!8G@ULES zs~d=dUTPN-SO^uP+cP{D3vd0OL;Wwdy7U^17h4X(igAjBU!L8*9xL){Av?lWjYuwCTEMT`Wc&LE3aI z+|*pEQ@nQn0H1Yk_1#%tu9`0G>^v1=0s9}rT_;PB+QQ=F#6JCW9cXIhPdo66V zFsW99r+C((&j-w@MMh3`v%Tp?P3@|3P3>-n)SnYRDf}Jr*NePEAHt7@66ty%i%$C` ztUnLDAET^GW2R}g)7>N*e!nJ>VR3VR9mUK^9o6y+i>QfKo*z1I1JeE@>pmIqrm5j= zL*YJytJ+-Z6Hd39&ZVGfI)qX#$!+0l`z;;y*+f@TNpdaQQ`pj!MKFsn8Qvk+bUO_= z_N>T>Dv+kLb9b6(b(+C}oq-P)Z!qSMUfl(cC-oSRFeiz$tnxEHxPCM=}U zwBTGvaL_fpi*potF+4I&6H3UXoxHLdKQnNU=V)QghRUe8xHnoV>QQp5?OT%NYD%PP zK2+Oo-tDZm=^4&{jFm`9SHn3*6O7#)D}*AZ)v3;wBM)~kcUGLfS|hRXFNyq1;$IDD zx>Uamz8v^H^o>wzt*Iuxsp{I%Y)AH+Jw|;-8>`FBCosh+wwO{BNctLuGt>9voGej?YAZ8dKn&8w=*Gl6O0uMX+r z;N7p8Gy?BO@YTH2Z&gTCOCf+;ppD{3D5<-r{9L($$HP!)8g{Fpc<;h+Uul{LkF>uR zYqol%c3vmAd9}vXG+X4<^wmJj>8C~Et6vPl{{U#ahgpwRd#SFa^2?tRYg1dKc4tYl zhT1E+7UIKCwpo~5LXSKX-prHU5T+MsmPv9qy6|(Gekb_d@nghVU&DV6YP!aiqm$uig+kd2(EK{&6o z9$7Y;+e`K6{z&k#nf76bZciVGpERtaInGz+Ynk1q-P@OYtsiyY++FyR{{T;(*G2ei zqiB#!$i?inomxo*IFZZ~E~~0ZVRIBn9piVlGOiuvS0G3^q|-b>XB!P`O;tPbm@YKQ zS!4l}84}%wcB%ycLIX3F;ma|>o5UL3((Sps^3{n9tp&VD;pTGa!WiIjR z?!k1f+ST2-P`Xu(!6kDl-P~#NC=6KSMZ8Mnjm3PNmr{2ZlOo{-2HaedYiT)4S7mhD zcUx&~-rC&qr-`j8DNWzqT;A%6do5!W`JL9S*}k^X9UBzJ1X5>j&ACw#mkL!+&9i`T zPB!f!0VEKSBoN4UnBzJ9(v9dD8Mr%2BN&R3H|z@A7_K%mDdf(-e7#^z#P0J8JMAcq zuaJEu0@|Px0l=9y&RZw{OiBY(13xGh@P*RJwjjqEKZZ!`NYH4M8{gv`8{wCHI^Gmso3y%-#7I*rk#*gAFT}C~2*52;^+TPY{ zZAZg$Sn2k5`gXqso}H%nj%ly2W1h+gqgy$mj^-J;lj0luOC1@PTGYHPeWz;iTxx#} zwLLn^#C{ECwv+p6(^ItZE&bN1Z>o4&<5o*D{uA*en+@*R6afqFngTUGWBq;Ol*Q$KkhzHO*e#G~W!__>)wVR`Fe}y}E0cHl7%RQPm~5 z)-J8BWk=Q|m_68yZyhT+{8g*#xB5N)rGKdE>0ut4x^};Hs9%k9!^23oYh4fQHzs9sHk$qwIu%lN#55**0hNHOX1ym z!^NHxcC}^k-hi^VhvA7Knc}e5bW58UwJ!(iuNU=|5^7OR{hxUxW&HmDG}b&J zX{|*hZ>2{(j`O0%E#2e2dwr{MBm&|n@UpRYxr*Kr;kMeXow8eg>&Y#=8Sx*%S_X&l zd%~{X6V&l-5G_1S62T3XKQ(D^fOwrFif_ZrJF6(q7!dClQh=%mXk&1 z+1=aT*+|y9rKI9WJge&mScej#e(kPX%6w1Z4KrG`Z7%-+L=r~i&pVP&X;}SYkvzt2Ae$D)E44v8_DgJV24V%TRW=>Je$LC@HrBx zw@vL1*#JlN`=5um8cp=NhlVwn^*B~B=346?Xo}`oVpoV;yu~0!0X(%2B(bwa2}YR3 z8zj7B6aN5Yc#W^TL7`0nQ*#qs+4)wJ29npwwvq`;JX1A@*wM#v46w@?*xp!ZJii*A zQz{aRaeUB~-K{9eXqBZDl5b7yt#oEzz7w~NJP>?Y;r)NbdQXBbwEZLEj-G6FEg|(g?F+|#AhFjq`)xF7G2Q9Y z_&!}Zw0%=f)jzaj*0fDh&hqg7$b2OIoIl`_U$>^OcPH$L@ha!R9~1Te01_^#efvN7 z=J!thpT0g_E}<2|+E{!U)wQWSQ~Nyl-g`HIE!T&1O)4!;_9z=r*0nDRUEL+_ul(ld z;f=#;x=r==m#A9E){yI3atm!lMqymZcM_|Kt%-H>p#+9WTjrG!bIR-D{_jcV>`X!*V{^<})!?@$-mcsjhr2 zM@~xosY;}EN-8|uj?s*5b#-kucRsrz#$hQ=lrglaRm1Z`+9^_pG@*2-6y%zep04tI z+S``bxAYtFpZ*Dv@qgi#qjPWYZ&91$%4vx;=B4mU;*N`L@H_UR(Cwm;%zKSMYa^ zd?R%npFNJh;hX&?#bUgUHcNvdy}}3`H{*4BKfs^(EidgU;5`dY_<407QUkH3)ST#QoeWk*x`Q9nE@qCd8# zf_?u0!ANxNE5n*TqW7LZwT|CL@c#gUzAEdH_zU)p@XSukEOh?>hu$Eb_fgV3eWuFl z!VeF4U&P)dYe+34k5llCw7P^-AD_y2%Rb91DtX;GVzBO3jN_wGQcGDU$u<5hZL4>B z{(+ouR|fG72vy-6a?7!jgj}$d=gg;4(M>43$})1hZk(kRYbd0T#x{ySEsK4(PXInu zMYf|3azc{QTg2n$3<9KqlpUeb_^QhS7sN|#e13d|GFn`Nl0H~&qw<)qBN4J~+RC67 z!TkaFx&HtJ^7xnFT}Jj#hSvkfRWSI##;GTA_ zagsPW?SgOxt9$(h?LoD>(`8md==QpVGseM-g^EHHczC%Vh22Y2A~6t-vY*s5n1(7Qs2Hl4z*^05;a%1_K}~oD3)or4Kml zGn}2n2OR;nF`NK-^dC1J7;bC;GNY0}UPdr#Gr%L2=L@~c$-n^P3<(30M$&PBalt3C zgx0NVZkE#Pd%bqPo@wu6qMD~tJkq>fv`X!_Www^+-P67Awah6FqYOsY=1Ym~m~3=o z_K%f{@bO4Kag2P7t-xKSvynSrOj~Dco!J?3 zShmtW>iS&Hu{W0cBz74Ew*@?g1?2@|9dbhzJum?Vk0#~?^IFy!Q0@xmW@Pjm9ZZpi z-Nr(ac7eNU@y}BMLHvBOX{D@rt*YC#v~Jq=)a6yGLB3bZs#k8;_*L%jeS0s#o(HIW zG4SQUCr{Qj2nfa!eL0|naMfZ^GYVUx;j z)0e{9OmlYv;!hLXfESV` zln^tY^%pV%qhf^(#{f0}7}1Nzo+V%1PvbWUo)=Qn%c(3Imh!_}Xo-PbFaTwJpW#=)&0pflxr<8p-{IXB zTV=SFbWag@Vl7W!mN*x47__+K)UTz4?p14|W3-I2?r{GAD%^1jJ14J5%2&Ixd&(`Y zx3^s_v2v7Ttoc^Wb45ivwDjeK-pOw7qrI$o%w9e51OZL?((hLrl4#&4#dEuQv@wJs zfevt?MnE_LN#BFTmp90*5Ej|N+L77Zh696@xh(6PINgn)oP_`?*QH+m%sx8s;(5AF z)`zH>1G__{PkRmPjlN?zv6D@n8VsJiDHtRILXVYsB==@Dww);CNszY1D{N1lfVILfIUoN~Edq>?e;kTJ(JYNag|mfshjbf5WmeNFv`GJ4-+man## zPvxq1^wjF?yg_3Q;5=oip-|aRvT6fw1QbwUQIU?h0G8m9^R@YWZEYUVd}pc16alfc zdG0bYcLHUyo&IJF4i}+08@L?QHxn)g+J@X=Rb)VM$OHla$PI!<(#N62Zd*&{V70~W zO9eX-W!;{;er%n&$m8bwplxi|bu4EtmW{5J?I+t?`%OPCmc6gZJR45;ZKdU9@b*gY ze)_$g^_Bc1dVcfCt^AH(VAFPT*Ron_ud>@)=KN>%ZP3S9zbZ5a{S+WB=rM%11>2O;D5p;e87+jwVk?Tl5hzupf@0N zY#w>W52tN`27cDtvA;hcgk=TkKB|pwNhCg0oyGD&QNUff z?T%XZa$6+-0Kpe+tz~APM!V~(Ls6V;(~`G&`Ny+elJwEu$C@26+aK|6ytO$#WZJ|i z2st6Pt}vhss4L0A$?qA`nQ~9Vy)OeJ_nN}KMsc6@FP!n$g1~ZkC(+Hll9J!qyN*dL zWRz|{Hd|t%f)5>Y{6n1Pp=fMmKk^NTk&pRlDJzWU_*foraq^RaxBzNCuM6F3uC|PJ zN-sso`)PjZc^WFyT06b(?@IU5+sl3Wqt4}IRmc1)tt)UC0xuCZ?cTdu-aZ?Hz{YqW zfDL5ayA^DF9%)wuW<6fr#xURBfuC+R;DOs8DI^bCFew{FqpAWpR^SYb01QJJ$os>R zbIBtt`y5BDq~qK=sN*;!tE*$K;s!=CLCB>l5R&+w-62UUd%G`Y)|T5x`iiu!owl}@ zdbMuPci-OE$nYsHbQw!E&%@156V78uq={4k(|W?C*;|qFF6?#53@AO{gX7451Zpv4 zfz9rqnBlXZ+%R#-Bn%K&0O80VNJ|6E2v(9V2i}=m7$YBefx~C!!93?V=BU1qtPb~t z=K$^rDfvO_MmiDz#t6wHp)J8Iy*;^F@9g1wd%9hBwXNTCc;cLGt*zUxiQiQIPRYN- z`S45NsWHDryG~ai#Uz7h0PQ446E{2(bC57eC5Ul@;q;)1bgXV%5iO3Tf(Ro!mQq6w zgMg>6Vn?^Xh3r_8)*5*^Vig9`bCJl}qa2QKbDWHfnx`j)EOHOnre1&;-*6|8QB{?J z$6&b5K@VMKI0e};xI**j#3?IEpo)ObdLu&6D^%2csaUMG$lTX#hdAK0 zZU{IE4_y`k##iNACfrt+x>~I?`8(SCGF?>TYrFK*-BxREx^MIJJlK3R(Od;Rhm=H2h9i(F$nOQOpK5V$JH^N;8KuL+$aNV`1l}RMF;L0a>*>@B7azQx2iqL#5ZmC80xOn|G7Dwz{vn&31S7K4g>OLR;mu-D2|H)Zuo>VE~Nat`afa z721qJInGyc#-G8T5$y>&cZsB$H3RokHMQcD11cQL5q`fe)(#IjN9YkoMzIf= z8H~2#C0@B7Ds~}?fNM_A;+?=@ve{v6-!QtG;_Y`RU=&4rX(2|zVU&_G!I^iQV107l z9Vh{|wri|p?K-8Ddru^&^I?<>a!457W5Iq)9(z&n9)YN3wVM~UknZ{8hf2I45JulL zKK5UikOt+>2h1>Ya;UDBm)+~H!_}_V>h$Tc)e5#s@LJn`Sfzelovr4z=y+AP#Mtxy z03iDavH<5f*7z2PvMwOovcn& z{fl+kyZm?t;AX&T%x-v~OgR z=7b{d)OLQ}H@3USU7n1^;o(u)S#|dSIzh$0RIZ+y+m&tCUn`^ZgH6=eSQ|Vu;vWWh zow1d-{{V!B3oDk!au(B3CSCj-#yQSMpfld4ucom70ECOcOK1rpZZQqic)=Tm#jML8 zY@D6pgAN!lADsUH+tKP#mGKvY{6DG=2%g4649Y?IU(K~CDxNn2rMTyA6dLO^UmHoH zC{GURJ|pnDgO#^Bjotp6_lx1I@2#&bSZ-_($N(ghf^Z1uRo%JaCYx7JSFbLLGN!fG z{{Y3c>`TKWmn&}FR=O*8o}O!!_0x0i5q)nn=GxOn+=?)ZticqqhsWNIE2J^!A27=n zP)oPUNU(0TDF)TjrJX8ZQ_k_6j4#U;pBa2`5e3bk!#@e{(Ila7~i zTXy_5K7qR+4Bz;FQ?v)6eKyYeG7d>4t&DC5LA_KQ_AGXeKT}@~vS8_29mJU&fssv|!*mDm9D|OB(1J!omhx~%AP%5p8j4C4iIa7$+dN;Dfq8+R7K0Q}hmU=TqV z$>>QW^MC*#6|^o(1qx11G0r*l81xExzypJlNU2dt$mav*IKklH0D0Tk;GQxI6PyY* z@6m1PYb(8U)i#~F6jfaw(0UR%;|xAh22TSUxXB-QoF0B^xgMEnq-_9WoS4(w7;ZDk zDhAaG02#>uFslz#t}m zZ%4Pw$=&%dG!<4c>5e!Gq&IPn4pH$0)^a8lj^iih>w-6S>Y>+;Tn-ze=bUF7h5_A-4ml0iZVf{z;BG_CPB6n6Jo-0IoMRwk zoRkvd86&PR2*DlxQVw_no=C|(b4^O`PcHAbXZX9jcfEkJ*YLxg=x{h3ebP=q;2us2 z;1TPQf(W;EGvf@v^&=eMj1n@#umb}<_cuIJxocU50;(Kw!w;E8PIK-~4c!%7 zhCG0v?mT0;J$*s$aCsTr9rnO5cQC_y1CBB>P89Kum?WNhgUOqh13UBhmcio#ETQJZ}MCIepdwd*YekH&(Z5`*OAtb z5kV2=2^$#Tl?NcPIUs$~xf#lm0LcS!r+>myk;&1#-pWDag;36c94me1VPKLC!E(9E=%c**!099khK? z>v!7A?qy%TzlUz#O2=9}ZKtPQ4UPf97n1PaqzE_%8*q06$pDj)DENb5I9&;kOpmt9 z_l5!B+wuU%0}Z>7M&q}QXbBwODxRYj%yEqSj1lsTjCKU@#KZP5f94{?40>6+ax=J* z=8SX%^OLlL@@@uGYToy6<=ag)eKp^`tzgq<_kGFj7j>_qUypb^e`L`RbP`Jqhy6N1 zoab)R*2)(L0G7*OXVHfzcd2RmgvG{_JVzr1HAz$tl#GQjs6CDV9PlxbO@m93*CSH7 z0Q|gKM!3r{A9_H*^gVXxoZ}2kVxy+lOQoC9`>Ug~UyEA3^<0)qdpGx`Z!IK4AKOw40K+!$5IA5uY|9WpISK$AAG@6h<-RAKT_2nkYg=rCmMfCX%%>y_ zZO8EfI0j#{M8ERl06RzqS+EHNbB0`!F^+l59p|keSkz$ye!Ecxl z4^Rg|T@lrFcehvBUq;of`Ri_mFH6~fpH2E-PfxUQb9OK=&7{D*9qWinfX zI`DR!fW%-Dah#h2;eFN#drcr?JBikyzlH+2V-fI5a7vxdf4Q+-rc+qmCL zZuwtLKJEJFC~a%MlY4UMbeDdK_H6d$_)6|Fbj>K>F~aN6Za;sf+r-L@F;kKbI)lYc z{{RYPIU%%pA01Z9TYQBj_oyP|spT7kj)a_yXTnc{ye>}~z4GyrBe8TNIl&l_LaE3H z3UQH=4^{sFgcC#S7PaD3+A<6ZA?vuYT+71kVESu@A_PY5kZM~0sZ-VxbgXZX-D6!y@(cedMLlKZiuHQsxsVAe8k6n4%-Dvp~w0imVcfF5GKM3@7JG9HqM&BbIbLvm#u?IVf zT-cHT3_e2d$sou^7()L53Zx8I{u5nl(2`1qwbL$R48VcU$&kltki|hc+I~TvEwcsU_D$_SO2eM$LQt*GkDoqFS`? z??x|Oe;sy5NIn$a{G#i`{{Y&GL1k-+Ei9w}5<%NzV|gav02%$tpDzl^TQteO9a&lr z-uTGrK}anW5Di900B#E_>Pd1VVo1YB1ZWJLj#Qo_#9tGBAnS-ATRlI+>#-C|pe_B) z;}Awf+PNY?|=GAK3TU)L9wSHeVKW7`I-Rs$Ex;1CyoUWIahqv6^cwa^NV7pluY(|zr zWhAZBberINIk4;qF{F_Jj!Oj$e7|4S^o>qk(U*OU8Ci@{I_+S=fs#q5KtG4exInDO z3(z(!J`ugSP-b(3lE{m6%sx=e7xse!+>dH~&<$_J!TJG27(W~u!*WUHj@>5M{l%s1nrGAaRy|ixs0DCnP z;y=WviD1#ZQE{h53~L-l$4Aku-Z-H^hz--(EQ(Q7VnHB~ZZ2519CP}%wd1XA8ZQ%g z+r=8Z3^u)`--u_H*^b@29?~nL0%cVP%Wg*1*f1+;d>IMBzPA?Y0b*ykwwRJhT!cwb z00>fY%Y%Rj+5yu|D@(FqmXX*>cWo^-#iRt^; z@25Q6bmdCWcS&iciTUb2S~p+2rrLLM0&12A9RZ41h<6F^gp4?r*h zJm8U|RvfBQT&r6r7`3zO{{RBp-=QuPr2ZK;^liBwhFXaje{}UmkO$zxHu@qagE23 zSP=N{NVeg8a*TR@=fjsHkDK_K(Me)L5E}!&M+`2XiB{(!JY{m=3?KNBI_?X*X*-i6 z8Q^r_3<0zbw zuUUNq!pu4F-j=^NAX!>6GW@`R8YMfhMo7juz-*k-e+u|cL67)G^isbz&@|X#EQEc~ z(YDoK*(%?Ap~CX5=L6zKgbzB!%V#|-E|BDtyX6Qu<2^$X4p@M2@$oam;GFAMN_TQv z%KYGGfB;5bnFNplz#Ma35XRvwwTDmn_Sf0l@BJIz+row>%F2IrP5sX+byn@)s_Lis zao{VwsPK5QY=9)vwaFuLa>Q;)tb!m4R0I(N*9^z!IWl||@T`Qrz0Zm)03>aW>dxg( za0trU!Q2uuGFSof?NL;Z#N82r2gPv63X!r+GUfxHn1EPXMoBzw9SFfBWEw&7145Cq zbqhHT0{N>pt!z#XGDW%&qa*2%a!DeGUj;kaQr6AgL0d?@Id1LSZr3U>#V)gZXuYG^ zN4iV-UGMVLr9Z*VGjS1k=frTZ$lH0Ni5Ia@rP?4y0QrdnXapBr8e4ybQoz95`2OE$ z8QXW^+euuh-HqFBWqbfYELA}~U}qzsxAE?iE)g}jBy4R_w)$WO(}DZ_EaM~ZGfZ6k zq&{~s-iySs$Og?rPGCtR%(6$^g`4F+yha%Z1e8(%CmYlRn9zks%^7IYwWjT6;_RP2 z``KANb?BAz)Qb0$>7$OjF7Z!o_4%CiJ`lT!LZ1-m7t8|?l4#SxAq$=eQg-zi8(SF8 zF^uv0?uV|xtA@EE0|?5YH!!(Qx%-Bz6dG+D1!%_{J}a_ z87gUCds^=8tE<0xwD;`N-_7Lf%e9nrduz8_scMqzuc_h^SnBFRKAj_-tIS$tjJtsc z{bWv|&Pm+LNNu=RIW1W?HkXhB$3u1*0Aki_U@`y%v#rdzBOnkyZ@L=?xzL+0JCMc0Io=3B(vMH1taC%BV!{h!~)3k?bl$P>LHx**ndR5KDc?0GU z+%4SOKpd|APFIH}xc;lFw3kb1%%8*e=-#PYZIPPBDEqcgO)a+TcG9<9dneaZ!o2xH z;cOinjvZ%Z8D>9uL?fXi_~n2ZN*MhmKY3r?LXoamX3xG zh&r4jDynVo7B*Hph*gT&rukQP_8wZZ9s=dEQo}3R%T)G!yXgAMYyH+hu`X#P2d=$W z^4Zzy^-bOHqq@3p=B*>)zr~*wOS?hv2Dy4ef5+U~J>8A0WDJ&)?@?<#J~7ps%$atm zEL4ow(Eb?xm%cSk6mQ~xj9v)%Yivejv6}WxTUfV`b{wULhU{dsxtU1>L;bCmVyh#r z9h1@Y{{S6BuCRhlcg6lRpA5kg_f(Y^cS7kDHtIkzhGUR$n?6EA)|KCibYBjmPpxWx z8t_~w9J$u-Vv|#k$_Ps>r1!V?Qcs3(7C0l5%`1dfLZ?aLBM5W*Mc+wV`CGe-df#rn zH)w|`PSI)V-J6Qm`&oO<{tIjLI-d!C%HIKz1m6)pF#Kcq$8ix>l0OZ>XW*|6u_ahV zDqh@cx2_d3%>Mw}I#3a-0wR&4ucG`h5A4J6&&rFz{{XYM!+V+SO34nZ@e2BX9qQ1@ z8!7XM)uq-IB+AYR~qnSWL zR86Tz74%55D*+@Lc0%viRU{>R7hL_Vz9j0eD)?u^o)_?qvnW{ZZdJTNsX~D^E3M9^ z%V->J;nz-wXd*NUt+4quE5Z}^WTmRsKK84XS;=b@mg&BhdtJ4Gt2osKo+i=szYJ*h@1%HtOpa;pJchUzSGSW0-C2vMX|_nwe9Q_(w4W`D5w%LGh?;_M zQCcZENw(5ltu9#ZueGXM=66ubpxWn@n{7oXr4-jzr#H;4XQQU>y$`fJTl;a_MJvVN zPY1FWQ?lp8l1FuZWIGf$+3oI3Q8OyO;zYog-5J9&*UtVY{i6Odc+ARY@s<9IYUGJ6 zbQBtR2%~DJoo*Ir@DL)jE*(Jff%4--kLT!_cIG?j-Ps8u8v$n-XUdRTZ{Bp^vnR~N zu^kx5(WJmF&A6W*Dx0g@mfAon+d>%Cum;>?Xu-ngm6iId-}Els%PjMmrk3XB=3l>cbtIQJG8Q1^?p|3WaL(*7 zbTwpKE*;|PhZqUG~z{74_{G*JPV~66{v8&sF4>l2FVyQec0HsgL z6t)`}z*Ccu#15mwa-q{=K%j1Wh}UUlAo<9`@0XVv7}^Fv zKPhl|niL@As!vs9?W)n+@AK1M)-(1^>f+;PZ+bry(dh2IHBa+LD`9Uc+{bY%Gl-oS zr=C{|m-;m67BKIbeu~4#bo}y;o>ZTXC(3 zJU(sX+aK=>FWpF?EO#=fR9)=Dmdb_8ZXllRTKa#5wMj7X+lWMg6=uDW;DjUY20`V> zS%$ve^V+%Gd8}w|=Z7xFgF(w}1k_J^+oj zdD}Leg&R0lD#gh~>W_zfD`cejkH(g_R~QUzbg#8tyAq{JtQI(*01$C3kOl-RZFOgk zcsxzv-5AIJ00_s0A=NHRf%dNv+uGVdfU`Mou_E8<7e{Ihv43dT$kHd6h{UjGN}WjA z%bh0f+gc>;rz{dy(@)9na@D1(Nkv^Z?@Bk;+izsFU*?LQ9MXJe;(N1e;cpM?-X+u# z8K#~aS!GxvL^ByYuPyDMg(Fibp6+1`F{3jyYZQcc(rB6tf z9oNL46rza?sSoy7gx~%VyBXXW7yc(6G1Dfuc{a$3@VYMvt@x+LekQYf4R2k$wea+a z5NXz_K9itahS)?<_%0 zZkQyEMhZfuo&9;(d~&a2euoJvwuZG}_YEv#9;m zEiR)J`MN)O&#uVDVO-o)n`>M0=-O7gypv6(qe?cqUPf$R5q=x^c3UU#XTr<>02n+w zQT$2qpIp4O(WSj{Az2{!Tkz`pPLexyC_sZ+_=B%SaNDGo*cV9SXNiAkFN->rmEESL z1vBUHF@-*&@kt;U9p08I}(Z+4(VvrT*FYwc^`*I|a3l-)xtL9Xn2y zE#xxEsM+2K*!o?ck3JOq4w%{e4fqYAYhEt5w79q$zKyF}>bHs9qJTrOmv*PRBc|ggd>N@M%oj=2O*C8gi`);pgbD`T!Bu3id;fC!kIPZ(U zwMWJeh_=#rS6ukw-Wu?UwtYGugP#Dj%l#ikxbhr`th`O*3yGrC^+iTdm(O{Bty;}A zL|fS`F(cai$rKj4Yz+pLrP%ml%2O-D6^)b^8s);QkL0b+sPRP1^2S6ra%F#bqT+a- zW}4zW)>&FoZc|ZFNyV#5cD!EcN3*)$xq?u=l_^R|TU6l&la21D%_%pljMn=!?$PSM zw7j3Pe~EwLS6Y6_{sQ=~;7u#RdN+%0JXv+|aOj$cjC^IOYdVgTHI}`5tLa`K)U0o# zg2PX{x06kiN73}HG+qdFtu?IK?VqZ*)%E ze5!d~WU><|+*K3>1pMWWPT#$`nV18;JUXFhr_9nlf((Nm|gS6o97z6^l4fLWB<*xrh>hc^gpb`S-0U8MsYwijn;(3Jr}J8OGQv5wk5 zILEq4hYHa?&5ezT8IZaa+zaJV6_|z~M4OvhF}(G%NvqxNn_oRum7TqGFiqc7?46vg z(?;x;pFXKt_eWi(D+{X*ss-JkETe3S-)N5kU6t^~)P2&W)riR;Ao`1$Stp~`*0SG7x8(Y* zS6epjDJvx=*1Nx5ESpN&ZkxAblJP36-(ZQMH<51CH-(BR6;eA%6~B2ct;XbJP#tB3 zixVuQU@MO*@t&Ka&)_c?CHI4TKdH`|HLca0cXMjiw>H7P`OGe}=l= zx!|jhgc_EYeWhrh5d1UyJ72@_?^^Mfh`t&4f**#z+8+zF%kPMnp9{VpcpdyleEN2u z;hTLbJ%7jl01>jG6trtuuUD9oA{3WCK7XJXm@mP!7ITJ?Fyk)2Bx>O8W_R?!h+nMaX zvhh#GJr`2=eShGc62>h@!v6pgyd~j(2zbB#5`Wq=Qr0!k3u#&)@YcO^;r{>+{5-$X zV%D!G)Nb?}yW4B6N5UFiy}g#De`zkM;)yLAQiJ5}8%=vCA=3OT`tFGvHQt-2e_~wg zdbf!_!FO>L%m&u|JWr$BY1a38tWle-MjZy*#HQm>jr1EAe=g?V^NtLf6vFli1uz ztqTvfM`w2~q?&e}CXsX9_}fVFe}_CPuK0h(T7HXR@k09M*G1NR1)=I%f5a~rXucZL zH9Iu9w(-Y~t@UfI2f|u~we76>TWMYbv%S}EFJOBg8K#eCZw!}D8-vBHY!ysbJR>S| zjoOu$I#*Ye?aI?vN%A-LRFCLR1fbtT zr_Jv;pBA@*JU?!xSiA?KMS`u5us@dGZGq-drLPuz9ZUAc#nmpW*L{WnH%44K>@GNC9Zl07!CoVqfhB*wK}dSi2)Dhh{FS zvBmYcU#jxO)Ri>!c1|s~r&RBw^L>2n`8F<=8Y-lvP77CgN)}wLt8&TGYndmeo9SoQ zgKrM#I(!k$sCXAp(&4$0qnGU_OjqkZB`~atA6rmnJ*?=r?rmN{D)U-siTTm)#U}^Ojpt0 zvcJGhYvK=qm&IQZ{viBS{h#$u1NgV&HQmpKzu_3y;_-FldXI>7yIl)g@OFc!Y8nOK zi0*tbbEjwm^G}k};(Lp28XH?d1>U7<)A;%BV}zlGsW_zN%#>7AZlz^rxm8InXJvae zcYB{6@mNUKjX2b!6&T4$xk7Sl-S=8F;4KhY5cQT56h= zzLjmF#R~nZ^HjZYXCrCG&b3jNTn{UlE?Hrm&E$Tz|-{26X8#X{8eddb*0%^Siz(@O-IL<7dI=YT-{AI_Kjx&(q=_L zH`M+W{gb1E!QK(D{iM8meel2I;%eU!q4>M;W*-Q6JNA{*CV~7(;_Gb}`%mFNh&4|M zS!!M-p373vWz&8nS?e0bj-7F9Zn}<$nx>j{>mSfB*}L{L{hU8(Jv-yaguGE_CyM?d zXyf1qg+2}b(6_c4XY9H0PQy$7-P3*({7ApB{gt#o9&7&q4!$7idKQ}$9xbt(T)MN? ze0gYo&0(r&dWG(ds9t>TYoB2wkV({~In#9M%C$Q=REkw1r6k&f92An9e9C-^{HZw~ z9hGqfOdk*@Mx&=vGObRXc)~44RcWXxu4qb{c9Tz%a%)>gUhV$?DWUzge`p=wVqY8R zS`DjB8Z?>~m7qhsw8T4LXc0wr>2ekS0DW|YocW~9a~vW#^*`FH;@!+K#6CHEQH5i< z!T!nc{+$#v#~hG^+j5q_VzRh(WR0FJGHIC1qT}r^x$XY|qFXQcH|zFs(9m3JU$tMx zOZHHJK9TUlz}^*qbjq>vQi|!x4lP+5F@gsgaoi-aUp^WfosX!YZsT}Gx%4=`og{?#=r4R zZXtH_Ws*mdGvQ4(G?AFA?vCm#@ksn^X=x;&-lVp ze3_+5Xua7@Njuuk^Hb%&lUj7S{HDFF;EoGRUj|2QZnDevZ64o7gHgGRTtsEM^1MxR zubaiRc@)SZ8Z2u)$lTX9_N>>(&UIZ5$HqFRgghB{a5NbFSMejjejL?weJbDkM1N&! z`ouf+3#q=}6jHU6g)c3mw1QM(lFK?+quH1KzcugpAP4*tXF#&?kh{`;E@+y+iM$tj zJO$&;W8;^ObzM`z9wG2!E`#-2O=!SM#B{t>$H*M&SkZK6-&%g=~$>mC)hv(%u{ zqo2ci&bi^so4@2z`^0vmN&TNSLE+C2_<4LC;ZKcU5IjTT%_GCjq~B_OERyq6)jTWV zZxCF}W^HyK3B8YnWAKEwuW~FjeRELK?(gm{G<{N7KI@0`yswEU;ws^=)5F4xgd3?s zFnrY_Mn%*RpVDl}M zDm*~L6y6=x?jW+%>?JPt*RWYa0cjNo(L~ynv`H*%B!bzlo(F4n9#q#6MJ$LWw2jlm zZ8ymVhia}EDqY+#-s~H5#sTL5GcCFj8Qp?~K>q+B4c}?k@(d~DAe(U@;QI3Pew^}!o zcc#)-dair4+SRtxchk)D9bxVDts>R#uk{TU>fUH#w7Ao4*HPbY@2Ki8Ya)HJ0_OFX zOf!dxC%SZk86cX<-6xN_wDCg;yl0_Dskez6#r_vq=eY3HD;T)b z;gD%JG7UD>Rpq*9mi{|dy_OOEfq%g_Kj4=iu!oJmVXxV*$G;K3W`72F{{Y6`KJWnX z?}$8G;tg}+BzmT$uj)Fst2F3j(R^v6+FILK+s_rEX_od$W+T&!tY2(5S9d?48h`u} zv;GOc75ZvW{>a}8?Jw*mxJygOH4li3bp&@7mo~DzH?jEoE2i^w`-g+dxs~IJ-bIPx zjV}7AgH&wQ5fA!==woaY{-1MLu45Cev|kJ+6`c0f6B=#;zKb zT6JM*(^L0cq}*i%7Zj%}NyW;^xY@Mq^w<3R*Dk zXG(?bG^_sr0sL0@ou&kaM3G{(x?O9;9wyUghBdgIONd~b=bj6hXSOlG-^HiwYx_9s zzqLQd{{Y$B_J7xWK_7wbz9@L##$FxQ{6VGITkE%)6_ui=h~P3c{8ztO!CoM6)^AG{QWT|zr-F)}B2{S9OO~uX=|$6>NmObS zlXp>l5%XEc59atv)Tv2MtF6llQM=K`P~~z_ydw+G;*Ionv()*FL1z{F+HAGAjco5_ zh8XUpy+bFH70H#%QHx1T_R-IEp*1gxns31m75H02 z@dlr*{1eqa91Uko@h^#NJ|F7y_K6AKd5|f{iOZ?{0O`86~Bif_`9!oUrW?=eLl|0>R%3N*P5)7_^(leO}tAhdt0q9 zK#E)IXeHFqE-tL$jikDe#c40wVK~2rYf`I>!eX1jQRj8%>}pd{P=seE%Tf`OYA;82 zw9`}NvAjK=P{vcj)S+tir%p8C&1d_^2&nuiE|$7Z*0*=_)N#hHWS3UI5KR%gcrC4E zx3p_JnHd}ldqy(GW|3B4(n;scB}NF5D+_&8f-8$ld|C}(PmfT=v6<$!Qsx&0y#D~R zv)nXMh+ar#4CZMjb&QFg_D|pM+oS#oZ~HO+%D=I9#}C?v;ittfjNT~mSHZ0x!;)!w zZ;d=9;hh`8`j)ZdFNmHK_-Uh?n18T=xf*@Xi&I$#O1nWN&6Sjw3i@Q8MSUIczy1gX z;ctx}2)+aSRk;17yj$Qe5P0X{Z^OS4Yx*323$#xj==K_yjeI|*c&|~m(slLmmxOfz zq{Tk3_FEfmLf2E(BDa91rQ#hH#xxMtPxoSm!E9jM#*GvBZEzsKEZYyggx+}!8G;s*X zL|~`OnI?{QGr*!$jY`S2)P0qW!1C(TLvy80X1mlHX=RhhfLqu}bv)N|moY$CM`YT@trgF*6`(oD=NlrH6MZ3(#nv^KcPm(>`;TVvrTW}IP##B(Qg?{i9uOV^uQ^>1EETm!^^ z6ymSETC2>i+*Ya=OMg3c(dqn)+B<1C7m>v+kHe_tf_SFVB+>Oh9z}5J1VZLXgF$Z{ zwDNq)4W0Ow8IZ~5S^V<7feJ}sbgN|zmEFzE_QL-F#2y#ct+cD?KFq52+9i&osK=-2 zb6h+rExcE@i+gSMrgNt}K;Ogtpm=Zo4aWVFygO%kW_~05XV>l~fJC~r$BBFarWhY| zu4G*jAA|Rc93->{%TE$X%mw0WX{E}1*{%No!LsJs`u=~0f43iqJSPp@)0=%W#UHcR zhJ04G>2|S*;Fnm^{v`NHTeXejdHmS4J0J|B$+U#TWSh)hFYs+i+E|AOZ_g||-!ih* z^3$D1WZsjO_G;Rl@Zc^Wg648g_iZWjHFXxXl;aeYuGN*a(Eeh68hkXg@tD>$%~Qnx z00907SiQV(M{(n=f5lpj&FoRFx9%*jJTKwj7TRhomyIRV=`8jkWYgrkk!%{)-u6#H z(S93#%3cfc3RrmS_P4q5g^V^=x7TU=HhduQ7P)n0r|Cf3Up%_Ei*;=aO}mNh4EGT_ zX?U4ZJB>#AIoWJw{)A-z0E2A*0BEPtZ|rXW0B@g%y7m3kW)_oH{g~uG7x1C{{Ca|^pGx=-f+1gwpUNkm8@NOUNBX4h|+Qa*O{50^z{hGv$d!YWy8q!SB z+bzP2#ns#5R97i@@l6G`AvP^_3Mz@b>p10ZdcG&{Eqf|iloa$$PY;Mu`wvGd4c~6B zTOBxV6wawQs+d}`OIFmW%2!S;rj>g>_fqAuRzD&gide*1o z@Ax3Tr~R!8{?5O(r+}lH^76thGRxwZi#{k?`Pxm>z%DPmIq@S%@J6Mg>Zt^BL1$}e zr1*x@OVo8U_PdK+E5pXZFR=Ab_%{3Yvz}c#;^+2;_zB}1sM6ri_WKVS_;%@c%_Y>9 zT7CZj{3?GC$zqa8BTBc;HMPXk%J53puz9a@<@bN^KwsPAMY7hd^c`d1;nU35w%E}= zB>1;axzucDvX!kg_>;w-4{WV(?X4sjj`=(@Z5Ew-er2`M^pCPyYMOM?;%*ejN;0FI z(2Z|*k;=2AlWsP&Wf&yyu94f~>2H4z!`Y;5DN&SEQo2=YM@FM>bK1%cC3WvM_FURV z{{R8_*TFxqYS{cd)IJdSGxnN?MexMFB-1p1ik>(9o<1H+tayvZ9xS%gb!(3g{8I3) zv*SH?!G9C2bh}$;Ujt|_srV06`#!I%>bjNJ*!1L{cj#U^_+9X#*I62e?1S*P#=bDs zZLKx!2|s9!dVdl=so`xt=IcxFzN6p|ho26vG`k-K+FRLAel@QS*?dLQw6>mPe+%f^ zL{{-%+jib4{eXTTd^h-+C&90Yo-FWhg#ImQ+J2qle-(IR#UB&=6XM7d!&=>{TWE1BA(bwb91ZT{CM%-hHf6)#@a318YaDYXB>K`t!Q2V{gb>Wr(fzH@r`z0q&YuOR)MU4o z&M){_I`@X{R!M%V4_b_3rHHQ@l$yJjGQCc98AeW2H})OP@#eR0dX|YXwzKg+h+x&Bkz{>IC)MYY{`)gm{{VuP{@z;ct?ibh z`(=D+xw^SGk8wAGY(5kGI7rePh@pZRwciH#FG}$qhZD0j_qP{U6UA?F6pW;%#rme;dDO4~kmWoOJCFT+?)uT~}84iLC41Hqh;6w7iP* z!kUUon!S`%%s3*Kw0PVe7E($xldD3PJmt$9P7-{|OT3*$-P>c-r5tP^>A6;qOH+kQ zwW3_nqt7W>>XcNkd+vN`@dM&V#NUf@E}`)|;#ZFRd2?qpZ*0F3wSN%&QM$687#i~G z8y!>P9;2<@X-3{v5w@YHM+`=IC$}DUpEb0#=hDq}aXd{VI-a7!-67jGrPQ;|=#iaL zXfEJsEahm0>P?Fi6o~!dhmb@RLIR%DTCUrkL7jx1Jj*4cWc&Vu`Is;(v^MH~SIz zcjAx7OAikCC*u#re*)-V6Z~!AZx86R{6y3~2K+qJd@}d)YQ7nYE58A0zAf=ji1ZH% z>ECLzeNOAf7CMHcw^~-DG#f!Z{<*Ae!`xxR*qXIy<@sBShOqWD=|wo+DmUkJR2y$a z%+;2XdYo9!9>qdYsf@%bQK>ZJ&g#ugC3wy@Qfaici=?F+?DaoCukN)w67ff-+`(gK zBF=QntKBz9y(zZd{nGnf*U}4Eq-z#yr@33GZi_ly$2?G5H`)D*_F4E}@dM+}jxIhN zd>8ON*Nd)YzK2lp9ET}!>lV6RlXdrp!k>@-0I*-fjWFoiZ~PPU;5@!3l7BZvkH(%V@!!U~yKDQm zL8J@4Q{vU++D^ZxJ0QQ4PP^4KJr?&-o-HoQ9}eAGzOku&L1q5{1$w;GEo@`aeh=tB z*q#rT?X;f;cxO`ZKZ3kF;f*s&wJB^yjW>flN^NGenq<_iwA~X@@Sdl2Z6&6ksc16k zsEK{9f0%I=E|p4oZdVFxm8iP)Xvdl@!L1`!N>2X(3%pu=b+PoBCQ-vw9Xj~z&a9^$ zeVl2{!v2kiiJH{^XS|-;k-|1h5fAB@kC&hLi6!?MhtK)Zzbx#pm_(#LqZJvYs zKM4L7_&y&GX|n4ANVTttel^o|uN!#!RIr>`TWk84h5QNP`xvZjTGv{c;M6r|{T%oQ z{{RH|{fGYmXRD1rR`@gUd*R=Nyk+5&t7+E$I{|Izs##uqLh%NpulTms z3(Y>{SX?YumcCw@e|KYd57;lSVxREe#NY5$kB@q~>d&BfFW_H?HC+Q-@ajh$_J`vi z9O@F>`1Ur{G>Gk^@&5pg+rswKn^m*a^?gVF5ldJsx5{*nu-V*CZy(K?r~DNU{t6YX zX&2gc@9kCMEeh_=Z?Rt5_&dPA1N=TM(%AX8vBM^h@PgY?(&UA1QYjlxYp5WU2qw3I zZH@KE^9+Gvw%eUT@$ zTdg+l_k|<4wPtx1Np2;YJc!%)w6*^Lf{p&&kWCHzU$#fayK5VRYb+M``k#XJW{x}W zw5U()`Fshi$9nKIYj(Z@Vi~qR}d^@Po;Qk!(JHHq<=Q%30m6AR((v!B9Y-pT3cJLN8!$ShvlgWVO-+Z zFC|LRnwPrm2C2n!Z?v1z>sE2$yhXrcXDV)nCNi7lPIhaR^6NJjH}79m(^u&9Yx)K8 zH~bP`{t3_GtwFD@z6N-+!B-M2u*n~U{x$qm)2stLFtXfT=yG`7?X079FXsy@cos4| zxvj1t*s*Z3{{X=fKVS)UR=Kk9SH(?nBqmq0Puh3Kwrr@RTdWc2cG{#@R_KvDvH8bR zg5uc3U|Wb>#}j^AY2WZ#{{Y*MPJ%!9Njy3GAb7fGjU@6l4Ljnm!;9vCVn{9}k}K^~ zODQUuCxGepEo>6lh(ip{dkrW43pe{>-YXpw_8IsU;~Ce>F~#ub_J-DU+l$+84RVqSV7O6Gl_dO`$ z_;#l(swlz9##-TPRb1L8+^NHvb#{~G>!UwX^pE%>5Bw98Lz_<2ANFqX7mrP%Tsp6d z{yqG4x_H`RcZsxHpNN`mwfZ43vkRLAjwMB!C7Go2Ti^6g*n{>e@YabYg{A(>p9Qqd z3OKgMW2<~N(ltw%!$@V0G}ra%HBD0bGc$do7n+)rDGMKywc}5ezh!UuDlfyoi(Ve_ z3jWys7tw!V&xrmV))h4W01x=b;%A4vWuR+XE7@4xSnBp(D74Y^$u!+oYuD6muRK4f z>5*S)vDsVCCG3xVW|Mt6tp5PPK|f%v3RG=h_RaVYXaf%_OD_~y>uo6#Fm;${_Se@I zvpJ6i8Vg}Q-#ZfQb&KRN*bXXneVqRQw5vEu_f@M_zOlC~p(#eowe)xDdpKI0IH|eH zR3iyNIZD!}Wg9y>bBkQp>Y$#A??bJ%{fhqpVhu)E;nzQ8f7$z4hy{ym-U!m|OGP59 z&E&ysvc=~!`D-Jq3zPygD9VcdQobzy&%Xk6uZ#ZxA0p9y4frF%o*lRN)8p+YN78hr z@fFRDmWgTNzYs&D>Gqbl`u*eS&{*1Sv9!0cmeSfNt&0RQnIv!NyZ#<){{RHo@cs05 z+L!Hx@Zmnx=2U$T!+#KbQ4x&*LekuLU%~p7rpNN-TV}Yqb9Tkn!KIZQTltvymHS70 z9@f4oe0tYBJ@FGq@o$55{{V~rH}N-zHOBDAiTpfoG%ahz8s?#)NG-MPBTczkj-7cN z)5UcR6WZLW+cm7dV!ik2o*m`0F zj@S$#*uJ#6bjb&E4Wc$+W7{OgCHPJ7(pFSI4?H6ZBM=oO@d;p22_it+;;zT!mR*u` zaT*y;?5m&J3*mjk;@`&bZB5LJKZpE5ZwYn-&Lw5i82rcy!{n({1>0*vYR~&X{4h{F z&mHL?p~lD3wQ~?vGBkw!qRgtPWE)~(ki;{)?s(($F!b}7q}sIPr-0#QT27z#ZkB1MhLm2hwVl^4x@@*i+n;>?%ips8jqw9p(!4A1?@K=qd}pNH zUHH<=;x~c3QR1%(cFp)I1B~Ta7}_=6hF?@g>zQ zbsyEQ9)8Y07d|2B9}m1I@pIzm#_tke{5Y4xnx}^Rao~*);J1YSDBIoW8m_CVXsofJs6%yUJhr|NxmVM49di4^UM=yeU)(q4_xuvG_KxruiT?m?Ux!}} zo5$W6k{=p)W8!9qr+9AV*5CVgRfE7f{{V??Z7n?gE<4z7??;EEHq%L{!ekLirfKRL z{#Y;n0IUf#J#yPlideiItJ~Y8QsyAoCi)(tM+cv&`1>mtEt1kR>RTw63y z%`AV)Kz-W=A6^DTtp=*blTC zOAk3aN10ToN{XAZN-CV=8k1bDt1fFa=O&v+;Qs*a!TUXUvu)BI2)@W#D$;;Wwn-P-7L>3ZM8eO08FRMEBHi9RIwJFiXRb=N{( z=$g!Snkw3UbL#&94t@pbH&k)D_g7l17Y}&{fqYG4 ztib}q2DJ^&m1_4E_zYmUv>J>ya>^Kx(cQxxtc1%qoo-aQ`2PUnf5CqPYb|$iYw&je z07%s*v%S+NheiIuvu$GD<{u&KjLEKpquWV_Ee?|$7g~vy<~x9s#ALSl+@FhcSV|at zRwETooMhz%hMcgFi<+jiSbt-AMZswO#cRb`yL-4^4$3nX`@A(6%F#+q(zMc7<(z5C zDN}d&;**r6E^2h*kL1txq|*NYW&Z#Ycp~4x9}R!toF59l6>8Dn3yD53=pVGl?J47J zb4b&zZ=t%oI)8!wBKR-Cnk0X1jNIw%b>lr2?tNMxw7!dJb*fGl!{EEGhrSE4Ff5)G z@V=*g<-;Jk)HOd4XgADav__5__yw$1kzTSg+{=A+cZNh3_p_UYxheaL{{RID{g-|n ze#~A9u=s=FU2o&x!wL0^%RLKA_P(K@`gpNnevOcs}=07RJcTbb z?8a>*UQ6VJb0IM^yR6QoB4E|_XTq=9v&Y{TJYJp!_;=v{019~L$F{m9{;xlVq}Czu zET>P=Rz%e;-v0o`GHJFJw{gtTTf;Otjb)xYS9vd`w6t#yzVP0wr(3n3ihLied_DMs zrt5m1i>m3jI;`!bi;X7oTTM^Po_`KTlBJx4$8`eglH4mt8Hx#Do;k3sSjz4iUFpks#$2i`wC7rCH!Cime(C^h3Kmxh|PzBn`|w+OGZ)@cOpq@a2SMcqCd{#OiX&$@{B#^AI0< zBYxq4IK_Kx`fa$8LTa|5h=&GAZzY*L)!Z0KF|#P!41qva#(qYV1gq}!Xq6)?skSmO z7Xm^H1M{<8T*V^Dxo!sHI0jNMJ1OJoPARCzYkV)sUCeJ%H^i2FRiuctovwq5_l6&Cr?(|UKsC=a~!H3XB!!ekrTO5nNtmr z0V;%i)M?%XTeSw!RzauP-P=yh4MsFyiE=X(vUc%ZuaosYD zh>%AFIe$1PA=JK9bp&O17H*7H-A>&4cfnmJPrK2+Gd95NXcnPGHW3|-HzA({=EF#*bWdJBMHM+U^wyLV~cn`b<7k}YZ z-%M0b;#Wbqu~DYkfzh`g`1m;`u%9xje5Y_2!1~|gW#5NSir_vM@a~bOT7P5dW!A#b z+QMi507w!vkf`#~X-AfhBTbR2h~iHv0Uj?XwVac6X8{O|KjYp)Lk8hXFBmRE08|b@ z+!SEtOA!j3vi410D(XqS?Y}E_T@rU%>O99StAeXio2eOcyC$W|zR%C9yG=cHzNePY z@TS&G2{p%*CIYASb*nj$73Ec~UOW}-Gqhmt#uB85;kBij>|JG{L6X9KGeg|0!0p+R z2vL>X;hDFAv@y#cMv-j;ANZGmOoS^dv}&Z10c8_?;?k%)LblMvD-{J$TiQx+Y#>lu z3+GQO9i^CVOilwK#?VbwV0KJLRgjAI!dqpOvCH%XkFD|RQ*z%!DtCM`zT3xPp ze}{X;r|Wwy6Flks6J(AR{6%-DM7vXDdN!YA;f_hfs~qA&xERV6WdNxPNIH=CW=U7b zvzjG^O5$sqSj6bA$7pHdEQU2EL-PeBlZDRJuT1dnjVFk8$h!bDys@pUa8B|}(Zd{Kd7^2$xV#DADD~Y-!+tOL*8#oLtu+ZP zo5Q~iykX;wCi?c)+Ieg=_SCfXw|hj??-tt6`$lUStSmm#w^z;(NEd>(DMoUNQrnrR z!la$O)YrP6&GgkJXQk2T(8Jf4zX?Z@Qsq@AR-HI=rmqiaDO&ApxmE1dosSQH2dbjy zS6AF0K23$OGA>zDb2Gr?fI~L*lWqeNc9LCj;mK0cPb&WTRK$^!9fh8DG1^MIO)lju zNLDIcmyOxU9befZiUcxgawGX_O1;8`N0Kp=Zz&f$WFj*wDzjyXkB#d`QTrm>D;+hC zWq>Ogruhe)f!#=*m6-u;qBub$511P6!`6z5l21!TZu-YfZP{Hl-*b4HYhh*9P;umBJ-A_kLb8<41GVUkJ6&3T0W9=V$4NAuze zWM;!H&hOqTgY!w9`$x)4$XtEpSVv zNvLYQ_Paf7n(3>*O_s+Zd?9ra1#h6ju`C#>0EDt50Uq6?0sLygLL4Sf6(7U*@q&qU zY^k-?Nb_Wu1&7@RQ5lh#lHh>M7m$DeJ5MeUKsN^gcI|RigE1p(=bkuj3EXfKo~&VJ z3aeccjPvA9!HTm6LYU(q5H_f03{N=CI<@LX+VeXtU9Qq;YqhuY^4RjKWVjfmIL=qH zf5vfNVOiel&0VFxeQt0Uo*LC5g$mr*<%__XfI<+uI7Tcake%DxCQ>&x12Y0h%JC+k%%cumxm0Rb@pi z8fXAG1hHQ=828siZ)<;aPKuB~VL13i+Et64Eej!zTo#VJuBl z;`tXVTe^FsmDSXv=hI!Z(Cwv>VJhKjG^_ir2}+%3%C`4qc)RrK_0sme{02K)mSQ}n z$CjiM67|mQ!cQ?>aseR%fxs;wz!em&9C8$UdAAhY+mvIKC9##@7}##w6em!`o;u5o z6I-;JLoC)Lj#vw*-*3$OvSWracJ282cXuu9>N~D#)chP;D-9BC0l1VLBSH9LhQoaI&D)M_-rlg{|lhW=f zU8QHep2=Tbk;z7FB|_z&gOChu^N*Nr^4(Pe0mxzk?g!U(RGLJYiY$^40Na?`mnyCE zCgU2hY+;lf@-RUP-jAs1SC&dvFA`ly3YPQ7hjetq0U%As?HfrXgM)xsH((Gp^2wn1 zgu2L{E|~){AUB6}eW(eMNgHmlfOd0@yfzquD3hqtm#~|@_T+c9t)r-&p8ieks<$mn z6we7W@#gaPbnmvtVZQDCXudAUw?|V0E$^z29u;BoGgQnyhcIVt+N>5j?FG|Nk3&JwXJOx<7?hc z>w7ycn{RAkhN%@ESjD#VX{OcfrQFip_Sogx3qUt6ip<0k%yGDq410U6w~eVpxFV6y>wzalpBKtj#5s;MBTYj`1*zjxxv z?uXtBKZaTp$zTCtc8j>648#lroD7yJdM^pxsLEa2Ty0_xnJ?IF%X$=&XCaFLkddi4 zP)Q###*P`aq-C_!Q)L7{;-s>FQhP9x0mt4E>j-7Gv`hOHy-Ck(=UxIbZ_$Byt;_E-Q zL2+?s;2#%V$#n&!o+`Swg5oVB#5UGet9-VTcz;mv<L;f$X(A9Zp$152|U`y7$6px%flt$k*1w) zuDttO_?7Vv%TJR-*6q9pdmf8vbEj)w5!ZY(q~3fw*0kM4V3N-FM4v{|?Js;gdXUQZ zi)Ex-SXsTwY@bY9mXZs;r9!1Rrj(-GZ?DR(_BMPT0sJ^_)KI^sD zEuF68ui1A_$+#`LKMq6VPXIxyY5o+tz1I9Uq1{~n0K!S|J6FB7)I4?Y`x1WsPYPZ` zeRFB6!tFa=T0;fR%s2J{46{Am+TN#s;r{>}d_M8x$*1^#SBfoh9#1z))#3ih)@3Oy ztt4>h*QCO&ZpDq!ng6?LyHCk6Hq;bJfjqmz_e+Ou8fC`W5`b8uwb5@lA}ORSQi{o-(16y=opqsx3};H?|Qw(AVjUTG5y zw12xT2xg2uysWHaVYNZbZr^rOuqiz&>%%Cw~ilpGz8{&H{Gg`AE-7I62i6jLlFtMG8aB(KqCOwK;7ngAoY-V&3sq-;Z zRdnsPjw^RtSU z0G0+4qtkADT>cpG2DdH5aariLmqOhj{#Yi82`?@l z;D}(23ZyYc(jXxug!zhNFB~&T=CdoW?xUE6`Nrevz8SQ#zwn*TrFxo;=ZtJM8+bGc ziolvG_;g8ZbtJx=$-Yam3`ML4o`~%vE-z*;G;KG742lt-Je;E9?zts&nrZvImT`9Y zb+YnWpI3+C+`^ny3iDXHS5a`T)0ZW!Xw+%76rHUrr5zHoKYu6#Xs;wx+Q z(Dh#eMSri0j||1CCXu0dUtE?$EuH6x*H5xpcrOC})qk{?!p{ckKMy_@{Au`;;J*t! z@?P2aZ%FYi>gYDJJkuNI(zJW$z0#6SO*L=f(-XwHmW!xQ;EVqN6wBfG&ZFUv3~F99xYJLJ z_5CIrmV(~*Qq^v4?JVwf%lJLKE^AW^;|WS`G3APLvyHBk)%(utR_A>$X;|}fDtH{p zb5Ww`)SCEWqX?-sbEg1rTv+dJ4G#x-SxDpQagK@j@C2V{80FaNRrE2@V|=`mLlH&07;j_7mA>= zkW|5?+A{_&fTYtgDiDQt5ue@Z>4ze z;HQo(H4i22@4O%JQ^U4R;Z1)-)nl3oG~Itmzt*)lI$Xik3aFL!S%N+G?z)HGX*nS3i1%!-iP>HZ~_$54hG zOLe86J#E+P@OjK@az)gP9HN@M+OtVLn~gPl?&8z4*68@`Uk&3h?bW4u(u2Rd6#d() zw{_2=cDj|XM1sce1L;aEEkcxa_<{XH)OJV-G-gvopRDU{U5}SsKfsNJ?+&m5$zrA-j?BTkySJQ5d^gIq< zj9SFxEBHq91O*EYy7v$F*?~~nd``}Gs1Dq)86@>cN5w`1Gx$@)2tfpGx!D>FwnosZ z3bqDLLCT)F1wF1`3wUA%*(Zdw9GnoM*6P`a3Ub6l6kvn6;deI&b7U8Kp)Z7dDRjW6 zgS59fEDGG*9=~)lv*j?LZr>WF<;h{4g)FxfE6LVU+1dS@xTpUBE^gcP-$%M)SgH%% z_G&Mye9=u>I;+mk`tNJo&tD>g;-`luJ8zd%j5cyFG^t$_uwp_rykW*03%HE`01+i} zM=`1D9t_s58e2>KGASD^o0XcKdE z>VZxPCvM5MIo*$(wp?JGf*GJs1^8`-ZM-F+k(B^RZ+7H3P1rwaXTyP$g(R6>X*Cy%k1~-zWP6#4Tf-1duaf{RgU)BLRB)r zhBC&(8*(>tFb+WhskzlGCxYhIT~f;C)@ZIRuk>rni(O92c$hp_HW&7nMte)B4q7P^ zL}fh#FUsFVkB7b&jODx+qzvSMlU~LP5PtAmoG8O^06=>1K{UyJ9e6(PIPjB3$_^UG zU(})szc3s%*+JKk(VTbMagQ#h5>b}Q`fTN{sq5}7_PVy7h4bH3y7hN=(^YkA-rCLNT4WIXJ!&}<};uweCxzN3%o~a zJlJH9U$Pkyn-gy?rw|(s@MUW|qR3d~BgrbHDFK4lRAW*xOIv8H*D|%DmE`R%`pM1t zu7@;Ut|@72$4Iu_^-JCIv?B=aozJxVWAGC|&|UAe?JHdPcXcku^1ju1;x7i=nN{-9 z-P@$s(Lz`at8;8s7!V_9lt}&&s(3F^v3I=HwLJpUPa$^eC?8VMT1ixhpps1-TwT~t zAqFuHr(t68vW9;x7%}tz00jQf{{S0)7s{GWnc}wbCX)ullfr&Ju=`!3BJt!#x`Hk3 zv}(lREcGa2+yh2~%SKPAG!NQe;P;KAg4g0FfFI$GzQ9KM&Wgib@NCXrK+SQd#caBj ztP*^w_IRPbjw8BBZX7dhBg-w-o9kt6m%F=G+wDg0bSXC*H7l#DU#^MhteWktZRfTA zeUri$FmT^CG^t zbs=;7C64860lXfhWP`gOV%~ft@GpvOPO;$KJHpztfL)iu^WEwwv4vR#v&E%d+uipn zA&*QA8ISkDLeKw)<^yol}QDbA{dp%-T?y~I}?!^@eRGcL+QHefPQU;=mh|BafVhso6{IQNv~j<$HRyVOYr`| z_i_C~BFqj6hVw9~zk?A4v#x9{1Wb#L(t!|=(q^&M&g z4hHLK6;$MbpEL}7p@U$IU=7guh0d!kONM~ZKePdi%53C>3)ibiE@Z5hc`1wa`X z07-G-4~N&_1n}mmZ@rF4y0w&JjBOHGtCsmlV#9b<8Qe>~b9a9VJ|44gTWwC(R^?mG zxP&VnN6ivQpDAU}%78G*Ac9N%ZI zlA{?>l~ebbu%(Fe={^}0Qf&NJcg9HjOxE%$DahegFnxCy+ITr3j{3)+z`iPrD{rr9 zbH;LUHLbDVoDdn_DTe$uK2U)B$<@b;T7JMMD3>#IpkgqHWJD8kjIRpZ5at15rPq5iXpZJr`oemy(P^kHfDOa>j#9(J& z0F`0`43TC#6ge?zcZ83dzPI{ud_m&1C7;4Jk^oLj8j?37JBZp_Acf%LJoP-2F!6@6 zjkbRP-WF5yG%pElW) zu!$?Cn(ptrx1Os<-D~E33;zHKxCDuODXsy6aT2VA4sZcMA3L_-41lBWe-VxRccubK z@Ry2}zG6yS%6e`fgBWb6$Omo@%0qVx=5`)1B&fK#zmNGDqY zzTA?-@;lqEoUOjy`|G3bui4yxi25KT8*dV$2IXHxy%@nGX<--{9dnb)j1oy<1fLUh z1RF`#RA8O2rfLhxC!MWpDiMr>$Ts!Ze762o&3(f#7EwIB52_**8f_hep+g)A|*1G-m;xQ~mw}@@xS5w0VNMVS8 zR0ERyD-nZ`Yp0gR+U(-*O3|*>urW55rpcAa19l()0th)Pfq{eA<123@d{=fHj) zxtBld78kTU09dM7&jJC!7#$AXstsq%-^A1IuOyz%+Vk4mFY+l`%Vm94+jiOP} zp^myPnAtN}YHm6CrtwCq>fbA5DS|?F^dVGq2apcxww@pG*~b3>4Y2i%*5(HWXo`iF^?UzwtfCm`4VhQfWSe}5K209UFdSD?F!?thE zN0YC}8A|Ru_R7tZ^k6~21a6^ny&8tEtW#TbbB(zd0AObzfENIeO4g(>*(d>1Q|d4y)q@NXk@CE! zfsRhz4@`9gsYP1ciQ8^ev|PX4*>$tBxV@#_-jkZ=L{xyiP+)+zF?iEJ~B?6`1986+GAI8et5Kqn_@!NpZqw;Y{b`8qD? zqf(<7A#)f^k%5v&ZW|{xIJvV^gRPAl{!R@H0QUA5m*a|9q^kNXD*q^Q|GRopiBC_%>Xw)2 z`!}WStNYSC?)%}Fg7tMfd@Ez8$a2EtL%aJkwi`RxEHECYf#fjB8DhsZ#9#asw1L>^ z{v^M!B%P67TP~=*2r0JOTR8y(7$zsl$N*x!>UmN?K-H3A$@1=Pl}-yVU|id)o<8y1 z;~WFf)=Y_H?pkXjDv&bvPjhd{KR3uG0~{y`vkZ6}6osjjaP)-xmK;9 z-6xZ`k~XNC2386Q=RbF`Y?A{`s7?>tuB|QzIaZPjd0(Iy1}KqE2WDQJt`{KlJS-dc zTU%Q0EiJFAdVS8<*zARO%c{S9B%R&0zW)G+;C!JLw!R||P?goy zw)5TWt$lwdxk4-3q&ROhV;qv)ADjE#_T;v54n{M8YjWRJzyeXUWCkVq8+jyU@JTu2 zZgZSqlUYA(fx+1fxGjU2-yJ$(lqebC=RFQPkr61s{H&Q!q_Q{z0N{_jMt0x=PeHVS z%}v|YJ9<5=*1KOzyX>vyzR53JHFc|dtAAbXeeQI^_Q(KCl64GlK;wbhP!0gj08(3U z7&$cIs@M(-NZ#AdIb4oZkOAZ|VhZj9X*sS-?4hzZFeC$lR~+F`V}k_HA;fz+_zCgo>#x@pVTP4wT_PTK5p+hn}$z4W%8Pp!AvooUsy zTn*7(F#s_6+dU2jaxggq1Ck38c^F^qjT4XbX~_VQx!;0&;JWn6k$@4Hu^JJ``@)V&je>Os3)!o2RS?r0fDu9 z=~$Sa2xB0Eu-n5KJxK+b9$s>O>nZ0LAy*he83s!T)qm@tZ1n_%9dN;mZBf*40m*oZ z5^~M~Cpc7cIRuQ7M*v`uzziH@5zC93ZQbgvs#fW(wDaw@s`?66vrEZcS}&(tKTS8< z?7Sod5y`>tfCxPDK7%}9<0m=fsB!9WbCKL)ownrXAP>1}H*e)RWT_kAzuy#9ai_AYN< z?;b~Nf;w_Axn2Rt9Ah~rB9nUeEIN`2$m2ZYsLya1kG<0sRFXUY0OP6$=Zty|!|F*| zO~i5t!0ZSB;A9SiI5->?>&ZDF7jJufwZ7L@dg!lyy6hLaTIv3J{{WNJ+P2kZgN`sp z-g4aXO69l!k%nw3I3y9xT9d>x=jBL=+Bx#cVs{LJ0b%(u;BCR-YXRp>XKQov?d7s_ zlYqJ7p}-j&;G7C?n-gP&2aq>pV3WWZ#tFuLWg{R1o-;O9vtQ@B-EV8{qkB7PsBNDR zUN1=CI6dJ)NCbn`2_Sdil{nkZ2x0Lypa=j$H~{|uqozP0g$H8v+nyM08+NZC0hDG| zIRS8fURw>3wT~H-K@#!w+MeiXQIIZ7tQ>$vdvk zTX*TJ19ALCt1vi~6B!`K6e!Abki%*QUEMg&0`s?lRbN%ro1e50IbZ`K`gKsa7{LI8 zzyy(!D>S9B&KdKL4%`w4&5Z5`BpwI{0lCfqrvqxdZ;$|cuTN8u%(=il`;a*Tr<+!< zvcB)7wckf~*G(H;4u!Jc(YF5pJ2kh>cI$KdPgc+Td`ZB@0S6&TAbrf|7(GejjsU6G zRMj{wa>O3Ly%;3qf-nF$+;h2dIbWEZR&W|&{{WVgvFn2t&^X{Q^D+qsk~4vkoaC86 z(*FSGrNJZ-lNlSb4-7Yv>5a+(40+&+QIfyueR^L+(@%c;YCe|Q)_Q5_=KlaiwvS8a zQo2l!v@lRk3d#xOkT_zaBPRnO$kZWrbh}Mk&*x-_ktiZ^JEYm4ocv&bv$wWMP+o00GPo4 z0A@x)GNT7*G6G0GibpDW;JeAb&#%tcTG^{^?caOq(rr84>$0}mt@QjJ-EU&g+AfJ}1}lj^QPy@<-OmJV$Ok-QB#t=iReaqvw#!$R zc?ixH-f0fz>Oql^5;@NpY-bqD9qTOv#TUU_P0_FAQg)+_GDT8w;Ws$Ke8ZeE!8ySo zZmjuRX{W2!&E52}PWMgerrTSndu~N(G_Bgo_qRrx_1Avt$jSR+@_x@EbS1p@ascP$ z-4G)kKs^XOG6{IPoygepsO3mNqyj-CCd_H#hoy zs^I4gb{{hxdE1N*-~wFV2la_EZna%7Nx?bQCY8QoN8MP);CNCMO5}pLry6ov?)2HK z+pk{BTWfvv*?nRy+nFnL+1V)XWS?ca+f6p)LL0EBvWwbf=>iCo6e2`-Q>=3MTI z9l&9UC6+EQLgVLVe_}va&9b;6HY<{s44X#`0;5DoU;Wrp*mCCCseT{#*32)#>xr?@vP0>l*ZfBIQ_hC8CMmrf@oR&BsjiaG7oYc2l>191vri;@@XZVGd_DTA-^|x33Znb;F+Md3| zFWF)P)9tdMJmUlcfkzntU>(N?Bw`bF;s;_yxyd*MZzh$7&~cC^Ae>|n$~%L>#a~?} z0CIJU;6UV?2=KseBNh8{ zQJzV<1Ra?Nm3-S>>^r)%%W*>wia30Aq61dNUeU@`{_l5w8@0K?v- zUM4u%4xJHTI1dQqrR_l1^Q`y@2l*#zMKBHI1!+0XOW}aXB_Xl00Icd-gVg6Pd$D~807Q7_XClG+%2}f$vVBd^xfjpOMs;L}Z&<}h{rML@n(jxg$9p26&}~n||(!{{YPw+wi;Z(dpZpo0oL9@2%aJ{k)Rz zxkY>vuBat$tU)RUJlj)}-lj!dk%CTJZU+ok=4EdQYw_~ex_AJbFP*2M>5fQn#PexQcy~fp%V`>`9DL1jttzP}cU6YTm@8vAEs$~n&ML}jx+Fww@cxtvmHp-Rqp4gj zM(j4on%$V345`L*fTK9ADPdlkS#4!G-uiBwEp6{_CED%cV-?X_+FC92w{1Re?lafJ zy4Ax0w@R_#pEY$Go3>(d1C^HGLWGU%0!DxmK;QxmY}!mH&8~Q+Fu)vI*=a^JMJI^SE$yOjmOLt#k(rcbi1Cjw0{QplI|>wTxxoS-k%6jyXR(#%S)GBe-mycKU=L0lp7gh5rDA z&r|W&#M#iHku~2IpAKmIz~Wf+e-8_Lp%IV(B7570^3+BPZVIy+Di3KpY~<2i6G^u@ zY5xFT{{SN?W|bei7^^>a&{A@{wzl^pvsx)OmGnP7o567D*HKyB!{Kl3S)Xmat=7FJ zqjX)t{mfc+ktDa1x!kCc$qwuULn4w{y|=@kvoFS<6GsG)cqhbA*v_Uzxz??8{{V)b z8}hk3*7L7*1Qein|XiXUU)~rehRgYAso8qo1w>H zc&JLL7kbm%$Er{AnYT$j`Bw|RY!56ynE1o?p7?8_7yi}wlXv2)!tLg1o)om3Qjh@X z402w1zhQ*oN{6}BQGiwXB9WzpZyNEUo#z#6H_c?0&z0WFT@rk|J(Q){ z+uey)*s4j9NRgNT7?L-(RJR5z9a8RJ0&Ph(+1lz&yUFRRS|z2AYY%~pR981WqpW4k zE6FviUD``ehTE&$?e!mt-x0MHWVzS1J6K&#`+YX_X*Sp(1_IAb`y4p=6ciC{+Mof2 zA$WNu^W+*tGSgSc`|Lddx+r1cC3B$nV1N|hw=4(zTD zahwJ$Z)ZmW_u?-~eE4;yVL2fFT zGPs$ILx!gure8BzV>hp8bTI$uhYpu1` z`tPUw2b^ieK4!MI-8yti{#RSOb~r-|WO$ssHgI#6LqolJ9 z)561W;4GHyhz{!n%&d< zKW}(LggFEgiS$G_i>Dj0oMVPoRAO9I=0pr3~~Si3?mxt#K&c(ojm)1D6zz> zH#ZBHUW>g^wW-b|(ND@UGVbi`jRU2K+Uiz!~$IjYo>2n8+do8b}qLS%- zo$sU8+jMCjCe!%s*UFAfJ3&X?wiqp;)HMav)jx@qL{;}-V7+d|S$CfK2YZRB^AOlTxvWM6jCb)5pwQ?l^>k*h4; zAk-!n)*cM_Z{h2o7Wm5g;ew#I{?(oc?QLdKM0+8Y?3QnmFv!I|%J6sWspIWx+8tx# z66jyEkA(F{jqNUcYpdOSO!(igS-gfBEwrBi=u9m%iEp1aj5TdHNxZYVe=>V{BZ6Iz z>bOcvna`V%-6t#Au2-(=&iz{T)Q36Ml3J_TX!WzUsWznJrLLm?08{g_FM;|#g(^ky zC&%_W70j&^QFt@LdQ|==@eI48hiSF?{{VAhS$J6d;b6h0`MM#e?F`5E8)e*#}62buk^2v02M*%zJIku7gwGc zvYOB@m8p0$;oZd61SDw`PY>Izv=_CG+%%Rtgm((I{!TA8uQ|GOp%)eI#>)CDB_{0R ztn{)^R<+rk^e`0pRHr+0Zj(v9BX-i+can?MbbEUr!e7~o!hRXEzVUCuZv*H$+*)0m zUFu&RzBfas4*}?=*sL;YcADRgqtSd7VQ+8c$pMzr!#*amGFwcr!>O4qHG6(P;cdUlXW-9=-X3_ZmNlC| z@UD}l>Ao58?X)mkTBJ>)_-DiBSgm7&`$Ax`yZQeB!zpIHJ}0`dxu3(A_PREfntkVl z^KGcvTwUwdHfwhdwX4CXT)@#=&vzWDrcY{@Hj>=iTyL^@ZO=72IP6PKT=7=AvR7#+ z-p$@t-L0?I_C2h=h7DGNO-fRnS0mM3THZ~)cWYG z@Eo2Y@wbNc9|w4QR+7uZ8hy5p;hU{j!?XB{Mc4J4y=PF@C$XIBwtgGd;yP}(1)AMx z(8&&^HPoIx;QcSh-X-vl!kDyeTJ(HCZ9m6)&x$-_b#oqds_C|$ZbsDir3nde;NKZ-1ut6JUeYBr#_?c4@J@$ zE_D9@wAe$V*lO2S*B&6!ZEW=mnLKfKaj9BG1%TB&KOcy1^t~13wbQjNLQGq46Gh@} zJ4(3tld5==#QFsOCx!e^tFEbetazANY1&=-v~8&! zx7h6=x4F)QXDP?tl9JNuO|NyZ8=QEDkR z?Bg5V$*8oF_q9nq{{V}KEj}lFM${tHJRM*)ZGH>MH4hGW)5HEcv%S#n(<7pPxZx)4de7Y^v^1Y?A$>*UOw%T^RaEfOZT7ZrRAL#Sj+ko5U1gvnw zZ4|MVazute!Q|T|!mz^qZW5zZsllfw%V##Ndno)#w`TRevTwSv`0o*ASX>ryjiH5~ zJ{A~?l7y+r&MTd%D8_Cu(Rn2vn%iDVYiSZijf85%iCgzKh7PSVXHqbA+1Q2fy#jphNjxdFBnXdD*-Rx%4a50rquSVa+z3jjzR5`<+Y`rqBV zZud*3kJA0Fn?7mjbhNWqZMWL`rk9)1dFbve5GsHSTTbR+6r(7|e3VVNCPZz@O1keV zS~V$YVTp)Pj7tPt7&NMqW89I`shZG?p3z(TbE+&u__r0IXeofEQ|?aHcK%;SpWd8#o7W0 zAXo|=%Z#gem~0)`0HNKys)HLlqJy+@tjgP6KJR1P5R8!!lSpoDT_G%X5h*UKxCf8T zj5bjSk<{Dy&Mim2M0r$OAPFWJBr!mx9w@*PB!O5LXn-m~a>Z3+iNh}Nl8mm~yGd!f zj+b|8?)qC-uGSz2i%DGai$%%g+m6jk8Lq07f3 zNAj(m#3`$2b6xBub!#AEwsm<}n}qo-ZSB#_l9Y+jULh(gF%GW9OM5=0u4vb{m#}L; z6+RgF0>ai!Lh@AC<<|AT5F`Rw#Gh&K&x7<`Zb=^NAbp74+uel-_d6rpvFNch>B?7W zB$K_`liKa>th(s>^={Zsl}S4&tJ~qex^mj-a-_QI)vVRDI$cf^doc52wT{LHk~tpd zQF(~o;pCCkk&-aN+0_WP4I45)%9-EgSHBdzHDNUReudyoGWKgocF(SA-X_;?Rb3Q` zE*{p#&q~s*;JH`XY?CV@f`Cj}cRy)i;&0gtScZKk;%DuR@jWyzDMH))KK+pOjaThv zNhgzKwa1HoEch)@D#dI9+`|u;vImk2c1aQbKJlf`hkxN9)a?Ekc$>xkCHQw0;QqtZ zd|%<@@Q%56{*MV+^*;>TYW^kC>@Q5uEFwEiYf+8kRh6!A&jS7vgY^5$_?H1E} zSt~wEcYgNUE9=!t6{yB4$|<#H@ylLI$C63iEp>W7D;~bz88q1#$#dbo66RJj4bXJ$w&32QMGodJ4|pb8*!+lpAjD zDRgPt`=*y&t$xZ}^y0sK(pJ9Q%GS{ zl)Hmh@ot~2OBSCsv>sKJ?vdhMBjV?Qt@Pnx5F*AsPes&CypYGX-b71zm+H@gxH2(15SZeIEh63u<= zR4XMedAE4Uu30x_XUd-}n(|4>Uhktvtu7+YX;O_ESlX0n#tJGl>-#9SxqbSHNj`p@ z%a+#Ddmqtthk$?JmDW$@T>LEf&8eNrLA?E;yg_RziT0#sQDLoU=^8MTs))w_0Gn^i zx%%5_f8dikZqYC7^WrHPbGlt)~S?n%sErQ4FBTxNL%G@`^|-fLHTh{{RTz z?Kx&cO`~b>l>%0eQ}L(6sK!oIhyKymVpnbfD7%ypSxFlh>D$_V)G>U~=syeyM!;=H z#D4|mZ0;b8%i;hTen#UP0a1VgsBQ@1sBh0%D`=Bz`EKtNntDF^`XkMjd!AKXlFTs@ zgI2%Rrz`0mlD)LLTDx7f(Eg2X{wx0g!5#F55?y>7@U5ilAYmr0;y;PHl*r{mljOFQ zdS;R_EQ(}4Ybq1-fRX1m@AjVm0D?(GvcVt2&kIbGmMska6!`h#C>mJ`85&DZ_(m@x zl0&q4%pgB$ScjOTA!Yu5Z8h)PGShNt+Lyvz5MjUL+s1#h{+`3-W-eAw5C#lFk(N!w z;{gT>U6;iF0JlRa{{V}-@b^zp3mD<}mHRx&#w8d~nw7$-+R}i#)v(wA;x!mm!{M8M zyqkLbRb}yMYo{w~+WoH1SXIT!T+*#Kbep{7)4NLYac%VKpKWwMew+5l{{Vt!SX*i9 zrfI$q(w;eFg^~|}KOW=}!l@sV7`V{<6QfQqAdp824Pl)u(U-(czwEnlIL#ycW{i{s9w9?n_t8BS z-(;+RU02`ma38_DyvHwy{6VX-ZAs(s&+Pf)&8@%5$hRIMveIN=+h;Mg#^UlqpgWDF zaBhF#yI%#a<5!EoKeX1dl8g?M@Vmg;1*^8u2#$SL=U8Zz?h3_hor<{`0f8ULo!*W6 zSKnk_`2PSzxruWr$HxBvf%;$!$V-zYmx`^PIlQ#_jBI2Is-TdHwUc-7{{Z7;;4ZPO zd_B|&$adAgX>SPMGW_2$Xzl!Ya|i${0+A`s!WTRW@agcs1YYyOMaf&;k26i#U*L<< z>euG7(`z1*&odOP-B)MvI+api5A#VT{ZrSe{ch@C@LgYq>W?M2?EU*o-5sjG>Ao%a zZQ)pyjDW?)nW#9Ad~C@#+11HKEUE&!`DVBO00rOBBV!(!`!slwq&s&H6@Jxl>2saL zrW)Hr_+6>QjLZmTR903SaO{ey{H>pbo+bpoqvJ1tx?^lccfRmsBlv^hUy5H3G*8*z;krffx51C_v*NzH;!lh}6uf78{{RhbE}HL5@DGPwi;cP--z{e@rT4sd&BlNklS0@TwD(ic&hg5MiI$uJawkoCA4~U7MgX3 zi_HgwQo?1|KWJ?xFSMBd0JU`A2zU?2dfuYT4(MY06#9*yg*0o!#X?E^GU%k!rM7v+3sM zS&e*EHyW~(-AxtZ+KgT3ahC2ur>K_S(P!}MUJ4WJIC?LK- z0D*zu>CneD>Wrw))eKaq^3{_PgM?Hl%NXAn^Ga_-PFA>`B}z_RzRn46Gj<1iVU=wpQ}Kr<;PO7)p{&Nve^uySiTOt!DPWRA?be+ z{{Y~e{{XXu`fcUh+Q-AYFC6?R@l}M+FuSwA@Q1`75L@Zd&mGJOy4AcLec}1-UeC{t z+6hjbE!*5$N#y>PBZ$i&l%n~WP(ubXA(d0jP?;Nuk+~$PQkY%J!}-hq0D={0AG9}u z?sc6*#M=J=hllL@@qgicrmx`N2VLCh>Eit_$3G0UYaasZzAMwbIcFM4Vd0%;!)@Wq z3++O$vd~AAl^eE3W!!n(LaUX z_#~Bu-N*bCGxjdjU|ETe#s2`dUZrh#V-6#dAA;UIaM3bALd>%3cQUZ^AcRMA7}!=| z_P^X-jWkf*S|1u!Kg9R^5t~Pf_x9EOjjov) zRu2pQ*4olBu#wO=6ge!!o%Uxja> zw3k)zufiETd1a~G=&~*B?{VU<5O})kJu>w9wjXR`;H?`(7s>WrRVRYxZA4o(r3^5C zJ0I{$FA8{1$NvDg@9cL4?xXfCd%}JT{i*y_sm~>rvwNw;z6bDrr>OWcOO(VqHNJ~^ zCyL~T*sPJ=U1~OZt^MuXR|CQj59v4d!&@C+_9Fedd^K&S&#G&89|nJDSgvpEtzfb- zT6k{b;s&<`w6A(??In03w^>jzwwF^8%{|P%V1@?#JO2QJ2Y7N5`%ZjqzyAP)Q%HvE z!ymHege?3$sEuOYeMd=;;upl*oBse2rPM!So@;*)>e1*LexIpcTpJd>u<+KJi*0#l za+inbGHlLL;SB0r^17!Aw0kAvG7J5O@ng+4;@KS(1JK%Nap}#lYpQC z02L}myyKEd2aJs8ZU)jw&#q57&N0vDZmiUra&39PNm*%aG}Erv=zU!}QL?g0S#;}V z>XQDqW70>;jJG)eW%8#uWNy%kW&j-R9PkGKHbDmmYjSzy9QqywRfhv0 z0zHWB+zjV|kOoIUc_#vOKnOVlo1XKo=W+hX$kC&rf-zyLo*4mu;6~-8E#C zSL5Zc;M4E;D?e#`U>06+jPMD;$;c-hj(H~pf&c_4otOf1l5@z(&m@o+(>OavslXVj z;$Sh*;A8>2u|0_SdIsmN4s%ZPlk?zUw{XWCs5$q*JY%N@U0HuJP3v~wm7Tikx8Jco z%daZ?mv!>#r=e)No;c~AfM9dCAKk$F+1Lr)jJ7tktZ$I&&7P_g2zr1RZy^2cq+=U{ z4tfgaLO}q7$y}Uu9B{w_Im+jzM{p=EPdUa83jj&r5>FrQ=cm_ zr0%w}ZtY!JYtyUMqLn3WZEaPpe%s%F>iZuc{AB%u{{UnE0FSzbmaFlb;Y=Pa)^y8@ zyS*OkQr7%pkZ9B1-d$>UGie%Tm#W!#drFdhO7`2~Y*`*VYkw4Iy7inp6gsL}_=Cci7wV={=DXZ$7g8t)kj#*x zLO)gFkY~%bzhFSi1=Gubc;|DN!6fwx81d8=A)=U;eU6gfGVUkLwQFcsl_L(p(43G? z!baeC^$Oo>f#U4;G~)%1#6~emCGDF@dy3q*YWgJY9T#n%nO6&kZOPI~Ti(~Tt+%?G z-q(}T>fO)DS%2V<-vyyn7M~WrBt}(2Mq5tsb4&6A<%M{3>qTO?Rs_aDF^#HoxN^FW z{1Ln0#qu;${9X8ju)aem(R>b3o8~*2KeIxT00EUqQG#PdWJY9< z=j94z1a1W6f;TA&NEiZS5%M2HT$Ub5L z)Sc|r?`U15?RD$qOjZ_^o2J{cyJd5*xr*9vzdy5dP8M8)MKL z3N*!o!Sm^B4k0aLCW$7PnqA$Do=j$KI{L!q#&U>fwwNj{ep!5Y{{Vtq>Yg6>lj08q z=)bf-jI}=qSlVcMjg7a9JSC%Rd+(D;wp(*`_H9o|x4FBDdWWNSala@h)eF#Me{mFwA3FF4lRx`-ao)1oO`G$q@ZR zib+{vxyhI18%iuvfEbnk zjPPrQF!X0pV48l-yZvIi_mYcIcbm1Y-QJoX5!!#j3w(7xmFJ(@C*hZkHMl;@HKZEP z!;cgAIV6JG-r^ezJN<6U#J)0+$7LMgTAP0g{hUSR$8n|HA~Cr5zsEoDMxWc;PuDIj zyf^T-;a`t*uRi8WYs~}pgz&G2A%+>{X-rZ<;~xinJ-2& z&asK_E#j7Fb~ev3k)AVv3rx866q@X!Oll$P1@F06b#q-ov+@N7oS zi^&>A;G0x06HFjC8>N%_6~4JyL#5TZzg$1dJds+%=4Wxuym5{R&(1`r?(#v}IqR7$ zt+Mf1*y+q$=GzQ%hDBw`X%SJm3>8ZU0ho+72p)AFFU?e(m$Pz{SCplSa?!_EFRaE^ zy_K)mey7q>@c#e_UzROSFllndLK2RuI@!g$^jyjP=ks^sAJ`}Mq1Hi!e#@Q^f;QXc ze`fr5@GQiYXjx2i-CgO@JF6ht%w=Vb757U!8Bc@wi~b3F`$&ND!TUGasM#Pn__Oe) z`-Nc|BS}AsboS20*s6zgKq!szACkY+{obQAg_ED3-2VW=Xpl#>)s;M?V%r#~cT**JcZk1X&)P#kll~F?XTh32 zm8eD`))LcG_^a@uE0Ji@+`_jWLwLYVBx^h}tfENC^Kdp{ke}>VRlkeNwwCJE91|o= z8J<^N#fvnBQJq;?6eA%=%Ps_i3V#~EZYxU|J~`M=2~=CJhniVd5V?jl8lJl%BP6?t zSsa;UMc}-QtMfZ!^v)LJT#1h{hr zhn6ZYA1NmoyVr}o++yPvsVA#i-rY5K)9~m183*I!a@>aS--pVEc$sGSk?__e^CU7W zs9*R>P@zSRR%uwMjH_Zu2*XJq?2qx|?AiXw_;Un)V+EG?;@^RM)kuTkWJ^C0U1B^& zUD``#%PO>kd#gX%Ew)MSgqD#cjfou{3b1mZF?kGVqjL}t86pED<`Sx+q-MZGS>S|) zbqpl73RzK9?ee^}Qy2QU%CW}M2Hb!p{Z5v1n%7EPxOm+yRT{Q`1K0PmR{55=wPrt4=BXk44+Bnep3x$v+(=a~Sa_!MkX&5Oz-)!87khMPjDQOP3S* zk`-r-3OuPB$0WsrG@tOspBUL0pT-{vQJ3dYW3NdumPRh9KssP%U=f)kkZp2^0g>6> zKf152G*yw5_+v{92w3Bq-r<@uvVy9mW>(zIup=43eXA5tv>B5s<4Mw<79a44=?%6y zwxF_+B9NjmL{*A1!7@Cu(jzN{3a}|g1EJ=btvE@>tr~hewLZiw_WZS5mj}cAb0iX43A@#@b$&t=Q<6nqB^z9FbZ_8{S)KO=~WxsI|xM zb%*>D)8VIttn9RH2jH*7?-R{u1a_A`CGjWi_wn~a)b&wnnrlPS~n8nL~S+}|tl_kBaTthY7hT24XX12H{A_(BR z!pfy~6jL0E-@J1F04tK;%RVV_26qg}%MXj?=cJs}X~u@CZC$8x&B`}=&GYMfCAZ$? zm~5vcrA`sSI+1JKoT^uI=7e-y^sy0YF-cxBN}bx}O&^UT_8YW`3Rrv}@wbN)%TSYP zzwl6B+Lj3;Bskc@4L0Tyv8xEsFm+XVN}}$Gqk>=9i&HU?H;8{|y&@wi1|0|X==iO# ztZK{|nA&*HMXzw za~8ywTRE=UKQ8O>A6fXdE0>*sjj?3c#_#!!3Tgp zXDv^~nwyV4R1KrtN#b2IN4dMVNE{`*>nJWkf;W;F<7i?2x8NLp8hIrQMmmh8h?MF^ zPB?c~ZV_okr%MSW?4QKmn(DScI^zx>%<=h;`yB5|QG-&eT~S=pe{IyOOEvvty=wot`dBVh=Y z+jMC-Z#92LbkEu6;3fY6g?wqN_^0Ehx8eO}%JV?C(L5pIUxt>=t3;Z;?X{HJmxx41 zPiZFyNs?7eP$c4^_K7~p8EWm?o-Cj{d-<}_#VxT{8-Dmg3N zHOsr^Qc6&lFTxk!6@DnFA87GrtulbB6~>(`!^)AF7tET@Y2#qhkk~-kBx7t~t`q!K z@vDNfc$#D*bekuz(e9mr+|oIDbk%kTa4Hl7BR1oZqi@vL9u@GyvnzOiN+p8+_E{~{ z8|5i1gg{~5SshF&6%|U8E&~%6CwXDvOG%2y;O!=0u0a0)O}LgsWMsi5Ev75AB~XL| zoU3g4#A(@v%y2auQNuLWt+*)lT^*ZATc)XLeUHzvoIS)8uIkp4f_$=)saAGruCcSy z*6G(vpE}R+N5^WOTs|U^mjfBnbd2N^v^0lJGB#0|kWit0xKR5@&zIuQ#ImM8_(>K$ ztQ2n0JTC58T1Nq-mqaqZ%*-Tb0PX-R+{0Y!w|8nDp|)H zD!%8F00jy#NhdX3G$~$Ghv9|0Ad+?t(B3xOI3)SY8}5^C5RH!tma(0A6HBa3oY<<`sM)$~vAx;}h=ihewb zVxz_Cf>vC-o*wYzO5ZCuC5DS02xck*F)Zu|+l8j-{{S9-DR_3*TYW3Ws2yUpaSC{U z!+UOnO*>5tur7!e^x*D^XNpxtmPHDIpFcvbnQs_|SbhfB+&B7Dubcg)YNcb2RYz%L z($PsrmJq&CP-Kf~E>)a+$H4Cf>00fF#M_Ny;BSE8g3nCwvRccpTg!I8Z*=i(>?qd5 zMvh@_2AK?#+`$Z@G(~rrL=#5*`JQiwrG}MHt2;(eQk17hXDBNxzcjVBn`+O0g*az4 zubI-N9NQG!sbW2vj4`(5_D)U7OM5-PwdzA||C7I8~=E%fAtDl{85kqkh@ zhDj0>mRTM)StG%Xa^P*;46php`$Kp#KLmVt`0?QDFNfa@>~zlv{6X;Lt*jbi!=l-N z;tz(t3f6BT)7Bjt?V+=KtE-!reUM2l*Yf080f%b@bzg^oN2*bLC2SsSxzyPnv7GlZrWRG ze!B4S22YEnim0mME6#D8;M}>V%;3~qxn1QHl3G2qNm|zV`~DVhjiil*=A72b1CVYK zR4?-?6Xm=yt08a@CVFmmJ7O51{{R&{K?@%{U5+M1z={nD>T&{&%)q>SzYNNV6GjcMr9lAD%^rDnNjPe!$C-hOvJdb9X}sLiF_-`eWXL8)2X`LR0qa9UrY zd8O9)U4<~l$nm%`h}ED_kb(pG?dpCZ_|L6;N!O+E=ZrPWePddh!%WbpcziN#rI$~# z)2*~?SlZK1OE@NwTSF4uYFF1c8imx3F0ZdHr*k2XTKJXmH%`4-bbl9W7IybmD;(C* zXi(UNnh@zD$M&BGDULijk_cxHAS_HSK^f+t@ejq#TTO~9zZ_~Z+g`wz4`nBap|O0p zZP47?m}8kI4qUPjsH){xVm2F!X-aTya>+K7lzCSyxm)FLy_NOVrLB?APL*nMbk%9p zjiVwD+4gUD*KMY9Mt2Yxx{$aEzb_@Z?}%T*_l>YiqH1L1#y&0>wK1AT3v3`kK!Ac9Xc}ECm9R;BmsrZLMdx4D&uiUDmXgW zo{cGUTUhC3g?@eBn%i^VZeh_N1mF0Z!um>u8=COyFTe`JK2#-14bI#EOO3#eMG>xi zF0;tF_}Sq5X)(WLu7~1nL4yMLeYW-rrPO(0OG*JF?=EB`$n3l|q=ym3Z+l@OUHff? zrNdx?=gYUa)7nN-h22>gW?1Lbmy>oIY%n!C|A6{>u@T|4is`IIwe-e90@E4{Zrviwx= zbiM|;ywtS)R$I%MuOQN-7rJ^wa@M-7z3sisqTX9{j3n0UG;yL!H1@_&Wt6+CpA_)^ zpQ!0tq<1aj4O;#g5C*p%2eE+0EoG8I(!6>M7ax{he!bBczK2i5tYRIw68NB#PWdz9u6utB1$s z^xWHxM^-IKLzYT1rS8c}`trACrF-4CWPX{E<&>*%UlL;DLMn7+g;0L`l3MM3U*^^04eT2r0DF+{#?re;JPecffgl_c)oS=*)M_#ftbEH$xQ5J);m`w; zMiIs`4jAAbfTN0^5ob#GTtgB!vUzJ7Dml?$jmRN}sY$N|Gbo z7BbuxP(T|u5Dy!R41N-#pEHY#QjOJ}-mz|A1rJ}LAVmR1Fkt}tsF!L%^&X(n*~F$ z+Q9Had5T$-Hqdc^#~B8_EHyP!7FKI*@6mZLCBI&mvEt#u)2 z*o?4L$t8lEZd{_Qi_?wlS0tQZobf2Q-D*KHhB-x0s6w5`YJJs_fZ&43^BjZDSlDZA z@NaT=DOnUg08m?L!U6#~1MY$VI4D5Lq%F$E-!iFP&w-tzEadQ}E};54f-$v81k5Nw zZD(lRE8h3Bzmsodx~|qU_EU40G<0xE%_Ohx+Sh8&dn?)QWiSdCA|S=aa&i=t)Zk!l zEL4D{axw#+L)IZD1AolNINH&WJFfiUNhfFsSx6y*fPh>U<(+Ure1v9mBPqZoKy@H8 z{Gl0&<~)y>spY_k!6B0)A1q|47}{GXqXegJ<8UMm{O+j6Hcs0ulhxTYt!r8Jdw1Je zrw&E%r45#z@@m~zrx z;&yeCX<;PGs9#Ger;{W_51BNGp)g&G9i+YwlX#s3mfj};qREEhI9XZNUD3uuGpvm| z$UZ=f#5VjZhE;v!t7R7(xg}+5B-3qK+WPs~CYI*Uli9_z)SP3q`M$(cc71%b)2;Ph z@vLheBevE2Gjpf-pT=Ghi~A-fYmGu37JVjrh$EfkR&7xwyf;zBBr|~{Ll=^W5G2K! z`Mpy2Sl9dqe`~Kp;17!JYoOg++3FW|-`V<#q&l_j{E=yz^`X3i!&6v`MQZRZn!LLb zH44%Q`&sUMDQr9vwpSK@6qEiC$?oOzAH;qlWIisptCZ9dlw(M~K00+JR z-F$lR-12_UJ~PvNedDbn!EQW3`!Re*zSDd;@un5Gwvy)d>)_XjZ{~|e_@!%UZxz-1 z=y44X#IQ#KS~rI^Ip?&vz4D0sH+K4#siVWJc$34vE6^`4EcMR`c$dRh`Y(#K4MN1o z^Vr{L_A!g8g^Y1Lv&$}-XC11tw5w}x0Z3`+o*K6CE|Fuc-9XjOl(4{-CgM2mtp&6WliN;`PTyha-ygJ}igwyhg}-f`Ctmoa zZ{eve^sfv4)V~VbOz_X`N8mGO3_oJH)wK(`W77UAXgVBk1P`Nlxh`*?N`h(ZJVm43 z+e4~a`1C1CE-{o;(o2>}$t10J8#T=rYgs2Mc3L>}%B43J?3B~yT(U_`SuJ_CoNleE zjN853?2nWViQokFV)(4ZO;eMH)*TmROHDiWy!c0?UHE^+J{fuML^iq?$1ej<1<#0n7Wmf8>UQxY8tfLf z^Ipjb)4WsSd-HL2zEusk!`~SH0A_0Xq-l3O<(WEXihMa8<(zkfJ=%rTQqIO5Mr4W` zPbU6Ux7Mz7+mAXuT3fd>+Szofl;ZhXY1%hdT*);Rwz_Mqp?2Ecw0SjjQsqgfC$7rs z-tDc;86{@pH5QY-l4-w~q_ejuKz}HO5;D&|&|~P)n90J(6tk?bvMYY%I8;+CxIfu9 zCPxc9FmkS&9Y7$EK~;5KjVLMuqRl2=b6Gy;mzYT8V1lv!&5mk`f4688@l#JnkkzoO)VIYpw6mcJ7|UQm+`d9%h=;mEAViXRY3eYtb%@`6^3MIM?NCY%Dj) z<&vk&OoB!Zz`kQBSvGA%`|?H^PU`hf0vMY?u!|~^ZIyGG7DB@Mc2x)iDPqV$K%;qX zoC=p+@Xo)dCcY=rZe+Kb-q0-8@qMD+Qw_X?GTcV;2E#O4o*5+&?nHH56lwe|9ksTP zrv0R$17T>UK)Ht^8v-S)|A(YJ^~n7=m|hQey!^g3cIZ7Ta9& z%O#zyz#$w1yhSKKXO#mV-8e-o(YbbJS7M3-Fe(89vGEi}FA>}ftNE!MyPT2cf1{&s zQM7^x-pVtUETDowROGLKHuE2x3^NeQ%DHBYGX(=12n4SLji(qKubY@)s5)-RMpo4= zFQiwN?@c>)M|B$0icT`SQo8%1(%W_3+djL$ufJsv+Sm52{hb?7hu}xVS^PcWST4=o z{{X??72I3+_u)phX{bdL-I;tftTeXvcUpz*vrTcUXhTQW`bX^x;Exji%U(N6xEAln-wG_{_>b@_Sc?7#jpg5nejmqUd*Tfi+UDG?nbPev z4;<=IdAAZrt?BZ#7Ir_*U&F}Zf*n@oJ85j>ceIV($X)rQ81C7bO}t)i;H8OU7RD?i z!!GrF{c>C8xzwc>&v?%yDYE53n8aQv0uL-g%(37~T6pAT2%~H{R$rcmT@;kzImSu1 z6q|8rS^LY~*<0bZ`mGOl4Vl-BAg0u!k4xfzjZz z@eYK>OC4)WM|mU~UbAPY>C(BCB)4UeNd05@J^ug&j`2(CmeT&yzYH}00269^VYImT z-S9CqzlPrwBzPGlT}NH;#*%cu40w^?@{)J9(&g}lv@xkfiexdx53z;Lv6yG@ml_F1qiDy1o&M9o0SF=*( zyJViy zF7^3Wb{Hr*&j%vDhwD(S3%0E#ql?p2l3wb4AFr23;5AXaRjnTRjW z4sbCx*Tm1vXY>HO0fz-yzj2sbhW)hP8#H8HCsD5qAJP_<5^ug zfH8!Sq^}q_0Du7i44j{v%ymD7mM8qJf&-U*K@YvQZP7aw*zJy8J|D9Q}6 z!lh3njifR*2;hO`R;PQlYbB%RkC$63C+f9cjat=TU0T&jHny9qS>H`9e>0oYJQL$z z3||dn!W#aireDCpl1p2cv$+@rf;_fP?BPPQY+wOVlDJjf>=6FYzZN63k4*T1r`q_o z*4;vhJVl_|YiiJj-y$7S+*<1P=1AGmWRCq>A2Hn&P2|ZJluzQ%hN?qNsog;+!QU2< zf4Kb3xcS!KFx*O$g>083=V3JX{v!A;AKk@qsA>oS08Mv)Xv2es*?fW%i~+h=01#JV z1u8>?YRWY9a|pEvIT4Y&x}* zf>~TKwihakw1!!JLb)Xn5?FFpy4HcEAMH;A-)f!)ySQ~ee~0x+H61GAQ-x2qczXRM zQO3N#Eg?iZ0f_E4}pQl{Kd3(ZkNmSuV}{(Q50il1+aq zjNbNEK8lXoJBXTV9Te(z%2>3TL2Xh+WyvaGNnyB97c3WZkf_)pgEHZt5%?y~XSHo+ z^TU_n_DO4bpz5=gkmKZ*-saWq$s>Tidj0Ln<#I=w!Q*`&SG!3(d2g%R&IilmPlhtb zqHC~|w2ALDnS*Isj^| zFB{s#3G)(JFD$hwBzPlHn~QyM>>Md}1yrKyvAU%QCY{rEO50hqr3S6D<@SkPcDYLq z?RPY-X0ItHEv~MiQE7K|Cr`@ky)THoI1cN(q`qC7!G}P+ftYSAt($B36h`0;uZF<&Wz08YHo_MKnC zI+l`2Vr0`{xce}C4gOHImvI1K$kIs1ETjb(V?sS|M4J)As*7g~2a~PGbm`7O1i37P z0C;x+dE65R9Z|$y(P}Z-rjl)~H*>c3^X!Rq`BQh*S=#!2o9(XKJFEJhm!|li!n%@| zmGw(WLCYo0y|g7s8QZoUP-b#}kau!@vb zuO!yjmbx{4HC-1^Ew_01S9u9z{{RUk`whi#x;n-W4Ztwnq7#j+xL^RljPDf3_;A=F zPZHiJ2cI`boCV1^W&-+9-*=EeJaow*-cJ->p(f|VSH4~{%WPsmN7-l$G3g1g9!cgq*CB((TIK ztgfe~x?gSf*ms`S=G#P`nx$(blDB<*3XkyS0x=hlbnAw}%1`0VTHkIrorRVnGC&{R z>N0-zD@pM0QBr)ZYeczG(TCe1J=8M^Z9!6UM$&%hCj%fIlktbbMRRd=tk~s1^HWPV zJGcXSnP5g$JD8~0*ucz>_o+w5Plmh+J|OFsL>!o>@Km=--z=MnXsz4kI6wvg%MZJ= za&*FQinEjw>F+3~vg(E-Iaxj&c!6-y-RTI! za8SCEM&oEFIC!HZ=bWw%4&%YxYk$Ha<9kAW&vKYvN0+a`gMv;lW>Crq1TJt&jyW5; z-}qZU4C4Whi7#-&Ja}(Xjm~)9Rc+L4ARH;@EO(ayn7I64_+&;8iFFb{DnZb-RRm?Z zIDp`|9D~oy2H~{gxuLf-bhlV*vg)<9`(5A3l%p@@pG9s~)%5C?o_lrCGnkYJJye6lu^*yEg@dI4wt z7O%sp4<04CPyk=vXu6=t!6f7Cqa>c42;GeE#-VSCzYfp*%<=+#G>uOuZg%q4rx@CB za1YD@4alkHkMl*lr=*fr_g?Ai+pm9EaB9uMT7PxBt4B?j%hBn%q@E%1xF>#rZl`Jc zx4CYosSy+zY?aR93lez)8WH%L#z1r7{D4ME>M#&;c==?2s37Fv0m~i7X&J)*0EMsc z>|-7*xadJ6NYu$YiQUJL6p%q6oG~sLn4Ezb__y%;AUBGyN#Rc27gJ+{mFxCyNdO<4 z9FTrdx|*75%1X_r?#eyYwzb-AbzN4PnR_|iB~E(lq$O^ay^`qt7gTj)#eOIN5BNo9 zQ_eQsKyY*a0A8bxeSeFBM%r_DyTv%c@TBagkDlfbth}57w*=$4Ugx(J%#Vw{1#W-g zC)9I{9BCSm8RzCXgk+o?k~uBTFu*AIv*1$8pA=u`r_ZHdU>uSO&8uJ$oP&}FP{fc$ zD6JbwukS&2eQkYh-_%Jp_8&*^%Gc8Ad#!ovcXN0C6TM|~yWz}{ADfodkw!?)KsJgA zAP$4MBpee=KM}QMI3EsJsL2ESV|iW<1_h%Kq~Mc`4!sR$4~c#cWf<|)>bN8Z(k4;> z$l!|+oZy~D+~YmkoPHqqJ;>eT`AEqHPM0yxH{^_1k{E&N-A_J=wCtTlYo)5DyKL{< zef;{NUAC;A_WN4xRf5z~WbfKCA<73AZl0J^>{@LZoM@kPKVpZN8iS&ty_Y_Yc)E7vSRB%HBi zy8i%zB;mYKcKz^l`DS0@`=D5GN#}M69+}9facNyt^>>2N*>`Du*4MLTC$^W{d#!Zr zlYW|O^F?L&hDk3chusvN*f#)bkBHusq1(|WwLp93d2Lyn@ ziku!;E(qg*K&sPR{5y~mn!W2D8;u_IKp7-sZK@0$6O-2?B%HNo%-#hgnEXMiL;($! zu+;%lxe9g=6KKIW+uMPXR=FHCf4+-;v36Q_chdXm_g$R|O4`Otrrw)cKk#*Z&Y};B zeja0sjVoTV9e2lj9nJ zZrlF0TUW<9eT={a#z8E+cO;#(MYuH8MD<&8d0l(8Ro?c$uCC*}WVv}?%}U)bd!)2o zQhjYobWiZ+SZLB!+3_mMkJ4t+DO=s zn}P})1BT9a5EveV72r0hVi ziu@IJpn{@H+Z%>pIsxY?ef;16HxtvK+q7{F=(X8tcfGCl`{~i^YnHJ5(N9#mw3l_G zX+JyYmdy4sd1l08Tm*j#r=249C~%-;@Bj)hayj+29sF6s>qCQ(|cM*H1QRd~DZ{PoyMgK_s{{F2`Kce4C;zgJ`Bfdm7f z9=xe1feFY z-8)@bf1ho3)YJ`-PCH|UJQ2o0T%LV9a5xz>xyb|oGC>*Oh9D5Y<2($g1Gd7T;H^^M z=$|O$jP)E0kO{^}AOHqO%t1IL^A8^`dCA?LLG&BCo<8>+jyUI~J6hc>^Z0aI_UXFv z(8}+pUe?!ZEt0z5O|R2Z-Ax;4M%m-KFb_s8m1~a>k_*3_Loy3um zf=&-0`U<7?hU{AhfJOl0sQ`?Q2sr0BJ;|ue%!l}$dJ&ZcK_CIhVtE4uk%8@iDw9`w z@8p%1mPw|b%WZes>7cW|t7~5S?vk?B>fT*?=xN}A%lq;e@-j|309X&01J$xYBxRlW zmpJFX2SK|VfbIYU4CH`8&1ILI^kNQq835yuPH;1Vq;rgQ7|v)0en~kv&&X1ql1CRe4O)~W1-6SJc2T~QU|Hvbt4!Z z$R`}*ARdG-BZjZ5z0$VJYjWRJ(Y}do(dZ3r@@?Jq*IhTas$}`c8RQIt2^^mP0C*m9 zG0Uwg- z=c&La01R{$qPJhl`ubgdH#ypA*{ypPOA<0qQ-P7k8P5lvnCqWh4$4S4z#pCmBc=!h zA6}oRH6BUNP(}{{ha0%SCj=9MFhK()k18n1?gny4InD=Pe!OQGI0uZ93)^e;^GQ2= zy>ItjXoqBU+(t>@ZO=Kz4hLbJV1u-D=8&;DIpBhLAa&i(P!A`e!36ShMF%Gxalqsq zz58SjUby6*at=?MJunV)*Bo)kCyq`>Jdup{r*(aGO5Oal?63abesN@5I*N!>l zZ5=p1{GK|No=877LG6Kof-*vp>3}kNHsQb(KJGXjas~k)9{oup(*%Lf2RWc~_d|B$ zIdT9w1QCIgy9IJ^Njc^1#5(LFKcORB_7^0XfJD9@Y{Bj;uh*2mvE-C*>Qn-vZ`clOw|j!OjVG+A)R5J#eQ4;F@f*_#aIF09`etk}gSKv>T#8?gVB<$;$04pdNFM z1thJz=)CUqT_0uU*WlZ_Pg`51(%+`N^iNN?;l%dEw%J+BJMdJpJ7nX4K$U?6k`5FO znI5|Kx)+Hx0-jBelC8?KMn|a_QrRW2I19LejzBfF{{RaI!&WL%!pCzi)dgUeC*{N7 zvZn_maB>ITV4yW+-27D5<;rQ+zET_zTq?FOPFo;u!h*n&l{_ir65F#&nK!#h?5w=E z*3b1h+Li30?B4vZZ61x=qgvnO^|x84{4v$;2yIgOI8gFb$gqv1XYK;Tf~pR3fGOnU zfP0Hi0r)3O8}%(($12B*qa=WF@|-ge$_X3T!r&5A?k5B1n~xiKrsMr(@rh2+wkFtq zKoozf1fF>xD|OCE8`}-zshCete@h9!dy!K)VI z;$Mj`M%!&Utx)3&6kba11f9XIo$z~u1AdIaZ(xbJMp3Cg{e=~1y z^7N?CihHisd%YujSu1sV-uvlu(q2to^~sk{3%&Oe+Js1_aokHNDYrkw*#w=;PDe9G zV?1~*ZD^!%^4${3a8CqJ*pf?aIXUEzLGvWgpiCW?=Og}F>eJwnkQ?N2v~oZP?%<4p zoVm0sIXU||=LbJ;ypgyB@w(@3G2d$fFh)mQok@QpT`c8f?Q88%N3PGOeT(EPdVmKR z4S)}qof0MB+(-`qjq#8G1BJ*WamhTAPDv-`Ak(8mkF`uX^(uMqpOYkaJ8*M>k(J6- zB=?KyeQ$Q{JEWv%V^U$$jom`EU9OTJ$*m;sKIa~A~$iiTZdlS?Qp0X{9f6v_6 z>-PW$Ju)z(uHs1`1GIO=YNYS*E|-{mpWY?s_x!sqzt=<6jPeiph+1F_;7q)n zpZ1D?bDo*wo;t$UmtcUpoth6-c(cw9;5HC(jz=Wzz{oY`vFY(-lXZ2DIvCXF2aT-} zBcc1FgY+4_9j&kfeZ|`VafX@IN3K;0=Kv5081=v)7OHanj@P`erTmv)Eq>t9t8eRP z+g+`#x_`s>65ih^{pX3!5AdqR8sj97B_{H<9Pp7~ITQX9J#tk}_*pVx9F{e|A^DOHdH3b;n(FFi7$=LXAhxd`F0Fnq+1D-iJFRdN*vkdvq{nD#E zSjg^I%ozD{21ap$1_lNqG%cKqeEsrU3`qw$Ah=BK#{_2}9&$;P!x_iRV#9-mjv#j6 zb#F62Hqc22kC+qb*&5eL>#el5`##Rr-)pzqLb`VRx@ptz^w8P+Zk`TXR_UCB46*{C z6N7{)*-0GW6(ryiSMB0R(9CpqLYSE6zPkfW4LIz0P9qXJB7!Q@%_{Kr$zz3luHCOKRlYKmu_xas-(p!3J zt-bv%ZEv>At-D&~v#8oGc3fNVF`p&E513@(c^Li55+?zQW`Uy+=fZE5JV^1rV4`@5WMnxOy-`QVTr zx{-aIdXdQcKG%FPRR9kBFu?{i)K$*QJv_)xKrIZmTT5v+eRcg z$Oi?!MpZT68WilDoK^PgrK6))(LFU+Z@I}gHTGoQn!BX0Zm;EQd1{X+()>B%-Apgo zbPJIilEQh9*saG5+swBY5JUz8@CgI`;z;fE{{V&}H&*c{immkJETQc5IHuJ#4cKqp zG|day!p8vwiY@?Sl@dD01iJT)w4E5p+P{o64G1ED_EEgL&Z@u#V2fvFFJ}x6R39iQ zBz(;nlDvmm`17E`zE**y>z*dL2j;oer(Fw93&AfPt+=_rxa1HcoZ7Kb+__cZuU3@_ zHs>83xm=T$jV%;hrKQ(PZnn_pjT-e`lpib6Svxm${y8YeORX=ix-;o*Cd1)Rg&h-4 z@Qt3UslLs+hl!+pYV63s$Qs(&e9LItV*-B91QIj+z@u$i>NP)zw;Fs+CH2DC!n=fU z%O#e9YOA;%iRVbuGH)Rje5C{eBW!LX^Zx)*_^f}O5P!@e$!qjx-B1u>@Do08ICy? z#7Q!Y3^2IAmiu$=Rv?>D#JApHsKGak zO7K#%(%m1sx@zs|x_aE`{72(I9(c8xyhE+u-Nm`v?AI5i?bV4NGFmJBl{iHJLjvtk zcc8%)%k5SeEYiA?+nBQ+>4YXofxRcoQOlH z4Cfnms3Ag&eGes-OoJMm}dEuwo1+KuD8>tXRYn9oNuM|OJ%i_SF=lHWYc!n$m%V> zdo~wxp^0}Y5sj({1s^F3zsxIu%tH zEH{kx;!>#%^?K~>)5%}t^wU?XL=uLYb2q!S)Ax5u+P3@KzQ!ivp%mb;87G5`Z6l{V;DB*~oczE5MgS%ASgM1QpY>|xNZ^jg1&A2qkQnd* z#hC18m=YF2o`A;0b|8!~Bod$uD-uHhFueGxgq*Cd*ITZR)_bm(^uK*gl$DoFw7SyP z{`ar-y7wl?WhY{{Ru=<~TSUj+n=*0l_03wqVfa zVhb<}jF3tL!tsCz;1EIRz~qo{YibQ4QyYqrooko zJEIinr0(3IA0^3lCjbRd%Y`7e2>Dd}!#T)gmeGO&1{mXU40r)>3!`KP1gHe@gVPwP z#i5ZDDKF}udSMD z`smkP5tJn}oW_s21{Huiwx|agW;rZI1B27=1ppebu---hQtAmD$b^L;9Gs#`GN(D( z0cTb|hP2k&-81DP9H2NbgC00$Q0pO(k-3LRfFm1$APpEajYjPZiTk*K2h5n5Vc0TH zmh9j@)!e~Vizoq1dq{KWQ=w?7UhP>sEv;=^x?1&CyZlTgH?Fs{TCVQeYT9?Zz5f1& zG!V-dM!&ssxeEoFs3o#K^qU_6Njxg#=MJYexn-gFlT%uJ9-uym2XF)=yrg%v8i3$oNqAc_ZIf7S%widc^4BYciaPSj1_Eofs`}R zlUMK!qbu3?LA6OEVE%TutLhg~fEA8SwY2v3&I@uu0V8x}AyaPM+fYjBB^y~buhFiO zNqpDjj2zNlcGf$|Uea_0&O$34OwLb^xh%l|HYx?cH8fp>*p)G7J+T&2U zAqZjSS!L6oEkg!=jvZ6M+H6vn@h^xzB3(dKn_mv;vUn%L7O#`Fr`L6BQF%N(1}$%= zTE`-N?l<>*m{{RE&J{-~K1h+ z7_aV$02d@NA7K1H{f#~!!6XmyHcu3MZ1Eznkvut}Y7_Wx!U-$0G)r*yvL?MOc`?kg zwZ@+W(MZoVjCRboXnkR*`?8WrYj1Twh3jEC1Mx2FPWxIy(EKd;Q4|`Mxbif9VbgUjVk=w7p?6eB1k^W zauEJ?#m>2^>Aq}o3v|90Yrf~@4;_Bn9~t#qORWRob@zw=0A}9{-0!rHQ_{4He-Qjz zy|t1v=B(Z!c+hG0m$UN2N{$U;#^Dj)S&lW1?yz++6&=*2%hJxuPez}`cJ$WrQMXMA zqlKKl%8lB*n{HQpjcu~qXvMhol0M^}AA?`A7lmPcL&F~r{{UtE8s^Bzm%bs?E<9cP zK=|&>{Iyf1cy24(?-_YTW}e-qpHGiRmg4FeUdq*7oMi>SY6e};ED zD__LR{{RaI;@XXC#+UKjLg<>Mt)0!q)xMi+1Q5u!wzEln_QMwVZ0-EFOMieh9WLI} zRJidS&4#7o9~bJk2_~iSFXBGGCyD%5u4)p?q?rfVBf8bsQn-Z25=E#$ z`=Kyg&3QGkU1wO-E$nWlmPE99)ap8mfx26kk~K)9g6>sNVu_>yWAl|J3MPgl8qUh3 z?H064RMKkc%Vh1pyLGMGNhj$;4H#Ldw>#eYB%8IGyVl;VxAsxf_}j&L{{V_Lxcp7= zf5u)S_^smA-S&BPU1_AS(~?zL1+|r>vq=t_X(<-XJT?~AAfm=3gb}#%_tW3r1iZe~ z(?@_vzDP)Ql8?U^ZCAM-SxMdLdpj#PveQ%2zA|_R;y=W{j2ix} z@TLLcD_tYPn#aTsjas*cyj^E!r1&z&!{*(QSeWrLE+Gv*7`m`3> zhlw>=^&Lk+vegfXtu3_=m-K6UZxUTitU}R1z8sDzHA_8N9t+EhHS=!hvk*O0yx(F_=+v)!R+JE9*&xn3He%3^I4);g#uZlcN;0-agjW@)%I=-2w z_z%IFex0c6nk~+qdEtuc19tp`%@r22NO?LN0&3!!Nec#6YP z(rx@Lf8!4aSlpd^QLq=$cv9*aO`XNQk9~8f!)bY_dDf1S-P!%BJH(O|y0((iAuO^* zNu%mF}U1Ruya&pD02I}(TbcYsL91Q%@p0P z^wv+AB>9T19EUSl8K5X+W!<_kyO>BF8rpdx+`PtCL~YFKPV75Yy_Ls{=i3dYq==}d zF%W$|ONIzY4${jVxs!RwU$nBA*-x4BBD&YKwwlf~ihH|R7(*JCT|zgLG8lv{97{E) zEXn1CAwr>Jz;h^M{{Y!r6v?U0gA8s~3-TN*?L}M(oUGnre(gw)mqM)M5ZY<+ey1LnpV}^{B!EKoIWbNaWbnZx{~I*aZU65S8B~R+v~5Xld4(YTI$-8 z>hVdX&XPuESG=>HS9u~v^KL{FBuKL=o2a3ZMG)Jv##?bA-)jx5i4#E_m#Cg%v%-Qk zKzjMNQQfVy1iSf#_5jh(%e3}j;v zc{PHEBh|6rz_u!jetu?PnV_tfR7fHr4(srGGxFPI6IqlX_d;d+4l_*(*0> z?)I{=(df4N1^w8z*EQ>_2%_^F`zyoxRsR5sb=#!~j_C#(+en1XB8z9ZpHx7y=2@a> zlMnQFh5jAuIX)`$+t2@j;On;%|%fmXmWw1(t!~tv1@(W?=T#e{0nB8(849 zxj_@M7^hj;(N^5Amk`FLJ-aGbn{vFAIc0B#+}zf)c7F@M$z55e2}V6W z(vnfttGQl2SF%34hxT~*&1)H!*GKq$q$#u`%+|H!mV0ZLQ#^@pHQk|0X$Vsyx@I8` z$BOSVGcF1JnLZ?4$@bgt9eg?kPn3~2h%WV6R#ZtumiEy_qh6}X3dT}Zw>T0qELRZ7 z8K2911*?A7ekjqR@g29sKLh+f(U$QVJ!j%|-++83vh7Gy`$pGM@s^9G+v_3ZL=w-X zUuv_XqEB&Y3~?p$Zt6Zc_~~T}$*F$b{{Rd0*F}=nNd6t@+ODmxDyWs(-rn!S9}D1V z)R?2UNi>~ScqD;rA(B&T94~C+jOK!uva2?lagCG}z1FmxlWlA9a;4Jx8)5lWBOhp> z{?9+Y)3UlvNx3yG;-c++ZL#zxg+Jh({{Xa?j#E{-_-(06;~hKfmr?kj_*TZ#!rB*x zw0lXVY3}d7B78yBd_QArrrbs%msNW^JNvtPe>DY_@wbM`>+`eri16>jFNR+g{6+BB z;LpZC_*`BJ@XfY|XQ+Hhv+$$ZXqJ8|T{6J<%SZ5Rmlqc;;!h0dJ|{YcjidOv?eyDU z6T@l!ucg>o*xf;UdcP4hFBIN$9iX$H%&a^Osa;xFc{)@&J%y3fiPC?y?KM3`rIO+~W0v~V zSlhkhMiL8X^tmLwxoEb}a@ICQuA}0`&b@Y&V$*5bDN0T;lS_Zzh@n<&C3aL)ot3!^xIcy%FU;fZzQr8wwB`INn;~jT{WhXOcJ)(XKQ%w z6(mC7H<9H`&Kc#5jhmJ3*E`x9Mv_Hb$t}{}&popL0Lx4&M{#n9h{2hB?aB+Ykr2v{ zK=8+b{7TxTwWo@$F0~&88SK8)@LXsbUx{L{XkC!lY4%fGeV%Ci#*N^(OO^8XO9;tG zkD@l4@b<%0`yKbePZa9j5KD>L-ugd`_O@Oik|z?at<~<9-W<8Iwv5VRxSGb+32s1E ziW$tZnTHiTyBRw>O+~&)^D2&ay0Z6UG@*TcrS09^Zy8BhMbm90`J*_+EhDGC>HE(5 z!F$_i(>`!rO7aOs#g4UcV<=Tp@faW@auDVbBxxSf6sFbzih!iD0>Z?eD)Cg`HRp`A zdC)c*IW-u1X2KGxpp_U^^2pDyYq!1;)r5Al4O>IEgDDyR0EK&`kRya3 zhBv#@v`sGN=3UB&*B1#qvj7@m&Rts(bngnw{)eUbv&$-2`S(5yzO=|)#5zj$1&XNL z&Pa)T%tS*g5W5*y}h~wj3n06&X2g@ z{Oxm+WE~Hak~)0ESE#p#tR~9G@f|r(cCUo>)W-*4CJiwdu^7lv$H};ie6xST6K^Rc zekQ=&h5hG*{A$Ak%}_RfWx6l{2p{h#Amob4;4v#_d#h_G=+`ce)tc+Fy{)dIRj{*3 zPJFVuzq^0s+4A45uV>Zwzn7)0v?DFyiJ$}n=B4=gmp|(~scmBdGr=EwsrlO*i^SS6 zJ7l(K8#u&^Z!_m700sz7Io@^s>E}bmDd@;1el_9$Ssl%02@^0fmZh<{hj_G7GJV_ zANYZA*d(&*S{L5S0?q~E60e6DB z_GX;fBSvkx>X%b40Xe}k!Gn@`!N~*?cAijZI$Vb*N1vWfE@3zsIL0AjM+D@k0OOto zeI!3+ui7nx2>$?QpBR8SZQdc$$N+=5wlxF+NJrqEpobu5XcDjNo%>5mf&TysBgAki zI0Ea%o*j(_3#r}bYf45LA0&_g-JTd$QOj`(Ui4(u(z2x`zb>D{ci&6z<+#4N6r1K< zo9B;CSEZ!-?QL!AW%D2QABQA3{?56X`3!~|%x^j4az_{>klTu>Qh5hp8Ju`$Ol92< zgYG7bWVFWmXh0l*S~=p7V09acl2m6IIr^#(*z5L%zQDTpU*QiA##bBl--|vJx7wp~ zVnvU{Q%a+T4U`PI%P=gau0QNw@j}!Af2n@X_HwHLV!HUAH9NS0+zC|E=egQJJAezF z%2ydA4%L@IMSkWNU0f1vJAX8HZr^kH+Qz{v`%9+Qx4O2L+HEh=-E=-e`v->u1x-A} z=KwD6FoJSQ4BMi!51S{HV!2jj`HZWkX|0BiIZ$LMA}BC9`ItG4$xwHE*jDe3mG$C& z$(}#lu}Sey;Xqsk^0dLP-;PHKh;&Gm%U%?1&*NQq@v$fc9p%= z(L3~iez(2;CXUBU-LWoa&eFg&l&%j1?GGA5(1H&eK>#QLgBj8*J69_e%d^MF13#?`@}yJF0{z;G_vSk5x0);A_0^ajen@=mOG&`7_Ohqk}&Dz z*ak60bmM`ltm5Mpb!}qWPTDVfZvOy1jeWH#q}pveS*W!ads%DEcdOIOMwYMQRn#>7 zIqdANP1HKG%O$>>;jIqV?^E$kt$%RvrM!0=qkBCzYneoG03e@GeZE-JWs#$}udO@} z`!RT@TGgz4aq;F`ZwBc)MZ7wdufjbFdwWk9%cojK0Mz_iVVPp^UYO?ICe|-?S)kS) z*o2lnCIxGoU#7e_XW&2C)i3ApCb#hC_J1Zj;XlMJeo1~K{Cn3|$S}!kqzyQ+@WeM; zn@=N2y72Y7KiaQuA%aOGoP5pk6XP$0{8wrJ00^(c+kIpP@J()6n-E@77KEhE-+1)3XM_o>4Zq-9%`d#YA$F;Qw4z1&o_joOP^ z+vVxyv|(DJRPgmC+g9a-n&(Yfxg}=WPek0Fx~-4tzy1h+@sq(n8UFxie~I>*C&C{K z_&#rfzXtSw4(VSIPx^h9b_;6HAUOX3mc>i%<(R7|jv%?)vG9b3kId`1pXFcv2qF7Dd_(wIqYU{ebp`!Sk#&&n@F1Mr2s-$|Aw}fqBcAHev zZ*FycMmun!G7e_Lh{}lU~uy=-NunTH1eJ@FpI-ax5Cf#&qf>Q8>yfHcF?t zrK6`WEAr~w(QaSfM`@t=g7#OA1hLU|o7o(RW0ENCbor*1S15u<5F{l0hvqS>0lORj z0F7_>BE7bqH|=x#DkPBRdyj&DAEbyIYob2UKZLw{3bQipg(Gb^K>HmaMiQed#`9^Y zpVvpk?Nn(W1^zASL`c$Dd@lHdeyt6(&aw+n3~F};EtV0NGKC>fEROPl!DI_B@*V#G z1YfhZv;DaL0AhPtLoAoy34drSTXvGwoZLsI{4Un*;FTwZ3Yjh=u(-NH(b}WK_KBk# z-rZvA;M_c+!&&3jKGWGNCE67oov&-DUss~n)3-9G%bVaEPnCOiuB`qVTP+(+?AF>n z+55@+WXYpm{>LA;Tw2MsHd6cu{h=kjGYQ@yE}^G*(%#5CX5!ulNhGy!wifqrUCKl@ z@;WuevPt;!{{RO1$7H`5{{U#+ZW9Y#U4F{nvchYR9I(t{)%8oi7T?EjGTX6qkm;)w za@aCUJRuaxDgE3j`gQ*R1q0TtG|%`ZfBX~!#QUR3^*@Goz7@7JtkJsP_^0E3v*58D zaz>GfqItEbBZ4_uQsQS|(o6(sKR>_Vg?e6_q<+yqx0ah~Etwy{Kd{}lpB1cE%VQEl z@WaQ^+-dL$CK7=9j+f?nQVV}O5?rdj=;4F2EyGl$!8y%tUvi~dR+Y5(YhmLg-uIV1 z{zzHPC`*d6x^hd}QBE!`CsFg^=Op)5QBjm{=GOcDk^cY%`@2^E0D@G0(MgtnC&V8G zXDZ%*lts_R4+U7OsoCZ3Lw;FEc2Hv=s*)7`&wk31qJGKWvW7`5ZTmZX4S|a9Vm#l4 zejABWV7t$kmQXOuhEUr{0iW>~{tgD3J74%EzwH+i2*{hnUjX#=XtD>GJ}`Jb^r!m3 ztfDPAvYoS?tb=}ePujoPdS(9rhEx5VLj3D(@I&A{3m_A^ss8|k1H#s*GGunaQyUh@ z+Qc)IYzFzR} z*;#kdpG1j4JjoDQdMNWjHO<^lm3AdaDcCy;U%(BN~> z@z16}m}jm*3)F&ePXn)hgd856oRDP_oa2%~I3(m`WO4w{JY%j-GtNa~)7QPVzMI=u z*RN0bCe9mOdUU?tkG7wB(@Xwg91+Is@tguiIKbeZ2V>KyCY)sG4iBfzoaZN#gPe28 z9Q?R7l(L?~liNA^9OEZBZlLjw<0NTVQ6ZwQy%O3CjT#PCyJ_7v)x5eswsv}J>#3zYJDj4qbh=8(-QBCS_U+l*)Zq26 z+C$-fi2hyIjcgT>nICPgsVGK|JNF1Q*%?>`V#-3C07g->Tn+E-fABsH#&3zbBs+1K z{>7~{gDgPhw3jJ@2*awW&&qPuyW(#M_*+>=8qR^G$e%l(HW1`95LoWmjCn+6WD3qt zB!XD{EAe;sa`0D(CY0$GQd`L!t$_`sw>IE{HWl+#unF9W8?(hI8}i##Put}Ac2haS z+IwXrmD`;??;Y1A-$nU7Pr1psV=czcFsmAnZ6_&S4lm)|x>An2Xx5t_T}S(7{?D_3 zX84(*L^453kL_3i+z#xdnp|!(_mx;9X9SX%HKz~lm+%HKs}IGW1}GEt3x={z;8d_nOCi*0mEe~F$Z zbM|Yyxk1-8NtNQTwUXlNYPHf9m61ZIS-jIDfa+C@XYTVZAHdFp;q70)2`N5VHOkhl zEz<4X>YqdGqs4Q~zi_ZKN~BaI=P0E4lF>GmlGk1K`F~mw{9e4bmTfxY!WzTd+HHtW z9o4W_ZzxC-V%G56$GnZ8B-5g)GBk(*6<&XicndK2f8w_&%uub?j6)ATzo>+=GXMSBUt-yhvV@Uqu@IOsLeDne{Ef9 zvRzwS!D20#-9)w%NgT7<+$>^Qn6Ky3;9QoJ+lC@nPS%uaM)pxso4ng;zMU_(Z$3OZ zl+>vgQiRi};@VKJDBeytOOmfEZR>ZZnf*FyzqJ;H;p?9(SJM+scUwCwbZ1DT)})him)fw)d2grOK$~VM z5LtB_HZ#c@&kdXI$L1fy-`U&3Ha`wL72=N)_?O2T--z#YjUQB=&i*^yDtIpSLk0cC zgql_6mb(6*X>Tiwd2Mx=M&e0SYC8U`VV*`g z2IAZ8SeNBcB3W8Bju6npDx>)$nQ+!i&Y=m^m7S#YjBdGYq?_MM=$*PI_4}N&!%UMC z2+CM_#mOe7r6{EcrqKi z*Wb0~ww`@zYqz(7j?X&m*{#!+TY2Xr=K1Sh{{VuRd>Zie!>ag8#@CRvlABXw;vWZU za%!`OF)GBi+Wq{t&SnUaNqUwx(@!Ut9p30nW92Uy{4n?};Li_@YTMwKfamdT-lF#K z>AG%{scP_Q1;*yM)UEGtUIej8S9v|=>x@y|Y8hnavw7V@j`r7A4@a2WQyl)&fmeD|NB9x@?ODQrhu|p%ksHMpV z6ql1}a=lu+m7UY`*Hv)FczaI|e`86-tHnw&oD{w2#Wa;!Mo!miR&sYv?dcz|z5X=Qg8jWm5u>GdB7TX=TuEaSAe(6q^J$CXjeOcmuj%nlSdBwZ(}dO*miIBs zB3(k0%Vz>j3@HF}3_>rF{1f3H0sI2^hvCcJ9{SJYu<)gxziVsZPZiAunef+0y4I}i z?XESrTIxR#S={S34v!?-K82-NtkFmzy4EgTriL!)WcU=~qfVNY+l+4HrG1||w<=8~ zX<6FV*!ilQH<;k-Q&e21%+ep*^sU7O7>;x3$BUPC3!`ewF#mpdg9EWy6( zhO+##3y6(Mw4FAUl>O;K(r~;NysGmxWUWE19o?+YmgB64iGQ=)DblAZe6W`+V-9yD z;@2ymRP602#yu|fIothWSlxX800VfE(2$@Dy;sBbyL`kThK}y)7V`I`WtLS^+nlhF z0k)ae1FI3?o09B}kUUx8qawQH46LiF9l(f{hVuC`xfxKguge;b!T$h>?K2;;UR*hE zo#37;((RRI%x<#D!;nFE7w0(}$;ii>;n$ArlWoSEt)>F05?Wm%?FR+aTf_)pP9p`I z8QGEnBla9EOtLUhjZ8ajD>YF!Z*^J4wBq}&t-JYuBxdxumW67Hu3wFWRIhKV#?IWf zx9%RAUuK_fr`P9KxCFQSAb07vdGe$2wv5LL#mFp^ZU|1|86{2PX_=ZeB#W{5j$(YV z;2mL|+0j-%9BGB6+|L?iTIn+!&j1Hp;+&5p$OmR z`LLp(VA$)18E423BIViqBlwl5-6S@i6~DQi*%CW@8zjEFk%-%ft?k5@PQXY$K%|wx z0}9S?#XPM-Q+UihH1Euu?DV&4%kFE=`kYuSR(bqC?CfPnJ1DQSott_@6-0bqgz<14^;@XRqsU_=xFR zFNp4KA=G?L;O$Go`dnA9s;!&1+Aq)Rw}-#rt{)wIXREE0Uk834cqR`KYXLk74bO*u zGkiqVq0yC6;{A1fM#IBi9J9TW@&oprChJbHwRN_%npxnU)xOZ5i608T;GciB&y4gx z8d>vr;TgHS|5+?H8{1)I6PV5-CpWxwE1@s2a8|5ErEAvG2<(QHrl#OL zn@deH-2A)pVq~;kj#<7}S7Oby%8JXh{5}U4!|B2}d?YGKINGI1DAdu$-yCW!`lgd@ zS!|Eg@_!DhVPd6GQKr&Ta)&G(z1><|&h~d{Te53Y@h9T%#s2^qc&|d1<5u{m;!lb? z9QP30E`|R93K|_3NH-C%yR$pshB$8W1%M7Xe zr~7AoQ}O=*!*2ulXU0DcJ|*~rz?%L40E=Ys#;$>*9BZ^(`6h z<+)8VK`xteF0GLs-Y9{ZLnq`d&+Q}oOt*;i{{RzfpS16fJV~xcrpbLjhrB1^Uxqgp zx=n$P>_1~@0^^pcY~mw9>Cdt4^t763r#Wtbe$0#yb)9SVIq&(d3kqi*;d5 zCl?J|Y2o1qC1vlm%(}?<{xirhxLT4=8B(01Pi{%nca@^!E_qo;OZ&2SYed%G9pK$7 z;s=UZd^PZ|K=B5zePO5HUF&b*y+g$iTosYzW2kt7`Mg0UpB<%)0MkG$zj&~<7gky& zj^#l(y}P+tCf|KK#~O25-be8N0Kr}qiL~uP+U-11@j~Ck6J6c?p6=as->~XlC2d;5 z;>u(f@Yq>t@!N~LMEg~p&YgBF=JSt?K0Wbw#@$xZ>*E)W{w#RoPSNAkXYl2}jqf1w zyta2bj5eZQ?0Y+jG+hrsx4Slab*1zgZLN@!ID@sid1Bo7j+Lh9G3kcuQSk7v)#AEa zYYQs~EG`YiPC`reyNhdxqlluER-Stmk=>dj3o5Hm`X4SXtYGR=ryHc?m0FTdn#)F_ zxub1Vr){*@{$|fASIa6?bmfVhAt%W{Z5nHpIJ>C0R8dOPR_9#F=@i|Ms%^YQ@gu^w z4w`qwUx$|RHLARq34P%k*yL-0ENnMiX^>3!F~=>)LSp{_MheE<##IQ)mtXO<)~d4W z9~Jx{@evn5J#}sK|kV0)9-reB{w(!J|F@Ql5?2{6F;-j~8NS(@~TiMRz6bF;jO+ z&v;N$-KS@LZ=z|n?;3}Wbp_O}<<&oESufU4J>7Kg1KPlnqT0w9KyIych@-lXXO$eX z#G*4SMWuvbo_qchzYCwXGkBlkCcl#Mz=Ay^M735SnH{EBwJ{X?WRf^HK=ng@sNV_;B24v!R$;wVf=(X6(G%i-2Zu0xBNn55E6=eFj={@B#S zGD>cZv}(#c#n3e6j!@CD3pCdnbc979EXt!J>8(wJ{Wj#&2ORV zmKv1Wg|?Hg$rJ|1RlU^ZxVpL2H8TyHE#%Q&-(7u@*;*-~uZOf9d&5y&>)J+vulOtC zP2HTjXt(huy{dSx;ZBt$goyVVl4&-Hd+^Ix)soiz;Ih7w>i&4-Q53e?ZJ07$OZSiL z^<=ld20U~hL$bEHviPy#O+x0>L#=AMJ*};;hczu+T*NhPS5v;0Ifk0o7Sn1PyR@^l ztjjrjm?l3toyKZ{jq5b3QF4UpH&6JGlWr4onv&&8)4NvDZrAI6A7e0>jLVfn4(9N9 zsYaw}Mm1F8;Z4Q3D8(liEo1KKb$yqS{?yuqguk@M?HG_--RSKHj=TkIw$C-@sc>#> z{u6jB&-0)AHr!7=;aQ$IlGH?kWwA+RHqkTu?{K19_i+v0q5hETzGaV31du~uOJod8 zuH_3!u%rmd9D#mT_b=NkR=U$aYp>d(3!6DLXxHL*gqAn8ys*)czRB==;k?#y3v+L0 zF@d9=-BwuA3yBIDo^+GV4f5UJjBM?!r{qFs3;7#d9Go6R2h_0wbtY$YcvAn6JbbBoei+!|xX}Y%T!QEu&CD zEtZZ^3~3t3TMU?di6bl|WiiDcjA4~GUi?1sDfx+wR{j#hB!wVHd>TTpu#_q?NoP#? zZzt2aK|&3^UY`uQC2Px;N%i}+ZuUPjt(jq#ig%Lc_jy`Q=`N6WYVE5%EqxD4ZxP(1 zl#@i$FBVADi08k(xAV8}4TVS=BbO_dah&cX=V+`uy=vX(K4-$67WtQU=S@yVnNbKK zL2Wc)SLG~Gw+9LdLd>Itx$zdAE0R1N<2zLt1!K9IX2O*$(|K1+319)-hF4+xwQ@H_ zS>M{)Ntuf$i?s3c0zb3$Qy3)%Kh;LcKnP1N4#o_mF4Y4UYK`*LZS3#v+3BUElvc0L zy^LdzQ-pb?8CqWqxg%uMY}Y+CEiSaa>*jY8>-uzR5Bw{eRRx9_Kea8xkQl0&Ahw7; z56NYi?K+%zKh`WGovQ1zVkq z#CG<@ig<$d07RRX@in_=+&BD;hSVy8ppX}9Gd|FG+%2byZ|;^@?X~{^FqGID3)v@= zaZswu6Gb9OV`2}NEM*uEDT9Y9#Hl`1xz+UA-dENt-`2-|61^$Zr%&8&a*Se~C_6Ub zwdT5ZdbF(VduwCbw9f~4Q(yRL;r{?0_%p>mF!6`Pts7Uh)Ngd#uL$Y-K8vG6V)sAV zI&9i%YPyo@R-PEX(ru(&cG|^zy zZdy+a>DooT@EY%hgqr4|t1KEtpN1Cl`r_|cv9pZ5)}^I9cE;8uFj?HM&HAUre*>Lk z$3777&%&P%d^7tOhpZtM-Wt~aCF`(Bd86qTw>KUok##>4K8`N@MSC^=v2#7Yg{+d! zZAI-Yt|GM(HP1Ouk+!TnG z+U}&z7=!Uxye(R_A3Li)Nlnw7qX|k8s~EQ%!Kk`dy1PyF^!}aU?9Tzim}ePbu(Icc z9&cu&Y1O8=B{b?mxk{qF;@^|#ZTw;Qn|1Lg!4@A1v@1O;!(JBftojA>OMj%t2B9Xa zXRll9HyWO|;`uG+xw)S1{N7wf7E5$!)+-M!ty0e3FP+Vusl3$fr~b{oi%gazS?#SX z@9n3RZe)pMx4D+%NSc2!Ssl!G5;e<&X=E)X*Y^!$UXxZ|5w+cpw_`2cpM_xDx}~MW zP&*l7^P5le4(QFdk`20TOE*R@BxSb0ES?*VNW4X5rCZ(IUdeG|dOYMT&$bmFw>(8DY(UZ?J2sEP4Zo)?dNvw@>~3m71Ea$ zV&Pv6PL(%LnR2Rer#Vwiw4RB|Tep9ErR8fJR*|ILT*Y{F`+JKUhc>GuZ7uz+(zD#l z5;t;ctz6LGaQYPs3jid|%@|V)w^h7Y!bf z;oV=v8jLpP$5IQZLm!84wM{`Z`zvR4oBK;kQfHE8dz4sWNBn7r!}|A!wTqcG{{V;D zcZO|6&X!s!yhkp#b74DOm7e1MIW1dIQt@0za)E8FEo3bM31N*Twjbyt`wiY*+jtuC z@_lCO>{oB6#6*o=$NJ>q*k#me47WuVuw31CP zi8J^K)<0*@jIqYD-TWE&r3`Agk>>CZjV;2!Ny`ZzM-h#zBu6X&Lm38E0k(39;7=8J zc)Ds{1@Rq>tpg;9sOb9Ttef8@fsSi9WCX6vhKMs{xg{5Lf9f7@?-|u()TD?=$qbDh z?b=RG-0eu?Soaq$4=${#S1kD~xw?&=t-?mvH}`KI_}SsSwihu-Vk+^HZp4oijFE)- zWjo8DWoZ^ThlhsoYOEm`JOY*0sbaYk+e`Z<_r8m*)wQ|#?S2NKQhLoUWq;v0ChZo} zl2=k&YOQ^Hwf=g{{Tn-0B#?Q7q;KDm+dgV8Tdze zZ>8y99=;@6i`ytXN%lEb-^Kdvg59;${uy}uo3>#rsIqwyOkPWC>!`e&xjqlN_=)0s zxvr;|!0QBQcMJ>X-AN>crj9s*BDIVcCg1mJ$^a!-cKONKJMQkhz}HtNlY;GID?J7yg0z(*$=C|3rZ3%*;HV~*Jl9Al&{vw4zXf(*S zD2xLPVnp)D`4}5;9zCQpl1m0v*h3ad`YGlrqETG!?3AOrvcJ8pt$TI7wA}eQ;AkkT zwH;#9jBc%_@wek|U9NJ52wE}bUI4%bE9A%voVju%$OYIAM)9<+3B&G6eoS%h32}08 z2*8YxrAvIfO0jZJ%ou=yvA8Q79;A4W#usSD4PQl3mj^n0QZ`f>9J>9T5Hf}gM&(jb zG0_-dTzHek_OG^I5@_+W0fviDfn5uN%7C;enIO^cy*F0y-7i+#&wOqPuCenJOmXA(`WOhPG$h6b-ySBl?+iBNlv1M){ zU7!Un<(#ohmI1zcxVkQ|B4<7oyM{GjhJ9xK(@H>oa&z{%?bHme_GTl7XvrH6X=*+w z@mxshsQAB7xl(`>x4N*?g99Uc>Mbmyk((^+4&bDf%VQ*Y_1yDn6A4{4OQ%xBZZ9q# z>P18Zvn-7Z?m$&ouNmCukW{~1aV^FvQ*nE?(tVrJ^E+#8^xwJT*QFYI$-Zr@qsx6# zyS3A{uU56uX{+?_?R!ftJM8y*w}f=?vSECSeM?=`BT*x^QS|*i?RN$Xkh+K&RmtGJ zd7hw;{qseF6gZ0|%V%6$CCa1RY4MHuhr2g%1YjpYFL-Q^CHK|69+ikA=La7>?sO5#fw{FXr<$!G7$c~#(fC-0nx@2PJ zu`Z`)vcFbmmVCqGDR$L1|RT_TNNlKg4nzPQe|yl|@MBtPsfHqyV$xT9&R2G_ zjht65x-Iu_t-B-DJ`sFn_@Dbe_~w5Z{2}p^_(M_EQe7{^{vEuI&tCX{@gu{RkS(;n z5BQJaTbqlm1H>8))|qp4VRa6>_E;^J?pZXMtThC*xU%{>=fhtCziDeXzxWYlqkhOg zv<|Z3{{Y2*viFL7NhII0&&DqhExQq^{0#AyrhM;&UMZM+KecopozvBw|LtTQ;2BT;^Gl&fP`bx?9X{1P`@eWrTdVxJp{X znK!I#xqcLzzjWI4dp+!VHEBj|b0@8ry0x~NG_+}7ciCC34_6wGjeHB@?-P7I@z;g* z?GMKO8j#p{x4=F%g6B)|KZKlFna7={&jQ(NF%3TE#_vtkp+)}H(=Ja;=hIb z9q{w^o4xT(%o=`|rCEGC__?Q8N3Hx;_;n-N$#!)0)-JVqbq^5uCr_H?p5x)~h@@*v zeKHv}UkJX3ad~I2UU@&nUx&Uf_*->rdE-4s+r%Cb)uW0p3jA>Rf2U2V{5tXcYiie4 zFzPVCntkSt;t4H@8itd51-`wey32ESVSNrRj#zAEpR%cV$}OdJbo5uVR#tviQfm5K z;je*lmpm;fwykY!^j5NM^LI~PTk_v^i7nJh0!yW&(U}a2R$>%LTMHC`S{=^|7*)Y= z${87EC4{kZ`i6z!>+)oM0?sl>W-(21X6?N|d_9-hl<~JLVGOQ=X=V%#wT7>yUc##u zsEG3;zm+6+7TE;J7?EPR5t)YQq$;98CQPJJ72P6*C)$IBNF^&hw9%!a)$92y-pt~0l_`Cw$@{wV#@4p_>*w26&jImA z!@WjHR`Sl^$YWvhT}WPipc4`_$7+Cl#|BsO4$z7F#v6~5YTAAMx|lC4E~7ua0zi@= zblM5af?33D%gHWTbB;y_*z#M$1bbqX7GS|i#7N)W1fVFPm}Oaeh8>umUr@3x%*||D zB%DQ51)J%&|9OUEP$=gn8n@|O|24QERw}pomhkngpwTP)ICzw!Ix9G zXv(S=lW=FsoyxLEyO6LvvOd)~1&WRU3F;TNdVZelVT2*r>^DHl8G~dH5mAdECoI68 zSg0iCyth$VP4urBBo^8UY%?HLU5H(9P81LW9-qA|atEJJ1v+rFns$5Ym)UPcuH7wb zUF)iTgfVcalY)C{o7Jy(Tj;gzbno8g4C)#?vQ_Zr?6JJc7C1h~_}4bjqv$04#D44DMot5Sv+m zVlWD_1p}VBZ9N46@g9;`61#PmVxtboG|Pz?yDus7sSH#Qsy7uJGS4JqBJ}11HI$MfNM2~JBg#mmw2T5b*uDn;0D_KuUGS3H_+R#k@Wr3U4-3H} zK@W%;=HJ6!JhF`Wa>a3B;|(iFp4R?oR#3(*cT2myxqsc>YEht4pDH9!3E#`Git+}8 z#pg{tu$A7g@*s{GcQX=9Y-EGXbqb`J0k1jn4YEV4Tz_ZXT~`&sZvjs-N9&+ciBg; zOD!zpFUIHZ4}d>t583|!<9dw`!9NrHKjIB~e@;??UvyX=U+bzDU;f;IYF06iGrTBran?jwKv&J;f z7+PCf#!yebD5AI*cGJGeWsw7{Q2q=}Z*IWDdtwYBKrqOLcz)o-mO6+m@NU2&DQ21= z9at1qRDY^|4*uA`v>(Ascr+gjc;XKo_zozAq@M}?FV>$}!UURKU}%8>W<`?P;egJwDpB zmD}%SZQiK*TgD#-b)Nul{{V#ETd8aqERkI5eg}^7&7pNHfjmc{+1>y4QJt9D)opzyoUPXDH~`ZoZ2^)EMTq)SC1;8mHuE$eI4+}_SEf@piU>tXr?d&w^To%Vm$1e{*LRx8d7s?8xl8rM=y@n)4x#UAqy7 zi_*Ml@M}%gAcw>{Lg{hXY9-pw$KMUF;h(|RW>x|zuk50R)9l}9W>f~oK?F|nEQkb8 z1b*cV)1JxBGHT80(@omSN?Uqq*L@rED`m2#+l#ZaX?$GTt2Haxr)I9Am!0%JE|cN^ z0EDniz7Nxo5>+6mg@^HQKZx~Yu(@w7;e0;Yi)M@{U`MFiMVg@H5lY{@(HoN2yil}OIx8N5z&wkFnJj!gZwA(Qxlt8 zl>n9b2vE4s%tFMilg?FsZn!4BgY0)d!wfBh^8`Xbz~mBkdyJj|9J64xA7H-fU~GT~ z%M-BxHWZAp03D^hx!z(Y+5C zo8bQdgH#_P0DKfs>5qa3p-* zfp(QYHbq0qsL5+?`gL}T?WNwIb(_-H99+}UzLs~{`>M+CYg@8^aq}Lh@RM4FOKDd! z8~{~IgV6r~2r2Vmo|S9WnvON#Y?y=AnFJqn*bF;K`22kpHK5M{iCPA z%k#$GNX*2QE~-Zr$360%3_|Y1*7oX}aVGTOIs_ASjnY3M)$KxJ6)}{iq-9`5?l5?-^70cd_AMhvin`}e}boDgqu*% zZtpY+Pa&m;SJR*|qBD{=oOk|RecL-XvwV)p-FE3vR=Rgud@fo$#ccGy zN6MzPyLY=XA)Df*gEV#@5$x{THap%L1%5Ej&{L9`L^Y-PZ;@!J4Q*X(dqh3e66%&2RQN}9Bm-rjmMne0t%hoFafS2-uqqz z0YTU2kNx=q1+Aew@GXbm?omSzBXtN2ZRJk%No?BHM;JBoIeKk$^ZohZ$!C z)5+r1a&yref=*6$mg*ZlGDsK%ZU+=dI!vR4&^NpluIosG$^1HgzOX=|0*{_|g+sGQd{no6k^h!+sn=yXQT z)sOnN8QeZsQH-8?mE#Gk%&GxXlCDBXeA5SZG)6dCT^IKXm8=*pT$Tl!Pag&cJ zNF4_3o(MlV-INe%T>k)~*cQnIOQ*z~QkDd#Go-jVmfO$W8 zLY(A*f;Nqy?mRJg)E~XQ=ouiDj4|L05xIci9OM8=7yuKBr6~1kJ8s>U*1w*bzM5Y8 zi<4V&w)fd9YPZp8{(ghark+LyjiZo8;!z})!*Gp`))iu;=4ZA4mbkp~(c9yy?G?Llt(6#nE zaq|@m#~Ekfl1NqBk&%pLw{8TDp@{_3S_m_bG5T#8m9}%i&h&1%I3bjuUI=OpJZB>? z5KlQ*2Ol;`;Rz%kObnh+B%vyD!bmfNjh<0BJn_Ap^gNxXsN@bSnY-$nw*LSvEwV{; z{5@XDG?#l_-u_R${{W`dwsxhpw?FF)4mrr3ZD&%s#z2q*jF1a$-JS;nHBGE^Q}W3U zhI7d+V`j`oakP1A3h+TA2cZDvNT`{Z=gerB02RM^1CjGkoPF#9Mm5iZJ|0}LH=Ym~VV~VYbpdV; zLd^x@5J1KXj)No(pf#I*&y^Uj1QAsWCx;ylGHKv`p zpKDy^$AJDAD+aaDHSH~d$dbpz_bOEGBr?Z&1;!L|0Bq!c5YB4p@Ro!Wt%r*IZD2(af|Gzw2KSkv5s|1tbIAE`?1Z})a61b}95P@4qj`PDY0I_< z2+(+XQW>ngIXK89wxN4u;E~Z|R+AX%!*0$v>a_}mG}kO?tyS%0wQ;_XyWh_G>%E5S zNnOoJy%nD`T5{WTm!|zMd)@rX4E~BZ#y}gnY!Cqe9&&j(<0k}~UDJb-2f4r_DhlVH zU~{+(;F3mopZ9>^an$u086=z>0gUAL&PIOlpqT;AdIN)z)1I6Gk)AP-LFDsZZz^`W zTK0STuBy)VRx&#s)|k;e!#ll39fXfX`5KjEtV%!zX}8;&GhU zFUsH6{{TI~>8-z{zIW4>-Pdt^sek9XgUD=bAomC5BffGD2n3IqkZ2b2oDnK>jtCtv zcsOD5?%XqgK_H)$;4m2Tk2SDI_YXX=91n0$9G-KyCu*MnLV)KQ3|2 zruNlrwSAh~OQ!a+e}=-gy}tLqT~_^n0$(A94*oC*0Z&}#11z{5PZ-D`lh&RhKi(&v zbMle~2kzYoR;YX??GKQt6`Wdt1uM?wd5zM(x?VH>a2M-=U}>P%s&ec{u@ac_TYpoGJ9c zJuq-f#7emN$T%1S7zBC{-3TKY8%9V3ZLGl!#tvIK7&+QLUcCaTBoIzG!R~r2ixtNt z5(q3900|?I0VQ$u$tRPLG0XS5tM8?f(@h%hWUROQtQ+|)?R%x7v)iW2ce32NsJP$| z2pJE7wBvC(0I>iOfsk{<9!}?AbDVTyeqqz787x$SFbO=UIpl$g*mcPu-~dO=;~5~H z3C_?7#sEBmdXOiL2n6$i*F0?jK_C)H0ChPX2xU0rn^|qPnriN~)4iSF;kDJgx3=AM zPp7I+znDofAPWd)z~^xXkPdky;BtF&jA!oD@Ojgc3@y;~0F3;@1C{56_BrY@#M`mH z(d-*HOK!wtCHFZ4Abf#U@WgO3INVNn!O)+^x*UHkwXc}!athnF0VEuZvaeE30)W^f zIR!%I*8MbkJ@)hR{TmKN-q*I8`CCM^+t;($$NN3m8E6?n0OXYb3~n6b1Ljf+o?HFU zX;uaV7m4w}!w|S2aB@#z2|N-H$_dBK9KJBWxCBRNh^26Fov@*@HmL+2SXWZ2?Eg{oSqGwwJQr+H7ku zw}@n%91fvKB;z9m!2}iqfJx2+4C10XmAqKNk2%iJSCBv$2RJ>3;6W|-yJr{d7X^o# zFE|GQurflB8)-rT1my5R{^`X`mU{>xkmG42oRX&;XUxZ3fB*z;`L`V6*Ea1n(O%7K zYu#w?*UQLmH?v7y+iRz%FPG1^n=iMB7?3SvjUOK=nPkU6bHboK4mfVPVZxIeY91w- zOGT+9aS~X^Y;B_ibosV|{Nt%_#~7v?XvhGdL&gFT^WlKwjloA86M{(@I5ituTV#Ir zP;Tm1(YsTYue7we%fEY ziu-T#vlg4^ysu?#JHOWZ?bV5GZa4*azyodxz$LSR)bc=FVB?;~LumoPI0w)U*#u)M zFh_iXIX#V9iYSglH@7?k_qpWtC-`zU_9p<;#u&4ni{Gg@I0`;|@CZ0Rn8pQ7?bo7f zXReRst?##;_IbQSR+e2iUYd5+%lb(azR3(~R?iF^WFN0q1BZ zC#vzBkCfnp(YekBMtH_6Q^<+Gh#c|h(C|9;!j5t};EHL12S*(-$?8wnu?h}5`T!}# z?XPaDTXb5jAK|X|V)pUVMfWep>rS70=#0OxspKAJ=Vb2-dqrbTXaG`nj1E@5H(n31m<3D*x$IaV0JA(G) zgMr8bx)NGntLw5#-IlJ`zfSs@w|3utoxc5k_GK=Y4gom;4Z|Q3I$(xVfO_G&jB*cJ zKeKIy2rNMv83YXQP5>c^1dvF=~uFy#4@Z0Iwhn;N*Zgs#03qsmNdm z`T5Rz!_IICc~4y9{#tdx0D=G+CpjC8gHO|xukKWKJUJtgkaEWa=O;NVK?JZO zsjdCuWVN)}Bd3&ckOlxM3BUj`<2;kV>o@kxMnRGX9f2cg0B{c@fsQ?T47N@doviG) zOIN2`bywd`uW_wXx5~@z^Zx)PuX6tY_Fa=>fzzQQoRT_p`MR+iPXGczrkyUx@=&%3 z&fFe0j;EfiFr?)1*bpj`>sG`K#X|$Q?!XGaC<7Q$agUf~fnY~LlWlcdcEK0}fHv;~ zBbEN~7yx4@83P9t?6kg%Z9J{heVg6i(_ppjZFcJVTkm)MdTxVH(pcfG-=|DW04F4j z7F=W!e~UeM1ZH&6G&u>)te-ISpK$|s0GV({Bm9$>rmq9-RgDiozdV@?2`3o?kZ{Tu zfOEz(S`l2NhvbSdKe}6SG!mU`&>>aT9! zmCXMD_(wcG*&+%3_Q`Svc_i^D$pF^y#Qx-Clii)k%9>4 zCnGyZSn=gY)bYp6K3=~u-~ve9+#K>NLMU<=m{9Ta4DxZ$A3jdZU;+uq`A!#;>alvL z#XT0*y0X{Lzu+CTT6ubZmHkdz{t;gewnvk4Gmw9Mcsi4weC!@TI3xkokb24g00>`) z9AL$H&Orj^^PadM3D^QU0s+q;^&s_Q%TjX;e1EdUoxyNO$<6@I2|Y$g1QQ^+jYbS9 zoPnGkK+1uVhl7k{j0_Ff%9?S)#Wn7&)`@y{eYW)ZG}7v>_Ss+YIY0P8JTyt&75@OH z1>Ml(a!)ex+yS^}C)8Afz&E{kk_BL>opk zf*2_(Mt_V9jGSW!Bxj(ZBY6nf8QvQsWPI-1z(2gf`Lmq#JU1NIZ?lSuN-^cP@~v)cJBAd3IXEL`Z%yED zhqmAAp}oF*5)0}&hyw(Tq$Sb=xRqjdsQGXiw-9$OjkHQniVmM*s)f9{t^vAi58;B$ zG|uO8kPIbG?46riJmtrZyg#L@E`?Sg`~{8EvcgH=5>~%wyH9Pk>E~}Goz{%jw(vK@YrA)3u+=SOQh5^UOsW;J zx;A^2j2=p+@z*TLfQ)>$>Rm&^`jpXVT9wQezy^%{wU-FMFj-@F*j;(vuB<^NK`O(1 zI>(K?N2`*S(8Xg5aKh5$)x5=eay%yd|6wfChu)*fFEJ>7sk-!A5Nf$?3`XY1KyUyfjDhTOgqv-v`ZuQOtr}W=1{5p=ccRg7QMB0{C_^3wA$lwguxsz10Y~>+k%0P0meo_+zB9(IMpDF zGBOT%Y%tslNTG-)hrlNwk-;nnTxV?|NXvE{WMJn!fCB(~4WyH}bB=UKKVv5$b06?y zcGBRHjEw&Pv~ipT7|F@(rmWSpw05$0vtCBcqB6xO~kUW$=t_jZ%{xa5NjJ%vV!Yaj$8sosb)td&hR5#kj;(5I4Y-W1#goK z0I?m!KV`LL+Oh>eGP&4LBJDXlm=ZRC%kty^3gZ#Z@yn@3GNU$f6xv1$0EezdRN(Mi zJ4XY7o}0F;?|$7hwVtb6y|&kF^fH8u(+Ib_Lqk4{DAarbC41g*S zIt-G${nDo(U~&s6!j;036pWHiMkwAC4D3({TsF|TU~oWg4nWAy8-Q+AhI%1QwQXM4 zyYFrGchk?kx*7XMwb5In@1wt;T^0WT4PP5?&zX!2fCz3I0D=bC_Y=Sgw;M?y{M^hz z88DR?BL;7}xdehXl5jaV3zh>I1bnFywebM~#s&)s837}q-k}&0SEFrG4&oH4I(|y& zrZI68(n&0_#|^55H?zE(OmM?$BD!Gg#06Opjm)Is9a;J*;dSP1Ur#;SR$9G1JL~6+ zu@-MvuU*=@vwG~Ut*`P)>0a7I`H~4=RMnLVw25iv!)~hT5e2$p)*~J^B$qP`<(a}9 zlScDZFM4d?mT9$vAcRR3yt>w?<$mlIHnGO`Hoj=+>2Y^7K~wjk<5=VOKM(u~@!yH< z;@13Wr`mil@N?oQZ@g8h$76STQX=gdX+LKgwZ;-DWidr(X&Sx|%Mef|`p3Y(18jUZ zqd$l=KMLvJ*ftSGE$@#0Dc&!DJO>mETz$XFX{PZ$y%&|TYfE{qAhp$|VH6hk5yN+6 zo`fjI5l&LHRg`b7-j~r?+g)3-*F@37JZuwDPo1Zui{($@ch{QlT~gPhX!yUvzXE)F z;+;O*UGY3xFT$S)Ci!LYPmlE{p7!wLd;b7u_-@)Sw`wz(;cwh6gmFXzCC$`olCk?6 z;m^RohMpLOd`qL)>YgOgY~BNV@hjq0jgN)=G>)-M8Fa7hxz|q8W4XDEMPl~$=TNsX zOzo>&#IW1k`9F#O0BLIv4C`8r*Td~QPWXwgS;ElI@mI%sB+1|n9zuxAFT>x4=TEe@ zu}CI{R0dMBC+sgt<|20 zWruWgMRV~J#V|lbMrL;h!k!(~XNm}#J1N%QNuz%e)xJFZaPgb3guEwtZSdI=>GaF( z1L0#$H;bdSovy$hF7eK}B2Qrs>0J7Y&2}}I_Z(YcfH{PWz;SpfJW_bVwI$c#Fg~NjXZMt+}E@GOYmHtJ33vS znWaVI+YgMlt7ocNtaHlO`lglP`)eC5VCx#4)#j@PnPiEpT0QA&>-|PsW2m1xs+(%p zvbuY;-%Z-OO*N}ly4Bg9oGl2YE?BOOxU`qLpT*1NXs>zcX3ss-6GGDD)AcPgPlr^$ z)ugy_u4@{@USD3?TD)>a{ZaIpuHe3#!#)XvP`vUkwOY-9Vb=r49MEj?15Tbj?dkdrd&i{gJ5LO?NMcG(9qHH^hD_)SCL{<4m{l1;ZDT z-@{hdQNWZ zs(e83?}~gI;r%mSzn8%}ABS`ZJTq$6{uI`{MQf|*mp7Wto{g$WrnLIjr#`c9VXCA$ zn21HnF>OVww668#R*YB0+pdrKZgk=27bSJScPm*q#c!+8rq$X@ZT;U6@h^tFXW^MO z9}alK!8!-Se-`P|y^f)z>mDM$)x2M2acolPN2plKsp@jTv)H;_L3w!+&2bzk@WCyS zEV(y#Ru+<7&Gzf9W>$nraUquKEjmlLBkf8gc5h z;oro6jGi#~iJ>1IYQ7rOwY>%(3)y&sNz=3qR_jIZ*M~eg;T<~P#BthR-cNBY_MPFI zOUt=5-9pCUC%ux!)h!m>T}j3GL*h@1ybs~u5_ns~mfjPyw($n7r0Q21#=8DP7FytfMVszxnGmToKEsGZYx zZM!D6QoGsclDO(ug1n^d6?-`Q_DS6}7pl8z?dp=1o`zM9n)gYmYqr-GPj%s)HXV4R zdUx8yP+Z+XZ3@R8qZqT3?5}Yg^Srk5Mv*}yxsiT&->6>dy1#~@@eSU&s>wd5s7q{M zU$d=*Qln1bi)=wCJ7j2UE@m=DRVUl$DS_gP07Z|N;14Pe91JE(O+h1OBaBh6rk(Mw4o@@ z4xChFQOZ8fN?zJhOO>|nlD_Mzl#vW}#4K%#MLdRJyGb7}3_$}Re(Wg71BUs1li?{z zH1CM!LpVd>{US2(4>odS)F&qqg_1|g#Bi!Np#hMI6rtJ;1KlDbEag0$gU-@_=)35-raz0~9eBFf0m@|h!2aLpK8tY9>K z@Sviu++LAt+HT;i+Oodt%KCOp?#ru5VyQ)G87s;fO3Rm9w|m_rm7Ux4R=x4t!CoQJ zzAt=Z)-}sFgI3f0Nn>{;C&&I3z0{sm$Lnu=I;6-a<-bI zgC~}Jr^5P?(4OM)mfqh}wN|&ZE^kh+1;x*nw$pfO`quq^%{(_T2`;94$Ou-3DBYE! zHPn1y)3l4fjo%ctn{NZy=-Oq+jx~%S)^}+hZH}F7ZK%=(sU@3 zwdAOcBt>n@+eUV>h62(eODGD8^TvWEVu>7q0o~n*EbndntIH{+ZJu(5irP(!I*Vii z3oy36VJfmR-OnmZ9vVkxV3m)1q)n(Kx_mk`b4FR8_m*%%<(m=&M6xRb`9(~D2kPKfB!-V#T-^wB*cl z?RXMK5xUG!Z)Rezx0svfM7dpDI}CuiV1SA&RSi6%g;TJGBA#w z9=-f>K8WG0pbsCyhfYx`^I{2kGu!t-Ac+RgzR_QtSGO!(PuHkgmIn7(p{M2-n&T(eqg{N z?QFjzsVgMp-jUu?c2R0gYir(COMN`-V=8fTQ+C$hWi1tzmYXig>fWyHpLc5i0Ps*< z0OUX$zaPan@oIk+e_}t`KjI#t5c%$IbZ>~>8@Z9pN`#m2zm9aMtkcZ`bhfg#wziH( zeUPDPB{Q$>>+n6o#~=I?m-cGY;4&*R*!ZL3#nZedNo05oo+a@=h=N8#B7+)7feJL< zVU9JA;MlZVw^CZ--%cS|gXdjN9o4qE8w7)Mf&n40KtFUU)#$t{e{@fuuSGH(HpPuC zf%6H*-ZS%LoyYG1msQRydR1i}TTZH0Nu^Qmb))8L+ibdMn?=bfT{?8zeOwZIM^yP= zF1OjM*|lcRy4Uv9{haStZO7~r@UqvK`Z9xg3hO6^Q_KL63o{2L7kFcqAD(USi&w|VsA$YbQZ*}okT7Db zH?(`V6<`lWI0LR~Cip+%1tptO&=e^oteUQzt&FfZS#A{NiniQy%3uw^6!CfOmo-Ug zXKycadr4dFy}a8lI19-?dz$LkgcYr4s!-P2**!fHZ2cgQ{t6rWGzm+8!wY;Ry+U_l z?CMtT0r{ADnnT%q$L3AqD=9fP-w?cirwn<7 z;TGITrB!foB9glR$vFe^zg6%x_JW34?{t{KBok|@N2o{$&PzdK6wa9+DBPzzkIYF8 zNuYRk%Uvv&KM}Mo8GukzShv?A;Qs&-+ov!ngKk2Wbs<1Zo^p8H<}Ej6HnvUQrn=Ny zT|3#?c^a%DZqiryba8}UoVwXVPR(B1cGvYnPxvTb?6g#ykN77y!t0d#+hzE{@pjfN zgyBFTF_K0%2h$_$NCk4ehi0WLZgit}rIKmNrR}z=)njG9N7~NKDtH)ayH46T zt(BAbp(ymX&gbYE{{Vu8e#-95ZT|q^mmdL9m>evB89p==1Q{^mG?Eu!GJ!$eouIKH z&R&0S&)M!!THpQ&h43~#yO~-)i=P__8(VIUr^V|Vn%FaiX(YJugF0{A1C@ir z(n!iS<%m*nRe5s2VzF7%e91TGcweJ`%=KPxbY$}AN$Cjm($afd$tAn;UUxpz{{V*n z0QfN}Cd2*-qwqG}j~J8Uuf>a|QmZ2n(cE9d!BZJ0EE>Y|n)8ZQ!h)9{8U- zE=J%o-WiQI91Je?02L*&=MIzhe)uV7WBXU_k>F{VF$J{mhMyB}Rxqu#SQw&&y6wZ2 z*~)^fyTMbWF?r3GHPX>Je(KR$JyfFm+Sb07-RS=Sv!b2-j9RvdDvH;)RW-e}P4q|6 zw;%9PO)4@3f3ctJpJO5dcTeFxTUTyGiUgwSMl(tYAe@9`04W5c)-BKc6qm=KsPNb9 z{rfR!TS+m#mGGJfiXE&$0qzt&Kr#^^e3e{-_eY4!@Xz*pwc}I$w(hkQQ~*Vy{?ES? zZkcnxD;T@K(<0uXV+6CJv0_UfDZ{|N3;mYk4r2YOz9(KPZ(_Fp0JHX|Z5)_0eB@vJ zO@&u@!QAS&X>lVGU4=Zs+S8JZwr`dV>2Ei0{0F{|q5Yp`{nYhICn-iLD|D5w@;!@E z{{VuK{?=DY=T5%(bK#{bGcJelpTJfnPFa|VbuAL~ETv4FieoB3k1VUV&vjqhtM;wc zw~bTd-m`1D&g)wpE5i1WlaO#B(fm0SV4bR4vyf>vp*k#%R-26_w*r622ODQT!s8`%c;ibFqOf1O^-Y33|as!xjZ7tXZ$nzq% z`(RuhpoNfxKtMU#3i|vS__89PeZsp4U7roPKZRPXmYb9IZw3<(6D%l$){gC`q@ZZ9A zx`&5+Y4NYbJ`c3o{6VALtU@x^x=ij^fSyCU6^<*o zLx}ELO{F}X&QruRsZL5ZYDx{p&dN88Rk^vIuI;C`i2H6C;<|Yim0T?p8Ck9vs!JJWge@&~(UewQG9>(59XZZapPuHa90sxR_Z^w$bWP zTii(!SNXX3cg7wo@T{*ck97AMHRX-Qg4(u><4)CL(I;z|?=<~J-p=C2Y2vtw_UUG~ z)Lo>MJaCKYY~qgGZfU<0HT@q=&~*C?S#=~aYE9w`o9#;HNxr+5;Kvj?dds5CYb177 z$s5ZH-u<%XQ#;O~8MjUOHhtlS6Fr5$3F6ghWp_g6nt z%lu=fMw+DP)0O2pd(lc!=9GC-j1z>MRr#dj7bqooU2FZ;{C@ucg0Ftg9wPV$@w?&Q zfxI>GC*y7AyWu@M;gW06>Br#@gPFc8=$hVv_zPFGmOWF%8kM%GulyeP zxnpCb+urHc7e?82e-YjIYr_@>TZs+EyAYo88+X(-8QbuSOYt_hX9lfnWjxZZt2UBu zB)E-C-)GV;r=A5Dd(4r5*VjoRtWxF+$?c03o?|y_rg+=L8dk9%h%{@a@W!)ms9fq+ zxB4Z`<({Ksd2l9zS#;~Axmj%$p`L41OJ*A(m6U{Iy?v~^!ps%}0gA#1BwCic$&)Os655<2NYqHv? zj^^)9veSGQ;msaawrOqcZ+vBrJI~smTuz z{=LVTE+WJ)Wrc#}sY{YoQm5=C2PFu}T2ga%<(7_I*3l#Sb^ic@{&>SkyZ-=!OWkUk zP41tl+5AoTtMFe=wAF0xmS{Bxv$@uMP|s@N#3ZDC7m_x&jTTt`XqqHjDMVkm{{XVL zi*)}05`M^kvS*4k9XjJ*@W#LUKKu*49xBl9Bh<9BBm6S(!DuIr2_!9bE^2h8#}xGUdK(;*2WJFY1jIb-8ICT zFM;$?W8kk1#3Gd0+v(mI&^$Y3XQnDzfX@U;P<%Z7rTl&H=HpA&JTI?neirc-hXgu& zUMBF5i1m*PYfqM>k-l43ZXdABsE(487oX9+1cCr(mn`;&@_ zwO7l`npRg@w11@3J~QyJW<#q-0}Fsc-V3`~Wlu5D-WaBhOYJI9EIWNa~$yOLL_kU03&RuWW=ZZ{{Xa)_$sgMo#EN;E_C18 zJK|*X2+JYXXYkL6mEwx-X)GgzYu*{uZcvdU$g?HX+k{cuKag$KB=j9G{tG$#aM|fi zW_~$p@}00C zweg*vrE$MZ*KKd&Sc#YWJt4ifV=l#E3k`F}2r$?L0GZ0xP7!V!J}?0Ej;2VBb3UoA$8yo#MS#T~Eay7CtI#R}3Y% zj%{x=1iA2H_)ujEU~z^K5RAU;r@@+B<1z&&Nz9-Dbs}v zJh3sAthJPwD z+1?ku)x+#n)pb2a&%@eCZJXqd-p(jBU16j_gjSbFiW$GwCER&(wG7(UUrh3+i&=Oj zn8el>S1KWk%aUp0c&)80Hpg!wk!>!x6-v+`)MXt)B@@v8DM)m_^pzAt6Plm zeg$J`Lz@d;l|>bGDN<0B?aTHY=Jm3&OHQvtn*-tw0;OJA!K<}ySZN#EmCjR~X}GOi zp$SFHMv}dk`ZwL`7q$+9@Ux&@w@mhFYGaXG{b!8upo`rnBRJ+AB%Wt-K{X_wZ@@hlzY|r0M$2 zo`K=L3q?&(U#6L=Uuw&)tT#sIS-Y~*?Cx)VOBdlE5n-jz7)GQl8QlhXeHrez#Kkz%1vqkFit+H~aQc&H^#qNdg4l1@!Wd&e3`{{Y%x6jWo4rxcQI^GT`bnpS&R@9C|Nw0!WRCf?bJDsZnF z?P3^~AcG*m1ww(_BX>}->S8hiY56;sK3&8yxGW#B3&3Cj!)I{{LuU)}6d$y&?CW^t zH1CeT1@9Y{#ka-}1za}P-ch!VYBI_f=0XMra*n}49cG{Li@_R^KiK~O5d0UYqL2sn zXN|l+si+t#5BfFynBK(gEXR9gKwJviwndp!eA2<cpy^R2*f491~xU-x&T5 zcoW3`026#y;(c31v7YMZQq=dnnmvr(a;vln8_P6lA!m{})Q6BMP<9ao=d z{{T$1DIU`!N+Z0I84?C}+RppQ8QmO3OE=bVlrePcNh~%hn@L5K1uI<^{ z+8?3tUI!2DsyWr89%w=p+`}YE z=Cn-lvoTyQ@4vXnHDriU(95r__ca zQ%+SX!YL;x%2K|GTSoOyT@}3*&(#{5a|V03b^OyH0a&2OtbE$Ci2dKmZ(pjOQC$!llI67&MhBbo)#DsePAiUtJcf z)7hc)g2T~KONZ)5{^wz)*8c#PJH5A8Kc0KmwYpn7i5M*Qvq(UVC1u2`vQSDySjGb6 zY*lt;873uQajyIU;fuc;X+IHOS2~WHr<+T0as8t%pB#cFj@tTNG89``?ySqRpuPJ= zw(YV!F7c^P=we@oeixAzVWR2A79o{QmAO&SWG9xgD~+lM0f_5>fpbpd;jf3K9#Ux< zei<^jh9v-GGT{o403&eR+gX^f`M9rl2gKQBNba+5_uGRVzTgS{M zE~FzozO)w2dsQVLc{wY(YW9AY>CpTdw`-e~Xf+=Yr-)%}i6GQ81=%8;vlfoiO0$P7 zGlY&cMP0c=u|UGsJ{DJ0oS=5N*GGGN6 zNj_#kpa2~CYP<}dbL?RAoVs&SN^x>&M^^QA<$5J+y}a4&V7yPrar~V0T{+%7smd>z zryDy{Zhz?8UUd4S0ve#ZVtT%svc(BP8y7i3EC_i576%OpCh=RDu~-^%LU9gLQo~ z!`BDl_lkAB8ubql>DqRSdpqu67)2hrrQJxZ2@Qy3w*+C@LaJE&1LALkpB{W!Zf3u2 zQ^v~dthQb{@$H_0rNruZnr$z`Pk98=I{-e(K9EFe0&bQfvX7^XF*Z|%EmMnL>gQ3H zMzyqGU$aqu2iCmamT5{YVbg?_mpY2N)7`hTgIX_#nWlI~r{GTy+fFP5-WJnt)8+oe zv$)heZ?2pk5T(WbmuUowa>7}o5U6bZ%!R3W;J4CkqMfX*JU?vms>OM)Tv=bqIJ}CpAWQh!_3osDjqhKMh^RpTkO`? z?ISQhGz$;j1#k}0^=F4Z5_n_6dL4>uHhv4R@dR+&t>(YxYkn)czq^bnp6E-j8FdI+ z<@aJJ+Grpy%Nt6Oq^}aKiK7d=W1M%F?_8a|*Jj+CYkglj-194BS#~B@tA(ZSHFfOi zwwr5Ip?O_jZDnV(cRx6+^dTWp70-t)3mC%PFNC#iM1nHDU`v^8+>9%#32r1ijD?-# zQ7HD$2xwO}yJorg&#h@Oa1Eb@{3oIKYG*;Y9@%v%?RB}JS5oo3u|l#HeoRv+mcGin z()>7E$sQoInaBX8wusOv&PY{%ur3#c3%&40GVDjm&1zl;(WhL&2JgE*s(eC8n?x)Z0x| zP}cWXPukOp->tRVxzG3>$Kjrne--Q&8dSF{v46ESjYaj%P&nTzvuc{Ww|bqqk;!xR zM1<~V42B{VzKpf;XNIK+miJm@M6UJC&>UyxB^luiI|bZ!=ap8*K484~Jns^->z6js z@C&>)Qbwd?9q(@qx`O8<02TJ+7L<+k#_C@RG>s-9EdDf~!L=xG8@Mr8p?t+>PRu ztljpz)%h#CZ?E00tZ9ZY@2}c6K*B`U$r=t%$>uAuU==}9900tz`J88;8F+CVMJ>!s zyVZ-yc>)dG5)~e01LY$m;2sr}4ZFWQkA<~3r>HYx_1B^F_yi22KFe;MCiDuWeYb$pLZxN_j9sdB; zL{FNj!Ip5+RpR32;@WZj+){r9wM{*r<7Dj5pT=fcb_Ru1>QZuoYR;@8-rUVurtjwM zZCZL2Kj5I=J@{>B@Q1-yy2p*=vhgmL<>AtrZl~e7h+}+9zbwvbK)r@?VMEVP2ji5j-^tUd=CZQ|6N9jpY?3 zN~9^uH+PRTTW^)N(mSnx#eMx~&*h(8T5?DYhslhabB*K1mGEGqXCZ zaiP~k}YbuiIZ6DmMtnH?{AI$lO5N27lr5sGDMK^C}94!X9ebk$i zT-seNU5=^zLGa!<9xFeF@>v#7EeP?qiCtp_r;wQ;lHC>KK*BhNGCz4MC@ho1f_zP- z#UK{;`gMda4$YFuJH1@ialQXH<}9{w#S!{&1qpJz`$%PG}e$Sr_cMh!vedp z!6crEVCcniCoWZIX--RL8?>8iw{3OoeEuQgC?!&yAyL8K+{4pJ-p}52)s@!!>3=l6 zPQzB!r_j7jW1`97XjW^l4Qf-F^}RCBQZnh6w-H&3TdS=`#^GT_)bC#U8#shhuz|0E z7Vzf?FNjfX+DPw4T<> zPtnqOZa&`9MP;X5POO$T61(MOx1I*Njiz*g8Wxu>QZ;vWj!t=WneN)t?Rp*RiL7P` zB-Zx!>xkZCwpY2aMH0yJ#2t%CxFJ-ILlj0ir-P3(YOgGB&8vf(e(JuBU8u&&>FaKe z$IoIjSyhxho?RzhE>`K(PA*PLSLIk`B-*;(_gXi5FQ(w|*TmVhxV4LahhGmoZyL^H z7MiDy{0X98v~sP*xp?Qg*I;{fTZrT=?K8;=p@|?!h@AD>CyqWjcqdLX{4$%zf3w$% zn^cD4Njx><-+^8@@Ky9y(cD|Cnx38FuNzwHdX31jmvy(m((=NtA932n{~DO29JBJmA{@- z7nUrpo)054h87ZwuU-lX#Xe-*X48wmDsoM?x>|SczPE?49AlU_ESo6Cb4C}ErHGXp zky3G7?sB6>P*pw`A8B@)_fA8_z8(Fed{3_HKM+134-M-2?}~MeKK}PwUyYvzHEW$> zTYV2n(HiGbI(LsQ+%vA0&x0VI2$^Jd;;2(&h@F&Fk{{RUMRt*nV@nqK4T6{ONTIuj< z66^8YYZp2_rlIyF)s;oJhfV#hj2h?*b*003ZYH`vF4*{CudMvYTf_GO7TuN^bo;fL z<0{D;#RNKYmfpenS)+AUF5EJj(+67#I9irIDOohBLhx5#ImL8q zR#}!wi;U*yI+Cf0=bWU}Wj5^>%^Q2ycd}O1*&j^D@O$F~lClja!RsQ7IB$!e3+F7^ zeaapW7Rws|@VP%bW$*#o*iAV;418dTSALz~%#)4F@mt}q46QEq3ce*~S3XpozYWX) z`7%ET!!*7?@V( zkFOY%D*25gZ+mD|mDmAqoqk+=+%WH2!o{uycUHh8@lq1=4FKG@55_mr9 zC1A2*QZ(&$X^vz^Q6|O#qrp436Z87`A~;cg(3Z}ifKnII7YA$ku zjDMM>r@PYW-Slnzh@z-Qym@0)r6l6rSVhGtCwARAU1_%~>ATzN3)j~ybsJgW@P~_Z zm|Mddv{y-GV-)gMs*^r(~PAlscRiMr1XC6z89l< z+f%a-#1-A5)OlQ?cN!|4uF^@yoEuF!Uf$94y~iC_#Wvb+h-H&aBS(Vf<4~7Ny73a( z$2RXOHom)$`)=mu`plBhHORBLg2>Ai!a56dYX0~C0AnADegxIL1*7OXGumi3P-*&n zFA%!EhUVJlMN7kPJUYaUI?D>(u$JoP{_-h4Z!TD5W`-}|Ro}!BPb{~-B+)M-ygH0; zWj4KatX``Xb$er`Ndv(YiHL}}mex4pD2}%0V{QFs{gS>v{A?aS@JGZijeimRPo{i0 zIxW|TX3)GB@o!AhHCZ$bI?_bbbfe+l8*3zJ^7xu7S?#S2*NL>N%gaT$y0_AGN0!nn zpUwP6;b)j(>CT*?7e<{~r+#V5N-%JQVAY$KE73|n65mvQ&%jxnF*rK0rWCtnwj7++Aan@k_%00PtB4*$cxO9i@$q zi{noP+can{eE$FsT51}CO+Bo0Nd?A}r_S2d_1Bk;*HBpMQB2}%h#v0B8Sf#neg6Oj zn*Eh^3#g^hY(72s&Q~EKT{qz$h`c|f$uWteiXp1_-MlTLX|r50YfD+KH8`SWe=2F9 zS;TRFHdV;;ic^(0g2c<;T#3_{!)<%TFFUo_pG6$9N~`8^O6|q-)12kZqs#8a>2$8W z_0s7lr{rh+6%W7@TYOgd)vfr0;_d$cgzPT-RerJQTFv*v4Kh7TN_&CgNUZda?SB>M zdi-o*xq{*e6T=c}SFu^aEv?1fyw>x}_#v-J@Z#rN)a<-B;>|}@zK>Os+}vB*T>Z8e}TBir5Gr7yMAvWwg>$MUPOvyS(t-!dXeI$EU#!&4!zAKlU)OOG{mL@++&E zZhtxTFNyyE8N6?IcRsuEXU3i?GPKd$L1M@Q3fH__SZHgV{h!&z!}*7x=| ziKbt~E(CXWH{thn zTe0yLgJ$}jGKsJO-{ zU2d)KK{+;?SGwJ3etU?eLlsUh3x%(TP@J4x>Az^;)KZN}wPvo9i;dg6yXa+|L9K1R z&en5;XWYfs65!;J%OQbDP(vM#s@`E>01CLRc-|Siv_o+Mr2haYk~@eRXIVC@klS83 zcy<6T#@tgPQk{J-RQO@zyF|LRxYRr&BU?xzy-PnI_&WA9c3C$?FWEIoB9mcO4ysr) zsEme@fhI!pRiOq%##_e3>o76S$4JC!e^%ja0av*-?s{G8-o= zVKE9DVt@+DPYbzMcq%?qwT|SEVn@`O*;~Xnl6~R1bUipJ&gBGQf|eu#PYhL02a1Yl zE|_5JS8O)2WBVUVQ-WUrg3JznK-g2lfTsjvYD#q;%`LZ$me;qxv;MSNc*-t1yC$99 z*3!>QRJPxr%_SI25__Ybc z#|7ie0>%hMV2{+V#O(#IBv`&EY8LTLbrD%lfMS-_SSvclaRyW{c+ob@a_Y(k;1zsK zSxQE!EzYGq)OL3E6U75*`YcEqX>KEtw>5Jm?C)O2JBOS| z&Mr4emx^|c<0&86?a0ES@c;%tnL$4_LQ-+;)4#otB4 zkBN0VUGv$bvd3>aUfw3wKvh5E;RE6|d;-eF!-LKE!rOn1{9hti*~W{hS^yG52m|{P z!N5h4q-BTY!X3v4lGw_|qUE-h(d{K>^mctYx>;E-nWiF=RG}?(YnnZjxmwXjTUz_} zdz@|8meE91?iqaJ)ZELR%drV1Fizdvg(@9JQT8J`?Se!VrI%B(L{xSlv(0RzIb-$2?k0hmA<)DcHL+WWSSv)fHt-%I5vD%N zaxP#G6Z?0CZh(Q;u&uz zyB4}jN_;)ys~GLB=Fl!|wOumM%kz!wOD%=vt;F$LTx$06A=Qn)+9Uf$pER1ay{-P9 ztOBzeW@nn+Wow2A%^Z&eoA|fWb)81zL)95hm8WQT66vkuJt{W4n%*m|O)j9nztB?Y zC9=NzMawOe6AJ{?FXxsyC)iqK;lxtqyGycKy^~i;+|OHRm(I?|q_Vo0im`ZVa^{uW zg0r+&BD~%CV-;n2O5W>!`bhil$6p3K8}UEG7M~D5Wtp`Ln{gzM;-7;aFVyYzJ$J*` zX?e0$@E?wEt@LK`E{kU!)X__%c$O_2#2Q7WpZ2kLuldqk+kE$V;(NaU_>R}WULw`B z&xoEbO)%F0c0TUioFu4J@_Q_^L0D`BZ#2G}q7Tg2<( z>uJ1u;eBgd@Q1_?v}#sbe~zsz89W{1X!N9n&*A?78|ksjCXZzVD|e&nH`?^RWE0)r zU8boVvY|`Aq@7v9Zh4c?yj*Kpj2 z@P4JN!Y!W9QJ+#@3(nD4dHRLKBF{pfI#s0&J*!J-y}5oJC4C+K6?f-uinDx*G$^mE z$}y=ZDJetVjpZ1-rwFSx)w@aiubIbxm@d43;o-PRrr$(?ys+;8bXJXmmS#a1R}2@- zm&{}=*aeFg6z#lS;mhd+RuW3GNCKo&I94qu%d{-Jx8ay=DH}5GUCNc+{A2x}{CDsl z!~;k8gP}K-a||zGsYm|+6AeF7vYs;5*Sco4YXP;?V7OD5uXL$mhFg8Da~*(|BpiQ* z^q&VL#^A-|&he2Ly@o}!NgIC5{_vbCuJgUoaNF5(B!v1DF%zicuQYCwdf%g3r*!mp z)%4!?J_4-;Nw}-oZ0}^&n(bz^>XWxpo~fhVUE45^Ykb9(BmL=YAOxb6=ML;iNY2rK zRFWCIXH)Q|zYNpJu=$aZB&3B`F|V5$8{`VAqs(W*w4{*4A1rX+Pu)n?@@+=8%c>&& z_Ahx>Ld95w-9q71$bshHY3v7)@luC|* zH;;Rj3QicIAQGiW+m=#6)9~_1ABl9EjqE>luegl?npq0zGGa9W0aGG6C{Q>>#z)L+ z=q+NxJNpavds}mhDUlXQt!@eOr9!W4B}n8zK}9)8#`hy6ZEE24{{Rc=T5a}&c4eLh zh~G+wF{EZgY-Clrcw}ZzH6ofMMA-5W=){H#US(V(N=-{d(|cWA{MD_|t7+zXUfMco ztLbZBMB?wKFI(%?G?!V5+j$ZqmW;X<84MH6VybtB+H;eJ+RA}rDliUX;5=l7yhn58 ztZEItgPvV*X4CB^aE#0V++@Op8$nNZaSt5wGG$mI~v{u`YKn%>}9#ylC;=%H(r4;(!-B$Wq z_O{km?bB^K;-swAwZ4|$XM4A=uT!63GENgES;;4;B$ZYe2Lv!VB|*e{ikt&OZ2ZB{eQU*YNt~Ra-OfE%TZ08|yoVWlH)aL_*AYc#<;m1-5s_dml8^Pp)yMt$F zJmieyoCaKDaOF!8=IEMw>b0|ayREOi`*zo`iZTc!jKQeDWRE!#M$${QiBfimz$$)G z`^}4zSLWG`{-5x_;?KpegV!=$d?xsntLWBq7oPLO>@4+f4r(Bzi7M(|7}a6E(C?a9 z%P*Zan%5~CGsPrwC}s1OMF;n4_Y43aGPSoLoPb@KP6jiD9T@H*2`MBnkgYz46Kotb zdX#H2s4h#R!x$isl#WNv1C7i;tLl^YTx^rPl$E)3a*dPgqhC9*H)PhWby`VZMW<%( z(c0gS=vRRM0BuhRYTi|k#Xkp+4BSZJqt|>P4d$WY#g&m#X>T-3iLUiMJshM`Ik33Z z6`z>xp@Dv1Th}y?19-B{d_&<&eFMZ=Q|}+!-Wi_S;dip_Hutba6HO6F$P(Mk(OyOo zk^H#<^8WxeCD5m3F->syM`%HMqBC$;JPVjec&8|;6v(cR(ne?9F6Hai_c8ez zmE-~)BU02Y%92IpjBq}IcEfUnMbq^5k(d5Hk(kQ9_24gv9tzd1Zmj+ic)Hrg;_u0m zQuqP!N+#3v%h_J(ovwTjuDjh?Sl`*ZJ=9Rz>P@&aytWAxVO!Xtj?pIca!ZxU%_ick zqwu!7$6c??aMi-Sc~;3jWoubl&zjuI{{Y_6-*syqb9tug{u-4m{7DwE;i(*ij@MhW zl3gC@u-IE&b_tEMtbvZnV7XDrc1!})^wKWu(Qe}!mVm6tQ&iG*3-1wWQwcJNWQ8Y? z+bn^YZt~fVcrAgCsx16_40g$;_?Fu1!?u?Q(aWTGiryVx!?SHiki&0%9CF)X2ITXl z*sP4R$s;QuO#7dPUKG`2eOtn@pABAI7GbD(X7BAfB%y#Gz0qc$WP9@5*k0Shib;|z zAq(j_Mo~^JNu-{#+39D#n{;sVx#i26FI%f`ZmUj?$?dE6tot7}jVbPtWu9BfWa?fk z-C9`LNK@yei6n+EFp;(i05OnNqyz?b{ffq5(Onzz0VFeCYQqe2Fjz=Q3|O%qSOJFO zLB>5_S@>t-{X8`38Pt?3O6N>(?PXw~mzm0}dWtC_pUYSz@Ex2wB3`P>(>8EX!Ztct6_3drdwneIn+_!#Ozb%`- zyJ^$%<{v@R$sox%2Ox#KyF0;eE#!B$WkziV*4ETBAf6S-vs z61^M_4{?rxxEol+(WvXE0fX1glm*6l`NM6^0Vpl zI;p0W+HU%$uI#L>+g0kiTVsHe!@A?(Nw4bc3X%KIE@dG`&;qpiBq$2Sun!q5yK#ke z;E84=$*Vano*zh!$=$dROhuX4uUwT}mLdLf2dvCg1`lCw0LUZl(dQtr&jTm!gMosl zJlzg<{+qO<7PrJtck=cvn}1U3gQ)I$w%(`AJx>{4F#t z#Aje@i${1K&Du8H(aVR4L&qwaL)Xj)!Pi=Baz~|aa1w~tfNrgtsoH<3G+ zfmxf6Eu4TjUH}~7(lz}$>+M#0dg-@H!G@>dd+Du&g-AJj89b&&B!Tj&RmjNPQHjkc zr55(L#dg-)OIW`p$qudEt#Oo8o!W7CzU{|Wtz`8{X{S9#^xI|hezWjaOGH2Lk9dyt zBm*lBr>EZ8lHr*gM1f|Fmjq)HVX_J^QdxYbRPcw4biK=eb8T@NqZ1=oGyd-fmyzB# zToR}HVMAacuF@acGvdY6 zeqN!fT3lsaK)AAxX-CNUgbQ!eBL-A-!NB=S;O33)<0oaR*>u0ct!K5{>(FYFx4S2O zF1c3T?|E}wZG9KW@{cx1=FPRE*zL$+4d`bqyRu9da6}h8k5x`yBcuC-P$w{Sd3m@Iu-lhfsT%#~2 z<~ZDhWQ8E(ajX5Ac;n=b-GL+x`an=l-hO0*VxBSgvw|BvF-}r#ZELRUZeFgUT5HjL z_CV>a?PYu0McVq>+S{s6wbjw-t9Y%qi6y=CUYGLJ^?`oJk*3?{rephDM?Em4xf$mm5x@bM;{@4?`NuD!>I^fC z+iFq)$v9<>SUDW70eoZy0OxY~1bPpNU>Jj4)#H$LTazq6H#?LwM7xN`%-cw9xfusF zr466Nc*3o&y(^8lAm7?Mahw7tfU@2c-_3t!Zy-=(XDSvwxD?b*+v?_g}Nw zt=-k$i+yx@cl9=%4mRK4#4vKVdU@CZ1eGQxQgCoi8wcFwn!CK&1$BKWE=U4+ZtdG3 zk<$zV6T!|8T!GYZFwgNu00V1rOt?QR_WESm;GBQQs@ zc~?&Q-5rKC^udnbN`FHRt8}>>@^FelBy<@kB!k968_yF)Kja@^c;Np4X)(@t=g*IB zN#H5S`MKy8xYWGyD;&$=Z3(hTCLKq~B#<)2SPTX^AP~4?!RIGNJB?rs-|&YABdc5M z7VNkijtF%mh8QH1fG~LCkE=VS%{8*oyFH$s#4WvVU{6yJ~I! z0BiV&5$0%maRhV!026yaPf&m5kjNbE$nVnxQ-8JfEFJm{lO72JTC_jORk`PkI~x{pW+VER5lVjy^-4c!+`t*gJAh zCB9nP6g1vW>F(RI_foQPcmDu_?j>3pd#OG4?AP~g`q}J_N7c0=2>$?tbsHg%?)7LN zgMe{>cM-+`1otAUKDn!=0PvfY7#aT1w`>r4{{X2yLu8P9;FSZM^RL^-_q-*l4DdqT z$fq3S4c6q0ImXpcNC1LavPcA; zS*oje>%$6hHPp!5;bhb9(C~8HtZq3OCj^jr$pDJRbT_?Adbn+(zUlYTyJ@=6UfV>H z-&@%}&EJ(bev0<(cVeubF1I7*@XDw-BNrD+M<@8c%YsM%cKV#=sLA53Gm|HV+Zh9! z>068(oSQOskiZ;cp~)cD`SFj0=IN-Q&mTN@DtI{un6NX@l5lgK+>uQ>*M;Wf>h^=z z%w`#5)Dp?gFm|cuCnwvUR2;Ubo%Grp>D52Y-DzUIwYG{)+V)n}Tl=l9ofnh22BR`nQ4wwLNag&{=lUHN6 z$j3rC3PCH8oM!|PkamJb{n;Srnr=?kZF%c`wY~Q2p1!)Uf7fqad-`_yMm)2CPB3}^ zbAof6jB-I700=yeMrq2a*C23C20-XRBQ1<&yPiiN4C0TmIqJu$$=lo8?(hgW&wTa+ zGK(is$yCRyAY6tZ5xMvo2LxewIXJ~~kLCIKTd!Z$`4Fgc&?yH1k?Kd?Y>uOj4mrVG zgPNIPk+F;}a5rN+aH9-6pOoOJJq8CsO?%j32PQJWVByKgQVuvLJF}G|Cy|~GO*hum zHV^^W72d-ja5pM|I(mRkK*vJX>#ds6Z`J<*UZ^x(R?7Z;ZL{06(&nJD+(BnJ;GUbd z@B)Lo91cOq2RJ##DdNTvjJe1h0=)|Ie)A46TZ|A+F_D2-4XE8qz+yTdn}LP^XC!pV z<3BLtu>`_W?n9G46p(n7t~#8I6340c#sC=^uB9t&*Q4F-d-mPx{U1vkdH(=Q=lOc> zbn?cK{{XGIQaC$Z)k(n&HjUtna4>O#bDY%^sM)IpSfrHkw3mB{@l@c43}lJ4SnD)p!|P6SxzCFi$tpW(q>a3KPi^Mu4+&#niB4oRtHN4B+kP zYWh2AzsmjIx>-JJ^iNAQd#+yU>sIZfzMg$F?ddz}7c4M}6mgBHR|vcYEH;({f?2n> zOyq)UgT2hB4$eUXkt>$K#~W90&q3EcPhzImlInTv0p>`!VYjXr0kq*4n0)*XeGZ?Puw5c6)v=PMR-Ewc6VHQ(ZkWan~f^ zfVl+vWU~-EV*{Q6=BFBZ4t`wnayIt^laf>bN`=Ve9!E8BBZJFs802n@lZM;SH(YW^ z87C(s)awxhbI(Q_l}0mxlh1w#JcGwH?WVE5i`S;hb!)r#d)Zh{{&v%UG`|fr@i8*+(FJqLBUlV9tJajM+XCRTazOU-7+x4la2@>fFS3d;1&b!jFw$_Z6vn3^z>Rj z*X$(zeztwIT6tMs_PGg!$I;xJfI(>rhEjfFNys=Vd*Bj5BcLy5i-Q##7EA%k36>r000Qu#Z;0oNI4n7 zT!TsIueH*9^;X$iZ%)?H19!6W=(W4H)=Rgl?_x;xJ41mYa4<@g#y~wm3=bHG!!AJRP_Ov!rc2{{R3}*M%cIkljw)gTNpRj1Z)C zqVd_DoAHCrGlEWY#t9fBt~znR7*~7k+W!D8-iup$+kG`cwwkB2daG` zxFhW05()WfR7N^n5KaLEN;yzZQhmB$s66f)L8-d!t-IT6U#9&&Yj?c; zRZCTSyI=5HtF6CJTXf(iNCXxG7$lByoRUKx#|I2J;fDlFp#}&%gU&JlAo33@=sC&3 z&o#{psTAZr!-+$2*E=9FQ}TeMe!F$i^wAlj^Ug`mVRz zw@viu>?eh`x~nAh{{TDNPWl}ILf8d!+Z(caf-{l`1n>bJdB_A(2y#wF4oKjFK~e@= z7$D>p$Fa{$)?9j#7#VEiCn7*p`i;XlBd&0}NzMVyU5fk=F`hsiWMG^OZ3j6xz!)7# z0Pqh&nzyEx-CIp{zRfMR)!RcBt*2u7$sB`>4cwI^XOc)Kso>z`a7*AE*I;rEa8F_f za0$pDl1lUh4l;9$U|9nYa(Fq%9FI~n>C|K#gPuiLKwG~60gN$L&TukY1F+~Z&pZ%L zWqYmNn_aclee3=j%`mDLlaNL-4mrrjC!pt?Z5Y7k3^_6=azP86;N+9sg1mE{a!&+s zJ7iSADC!t-gS&S?Gmg0#&*D^bf@(mjGm=Rofs!y!QgZp^A5sYi7{SdcSzA@zU8epU zUtJdVdM{m$n>Vt*rQXSYU+~%y<0rp!$T-G+Z(hU#0P3S7H73$d-dG+$BXBt_fzEJ# zY~*yw1P%pEBgPLS)D=B}=XUS!ah`Z5c0i|<#(lHYXmC5Woke`f8S% zCu=Jv{{S?bds$lGuDh@4J+^x-%xN_JIzyJXi+RZaM8J>(6PyLg;AD^q$ILquMf5!| z53Av**&{E-<9h1wYzrLb#VK?t9IA#(|a7!=uiX3rF@`pMq@p5 zfCdx{3~o3roVIr!ZpWhA3};rq<2eV)BOHK9&PX3GJ4Xa^c&(L*`hRCB0AONP7{~)S z!j5s0M;^qCn~85A8Eq^g1pvI444@pbC+8U22qSg|a6u$=hoZMcuGYHk=c{|GX>FSg z_Fi_oy1kcueig3TvZQtzdvKE6ZQ*`-=gxRJCki_;>OkFwenxIbVFH}1NO@z;)S%?> zcoO8PC5Qk4+a9^H>iT3E3bw?L?mVu22qj!8B(cF8fdyL!smzzfHoJ(9GUN;{AY!ES z!7n&C^}y~j!=+>Ork^XbYt4H4r=_g@bhy-8wyVC0Tc(dqJEeZ>W3(_BK{Ckd1_N)L zgN)>5a>SBHEWwEfAdq;4^<5_1ku;mg1Qq*4tPVLJyCyTZ@q@g9k_pCh<}>S>jDU$4 zqMY!!iy)JXDn%OOBnA14HV<99j!c(LAc_Oo)gB|d#mxk z`RUztUUn%$+xc(bZ#D9^ugiZ*yYZcspd(JPk8uP6ENdcU<0LLi0-!MCs|@6lan8-+ zuM_G8nQmsaiv$sB1+wkIAsc4K+rV6sReF8VT;H2^IF==hW3E*g@K+^bRAnTR2_;uP zyj4j;y8JAGwes~V73aDBE*FfGgUC6+=a5GL_8?J#$1U!7!N>!Z$2c8xj(P)v zY5Ts182iP)9DoAz$;rpvI6R6DPb3bUkXZNVNGCZUgPdak9-|z-$;r7{yV~h=(LGh~ z>36NZWpce8p0--sT`&H6G^|ICbB;0xpx|H;fW#6x_0I!6)MJd~VTmK}bsaFEkO}U6 z_`xEd(B$#cCpbNhIlwv3JRD~vg18DoBj+x0AE!==Mj*ar3oo2OiBm@!nfB@ig(>UR{2b>;$ZgYU! zQntPBudDv<_tyF?7Md+Bs4ZUh>96PdZ)ecz;mWqtyY7>YGQ{8ym4cpn{LI~QFa~Ol zuEo_x6nw)x^2DnD00A5U$I1eXk&&IOY|WH#&A5P9f_CmMFvl!TIR~8XJoAzOse0SM z1g~7NCplf;DFgyrZVx0DBMZ|2^y{yclhVs&`uFR7N3!d$udcqGJ$LA06diJTJQJMf zaU`BHG6qh0$zZ2DinK@DIO=&B?lGQm*X8Gd^AX$&n@Irf;4bdD1OuLVP&=MEBrwiM zA;LUhoxq-e4Z{F&!6fzoWltc0Sy*HdRbck{0W0%$!1Or-i~@IK3>O(JGcbdd9CX?b-fWhs(%cX*yl%k&w+AZ3#@P3;$l3u1cg_X|FkKb1N=SmrNe)gzf?2b;l3Q<2;RK8yyx@Rw zxZ1~tw8C2U=G~kPxQUi#EHFu7Y?9*{SupG{qz56Dt6xv?IK3+#iK5+JDL=b{I{~(4 z$&FOcIY?q@2@11HlcKT9!{ui>#X(7>Yr9&?^62zR`aeB?8{;`BrrWmKZ!5cA_tQr1 z`e~}uPG&tW+2usJhW>k&PAqh&< z*1j8AW<-MC?pb_A;=9*r8a21mv{-)6WS0|5`=v8^az`YJWI_TudzXVeBjY>oD^c;D zp``pZ(H=xArRkG4r{b9yqoir}+gPNxv3aBt{_-nnF4VbLZKGJgKT~)+!9EV~UAuUr zPtr=HP2s2Gb+Xkh8;VO?q}yrPtJ_qho80-M!G8gKXRpQmp{;oz2mCY}eAn8a zm*PK(dc-PS6kBO9nC$#F=gAwwMeMqD)GaTbmRgK4g@3C)9sD8iH-N3~HJ=GtB)2w5 zv+CX@@g}3DXpmXjyUzvAt>V9nJ|vE9H^W+WvbsktzKLmQ`nyGO7LjZAqiJtHhxq6A zz3?B0q`A}l9cI52JXLP;h&2gjztX-MXo4_>rJhi*>Ru^^6@{E6A7HhXGa{W@Ssb(c zYw;)I-^8zsGOPSX@$KfXq1s)Gy+1-*Rq)@#?Got~;feH*3TdX^(tE3Tq-$ukE6YW_ zX!l!Q-bPwKH(#tMq~f`nR_0C#Cb@LI?6tnJSJ7*IR)1HiReRT`7UK0y-CbR%>gBp= z&7{+Ow`#}U-Yfm7eie8M?@^!OH-&8f0BC=Rmc}6e01$QS9al#9L*d7U80NS>9I)3G z!(Z_jv$>8nhD}~gFG@zTZBI;Tp5#jh#y=CjDR}GR?z0BB@t@*d{{W6=7g~+gr-HmQ z2li)$bV(#uSe6lOX=kHZqd%4BKAB;6s9am8l_sROay-!a$A^3)t@!6q)AU~sczXW; z#CMlZJZSokrDve%%9ijw+-3!twCgA#@?p51GXaUVhx;_QWQU}^(6wz7TGsqMs90HP z+NO(k)>oFcj`vpa&WfSZJJ?IbI;t|MoXCkb##JiBGvV!LQdak-^l3Eg-K~3BUwc|p zlG;hObi*v=N~EbxQ-AXFk!xg=N^P{ScWzk4r1jADEmPyai1qJ){tx}1=hJkXUkZ3v z;tz>FBU?$Q={7oj{JO@w9mR}x?{jAy65hdSrQCgjTfJfLF2A#^bS);x>GrxLjjH(t zuAioPmkl+%1chJqw$sW(gj9c!5*4>Ie9}laoF6l32=-Fa?l7vUY-A@R6TE;pAQp54 zACzDQErXImuo+exTjYeq!Vt|ON=nYO362LlIX3nO8r}LW}2p+BG?uahcN;6ef!V?31E#9rU(ZoC3fKV zD9Z@6$YpsJD4=pT`G~6?(lEa;RtGAF&DsMQQAi961$@Vr@lMm_rsiNvn}f>|z^PRk z!(m2p4+D@%S1k8Ym0;HKw&Z>wEr-Sm<&cmBh<1iy9u-L+GhmZZVH9ej7c9dO`()wSc+f7?tHC>A9M5=GrW&kO6S+giRQI<(nBxNAGHb5b^9lP?9 zd5W#AOAv5%ri&wEm9#(!A@RFu%!?Th^OPn{zbZVTQa)96ZD9ceQiK&&UFl~Ugg7i; zdO^J;&Iw>aS4hdgSfr>nVh%wG8lWIYfSAg)IID8X z`a8J8S9t8DQ`O%@x9ku}%_nEl*GadhOL{J;G?TYpy4zZhSdK>0j;F6rZixz*tS&Uf zbedAG!s2kK8Z<|FB97fj2<~>0OX)}UqC`(=Wo+;yGAcH+4ealmriqaKmH-R01T7c^ zBR_bvHV-u)kNipYa~``spW?e{8Q@qotrpJ6BI*w`XcB!E-pXf|Ib>oQX&pi{s6~&L z(9?WrrP?GL^jWNBgUwr?uxmHB7PkT9E(h541$e^7m_nnOvRYC>WvEz+O4oAQ_EC-A zirRboJzb=hjiczWd3GAFBgIsVD9tW+JH@EoUdbsdty;TVJ9jtjwClMfc8)t_#8IHz z4Z|xq$IOj2$zdZhV>^lx!0%KnD%2Wot1L1EmfZr#3-G1XqZu1~hB)2CY>dHhRE1O^ zlrjwXJ|I{}G@#nv#D(*Xu$($7`7QG|?wl(o)(%u`Qi?JvWbvkiw$i&j%1GW;B5O91 zMQ1J~Oow;v0`LytZvRYfk+Wz4dPPy{%?_r5u}pqlHt3A`z^k zCpk+KR-5LuR9rdz#cq~Oc{1hQy!Hmx()HqBDiyg21W~&zSB)&{&LNd#4*qIz=X7Ih z6*xHb?}d|Y(L7si9iv>e)zyq^9BVX;$*1U^DAeSIt-P{GWVSL(nN?(n7jlTD&xPIi zyGXiyUiRVVc7-(9pn^4ZTZCgIZoWYfGXxRDyMbl-ixNXCH)r7QiX+216}`@pr$IX2 zYub;Tmod&vyL4NfE@-28?((H=@2^6#k%`(jk!A|0IqG8NWUb3BKFdk#2JEkEHva&p zWPH>kmr};LVet^29eYO?ChAn=i%^C6BNeQ5PombxpnQ3n%R%_5@m|;B29Y+s@i#&7 z_t@^P^^Il=y)sCn)AXq>;-5&;tu5`ZRUms?OG|hqw0m_?2C4R`;*&fbu9>Le?kr}| zWYqPOde+)5pCy#q#5T5(&m?iChiZka!rNLH;k9on^4`|cNoH7yMSFU$#v2RI68uco z7vaZ;wTr(Nc&gV@y13SEwfp9_Sgq~eNYiYQTSpG9IBBlSESCYJNSfj8Ox|uamySFy zr|OgVlHr)V~KuH`i3)Gma-VYqY_vt_jPCG2cArKF1)j^-aPa;#9Cl7f>; zNk!=G9ipV-n!2@}qq9qQsqD)WhH6~1wy%{=_enUk{pGFitW$3HS`l69k~&; zzh;`x&GKbSi#sdpc8JW7T%>N3^BkEh>a68P*(;l$#~u~bF#iDXkKXCATB1QbdPbs= z{j6Uxj#RxPPK7QDlqw915`<+Ei3n)|-}uwQT9%dM!(lj+$%o}4q1O}ES4TKj4I(P=)ftK9hv%s|Q2Q1D0&9ORPRgCHDW z0vrv!04Jap>OsKNVjT_@c|7vDjT;<*PIiI^BmtWH0Qe_EW5vt=HviA0U0FSO*PvaF`@uN~#6{{t~Kr192c9Q8-onSJq?NjoQ!UTv(F$9LX-DT1a=(rN;Lou1?HkWeQEs?=42I4>^o8?lr1V^f{@xiw76XuX4f(-5zUTH#@bn=` z@%7<30JGbh(g`d^64(&Iak!pN5QHS0EG)k{SLNlqX?%2^zU%21wux)`wrBOItF^AW z*-7?GWYT-}T5r(!SIdogI&|RYINu;%GH?~6B(cU=4CjxV<~1@h0zk2x9PP*<*e^II zZ0#HdZ)B&-%Vhp4J1$$jDksxjH@|cr zTw1iXR@UulWu={;dtLOuWPEgIkY$5S&=4NU2roKnA1*+1l12vXll{^N2kg)IWAfmAkK_LU!PVZ|fV{l%O{AF^AQT=Rkri05RsG>E z=VI3fTWhPfjoGW}_xR~z)gK;al0X2l3|29NgOQLJs~i<7 zO0YjK%bJwgJ973mDn>U3orI`Ha~M@e1fC9dfyOssfInfc>^t!k6XyI*_(2&2{L^^% zO||)eY_a=Qv@QSugm9QHK^V)j*gvsXjuYj7i$4TdhTzTdD#k#ps?5Osnkh1;X$^(k z*iaWNFn?#e>XT{TR}UxV?)rLYwk>0#_f0pWe6rCtm-6hs?G?Ho7_>63Ry(ad8!PiI zp=MGy5I3|)Re>k&s}2D9$lNVy`hB}OYy0^*h_-F*mTbDCYy>-}@f93K+flQ)a2xE0 z{f+#2129jHp9A))aw73jC)z$ad>>(sLTi@o zl?=dnnSe+TmB!(oPS8dPtEYsO_Ih+uR?^nB>P4lhR)1SorK(z`!52M43B5P~ZN|nx>epf8lWaIhdk`CeGx|y_CA`jbe>QAZ2jw|dBR)36oG7G~Tz1cQtm6NUg`=1Jiyt8Ad; z1;xn>talB=4(*&S&~gHjc8$aZ^oc$gL~>>EWGpeX{g7HrPb8E703TqH!6~^*9!l

    C*%M4bhY-rLk!C4;#PngZIkfvDf05ZiqH?orFYALnxPAR+c z-8I(N?%tdC^)Og$O=o&^YE-qqg-%WA(%RamzsuI#Tz71M6_t(@Fx;mk>ren zoRHYsNMD)kCaH3S4>nVl!xF3k+!Pi0fx%p0FB?cWQC$_Lncx}RBzpS00Hr{=RZ!<2 zFUw*M##STcWs$P^IQgrkPX>5#*Y{Vqq>$T0tYZv}OK&Drw~fI54VWxlvgLM#^{CTT z5>Tm4?HfjGcGpzjrn>a#dQ!t;VWjBRgKO>6oGgEbtATpNK7Vy*FC8vzp(=elpTE ziCOgBUefjC)AZ}BNZRb$3$bwr+9mUIOl&gPdusLR)1?_kE>$W*5KXwH9%YFr7Cb zG0C-3L@dP;ZzZ!UjAM{vZD_CNi6fHcX%cAC-K`}NJg}s$%jHJ#M{eyrvO>OOFu3xS z9#)sj*))UgFWS5Q38VX4e#T!2v~P_603E&^cw*1M+P{r#J|Eg?o*wwi;13t-_MRox zY;}EZ(!%#l@Mfc}UM;2OpP*|E_Wd&QYg=2WtU)c8ZD+*rc#~e$ z<+W{ADRfA#V$-a?OF!{DCdjh*Vy2;rooP-KY2jrGs#2!XsmnD!MHsggE9+?_lRoo@ zJR;BY%+9V3SHQ-MVLJ73N^o#h8uotcSDSH-N6U8N*SzC(&HQk9H$?F#kM*cD9}4($ z#UBxTQGy`Rd@ZKyek#`ELcuMJdT)pHtL;S*XPMozG;qqyfH+iZiGK0$Py71Pl|`RdKUzsa2$uBAjBMyuF;{ld?%Sb>8RW&xZd1;D~?l zQ127!TDOP4us#cTTUya=zT4s-0yoEBhdwj$zlQ9BtQOb0zlS~?U3lZg8g-VbeHFwu zGhONNK$nsImCl?ZfXUccf58SnZwsMur|9;c1@UY)GNihfh%}Fl{sQpV+2ou@IMC(r ze~9dK-xg@sZ4cUnmtHBi@a@&hOTBa}cDH7}{YCh9{{RN|d{+2V;!95z{2TuOf}8l; z;LnKk*-Ke!KMOtr>;4hD($+|(g`tB|)4yqLKUdUZdl{zFrAoQoe@-dXBOWa zKWF~{n*-(wf8k@uz>U1V`bR?p$q%DUTo zE&gckrQya^hiln$B$9e4-P+F1TQ{d<*OB}n5BMRE{1l21+rMUnl~|TA*ut<1h?2_2WkKiTH(*^3nbMIXip-IwNk z6fupVOs;ojf4g%9u6GS1P6s?3peG;gD&%wkZQOQ!-~q*1MYq9Ird#be1TD@91eH86 zRUH8eILFP9Nvz+D`PymKrGuPqoRX(iJ=1^k{k!jdE%+nQj|b7E1gTf429im&7i;pZ zef71Q`KP0~{(L_if8d&bw%5Qr39mjfe$5{jtZeM8*81yJ(|j*=@jFAav)CtDZhTqr z-aj6AKTnw>1*eYVTDQ2iSirb~FaxK>wmt`67TGnQhb+8Qw{c94*70}?UDU02?`B(T zxPHLX?V3nga~cK=vN8#odH(=Us|U2OWR?RqmogLOy`qUE&Q3skbW8)z;!#N%$!7VF zbsvs=K^3%VZF_O40?4LI&06bDc;YThvWAK~_K}br`3BiM(gM7ZhAy7255}xDzkQa* zQ`6yY3Q|_R<0wh1?{?mnJRENcW>Az}EJwC)Ny+ok)$+8X?^RkoY~|{Im_C8~IDA_1 z3?4?6`!xJt)EMAKns34n9qLGC0LqLdv+#(F#Ucf0;xWmBj-;zAT#rc5{{Y~hzqMwi zBV5{k$Un4{k)5g~xA+6`Qe_b|Y*Z`5;Dn5AE_O*P`D1B~QHsj#{*-h0r^IfCIebTU z=mGf>J7jJ{5A}%}Ns?Jz+%j%{r>i$VajafDZhb=jbGcnwTdUa);hucAyLj1E@^*zj zW}*H!~lw9>Bp z5u?0w#~z_9w$?hHtu?-tG;mD<>JRo<6X)xn**9Ll)MXc+4F3RVtB(<|xVW1^*8UW0 z_LtDe@%^P%_g}xTNv>}ti+uB2pAK4Q;Upi9nG(pvez%7_Rav!JQh7BBQBjI>RhKlb z*To-aZ7$XM_1^0CKULvAAH`?2V~4MdSY=M~ZV_rNMblQMrR>^rO-fwqn@;vpz0c#9 z!ymGj#B05B*f+p$iPl#UT?k~jZ6CysED{jPjP}oRH(s^amH72!#c`a!z)}b1KAVeVA090gwCcwZ3--O!j6@44Shs1i; zfn(vH6u{RShNA|bHMySUrbN0vOBc7fo#sVFa__w5P&OJ|Fh5C{VlY_xZoK0RJW_I( zEal3Sd0S1jrPofrXY{WPa9tdi4(n9Mdum*gl}S#@JgO0OIh-caN;iDZySJCv`giT4 z;#(9kC&Q~%Ru~}o!d5|ykar&sWPG{j%Ulq_K?ic{x9y?gSrEuR9a@rkZ1}ChfypdX zXdwKn{_Y!vE!BMae`D_)Lg5anqy|zjcTNT|f_AOG6gKQ&Nss^l^Tp_YWG^1?2m5P6 zL<|@MCD!mT0Xs#SBV#8RBocW55ViSEW1DcSWhg09lZ>2Yer+1j>1+A)x05(4VSFLK zv~=*YoUG+FUmE$_+h01qqF^yJXXPe*Wz6)1B3g!R>&9`2RPo#;DW!TX$=gX! ztBPsb*Vj!CGNe2qi`Jb9S@d|hb&dCLZFcLmuVc!*OZ$KL!^4ri>i9E4ys*etM%QmG zt`wfaGp4`IhCgwg@$(dkNCPKL{{Vu4c(Yv78&J}GA)&>8>>K5^8w?*xu zzr?qnU@|0HYfNn-62O3uKhnQukB?eTsBbm@0D*olT_U{Nk1i%#(> z&J0XaLWLK50z_(|(0yhT55nA$l9d;;Ui_4`wbi+kO8aYV?R2ib>nF&(8^@?Pthy4C zkH?6Nd74YzlpT3Tnl8%eyV=_MA86`7w~vZq`(?};CYOA%Tda%c&3UIp^CD(Q-sP?D z6?SCh(lfLM*?>W>m399B_$nX8CS5|>&*0yNwWWpM%zGb;T5@@CAa<5RZ>V^8Olg<} zXIp3tv%bP(jpLCfdV0UWUyS#$>NeIN5ByoHdC&~o{{Umy*_o1T0c+=7-|6;p$eF{) zvm13F29_poH9k<&zhFPwx5SrPl=h#qR=;r^mjU6E#J)Q4XNG}N$8G4cyzw#)-e|V_ z6D&=E<*1O{SFeNr09C2anssPHmy*(*WVuzB^Hhr8Tkn3I4-<@Xt^mp*&y~*zszNQr zQLPuO66OA7tLw=0^VID%KlmuOh_%U#jo|GGqkI$gnRSTDmm5l}M*_yO??*;ps*C_+ zGR71>6aN6gK)gq68_Mu6h8QZmfJdzA0|Vtnk(=yhAVx~YjdB^b{K}^ZUCpoj6BqWf zyntuI9v9M_#)LMZBjwcryb@Xn zcr^a5;mI8#XwlLt)=4z=wY7Hq&oYnx3K8PjJllo%W#Q;kXjYazdijs>Mg*@mpBTvz z{F_uZ9JFN+7ku4s_UZ9h(cf5ag0^??NixGE(0Gedg4n9KhFhkZEduCI3?wg^B0(a< zmCG`c>+V*c@J8R-BV9?YJV!Uf_y`C`m*Ys@-c~EPGPGVDj%};ut1~^cO(c>l?lKQG zG*|u!Rr^`^Z$`ZE=YwGI-NlrPcMQ{8d`Gp@%<*4Ew(i*?)dh@lTHFSg&CR?@NZiF< zXD7$0p74xjlFaE&T*~ov=Bc>*yUDvZWo^kJ{SyV)ma6^f(eX z5vXs7e-2ZSZw1VTq*7_&MZ-qV!(yXuTtYNx= zx2(E;t#5s6s66&8(7_tqtanAVIczT4>HS~AzXpG7f7qA7EAamS!hQ$wx5KZ7?EWCv zyguF`pTmD0JQohXcXefZ;)@Md^S~>wCxc|yZtr2b)31C}tLT0kH!N7=*JU=4ppRqsfz2-fucmqP$V7F|n-|(Jk#ZzzZ6_(drval+k zs>tlHqJmQ?P<%@LvVUvc86_)c;Y}TjAKs4(>yxmP3a{nj`rA&PIJ~skB)W8P zIcJs3uMxOUj`eTbzxKwwo^?MM;L@-%_PS?-yf(2Z%WVlJqv4sRiKZm1Z6({JuPp5U z05}fcTa#s6VNwv58omZJQj3b3dRfNpI%@i@uGjc&bB{OTP8_36&b+bpD%8BBsZOK2 ze6Lv6scp2hc5i(Q?MwDg{jT)*m}*}PW)LPw5%_~emL^rpkC|>GjJ69%(#Wcao@2Wt zD{(EqEobmM_Jz@>RFlB=I&HypXx8(^dTp6Wl(~y+Hh0#~E6IrE5tzx45WGK}iG|`X z+Sm52)CS9+jJ_p}e8S3Yw9N{|A}7lvBU@-Oq;Z$o(l!LLx+!SZSiEOc`2G7qT<=?- zj9xIf^9cqvOJ|F5Mg$nwPhi2-LgRQO0IB8VL_YfqmT{b^s8z3loD#S0)kQ6%*4-7; z+V1zU`7Uk692M;wmJc$iE^cd16x3hCzcpoh^?G)@*56y-{2~3QH2WDfUlD6Q8q#f6 z1(nXJ;(a#seV>?_g|N4s=Vt%_Ez)Lq*%mb^mL6+yqx@2eCzfxCJ_wBh!pZhe4p{49 z8PZ2rf=jy?#7z@yqr`f}%1b;ee9~nM8>UJ-q>pv5`VX0ZlRhHJ~VHsdqe7JX| zowTa2x-y}dCO~BYgR^oFUHH=A{I_?PE)X5l>Y9WM$q4N6-P9C&!A@T@54PW!q;CN{wa8uTlmqg_>aW5zYp}y8X={4F5bga zu$Em3bLc)Q}Zj~vIs-xT!^4cX|bZJ$W+ z{{V^Zj-4m=ysZS#+3EMPt$~f@4%fHVI&rmzdxe^5+}uYb_+xUMOQ@AO`!^R0%F(6n zS}JtoR+K%gJ*1M8Y5xE&$loL546iJOSY{bLOjM-`iZbSPlADrr=PW)VqM=q4sNOEl z`m~ajne}y-!^FSRCI0|~SK=?kD75I2eE8eJ5#2;f2<^l-ccxn_TXXieg>EFc5n9C(?>ZF=!V8PhC3(M7}y3>J*B zD$5k7P>WPqA~7e4+<2G9*VhYssd(P{JLQ~+VE)*%y_PwOtc@+8kIaKlS)4B8WVY?S z!kElN0C<;KzOmDWyW?*f>Y8Pf7$SMKKN9$od2YPPBVV%%Dbaivq5jGK0a)Sax7($DU%27kg|;R$rR?-G1w7Ft-nznWW zFN!=1uXxJ)$JUmD7P_&I#MfF4+_z69rNzI8=bF~b&h<}(w!Rb4m&3E%c+=s(gZxi> zf1~LZkZY30o&vnm!Ci9GPa5{Irub{a9v{-7lTVJz#5coB@l<-$tM+{tNVq{3r>6c} zcw@z09FFq;08;Qb#64QaQ&=a0PZ9WIO4PI~JF8isP|#RC{*eThj*elsTkS&XJKao| zSdN)?(X8F=o{{0-4#%ii+G^VIusW5L7hV~%YmXaTYRPIXN?GbxJ`?donl^?cy1H3m zG3i>Krnm7+_N_-vZ!-H)^RZcFIm%bW(YxgLsnU!a<#y$oQIdC4zK+S>-pbcMN8zs$ z@t9v_3OqT9_DM-zt|p|MBkn)lInsoll(f1{HLPn~`sd^Rh2zg0{B-fpjl4(jms;>V zz9qMd#1Png6t|0C@LlS7f5Z0v8NKnPrM=wNNqc85t>O2&xP_iU4b`@#C6tiC8YO)D zsOz2%zq2diy<0_|#`@K7o0=iSKiLE!MT*4}*Ufbx3@HYvUbDN%1ekpAx`Aw2ae7;T>ne z7Ef{K%%!EcfY>06$1HRC)0Er2{i6I$ulRax3tP5LLeYaoCWCcrq1$+JcsDh|i8UV& z+36l8)djT67w+}T&21)$gmTLV+2VOLd2TM6{oN(a1s0mBq~!h9l9c(R((2};e%<;1 z0Ji)#sf4ca_2^#GQKvi(A*Sw|QBYCC!uNLeUeVuMt6AW`hCT&Hccz_lPSd;*rcI|= z+?@kk*7e(cZ&6>e28&qJ?pEtpy3(W93@vr1X!B|M#CC5llXK#Gn+2Zev zt#?lFou7fc8LfY6&7^pT$C}*wjfSUdr%3BB_BG<#*_~2L2~q5}Xg(jml3iL;3zP<5 zD{|NNf$^r992zBxU-&n{Z!FT@_+R0+wWxS^OuLfe1xuN4EpDzaZg1nBXyazHy41eQ z3(VJc=w*b%H=gOg7`#d0NmV=>;g1b?KG;R9T0X5|ZD)DnoBJJR-|UwOeSdqWc~Z$F z4AA+a)6IlSERakkJJxVCxRq6kRa|1GoNZM!H*2KNkIguT!r1`7KtR9X z>c<0xp&G4DDg91ysOlw7(u##U@;7-oKVqM2?;~CK2K!6X#+{{4Xvp46-33UTJo8H> z#musXj$4~y3q)eJGg;0;%;wM%F}M&{I>M>}x!rtcH zj;9#Cy^=^&+N_gpl!&BUDu(ep9aLLp7qPOAHMdB!HMFikKtyd6$s|EoDcCWQ#u%16 zPL-dE^=&<*xv;&G(S&6a?8__#w+PRY%Ly*<<}`A%DdAN?DoWSbyf$%CnpJBj9U4ik zQnPC5H*2-B*RPl1SgdsqYU^R?C{j~S(B@J~Ejz(aTfV8u-&Fe^{c&WkaTDF>I)X@1 zTnWC!$QUA-JfunO-b1$xghW^V)AwR+`aOWPPfQgF46+Mo=~x z3oh8%m|!|P4OY=f`zEV{A%|;SS{V#c;x>&$v&4&%vmuYnNZAaiSzTLa%L=#GWXg2? zKy1RSw^!{O0y#TYRYlq`86#%Gu6L3S`egCyGXCrPIpoVS?3R7+l~pCSlx&B{FCYrL zfNZk)c-depMP1KTrL}6$mEYoB-nv@dU5?6pOGa+$g;brK9BMUnc)i^RX0*}WeAUmU zbql>S!^>`UD~}s!*E-y@*g>MMg{1h($;wNzB!3gzYcP#2-tHNb%0#rhzl-;An5S5p zd#}+ig&qmF@n?iS7x+)X+I_*-B(;zYKTh$#i+(F>6KcAiqjv_KZayBx;Mnv(0@-Uf zu_ecpp_0eUpHQAlq-mzF$xi^@YPw#v;do=Vy%Ai^;)|DtH=D_OSgcas;1LA)kXznB z%mSon?sAMWTz^u(@JsL6`{D+Xqj-Pg{+(r@UFo`wmHz;TqO{a5FJtj^8g#PRMSFjz zTOic*>#!xYyNU?!+QMattuLI{e(Yi2%Zdl z3e_zgqqi3V4~u^Y^ywFCDo+zbWVUf42~lQQlt`+nx>0b^wDHu}zu=$$0JP?{rb}!- z10=Fd41~j}{CV(A`J7B7jpDj#wHy6D2qj{#+~0kI=y zGD5L1!B9br5TVOpxKk(012TdJ+?)MdNwl^x!uIkh3JJFkH|-7ZyTo4w{8Qo2hhGpr33vy>{yOn?p1Q1G3Ur@{KNEGWEBh+Jtu(D8 z#wX$zg{<`pnXYyJ029g=QSjxapt{;#N2Xf+n@rK%>~+-`S1C4{@*fc3nSAfk=&BG?ixk zzW)G%#CS%-;%~)`0^3`@)&_~;PXWz)C9aoYpxi)HQP+jt#m&@u_nNavBeWLLC6Wt| zvdM7GBzE3xS3iid_&56|#q?{B7;2H|w>m=2ZZ#bP!`g+-rKC~3ENw55()!iz5@e2B zYg>;lY@lMx=-(9VyfJ<88uP;b2>5xW zT6|K|Wz%k(T)DsTP1G7}?{gH-pgyf<_I)MqOp;3q>DK1r()P|j?Aa_WVvfZ;p>2FQ zYik9pHn3aX*xqRxRLK%SEE3t;MJnD)EOM*rZ7ZpXWMc}%jT4RQB!$mu4}oLUY_H?c zykBv8-WSp=H8oqU8%nn=r~Rtt0BxJ?5lU4qZ(eJO9TsMJqMqt08Y0J-x$x$ox`vkW zESizltTh7iTiogQFt~Wj+}y6O7E5G@1l3s=jT|exQVKNTcY5go2Mw!!m4pnl2Wt7w4LXoZV#eb>R{Vx8e{36 zB}iUvv0q0UN@uvbSVeFcV23RX*}ysyd5lxHQ^ zSf-lhSG!(EMjweYe3uI~k>ZspxIxstI&*SRm$ZyqsZL5NH5!suTCL4r6!@Q3@s^YD z+rrw5S;uYg^TU2AvNv|xPM>RgI{2r?TEC3$uC-Yi5T#h^$@@`sx)B6GC?-Hfd2r?MNq5Q#xhryoX%e2T&_}l^4CYMt)+E+b=dq@JkB$W*B@4{ zaf_8&vgA@+uvYePgek_pe|H_%7KDFBlt;Eo<(_ZaC(8s&PGeNatUGyQWRhiM;RoFjr_&Q_6h?_4CLjQs3d^QGQmbL4&n|0T<04}2Lm*jBRt~=ILB}?*b*|J5Zvbk^xSCq zxa5w9(43B?@BvyK?Fl*vRMSwsFvHD&Hr}TL6qQl0Y@d_>g17de$?`*mgT}{gY${ z;5L)@ahx2U>w}ItJ#E$bZ>qMN^jqJ4);%0TN{u&Wn~ZL)d)aihw%4OeboV(zgUY-l zFd?i;mK$3;t;q*5fyq3$ZKMVyu{k<=EGz#22_}T(uqk_YDzV_B#iriMtfU~?`;)LB zkaD1|QU(kX^JqcySrSy751!ot3JKwug~$rP;1EH;($Rq)BGIx4+S;Rhr*iS5U$9(~ zzybz-ZU6+8;FKcW)9AlP9rW7PzS?!%;iD9)N3GgPTfE-Z{W^IWOBb7CbLEFSWk)N9 zXuz1>d+x@296^14WfTw70v%i$U$r*HJm5Y44N&&!D1xJ+$Ww*7N#^oMeu-yej#TFNuR<~<+pk3+h zq)hsil=mWgm9bm7F6`{@<&*8!k=)0}8T7p;!urRAJVj>O$+Fe-@uo{8Q_8l`Nh1BW z_f5U?Ew1!&b#9ijLPfTrZKGw^<^8l;xWSLc}a?`&u~WF~spWJ1ftH zH76#Nd75eIy4@{wrT`=yS_77wxb z!$^Qk#ywL-xoNZJ#U-`f>}?tR{F>1ukuDY?dm4w5-NnGuHBB~OEhPmmM5yb{d|mqUx4@B-6Ev%`?OnG6}3aU85|Teywdh%2DCfKF4vk^%-|XCE|ai zNgKE?G;G$#w+y94y)L(DSue9|J%8{UxVVHp*NnAK4_mWHKj9slKuu-W&4t%7>mEuhrQKFUEP+Ils%>v6)w>veIQV1Z z9hJ9-emh_49uo0{F+~lR#NP|)wncS#%xWQ%#@6-_M7sKxk)$`WHNDgk++7In?8Z@a zyh(YhcoR*vve$e8;E#wt7LqGV8&8UU41-g&vy#zeRgOE`YxId@){<6&Cb$?n$+KXzbHz>w6@%*884kBc|G^2`_ax-f2a}TIw=!vb~$L zdg}GQo^Ppmufx;W$!BTe+c|^V0HR$1UFF?y8AfD*Ww&q2oV@z7xFg_O;?a z1K8-o=EC>G?Am^#p=&YUt;Dw$(CR4m_ZPaJl<|gv(Px6{YlxsCSxb5TWd0d1$NvC` zEc5Ns^o_F4Wn*cj*%ahH?jx}=C?Jx~0!g2k5LHZkwK0jt*KNsO$`WbEO|86H@TaK%dp^2=@j zWyjsiI%V4&!>LABk>$0#h`htUjHzTO0In6?RK$8LH+b>QEM5+crE3}`NBkq9tF{wBpjyWY8bd|N;Hm!Ag z?(em%^nWqAN2A%<-*@Jczx92NKr;i%@;M<}2LK%BfIvL%zzjw+jOM0CR#K-VkT_y9 z$oWAE3m?6^f(T_KVD;N;y9qE1KpcVd#DEpaARKJZaxwu@dC3(SOII9uBafFQh6<1Y zP^uM9a!Y3+h6o+hRGW?atscFu_S3sp=MZ9IMVPJ9SFe*7jfUUcQRV-9)mesTf-j~z9INr z8Kk?n@y41}1h#tLn{{*}1cgPN9M0tmFh-T;RoJB?R9N%xeh&EY;9n3o_z7Hxn|=6IY- z7-kE>fx!fmv@JT~Y47tMvuAIpLZc~j3Px@=k&sxYk#?sghZ~3>ou*ez`ZRMH#xYlY z6{O_WmaTS1+_0?p%)TW18j|$P> zX)r7|rBe+QfgzPF?g!mn*2X0OmysBNt*djZ_-n>1_FY72+RUnUeVbT@TP&sem!L|UZtZ)n627lr;mNIAKA+XR2-d`= ziLKmdjuf)k>+y|KPj%!7qrD1mEr^YRfKA!qMsi6`4^z;^ISGnq=*7e3rVnpgN(6N1CBu)Wbetv zLc}PnqjA78T}KfBW1lQw`(#%%u?a7ADJ9pL z?Wb1-eXV=#*4MgJRqu43m-l6TZ1qakdfU6xTONeh7OuNu*DiG)2=c8wH>(*}1($0` z_VJbFK=4voykD%uTN&reiKbAw z>P|TX6#((cQx$y^N$JaG-}0od$tSzjdAqLrM-Qf!THj4IU-t8TcXsJ?cMYqn5w}aY z;EXhywXQfE0!-`+<8Dvgz{fcTm~|VuIFC%qkA^AY>h*k8c_2 zKxQw2wmcF8KZ!MBFhd=?+6BqlK`p$o3DoCu*MAs!r!jmH(c>8EJWG5Cz1Yo_eiNVle&e(m>Pd8($gNkzS%yp^DaPIAg&8BB4tEvw5R=*Mmr@*)N@LG%D}NCzKk{{WS)_U3onye#_kwf_JP znA29%%S-IN*Zj*~optN6=vq&R^u0PaS*`C*T(NN$nyfR_`G^t78%7ZdAjxhwWwle{ z2ZvGFo(*6QM(zrbQ|0+tolX=K$V4GP0H`=VMw(u*qzNo6h#-N!);3}MTTGFZk(of< zytz0ES&njBC7hPzGupz8$CC}L`@t9(C1!F##~?2x0uJl~y}YAlmoIkH?yYC~Uw@Jl zgj!qMYhCHJ^=T#M?bSU`TR#wE~P>ZA;jyGC~y_TdhCl2Bw0KsjcokBHw4j^8&@ z)fX6V`335W%AD;96EYPfWr$e$`@^n0b)&l@4XJDy1wqo-f%k~#%8!x9%y%3f4sz84 zT7ph>NU}jEc9up)2?hOy}!v>dpI?%{!(f5^0$BM ze|L}KZ-6A=_^$8*7;T?L)EPzrI8bfyGtTA%s~nI)HDvhf;oPI=@rINE=(k!vrljCD zcw0FX6SNF`xet|W2MP1BvY4E#kYw;TTZQa7AjSsXf4U0xVt({rW4g%!;v+p$3uYKR zafp?$IsysD0OWFAcpH1@yC)%5w8eNGO|PWtNaZ5N%BdvE%)>Xo~+eiGKsPg8HJTSh=9j&uEH(9n)J~ zcIoWh{%`NpKBS-9-r7BTcbnIKowjY;>E`DlXSi11fw@=!+j?Y$Rp?1$!QkYRy?}1B zi0@<`#z3uu*nk+GK_@xD8DYp3^N{}0I1$}luLA+Dws!|3d#_A#!A3~noDxu-bYv~< z;{(tMAeX2)1Yn-rH{Chp@&#(Kj@?tWnpf#-^uKM=R=1FSMQo+(s?yfJ&9$wz@;;L? zUG)25$;LM+VY?*q3T1Pa$>**+jG(>f_}%_s5_4>_-QjDDwH^JGyio`VSl4>unwT zr}x?S)7IA>32A9w&vkwDOJ!#JS$~rHK3uTC(`+)t0(VUr4aZ-bYKAN_Z~-8ISZ->h z@Jk^-@h7lkBn&iSLCata$e$_5BXK_{IXijJfv&Tzf)DoYqBzD&BLma`2GNdjkUs;+ zCQ+{IYB<;L#uVo$q!6R7R5mk!4><>n=YbC#wOZQCRHNnHFXgt~FMUB^eACtMw@%)l za(lLV^xA!dfCJ(EE9Srl?92~1ILQjR8Q>M<5OPTjX+DLfN=QB$(^!+V?DJz{a!v}X zHZpJy03`9(D_&eRy=hPUhVS|7kc-I&Xap`Xk=GqbCzF!n;w^M^*6)V{w<7?NfKcGD z+k?>b=jGdj#;a{DZTzoAXK!D*XwcRLYw)Y}vsTe-we-`^b?KTV>+_Sq^#1V#fshCP z0IZF@1H{~9vHtJV9Wrr&$j?2&1e3_l5|5kaS?D@s&49mwSJGT`$1avD&n1R(O{BIX3;7X|&mfJ)GEUL*obWq(2c&=u@&U^Xs2R%gdH?}l z`Nj@$pP1NL0T>*RM@*F}mmH zIRyREyLcG`3RDBNe~1E47#wA$*4}_$7xriBGcuxqM7z!(HgU;#sw zEy9pVP(Ui9ocTLv`sX(ww1+(zTHlWlGM8o-!*W3I*r%%WclO2iz#5AL;6zkeM<;IkIV2ONYD+&2;! zRY1-eVw8pXg5Ygaoxzp)1fINQnbKN7Fiq4dcBvuVH?X$J? zNnL5Z+tqYk7Mfp0?BitGOKa;W?AD(WeXY~+I*9b&2+fZt$5Gp3c0SwTy=E+r-VBin z++eU(`9UPJjqG-_8>!)K9#RZn7JMHVCy_mlyKcY?kXYPVpaAv2-f+Q2K4LhXj`$65 zfMWnHtYmZFafk!T@Ie_k!R}#e2%kB=lWtoe*}~-Ug*-7mM;HSD@(56Ab4tl>^joOC zlC_ghOFcC7xZO2vId`(Nn(UI+TQs!OtJdeFj|0Z*`>%=r01wz>{#xAXh)E>!LfN(k z;4sH`CnS{w(*FR$xVdqZ_>J)1KnDt%rTV!%@C5o|47OE($Y$IyK-|mbLr2nx8S`1O zfJ6c^2qYcMPh4XI3;{R??`CDvEQ0)vbfJe;SU}HGaKPg{^f_KK*)*K4wMjc$M&E7j zmj3`h%zTm3`u-iew)fi4eeI#>C*gmHLbs7Wg(e^t0@ubGabu0&I*INgBoevC!H{x6 zz+(gaGx5R`vqEj3wA=60N7A)WK5Kit4Di-6fE$yA%A*nq-HdGj@z-&0_Fk#b!zkwjeUeOadB_>a z$Okwaj0}^C)n68P*-lf&`oi`AExrdVPBQ=}h9!v{;NX*kQx6w-_np2w*15JK{BJasRWn^=XYb4=m$*CvufJ6 zqupBDExEd1s2FI z-my71SkF+(fRmgQW0vZ8Q}>AD2RN>g{vdoq8;|@aSB-&>p3_Z~6(#y_wkJP1&KGt` z$iT>fz9sxZ0FU@hB4O7OXj)4X%aM}WF+7)H)C?Z|g$Z8T?wi|ZXS14qug!ynmG7&1 z>E@S7G@hC-&!#BUZIB#Xo(4E@xL|n)aU`$=j-j*5WE>Pa^bz2Fq0f97P-Bik+7Cg< z$5W47S4h7UyndZ!&?P_KeG5T$ZZVPumY`=PfCDFRJwmlxPmI1kjILquyKUeD;oTue z00Iw}VylzCBPtY}kO))@)}EVs_1@h*Qr7#oZzQQMm$#x_p0|>EJ)P`wZQ@M#e=jqO)sRzn{%{95?(Vc7zYJTQNI8CR>Lwo=Lz( zMH_hsE!6ip$VKrUure*oF^=0>-*<4_$r};XumQ(kPJ6ZZ$29XhBuX*5kX zQZieUw$L18ameHb<*}KU<1(By{{RfW8Hp7A*?cIjtS~?<@U%n{tU?@Z!OjRpWy9-w z+RZ=k+p_yg`{}Fl^&cv?%c@CQ*7#rR_nvDex35dZ#r4_(26kOW0bBxpSdu*C;|NK> z&N4As(z;B=t}f?x;QY#EV18mq-9KHRagL;ql-H~ui<)sK%=iKDsh4YQAozklzGw}L zZEoF20frCpZQq=n)UWYd!t$x}e`lYDiJq+vq2q|ye9i#eJV?MERYr0MQggJBsp5II zgx^cq+Wzm7(RN*)z01XG%}(meR@+->x3bgM(dc-&o*)nIkvZzch$Ia2`<2*9<2#Cy zPap!t>vb3$NE0AsQ3lhHat=;#56Vv+cq9N1vcJSnhqnZapV{NX7V3NHzA^EQso|Vw z_t&>L1LYYx&Ku^zA!A<{{0@+YzW5iZhR-I$;)jSJ1abfZ<4d~?Mpv_B5=PvvF;rzc z`>k!O-r7Iz*n)69O_5!0C~TW2pVFU#hy_w94V#QVPOoM;O0TIo3?<8}(80K>T< zMsf)_%eUMe-!-5e!%n#cMmC+ZG1>_{1ONen+jqUk;;-4dPzC=0!apCzFhNT{iteB< zKr=Um%d-aR#z4#l-XAP2uCen6Lx0IFM-Ilf-aTMOJqF!3tqO(?yPW`R2)8_#+AmL|4IOGZ68C;SIxK#nZ zY-E$pNf`vZO2pzVL027i!32uD9&jC-E5XQK26@QA`bjlE*s@Rs$AW%2!f?Ts-^M;4 zE8k#4Hj47+b~4QD%nkqyL)CzPV7WP)!#}iQvH7sRCGfMU;N)hx zzN))#{pm)}OYMFC0M7cd79tCIJ(t_Z@o=EK|I_!9e>qG30{YUC4tD=aHAWugVMgEZ8!D~ zmp)&`pV~z*q^imAlfi7HhLi-~AB=&?3lS_+1Uo6@ZmTi)WA+u8ksro?kCC|}V4L9o z0EV`onqh(=@q;q%+ZI3%lH>rp3azL@S|<8GhD)~l{PgPWZQFHfD|@LV^yY9^_;yZf zzRg><=gL3mTrZskY z@o+45sk-=OXBg+G!}y{mI932E<%vdR90jbM3+$x!ZqbtMwe(BNXLqf)##Lms(WQH( zI&!o3bmdaN$=xkGqvSG{hwe<{JwJakWS)Dd11cB-Yb|h|6 z11UJ^{np6pFmYd5AAp~;e5wV%?I|=&=L669d2-~IMrA6nYO?OzoDw7elyCvg;f;0s zKYSNYn$z}zx|}h}mH1(D!HcQJ(EccZfw27Llnjg#2&SoW-bu+>{{SmiyIoSc>1)2W z>S6WzEvUJ|@0B#1Zm#2d*`@cbJyG)x84~i zB9Zk5V~c%O<`JG2YbBfv4E_0FEE^>MOCz#ix8W z*(hYdD(yo80Y5%WM>!(0ALBuJi^$8?s6_uB|!_hRO4m|DiH>H0K|g5OL7HmwwYwC z2%32Yar?g~?&Jb+tk~dWVBnG%k_|{~Y?W8$x;Z&H2v~E*arqpB^8x{2T8Bzfce}E- z*H=o~E8nKN>*c9VOIy8`--W-gp7$`%+YkJ_PDTjM_Z$E|Pyhgh0Dlo4n86|2Z%#jd zG2?IEn;$U*mBNPU!6XcGf=35%X?CA4Hw3l_`D4k*$p`0Al2`aiz$LQVK&jJ8v*AgX zl0o~p!3U05@BqgFiEQ9-DSHRezrS9Wd)oGQwXfJpqFT4AZ>Qm-YTMf1@Jt7{y=hFb?l1c4z2#_rssIPGO?yWgvBcRi?_+q$|mX+V^hILKrBeE)f^!6$#IN4oj?_}IxyU*`Qw%WS2p%k~+ z<#-H!D-j4MCCxOsBA+zUan-0L2Cu)rQcrsyVR)zZtkHBWJllLL@WuDUZCc-Q-26oN zk!fe)e+JvgrJ6asJK&24w$!y49u*9~+q#?#Wr;2>v^$H-l4JQh#$GY_jqx`1^}~$rn!1E!sH*alr+Zl20RpZptPr48G~$FWB?qFN*Fo zo83qI8^bHE&fj9yd`Q;%_N8$iW`b*r4+-fa>qClLWU;&R>rYBx5zM}%}Zff5<@ zJ!?^sA-TFz+oFoz;t87J65CJnT0^JH-s%1c@Xn7q-LHrw_=l*%uN=C?)|+#rcrpuw zX9gV=ZzHq4)mq*E0MyAO8f+^$Dz;H7GhFWIQ$wV9rXLV$UK!B-AVp|kkPN#}dJR+b5EYg)DMiTqD{;!R;R_??~oL9qitexX^X5P2z z?6lDyOt2ECMk&Q}`%S&%lyvvrsxCLu)^cyL*?cCpOD_~@a7GdS+pFrRtOBG(*27VZ zJZPj1nV67)BRd!<`AJx~9};ZT{A=+F>DaH@d|#=B2*tNF7gMB}OvRN`fTPO;3Kd7n zK=n_B(2?UGhj~-}lc?)A55d~Ow3+8!q$8g&`3!c3jDR<1Y4WSa=5ceW_=4qFfpy|< z5=?MeM%C3WR00Sfk%9{0P6G@-Q_)UQ_Ki30sHL}8_iMJ@l07_hJ)T8}YBrLuWi69R zD)zcheOmLf)UPg@NC3b>PD5q=9zi}qxt9mWpcJ=F` zFm)(i!BI5=no&WYE?b!9xXA^u_R$uVcjI_xiBxV-*%@Z4A{QWCTHD;-Tf*Q;aER8n z>PaM-SgODSFkri!F<-twVUG918fS$K-k>#2cGJUf$7W?o{{XP>bvv7jhG1IC(pz~8 zK{Km?_KUf#qVo`swLtC+on`im@XF`II*r+nb0LVJ2TKPRT|p9Y<#rsj01Pt9E-|Sm|zwb=g?? zsN__q`}JCKrlmC*sPd;MxM-KOPTdufzUP!DkvuZN1=%KH3WAzmtGje_3Bh32tT*kC zD$4An$@jp)t1#PrsV-D%P)RPG4YVl?x=qlU>O1SVjD>M*>6<&LB1UWGjACT+im-KV z?i?@mI$dnoN^D(28pvMSKC_v#4tGM-bC3{7l9hY2L}) z`Sl{(QkJPdi7P88Im@%!GH-jN^iN0iIW|PIhb%Q3jZT#$^^1#IMMn3o?%dkw@AyBH zf3Wo~GhrA6mC3n<7-uc>86{8`enOsu=OFyVnWNHmagCNRvV)ViP}30zQrp)raGGvNUIS zb>H(>srV|^IkegCqa|}Tq?lN3wA z-G`SBpQ%T38di%v3}W(f;zWJ&D@En+EUoCD6{gf6_=m3EX>5_fyGW2N)~gwfW;!mD z4Z;y~Z)*Jcy>_N`YtE zN{e}BTsQ>nF44Y1@}RRJBw?|WT^6OUc%xsiwbAu26KXn*y_s(KJ}hl%krl zYgnypn{6wYpke`VRFa}4y3%HMiJM4~kQE5`K3x9*Ap;JD%Wfos0Yt&zjDSy1cpYMR zKzuYVxj;tVg-P54DQts;7#TPya>L0kG{uTnV!OjLu@a&X#jvL>8ssqqAN7M7C+6U{ zE;g^RP~}OzZ}>jFzIWGKqZuw;Ep@HaOGRa7wz}(Y!%ck&Ahj7INYhyJ_jMOePVK~y z-~h$Q<8E`=Mrr>5XR|mbNwnbi)viV`Ndq2f>7ToRFaTaNURnL0VoCo1i5;GHl1R9` zQVt~RwqcH-3=9LDf(XQ-#?Ki3!nO)|1#Yi6++62AcfL6z80RF{lMHg^w<>qh>*=rX z?dq?lo1C+Xl6u?EwcK{mTdlnG(@Xl7lWY!uvTR3R`HN0YIUxMc)Z}xI;latsW68BA z{y`QTe|uJN04LCs(DQ@+)1LYAQ=@4oriX2US0BH>>T}Tjtxs{m0CC27r2fRx2q*gr z*ML|PCHTkQ`9L>pGtW;|-N6_;dsgjao$UA7-G9@+H?MOgK|SBDjrCnzms{%g(Dnef zfMn@9XasV9wBJ2X7z{rgFJsTjX~8WUrj4b(4eB# zo(*V6@aE0Jv6|qVj1zeS5uA>U;E*=4E#Gd?N#N+Q%|$NOy1KX7+ueG0eff5?vQ*cS zv;I`yOZC>?yWg(wcyISnq+w)6qnh%jBWY(6^{J*{V_upoA&8R>LKWa$u z6_}5+Fu}(GnPVfqKp4Ork&@81vu1<_zCw7Cx>+Szt&w&NB2$K1fIT!IXqwm{vZH60+nX& z_14d?lkKLXs4^(s+Vb1Z05O#!1>2bc=!j2b5LF z87+#0>zW)`Sugcjxn0qv$c-DZJV;0ihF94zpHM^U0&Oz=ywaO_)Px*snGRM_|Ej!B>9eWk+RvyP)dbd1nEWyuTP*6X#Nmfp!X*4BQfY`X3I2NC>3@hl1zenVocpmi!9B7l+I%BVjp7G^uk zo5niAf`0UCdPe)@(CruRop&byq#MB00nS^!WM*(+WR&$#CGyZ+-^JpwN&5^ z3lsAKK<6sn5wTvHwxCoHPHaSRobJiq^R^B#$y|_k0(P(h#!1vyyQe06K!-Iv~JeK+j-FcKgjB)wEzaNe6HB z7{NP;W!ggxxWFd>1NX8y;f|edK*C%c;5Gm%6y)`7oGT0y%Jl${GfFINS2;3{267@@ zxZT?&x(t;dk_JG|D%K@8Zdm%;N3*uS@Yh!APu1ZaZ*Q7U?7h-{y*KEU&dcro8k6rr z4hP*a$b{qXDHsY=sn5uF0m}d}nFO8`W*_MB24FccNynMc9jc_284N)jt`V4p4aY@b z(-H(g3<3`KjC{p_`J60ZmR#=0`l-RK$UHYQf?48F82UZ|5QnIU%agQ1G*+C^c$MFm1!12QmNtdR*(h8u8K4Bp}Ji{T!t;@=cmX;!vx ze|L3rX9ca6n*&|kTwL8;!D|F-6eagF%`7m$rATSyLP{Vq2P)LC(Qa-rj8biE)wR8y z^wn8@hrPqOZYMs+Ve)(}7do{nLMf=bq})~Aw7N^t>%PaV{>VSFFOI)y{{V}cH^OfU z=&;*wk{w^iekPVHX>B|&;PrKy^7xsUS}n)e%3A2QqDGTe)-ND{6h*p{*ZW=g8~ZAL z%|8Hs8R;JmJOl8l*7WBcmXdxd!}k<_H9w)%y(4>87Z9IKZNDGW9+1OkW9fnSC3 zR}%jKXkzNpqgGMF(tNQ{oZ#mqqMb=C^>%RTqMg#aKhlp3JRidFmQ6}{yfr$Q{7pDY zw5n5trA96>wFuO3c4@ZdB<(pZVze@$_;2v0OWSQbS@17{H5jIn+*(V0;Ee-OZz?yD zAXC3dpARjwNF1}p9Ev4Tf{3;JV}8$nvk!%SA^zFgFTx*)G0%PA9X0+m>M`iBJS+X8 zz7Ej5PkW-+$WX^|3f=1V8Zo(*8aW!;CRqHrC6$Nvt)s^qYI=2;VREqQ5Nz`VfQbIn z=7f!~hjJW*UICFtRFD+^04+bUN1cEF00kJlS#2VkC_Fd&LeCcI7T0Ttb-5l%6|Liu z_Ds=)0hz?8k~YI_F?{$(F{y^Z=W>Nwk#2%~&TX|XWme9cZ{3n^Hg?tC_IjN>X~6kr zW1D0ut`>`wadgv%vVw%;?J2gZMMGFP#k)Rbb=j-^vGK$9Ed7?eA^SG?>TeBv67W`) zt7$q0u42_}G&v5rZFJgJp!13K3+QFO)F6gew);Gc&2W-hKbbU&UG3NY2p16W=j@&P zM)-ON#k$#k)Vi(0+QBh|LH4hPUk|eiTFOMRE1NTwkql*(VTMUOx!Hcz{iSTvQ}_e% zrS12#Tl_rMW)aD2B(XSxHocnRB9cEUITBk~)+P}%Gl^k^qe&5~;lKDIJo8%oGX1Rl zH!OxotUf&WKKM%_!06L!Uk_T|NnU7@BQiSZk%H{ZU&|6JEY}lDCmvyrsb3(>`KnZ@ zC0>KITC=Gn?@c!zce}o=Th`}X_*Vgh;vAxM@U$s%QLhO58Z_y*cqPjx7{^4Cw=lH^7MAGl3wQ{{UCjY|i8;Q_Tx}!OBMARh1qfOB((7 z)SMktUBNgSwb2`KkR-a5i-W@^OJt1UwvbgD0>2Kw;HXvt_uyZ_yF!kU>L0cL0PM+O zB!wSpy#7D5h?NNc06300mvRO32bl_hgs4BY`jy_>?NhTpqb3;gP9<@HjzjLjAb<*C zfeJBSl5quDRLihXmZ}c4mD1i*UpKX{^q@sXbdub;$Qy zdZT{Tm2r~8o(4G#!;(iQjN@`;i5z^2yLt$2glamd#&O6eC$1E>2II*X#z;5=1BHV3 zo>-HUoRHY$gPsO>&mfWtwgIgaxn{u1u_GfOH#y@Y2R(Qoa&dwN0Q~-Rt#+51)3R4> zFT<{znbyKd^u7DtEn2<2{d(*5q$Qx zq^{Inm+5VneQ)P`Z0&pL!7LQzrz^i^ywZCwMXvg6b>Y#6EC;qp<0r2^pmjWh!33N* zvSGKZ#dUAVU zfu4W?gPs=(o_6@UJKoxQOD*a5-Gsy2g-RX$Q^k(2OPEl$vsX6c{S9Jt`7t&b^a01fu6+R_8*J? z0JKRxN2W=}-n{+Nc^&bLoc76uLRwlcy0y2`{{VKX>ihMv$naG!tZw};eYgIvs`>QN zOr+--0DPyo^}!?8l0$Rf0Dx+j$qEaQ3CP{FGLWO!92|~-f=M~Y9QWJua!Ai4000=q zPJU3Qu>hQcbI9uTy~*5JK;x!;@W(vy!NDDYJT+V>$uzli(YDp!+1lw@Cu_Za_9cU< zX1R6rYpS-(rSy0FQL1E>;blvAv|JP|JJPWX)4=zWymMQ}IX3qMBvG%!QrxAEoq40Ck)&JOnInN>f(fJf6%ycx)uxsvMV=g# zW|W{+a3f;G`={*sEf2+S0z(`s5xiAqh>D(MD7N-@R}uXAGOph(wBht+RJdcRbHT+Z6tLE05KWkpu=Yz8H!O{{TCA-JKjyaKjBE{KKdKoZ#>> z02prPs*DlN;@gXVGx*SwK`Z5g2pG;XTOE$zI`M|i1`}Ue3M(d5^ags5dl4%Q;9OoP_B=*lj8O~=oEV7`YGyiK;-qw&2JxQ^>UVtX?M}a-#u5I?dE4HQl{<8tGAx^wXC(< zYpYxCxYA^FE7J#_Nc0?Jk%j0+-g<)70bmL0LHEHKIRxRdcXT-bWDFmesjOr?fq{d_ z+s|D3ai0A>GoAzt{N#<<;~?WB9Po44bIITg06OVPy=XgLNi7z=y7jio-5JoRa_cK< zuX``<@8_cG_S*Kopp6#SX*ntZ9hiRbfr2)b?c1Dk4(-D?S<>yV^ts@k2E96S zETY{UJ8U$|y*o{ZX^Ps`2+O1V>*C+|BG19AnMrStpB40+Aqw6k_%Y$X9ytX{GqvA= zqtIEGS`fZmaemMlko@a!_E#ChM>pQu+jkHYj1|r@pe|Go?^I8z-owI` zoe2Q#DzYigNdS`>BP3x6`-!)`^*@;}+F$+%?eM$dFTszCUl=r>+ET+< zzVJVR^^X?Xcyjypbn%CVZ}nTf3c^WkG`QqGDZl>Bz0_LX8$`Of(WFRHR-NruB4$5< zjp6%AY;^g}m5uGgM(*!2Nn~UaO86$-VkKAvQP3+YE;^YH_f7kD>hJ#m40HQRpw*^Z zfA~{gJd#KoPmNF&(dTt$m2F{|7^G1usye)^i?N(xTljXmF)2x+o;F5V6A{VtD=e&8 zL~dodK1w-IK13MGENdpw{Yl|p6z3V{2NyiY6;}~fo+dG-?M~5(r%kxtohVszHrskX zMX%<(ZNj)rJn++_OO{nB)pZ=>MlMY{c6O(Q!$U=Trl$3N`&LVlJ|EGe&zGZE^YWH# zwgUN#86@0{SwjGFpD70!0GexQT0(+{L(|+i%8iUUR$zYYybQU{&NprZ3;?_3hVoYY z{J`asF73M**s-u+co^1c56PQ1a<{5qf!;oT|J<7sGa zHh@+3g$r>QEW6n93gNPH0b(6LKyA73_KZ|EK$g-;2qlc4^3vhKY!I!L2%vJT3kubd zEfjHgD+VN&TNYAPk@kfe%W%gS0BNH;SCDZmC6^;<8`r9U zcHj{U4~diaB=WS)I?2-NWz}JtM7oj@-q<8tvK>J&`7S||?f(GyCq0#nzqVJwTQ3l$ zo~>al-xI779ZuTcSht>QpM#!0xK&$dp?h<6EzOKdWR@tOV0LUgaXb7*(Z_Qg_Y!=G|W<)DC#yO0!ib(?q%YE1X00i8$7eBTqz*}2bg~ZWozY*>N zv~ok1{{V$S@fKEi$RPoU7JQjwGDr}~lBkE5J%nM9=5w66SJbPiHE8mwQ`M;}BVm@>YA>_Y?jKH*cg{e#3vX-kT1Q zVfK4ZhOhw#*kMRx{?75|hc#;@a+YeT6_%!!cTgz|*4LKC>PLvd=cmJ;@JL&0{R)5E zQqJBlvD(G^Lug-UT{2sHNTr(R;kKgk+T6^^2b~h8qnQvw<`Z{uXnq*!>SOX+;vwgF*TJ@hRwcBV=Rq{_!r6G`k>Q)mWRgW?_~ZTwnGn4 zC4FIQtE>9m{6qf$1y9s8SU+p88tGmx)a0<#@^QN z!a5G8Wdz!Nz?JmtDa;Z`mOzV}G?@$duf;FgW8qK49}M`nK+yD068O%{Givsc_>g#_-ll zSL+oisNv%%t7-3Y-qXBVx{j@LE9}*hKMdlG#-dsgXStJE@VCPcgdYN|i>xc*&xSq`@gAjX0nC!jx~{R}y$t@>St3SmO-UUb#Gy684^rG z99L05jtG`Xf;pq9X}JCUW@Ef$suf;#PlcW$k04y=hmxcXP|WJZ30#Dg$v9Tp&Hz;ejmL1J z<3-VvJ2d!|k-39I8zPaG%8?9@z$I6Wrv!#&!4%U+(mrA=A{%hziznI$Boz5d0uZ?Q zHjqi+{Jc~t&YhfKmv7!Z(n;vy(_3iu>23a38I>r_)TbLQFKJs(cYD)Od$ju|B>w;p zE@E)Ac#}@~HhhU_;O=e2jq*4FlM%5{N@Ro*6(rTGPYPSxpDDFgJI>w7WoHm9+k-A< zowqxJyGh(twt#%a+R1OHL+7#!G=3Njw$Y?xXlBS9Ns^@J_nBeW9B%2f4K_*j7}a#> zHX#L!!YE_fptk&x8nBNW#$ConcHm_8M-e#1w&b0XY06D$%KFC2@2!>A{hoMSEM-;@ zl`E-9M)#X{y1ngY_uFOZX6g?I=}Lgy&vwnbc-+wJQ@3b2^59{T$(B|DHk_OS<2^ht z;d^-pmuYi50fJesWQ>*xoy#5e_c(U|1;`2*CZjqu^9BKOu|9Vb^2Qr!=jU!zx?BB6%pr9p zXJlyAmK!pN%t|XG8%bG-$z{n@Ewxrez*WU#u@ii)&fD3^+UZ4Zr*5Bhv}dzN2a-aR zB(T(E;VzV@H1Epxz0%iRbZ@Uo^#1?~cw*mBmg#&sr#y?N-ppODHG_mUvY~hTKCu)3 z0IPQmA_i!Sv#TV9LH@$OVxJOf{s8@(eiZ0dUk1E-*6?^%!tOmzElWu{P3*d?@?X5R zuXU+UacpLq{C}g}%(KHBY_GjkODFN_2C){CuWGSsntDqPojS&oSlE_l@-DC7Xq^ z4B6V{b^vzpdgsJX7wM@i!{DF9YqkvI8g{eb8HsYtfrvgbh_eFj zrOgDNx}K7#uYQ`{U36#h*Z%+oA^4qX<8O){7}PGj8{>}vYCawC_Ni+Wemb_(d^K}* z9;0~cB({$)_Jo&~u8kT=_H!&3F~Q`K8$63AfACs+{UgM`9K024b@3ZV@XT7*!&^%@vSi-(Guh5tO01vzi0^LWWTWT#NHs;*n;JFQamwWWC9#C{mGztgm9gA5mF@U&Cu_BUzs6h(5=*-8xZ z6DRu6#Y?*B0+@PLfL{~QUR+C8a`Lg+j3EAYx zQde#ld|v3*#_9`?w(}pH?99Oc!ie_>r7IRP&dIp~CQOne5G#SYxZi6t$2F@XtY}c& zw6d7P2N*^&>@o&Hn2{I-8yG9FJrcZ?l)c84l%9T=)s&tyP zc_lbmD>*wh^}hCQ`abyjrlE7M-L2j9#hFzi{q&bJjjFt&o4F>LQS#1LG63%+fxci& za3XC~LKgw{g;xp`Gj}e9PB|Np^N`p$%w((E?MTE*NJVHvLZOC0QV4Pe6rpB!jFNVq zcT=sApvx8@z7dqNmD~#hff|Nxr*J2n=Wz#|-!{obE2jB(wu<{~y)NGOTAvS&Uedd% zE@?L;e0K(iw&m^hq$0rBoz~F*10mxI(0t*;>_9O+v{rrTcD(c0H*{Jl|6)SPg=`f_+91cCR6#{_YlnvCEKV;^`N zbvOf@jiIrTp11@a^)Vi#{m^lrn;i56u6V)Exj6vy2|3_ng4xdp0AnYn3C?rwKD3Nh z>&>s0t6txp+iZ8f68`{@MyvOL7uF>1Bst6zs8Xbnf>)3+l5z6`k;(XwpZH02j<{JY z2ptF`O|rpY0+I$f;{%+s=Oe1{an6;l0KkQxPI6nI!MhnJAb>zPJZA)q1G>3S5C;DM zgo{~XQ--o51dp5hKHHVXGTacD7~CL7*NBtI9YQx;;gN^lv3NJ`aL&8*%NK+ z{PF~MY=?cV`?+#RV7%ZAI-n;x8QcK!K$fdza$Yi6$7-skc?pTye3=#?tf!CysULl} z5DJ`noNWX)_kKy0u>o)R_m(ziEpUaFHVSg(vI@pVPC*&tim=c;W2$J()><~JG*W$y zQIgF9Oszac6$2^u*!C7lnqxUtEG0(Q zGgff-l4-Vvn!hvcB-%;+y_9_yQ}zn#CihfRfkWAvL;e3OGBRJLnAt~ zL2GjNgXAPL#}QRKRh?fs!&ipjpEZg(Ad<+&Gle^F@$Zn3qoSA?w_d&ZRUbYYiZ)+2u6_kO~}v80E_|w=_Ij(f}jEp82#26;hyGLhy-UN+8 ztnL;UmQ~g+?=2&TP1Ur`X4+MTJ53`{veT!#@g2h4&o$dx-P>MjHd=ez#Ufm$ov3Qj zeYFd=jCJ(3D;La`8lJzTYPx5LZ1qXw@g|8pbLdyPVHy+oc3XK5k#%c(qj9(MHLt_=S)~#VSpy%w;=*Pp}718v)ZKb%5XmzPC^o=u0yopILqBlD5kFU zYU#_BIX8PbH5H}rr!m!P78*^{qsifaAh(pS_F<(y-Mb8tffT zJc$u9&5Z345^$`?Xdt%)yCy4?pTgcyA7{8KF|=-XW(rFT<6^M^^T7nE2XW1JGk8zM zu1UK1jU%q+`9_Gc0N;0VsGU^qZKHCH%rlh(f=%ID*w+($M89TZf`dRnvI6b2EBWlm zNFb@f01^s~xLjp}Q)=|weAKC@venwBO;xqNzGqBow{PCvJuIA_x@)XkzPn#fzTRg( zlXJWUxwj!cTo~{{0ZAtSlid2_Zdi^gb7624BTsBPsVbsQd5};ja9iINHc5(91?btFhC)WcO2F5>AG^F=aNCh&Zs_MKm?WGfUHN| zQU*R!dBNaXSGA=70KByLcd~7K+uzXZr&%>^T5Uab?dt6Qch^qY7Eg$L*B}*8q;*#E zn+3rKZ##Zs*umOI1RCaV?taxXV+8>`kT6)1cqagWNC2L=$;TC~s~@mt)d?W{jPZwY zgk?Y($T;4>whsU{5HR_x1)|uY@}Zj<3zlG8f(YE*Iu#rcPDvHXRxT@-OGl@gw|l;; zTYUC9p>9>(EqZTfvu*4D01c+~NEkgh0AnEZ2d+*qexP6wa&ReydW;fz7$gIdGC0cT z0~qPs2O||OeS3^@IunpOo_QQ+jEo-JQzIDU0iDoS!sG7zq=KY!08m)`+~Zierk^vq^VKJ9HGNV_&&$r! z%Aa+oPnMh6ZP9L!$m3X;1d+xzov6(bEsW(#uqebx8A=$PK_?@S*X^}EUdB-*SFFr7 z;zoI1P!UQYNsy$GlrBbDn`y$bl{K7Tg@)kA04_$-jKg*~-T_h=9)Lea!vRE*8Dk2K zg&|ix*?v&KCRJP}e)9}A17wl_?x$XA$w}!Q9A$0obk*%=Wp}rI$o4TwyC&YM{_=XQ z-uFt~pKBjP_+#STj0PPW$9hzE_YA8FYjIq)z3Qxq8^&(rw(~7!0m46=i4$#Q4YgMl z>(bcimzK$JEHv$FO}JpO%0`{2NU?7DTwL5kD$L$%IZ$>f*|CI0-z7Eo^bV+py zuP$dkY^ym`@VZrW zqe$LdqB0R5%uuY8m|(apO01}<7=LFEUZRY7layLc*S({oz4@Dyzu(m^oYiSUSLM;# z(XvZLYhKF!j$MBbbi44^gszl{{6D1X02ERq(@uwU2_$6PTCT@n>^Cy`E0uP@h=~qM z{4(%$(|M65z2WA=Hp@GR^+<3s2nff{{sJ=iMkRq@5ft-UU&a{lBk>J|=ZD-9-fo`^ zI;Nk$8wq?WT|k5=W!P>RHwWEovTtg5c2`y;q0_^~x5Qbcg;iP@X0h=wks<+y-_dh8ri0_19l0lfb&d1C37DoPoMqiKAn=fDS>^&}0#nOb{|~?sD%z{3GHe!2ZzEvBm_~ ztU+KL07RDm04q5A#Gnk_IQeVWrIsvb?Q#$a+qY)c!2o12Q-i<*W?LJuK-_ZWytiG$ z&MZgX3luWsa(O6AXA6u0#&9rK6sLkwwVkhP>*;mAmwGMR*Ii8(F~w@NzW#b?w*GqW zeRMq8{2k+1@MT>c!3P38S58(ReB|MvetBR>0D?%)er)-?J>tlI{+neW1On@2P2||INj8PSvMC@{{YK90f;B% zk*8sfNjL;BV7zqcj1|YrTrlrF}Z{D`|eKTd$gFdUZy$WVFANOPbqS@5_BZElyDBn!(Qz zrf|UQx%J4wbp+#XcOEb@azQ3U(>0PXvYg>?H%JCa;GBXv1EKCXJXZ5*z9R252u9L# zI^!%(GlV$KFvB1&5AkHsG`)Sm2JX~uz{r|x=PZ8i&7CuV3E_EcoDO+mI;hEL^}UwM z?7cPJ`C8suDv`6Kl1S8|2c}gQKQ3@`K43>1KmcQ*9Zn96x~XaX?=nz z`&#c+^ClJ^D^42sNIVi*&tGJeYSSDlHcdt*%n?eW0B#_DYpFCi&?bEA2G-R zT4PIgU<9if3EAc4m`1D-R+Yom8>diK7qJ85sQ z*W+zcS~Yg%uuKk9^C;?5GX%s@a5ZcoEs)@;sgcqj3AJ3GDBl5OMKa? z?AD4&yYQZ)xB_=Zlf#VeGPCoICb)jTzV9NeyRkS*tghQa4C z%ha90w<+3q0B3DEb=`HjY2$2z_mbG-ImiUWxDCl-Sd8GP1m>n1zM$lpQpR3#e9K!l z&p9WB86=h*VZA{l5e}xd)25P(R=vNyYh7xUt-h$;TFUQT9?7nj+t*z^Zq}|hz8R2h zw!fYxY>(b8$io)TCD17$Pb8i(ladV~vs-}1+g`Q{juvPlkdR3LhhSVB5OIKZu1Qka zTOqA3d6z=dhfMh{(SyMxkQk10kcz?A0B1X>I$oUQ{{WyAZ}w-#0KvuzjyXJX*t#y(UajOVdE^Y@J7 zMzSO3l6;KkE{B|+yplHnInFm64WNp_&~4pyeOr2~Y0=&P0H0ECqP5nqMwZ%kebUvf zPDol!{{TM;l5%kx9tr420Q#JP$ON386xqvz`{X2^g55KpnbBGR^3wYn9!zP@@8S&EQhxEtCp_>;I0Kw#1RRHN zj0OaNc*>45le>UAW77kVm^W(5-y{D36AtGiJYaxuNZo(|3y^s|NXdVe=bg%biytmV zF}JT=e<6Z1R<*UY)pgfPEt1#t>eJZ%ueP3h^|$5P*Zk1K?=L5BDtc#}l1UjSI3u9i z4i0ECXYV=5 zdmMAv_2)j-X*aTdy*huN=JpLOzW)G*-8=5PYrf^9B#VL$I$-cQ`@n(#JCuJ0M_{|M z4JX>zU><`#2Vw}$P6tLO9f@I7lg*Iv&sD|&$N&%r1D==wmdGS$B%3Q|E2@z^%# z-@G=G3lKo+3hu}wz6od9{mft2_22L%WVhS$zDOAvWf|ikbGY_AMHztEb4OX20-q+hU^}3>yd`afrElF1z(Fy3-Y*-6P$ybfCnV- zNXI2d%yJvHKrH)PPQN7o06&*~1Ha2}miqktY^-2;fw6!N++dYrMmfO@G4n9VIR}yt z7^kdkk)Vs?ZDT~iN@zcFkE1LifP zujO?{JODzeEN~YY3itpi;C~Qdw~D2BZd{|=%poev^Rr1A1qdp{9PTK?BLL)JsX4`Z zF=-_$=(XM5?Y_G%n(X=wNk!eKZo1ucwXT+ncdgNEm`U1ncThkXH!MLXAdD<(;YzR| z0$U)Algg*qAaV=Z81iw0a!DNURJ4kqFU+pQ76DG-kOgP7n#|*D+Q~&yGqOqX)BwZF z3Wqq!C#lOHm{fn*wo~(auiY~i+Ert?V0we|Gdbe}Ag)gAZgWP%it{1!H+y@^DS1*6pjUFK6|q&GdX4?`b^JTbVi@cpCkNoMgof=|uP1jqpg1x88vbI3cZPA?7kWtbD; zoj82od;Ss|lYyBzz`OvAE_lHuMgTk&%cjfkmG_VRI^TC|+jV^cSfsX1`l~mjcK7VJ z(%sgYoLAVjL-%yGJRD;3+Z-)6MqLdz$|M!}n(|*QI-?yJ=+7Z>EmTHlCW_Tdkd~=PhNd zW1SsFM^Ehtdt{aW09pVU1DqV3=V;=fYYkxMIz$6F1e@qGIc~yV_DJkV2LSV*QeOn< zQOUNx0ny~g{7JNs4iqx#H@krZjsUul6Oq9g zBx4G2L8!-~U2m&;r^|KlejRr1gt7K_X+2j+`E*j<-^*Kd(DHBW?Nv!X*;eWlZvOy~ zi~|G^2mnfONdz6ev&raW`yQ&J15JaB0sjCKL_0^!K`WLGjDNk5I*jAj{{Z1xX;Spk zbpAj&8lBb@Ww&GZ>PvJ4E=b494h=}Z3ACpmjVdk(Aj7Cm*jC95H_X6*0VFU4a5*3W z)Tt)EC9amc{_po1wc6WsiFw5xFByHybd&yVI{n^i{vu7tC0Xs)Ib3X&$Q^K4BB{ns z2+E8MF~}wV0B3gunIgtccEYL~91sZ(z+)Ntcyd%BM%oDEaxK9O zGI!*X2N`UJEN_J{;IO&BA2#3h$m7)Q8x_$Jaqmi&*O#YF(p_!o(%s$eHJnhE zikz)o!h=^j)2g7h5^okL>>dLQ33)#!LLz!V%Dn5s*mhfNEdtX8_(xI81IVvqe}zhL2Z$$#F&s}51joz=I8fb*&HyDxINeeI0K%fUb{=1e zEaYw2D$p}GBO@3rPDvbq3vtxv3)#nRWuk9hOTB$xf02{NN?NU(w$AG6Hol8hduyTO zU)XKW{7S-ra(~j;U}T&f(sVfBADhz{`BZ2m9(3)vBop?)LXJQGH#1@ZmCzF6k1CY=7RJ!g$j}TavCu*s*xkAL}azG462Hj56 z!BBF{4n`CPIr4lg@ziILVn#qYE`;aqf?C`R@&FkekQbcdIVEjV)3jRE+iP!U_^+DL zW8{^TwYIvu>bo_i`rltO&YQy){Qm%_PIJ&TtbM~}P9?@iT<4B@=9&Kh2*ULmjNoLh zO{(J2_>KBqpP781Tm-BzTx-0|RbJBOOVl{{VzH z$59fa!_&yvAo))exKX&N%E=}<9a{xYBmx@(gshh68qWW?-D+LIwrDR=^lM@y0RP7%Lc+fZNn2?t_ehL&wum_|%&17cKc#wz}JG zTKp2ynyT!YmzInBzjvjbzIG&&!*dwSs?ZIja;(G!INCsPrAb_Rk`75=Nj$Tq_V$Yr zVGA+ah8R=HC33i9$9&{u5O8KX_OcP6G9eF;M1EwM$s{Q$ln1C7A1DBWkXos$-$upV z;$8W{-eV-FDoRJgu>=(b6tQ!R6P7$r7~Hf@-*f4`n%B#!(d>1`hKaQ9zAmQ$)m7=}a5;^Ua&Nl9eFwDn`78K?yHS?OH`+6G`DNFeVbP9o$OSUD67g;;-as4HL|mB zRqLzS`jjqOSY=4{PZ3(jaQuxwOVjNyWjn#bw3hIjWRQcm4LNa;3X(##x3<;eT-<3l za9hsGA$?L$v)x|FAt6Pso2S7Q?Cm3sxQ$vMPGxjN%6%8$-`R`e#<-2-cs+a{rzaO4 zBKVDUZQ%$ZXI2EorL0nTsz}-~B8eifk^odJ?;OEF_m2vG$$kLRUQ3S__}j#uKh+r< z&C`A!Sto~dRlwUVz3+;3wbXSht0z(s=C{)q-}uF7$oxo;Yd`rlaV?yE{u z(oNrZX=QzHcjMx7+#VfkQk0xpR)bS*T{h$Fmna4DxpTqg-J%U@bYkR2KXm>8l z8)*8-77SGJL9x>H_v~|=Ba-Zn;_Hg{_%Wh*;^7;#jZ<=XtF0~c1x}DfP&bG5_ z`s|W9F(a+E`4R~jykH4;?Up}~si6oS4X?TK*xodwcTR*Q zcXX#x*LP~#LElBEEUHyj)orKB9v}UZyeZ+^K|jP#8sBRcn25!p_!80$F3x!tUo+?N zKCf?md2tgl59CFmY4hZSf=hXD2e|li;h({u3t0WDQ1}_(TOSLvF?)|6c!$N8-Xgn* zhex|NmO8{*j4^Ljk?ri31=`Y!dt)mrk4Cc4r@DDHIHbMRF5n_dol9CPZDpogCQO%d zO>^YMVQz?ambHa81eC)&#*CHXo-g>}@L$0CiY}w$DgGt+nLNf_6XErm-`QJFn1m2d z;{8Y+9yt8eBg@myur2VbHImD|I_0f~f{SmKI<%!JT3s}Ya$D(W$48}+mIob<#m!DC zq?a^hIL0zjwv9?^F;Pt`u6b>%ZCRg}^23c@@)o$8Sh$XP;*wiyQE42{7%-W(-N6L0 z2UTVO!2(;ML`8|VsnCR6K^aLcMYK%H07>AvotPc|TO>&=ad6B_sv#ib2MwQC_{H&J z>e5X;w)I1~G`vU(Bpv zhB)N=JlFc82Ha=7wo7|n30G*PmvpYG%nrbj?I4yw#McEVUVBdMHk(~;lTAv}d+B7f zO6jxoTsJ(SPEv}D`BG_n%S9cW7b{&KZT)9O1FI4$6fC3$6)ipLtq6B5pj0U2TF#*&Ox^yahIPO)oyTKabMw);zY zTIp$fEjC(e_1)?HD$F8@Hh%6U$zrI5rEHA+@*Y4Z0~_!gX)3uJuE8z5@vIANYia`$ z*RsiS^08C%2W0}>D(600z+HT>B+IaO^bHH)-lo#q&*FVbKL|l`TOJhA?BelXj&7L% z-#{S0RD*9Xn$}uQi7mkklJ}RFmT4$v(k@I_HtF;wr-$r(1*A5wbK!3c{3%9=NvC+H z;)bCA01*BnYCcrP5432075>h&)7Ev~f+W*?3vC6oyJeQ~mL|G}{eo7ycHK6&R!+&c zrta5EWosin-zvPElw)OkC3Ljzt*^VxzGsE_bK$13scE))?yGre;6Dl9EG?&ai(j<5 zpH}foODe$}UJLN5B5HcsmgIR5T-&v_p03I+^;d#vEuQAp9eXGNg9_vH!4~OHqyV4M!nlH6l+D|E6$5enX+T-*6YvW?r>Q~yAf#KFQ zj~41Gu;2V=_>&}Bzl|qfB-;_;Uk)F)={^#H?bV=)d9HQMS~N(dvcJ-vD4>tR^$U$d zRJ@y1*7X_nTkFXL_Y&&!OC;B_sou9*oa*yxH%O7HEHEU6-GC9v5-uxPs68WVr1iRX z(LF6>yQ^PcwDdNog`HNts&S5&S}UgG-MH!Ae97zX#@hRTi2gKKTFWiphwL>k8qIeU zws$@-_=hX$8fTb5Y-oN6@ZIEB7HewZKF2Pr;(bj7u|YV}?IsNhe8+Tk83RjuJeKxX z4IHXkIILv9cXsmH$4s?~38jd*ZPMJTT17Ijk-pa}#Xq!sJ@|Wnki1t<9`JTwX(Mr>wUS&wN8QqDOkr*<5`g;C}*Jcv?ME z#XcO9fkZ?s#`XN9BF^$l(djWb7-#ES~ucz;ELdqhbb%vB?uDlm=H zdbcHe-S)C~yV2WAD<-bex<5_fz7v)%jTtC4Mx>H*ac#;e#`e5@`_%C14{4?P_FT?Rah4uSgQ(8%`JWt}yYc^MQH`dqM&D1(>fota^ zzD>QJmA(W-n&#vCPHTB4gU~g<29NkgyanP7O6yhCudlu)t&`vQiPrL4MqB+yNq|k~ z3u|YN=SjY|mUJ3xJhuxQ%YAgSPRrK#x+}T-C*r8#eMb5VT|MEB*5&m0Y?kX&@eY}4 zE?zrJRF6z|7v5UjGl?V;qX~>q$!?vr>8WjJ6xH{-YDsTons!%KUxvT2WIP?0;c*eG zEHq_Na^7_#2PUl>^hzqpSw_~o>h<=|4$CweC&Q~$Nu--Z@a3kF5Q#*l++E8Ct1_1t zKW7m&_Om%AG)8HrnkAH6OMNUqD1OlTxqpWCIy)KB2aQgV95XU~oQQ8OyhU+0*_mNw zRhnyCX&PBLG0Egd9$*puaeFitH}%Ue2jMG$@x_XeXjxnq?5KF%<9E6a#2ven!7Z#eIA-ESIv4K z%~^&P5ro$_zNKw6Nz`$=wzsvL^1oBnejg-u{xa}erb5U4yrXKkWHD&B(W&BDL0#v0 z#8EEgBo-yMeCZYIOAM1CA!fhTZUzBD1;zcCMzZUv>TF+fo^||3^Gl%w07L+4s`)aecwz`cJ{T=mId#w@a z7v2ZdY`hs|;>%rY!;gEe-A7|>rcJ6?J>(YGHd?dk*HYX`a=Lz#c=PDjaNOA5Pj9Gc z(B0@-jqFfb>pFCk`X0OcENhxyhrTTMvJZ;?019Td_&ee~C&KXAN8`;1YMv;y*L1%a zYI>%v;YcH%MAWQo?7SxwYvxM?+U))(@YS}8x6^8oC4A*^1an6$@@Y{=5Q5x9&!`z? zjie0bS7g)C3{o^R7Pbi+qmouf1>Q)ev5jTDGC>pz5Ywc)%#SLtxKlNg6CvK>IOQt_ zOR}geq_lvZN|@@`P>ondS8b_MQf@xdm7{yDq0I%Nmn}=~k4q(Z9A;ZOf9mu0v87I& zYEsN9!lRm}Q98~Mrzd)q6l%&bwYfC4?wc*WxPUSO7kY6v?fH?y4X!eACfN$W7{8gj z3hLpFQ4+i);G^$njRI)Y+AjTB!4P9N{fvf5E$ZjmJU^3gsc>`SA z-9?*8q=HL%;w+G`Njjk_=)mk%+U+9c{{UuQ+(d>rW^5!*TjzC*5VJCn<9ox*a+g(g ziJ0ys2b)}woTWK7qP}jUctlVq5 zh4!TSo#v#PU}w9svRMk-LnV`l7S`I@+7B)Wi?hWHb6h$sl1VF>9!(uT!aBaKq-(w> zvbML?taL3?!}>+^M)Ka??JhN#H6(^#?AWA&_Ts@>(l{<}<3_f$xSGjsr-k(xBDl%A zw|fh@w?i$QaiN8_U0Z5PpEgL&$>O`Yw`fekfbykfjIWmqZbe7l64i41+O+je!LD65 zw^Y(gv+QM80gJ*<*wl6D+T4-noO$_^f}bt9HEL1Qve~gM?(Y1_1K&>-g8uFkaTGxr zVv2BqVO>6VaLTGmq)Q?53p}mmxlW%&_?z)lM)2+Tg!Dfh>v~s(F5=fTxh!nuveTLL z&k{joo+7Zdyn+bzOB){(*lE^wz9Q3XZlJZ+?9|!n@Lk(YBu!^k_-FAy!`>OO@ou^B z_gT|CEq8CAU&E~5*-HkWC9jEX^$C1Ab8~ot3#(ZCQ68CnE{8qKL^WvaCz8Nj#}d7A z63Eg_j+Uzptgx9pw7rVvNXrR97ZODjQpX~?F^U<`OXLX2d5dq8x}7A_pTwN6d3(!5 zpZJ!I^tWecuXCfCWE{2R@wiE1AfpzZB8=+Osmko{A9|0wcH6Vv=sj`@j583sa6VN~ zPs_n$w1qv{N{~Szl;*;bfra3St!t>e**2|f zr>3d9tt_3j^WU#l3Vih!D%HkXH+JmlTFXY4&dbw!e;K@!@efnAhgBM)$z$PC@@cjy zZEG}BcvnJ~$hKMGgL_)dA+c#4N=-GXl^Q`PHN!=vUKF;D4JzV5$#6{fH}P3+Rk)U2 zh8TCs<#2bBKq^QCDOPVx_^qtTuK3dHR=Dv6=Bpv_=Yp-?SfPpxHk;us7ezL9Qb+b> zXte(T?BS-P+QldlT8ElWJje64w6VBbY3?++ZXGv%^HtPkjj+tyL4$0hxlod1#5~2o zEWoRtC_6rv>b$P6rJkGH-L>s!+sn*nB`TU(HmudPOP0>bt(W<>(pPMD^TNaTv99TG zGbipDsCkuu3K~L85+ZWTmojBR zBr)JB^eTy`Yj;Vv)AC(j%GS{HVHr1e?weQlyS3FO^wrwey|mq#&lD-=ZFv~&+MrE? zkTbZU*v_h??rs+y0-Or*Iee(vRT9h&cO2~niylb|c*)KHQmVU&V4!dJ-z!YnaE#Z1 z*+}_!#=E%$zGVn=)tUF84B@eW50)JdMSnSqY72r`7FhPM3%iY*oEQ0t%wR;Mwnld! z7atcw9b4OD2=G?vILIG1KqPWW9#(kHNCf2MW|QsN!yAA= zJU5fLFv;jtDI{QI9-v?Wk}K2W@Xv&%`Fzum0bni}n;h>zs-q-)+-_1qVptK1yq*K_ z+l|6yQVs{qz?EF%Xl7>4SRPP@AOJxG*KBDurP6Cn_uECUPX2u!t0!6B)|1l8>DeW1 zRoYjw*G+n*t2~72NDkw|_xUAUka+=l$3?~`fIBiEHaQiecINFrtjIqAy(0C+;I;3O)WQCEw^g-UANN9UEc)WAccTm>^w;5Qh->Cs$xCsDV_T~L9* z!BTOKhjPXWj&qU^AmEle#TD>wr80(HcGW;td_0T@&f-QIPyqpRf&kh;C3gW>JUp9w zsdjv+Zj<|7f1hS`MX7AMT{}g7Njq(>kF~WjkBGHd09f=W;~2^Lq#04k1Un(e1ePE- z8;&qZM!VN$8;!lJ3Qi8|!lV*$l|durh8wUXj04aev*4Xj60>-lO^@bPDsE2Tzzl$+ zU@Qp71QJT%<--*J0E8(rre7CnVBiqmMDm@(aRGAYIohm1#_i}&B!E0Tle@aU&hcHZ zXMJs|ZqMeyw3WX5*;(nUQr}mtw6nA5&Up~O{CsMbhyetIdyIfGaLTGiM<9#}YFmt-vtCQc&NI3ohZqbF-Mxbzm8RYkgnX^z?LUwLs^}NwpOwe~N=99_ z;F2W4$P9R5upbFn?p@wKw_7$jj>42`^!Ks|?AB~7K}y|i6d_wBv++hmZEx>~FBceT~kw{lCb z&+udTk59sn?JK7Fah6FGV~|M0Az(UShw@WvrzrOUsU*^}z21wJzLwVa)5&!1c+4g^i1PGX zi8ur+B&0S@0}~{Gm3)j94S){TAmH8eZ=7K?i6iO&H&R8)uLEln(;ar6M%D+CePO;2 zT{c91E73zP@0RCONE|X{{$!dvVH%YOjr_I&$RO2eeiQ5Pf2r|CfhfjG$E@kn91Q%5 ze%T<%#&(#|Tam%QEn%deWVHJ|Ez#@e>Yu5sC8e!4ntx^4d^&s{dNpk{JlNvl{{YhM zJfJ`YgD1=L05KwNCPdC!k&T+4)RFT`zunhU`}u^66QoW8`Z_lxk%2}EHE>G zK5eIq8kdGO{V}nqAZ6edwiegQSoA0C?5h|g{I4KFPB6?XF%8#Cd&%Qaqk62d#Kn|= zcgB*FgnSZi%@54`jM?{9&ZUa++QI5w+KaEF+A=VQp_{`=o8Y%el5s?0sX!mk|A{OtQO{ zX{CmHKMz|hejwFSIVLwR7LBJ|M6l}XB!AWhn=)Ei!DFWR-(j~^iWVqT-!|f9m`1@_ zRpn`9V%hT@I zpB-kD+^01qmr|T<7`rIT64T!9Q;c*;>m{bI+Voq=E#TT<5&X))BgU$+<<8xudgOpe ze3uH@P!8U!Pt;}(8^|Cr#=#;kepB;&z%ao6CBR(#xdRp9aNX*gRYlvVz+4C;Qp=Vh zN%^=|BWjf6oC0tL^cQ-hN>AG58NtfO7d&-4)v!+kILQN`Cj;_XQ=MwgO}jg3C;GS9 zJ=TwI=l2dLAX1~t2Sz;BQHoQwmo2WZW%Ihfd))RtKKRM1p&na0+}X;RTn1>QM*|F0 zGMujM$7#wO?i*|QtNn~^Qh)d;V^0xeYtIV)) z;Fi`rE&E)EkrHy!NcZyUg+j)_EW#)*W+9Xa!V<0|@;7}ZQ%~67GbEm~q}KOss8qhG zzP9V#=#R*_$1R=*GRkDy{oQIa=1JLeRHYqnw%TpgXztI~&)SL`EnD_}_{m{1w6Ukd ze-i-(#A`R&cIf6wo9vAe#_;*_K&iCGPRSKnOsLiH5Bw2&^{l)-`(Z1|D^F+fPvKUf z6jYpd8~G21_gegTsNvAjsL zzlVMXfAx_FnY4QuVp^r|t08y7$B1*~JnYgjv6BU)gq6OXik2e$OYx z9U&%M+-#3{Y2z;>iX+R)83Mt%zhEwPmTUc18+j0U*Y6`?TY33+xmRUidT@h<3RD0x z59P1NzX^DU;;pa2*fdLYTTcf5(LV#eBWhOH7k1`X(fk|n147nyS)jLfj#d`-cINC_ z#FI)b{MU{)2WNt7_B_V5niP^B|2DodnsGl%5qn|)7GY`C!_hE z+ZL@W1qMje-~ogmdvh}YLuBJ2PB#K^&~&`FO(4r%F(U_QAPzhI?z|qyJmgo7L8{um z0^EWQ);KK6cqehja5%{TsN8<`KozGQ!Z-v@*vJD+wUaEQNfzzfp z4B(y)G08ltFTR)Qd+qY?e!FS4_`k5}U+gF5*GC?g^56ae>dmVIkE;WY-Eqb;I&yk} z+~A6qEmROWz{YXUJg~sypy#&kau4@>dAvr$0F#yINZ?=-$I1vKW1M3LBaQ@-_>M!2 z93G>dyd3d>2|aU+laO)Nv3Vq4MZMR;?W}FLYjyLvYlooLkX!33KDJBCujA6kvkgfy zIpd$0?)#_i^y9A?Vh=npOgj;6052OYRMEI}ijf)pRe2PAuByz4ULWr@koHsCNPoR9$H*Mpw_ z0Cu1DLW)<5y68t+$f^CJ$DN&SMTos#+iKf0A?)6uT-P-m(OSzJJ z%bRlJ<}*8z86*m#2?^RrQXgo>cPbEg3O-f$U)gHWA^4y0>k%rL{8!=|fJW40WYKl$ z3BY_SGa+XRs93i#w&&U6QAkD2w%h_`W!g9yXoBKK?4fazN&=+d$@1suAK7lodA=xk z5yDCq3!fNY9r3XxE%Xg;62ov#7D*v4R0Re_$Z+ac^vvQ^mQjwh)%}Fhjnli7Hdb9* zNh@y6aTH*oDEqBD>fc6{?`!+3eI1f|UFv?mOQ--y$>=+bE=L$(7>xZ-IqiW+FUjkS zXFWkAk^smglh^=9U@?v>jFVBrfxB;D2O#9*xIVb~k0ZIyC~wr@Zs(~O2l%j0A-U<1 zhQaT~+WuLshm`A7N*27H>8GW&R{c**7$txo@`Xy{)#si&MTDgK_oj%Z@sn zcJ%3y!0u=_?a+~vj*s(q!5-te;0}ia0=T8W;AHjZsrSYS2dDDDCp{EjFJd#EKKD!! zfJSl8zHz|E09-H^TE*>qTW4t5U3oqHx7ip+BuT5mTIuSSPF*$o?zP?dzP)bHk(R*Y zf-{e=0Ar2ZsLnc?vX^Us3t$iiM;Y2ZF}vHTKR^i_QeClbypDGtf1q4;BO@et=B=&S z9Zm;MNEu(39YE&;zdgw(kqawJUS9XnTX?mnU9?_TXH8tL3OD6fOMQB!uG=?nFI`#L z!Fp5oP!JbCHbFSZ>NgI!Zg6r)>4GzPF0JDrWV5#$RfsH4LB~VWBdOy&8sS#_B%2}% zSb%bHtI%){LPs6)PjQZS{4sfN7Nh?F69Wq_=*DCy6Nb!zUACh9obJZqfr6|-tv|D3 zwM$(!Nh>vHdnJ85uj{KmcN>C~BT`YO-zswDNv6`Xww>;*-{fsvhl=h0vxi8l{v`42N_=DkU{D(ob|+gLRQi)*X6oR zCu=PmvuWQ>>vM-FqdZECr9!nXXuo!~CkboH?C-X(zjb%lt4pDgmToyYIs3z~9dLVr zfsz5>lWi{-Xc@rC3OT_X{{SPCf(AO^@GFT+#s@jeXTK*H2evxo5IT%wE6y!Pc)$U; z=YgN80AOQ0-~b5va&uZo2(5OlYiX}d{{YW@R-F%X6OzVOYCAOSmC|=z7nRpLAxlXqP4oRw#&=2?E7U+adOuxg&Z~&j_w99Iq9B0U8f|5Cxi24w=+3l zt+`K9GBL(-NGCWP9OoJ8PfC+i)~(Z2F@+cz7*)z(3`FFE*(F zEP2KHudk=V?9CX&U)k6!u@8tjAKiYX{(K|Zd9I@zM8(? zYenczg%wklO6_TF-%Dto+TEs``5!BO-8Z+9e#d{bcb0zM=i!E~5*PAqhy#M*uN z7fhzw-WA?MvqUFp6-)mBW?#2k#y@0F+BzAQOKf~A)ovNlg!1f$<4>P_Q7L80ghmUu zFB#f%hFAVLZ$2SI;Qe$%Z{x2T>Cs24*=jcFrTjejd*WS6*`tp7+wBQ9x1dAiC_{Aj zB73OrwJ73>{?76kpY5>!07dvuPcy^eF^+_kB6h^Nt@$W z!aXZhSYFMiNfN_S@y?rd6bk@RHN@6QY@19aVY=A0<+`uKzZq#l>J4kdz7^56yJ_xX zy3=jGD)=K`l_k@zKFNCsw($P9t=rt(J1^M&&uwzrgIuiMZK6nH-H)hzLh$C5sV9l< zpT%Ab)$U&r-raa=!(5)sC(WcnVA4Ewsp?l2(_1NBW5D*P63*_)tt@pWdF`cZU+r59pw|9HliFfc`z*g| znXaGqU#(}+l4}u3U8l;`WysP=u5~#@F1udwO4>8?wTH?iqUunr<-D9B3)$I4xJgEC zPfIm_J8Z99{2BO~hIno~Eu+OHl-4o4FXPV%+e@8A6_utZP#LyK2zlp~Rt4EHYnBn0 ziw5W6-;ZrH3-1ui;Qb~@H2YaECsz22;m4cow)f)2*xr5GgOm$dhJTTNa2t5lP{wpV2q zvx494n{7~HT{wpZd004s@JO7MAr?ZYyEeAbAR$w7{lWhL1l)qwZ`&u}94!>jzr2NPvVr0cZzA!E1SQDUOcl# zDQ`3q#za>$lOUcsEzmTEZ!sc~aN;`kUO|~gq^&7n>nq*MnYufs?bA#CZ0g{-#*Y)_ zH7UPwVyN2i<+5@~x67)QjW6o|0JmT8QS$d+u=njgl4*ubLfgVV64PacC3$9=>ht2S zf@5~K0@-mRPjzb|Z%m}SZD*P@V=dVE2mT2+;iuGoH-EuGycwd{+*s$FNu~t zUr9?_ZI>SpJY{J$+R81g?Cwpzp_!GN%3VflmY!>{_cqs2{eS-e1wBjakJxwiiMLHN zSk*5zZ6n~|ODX1SL3M98$DfAw(LIg)P+VFJ!F))XTazxMb#PN`@qR6S&A+u* zhks$u+B@R^0FC@>`#5-)#+Uy96}%bXS!IXB-yf~)ZS>6pNV(OtjUw*kTzC^*(ylG; z;)+|zKeUFs`&E2wx%laO@as$X zRbxMgJU8K88rw$IE^jS{o#AaQw2e0PukN%h0d*_+ZLJdCb<=d2t;ANbLKIuu^YWaI zKGSU^P|d7IIwWe(=Gt4wHHds62ycXSNacyu=TKfH8H z5N;UyxYLyAM%<~cYb)=wcC%Kt%dY3=(!xnfdTnN#(LExcX0PV$b$cZA(TeU^;~;4< zN=VwP8JVOK0?N3|Y~u%LI0#F9$LdZz(@aY@Sb52 zovO^l4IMN@Cqmk!7+fhS9I+k&V1?s#MBIlwu^1{watQC!S2j_jLwNFx2iSdbt8la2lqv>R;SIaC+yLUz^4?~Ij!N!8K?wVfQMf&&<;#9uZkumZ z?Rzac_rCVh$HC$<*kG~Kr#@Lmm2O#DTgK~F($%dOMvZNLXds`-w1QPq8Oif5ipJ%> zW-7Miu-dr!zCnc`V5k^UT9k<-hf-9N<;-(lTzUJOaWO1U6_OT?GSY00NtF?c?_?@Q z&Z(WdXU1jXv99d2a5uY?^4{GTGjp zv6Wvj;rmAPEQT@_Q_MLC%As3sGj!I8rqW5a^i5gaw&mZiMWZ;*_bl zKXK};mW#dmZ?g733490E{As9ZdS;R0--a4xwZ*II4}GqDNbr0X(I=B7^~~3ov+AzP zaT23jn^=v*Lw7t@=@@4zT)ws7NAUNEHGd7=-S~fA768iHhlV^uq3U*W#Hk(9-09ct zsM*BuK@)isM#yA#R%DL>7GEX1vVeVv+IbKww2+0jwT16UNdoV>lG5f#iD`=@anCG1 zS`F;JQ>3qz5;UJ{T^mjNW#mz-Ts!I3k%+?;j$4y7GfwGjsuI{cv}%%^y8!UVCNPIQ zoPDJ`Np7QNmW{i)HvU@boy81JUkXYvp;k2$k2f`SE_m7(jAE$uc6QaRRqcCvJ;aes zr(bCrb(C6__M#!Ov|)Ls!C@WDzq*Ugn(q4PE#0P)0wyaA2#q|2)->4P++V}5i1r$1 zgi!dO#GVkoYltn3X{dZq@I8`wWi6nDeYy!P))-_i8W`gj60|5)oDg2Wg5x%^a1NNZ zHn&jR%2C5!TG*70nFMQbY6RBv#F$Xf%B~*_%Id*Ga+W?4_-S<|&E&dYgta|Jc9KaF zC?S^BZZhjTNh3pX9Lo&K@yuNLPat=!Ow_D=J}JUfG=n@R~`rzthh@h5kxX{}H6D%3w{ z--A9JfuYoXHU7@t7L63Nui{URJ`~f!vpS(HTJhMs7L09(lx|#0<`0v{yh;0Le#_Rd z&Tl_#zu9`-poOjB@q^p89k#4`X19HJa1O_OL8VPB%@~Omr_~Pybdmj&Yp61=K zSNj{ny4B1H6UfZTEaOkNw6yaM=adM`N3|!KY5ajLr{^?y2MLCf_Sut{yt%BQPES>? zvX!sVUe@wR{brXO=CX2~Jeo-~rj@5#nYR|*>Qaigq<8GM{Sf~Eg0B2{_#g3ee$z9eCDqFXlpmyY-`VF=nn@SLm!2r_>&q-6O&d+nZZ$1N<(Dda>x+?XZ4{qt zxPl1aNcC5FND)Z`2o21$`~>hk*FazRBg7Y}Z7W;LcdK~AUWVbBllSX2wSs9jw(QJR zS~%^Zl~ovAMLdQvAMD&YPa(izDdFQyVkb(RV&%&jHte0bh#Kx-2{iLBds&!{Ub3&YG^U4$>es@hSXv!4QcTtZ=@;i8+#&X@-v* zBI!wG8#JC#mNt7dwFvQr50XNwG(^c9Y!SKnuCJ0gT3sSLmwA{=BWm~X0PGA`4Cx?| zT2igEV2VGRB`{h-KH}8=4SX}wZEq4khZ;&t7D5%ETlkt@lQD`n(#ZSVGEc}He96(UJH`XRMc;+wMxsb?cZML_?4345{#tq^M^8i?5%4k$C_65 zH@jBlSG&FJk3NDA+4EMtxNBb){7BQ}-13!w3SG?}(55rK3uqYxj~>(o<&8Ya8+nWb zHOL7x*yOsm(>1MRLS~U|j;Y}LjnZ2k#vIB^eV9sx8OA?#xZzW4OH}o3I9cl&g}t)B{}m>Jn?c#trAr>-)rx?b~IEr z23Ql1y__79!+;J>Mn^q6WMs2SvB>#4VDdAJ1Jru;SF@IVwqf zl5>xkg*bn2A4nP0^KYj?4qJ zKrlEYC@jP<1RcN{vjZK$WV?^6I6iD+APuCAp}}k(GIRVTRFPS`U$(2(+FwgGXTAFL zI%SHIgd*v`0hJu*9GjUN6w6UCLxTvYLgefV~3+ zDj8MSmdLA`Z-qQh_V%6~3r@NSmnv9zk4&BI(QWQN(K3j2Rr5qqhGs@tQedGrI>=S{ zZLvJYMtgV5o!g85@ll;(4K6$P^7e-Vm;3 z+E1A@IAsbrWWgJ85JQrCqJky8i|iKa3~s6-)}YypIXonavH_fJK*I-&XKMLsq;G98 zlTKlo6rbP7*-<7#Bs(0o03-mp;2s7I5~T?~W}4BYnw75gyIo%C`f1$s)@_<#d3}~L zq*GE!LCtA(b$x7|?zByL8n5DS97aEX<6T+#RX#=JaWUG*5B`r5u{m>&jgUTK0mf~` z)%KzC-fP;8&PXjC#pT4v!x#jsIb7fb03h1UjIZ4g6KW61r%KqtQq16TPD#m+)b3&i z+;hfuxGdi-+TVA}tpw8TAlv0e7dXx~4oS($1qV~kexQ(Qz{0L01aY^3 za(DygE1VKCqZndxGm3j#$Ok(<=pY7DjEoV&jPMR}#dC}kgG@0W;`b^Fw;3chH$DN$ zQ_!j1fzq^ANhNFSmsQ`_U39Xt=&a8IwkmU!r6upS?z`xg4B@2d;VwccuwDxavXRc702cKfcrSG#L{5tN{szkAwR^s?J! zuYbR0{paEL##nTad@1o3+D&J}N{}p<=>XKVe+@?@eqFu&t+OZmPkcEvax6v&irv_w z6JajjD^0%jPZE4Gy@uM`#6AhX)BHi0^0?{w{AExR1)+L13lnRg32M?RT& zf#YCAf+k-q{AV(>A}e`fp7%$I<(kfWc@`~O!_v!-IrP_ZMa6{jZfl(`=Y6ZOm19eJ zCwa$P;7^F&Gx%e9J;#Q11l2SP=~eYD8P$f1tGPf#(rMBO< znO)r{dp-2kw{30dWcKQl(H>SS46NKQb+0Y&rk@M4@2cx{rj5TrpL}-)EmAqO+l9h9 z&Ynu;Lgo?`R5*=O1)s|&0rwE=nwN4#Xh)f3x9CX=Bw2-c+zwep*~r?g6aoMQ6zIPB zqj=BZkH$MO4yPCPX0zpx%2@^NyT+|Dk2O}`dPlNSw*a(0NPC_6%n^BC#C;pae-2@h z{4r-|;teZ?26*SW)RGce!~K?D-MB#@Yy??TXxkG3Ba4k>m9Ev6*1h)9_IKN=e>b!);q&VQ5HzNmuPl_HQy~?enuw^a^0dXNx6Kh0NZ7GEZauc{Q zB!Wijr*-1L6wbwsyf`Co%Db|F4ZTaY)lsy4-Jo<_iq2KZdiU;o zlxVo6%;LNAO5L{K({}syw&SCo3`Yd|D&s#;7Ym-OFckG8lS$x4!Dy2h8%LB#%JIm_ zINEYCkbQS>IrFXS^JEKuyfDT%n0&_>2k$QBCmV2fg2hg9X!E>5Al%VPFmf>%I5@^e z#Tzq%r163>+*bue+vZVsd);|0?b`ldj-57EPRpZ7HMR8X-R%1JHjTap11>ND#_)J2 zfy(p4766lwpbj!&YhlmM26w~l?Ly%^oR4lpp$<2g7WqL47T zJqahCxv2cx%=5p1P6K4{NX8fD`={n&0LR@U1P)0rE8fc8bV};hvbt$n?Q8cn>!$nK z`&p-bUrkeejkzF|REFn{gKx?~8(0tq7m^7%P`FXJoQ$b0ZKNO-L_V>o50W_qCeT-- z41tq_xSlE%n(%+EA%Oz`xhz+Z3Wf6Uz~xGwa6svt*$j>WKQ1{L1qfmZ0WmQlhC1M* zW1Q!lc@^(w^m;uvw(sSomy=*+No_1-GP0k#p|VH^8QMwP&JNrFIURA$LU%71JxLhb z^9-* zah_NakaN@@x+Xx1IVuiFI93YEI)M04nItG>}Yo(Y1!I{IdE?ExfgD6D>4p$pP0^R2b$^q$=z(mD;2gE46UWHh@4Z z4&#H#1g|>eSj!yN^GyVbRpPj`o>(p+eB?6A8!JW|I8vcg7!S8@Pj9Y64cfG@l|dL1 zC^=Ufomhf1g(b2VaVH=moD{w zG|6qGB<%{#b|?FvK1MvCSm>4@bmX)Ky(W3h}oWkZ0+Egi!IKQJtI@)fqAINMQ8B!*&MX1io36C?)8 zbN~&l6zG0Jp@3Bju!2J_2wIwXtyrX#n@UM1Fri!!No~Am zw>a&tm9+#TRMj6xsNW&P^?c90G1l)31k%l-M82|pw%4h9+f@X!lY@c)9R@()9N>URBps)W z54Q1j0_Qu7%QMntK z08coO9AIGJZYQQsLB}OeZh2Id?31%gd!>0LwwGJ=fADEJE}w!+TP?Kv_gZbKsQTTC zsD0ZumH6PymziKf_rm%-qilaEE? z4Yxh|fK^X?;@Vm12){6kj)TlBxde`I!|!l9<8bV!CV3+7X0Pa;zUp_q_Uhfeb<;$j z_1p1o-#hEuOyjRY2MXkp4sbaK^f?3qa6scK#8eNiJ2BfE5!W9m!RXt8Qa)}^%Yq06 zdW`Dr(jxPkrD_X09yoL5%Q;g9f-#N0AK(U z$sV;Lv|2lLYg^qux}^IpQ0)6ZyZY|F^9<_O1P_y*N8Un6C zNZJ#E1~Gzml?NHeT!MP=G7k6lrj^dv4|VxtW1n&I4oT`x;&2E(8k_y8rksIn#F8)! zV+Favqz7{x6Tx_4IHTK@oN@Y}8R^^@eS+@Qg^m^^py?1&ICf?2Mrrn;e z)6)0qXSSj<^FY|(f<``LxRc5Z907s=-9RG0Ffr5|)n>Z4eC~u}9CA1~!Tu0%IODE( z027+nlKhZy0&oriVxfWH@#TyY)Q!NL9FPD4lUzu|<`pZ`+gEp{nro+<(_d23YIkZ! znHeBqNdO*$IRq%%kT#3}qmTz6)zsCXz*!N2z`zR1LmX}cY3OhcPu?8#1#2OM>M<%Q z;}{rh^~M6Wa7gF_6$ky&T3Xco^<{3`Rz(cWk&NzO25?EjjyX9Qt<`7dpL?x8SEcXP z_FZ)>{d&9k^7l=3)&2S#U)m_c1gRY4WSrmw!3qfg}Xo(ab!b|+{VAn*#Fq_Etu-~z*vxd%MsB;f5Gut>qjY!IvK z4R3pF_4HkqmR?)$qGIW-{I<7FmcH8F`roO}tnrQqR=~gj4gL8bla(Dw!8yhV1lSi2 zakW_SlZawEh5$&Zd22OHV{55w@D;f6WuoD$V5S=sKizeQ~?f5Y)w1?}_I zyS+44>bowQTd7h#8b-$9{{VdxyLLgq9Z1e{1_w-x~V}71M>z9 zSaDN}i&*$22X1rI0Dw*g02#*r0J>Cwa&cUll4dQJDoHGU;NgkM11FFG1P}oo8>S*? z<|O5aJqQd24;@Er<7gvsJ$=jPOG_&*ss0IQp1 z1D&J4OoB>-)N_z*sewQQdiN&-lfWcodXfh@$4+zmme#*c*V4}a04v+?dTFm_-^qSj z+pkL&&C`-TOq}HO0A~sbJpm+O7s2NvBojy49DsJ9B#?4hfX788Nx(fpIL;198LENf z9A_8+aM-~EAoUnIUz8J)dV9P)Tw%cIeq-}<)SPj^Qag-x&J^9PrIwa@HGi_SN$;oM zqJ7g=TeR=;Ye)C|^uC3+p7p`Runcu9I0GAa#yI1iI6HR{_l0MI`P(Mq9*cv#@IX!g zWh`(MfC%e?4k}cd+!6cbJ4Qh0ct%NOs|%T~zPH!6-*l|M103m> z=bVBtKfR5_;E%d^{w{lg&ssmSuleMA^Mwb1at~i_2+yVkbi?f@05~UiP4SS}>zoik z89y*z$Dyf|-j0Me2e$UKn5p5bfn9$dX8&=3yZa1S`o z0)33&BX=YYc8^d*35>*@0`?gM=O<_dc?S&qXCNL0 zSxMkt8YJD2KxA^n^Z=ZCWN-&SNC04-$u0c4uP5I3@3OP(FK*qFO4?sUwYu`tOLp(s z9$2$7&y<{?pTA4rC)G6d$WAU0~yH2toc?*M&oQT^JR=VD&CkNo}KbRB#ba7 zm2NcXz}qFhMpZy|Qd^)>P(NH`f(aPGJD6ZlyI%B?@AqGJzv1ntKyMGN`E<3kR_SiK z-%i?Sc_QmxFkAuS9b6C&RrJOnA4BF_sU!e*WSp=h5_Yv%O?$>$h#oS$IKbN4If?g95duhDHqrn)@Ife@aL0F2NC2?})t|Lp5O+zXund3J zq#W~tK4;u}fH)W=kWb57eO6Xp{Z04gsoiL;R^2YG)orz*&VqLR+uKe^Ej`_=n&`LH zTe8#2Bk>=P;KnuE@%K;2g5Qpr!Lm_JAk29I&TQH|XCfBISs{{UfVgmnxbB!W&!832Q^un)_ew&Rl2#=e#w8$;5;QGvGR zIEt{`2rVY_f&nE$o0kr?=2JjFTITYo*r*W zZ)l{dtH4ci0uO;5y95D*7VBTi00`HH08N}$g2 zh<6nS49s%p0`KDoh@)b3E1gwHBt;Km@33h~eo%3x+Q$Ww;dZk!DzoEr zlEksVwzT^mQ%}+o#4y82=Gw_}RODmr7cgAQ5o{CtpDeHNo`CR67mHGFnriy$qoen2 zctV;@YjpjhvVMo5PXSIlQC%A3by||sc~q-3n$pYJc_(d8rLMj@K^?dJR2q(%sU`-< zw5L?j4{>fTBP;<>LtJf&JdhuSV#mxtfkMc= z7l(X1;~yAY8y^YycURSjV6P5=rrm0HL=aBKj>g#_hj!ev$mt3LzG*@zdgWM2$=-Xu z_m%ZeU6a$QzN_SGQmzu5FU=UWqe=WPOD6B5d+qu&lZi_x@@;_}kWI9)r*V?+9HV|=2SRhIfY$L0RXQ2W3F;qzP0ej?1AwUSwy(;R-@t1 z0b4r{HqThpf8itX4#4U@eKSb&EFp5_A0qz%Qn8U_Wmi?@htpma{gwU*_;5e94bttk(7ZdL z$#;1(DQ4QX_7KZ(+ao2MMHGbqA=W-veJA0c*#7|H?x}Ab_lj+_PltArx(KZNTdTs} zB)AO086fcHm-f9;W!}m>jZo;%<`o;%gDrlTX!iD=8PnfS@a@it@cToRR9#y5A49S5 z?6*lATci7Kr)h0%eRVME(_Bw*!{#c|BvHsRWKR!R$t}i@;jL#@ykYz8W_6M@Vk2fO zH4RzP1QH~SzGMs>0wn#^D$z&jQp(bCl}4IL-6oRzI?hj-$*=o$KHFR6F??-~nsLHX zP}bhkZAsrxg(V0=E&Z0NY?n6o`IEz+vJb;8A{gcIHP4AWRd)a~NQU8b4Hi(REX`@A z%(u|RoHl3iQf>sSsESrq`YS-wd_CctSu8vmXW>5tLmW>W*Lq%xWV|pbc#2-%X|`nE zKEmOq)ipb&kb~yF=#oQ9^H8&~9(?JYWu@C|y6yFyu9{nX8qdUCS`P{MCedxi=6I#m+<$4w3LVku_Ez#qI}aw> z3&`C8^&uKKRenlwx>tOwo2Hl7PMf!PWVb$UwkJBxq`kFT(@tLORN99&jkN`6-Me4i zyZI}=9UfhEzSC)Kt$4E89Tr`0Si1he@ZG5cgfib=p>+rSO2(2(;aqHyn3|p|aI<}z zPL|(Rx)Q8#*!W7*ewqp}Wb^f_rn)jRvz8Ir>2usH8INdp`#gU+_`~*}_&cXO%VP(M zK0IsoyO!GK885s6@Xp!7sQ&;%({FU^eNOh>S$Kx$!&VVUi^DgX8ZVhVXZuZjT=9rD zwpxX+!@VRVkgl8HX@9fsjk{$G6KZR8`m2UeBV>x^-2$;yfg(FAI@y&Jm7<&J%N1=b zwUxP3zKYVieJ*xjIBPVmIJ&9RgVFm*T1(-2Lhh!v(ek9-wbx(2{BPs01$;PG{{V%J z@l!|e-RuEkKM#BxrMA1{dEaU>+Fk9EYmGKZ6p+(vGH8~v!ogv7R%>W}Y4KO>gKMQb zFT;<9+Fyt5;}Us#{{Y1s_wgRBd|oKySz+*|p4Q15E5;khp6gh&k(nAqj3`m?)NgTW z8Y>uJvWt-SO>q+5GPW7RNenXF5OCX!aza_g;tLR_J;@1aMeP1-mfrRd%jZZ~Z5yvA z2juF5+uX z3h0*hx-EpUOAWabO{B$kP$8NWa%u}OY(#v|%-1$iypj%m6MQ`)(f^97$@h^m9hRkWQH2xvDnbJe3 z+{(84HO#S1BHX&$62#zJCB3{NH3wtLWs*;G@lTm`@PFbAVo6$Ab-x9(B(|2;w(27B zG^28)Sch@~Rr8i2Mh;_87>z^E0gwkP)gIt6w4HnAqwFRT6r1wF;)$= zS%XH=pggeHi%Pj9$$NPWQ7|q7h?F7%<2xeW-dF(S7mSr=Bg;{W++8uQZbg_|M7xr9 zg?1$JT|Ay|los9M`JPfsV<_H*70?s(kA{8;X+9m&hlu=lcVVX5t+~98EnQa9)s`|u zBkYqf7qf30VM!zVEb{MLh!~_IZ7|fL>-;LpOI?+hE{QLBzrAm5bvvOeMOyNDXtlq> zwbi7x)x9i)wIkD`+tZ0BjK-y_9I%Z5a{koap!vrCJ{h`13V6e=S>Ot*)7I8I3KBXz>M+p4#0? z1u%s`t1zn?HEGA5(bCqkNhcjrc1y|HO>}JgE*jwM*NNd;SUf#RtTZ{Ksm4=FMJV&Q zrDbTlx2}rO)X~&FD_q+&nty? zU~Y9e^&b<Rw=9O-I$YX3XBQmzacCxTi*~sZ}Fq-imFyWYp zw@ivQ?jco_h}5|N6aa-R6k$j=_!2OL8BlHq%|jmWGuAV>hAWIVMmhkig|3S3^p=j? zs?9xmYh<^+n!iMO^{_Rv+Rl|&D9JXTGu%llA{70sT6^6)rrq^P zEpC$EcYSnkuhstmveuV2r)BZ#<)@6rE{*WVPLs@Kbd*i1_>)kMHc4GkqGRF6!Hkd# zY({ihBxL&%*TQ#KdL&bM@XaKRc?yq`Ngia>C6CEdE2Af#_K6EH*)Q4WQt1qlD@F3J z?2`7@z76=}dG?Ku9=-5Z$SFxdD|Hve$qb@MlVp1?Ahz1!vJgzbGR8Ca4aL=^hk&P* zB_qhX)vUu7xLBi_;_gO@Nfm7GRbyvAyl|00w77=eG9g&?uUau}T_m|*OW%?yrQXil zY0=+v`s>5|mXqM@hPY2GRA;fmewc**W1wfHVB zbSbrYB|j2%ch+@%VoNI6qD}nIXJrHu+rn<{5;wWNOPj*bExAk6G|l6hEyl6q zonuMUw%z!W8;k8Nuk1WAHRY|1ptx@$_Dx+aZBfO7!yMxKS9^%F7uqJ4@&{P+*@MN# zrXF@rn%4EzK4#ihy|!1o^U(TbDk~F+y{Ym}np&lAb}I5(N-0{`(e?EDZ^k|;@HUZs zsp>lS#2qTZd_8$}e`n!s7fsf@NvYo6!q?DCcc^LlcbRb=t(v62Yt#@0vA6TlWmRb; zPm?|}OX2?j8ta;7zh&_s!rmD0rh(y2Bf;7kO>d2nvqc)RomXcYs7IGXq?E1AcXaQf-6w16&w}wA zKg)8;I68Hz#%~uYmW*cY&qg%&YEn{+oZXyM6VUkj;N;zE8|il?uKmg>;=h{{UCf{5aZ{li--= zxYl-STHc>?t3#)1hfmaXOAGt!nB)6PMCRH%cZvuMOK>1);A0}eHW!D#vn;Ok?+-!Z zTg`IvKkddD@a(pBpV`Z&wZu~!{Z4CbXU}#Q9$lQ;Y*4`zuFn2*h|+4#P^hHb?Cl*T zbyOEa;3W%YFTYR#FNY$Te)0Ptt zI7!Yi<#DvGtfjMeZqJvk^z}Tfzc(Iu+>Dr|j)1b4F25-I9`O$)=iV ztE*doVVmQRiz2Y`f{y|CMfB}<&rj3MfxEc7yMsl8Q(K#8G)XTW<509qd&MnxJQ5|> z&mQR@vkMfxO`q*~<2^4@@O1tO_)+lR!*~81UlQMo%|gL7$GE@NwC@vHJ>B&BtZZ-1 zo|CTM+E~G_HM%UPhDUSCUbn`gL4Zi+*1Yb1hle{~v5 zEK;&0%4IPi1UJgZLs`)E?It;<@g|3@=uujMG!3X&OKgT&u9n#%hkd=WNQ_olGYfff z`E5FcWg)z(`BoBKys104Cka%Qo8?efT>CWIP4`>2kK6IyH28%}DpW98(xC@RG^Hh$ zWpbY@nxDH};O|D)Ny0Kt`gPYb-%{58(ce-}&3KMj zXk*))aMYtpg{aYkj1s-&$rPt9X*QkPNxgJKjB*^|!#O)c6S;>hLlQ!PpO_W{8v!ib zk{+(=1|J#uhX8LRFgOfDC~OR2k3D!HYCkR}8+^tJOGeBbfI#QvVSp5|ZJ>;d@4*{s z1W_?kP8)jRcWwdK?;d{meVNLfvbGLXGLkwzI(fd z8H{hsOxsls7%~Fb`Bgz?ImYVcU^c69Dcch96N84zZ7y~OX2)Kefh3YQcRjy?;f<_h zR#$Sj5~|>3LziY5`MKymf4j&4aJ4S0((R|+XxB?_w)0>Xl!%OF)0%Wu0rmc zAo)`%+bC87N!@njs3J5O``<3+0QSBnw*LT;Nx+Gm+G|l3Pck=cx0cO@J9a20T!2^& zq;DC+9yvru$y4Si+ad>$uvK{-@WEY3*dK5iVY!H9P|OJP=ZdLCwFvVj^tyfH-D`Vn zwAX7hpBsjRd%Zo~DW!h4O(o>^&kL5}s>@21?_``+HSznpH|-M9DO%k%(D{Z~ zZk+jWOB12DNB!QFf03413o8f$yikzs^AH?FA9-@=9XYgpLKPCiLp-2HHt2e>3>kuD z*=)!GfRaT!c?iS?CBz?PNAaiQvZ=REkN4{GM=GFg7f+KhhMF}7QQ_6haxK)KyI0DJ7Uh5~sewwabh zk^ca8jcK&8W&{QieZsqxhR^6sKNbEp-8Y7!)4yyVh@i`D;v063%fMQN+^IZzUZ-_y zXAD-_1Y$*=UGWEzZj5blaX9_j$B4Cm8+>lFwef7%zqL=r+tkw}(V~*d!{J)uP zT+4L@=BITQlD2miaaWdrs8hDrZQl2bZ%TSu*=eh9?&hBf zVP$0**HTtZsM3@j;;nV<)~(s!UG+@-`u_lgUgc(<2^5rdT)x-Ze87^%!eoe}DT-xi z$^wqBlzcHYSN;(#UOg)5G>NB4h0G3Z->2(MaX)NxpV~i5&A)ZwTqD4)(FSG%>Awq+OCF376SF1`?s=-T{$xU-} zDcqFTM|&lew%SD@+8bs-s2lv9k9Z)D>ry&Jk~Z5rtBvht~Hb;vSCv3xeJ z;L_VlycJ+K280wLe)01df`E<)HCc5HZZ=gKw2m@H8q^*}?cXp*QMH2rKvGnF&_-9< z;MBGG=ZsCR-|Z}*fMH@pjK#L0fbt6hNGj@h$s_~aSlM1ko8{GYHvyJM62YgsC=OfZ z^DP-j+Qek=dD^TMaotY_rtcf*tebYV`Bv_C+V58O^4AKPONB~Ple||>Nc+~ZwcMVn z??vUMuWy<>?P&i10VISwRT&t3%Y&HX1SWR`W#Fl7?jt40+KVv~!sT}matY3ItOpD8 zDH#MD=Om1SkErduKc?QaiqJG{iq4>_outTePww0O3af9oifab6j&|PDOxZ+<2vX=;+!k1gE>UBVx8wwT{Q48eYaG!)(m^%6 z(T8bcnlwdGD+tWfc@VY_mm!f7BO`28Ld>jF^#}GP{gJ*E{?uO@JVo%g;?}j}eGbFI zzY9Jmd_j(14C&BGb3NaL^h-<24L;iQP=ax2b!}2@KGQbVS9cPV6{)rJCdv9+U;hAt zVt&q#;4LM*3F1GFn*RWbEv)QyElF)YAL^glV*69F@h#QPYB!G+pepBdue2^JKtI9 zc3;{z^9y82tRs&0`XslrhW=N0WpMX%*s*D5w3SgUM$|gr!`V^N=SSDHWt_=zYkw2j zYd&N#k|MDC6qXh;L?-#7lTsIw4e<$MvQ}n{{i*w5e#NKuB=Lo}z~33k;E#y@Dfpk^ zj{tl@(EL}TYnL)>9uCo=ms2zNUs8&HCNBc`mTS#RO|#du+xYxkx~7e1r^%+KhkbW7 zvivn3iy*tiIzFGQ!C@uLH&&~r-&$LF>gF5UTdV6`LK};@EM^H1XwADvB9&;u$nYI- zS%oU9oaw%3O-0j`nzW+ST4_CF)oQm-OKSd8AH(?kn-Nn5QvlUYXHIc+=Tc63D5WbX zzGT#wvwJtySkxNtfTN6Uhs4)X1V9u=VPgQB11cLcN@ET45;w{6Z2$&WMLsFgk$>V} z;5#dY!!Vm%*R?qvK;4`R2=vu(4sxY)@*nRqjF0$3F9<-oeT9^(xzC#+-0;V zRw43TK_z=WT59dCRjYA(y>7SsxWBM7sxCDaTZ*QtCCNIJC(9<(SGny|*Ig`|-&3lS z#rnR)CfDJ;n#vU-E2mq$%*xnyR#h@e$gGB07&^A~C7qZ%(*FR3gW|c+8!s4Wx-?S& zO6i^wvPm{7$i;JeV9Km>^PZ|05>-OuLqPC1j5VEO!EmmZ<85-wSiiV?h;-i%-!!SC znEbc6D{W(P@JlSP#*nM>(MRT_Q$-|3U$8t6`yTlB;s=I&3vr-)D811xZ>;qjT|(!_ zv)Fhze`!VHood?KQPdm7TCI)st-QKCI&H*JCZ4)v@t>1)w;?3+o+=cioSSO#yqi%< z_j=u>Z5nzjX>Ha0><@?hX_!lv7%JTSs!E$*yp(@;B>7^S)l^T)&iZZf4Zn;0Ppmur zlgA!0*BfYdOD!55E*0Io0px}_77>>$O9B8RA#$xwxQgy(-Qo#vWRnCB?HlN|8{NZ@ zJg9BwSozpW%{*vHBuTgxKd}D*27lm|pBBGpI~%QMQt|%)!+(Z4ewVFl-X6Jz4JTOf zP287$9lsV=H&(h%mmi0`F)p8fF^XF&%WZv3u}$WA1w6HHsr2voAFsp& zOH=uX@~&-UBHP2U{G^pBbT=skHs=Xz3aXrv6_;*QBJRm!6pO0P#ot6^T$A!|Vwfu# zZ!%U@$QwiM00GOY5>)>HPV@f&!4mu{5DMS5j=F~gZa=fmgEMD#6p2s8Xu>k^Lwv!3 zI9vi>nDGbv5d%oNiN3@8UhB5|m9of#ST$A- z(Wyo=jFXfl%TYzf&9yY_{d>Jn$*{aHj=|?taCodgEqp#PLUD1YQkOL`}VlfWw`*D52T5q1}WBIOS8dKiHbi zEd%yV{hhSwZP+|t2EHE6BS{#Ho15PaY4`V8%Sxxqp6#OnWM){AH@jq4)F~~xtIB6U z2{_=AKnI1w?heO;jD{a|MnNCXIp!u)#^NN?lX!}fZMjLb=XBNe+4r~NkM*B{Gpt5a z!r4v^o*pSt!C@(-W}|pfq`6cglwi|VvR1matn7UIYv9dD5L?Sa03`%`e8VJs*kgcj z$K_zzATc1;^ga{3RRERekajB)2M-rZ+ZwaD@o&6dqd~=OdxO&q2_W#s`5a)hbksQnJ%)r>(jr(%&U_*!t?cNsX-1 zP?GbqO|32S`Fh_&&vgF)4MLZ;7V-muduHbYYi?;l1ch*T$RzFnk)6Bx{{S#QvL(%= zf48T@Z3)z)-r0WC7Av`KqGB%mFR1FUCd+8g?jnmumU6q$6t{QtV`ySof2?FFf zx^OwXfe9g)kh6sONL3|QARm>mdF4PA{FeL%@jiv&kK3Q%ezapT$**|J_JHulo?^GY zo!aAH@Gp!s&kZX`Q#N8-tE*<3Ta`9?ZM1h6cM+Ma?OlG`CBja4dd;S}sLds<-RaFF z{{Fh(ZBNhmqcFr&o*C9o%M*l2&1uf-(_ZWDrDT_#ypP{66mW@}1hAY_KbZ9phDD0mix^HXQ#oF5+ctPPQu4P}aY11;uK_(dF zWh~?axPaf zd>Aeg!DPI$wIHYbu%0&HhGKr|g$283f^v3>?H5zFk@lny6XZv@BMf8=9mPT0v?kI9 zK+7ouIrxmrFsQ1|nxeheWv?>m)|xJtzKwdbSc^#{VntTVG^j}f zIV6LT$OD`Mf&mAw&CTO6Qfe@iuhuYj($;!!d;F}r*!k*N-fNk@RZdrSSA{!1mUgzb z*Q4q3i1;4w5r*31%oZahR!hA`SHQX z$;Uva(zxk7Z*{CpMW&|ks4oc-mhR5O5Tccy4zb1CoCN09^OxoMDZ+Zj_y^ zx_8#f`Xy`Mf4O%095ypEjAG?N?W;86oBKLFJzkr>rm&eWZDI$L@|0e4k{AQ?XOg|o8;(W{ zfuv!Dg$OuNnG=DGf^ta5Y%lNpUU6o&xy`+8f|{zuQ$@% zxAV9E0JGg3BpQC9COqUQ2pIql$AC6~4t>cOz&vMmfznuG?{IklSBJ$NMW z2(GwAGlIkcfLkD_7{SOV13tiG86KooJ?^Uxo*2qd6v!o=7Xe2coGwoQjGPh_ka!b^ ztBIVf>GkcZUhVw-A9lMVs{@P1W15SjX>F#OS~~h|uTI;G9+4D-BuEHVIps(lPI6cb zgS4FFbJqk^=S#PQ5(A#3?PkgAf(VgLc_3#PJPZ?x@_D{7>5(%4k^rpB!ZQLgLFZxu z7;?A(w_}62)E^eCZwV7b0a4A+v*eq4>j%XCC! z;FGr*$t8;9o-f584?F|nlN^3B(Jl1}kybc-{aaPGxrsrYmOE)Q-D=io1IaXu;@((V zStJHho2S?ZeaX{&EVsTg@t}~GC6&Xsi>Hw~ zp~{hj0h9osjh*FoYCoyg{c(V=K|3ND@|Ey8#3R!TClrwB9!Xh?O>_QnO7fr#g~N`?_kHchhxu zt&A2=jk|NgR7r0Bu?VMU9et9;U%G2n`m62gzidEAURyXLJHRC40hYF;Si~mOSUa-NVpejk~^Mo=r+Mc$a|PF`b~cPbzvT zQ_0}<0Gy5huRC2?NWpc<`@kIXaBuYB?ukV~|Ho z^f=pqdf?>pILEQz{?32MuDh#sPwxBeck<(wS3P4SwEpgiY16&>@AK63c=a$k6V3_u z$6kQv2OJIo;MAj1$sadfxFj5N#t#EH&r#bvfNRf2p~o&sBRqHO&Mx?ahX>^cp}^~ccMjb$MogmoMfYVaGBNVL4loJAf(XeuVUl@JE042>#CLK9 zhQ`?d=&f~TPnLHb$1;L4s?0_M4D>i8^m1rkDhR*mQ65f0-B_ptb_%v+ImQUc1mvCw z13dL$oxRm%W$vYIue!df*8c#8K6evNofedNAuVj5DwDOfOSYTseRMSjsSy}55ynT# z;E-~9>{Ht(A2B4hM^PvCoGL~o&U%0(>UUrQtBh{O!E4AxwFPl!K?#R0}!ZOxe* zi6Hfxi~vq~{Be^E)*AF=5A5gTaX6mQ@O{9Q*q)sRLCDD9SDh?9M?3PqTdkIzFRqvS zos-zAGUj}(#a&zCin7zX`QPz6HPoaB?=uoH&IlOB25_Wefv}1y7F1IQG0X~3| zK&VLFka;H{*C=7sN(1(3-vokECt;Dv93dPMcL0AJ9Gsc;3z!_oEK(zbjj~3_ z;2d$aqufu-GxGWYlaWvAI9G0JZM_|oTi4xpT3=gVZS~z1{h2~i=6=ri*|hEOt)Hh} zx9*QbeQH1o=cwT4k?KIn1C!24AH)W727BsFEXNVOy(Pm$qGrYaP|RvCOgC z31JE(h<{!`w3YR?vHLyzb+;EQC)&Odd`h*Efp%c0!TPfup~PE?sSmY>%tCD3cJBT; zd_^s_^ja+DYgPMJn>z=UM3YSv43Nv^d9tE8Rv)@hi6Y!Rxro(rB6#wi<1uUK8JhSA1czx6w80{{VtfOR8x${xZ`w`=1ziFH+Hb zTj7ryc-qp=O@74cmmVwlfj5mjD{P9RMu*0p9`N;@r0s2|-S}E-f;Ejx^WR+6d?$Ti zjl+>@hZ>HU8wpvUU+70%Uw$_@Cg7y-}Z)vB&;TQ28thbtUc8e96vrR+o zt8Ui!Hb@fEJ9GCq+>Ze|)2%u`8@%HuRkx=sqt6mDEQ*N0R4O$MtShO;Do3-Hc`r@XdjR=t8zHNDh-+0g0s7P8yNrrSdo&bK=8)-Uz_ zZ%**Pgghp?sM8_5wb1_nv~D3VD#R~9x7Y9Q?DXf<3P^xywiaR{ciP2kf*%NY(?nat zXJz8!r>s&1g6>l;$?j*h#kQ{Rkrb`H*@&ol0d``jBaT9jh%P(w>>dvfDE(T5Xmdsy zdrH%duBC5fC+xIp>Duea`TW<4GaSZBIP83JX-V32@c39sK3J(*wK{66(aAL5D_bM6 zk)VnpF=(AySBR7VxprV(VU@`W7cwazf<{nfK=S^s{e`tbqyE*O1hsY{qqgxrwJeG} zfY%E@fjnVr3_?@n#?0*}l%ji>6v&LiWK?ax6|Sjn&bF_2r;;bakG0x7paldd3g;}w zA2SE#kxNC?D!16*u#}K$pS6#{9U?Ov(yxhc#5S-unRRrK7)a4(w2FZ^EFSO8HZ7FZCcZX z^t;`4X(g@IosZkk+e63R0{D;nGkjXod>yOX=^8i0?I*)m!%5dPKNHNBEvzQXR_(@wI~?;h8~)9X5OOKgy7uRIsl@;~$PzXNrhd&75rFVVDr40sPq z@ZPy$rk@^Y8sh2mT(#OPxG55r!V#G zsQft4X4CWt1bU8-Z)vAoX|~!FU)n}XC%N)Wx>wlr%X?rgQI$*$6}_6s?;6DM$?{i- zd_w(|{0rhuFIW~I20j|-I_9-$acg(+KUna#k*s*)FSksiQI|$v5cp5T@2B71*|gel z)~@8b)NEmzS@h^^wG_3!gYq69%<*|mWlo$e309{mCn<6(IL1lAxGD2TPkmKdC&=uX z{f}FNvfS?rPBW_~R;RleR8W=nN>Qri9&S{Vyg8(u@63 zlU?zri99uEF67IW{{TR@)OEdLvb!OCb_TH!WerDtx-M_=HiQ4>v_rqTb{8Qsg zR%f?soi~4h{4H+LtCe=~FNi+T4bg@Z=9q-m8>8L#6@xGIM&IyH9|Gudz@8uR7MI~E zV2BeR!~XyX_-@x+AtF>aH(opVnR)RK#PJ+Pp#6^fMU9?Uku8G_iOP6`{t5f=lKSN@ zej(`-c)sc)OgfK@{v+$&GH97)-?#fZ!&T9AdjKSGrWGzPy`&;1(9Nrzqo6l})1EqSUPPo2NNDUs&?3by7$3*L&eP zwAf_1*P*_4j|)7IuDKqKX)LR-K`x}4N<}lJA_@+6yGg;^W&e`%iza|uI5`kSI1gB>Rd6?bt?z* z-9#Wd#c`n}$z8jiLT=@hw8WQF<;FW{@m!thxKxa!lT%S#i{aCiyRF`?PkmPR`Ml5Q z>5rzRR|Ag2PEl^urzumt(sBLgE{|)c6tsHVZ^!Kd%fXsfr#!m9i!Sw8-~=*g-WIsk zrCBnu`DhYZZP4NKB*I6Y4W*HmMk^xf9y9nSrs|U4eUst_r7EixYn>ZWlSyKs0|_mk zP}9~m%dlT2a?zZLBaM~dA8+`({t5p8;khLHMX$#{h%!iotSfur-45`k*2*kWMEYgK zSOzlgv7rhH!>`P~QLKK(n(mhtbf1ip%MervCa>Ul4#i^O8h<0i%|DjNa?)%PIfL#< zOQJvRWj5QbIJtaLbn7JU*3RH`1bz*$C?HG>*_i^hNGjz;n851M7Gr3<2Y|IWAP=&ma+f>Zdts@iOS#+ z=2g-@C21Bqte5^J_;YXL*nFpmL3`s3d%^hM3q*v);Fv6tB!X6oVvBJ!Y_aS`Q!Iu3 z^I83r{AePSw~qWH;&hHM#9VlK_d!|2uJUeAu^mlNGJx(R5$qrU&dnenJb0_&?!Doy zPJI&NMzWsn-Pv=a>KcvYa(PT+VFXt;amj>pi5toVi^B zE0w#>N)of$>9((D9J&)yPZ-e7694~d@^@8vQ`@;WeByg_daQK673#)yc48|>`^%Og~F{{R?1 z9_i)o6ZUKPc`LDS=I7!+#)*WfzExBZKZ{sI!YA^glgu%d1~!I3SPv_c!y2n$7sHyQ zg^H27$55AV&%GECFa#A=IdIBIB{?h>y7(VkY`mHVw&6puBTv<3c-k!B#>p87pdoTG zIt5lz2n-KW!({Sby_Kfyz5GR4JsR0cr=9kC{EyGE7;NT@Tz|8%9MHX`EDLQtI=WkH zQvX00}Kwk)u;D#D9*HZB=Px18Vrj)mb*l6llZ=Fp?1I<|_^= z>*8mHu4Q@czh`fQntCfSh{ddYO}~*<<8)Y``%}d_gmMosB!#9#59RrCksCB)%P(cM zfNcVQl!at-I1Xjl)sHx-))nrWbN7Ct(o)Hahc+rQ&WUvE306rL2Bcz-WpO% zOSJs;)g5<;yifhTr(IabrucKh))#2@flKJ=5{N=>@Ihf{1EoM7Zq}pr}E@U4fI*B727`Xw0O)oxF zas2phhfj-MmNmQ@eX?553~OZY==X2tO8IM8ZKOzT-+ZUcK(OBc+oEZIaD#UiYmwpe z8g$`O>JV*3-=k4ao1ISgwwAV?RrLJ_gR`v5FRxO(TqjbrX)2!5hqQx@B;=fF)2l)> z?RCth7WyuS^v2)tTW{Iw(G_&>h`+Qah@_E(f7(79{hz!e;Q5(W)=#xGVtFHq8=X>V zl3Sl56LDc^1okk~$9n%@?udJ}KpYL?)iB{b_@3hMJvoH2KJ z)xN^gUBTw0*3*TxSPRJtMv`M}bu}$N#5R{P+iM;jyYTbunl{vRY4v+~-^-L4oh@g0 zo)Z9RWoW#qFI&uSHfh*Lr#HyH1j&_0D(yEl@W!lRD|@{?*>hUj!RcpfpQhscM9DMb>pCeLj9?<+#2%;@n0mRcDEe8=8-~gu=p|(^^XOB{zF% zDK{t8-$ULnzi3;b0kltt_OO>}U(J)o^Gz@g5#j{f_z#e8Y0O5LsRJe5~N{)S}~6 z@_V~JZ6x|?`IAoe-LH4Ie=jiO9R7U2SjM@irO2HeJ5ah#)>wEw+qy~G%I)aSTR#|D zE2ALrL}OxRG>^rS<(JC}o7uEtL^uF4#_AY^Qpy7gk}r;T7SryJz^VJUIArllBch^$ zr+CrOBSuSZW#&ENIHI>)#5_K0D`3ZmVYdO9-*TxXRDpuc^Do}vT(bhmt%FPKP=+Qj z>Ih-9GmLN*hDP=vkkT;u6|z-AjEd?}l#*QYPfMp~e}(G#eq7pm?tJX{r!#O+l+xDv zLV|AmsjI4YTRj`?ruOV+)NN-!yz|pJ49*!L+{_6%S9FO%EbYAP!|+=SY1Y%&I}Fbl z`GHWkkTT@wJCIx+yMYK!?DYXi2Z=TaUm)*t8yNZUK?g1JhaV|ilaP4E7l9jDN`H(n z{_8LxfUCQWiZ?cQ6T=aoX004tVx8NyownU1wYs*O-(|Ascop%LaTC2{o%LEa?(Em( z_3x#RViuC%e*6q=IS+0@KQm>RGL9QK133y9lk+fl*yhJKDaSZ*8y*Q(BrK$Ez}y!K zG6>*?&xel>+NR>Z9@D<-WtMrBj(41$w+W2nj4FYV+~%eJ!L>bnHEP6XnD6iQgY)DS z7c8Efi~x3!MldmyrO__#(sq6CXf?g>)mwH%Hg48;TDLhZE#52s2Az@XLc(4T*w=zW zfpmxo+Q9NzLX3_`#z11tfXvaotl*qjo^qfI^bLg_04^9P0OX!HJ4SLV%c9aO+=Uu$ z&BOtVomD_AtQRFFOdpt>fZ05bIW|v+>}AOoP%z5|{{V@Gub-5*21cNxaRBu|!~$Cc z;6iiLMBbM7wAIG@Lrpiom#A5EwYFNmmhB%sH2(mD=<{j82IQI*ZKzl=fG`b`KX~(e zuD>?zz^??BI5m$t%7+5>$w|VunR8$rOQ|0&ZV6B@#f}F#$G;}p2AoG87}KAEKY4Yi z%O+cMf6Gg*c7OmlZP><0;aK_(j4~g>x>{j~Ajvp%$b5ia;|u`#whXx|j2=a62R$26 zdL?dYUwHojcK!6%=he%V*()n)@k;tz`@VO!iCpMS)q}==;-S(LA1};>T;!Juc9Zh~ zwV4R{hC5`3X!^dNr_NaThelFic*6)Ja-o!s+f~t*a*d?p3eC8jgPvktA52Us(lqc$ z7y{F9P*`BN3%owo-0a!sju_x0cz(fvb<%7|Ex|TZ2HVdhs9mR~2wa2m@(Hcr zOWsnyMd{zCmt^WUPVKA5N6jhuYomL=%XhKg%iY_pOyIZ$zzU&UDGPoHdzD;W@$z8Rgf6cS& zwz}TWTY7J_tIw9)u}xa~RMmUB+WnL1WbN}qC8to%&AGXME9Fdr7>)h?2H=FnQaY1<2O7zoo6GE7^VTt@PH`6kXnlrur*u zww_5V==XhYlQ2!xoRSD99BlyS=sROMTm|kkP5VpjV}M7t58P4-J%>3Q@~77Zw*Ji) zKH&cVzDW7GIrRes9Q4R1uOSVrB$5+?4l)mY++|!5@{_xf%Hty#p($-^dRg7*y1w1- zuDjT73EKMWeyQ};t9NgzveCO3s9B2RaO8kGU}pm(XgC08oEFI;j|A&L3n>`S0Dw+2 zg2)LafdeG`*dX-aV3&QAE*l4^!N*a?NGIp$aC)Aj0CbT7Tn>4_EO;L{QU*ZB1;%*F zk?e3Too{XW?XRj`d)aEttoPA%c3bU#SLf%mdXX|6q~*R`ZX34~^72T=NCmPmNg$Ds zHnQcgaM?u3+5t_wM2a?ik`I(HJbbQprZ=b0^9|O>P65Z?!!B}L01?gxK+6yZZk1?XPrYC@t)?`Cn({eOuWryV%Sj z4bop}a!aJ@P_n#otge`3DB?vewnDprV5P&ODgyEq-2V6BkB#?smeFYc01zOS`o&0w zEl%B0rhpk4i%T!eR}26S7;jvxtr{!}JUPTu5-vu@0O6HOGP3e>rN2plY+#~kbs=IeV9 ze1BT_b${VWe9cA#k_Kk-{7t78xzpTdkF;4z5$&Z2>*hxyBxx%Yj^b5a)yMd6U)6jk zbhla!$?~Ik+D#KscmB_nfnp7<${#+?Tr-HwWS}Q=tb`(;tb8BwH$d_2x@bCtVK3Db zKZbR6Lo}iSBok?RfQ?r6C{{8=w(4bsubpve0du@kjIGR)ewMb*>wC8RwzZPGW>q67 z#k87BR?}-wb^FVGb?&adPv*$9sU9|4BNqG?24z_ZLJrxLo;f1tCA_@g0LC)7B;v`T z>PsdrfCacy8E^?G1~$gNPSqpk0H^~55Hq{$U2oy4lxxoqw!x6gZe>_!+Zc8c2m=1| zWMC5{GEMR7 zx4nHdv$m_&-f7(7jv`TdyX$>b`#UGAN!xuB?X91N-)Op;XMAx;303{lTNl{O3XDKl zvlD_uV@3JJm^ZTr9gPDoP29D(#)*71cU86+4gLVykE#?5?s0IAd?l12Ms6aVF!zR&*e)1~3a(sm_ZmJO0d{FUh}aw0p7_E4(rt%19tL zI1RLg-&v0fw0Zk1L}W1n1j7Q#Ny0WrU=HkHfwv$WXOdKTWbXdTOWn1ejoDc)i@&a? zVyPDv)4O(hEk8G8{FmI_k0z01Qe+39 z{$L1S-LM3y;~2=`=NMDZDooM4cmyzEt$w!6R2RPAC}0NCfbB$<6^iap-@9`UVHHkEd;+h$p#hXRdRSIl$*WxUO0|tFF5*Mdi1j z%mxmpfI!adbRZB%AZ`aGfH(wXccfE|xjDfY0|aDz*}=wogU&{BbDRo)L7qn~)O8ui zBY;La6WDeG6vKcIJOFt-;~6-}BODHd^Z@h+H934bHG8+K=+a)d)6Hqp#mO#PrK{`T zqPo)e-uwKv>-3Ko>UvVFLCleye5}sc$-x8?$OtRU>ag90CZ)^Dqjlb~;~=G~0z( zwI7kQ_oVvkam^G40yY%2DEltt67x%z-|u^ zCzWEPgOCYU;157YJAH=A?@zcu)>p|OIc!GTR0Hz-%DD%SPDw46I8Z<>YG}9RCbouX zn1bNA!jb?kQeQP(fN%g!+dzyr0MnGI)oCYf745C|YfWEXo|=-S$wMkXAB4o-Jx0Fru>$QdkgxP!**f>kXdKt!Oq0Bt+TKEQ$4>)sGEN8~nDF-&GFmp<*xfUQ5Y3p{I*Ijg0Z$+h+n%dsFnZnr=;ZG~2B-2j)Y_DtSdugI+Urx7MA-P7&&rP~%rL^huciE0SZt3VUaf5<+ zIo;m_Jq|ewlR@BQ1sDzAjP^Z8KtS#@j&q7$MtD6q1QCO~sNBSkJ%A?}$4Xtm`tos* zMmllG#(BsYz`({it=@_$+h^PRyQk9YZ655Tum1oIZno>{CI_~891wB zZ&;@9biDWF(_Xf2_VWanr^|G-{{V*R<{`+)&r^e(XVe^%gU3}EBN+@b1x9(!Nb7^h z7+!jF(~NZtPkiGN?f?PC4?RK1$KK#zj)Z3ep#fuif|PR&0=Pc{$GtI2`gYFh+0y3`xi!jMN6*k6&VY?L2fI zoF1nbB#xjR0k=C_pa7n50B*bx6k)i)Dsz&&kSbt^a!DK$!27CmjzI;6Gszjx9RL_C zt)`E%OT1dOwAT9dN!bUbzc0=7{;#2v_GiGrDmnmn5`OZNfHHC49Tz8o$YWc|-*60L zARP0%868OHjPeg1xyIpS86@yF@s{HRGiNM885t#5fHR&7ij0&e01T7zkTOXi4mm6H z?jSc)fN(kp_8M<%clmbcyzl6)$J3%)d35|+>8_h?rZ3qqazNXR@j$ME1D zasz35jFenwzQ9QU^!biDXCw?@^T`Kae7q9M4l&hn#{seFl14GNAP$T&7L`dEJoWpd zu0{y}k5i5Z%5YBb9vZPog={OnSX=$)R;+wZ!5YhK!$i>RRBmE-0e1~ZPo zAq&XKAx`1~Z5?V+sf=eJf&d{xHU@bhj-a*(<8E`%3|BXXAbXkfo{QJ2Z%sV54prv#R?_YxIgm9azDS+oyXi^eq-yvIVOcG+3l^h>a3E}=9gxk zqEUP5t>v#zHU9tyrpD0m6eEFW7|7~jJQ7bl$Idc#^T0U-91!&J6glR?-SL5jg8+fM zoy)grY~vW@fzXP;-E)k2Dh5d(yZ|Wa(NvS))4oPjlBdqk3m7B6n9e}M;NUja01`P| zoOd+TwNFlu*G;cwZ9es@K%>#8_<1{P*XO5g&W!ky(;xBxu)!GwJ<4H@KqWx{gOC8n zJ#tCOdiajWb@1k#RIUbI=wOy?p1BwVFJ6eb9FTc{(t(3~0mmQct;Y@D1JE~3tZ)Yz zV(?_i#-tQ-5Beb^sV6zf{Qx-wH~`m5npXFszH#om+pFKMorB)(GL}e_(}9U zf_yP%yaxT$wX^1QEd_pd_4@snf*%9bty>;81Wfv#Sw;=O4Vb1cDeJyrk^_ zVOg=ojo8B9#KZz{ZAkgLW4gCOMNb)-b~%A9~t8D-pl?*#R(JVXyjVQw>(eD}t9IUBe=Hj)QC zWT=E^{ymczz{3-fl5voLj1QFcAYdMIlK!7^?w@Y!smjy7@9_Oq_21@o%dGe*&eySQ z@*+O*HKE<=491>Am{tchlC$ zmm8~H{{U9#tgWVt1>jPwVA@$QcSi&&}86h&ZBlE_--+r8qxc=N!v5t(2l~Bfun7YP zYsL;a#^6qI*sv9HFAn$!;f|%Kj!6Fikh(T98?OAY0F$_E1YqC{f;@-GvV7)2lZ+OR z2OO^i#(H#Y=cWkgX-1t3V5`T0!{#W*3JGF?4KMi;h_-_;H5uEZvmKh)s$|B{n_t@hYB<{vej6MqZeNDNRN%tm(P_)F=Uc+M>CLBT&P(ndfT1&QCc9N;K97|A4p z#s<@D!N7tQ%MMofWMmWfTXt|cAmEa44?I6=w&aVt=-PY7OY-l(Uz^tW{axQz>1*q% z*ID^~3vQo9$KWpwu_Sns*r*N9_SLw+3y{D)ynBlhpzc532MhDognthFIQUi9tbr|z z9d_A)Bpv`oVmGlxP;v7XBmta!%5?h`&NV=o8@WUyCy=A%QpW`DZdW{RVs|uVD|Go+ zSpaS40hDvkWXHErw~z@V1op{m$gQW^)mg1|>!tkD)2-9PH=^C?w41(`OJ6%*%R}pA z_(x*r<1$!>29!E7|L-d#^il%PGW3-BprWJ9e{DeE0 zL-1csVxeKOCjm$nmr|3ESgu$Pm<_~`xdaWY;{WH@iZhtJeXYmG3YXV07A--c=b;i#>dI{iQ*N; zaDTL~K_IaN1NM>$&Q1#ez=p`$0dEtlN)Khbg1z~C_P&<#*LP`oMk{Y@v}STW+5-vI3#b8V_3?kG$q)R1yP zIAu~e2cF~*4nW7liQ?~xc7&Aph2mlNiSo6(l>}gd#5Bv#Vn{j0Lt`1YAH_e3*8Crc zUMmMY6RK(l1$hNnF&>=c1NVmU%S$g?_Fc3_ZzjcEe*3C_Z@hXns#n$9 zO|`baWZirN@Jr{(@m{?X1A@0+8e*k}<|r84+lRm^bA=p+&e9sOrTv|BX-gY_80rcE zDi8c4BOq`AAnPhZj+=?+xH``RNsQoOM={Zq2*; zZPHhHQH1r&8IN%JN@>o|#Y5QY-(H5n1sQ7B+46piEhqS49`N7;FSetHGl26J=1dav= zncNK?5kzFMnuJ3Nv*GoHUZ!hd`;@MB`ejs=< z<2-G1u33W2I96+o5QQhE7@xePkC#dGX}yKM!uhkQLj;_Lkf5@(ip~Y0%6G z11hDE;HV%L!sRFJweh@#Tb(oE@06~PJ#!t;Tg<#3~z;h#+}vs0S;J8!3-W!*BquZ>Yk zoUbI8F0h5{qi1{W-tO9U-&qgrC-F37j}iPiwZJXDe-q6(T!#CfV6te-bs!hVEAwTt zia%l>h^pZv_@D6l*DO@VvTBq3+na*(X<b;GR$4I2D^6dLa8oo?7Sxn0CF~_*89P;ASP3C&-O0WVv&EfJ~wzC)fE}! z{{V!0L)CRTmLN#VE~6fSB%qwAF~;X}A|3p+T{XAur=qCM@4x|SGmX~&028e4_cj;+ zQeO#yvvg|8o?tmp-a5C)3iyY#cqMzw6g?NRmR{^oxU3JNA0+`ERFEz z;k~SP04aTM#yX4LMI5Z5r1G>qDBGs+Rr51y)kmmAzV&{iMFivV}I|PTeBqO)Fh1wSUrmWA=^s8KqtgCq(f9 z@eZrGV2({6N!E2eF(e1e0d*_Hu(Ff{42cUvsZ@2J zS_axUlgo52B59dOGlB$h#WJs!_VJ6z$+}O6z8ZK29U&7|)+dVRQ}UKXjjW@R($NSd zRw(9-*{rc3KRXu;L6Q8XShsp+x$!T;ejon;kd~&C-XTR6Hmeq=e#dCqB#Gn}Hqw~N zyEBz4O2>&6OCG#EWTM=q7^L*mmg(Bs%Iem>iS_xu9DYpaQXa)tlF`k{`$pZ@!jvG? zHfxzl`PtchFQ@8WDAn#Jio#7-#R}HYsh>`=x6pKG7)GryTiLCW{y0-A5z^wxS7Den zvIcd?@oux={{V+p8@?iI8YhSEWnnZrMxQD1H;w0*&E^3GyUInpgk=`*QoUP65=S6c zky=T9A@Qf}Gw~-^w}U|NHM{s;&gsk>^mm8*er1eA@g$n3kPV_p42)jN(#k?Ivt8Z9 z39H^2_yOT7%bhz@__6y~{3`fyHnqNeP7es_emMB&}u z+t2YMNe?B;vAh*gx#??MVG26nJR1v9Aqpk6`f&3@ot$1iY8S&P$qInyIUZty+PhhLssdzQGjXx*)rNjdK;Pq&e+G`%X>En_4bhJP`n+}qWT z_>ycYkO+|FkKa|0Z5;S4ZCuHFNhzzw={U(GuNy8@l5)1rSG&~v99ILr5SOyW!w>CT z;|X%qrCy_xQEjP0RV1SCs)I|==3+>t!bNK%fN&J<+A))Y10;Mg&UX6!;evJ{(|H07fNnxI4EMY=FcZ2*W8uxPVDM z-KoDL2pNgUXpynW#@sUi4tDMNRD8T~j)z8fvx{n0dPmcJZP!a}wT@?q!?nvAc6Z%F zZDXzEw9@zQZ`0z+*W`=IyE00a-09da}5K*uA~ z4Khr_sT^(u1GgAcoVGdpxFn94Cp=QDPH@>6zxIcO=SbKxmSL~LPEaUDVYrz#fsg_PZ-4! z^07OD51ub~0KeI4Eu56yo}Xn}>*c3=UvtLHCf+KVcYgI7wC`)qF3q*_>uD`i;>Awt0@mA2j4`kx%XwjE%_*;)S2uW1Gyi z)RM|F1Z}Ha+gQ)8NYa`9R0H zl37teU5cY=U$u28j;B7UB-wV6ueUjDozBwZAePQSU|Vq76dlNZb@)r{PNQ_MBbC_f z7_LbYedZy6-Nzt4?dLmDn6dp4y0?$a)Rhz#4|=&O?iKvWFgG3QcYKSD$1Sm0f`li_ z&u1TPN0((9jkVtNS4(Saz4YvVp#K0x42ubwWZZKqv|%~W!(d!57~Q#2#&ad7PFpmr zmYQF0%Xk1WN6;OmzHnDRC^^W%QbP~`z}&%y%s7>}1Z0w`a!=3z6^R>|w&Q>U6~Vv+ z296c|)MKU*NLI;Etbk{5;|rVspb$vu$g2coAK}3&6!51Tfxsh?-yEy5C-!ZQT0< z_FqwP;Qs)PT4jacva?-t;Kl6rYo{iob#yHB{{V}=YY8r9w`jsl^1k6TaJ$ZyvY)b< zW1H9-~i>3TkOO}&R zyYV-NbZsbkTJ5VvZ*_G%*NA-+1_{qTk##tw+rBphH%?oT(K%lJDag?iNEI#h9<(h-zgqyE`l#x9*c zdWuOs6Ngspw_c0!R(}oX+IPVXU&R^}TEBtxOYe(QOQ*Mp?>s%CO$~y0dh`uK=E4nk z#Cq+7_Zp3hUfXFU?kBf`SZyBI$#F7#)#DG^3*sM&Wz@%nb-g#?7sI>jh^4gfufr_^ zPVjBL_(fZwBd~HGINY2E52B+XJq7_ z%T8;b5&S~bb=_;kNv!zt?@iL>@eR(S;*C~KPV3BTriS#(ad@{j_U~~xw3hbnW%Fcs zWl|&r2(fMSzZ2fst?2OGzLYgcA5(=!v1|(1U(GYx#EiEPqKio-WR5wJWRC&-sG?*C z=x+pm&OaCYZ{b_3>#biw_+@3{6}4+yX`|J3om%rr)9tS9?eSq9%+|J+*JazteMwEs z7Ow`Pk=n&Pb6kA&@qgiVt?<+0=Z*dpKgHd5#H--f@cb#O+G#QA_E*cS_+Lcv9m-nS z&8uB4s%iIHyJ`Db{{YgBx?M6x?jTI);;Fjxr$xE76xS=!Mk*>#owo;T?75n~x?K3| z=YlwrmJbJ+@dZ3hDB_>)s$yjM=I0)Gd$k&zZ%#U?B#t2#nl!EVT-PjVxkb)8w--MAtF^7B zkG`GGt^5J41qR<*g8u;Ih&rXHvv-X*o@6Z_mhvX)r-+vULdHztNg6gf3fL=uZDDdKr-Gc&Mbz8LK0oufODE2=9Erbs1*O|HIoFM(%;ztJ__U0p(e{%yIIJZvq% zha=_rHV4TVV#SUGU+{|Ru@B$)?_IZD(XjKh=DJA8S7mmRE7RqYL}TTHD2Y-N%yJVPV>mr#;Op5fUdC1KR2nWsCvx#MzDVXNa!Pge08 z=@IzLRn~R8J3TmC+5MMZ(KW~|ph&Hv62Wn8aT_~D9CqR5yM?bVB2+^=A|YQckHNa5 zv!#cKbSt>y4=`;);!QecIP(enEzPivqs~bN;I8~<4#8haF9Ud@SlU|+Tf=&U$fh|h zZLZlSL_2WJy$Fq6S-FltQB*4hG9hcHMx#!0if%7krF-m@T9(`0>YlnYD${imP*qa0 zPA+P9QRTlip=s-Pbd|N=MC?x;rkwX0mA0nRMGd9G$dlR09oLlBb6Gr$-)Osuot9;V zZNXF58 zV$m+C0Lr|PI%6F)qbB*I$tPytKB>6! z+n1Hb%UOK%NnHKY!cPsd-ZR4HwKFG(gTl&`XiAjjPg;?ipE9W#^XnC|==DnH}y*%f<`ik&#gCaKO5 zYR=6)8%eIZ+ojsl`m^({CCO^={%efOD#B2n8xdBFWi+DY6)5u6y}jh=+f{8}b2;XT zVg=RFUkby^;XpgMD5_Wj06!vzAd&#&^p@JkhZjzc8KOZjTp!&ulC*?^p`EZwq50Ub zCQ^2yqAmtefX@>H5Wypo!7v#7nPA&k@Bvl;s2~zZ$)=ioG7`Q>8D2Z)V? z(X<#?g5orfEZHOHUU(pmN6Zv~$N(=@;bFD%tMZv0%R1$8_j4Pt3Y-#D{{RSLr-8I_ z(CDZNxDI|`GQL!S#z4bix(ul!8<(Iwap>ADn6|f#z$9*M!2#W{$TFb|2+2DEAQIW# zxZv%n`l3qh+ugR>bavHQ-v0nT=8>x^)%p1%oLZB&R+`?|Zr4w{SKMC{NP-Uxkcc+N z;vlk2tl;MFOpp*#Jg~w3CVY~>AjWF~CMGzFm~fEpQW93!#D`XJKvMi8M61rwSgz7` zcG}&vI)#sgnkb~+VDTe4f;o4ul|GWJ3M<09!@7;3wj6+_KozT*mqxpa+6P6xP{Ux# zxjREQ-QL^CQHA~C;jmR$D-p>xO*<}^y0!JXN%?JcWxGieio?}&ZEBi?o4(hKQo3HN zwu|OFP1fSlbuBAUeFsd{C9$}Y=v&{#HO-{5a1>u#hghywGU{F_SIBW3Vn|#QpHtI6 zXite#KC2du;eP;WwyATbT*xf`9{5Gx8*MsSWmQY9S4g|MwvJblNauKFjLx!@c@&Fs zo=7dPgpoCk?ZNU>kQFUh1xz={H?SXk9l21WA@CGcWf04CDAcufw0D(3FvC645_Y%_ z;Z;&uilVZQl$QCGP!V2rc+*KYP03$hb}jv#TjjgAlIDAPn&5D_pKS=jYMY$mlD#O# zQnE>^leA)+zVcnYJ@VW3fcVpEcLm&6{us1Wy*h}sx$rl`-|W`Ab&)NeT{>S4{hmdE zWq+`wk+FbAq9Unl3~}MV#t(}^D=Sg2*r2wuu#OWRmEqYXcywgA`y_Ku_5*Qt6U}iV zJnsaP5LzaZFv-a2x^ITA?yW5jsdTFM2@sIoT0?HDAD+hHrkP54Wm%Zv9LXjSH<-&; zA<}#=b*I{DGHQB}GJ!FOUf8X}TQi;VpxZ2l;5a*BW%J5p%%TN(BH@#u)twaG){2{N zTU(~Ot>0Vh&(Uz4Da6&I9!k{IWvXi(N$F~8S87*QPCIGoxwm2Qo8wQ1t@NEANcfqn zLuY5dV_0eWbQ@%A9Yz(NTbXpDa?{0Ys_G~vd!}d+(Uk;+3f6y#-x*^5)ewAI@vhB6 z_TNyrXnaXMu(-Lh6I(}fB*}1-$V?AAhfo8FUvL}UlNjhe2TLth_7CkuYdB+?7;f*% z$snHkD`br!x3^C)xNv}|j6@|fF!Iknk8$v?!>{3A4fvB!a9>uQ?PP*oNp2_dpn08T znh51%Y^5!Yw9w3}EA3g!%M|gLxtwUlxhy{{o3p(LyS2+C-*>9B-%q>TrNA6lTANhy z7?7%90=BkI2j{3h@Riu^m`YfELk zJ|fYy-8)uE#oAA1Ehg4h+I_Ia51cmJOAKRiA!UhUm18&SI{JJc1^hd!_!GyISXpUu z_=`aBcA={+-lG%}OdzwiXOiSeF$}j44ZYx5EyK%f>1eO8PFN~9mrcr3rC!RUVJpQa z9(4{`Yok||wpZ(I8TTA9^k3sXB*0?xn)$X(hoeUgR})Gv7wxLzT?oz8r)JZH(x%j0 zt#z5|{Chg_sb)>KQCfG8)G0e5aNm5*d@^10ZAN$my>g znY96uOU&(s^9f|$#5vqpe-I-JlC9GxBj2HkaZV2Hb0wl``Ykrz+UsV#v_Au@ft5P7 z@O7>J%~nfB+HXj$J+D3YXsq?*xgt|NjtijXC8BF5zeBM?&|l=)VjJhN*W zc|w!5&874RyJ4_bce1%r5I$0*4djA+^SlF=edxuT-Sp2C{5S( z{?@#>zqI(V;~fqwTb)AI?%p|XHLnjP#kxnNN~w2q2AgSUH8{{(iQ`LwDaRRJs*Ic| zPORk_UNC9N#@Z;iD_+k_w6xuI&j)~nu@qCQ8c~ief^(^O!aUQ3z2zB3K5}YX*`?F< zYxWEHd*NMA#Tv)OPXK5dm50O+40v~6v%b~!9XCt5)2-$4FOEJCS!i0epz!Ket$BD& z=fq1r6HnH3{Z%iMOt^W{+(D+pC-1(Ut9)j&@Xo8Q>i!|r;qe6egqIlB-%3ki9Cm>v zO*=`_tYM2!yJR!Y6bs!-(i=#_n^K!>ee}MZO_J)}+$?75SZ$i)Ql1%1cDiJ9h-A6X+XS~w6j1&#o@1*= z9V$GLs^d{Oyh3#=LYFN%s*I%DSLc-B%Y8XqZ=<*N-vMR#Ws=}h!(r7*sY0D{l}*@dv>E5z}># z5PxT0+D&P#_*tx5R`A`eyxP>a7CNo|zi+Fgx|P+ngj%Jg;xCzBD|l=6P5qd>A}yau z_UJhn+_w|K;EgUV6TveF3S?B&^iLIEKw}cisoq?-+868J z8eRBr#lA1sd}K6*(-&91mr%FSE$?Q&wevi*gkN6X2&}yOyWb@yxwa~naNSKbQAv3k zM{#w?%#rH2j^^UwZCPOQEUn|V5hQl)<_MHXhiq|5c}H^xm-359(*=I7ER@=Woa#k# z`_$apaBq>yDo}TnH?&)Ew%14Q*bfS_Y}1oB#AR3&-U#5+A=BfzOKBxCM)N?- zBx&wfl@mcuCQB6ZEw8QwVbx+5^G=YNi7-OO8&DWVJ}iBaQ8QSIb^AB)C* zC)8WWkH>dXGV;RHNYia%%kCvnB+>*2cgjE3g7-J|#nq0K`boi|o8!lT} zq}}b-)=#nV8GdanPCE@6I7v-TtYV=l!kbr=R@ai#Yu#wPubw^%$ZUQQ{5`Q^?X$tY9-nh$nOgF~9Yf5YaXgcBuHXVAW-1Ssp_|l~P?|wC zvSn8>tBts318bEAMP(y)Q~|hv3gj``KQqi~$`vZ|rktwOlIrf|d;Yp@eYQWn_+ukg zvRo9soi#72;neRGxh+nW(pu{myH`)LTY6Glze8|Nav7MaoH00jG=TY{uiaXy9@QB>LcaS7LnU1mJR~Jcc;HV))oH3g;Yw@~$c-kZu{B z$pEkz7$Y5r-T9jv$T=hs!!_o@rB>2v?|XB3uPsyU=Jna1Lr;fr(n|AO+FsPwpAMFK z+1mX(E8gqchPP&*g9zuZE=eVDLlzvI9ltM8k(>jRX!K1M z3<<_NVG7gttt-c@UjG0O&ds}T)9)*Al^V3A2u@LRi;dJ9z0_is-j>(5nfMF)Z+_3e z7&Xt@7xsejU7x`J03J_c;}3|bf1=)aM@!edL!{qmzwnHBXF$_+HSr#apv)m$ONB9fzV#?Q4xYFJ$+n)?y_-jV9 z3k24suC-4UTj;t(a@dQ8l}lbO(7sY_m0`Ds`ip~H)h%U`YaK%J)@jfzuWKxjG^(gk zM9sZ?z^F>0lsH5sV+u$$pxVx-d{XOC)bFp@kM*}#cQ-BuK*E`>90CAE0wh8gYO!Sj zN7T{Hu`dZ4N{nAEDAK&;J95S_f_$o1_jwc5w%xDU{{T8;evKJq^S78zrAHdLiPz&Pl*EMkJ+Pdl#((ANyt2L83zCiA!_ptrz%Kwz9p~L-!0n0AX+#Dioti7K(~$Q0AJlT4|?E`}F9&PG1>o z&cE^)PUjHYS|A{kzz-XP(<40cq~w#gCT|t%q~rT)=dN<1+y=oQo+BLl;}`(ot$FKA z*dxkf2nU%0=XV_m1e}cVwD1l{P->)?3^*}u&lzbD;~BvKox}h+1PKwA;%Gp_^HPOU**$>dP6vhw(RE zpTS-e{h@vid}X}XJTb2LC&J$o{B7f}5or1@r8bwZj|=MhSB@|L0JB6FX>B#U(A!u+ zq+eOaT6B`;Ez(UN+9!wfWA?k#JbU85hF1&lzUx%fJVoJcRW&VQ(#G?|T27-Tmv?7( zVwc_@(kxyJUlD3LHO=+4{4v8Gp(=fjSAyE&^g|Q=KI=aTJ}-EK#U2~9vG_UhGhOh1 zixbDPYd>i4=BK8&hv)I0k@iS$CM{!Vx?lD#s?cl5W{-8uwv1tqWxcF-A90oCkfnx| zv`#XFr6!e|z1wzH=2BMITRS}w_}7TpAJr@2;X?;jYBea%oTEpgs~1WQ(W3~sLdq&C z9_%e{to^XI__KNOqr6OW;it#8%PT__IXNt+h={!#7%Pqo{vq z>Ke6;&6UQPFm%&3M$_OI79L&P(962MXZQ!8+;~IcVt8WV$~hG~9j2F&k)Ukv^*crW2*qoR1bO})^(ec*2$Sn56u z()D})01RtdcB$ci6KHxpmx(m9t@vY6*EE%~ZAET%a}V00n@PNrQHo4|pb5U6(L6tS z2Z*KDbqzmFi^Ny@PMd4u!Kd6jmXqAr+Xd5J+Ue0@o9wpoHM_JMcLrZMoUCj+aJeNK zxO%EC3Eo_`YTEL(YwFi4c70@;zMB5=;r>lW8!BlJFCn+UvYstG>)>^A+(QmWV;>CDNmS!00la(g9 zs$I9D>7v*Y0gg_MozoHjdiL<%v=Sll1ZqxmDUsM5XZyeqFhSrQ-lH}1;_?PxJ;IPk;P>irj!Di42caYdD3TG0o38*P z1_0#XZ~){G2;~+f4bP?AdG{!ka3U=Ntu_3muMLy1wkJCh9IBF3tekpXb@NX4-rYJL_9ue!Nm>0@4&|r4Do{?=TBmLMceVH1*ni<@c;M&$ zCSV@FEv=aBdVb@BfKRI(xX&1H_?_cWf8;8-&r@w;*#x$K<=AnMc-xV{BP2C>A$c$d zmx4DOd6~}#BPTt81O5Za=ne85oteq!3@}GM2|lBMdtVq^|z|C z>DRPU;Ow2nUk!)0ite2^w=Z?A)3%$tUg@6WYw>%<5RhfNhI|6wHJnS(6OdvN^&MH5 zWMC!%!Rf8OJ!-IFWzwzY;|0XBLxGdf6qMi|#gGGq1muL z2OM@eCCR z$M7ysQ$>WN_Sz~py{-H-mb!JfbLl(pj~5Ld+e=nLSLQ5%KqP?MN*N0Ql6mrX5Kc-B zqs;Yh8Q=JZMr)a$lfssf)NKcD6uH~TBOGuPWbGOAl(;ez^72PH>)hZ1032}K43YsP zWYy&mf6G?DC$J|O;0!M~<#2Zn=OBv936fxG`~J!*&sp1}acbIGZD-!=QZPIfmSxYH z6d@UPX+~1}I$dBju_!`5%&fJgN_d1M+9-nU;$zP1mJ*1>qIj!0aOE= z;HWEsk+cq=V$HN+1 zk}wNJ9E4H;FNc5HlcZE93S;q5I7kW&`O zN}pmAAYcZ-I0poU+6eO~u3U0%ah=Qlp%4(cJ(YTAKX8H5q1<#5@HP}&WRgx65KmLa z3{S@lMig=LWw^nLz(zJ}OIu4pH>6gUzkiY;6k)Bd>pS%@|NZ8JD z2XZ}0u39D%e9B1xbCNO+1_&H{y-zt_*(U_-q|&fe48&yhQIbc@Mp!;Gj-x(=5^Kw= zhKy59UAx=x>8{sXeaP}5!vy0x9P=&z!_ z`fGc>&r`cyQ9xd~9Q8OEu0UZtqCkHtIV;KbJjAM{F7;Nxs zJM_*uARaTxB%CP#lg~VGagt6dVKjh_c){ZUXM&{XI6lLH&VPtwiDmrG{F~ceUas2o z)81Pyud_HmvtuOOqMPY>ro64!qSvRNUhD1I?hjMfJP-GH`MEh^j)ytqsJ|HpAoJHJ zuQ|?7u^^nU1CT&9#C^2m>N)~>!TubNLI@z>@zhfNu#kBi@zsdn9!@#O1JeL?#VKXC zUhEz1cc({dy}HWXJL}cwEUq$cE(=tzb<;=rcGlP1W39Q>McEt9LVsD;_QEUiR`Loe?3?86mPYQE@0O^w1!6$`|>&rY05533B#@u57bDa0!@OJZ) zWZk2Jeo>Blo`*kl5OR6}#&{!uO>n%C%T8U=(%N3}yMApx{z>X^SK)|C>e@RySy?Z4 zOIv5FweM}#*6sfQ;UU(D8M!b9#T}UO z5cvHLlKHo+cRg3NxZm-@8` z!V;~2rDxuV+T)hVuR{oN{B$-7$T=Xl=^c!5r=u=$kvT}3FV+A~p;N;Yw79H~1t z(~@fMvH2-`{{RIj{jg2CsPWf_BLr;{4~HKO=ev0TE>x-T)UN8mwvv{k%-9+->Ligo z{{Y4xx8LoJ;td)|WBAn5xFA%4r6>_s&Xfc_n`F5#W@PaJ$q(GOQ&kZE2mv`c&|1s+O9tg4}a3m2EnTYten zzhZen`**?{i-%k~N2z>A_{FKhU0BN-vQO~^B5)l2*&y;dM}-?;rA9UYh&t0F6qjhXnDIY~ zw9O;J{{SDpE`M&_Uc&l+h4ei~T=7-a`;$0pSS)UirFE!V`BxK%OJ^oFVK9;=wzH1g z=zkG>L;nDRg6KaC%zh~FpY0nBf!8kXpTrROH{x7AFG%%SV~*IvKAWT7_=RlkZbF-A zrnl3qZIX9Jkl4bL57>VId^-4P@PKM|KMTA!qId!u$gLu}gTfvd(liOR2xEw(QEEE= znPG3P>t0lAyMD8->T@H=*l3%29cvZ8)9&wXw5!44IV60&?vAnC-(91tCh4TOjYrxT zHlmrKV^W z8eXyCn=5Y;Szjt?I(~y;qFCKrT*lMSIvHN-Tgfi%LVcbu%8h5^&b2MImx(klhem%6 z-AgPs*V6bmP_@%M<&iw8t={)Y)-?B!+zErlX?%<4TcyIv*)b>e_4`h0`mg*bABx&F z&cCbO=<;|M#A`C%Ufo_h#WjqQTyKhLW|mbglPoUGk|}JdQpsP=jsF0Rd|9LE7S>ie z?xQ}9vI}Tzq_=y}mdsv0Wer%t4x<%FkK*|ky@)^#A#adwncU9`Ne zkBGa zH+1y2o&Nxu_=|<><@Dt`S=4ck{`ECRr8&avL z>)|g4i-vv~fsp8CY~_oW1TIt*KO&l#e0=z=a0>qb!c%fotEMgVe-FSuc}$HNTWuyV z!#uh;+IA{0MN^{Q4)F9_K+?ixM0$Bmm7|Yz z?`D#9RomruZASk9JGP7~&x}79FYGlFdE*UUbYW4Gpo0AN=EurW($sO1BVwJt~<8U7OLf>SVsg6%3_%vx5lRr2zIFy*nM(!K$ zFZd>Zf;=hWuiKyYWAHw^;hhsy@b8Jdaq$Y~9X z)-`w|l!bW=$r+fEgx85&1c4F@IAO4h<|`G2tX7eR+~atP1XV%-a-jrZ7Ama46&LZ^ zn7R)UB@8z+_LptSF?#a1bfdajZ|U6s07v{i;Yyi~UxURwbfrb8t2ZgT!|AJy?uupCbrpfs?F2|6k;bd?s8wSe3_|>pGrJJn_+iVNffTqLj`ZrRngtC7oR+f zuqlt^ja(qgt9eR+loP_Y%be{QA&w@w@ZZDUD1mIXT?0+Jjaw#3%QVsF4CNhgK_S6^ z-VrIe$2RQ4@Q(@PZLv_MP5z0J0%NfqP^4G-XNGirM_t*%=3fx%mUnve&UWYb+Ki_MC73V+Pwg5h-Vl?zOQdgmTUDi! z(@QnInc~;s?7_+VEL((mp1jvdUMkKv=DoE`l`S=QcR!yiABbNRr7=e@#E6|pQHzhT z+(z-RJKGRg1(_r{EXs<948`sSG2UHk{xj5UA~*g&(^%&(8S{THNhGw_ zwY1cw!dUk~&KZq7Or*4hN^*-@FLge5b-GWLE#9_234B}PtA7T?r1+D^{{Ry;Uk~_J zO+eXcx0+voWqXZV#8JXE71C{W4LVz^f?6wcCB&u({EJ2&e5#JHx6hyOw0;=aU27U= zfc`J|ku+Zt>b5%WzI6`>UkiuTbgA0oPiZwPukAf@>L_k*?i$({rM9)2NR7qCyUpY) zeYgJr1q%34;ycYB;py;Jjo=@Hz6{Vc{eC@fNbpyM^xqQS_?K4K{{XPYm8(f>s`yVu zisERkbe&ckn69twth9x@Fxaj1S9cF5=DgnvJX@?@J>AUf;%z?Y+Z{Sz6;EmK*4oXs zA1Ww3Iil%FrP^8u;J9X6d#F6fkDnt$hX?I)e`Q+?rz*VAlai@PN}IEcD@n6Ij%v(9O@MC$8Ad+cAG`Dw_R|a-0W@dQAs}zdaB|w8oJ~*rpt+khke0Qkv z8j0S<;t~XI_>wk0@FZh0ZH~s`?rB)Yj?D^} zv<}mGW6gQl;FX*x6GtH{S@-sFY4d%R_3H`bP_5+Ywy$#;Uz#!=Nq`aZq%37sfiZlWOyJX*;H^%I~aO>(RBpM1Dn%CJLr<3K(@%Tkd*aI&xrTXWk91CvGOU)9ezsWr3BT6# ziM0!#*+;_u4_zpIsqHWPdEn0v+|O$0_g9uT@!x2cQeNqkGAXdP(e=1BZ{1vKy0405 zvoUH`-;sU~f;*oZcs^Z0@AX|5Pw`iV<Ny zc@v*9B@u5G{SkPZ#2zTtpTu7ne0lI2#kvo|RJXbDb(~%~@u!2eU0TOXV{aattwS6d zJQo%^A%f<`qVVR2apO-A&vkQqJ?!_!7QV6gJ|~*P)TF4mMbwOvZmn8zn^K1=P^Vss zoZmBYZMN4d*&nm`VU=Ms47(jV@pDwG#VO7>cgo#3^Fx|+d6hqR_i<9?Nk4V-Yw~;_ z1N;oon6pI3PvQ+eKYd=qAusWrvLhlq6@M&nhuytt2L zn(AIN)3p6ZR+8BrH0blF=~fzr{5O+Y#Uw=8C&@S8v*wDrz4ep$?_98&!RA>m=I}hX za51)u8Dp9JjcNt8X@syMgC)!bC5mHpg~5g(+rFT7ylRpwt1Vg~a?9y8$yn&*MTeXlpo@6qupYB)8c`hyC3FUqvdvoGjxHPNp5VFAygpv6= zdl>`Er(0ZKGcw0|o0yTlbdE^cVD}Kt@ywO!(Np%*yK+trQQ5^x@mr{0U0*ARt0@v4!wRa(uI4#>0pfvae|cqh;eATd!rnWpskHw96nK6^6}r0y zmKbiYEpG^1m1KtB%$e0=iDb?z)?n1ME6qOA>sHnLM|(A*-B0FSXqR`18GTOlh&32n zO)!wqhyuwZ!Q=o$Vugdeer>JGVSj6WAhxuU)Luj_rJqcTPPyG7ic=&CsFF;U(Ln;3 z-AcyNZ4pPhJo-t_YTU`bzUo#=(QWMB_O_buW_~M+%P{zLCZi3X2W+b!u*)+6^JD`EJ6JGYcA9eCcw)<7)OD-4Wp=^{{5P)Mxh0tuM3KP~ zF6=7|w$|R+Whh#^aUYn=EGjK901q2DlLUq?Olcb_Ah#JfVT|p;ZK(W1;t0^i4~+HL zP>>qkW_cr$GR%Ck*HPTayMf{3Y@lLQ1~570N#91Vb!)}ww0hb5x8Gjv-&Q-jG?JH8 z+uv00(@xgd^Zx+sn~0`ny}KH6G)Xu5bds#AZt+JfQvH@2nXbSH=yyqOtT!$Kg$``Q zd?^i-;`_%Al9^Y_wz2T9h&35xWipjtwOmhY1PIC_-SevELjGP|t-D)t}$qwSrGo&doMl3|51U99;wUXOhGwZrlg6}({fg`lLka>KE zNN(LGEX9N%$F?==3Imo-n^8?9uYIoD)mqxx?$`2rJ&96si+riH+;wtEE2n*I?3T8+ z_upfILuDxc06<&kB#br5V#jIW!lNH7Io`WSf4)?+0Ib#~-x?1&WB~M7qiD%?Wys^^ zY?3nDfp7p0!#L8s)N~bnnlw6-xY$g$O55Fpe=+limoCS0{{Xw%rB|ad!3-O&u-8fn z3|SSt;=#Dsd6htI$OcF|ai00Ag0=NeRP2&Vb*1A2Nm2;_5W@fyuVrbbTJCA#x#lf^yvP(665+zToxxf1 z#X`)WVO@7HspOhS)D&uOF@0J(?vI!;KyLWcIyKR29OHTWpl=*D#l%*D(oGoBC0cz_XtKo95EYLXjM37WdO4_#p1#$OB@q>asQ;aC!j_ODNa(+@#Q5!!f1aNs^K^}vi zqo~2h9Y+Hf$))vnUaxMKzhArLamxW(38zYNOHE?$r(Lhs?$3WsBG}xGqXUt^VUWWo z0JZ@ecAu9g8R|tTLI=zM%W_X0vIbWLhbON*;1iq+dsJlOu{^OokE4DoBck_&=719b40Ol6Sthx^HbhPTTbP8O9igQQJJ0 zk$%LkFG?MmGf{WHA^cJObHL zNhB@^99JeRk(^*;4oL-w!u-xb#(B;$fCo$*dj4LTU-9p$$-hN!J#}``tLXLlYuwLd z{oe(S01OzC2+7I8AZ^dxA2A%BoSgI4C%GLLARL3V^- z5;-6aa7P)>JE=7-cGFvSwUSBc-(8oeD8}!aDcfeQyFRMjHdkM9O}g>5atLO@&Iso? z89b0j-5?MKS0FM>hDKL-WsX#y8KIHmo*S6od{f)c9HK}ih=HHH**ybb_I1oAeJ2J9%n13Y1gJ92T4m5v7;P9apDx@eN=Yu&Eteb-&m zxehzsX>GUN*(cum{{UJZz2Q%c`p${v+W5~;e-_yA7g@J-w%6bTEf?BEN|w5(lIpGI zPvzW5N11VRBD%8sy{+$rej(V2v@K%8P;nV2NW4_G)@?#>K^We!$r>WzvJs&>nC^BC zweccI!z&zu46)l2#*G7$mlCW z5`8_}@3yDV+P;r^o?DW78X6~!JV&mwX;-%vcQb4%CVQRY;v^Xo$L2~AhyW0dhTp)Fu>t%KXe%67TY0XgOh?z&@+*N zk%4hN^SAEw_e2K_B)f!sr;nQorA82p;~8QY0s@VRbS*K{bUMZIu)$R}vH(xb@&*eS z8BvF9;FjrtTC-;G`^Ur@z1S;|Nw{=qLaL;N63eIUp6s002WNQgfZ;8lff3 z!~ympj!4^dp_h;L^0;hrM?1Oz0RvIAE8+-UQeq1*&)H(?NdWP5Fgg;r1LQ0+c{CqD z)Ks7NnYaUj4Uz%R@oxJ|=aK-xXVK-nLVBS8GRi??-(v z(Z9d%D9>{+$0^PfZeYY6%YlRnK?6DDj9>!5WYT1ka>o&M$pJuC&#xZ5013$eHUTBH zA3?v7xtby|&zO=gOprHWOL33@DBU;@Msp9BVE!(lQQ?JtlpPf>%w7Bu^Bu~{mH1cF@Pus&gB z7}>p!8>tN0``8LGOuK(N*|!zW3jBntU~OdsI3NLc-~v#N4<)f!UR##QVYDg6 zKqMYlByC#azGjRcVu!KZgG+c zJm)=e&V3T-Vo*U}nK%HQhZ_|1=Ocmv#zQYSIj$2!1N%ZT$@!Oa4DvP(Lj%bGcFD*j zlaXDu(_z%}f`okI0I*dlw2}xTYh{V~w-Q0;Zue#q^V;iP zt6SY!XzbSd`tD=j$n(fS3K;H85TSVGRaY6#N8ad9B;iOn7j_X81%x0njl%>0Io*z( zbBv4t2{|Q*8xq_sjrU0ak`B|r!N(g$-nq#fsUw~RU~1FIR3|Nv0U+);B!((*FhD1O zxxvQZq!G!8sU+n+WSdR>%J$pmZ-=_rBX-hC-CDl3cDF{|mHKF{shewkb)`xhMw)oY z&T%U&Wr@N0UmPY0pcMoA={^0^NAq=0d;#g?5G`8Bn1>;C#Uq%N{NafSeq} zsXCwG+DQuQ?o@CXzYN)~w@mRysi&C!#eUO9ppPo%Nj3#7f)+OptAH>S0O(b47bDWA zn9G$WpRL<>cKbKI?XC5{q0KrxuIVjptLw7gPfNRbc0Eex!?y0GO%mW(I4nG;moX2! zxeOOEB!H-Xi@in>6pifTm%JK|n#5|B$vW~x&?dxjoMEJl7>-{Hf{4T(2GN?)u<_Nc z$SJH^GJheDNTHpU;S}Xu$!$Du zDgYD{y?*EkkCdtDr(P8-os)W~+g_U4S+BjVRkqV58OGeoPB%{bru4qLc4@19=<|fs zppbyU5rGFRHtjzz2LVVRWwVuH!9e7bNb|a!##E`v$I7`2$WgfgILiRTpy^IP;{$Xm9AFScu@G<@0HIVY6h=>&WE@@YkE!W-V6wbC{PBadXXF?lgai?Q z6rQ^Q2LS0cqG{=-_S;U)U8{LpUasdv9pbO1-89zSx@?n6UEYPSwT_t_9G$D!@IYJv z!N~atBN;g$QvI<4{~<; zhT=oOX6KKTk~sCj88{f|IyOBk&zBOLg6w zZF+;U4@~iagU{UqzrdG=Ah3_&AS=N2aUb?UJh}9RYBn79!*|}EmuXg@9^JEy6dykOC_Mb z=hJ1{-M;(2_UiV&-xBl#j2=6TV{c-3?%i+)Oy)s-5dfTjcZ`f4dbT$W-hg0m2N|pY zsg6c5laNRlAmrp{1o{D$05%WIDp0C;$2)#fO9Pzq!61^OAYg;{dIO4{WS_*ZWV&=q zd-<=|vTa4b&im~Ih13Ur-25E-l zD}%UeYA>*LVPbV0_ z#y};2Cnp0S5(vTPgWJB_CEHh`wuxCJt**<@V%m9kR(9J*qSY_QO*JyagmJg0BN+qb zIRx+k;N!Qc$0mU1upI_DVb>=-V|O0iI0WQ@d|QsEAmca(Aa(U4rgPNelg2YjZTgL? zfu4YKjE;rCKX?E*$9(3w)O5Am+kac#-_LvZ)$MJ0mABJx*ZTXsjP0QFxZr0bmFds| zNyj+OPfwe;-Am>5A=q{8$F6cdU`WRYt7HR^7O(kzesXd#(Xap@@rDI*F}s2Y2LuyG zm!3;<4+rMsBO@N9at>4uxX2=!k4wKVM`XL~*XEwPu4w76^#1_MTmJx8fJZO<_2>^$ zI0NPcbY6gG`s5mR$+P~jaC686^}sj>)7z&~IRenMh;hHvaI474IN*$tj=*wHd{e&2 zfP>~9xX#H3UItE14*>TW?kRf*b)>iHC%;`2)1~dVWn(te`}N<;``uUQmvWBFoFAK> zgQi1rIV`Kk1dcF4&%FR#=LOli=L~~^o|puXa!1NCGCG0Au(zKaGUspiw_tASLt_~L z=hSz@?xXDY1mki7M_iCW(hWc z6X}q7$;~wA^NxJT&mGwZ19wc5>FzlkjMaN4^}LfyOauD#U#Wk*dv@D%?5 zS7N7=5yxJ~oui)pGI+r1Hub^hG~pC{08U$u{Z0luV>tt<9dUpFGX07`d3DL_oPtRC zx{wY}UgM6Ons3;p8^3sijEobV-8kd|K*n-#LEz(xJ)2u6_xgW(`bl~Z>oILDI$zzj zyREmqy%qP=m0~$3aRhQXUNCyMBfdJE9CO0~Ru^iK^EYpofJOmk+!UNHMo(gTa4<94 z*5rQ}&ItKR5(4xCBevc;jPegdRhruG96Ne#URV*w-2^ssoMU$k1_0)bR-M1#b@?Ib zyIpU;T|RyF^WQ^Zr-T8y@Hsy&Ny~KsLmcC&=uS_|f<;Ddq2LD~fDa9{bDU!&9DDq^ zAd*S@xQ(aIbAZYZTt;~fp4q?~MhF{!y^=*StS30mPh4==J-P-M+zvYA<0N1VE86{S z(^uK+cdK^SzuXawUiMn0vfAsW`hS(SHD6UK4%W_gjz-*dBLRT~oQ_E6@dQDN!`>(Z!U+E1BZOQ*fnn|89dPP%!f?{Mn(EuEy}IP?S1 z^iXk=!)FIPmgy5;PTZgTd4>VtXOX)&&q4<$jty5f(gJh1k=GkeL2MD0BP5&=jOVUN z!Kli}pbX^WxfmS_5CAQV9Je2MU}v09)^SfuOQyTNmi1e8*7m-^>@fTDFVBDLLUTDM zoOCA{2P3Wy3FtA5V2(4AIE|-0h+)q;ASphhp*)g*g-=2;ffmA`f(XxZwBsGJF^|Y| z^5pVFW-?E6&rFUFbBq(wdS|yCIZ9ZkYpHi$PfgXe-$kbSy>(vBhKWm?ZqH_~rpa}) z+UYg0<0$9midYM7aPfWR5U*bp#A^*k>RBPB;V{QG7+xd+BAf(Zyc(Po%+us3H7->4^@!?7bEo}-RA9-8w?)|1yx>isQu zvR2jT-M8%}jjPTEGsZ|GkV(M)B|P)XZX}%G;5z{1;QI7ZIRs;%8THNq`LcMXV2osd zeqX!@$>8u09P@+7>66AOOD_ZxImbH}(DZEJ3}*w^EKd~qo3p-}Emn(Eox7{;u8RIl z2@+-iV?1NKE(qLt<#{|~IT^tR9Mo$pgy3*N>70X=BcHj{9E|+Ho-xfL&Vfk7HZTA! zfx~3v78u~?CnI_7jFx%I7>ojX5<8xA$pG`uLO|dSI=0@|w|%tRd)vF)eJ#|<%_g?r zZtqQY*LJ$CnJ5#Sa!(|EC}N1d-RBq~vfr^y4X&=jK0m9XeoedB!q2i~vqX zN#Is9FCRGI@$!SgJvs~%$3F z>$_X_Mv2mCHuv*Sdt2>vcH7XK%*O0CI3oaKj&cYX* zds$nnzTS5G?6>MPsHUGX(`9wtdHQXyZPBOZu)*Uzei=KCc;s&501|l|gPKn?oDv2D z0y0K97#+GV1e3J%$8s^+<`6Nxat{PH4(xj53}j;fH@G}yeE5mrs2j35QMis7c+bkC z+o$1J`x?tdf4^k4`DoH>)2^oe)`Cj%RcxAN3v zoJ)zMU`FgJunY-J!GkZLTi^H>;oKmiuC1zU5t$M9$gIG#Z)k+*01T(fC>4g%q_AMU z4~=|3d8v4QX`s6rTnh3@EOyhnNhC0tA_(?y6q-eqQ6v%UU7=S9`6j-1)AY;haUyBf zcbbtOD?FNI%t#Ot$7yI~B}U>v+ON=p4oUBD#HN?Cwbj$rG}=w23;FbRTeqW2#ivsZ zSDE`;^0mylR8{X5oTjfI{0nop@ejoPXI*B8ZN;s*jid77x}G3mB!FaFMTMI#ySB?C z^RzZ_YmN`(g7I5}BXuz&nGmqXBx%|}yUP%P4)e4$Zh0d5X?om%#JY9P_9_93P1Kkd zbyf}skf|e}$YpX-KvoTqyDi1xUldyxmU~<0jE%w>qeh!KF#?wE;gJb!0>uynIFuFK zaF!n%Rjyc6mdQBBMewGbwOiiy(Z7-CQ>lW5x$4t~+Dcy+!)+VarjJ|n*_kU1jnQE= z@*}G%J-S+3w9K+#KJ}XF2YsXkV+u~&f-@?RqOUcugd|ehTiK$Gf$pxG%#t?;i0tzd zNJAEIA%#f*`LY%<=W5eN)@`*2uWn`2^bKAqqr0~^uzzaACbe~FCA#vgHElXH4-{yS z>L8@Vw)k2g&0g5Qv`_6R4w)97elqDk8PcV;OLhLi@UMVlx{@n-5^-yGz7z0=_Pn94 zL`^UDjG-=NSml~YmOat)tQIaZ_o+$RSBiQxuNIV)w$j>Z)5#xklV_MbJ{oY1R|!R= zy^WkEm8{&IM55D4K2@dLzeB+y`$U$(blo!hRa}GSS;cW{YOKaknU+B#5O$ImY-;&u z0PV`ym``mG8jSY(TbWcFc^mym|3+<8Q?abcf=P z$KM=y?@npW(&+lOudA+#mkh5HOBRN!6^v4(NF&~sG5K*YNP&$`-#N0iirON&K+}^u zgpM8)a@)Ws%#ow>$;Rx4V5-5+#{0w8!N#;X6sagaTk@+n(^R69?SFk+S1&09jfZO##CWaxJdabzEu52&N>y9}Lk7k{!6cEE3QFTA1e3L}NbCh6#t6@HGI{IY0Y@Wl2;^Y% zgHOguIp8xcUvC&7kC_1@fJw;67{IPQd6HhXeeWGwZ+Cas&ttMLuX|ftE!FyZUrn!b zvhY$L_(*h-lgxVP0fu_%CNfG41td8PPInGK&nMVCb@KQJ#~_Ta*z}Q?IpsAANl9EU zL(lPiz=86Sn(}W1gZ}^t9+am9HMX|JkT=bnD`@iHcx(*7jC|Sojt)xtr^F-w02coM z#-Ig0Yv@obC^#lt{V)uJw`mI@Jx0|dJ5M9lp(d%yH+R=dq}RBb_1C?-d7d^oUl&T- zb5cuR@4+pdyYJ-8eS20nTBPziE?(wHi7VzvV@5?(XDGW#$OwFuAvS^m892#18J&(g zvTahqQP=>W?MwoS3CU#{!(~QPZfY8MeNJpg3KzJWJJEv>Wqh5%wzyR}11!TFs33}~ zEv#v9*e(L`pOI0-VFQ&`Eu0TU7$+si-LAiSDcS1VPgavk*W16}wwj+ogN(Ui)3uaz z>+q$b*Z%+}zUtl8OL*axU4rE9h=9u&Vho^e;D#eRz40gEw(9)f;|v*tVbfcZl@)g7C@|fOy9|lY`V?WZfWr znTAy7Cw2%V0!aB-?rh^Es2N;i72AZV`?)68*3(@y*Ig3w()QT?C*sPu{L?$f)2qu0 zO1*a(IHa14-z!ZnXMR?%ZEa`0isiA%?sNP^^OMQoo^X2g;2aT#`G^6}ATeSN3j=^a zI0HS;M#}Y^ypig1I&L_@$t0g(1}dY?jFL+XWSpof4gdi0$mb;V0O3zk zqbGLPM{h0l_0eA4-u=EJmp8QKcXoF3Ni?pOo7wGS+Wr=NIPqtW^bd-f_lC9a0BO2+ zg0xK){8gp+z7;x_tN#EA4BFM6gD-|+Z8GI&zp|3kR9WwDFZ6p|A+IcMWxL-zNIlcx zw}3TGbv_{J-X_welJ`u~d>f;9P~2!&vqyccYQ6{YU-p9OsV&8&tWxUJ>N9Bq<_HCy zt-_`9#SPTM&EP+0uM6u}x<83^&kp#*MAKpMKZ*P`@bkt#9oF@2b5A!`cb1x+--oqG zEVPYJN*dHs&3Ud`TqXVFBSbbZU8}n4EcPEy=>8w^RmP9v?+sqPwwW)B?6ltu_#?y* zuO+%&!F%9&^!YCvRr7TnIh#-MRj#wB>pmQ{y?s!}c^#Ftv&j{d()jrII+btD7NICv zM%>9I2+2#C-@KbqvW@lSvHHIaVWm?Ehl_;Tnwxf)H5se(C8C!n#G1NIRJ*jbzma%< z_D=B?#+l*&02X{m_^;uQ0r)RpwVq2&2jRAtt$a@LOt5Ko_i^eP6Y72)(lsqE-tS1W z(yrlq?MGA8EiUfFc3Mr|uc=3IZ4aZt@PFXWqptXK;lF|Y9(aRO@nCH~#U3O0sqr(! z_qX07vhb|&*y^{J7QP45Vbi<`rcESM+t^rLYC3Jj%%b6Jq_BNdT%8ZlyemJ)uZMpP z{vLkIpAGbT4~F^;_KV^t_?hD`6W!^4DbzHXEwvke5$m2K)9-ZsIt$+o_+wCgN;~Zi zEknaLzADmnJ8Ro-5BQNyjpfaIKY=_Y@W*)d8Pog5bz zZ7s#6v|np?nj;*DvA~nfGs`QRsU;%fMVYedw=N#zZQNgr-xoF5JYDhI;^&C$TG(34 z;~h&*w<{cSq_(~vw}Zo$@*=v#yDqJCl$J6hCMJ_^(nN0GPk8V4$nch*<8-7jrG;T-(56`K3eAO+U|XiAYp?e;7aiq5R4|9w6=2D zHKL4lP2TS3r{mWYU~$=IUzXtcDo&mw+g6<`N;LhPBM3!KG38hGlF?q)^E$xGvuU)q zT%#2RcZ&s6EKFt9jufsopsLsc_7V zC@-}mdxmX=LGprUa6o?Zd4FRm(3BFrK4`&NUMf%F*H_tDd#kR9{z{eJtxw+8>M@e& z)6zG;b#}m zLcD0+TS*ql6~gd5=_*o`V;)4?Zuf0HowxJXzV=r}GmCLer={(t{_?YH;_GGdZ%x`K zY+@Uz_Z+hAzi^-crPwC?6#9`dGHw`5@CW98t1 zw?FMj>KaQ;MPlGFZ3g9?(ScwK8$=GN<>YVL2GUO>HDVi`5ai8qtj5?I%6NNHCdxD%Z{2q)oLhzN(|zQjuAZ0OTK%tNTn6od z7Z#Q>Vh0h7l$rFK%FM`Ndw0V|DC+B}jUC1VKSsKyH~%!Ffb z`=cUlTSbS9uM*sWw*)?wd9^SB2Wf}^a2KM5INT3cF)qE~$8Rn#6%mI7$MzRrlpK(; zKJB?;N}n$Wa3o~qrMf9yPB&XFZC=Zzn%}DH-LQ=*Hlq2Ks_n@sTTZs@*Il(b9VTgF z)b#c9z-H8JkPozpq>pvPSWyZBvWH`WtRhaFmaoB9p zB(05sS~U@GX(VA9?fizc*L*9Z-RZiW=B2(XO-{mQL2q*d5pQ_|If5`F!Bht)V*pO^ zpW^)z)_-WfgVRGC5$YFGKtwZ3^}~zCN?qC2ZJUBv7Pw|P4I?QGrwp#F{DQ=;3jEB=D{5LA zj5ebf0E~pRyO4|)^As#mNKY!jVL>0#VskgUlq@un^NBTL@$y;vYTNUEUou}9Y|iJ9)GV{t4`|um7dDlwcmSe zywUh=sM2qmx^Zqcy)CSuul#GZtL>*t9TMvr9C+HAoW)PfEp%O8VYHT9p!+HUHjob_ z?j+^14P8$Z*hEx+W%#g-%AuFT_wj?bf&15z+@|5dV!?*&fq-j}Z;BduEPvrRzmTZf zaivWmAO42`UK`wTZLd2q3`M<-(lo8}W!+y-h$^rLf>RMHfD2{gHbO>! z;#_c42HXQYN<#(*WescPZ#)XkXyk%ExA6DUp2VE$RMOPK#&GL@hnIukju8v@u!6Y z1(V@Uy(sycwA8ZyIs4)oXv7d*}&m#eG=7OYa3m2UfSB$y}cRT4EG&DMsE>SG}B+bj?0y;7PfBpOJ{p)V|LG5@fML~ zoRw1s4HL(2JPB0Z;IMhXDP6_$}JL`9Sq=OFDC`kZN%A=pSGmB~`WaR+z+lbnsL zTDDj6f#z7;=OMY8-cqM%3+0g^!1-5kCj$)F0Ud^QXyIphMlem;xhO7YtaQ6tH>S(y z%zF{>BZ#Tt-U>OMV+szJvvg_WF-s39>AZQjY3h}e>U2H_vmb_XBRFRyouu_;3!VV` zxWHAcDdFfjE4fP2veh+r%WXQ_Yk8;9qrrKs>N!@Eim5q2dP&{BSnA%*-s^2{pP43` zbrr6+pxhL6iXBqYIT;%aBazbG$Yww=Vs=$hV*ng*6-8`Z2@y2iKGrmrXmoj|NaBg3 zxr*w0tDBcHhqu|bJ;N{|Xot+jfFsM}^;@ang3V!w#Xt6*nvosG9kRXD3mGTmk7B+Q zw2c~}U|E*~KB?m`1o)4`{x!U}mF(UK72;<)mAv-x%OsMOL2|Q76b16UqZG4S$jrn{ z6~^vtOQRfYX~M1K;msJia@og~S}Us7?Y|^EHB43`3yZH9xkjC8X}Cw>RTi2gl)eky z-pgKx(4Vp;z4o8tuNmIm_#ff*<==t68GKFntE11Z+-kbMs}`}Kcpt?2b%oZMVc`p_ zEl*L@Ce=J+qRnS(tKZo8I?nq~v>qb3wzzFJ+Vk%Z4d`Av)cjlUx5l0V@g|=ijJ_xM zKjS~e?Kj0g5AOaZcx%Nz2DI=y{36u;FI#x`#vU{A&b#4Dy;H_I4z#`%)HIz7z@8rP z{{V%2QLEdu52HPdT5gkX{t3O{KM8A|7X7ttJXzsQAI2%-PlrDUydP`hd!L9C{4;NX z@-C0@L&Wzswz{RJi>hlrEz$lY-D%omc-kKhTOB`4)4VY>9yO74i<>Aeez}YGZqd9g z;|KBmzk)sm+5A57KDDKIyIs5SZ;k%|;dOjp@#AZ{?}x2C5vxn7_{&R=NATvG;ctk# zrPaobr~EU}d?VsN8GKaMb*~_y=u&f?`Vp z`y~fxw&L`6Nm;pHZ!ewoKh?ek;jCQpsxYrPNxCsjsM$NEuC4BxcfG#met3BE!SeY2 zXlJ?j6R&s<>L`>w+}<_PyiS)`mOM))g=yiKZ&%NAmPEbUu34Cb{{UabMf)~*g6b7* zGvRH=i$P@#aedNi`I%r7Dg;XI&==B)3X6BO6;zr_FIEfH@x%<7(n7#lsUPtw_cyPEE%A+DS_9 zS0{OCd#fLpaDL8yIvMhOA>ruotAx1muY*_?8xGGp@5C@h?%2$-#?nN{qieE(DD5(@>KoB+l>#Yf80xdKnoIPCm9nA@gUXM%HW zx!KPoZY{ilfPO|Nr_GF$Y9!K=fop6BB$&jiP6kxqOn_t(bA=~pD#VkXTxM}vq!eQ4 zG_=+e*7ob|pKaQ{jd{N}Ci*qyc~&N!cB@U&lw}QLy5(uvq^0J&b?SC{Nwd-HENo%B zigeSo?K?_^!A5Cqw7VEI+j$DKz>Gs~j4(+f8-pnXTpFZT4t`}B=jL_gSbfc;C?!Dv zkU_v~kOoOHo{O&@E$?%C?m;rR2XD7}8nIdu4L@4CLaEv$F<9x2h(V`F3! zf}(ZWKsYB6p;L{Z5(<;^9G*^Z{3V)LY^-u|&H~B1aV?NkjFHiRR9(Q5`Nl^LB!$3V zEbaTbQrO2{2~O-z0bGDolEjlx5C}iJQ-V&=#AJ}bfN}>=2??B>X9QQXN}IA)g{;2E zYd*Kr_ajt5_W6y{XN#Rfq;EVy& zC-01cb_1M~TmsC;tgbRZ8RP=P6o}xfLauJ-2A^^iU zVU4951C78I zxg3Mf1n@EPh6l_WSI&&*GI8{NtCD&EbAyjgy>^OtF=so-{x7=S^Nb7-dSLQ@i`ZAS zN>ETq#xJ(1-Tn64TRqN+WSAK*-czS0l4;7EUH0p%*GGR#jzfdFn6Wq@v1TpCM&Q{b zC?KiMRdCCW4PS}TF_LlAedE_BA27~2Ae>_!bnSnQ}=TI2d9MK*eY6dTyG|U5Xt`8YmR%CJU0%kZ znFbCH)~fDrHWDgV(bhf?JGq#~_}b=QT(`gl7W-)375M&rS$j z7RGqN%|FRQo(BZ+f^m)5KQTDy4i6hZ3_-;TwNE>}8}zmIS6x5g>U8ob>lbUZ-IDVB zTGvj!?WMmz+>Qw7c*YN>P&g+ZypfSkTYz(%_0L1w=sSVWUOB+Qtp5PC9-FiLBa#QN z2Wf6bc;sZT9VtH3gM*BmoD6Y-SDf%jB%Zj>LORv*xmxP!+1>fuTVMVQ>Jrsmd1$n| zR&S-ZUw__f3D>FX*F5qt{O6!OkFOkZGUGa)1_yj(@_HN$6VFVJ0Kvh|P6?U1fsRgj z+$DxdxMPNW2QhKE<5ruK$(39Zl$q|p51YPK*8)f;|H7etXJ+2&+O2+mdg*Ud zC5N7iRj;1+Pph`-`rmDP9ZJf)1Dx~6JdSbGAoG)x$6Ru1(#_Wg1a<0I@$+@T}X$>o$O>4TLc zAajGdl(PG-Yii@KON=PoX{x(cy0Yu0&s3K7>3ez|kem$Q5%;yv zoB@mhlYmGh5JgTd7pFaV&g}OGfH~(m*}xd%wQ-Q@O#E&&wea{rc#6)o`waWhpCi>wc=% z?`>A^TP3eUbL|m8o1NH<0zeoH3w*pP{{VX|praP~zEZoIrd>l!kwB5aI63(z!8?c} zX^#VOQG>IgJjsG;&aL3T7I=3~HyX9Ql;{#U57@7*u8PMm?;}?*Ge*U7x$;D+q#f)6 zvsWH3i^No06z#F6PzTNTO0tF{8+j_(AQQNZ)I2MKapX$zT1qmzakiJ;J6nBTx*k>% zy*$||P^lV_zLjZIk1P09*GF{KzgBj?X|qPkC}WaNz}N>NK@8mI7zz{x=NpbTu7p>y zkPnpO8-Wb$K*>4CRmy|z6pZ67w3EhJ-9+xI5^`6gakw5&&f!<(0Ote|j4Kc^UEQaL z_3QY<+QkHsu6Kx@!dBas7z58cPF2Ar1~z5404swLhm@l29c;FTrQO}#x^L>c`T3H0 zcPg9YPekfY-MZiY1N;?)y8{OqAmew<#&7}2Obnh*@Oav}CmGR?QEVI&&fIn(hIk+$ zU~oyu+z0?<50v9Jmoy_T2|IhP26K=JBOG(a7#xF+^wToLahE)2BtBTSatejP&UqsY zxFno{2ZK`wHr>T4?jc4EDKWEG`jvebnma1RB}|ox~}qr=-!@6&s}c(uHQ{8 zb|UF+~YS5DgWIVXXVX{h>I>-u`{ z_#H{Q9Q@n>dIRor_jBw9ILia`WYU|kNjr}KfN*jN3^E4NMn?k&)bs=%Q|*Ts4t=xF z&GR10a!5V+`}hE!SM812x#WAdRVRfx86*-0?pv;LOX~W3KRYk;zenePL!MX}DJJ5z zZ%uw1tMu*buDTsToqBL_k=M38GI}0If4Py`k3D%L3@Inu`0{zc=L4=Y^72kAoclv{ z$iUBVaC!URLyR7I+kwdxzIn(T5D!i|5^ypB4S>;v;IvxS!wzmOAMNd_jXH9 zm*eNN*KKdmt>X^lw@v{##~*uXAmf3<1}6jsQcRy~a!A1(aCc`X__Kk?86XfCkJpt{EVDL~)&OiX84l{)Wka3=vsl32(gN|?r&s_34 zo_hTO=aI%Ao_%`f)0M_Ef(|j?sU&(FRQ~{IKA`jio}iLI802)|9P$Cc=7)k-_*Iu{ zZEfAP=&$DX(9T#E)Av)`rQc1jd--2`t*))FykHUsPEJVxlhS^~WpbDC6Zh z7|u$u=OdAV8M*6|%AdQ%WEsd92aZ9(AQ6L|ymQmgH%#O;9&-|U09f<@fZ6Uac*rLN z^MhQg3e?kT+O1markY)J-^q13mI?B!!qL9g-)G-t(@vi!;y<**q4+oPRydeOTfn;V zs{+dV-%pw}`Nr;5nX$0tP65DDNAs5+m#U^3EkZOAGEB+{tf(9Mh%7V9=h09JAPXkcQC-l{4gLhZrE9rs{x`(YISzBD0k{H5+xub-i0m{tIrh}1EEm>^aRS-xM8sM&2|q|SuNw*0X-15=0fUA1(?!nyXp65Seh_n4oK52 z2(dEkP!)i#>^3@S#Yz#imrd29Yc%v)?7Qo>o>Xu&p!xY{%(doni)r31>2-9xucyxS zzp%APVQD7OCW>9>W7_K)L*y&4Kl1eyfaO%GV1DhN~b{Iu$6ujo&t* z(=E6Rla<^)AG)_z3Qlu_ousflg=4skfJOrRg@^=@{jfrb`~st$tK(TPtO;G8 z@P)^>Z_0NMHL?RXce4S8Qy;>z%BmDD;0AVqf;Vl(4$;XV@&?ivNr2yWzYn12ENyFS zxjJ2I3T^JRTDz-XPm%tGcpZwIxLXFK`IKtoBCfv5#Z*!I^lMie`ISNeo}DwC{KqF4 z!6XxrwU5&n&eJA1BaW?*qyygvJFritP7fV7b6n$v>T|c8Fys&i$}&kOBO~VIdtAk%JlN@Z8T5QuH6sZ}`MmWdHc9Hbv74r>^lR_aZ_n@i z2pp0KAOdiCV!#{|k%8N{2RZMNROXBoV180?OE4-(+mXm@9CMIy!tKD$YIc(VfB^m; zhXC?>C}KxB1T${r7RE~$jJG5nS%C@$(mrAiK*9T<@ONO~5;3kFR;?(mS9a2GR+a6x z?$%e()-+`rF_aV0?)Cm(T^HT0`=6VCxAB?}g|I%K{gW=Jo+8pj6KfI9wkao{D(;oz zP?%6&MTMk^r}C69oQmjw7-IN=tLbpbKZ$%5;NKM5q*m@G@RqS?$8eVtM+b;>{YO`V zHJasCE1Mf31onnQEDr>>i!HzG$NUsR<5G{|G)ZhH({%Ll29+({;5IjQ;t1|p7~NT1 zL3b-DMv>x;U{AEnt7@-0T$nC@3DZ&0?ULf+-%!!+Z$8f)C^c_}I{yHNJk)_*;(|-a zwYxR7nqdl)JneBd2p|a%nEwD^;f%Gs0+jdmwoWmdvyz6b#{9aaqg}N}@R!mPh%vc$ z7CJGCP=*SV=BlAMK4&MSB$|6WZnU+uu>DuXz9_uY*H6~;Eh9wKFYVe5Lr%86wYXb- zB1xr@nlJ4gA5p%yc_T2vdwg{zxVefL}-`$+g*;Qs&uYtpnA zn!VqFHE$Q)XqV7h>9)2cLE--Z5MOHcT2Z-ZQs!x`^%)q*3~mgKHOlb#fdtK=DjGDcjmWxMgpUFAD5#w$b6HDnla@yMaF`V4MXZvO)~}q`Do7RZMD| z*;;SVf*4?&Wkt?hmOpnJ)jn4_3|UleVx(YIGkpmIYmM7>hVx}-%Bku@GM3{C744-)dH#PQ76N0Bf#IhS(#zbGVPb^FF z{{R;7_?>(!J)er=x06(t!&W-8HKyHA5b)1&*iYUBJ^^*?5xHOG~yl5lt1&pE~`q1X3weWobI3 zXbg!0y2&Tw{v>^EPYFCXwWk=w zwOZI(&N5d~T(uzAKP;np@aR7_EKvG*pf& zSUgejB2yQeDUpJz_~J=7tfCUeAX+j%(Y&SKBp+>AUfK~HdR*4`@sd7RWq4;+X3MwP z3~}5{qjmajigZ|Y8bgC*lc0*$Z)@o z(9E++byR8Mag>skxnW+qQTT77o#On~zM9|mT3J>GrYd-e;poZDtG7-rRTNxoozj)G z>i0<_@qhNL{gS=`d=l_(hvTmcd?)bEk!=>cW23i|eXDAEfzvfDKJLyKW47@Ixv4Cd zziUfNi_5u>+ZrFW$kX3>v)J8!NqDdq7rL|(S=ed!$c-!uWp8f68Ez!HD3DEQvN>*I zc5dsT!z)0oWqL|1DNNFkCLW4^kE1oEYZ zRl1JdZWSYz;^)tWE?QXbmg-fCDOdMy38{#!g7%f`)UPgiCo1)7RkHotjDLA|7Mpjr znz!r|z}(}I4^gel$Zr1Vc%**5Qe9jxs9!(H(wgJsivL!o%0JISmy zTQhH>+sLx{mimpo#B;@YZyklKY{C{~(7k%WDf~(jw6G>$r`q<%CF(+6LOl%OtaGWj9hfgBQl@iwmT;)GZ`{U)<^q z_WO38Ym0a-tt^aob6&iu95%9Csz)5MZf9>M84?Jy98Khr>(Iv=S=vZi8-_n`x@$Q+ z#G2r*pA>Sq^P1PpE>coU%n?jvj5B_NMv|1>OG-L&+m+e3%K7ZITPtmKt9`$Y{6NiP z^~#u7#Y5T7GWOA(+>_cCYR_9Gw=S`4>Q1Kc_-^_3-XwBCZ*C(JBr*M<$P986w;{00 zJ4YHkX|A>?>1%DHS9|M!UB2P0z=k`AsS6-tL1jNKM<;;T>H#Xw?4p;>z06r#@vEHxoluK;1icU zw{06s2OTn451%|YTIWwy($?v3C(~Qo`nlAS*4DbVt*zTvPWvYHR@t?uR~s|PHp}-& z+RPY*z)_BNf``LC@)!h>)tNY6B*^#!jKq)585WZBkgSe04X>U9jJHhIYnduZ6kOaPIytb z9KIl5Y6VsgwV6o4>y6png~m?hJ4bvFRGHe)yA~mos^qI67%ISFca7_kH#WdXP&Wac zqi8|@03vr=>3uD~WcumXZ4T(UD6Ur8+u5Ylb#YJEuI}1BG}gN*#E>YFG>^)H292#4Yq#D5QXZdUSymU^6?WQZ9ONc7u_laeHeWlSV&EZ8KY zsb;|QxZn^&b8>Q}7XW2Y6em%P#Iv3XJQ^8*u+z3sbNZ)bD;li^>Z*M@lN6sL^JsB>~BXBgCttru%a zC#r2HwwB$Wn^&K)_rg1gNVM?}jH7+clwS_tg)9yVC)%|5!5nS@h(H(wcfd89dHWQ2 zDoEJb_{+vnxM3JF_&r%LLl$7uTv!B=Ps}{hh~Y?0z$s7C+v}^A`5GdN^Rn)piuAw= zvF%hb{orxQA%;8VOwIw_aOwt5*o3DlrMF|2!>;ZfMn+17IK)`2*Aq7$TD2A0_@tz? zw(r@k7o&b_OM7{*(PP3)RvI-I58z(X_f<+RPSI^zHB#%Uy4Civ`4{mo_FB`tA>mIE zc!t{Q_DO6l7UmdcxJXO9OB7qhw2?6$W488*?xkhrV$U1CH;xPO6_vvfu@QO@`5=}7 znm02R1I%K(u*^=v0K+o1e%*X>(w6(cel&mEuH00sdq`coHkwdw{K>Y} zp1Pd0mW-o?8C-?kjz~Q5mTZ+7B#uh-2RNqoeL8Rn=M1Ac;E<(o3iTiYcm=xGM(@C4 zqnt1Z7#1az5(#6T+1s?>b!to7Mxrk794Uo8?c!ZM6}*}xwu1Ov}Qk)8-79F7Q5Fi6X}Ld>Ku z0OJhIu1b|+Fn)4zlk$4tk&IT{p%?Ds9Z5LJQr$sSY~uuSy?E*~P?$@vZU-Rwm;~e= z4j2wIo<}(u1Oqa|**mY3eZGDB?S09%jV}ExthDpH>3wgl_AKJ?&+xzPEiY_W5+Tat)5y z`N7UdJb*&ua3qhqFgAhMedRS7Nj_Y3IU^=KV1gGvcwjKcKmqD=fmRK)`6qY;0l4Kb zI2?oWkME2O9$1W$8k%kA$86x_4TmZ-!Q|uS4f9|CavLLPq_s~*^z-hudOdpjSu2C) zd+TkM-MZN;tzFjc_R{5Yr-Olz11HPKAPfN6-M0ko&N1?G3F15voHje>cnk9m0A(Ra z9eEowfIuRwl*TYR{L7WtGn}_zcsznXyU5|Gq;tqz@q$3y3FjHe>GJ`M0l))sp(O0> zqrRJ2{GXMyTWa<)YWixmTl(M1-oHO0nEO;R$9Ef#J}DKVkvNfLLN@J@Hl64IBN+so z;f8bc$AJDacy{*A4F}>qf=_NlP(yt(JgE?7B^@UUX1Cf3s>D3Vm*z4usf|a@2w4dz zS)^PL!0j9sz$X|VF$V{@!;yxj5c4}N>=4Nj+)tLOWn6|}R5rv6u1cJP)q>>6H(Vy- z?V@hlt?#E)y7@Pzh7yIQeIru0Wmhx^y zN@F3inItJ7d5r25dC!J?O|5t`@;ytzn*8?CMB-CpbQ&0$_l0F>WKg*KtT{P5UC4OQ zuhJGj8GJkOF4`?8;)RqtRpO|MEl@4Imdrs=gY6JNm#`|w@y0xv+_kDV}+4MYW>u?SB(k@%(z_vw>H2~pC zmz;t)a3i=ocmVY(7a;BhiyEweFgZbv2dD=G@_89<0V+;F#sCJb93Gok00=n;E6xa2 zC#XDZBaTN534rsE0X*XaAOa5@XFPGvIqRIR4;zzDWw!h6%A2*n&*izD-S5@y*8Z2j zYj@Djc)qF+1b+`ga7jfafxy5g>T(TMalr?J(>cgi!r+3~`LKF&r#U4jApIL_uE5KaL(s*+h-oD2i}BP8_$B(mfN9l*c? zvBoQG#TYmw0l?2Gj@)z|amfIXa!UZD!tuwR838#N2dN-#7|#Hav~%<-YnDn)y)Le` zw@odg)nBc*-06huv}vUF?Rzbow)e76xy?!HK?Hz+6@Hmg3F>eHkCz7rwddwvC9+^YPg@-Pl@oFAz5#@-Sm2G`3E)J78qsR|9sFTJ(NfE8fY!>!Ui7OZ?`@D$p$oIxDK|RkPk)94f z8SH%p0zh%fjAZp(<2(-d&jc|C9SAJKl=R0K>(q{V_4UBP;{*nXH6R9RQjoLO0GlH@v*F%!nE7y#k=bQj_z&!Oi9OI@2GBbj`dY(O3cpl)X zo>kAda@nSkiS6TFO}l zl~jHF5sVT6`A2}ob9Dj#07GEtMj0k%jacV6#?rYboDjGx$0QSdZ`xh0c%s@>V#@I# zWL5<1#l#2BP5}Xx6b$9b1ZU8OEwr^wq?PruyIZxZ+TGcVqotQEmqqe+Nni0zeC&H& z){~=Z0PKP^lz+=e)#47o?PlUJ*Kj=wv#w5lZ1Wd>5xYRoX>|!+Tg#E-s71Iv_LHo^k0&4NkV0Oin-F_O#;bXLACvzRBI&kKeb zGuwi{E(jr`EUZos$^xM{ByoXW(i6LBrk1)}wyN4`t(RX?J)ccly6b1s_WuBa_PXrX zEputRZmHCDkjxYc`{oI@==NSh$8Lv@~ zRnxTqs>0d%UPRHC&#P_+Zt?Q~0&N5-V8?mSy3@4BCjmihC}8`6JRmtu%Agap9iR+g z9ERO9oLo{(U3qDA*K79q?l{G#cYl_hbkhB|y4SVsZUZ*te2hUKHcoNR1Q5q*?~pJ~ z319{(tfUc!92PtfaraJeRFjd6f_rrBT|E9AjC{!=U|`_Lg@C~X;a_MN1g=10Hl7#e zteLcHsLu`v9AG}~N22Zr)DePDJZ&Q!(u;d+_v@yb@3PhD*G9KCi;7z7XR2GP^-j&- zuB~)jt2>G%)o<<2AAD4{gm+dqBpdJAysW}8~Il$w923MTm^%$uiOSp&T zBpd7Im)Tvoc@uczJLqWP2h z+h^L(r{mwQ#faF0oDxnkf(Om_M*|$~$t+GYj-(QGB9{PiM-7q2FbNsYAdK<`1~Y<2 zFfh_gV;mjB1QFZi0Pu6iA2xDMcp|4+&H{|KI6P#@9gzV^Yq9A9FjJ$B!ky?T%G{yKoq|T&mrdB7a3(Aiw=W08(W^PNhALH zHPETAH~0B=UVZ-nLxoM>d-|?psKD!h2UCIivpRo3c&5-FLV3f4%HjO9+kvg<{)r z@~Vx;0N{MNQdgk|arv@O%+^y(l;aH$JunKBfHBj4MhQ4#1~bTEjNnb;yEWq79hhL} z4UgoDp11>`IBbA3ktd1on4c)JFHC}{0RWyD79=ivf$UCeiPuTlH6?o{t*)zkY1ZH6 z({%@>@6!5PvUYawf4RRSwl+wE=aEi2W=s-D-RyqoJT7tuTWJ_DII)i#+;kjoIL^_Y z20CN52*^BuMQ}~4-!^wNoStzfKt=%|01s?rgWU6zP#d;lLxax)IRiQ5+}2@=6d?yOY}j=-<|qe>vjHrh1Qy#_uI6H@$-X#Ks%U`{nb4=13BdS92yR> zq$neE5y2`q9FxHv!9Ol=0LkmlYt7lAU^9{a@L`N7IKWZV?k70FJ$NRQ?2x`NNhFfE z$UK6;^B_Hk01V&`pwab!cxb(K>*>1N=JkK@PenSmoIu+IymEe0 zNyr^OQP6?+LBPrN#Aj2mJggIfc*3i5&OuxrLSt@uE6F^8w;3gqAej0E8;b%D1339} zl5hayudy|1GIs&BOA+$^^mCorAe!yEs_U6cQ_cNn^e=AZXzX@x zr2h4C?WdLYYR`3TeIH#n(C=4Kw{N=1z$XrQJ8(LT;GBb%B(n^B*(6RbAdqK&JPhCv zbCHesya6##w zYH#hU)c*jM(sn0nfsWv)$D!o%%6?E+Bn_4)4Qn_(?Dy8z>h}D*Gmq-nhV+%vd#PDj z+pdn?eOCPsP8M=7Kk*^A0EJM^DN+vOhQL5nAG!(az$|;(8f5R1JUwNOq`Sz(6*&GZ zFFavE85@bf$sS@nQQ{TJ8r|5&LH__%#&QmE806sg;~jg|h4F8RFhJKe07wXNu|URg zgXOL;IN+(^fY>J$9A+6c`?t69)6?PV_e)z_duzBXCMCb(N6PY>*WJ zBP4bi$OI1)n_lrW!xQ+1`XELz=gM#fIr$L*B#sFIc+VUf$d%e=&CiH68-~aNHnw*M zoM60?9C6U&80Q}@1uWAI7s{zkY_8NIzRsHJo}bmMRC4 z=ex~y;hj61?+{yGF#EA+dOn>5#E`=cHN~)BGX%Cn4g%w7JBKrHE8_6W(^xceujDv&Jk`6&Oq7Vfm48Y{@R~T#zkVhx34oK%EPXuK> z#6S$Qk-$Eqrx{(u6O3n{QJzg8yoh&@VEf~_W(BaL`@na`IRujKo4wQXR`Tn0Z~ZAP z^d9y(ykS8MI)WJF6V69ZZLRo87oQJ2 zEHlh0r%&v|b<7OgMoG$qZh({2d8gWQz`tS-1AUwoGzPjwzoweDYQj7aXI89$d!9nwGu*OLvjsOUE9#r7;%Mn)6 zXi3Pw&}7=%ak|5%%W3ce4jVaW_L5Iba<~{9aC2W+hMK(|t-T(q{a)Ix@3EW8aT-2&biM6; z)|OsL`di5QuNdzpA;{%PkAbJo^Li+6`u9wqW_4j|d*YfmdG_tz$c2jQLy%YXkzR_r& z-I97cGwc}cbnxFMjiPkV8a2FFVh-W}hAiM0A1*in^T=bP6}u??){&*_;C;@=Pg zIbGKm48s8P$tRpI01`(%2rNS%Nm@x=^h=ii0A;IPr|F~kc2_xGM_z4nRf^Y6WhJ$) zv`+5VdcK=&f3#wa)xUS8+r~%D@&-aN-x~+s8QQ>Qv627)ja6M%Kor?ZhzP@^(Xd>S zbG4b10O#*Q94NuT$v+XVjeJyt5qPUvBpl?=HhYC)e6z_M7S2yYlTxq54;+9(c&}W> z2v9B~W63!HJYe7vz!+hbIVUVSsppto6rnWjy`$MJ?|bdnPmwEy@tek^C91ug_xE1Q zcmDtbwa>I2JXC($$#aQ4>nv3#pOpCLJ1 z=QvpaEyz2UJ9D@$dHDt}iM~03{{VO6-B%!h7E3+}`Hlu)e6R`$zy$M*f=z9~@r&YQ zKrB8ooke_??1V$2Sp@IU`Qe5cfZMECP&MISc?+E?6e&#JTtlqTJSgq|e^pa<08$?P{)&RtyTz>F<(4!BwO8N)EzYYHYXb%@a zZ*>_p{WnRH4e4{@ZBElbNf5A7MWlB3nuLXvp~M!&(a4OnU^^L}KMf`Ox=G2}H-d}h zw=R#8O{cQeHQ#d%Ok5_VI1{UXu5$r_C<3Y#1lIJ!FGLwU#8|@R4a&p z2u^av7wWAu_J8meiD25l#NQmWD-!vRk!pIT)`f;X`=z3UmO-@~vY8}SKP!cjxvRV1 zg;xyr-wkj4Td2cpFOc_b_V&_?EO`bguYS*&1c1K8w%jmS8N#YJEZd#!4IjdiYAxy2 zMOxPLy`Hwz^r+%yl3v#C(RPwf>)q<*DOp;}Me;r>ywSBCKKA!WztUx}y72VVT3v;b zZ#gEAiJQ)1g$z#{MKlk93{s}aPW%`^c4j8>DAq=J%9|v(5$p`BnBtLTk8>z0%^7yd zDx+uz*uFE`t84Z?A+^+|o<9*-+FRbO+)~<4Z>jil%TCeSD}}j@W@l>%wArJYRgz1l zONrrkO`$xo)#gU}icyqi?6!MtXJnq% zcDG#;Z(H2=aMO)SP?NRV>n6Td*IVB0Xw~0lbshjNJW7h}t}XOy=?RTYe>KhCn{VbW z<#zyyGDB|Icd^6o&#ZXJB%TY_P~#WAEAY*iiYIN9aj z51-HRKD8q632CP3)+__FsFG=xeyt+s2EkAk1)S|5F<@WSbqfh~4I@OcR3GWyIku66 zj~WoR(_LI|BovhpEt-N;Bm%{_VY{-Ee6IJ`n%BG4D5mc1r$yJxU3hU&=Ec*pPSS>n z_T`fAtM$FwXDO<9lTNvkN3^w`DBej7Yjfulmy>xUTSlxHq3BbPepB7DmsX$TG0SL; zxC{$hg4@4|Qb~$#RpI0Zadz8~`~m3~pAX1k_M2!J2W{mq;+v)bA-s#MZUA9pRmV9E z&S^h@^jQ}ZO*CxF&ycrLqaiFoDzL>EVUAcv!wtrHuR`s`^G?x!4XtL?tkb>P)i?8g zXVc(l)styK#l{NGQE=r-*1OW`*4e$2YeR`$OIg!rO-{<{7M|B_)L7Fkr?*#w=ZQ>n zCCpM1Mh5j@m@I%lE3$qx{8qbmQ>&Oj4D!6XcZY3uqbB(nyq0S>F{vP{w1*jO@3BRT z?}t7U5IB8RV=Ww|Qh08la>Ow!iK2~0Tpm+!!-LLAu2;vu3vG0N3|neCP4u30mv%c* z?`))n#mg$k0g4-kxQ0oZMFL5pjuq<8>Zf->G)vtc5bo!i|YuaQ=7A;Rs+Zq)Lw)aw~ zLD5xKA+!t<5VmqT^bsz#r@rj!Omm$1I(xlFybHM#kmrzl3EQcspra`&~-X`;Kny!zz!l8-0glG!z*^0Ira?E7y^Ew4&;l`5BB>u#L4(`6NQujSpR)c22u ze-red0en07ooj33yR9?Co+-Hac6>Rd+GrZw@J+Sa))uS-BxzH>w z8D1>jte2D9l}Sjri^(%al8h9M5?RTRE0}`e*E-|DX=^!_e;T%)wOuS5p5+dSgur~*3n*iJs(bI;#Uwt5yRmt zQo>W^N~Cbq)i*Sfw>4QxRi3xJVB)$vtE1^J5dPcWw5N*iE-!pR==xf5EgBHUYgS*=o9 zbk}|MK6bAk@fIPt;`15RrzK|^ik#e{+D}Qvq^-KO{{SWI*59_j?E|Mut)|^*5)h$6 z-FQR8_mP0Pk%(K}Chk^dMv-0ImI=a@O`&?G{{Vu5e$ujqj_w};NC*Z<&%^yH+st;A z-J~&T(P@jmUonQ@y9ysC=UC83^GfOOhcHI&04!Q-c;pI)mS%Q^(R{(iKoThX*g0U| zv&gwKDi;K}Sp0%P7+^x~jgggh?*ruoDg+=L?64TO&3g50)sk~=E8)GhyV~3Qv^*-A z$F*{tr4DBGe3ZFX&r3s2yDyvR^wyjEb9`*HzJmJe!M*|23>Qgq8s^Jg)8moRE=Dat7ui+izd0}#%4 zBB?@#N^J_E2+{dtV*JP+RvBee<_O}9JHC3v+Lbp4$*eHM<C+QfcS_ygg4sAhJKX*HX)1*Q|3He5=?NJ0f! z6q%Rj9H9uG4H)M@1|$HDzA015#GmmXmvc&(;P58kO6Dx|Wm6-N=GO};#^e*qqs(#K* zzSeJ|Zp|NSY2UX$#jPVx`xpExAA*-IB$`e4`gP6ZtmY<(hx%NyXUkS4L~ICc!~nr$ z1+VSN@nn~2eiHl$ZPGJu8c2zR2-d3zN7uHy@Sc zEEulRqY686tW@HbOMf`+O^SCBx=`V_ZXdfDUoDuk5JpBzDI{R1);V=cJJhW-teRCD zyIh*JYu`t09oJhT7G-*ojnpjCi&W_;OX0sW_IA5lEx(&hzQof%Y@dj8__IUR?EV6L z3X4?KH7z?yw20kLZ)tNhw<)I~HuLHN)&nS*qfYRawvF2D;AoB?+N|wAYq?>&@Y(ov z@P|*e7bea$o5mgy7f3Y1v0BAxb#JLYr6sH{X&Hsu7Pn>zJfb-m&0n4#3({?_d`s~5 zE1&`Y0EFhy$k2q9Oi=1}lCu}ci5XF!VwOhFn62}SSL|MsJ=Ui#opjf;4?g9jk)n<# zxs7CzrEJM0dxFO7uHY(?=1t8a$UM9&b5TkvQo2s^Xh$0_V!I0+r(FXA@JSW+v>O0_ScPPX)Vlgv{ny1ah61$=atqpU-&2h zclQkbTxs&UZIe*dwcFc=j^Uw#M2_LDOz_C4 zJ6{s`cFpu1R^ELtN^6*HFXP=Rz*!n?HIU4#w)l6oMh?fs?&@n z(tFCyw61;C{6ziCTtLtW53L-AL{Z*}2+5MAh6gnEyLBh^wpUN^XwTXeWO1m0HhP^gr4z!gTnZ@%v@u=(Zj^@D89A(npY8YaSlkEywRS`GtJ zHPdb(#jc;Htbh>8P#Z-+Reo$FU@$Jtws74|?YnCp6@&J|H zFx=yASQq)j{J8R&bp1X_iovDnlY;KbA-cScrOUHOVclr$HqgjeE&^~`Mt!J|J%gdb z_-5#Z3{~Q}Gb<=3=K?rbG7uPoq%s_aF_7`EEaLBHQLEnS>1*!YUBxYSZ9Vqtc-U#; zsr%8ZT1!o1N1erct$W_dt7@Ocw_g6l-?T4@9G^4c*Mq=h+lzfl_S#)G3GW#3FLqXY~YLxS4?n`aZ+=s*{iER zg>{Qd$=|nadq1}^X(;<>w6%QHFxS%8)lhBuUsrFN_V4&;U43|8hQ1pkU_xJAyK)#3 zcdJDVZX6XPpD^`c8)E<@Puf$&QGBWJ!@|#yz$@ySq^e2WysVj4I3VK%ahA?l*N6=+ z*N_rUSnnfh;PuW`TNnV3ECMr}V={h_)>1|X|G*-oKweQCGR=G-Sb^ipzUWHZ422uT_yRR z%HOoCY&rd(J{d{5NBn$GuTP)#pEg?I8HqbcVBnCTAMXm!`#{)ETg?5QeiWc2{nqg^ z?c7`pmDIqp|I0PWyZIw$@F!zP;a0x7UKEHoV+b<0a8r zoBmxbWo2%+>wOPh{{V&8;dzyT{hodqC@ewpue@6m1z|H3^CHz^V552*7s~m2gJFRc zWB9S*CoPYGo)17lB_Q!<#5j}piQMtd>ask4jg%yDZIlwFf51bI^JdEchwWkbR?D^fL z(a+94cU{v~^G1JLX=@5;+9@Yap1%s!xWC2krk2yzEWRuF8rN5zOHYJw>2LN%k`}S} zmE&fT-1#z+v7JV3MF3@D8CVxs*?^N0kyh>gDR^@FE1xq#)GVA_G`pek4AZiz?{!D#Npa!0w$F8d(d!-}fkxQeO(Vnl ztKC0{V~LvMTez8}c&3`^V)^2d2aH1#qV9tT=X!^bZm(%RIMuAJq_w&5rlM6P{?m?2 zi~WWsM4nfN&pKpK#0xo+TX@;btfk5F##h6vwA*bzTkvw|mwKEL!>d6uu5|ZuBQ7IY zJo_m(%A!e1$npZi0olUuA82SgV{4MlZFd&3>#<$R+Gx#|k)%gwnhiSEVIlccnC`(b zvb3^pjb%qx5}}P=+KgtsojXaj7T3C;FDsL_nx^k%u7}ug&R?8ksA9P*D5qKpMJzuf zP6@}G_fehI?RRa~`yX5W!yg{}QSk0>jCZyl2fSh9FAZx^d?$a1iQzv5YkogXA4k!2 z&x+G{dhh#tN7L@Ke+%8;TllBMhfLEochchVm-Z~WRGuKyFLdh*ZAbL$#6PvCji&Iv zhobyO{f<9q%RO&O@Xx~CN5xUVo(N4M(_OjviJjt(w6aEQZs%qW>_?`Ph{66rWx2x!06W6{L{3r2-v8P8CooR7C zsif;(I?%1;OXC&xu@sWY;$v?eriXhC-Q@7Vw?f|5>flNH5AhmkJU!s;AH;e_q2g~3 zc$31df2R0?4+s-wrfQxa)FuAO@V%C|q`M1yt9X*}k4d+=Eco@#gp4`87#h{{VCNKf@W~%CZWJ7Z*}E zmc5*5Q<|sCiJjcqf^O+MO+|and$*O}$(q==vDL3F;<+<<6VGfUjBi(4c4$MZpD|D$ zFDL|=B(Ww`W#7%oET=CVEXB6tGem^^r)VLuAOR340kM$fK+X;w{;DqS?k0v5P1DN3 zuA3ekKZwQtVt-Je;9%b`ZJ-1$?wTS;rD&Fj-{_E$Ym%ero4od$RzR1ETP z2~ruegOJ4l=MA{!)GfMzWx7&R400PFaxeg3GDzHUw3D2%#%s#H%c`IC*S9-CiU$++__CnON09KJ})eHa6P0}?*>BN!atSB#bYns>YRr_9#Q z+b#R=>Xx>sRB~(V-pR%~Sy^9gUzPPsT@PC=8w?AQNyx|>utE7-Abh2OAimwa5thwD z$_Zj8Zb(0L{Ko_wg8O;ruK}=1jtzNI!ui0toiT*~mg4}DOBKrh0CW%zPT&bR&4sp= zxfc`QlEV(eC*}kL*yL>_U=m2jadE=N>-S3D>sFrY-A_w9_ji814dH=q&P{*dD_h&< zms>9`w>>X$;0fg88$pPJxNh}r-1EpdVVsUe8|EP3+JZW4i;8M&dZeeRJoA z&3X%&z`-~L*Z4?a21q#LJ6bcela{~~eT6a)pD8^LuLPF+z^decIb4jKmd-~~!ze|5 z@9&>}UD8VX@6~l%n=BMlPnyp~@UGEcF1qQhk3~zJFdv##Vx#z;K)_&lmjs&1>tftzFvM z`E=91{)}YOa1We^40-b;7z8i}AZ-~tiS!I}&PfECSR?%-05c4kCMT?fj0Xxb3FrYJ z06O!*2Db#|`6oPy4pfqRWO0ys3}=p*4&4XvxMRxW3E}O;z@~*O$7oyXjFf8-?i2RIhdrc@UvkiGCmaI7-LfjvCwWN>mUat8p5kQ5RRVgb%@2p@Fg zoO4!IVT^r=eqMy!u6E_Je(26P0Px2HoM#lE-`QJRPixlRj@Q1LUr$q#Sv^O4Nv8My z8tEM@wb3``dOTMeTI6}GNx{J{%W@m!Ra1r-E7W8j3CTJ(_Li4eF}FOQl&caxZKRy! z;~XmhcmqDZRMWsPHz+tK3JyRgfJsuMgX$LwFr~4R(P;Xqjet|RR|ojcFdv*_Y5BPz zf~1d_bTxj@mNv3!C8Sg9Wbdy}Cca0Bh{~$dQfh4`-nuTUPrvU?>2tgqRLXu(4g+-< z!2{Hd!#M!p5Knv)nB}p!9TemY-~o~jLj#ZjB!h#VFj$e+sxOIHfC7fVz$6eu0CT}y z=LdFGhHwemFlra^3+I8s843sYm<%735<3o=#&U2)XL&|eQI?G>wDrBe4|!{MeY&1K zOg<(pCnmk^b$VLXTj;HQ^!;qDmY~Ffs-y1YfN{e%LBL_a!2k^P83#2m(=Ix*s01Dg zrbi#ejicWr>^UUkCbJ~h?(yLiL@k_>M;STX zKphZ;KQI{}0tNv&;M7k%i^(IX+utM{W7h;@7$>(;SWl?jHtomImB!UQv4fsE=jIq8 zKd1x$_8Y01ASjoJbgqfH)im8%V(i2RW!3lH*a8vbd7_6q@CGJ zQlys3vH6BT$INzx;9!EJ3f}(!gs$pq6}OJg*$y^4WTrzG z$q|_OJ5KG#7$m6PKy^wgKg^#hN!iNjY~J3M+sfO-6x)mBz2#@GFE4BL>3_hfg4rM( z9&&n>Y@Fu@*yAO;<%s!EhsnZ{0VDyQ*$3od#^MG5Jn@_o0iybVJdwcwo`CHve&{Mg z4D~FhJP=s&BKvxi@`I2^7|%a2zz1(WypfP{eq2$=pH9xtN74RXy6n?Cp@vN>t*>`y zx@&!O+4j?-HH7kZw~(^u1UEu5d#B5s4&ZPB=yDs0PfKYrf_Y)wAC%#8c>w&Q<^vqy z)@Sym-xx*dfJ-SI8w3!81cSFcWNqxkg#OdL>$NaRKY4I6Tc5f*XMw@T13AF#R4Lgz zy;64eeXY{}0G~_Pw}+02DA`#rdHG+i+HdEtV^~RcFgD-}dcQ>UqX^#W!~c)41TSae^_7Z6~P&<0R)Lh%}<^=O6+yPZ`4w ztfvEL87eW)1eL`Oj4b{w6SkIGS*`B-^yzIGomw%CImsm2jn$U>YrE@z>r-?yMgmNH zur~s~D-t+~du1Tvg%^Zvx7_*Fqb0Yvw2w*pHgyDGGoZz-Pc76fUya#=z z>Nh?%)+V;pqm_-cZ6jOSn@ylbVtaIUlIL)c$>wcTRgHFrWp?wHzSC~+FXGW2Qy%#Fh-CpYF%;h4h9a_wc&TK3xMtJ`&}Z?4DDV(_Z9D7HNnZ?ags@LN2n4n;HjqKV1pL?~c-(SSXvcE74aVScxB<8kf(T%{hs-mTImj97#}qCBBkrC? zLC8440A~OY2n1vR4hDIvYj8jv0U(3P{Z0ltV&PMqZ z^O7+i&63BG$VLh1+#C>2?BsduSFr{;kn#>mR|f!k>;Qp|F_H);JS|<1Qh)-x&m~6- zA;(dk5T2PNl6&9+030&HMMbun>!V%M*(c|IpDUhKOpcuoiYhj>?-hOHzk6BvXtqyY z<#m8b104zEu>7(PMhWQI2N@^4$$rg`n=8O4pls(Sl><2hV;?CXdRHhJR0rRMJe~j; zBcaI00|a#H!y=^@Ax9+hk+_g@0S6~?vD$Imar8Mnbuf@l@=?C3`d?J9rT4qjf4=7w z@U&puV<`5%jo;n2o@=u8ORrj&oSu3feQ-0Jh9EJ=EC%2>^vRd)hrR&rGJ0T;aBy*f zz&wx!4+lJ;y$3kp5uQ&2sPxaNA2Q<|I~i8-RDw$k zAC>7Lxw#OLxk=%3l;mzDpDGAoFhL?WW3-$d#pygW9;zuWRkpT{+h0pQz2D!A^5&D2 zqW$Xk{I+Wj0}P^xbim*#AAVjobJI|vbQgi2?L$Kd3Yd` z$=l8cKzPC6{ME}P#F!Z>M-Bkm!<+&Fla4?nk;uW^32X~#aUmxRpl4|u0yl5K`Hnys zBbNgMharHf`l`RfeKoS*ZEvq%&tB&e!d<&1Zo2E!yITCZG;|+nJxd-(J;}&y_Q4%U z_26W3ONGhj=HTZU?grpWe6 z>Uje>0F#4`2OaRZ$2BOqUgVN+dgmjPlk)b?a?6}_I0Crwc0mBKP;xQbt^vsa<2lAi z&mwnk3s59!gH*wz_xKc^z8ZjDW;*{5cpudmI6dy#@gzEDv1TTaZBjjGvT@@-c(Sz~i9k zNbkdB@sZwh!N(xu9G*&#W61*<$Q=*Nb7$?KD9K#%r01RoCm9@&2pkeX0ZHPy<%dyf z>sQv@6Ibi5_e-sv%yIZQ#++jn>h04{HK$A7=b8S|3nkyd?~5_pTC=tAAo%m`eGP%s655e1*0KWe1AvnGXB8E$3)gb%b{jvx(;~bLBbn7?53lvm&iR zikht3yrUHqn|j6xJue-5D}BfE$BvvAUp$^)>?%=&)*h;ErAHL4Dr??TO?PU_)>m%! zXN29~2Z;XwXzPg(jELdVbbZZxDkv%vTf3+hC>S78^98xgNQu3sg&OJ44YU zD225>NMGyM`H|Ut=~mjt<(mjtB90smU2Aa1aPf^(TD(gO zX;oR-t}Sd~wSs$worFyiy2lE}o5YM9+$d840Av$?#}>=hAa zV$wsUwS)mBR1(O|E3}aoiJ9`UkEr(a8s?2UjuCd1xm31_yi zkE5m6_QdL15A01U$zZy-j`*}8r@o%)CG)Q0mRV+<=6HImYrhEiKf~H)zoTe+Mwe~< zr>bd?t&P3Rm$#QKb2jK!;iWehQLsl$yx~l*x6GOl$Tne*!}DHf6WwU`nvK7VyfNe5 zQY0FU&6-T=(eN>HPD zIJD&sUPVnlSlzg-ZF{R+{nroS{{RQWhi6kAPX|`KaDLXKjw+&*B~qMK8nK_dQc6{2 zWTv@Yx}(V4C8JF!(Dc<-Xl=-r!K8Q&=2;|0jDZ@7UwDO@B3-tYd`L&ypYTonR@eR; z{{Z$+opi`8S$-+WZ-EW!$!$I7f&6J}7=;6}DuZ^ANwQLr%XW(+g4wTvn&ZTpln(bA zn@Jtl`t=iwkt}i_IizS)biQenA!!;Q@$cU8MhoZZkJ!lfw@EEQQdyk*-!}X-r9K(!4$X zwVjo&`yb2sJz5kq>NMz0C@fbZykiy1DLA(qH`7FwuY2g)NA}tKVPDxRd^@|og`V8E zjjSfRGtUgx@?Ov2kpzImIgO`{L7aThu@@>D1eU%IlJwfgG>Pz%SyD6h|f(SiHv8 z3$p2fz*1vyVRIuE!-R4oi>}!|>eTXhpTyxpjbl_Hi-Lmg<(qMHxlYHEdTk5>paGaJ z8S*ywRmhu@{nXm#YWk#`x0AEo?`?JJ&*@de^y3xHUKeWGsI3xT%lho3`r(H0)R;wC0BM`$BO< zTICS*)HLl9<=8XEjTBc`7B^SXNB{v|GR8HMMiGc(V0qsXcq39vVX8^sy&qmU8II?~ zcZT4q<7`c3Bux@v#*rjZ&jf}vP>v9^G5T11f)t!2trV@y-L99q?$b-EX|&samDkEX zrG;{`sVM6u8(FrNswvA&ZSOSwQaro%&;6;qJ>xF}H-l{(S@7NE_PwG@6I}@I66via zn(8k;&e|)6>Xw@1Q#?|vk?Fn?(=EiIytR&7 zjZWiHn&LHS%0o56+U+|7$L1?XUsHb69~xlzVJC+4&lP^n9}GNkHm7ZWd#8^WYW^wI zph%z#YN>2AJ!4Le-^-TfH;rPy7iiJ!xDk1=nLj>c`2PS5`jmQ=*T6r9z8to?hEZo@ zpj`O6Bz2Q10Y$&p^@j4{k$z;Ilg+k26k9$;Jzo>yb9wdbE;G z&rOf=U9aDAI)&N^~(Wa7&hI?o^y4-#T}U+O@514@-|-@V&`<`@KTN zie1X3H8jy>hB+g{D_cRQUx@PoERh?i0FVgJl^k1MrvCtho5LD}k2`9%qye>zay)I8 zRFGjqT`4=%ImBTcI)!+{2R>Ub?FFhicwqQv;B%ij+9tKsq;0cIC1#Yw(X&QLRY!Qh zCNNYk;sjED(K^IQ6gK|=4!j9!@f1I}vebmEVaqUL((GcTqGm=`;vkYMmu5Ya%z61& zyx_H!;b(VcWYo1*ds|o8S)a!EoOW9(l1mv4Y~85hH%(}pi&A=M?3%OFbJAB|(hfrF z5MZv{mti2l4h9XfNteR89%xg5fU1$Y!e8mv4DJ1^Y{v`&?K1{#%vgXWk>gMh0;MB% z1Z^rl{{WOv`$~AUg+t+A1x2-0PTeu%-PAdCOe0MpWh});-La3K7^{|lwAYRRks7x6ZJu)p@M6tiMgJ1H-l+#2nTFK4T)OL>j{jIV6wEqBUEiTFkd?)*E{3iIbrp0dwjC^kRBjT@wdZX=s zEu$K)h2YEmAj{l3nA zHD)+CHwyUq$whL)Qcjv{mD$Qziq&-KE^GI0$L=@9Pus`h$Hk8gUU(D6{w^B5mBp*H zqTj(D5m+u#@;@pK&!yaJx@*dbI?EN$+qCI{RE4E&K^g(@hO6RRjXvV$(^`3^)8knT z33;wqXwjFEac=ThL6rLv#~sp0x0msV?&T0%&2K1me}rWCxA7+U2&edk;@w6SkIE7z zy(N&vx`tD15u%)`#O$o95lRL_6p@j;5K5O(n3gkx?&%=z`G|0;(y6 zRG6LG5C{Q8nR0MUrw(&1yg`3_@=K#>w(eCSW?Kz4FDCsA5^|Ni+*>pxV(48GtdmE^> zjfG}_p+Ey63Znp|TcIGh4&?mKc7_spj1wW2ADxhkrEuX?lG%+2iz-VpqRA+ha11DDOwS2-sbyS=Eb=m?QPRexL zFi4Sp){dht1|vd@+m#E0nz>bsr0nFBQdXC{t<%$H)%$OCuE_YB*q>`2WUY5=D@ChW zS+ysBTeiFDVi@nNB~ahn6HOq?h~m=ciGgD%AUuq*4lo#&Cj$p6#I3Kl4WU{q>xCp? zmR~11!N$~rLfBwIUFBP0`@?Q_-v0o^u8AaP!@5!gTsvRs3Bw#VQfrwcVZ1lUk%@8l zx2D5d_kJ>h*Gg2?JbB^hCi4QdzLYO-nZYc@B#zGlCOh&Zbt*yrA_Rn#;+6Tm)$vKk zl}h$r?>zO<>g=q#tDKa1r70+;+G_gqtKK?of4bIMt&UBeGC^%3`Mz9@*KfF~TzucT zRVsHOEU3PoXGN)HmMj1?d!TZ2x@LC9Pi2dYW0Jre_hPtAIs9p%hZ*qzknZHFUzH=F zBYZ@%bAma};!XhlKmxzuGIZhbE{SrZcDrs!z!6F2Ku&&pTaY3|QTDX6b@(zcDLyY11Xd;FiK<;!EQBfE$|#GO?BedWHytCA3f_ z<-X|%U7&)b;NghgOKt@7fQneQN#Lj~Y3cUSC8K$OG0T?N2r8^V@}mW|mM)>#f+Py( zJYzb0BWPn}RSV|hY9SH6Kv3j1066QAcZA$GWD&e=Ywfdc%SQCx-;2Kcv*@t2dFjPI zS9tsvc2?zS+Wqvh*8c#81;l1sGi0H#p;+w!xOs9u_shu!GD#toPt2I!pF{r51tj?O z;MQhfv7JT`%);ZJ_(pXw6;H}TNJ&`0*g~-my>sBx#1(ZZ7^AY=TgG;8C0X5oEtYMe za8Bk9%1V_3auw>l3*u?K8?9)*Ft!3at1GL+46SE1+Cedbdto`SihF;wrLtTZn$%AO zcRpIdFPjrO*N=_EdwA7?ZrqJst=o>ach|nFrpM~O6XtZX4l&8`)hWMcM;C{wQLSII zrBXZevc2znUe{?oKYk9P{!or9K@&I;gCw#NPww3a#3_yO`D=oNMio>BDy(c=4P06Y zVhn+!P_EWNPyr)nbkeKfjFu&1a={yGInLk8?-Tre_=T^+_g7yRym@wv7{?ETJQLu* zhPGu)k+Je$Mw&~w)GI8^?zb|jLS&K5PcY`RKND#FBv88b_r_g%X33T>O84v~CQ=PLP>BPT#3W{5@z1vjbVmEHG>C+1Z4KMXuRziW@- z4vVGSh>YTWXX1~HYxIEbJOJ zWsWZdX@3wrN2)AQhupK?c&EhPDrbljDk90WlEO?zaWkwoUn*)Yv|^lPcggQ7U2NQM zWo4_fTJ+naH2Of|GRhHkvYA2^9pM@n>D8Yuj`ppCpw;bdd3vjLKSq3MXD+><-bEdy z&70g1@TF9V#iNE0; z(ZJPW4GI`MschgzaAA#-a0C2vZ?AY_#?H)G_=j4!xi;cEwz<+}w2lM?fsQwh>gBN} z6A-Ebize9#!BO@(ZzUK{lFlkzkc~TL<7(a9l2mtlZBy&#w)6G*6U((Bn-wdL#QeZK28V56Rr4l~#jfHvUcgMtYd z9Wjy4;DKd0K552C$IH)P2<5u> z0XPi&1|)zF`y(4S5xbg_0!TkDM@$t^a-$^SOJ@VB{Kt}d)ac0F8BapkkOQ{|Cx#49 zIT$$yKQm^Pf{dQs`59A@kO6n=fOCLAKPXZ-9_!1Zw`l3o+P=H=-2+LawCSgwn(Jqy z`Rm-Rv>tLef&$=;+~G>(aBu}$P!2#X z$0YCp+BgJ)0p|sG=NZO!j%C@NK5nC)`N;W>S-N0?FgO_}fI+gqrM0!zo_D>HzMhMF zpSSyDR#orO1?SwzE&7*G;;7t);c>jlCbmUL^43Zw`^-Jx@=9Q}ab@JkUn$ zP96M(CL@)@Z!z~V=aysXo)++)sqqmSck#}a*Fj}1VRdhDcc|=47m=-8M+cH!w@ETd z)I@4mXPYQOj+<6SlhwH+#LBgA&`0`lmVw{N8CLN-}S$zde^Y-e*T?1Dxin3c}f zRUSvS?&DCOPmWv5okjxQXM}YtKkOOo_G9PNHJKz5-CM;W^CXJO7^a*8ko zR+(>fH480zCRm==#9DHFpH#A+Bt)95Y31F-!Il2%FOl=3Cz6xntzjumCmU*;mDZ~1 zB-O3Em-nN(wd~gu=cLkiOHPrslUgTht=qJDCH?JMK2VoT@gW~HmSAM(?2yKh2sw zkV=9xGQh?uw|gbMthQG5*JZbpNZK_MvrSt|C#P%QW!qmX-P-HUrO@u<$xMz3A2fxs zODG|HtT8;1lY`GV1e~d$)FS@?mUA~ujIaQJr})6eK?CI^0#0^-G3xFP(g;=nl_ECI zNaSPg1?$LA5Ak&cs*@~y<9RqI8@G_S7~QuDNF$)Y+*^`B&yhN5J1s4JZNAR^Jk`Ed zy4Pq;-+gbR)6>&W>sua1RpTEuti!nZO0O8y<<7VE+22r59)NSyV;4;;J^gpSm$vtReUj79RVMm<+g*J2eLU~c4`K)d zB<>^<`6DEPcI58C&eOR^V}LqBRF(xv%V&)3AdF#vA2HyQ$-xbhGxE|a5K6Eaz$4|s z$>=)Z^c{HVgNm6{5DDk_K*$a`IXNef4%s+==Ty@ClyBxe~R#qgEKIuGVak%g>GD#({0o%{64`PFS zEJ*{d?u+V40FVIaNyg$1MhDD!dDmpmf(G34)2A8a_0B=$4mrp?#P7=YNu<@4`!<%k zYOme-=tOUKqS<~adbMk4wEK$L$?48P>ymn7vGnWD;fx0Z!Sp=vJ8n4nbI(9Y2Y^2C z8Bm7<0|aCL0IV>0;~hEbc>oiVqa5d^GwOLGgU$#f`hqd^1BPny>tvF?t=h`%wddQn zL#`5AyC-G6t>)Ic+T9)3VMks`2RxIUat&~+_36;=i7zG2L~e=Y3axSa&wZr5ziy8I~*g z2Y?48`izoD0~r_@?bx2!-5k=9oDsnp&o~&!Ic(?C0|a0m za!x6yjsQ5x92VmQ5;1~CdmnS}T`Eo%w!OBq+t*IXFGbbo%AU4%(@k%5mW^38e=j!o zu^{EUWCQEh?=B8AxEA?$mFJw`j9N)R8Ny@&4svk7ZVi*1;E*sf03dQe28b9VoMVs& z9>4*TGINX$ndb)t0gB`RI0T07NC2Fi;GRG|xf$aGIAU6A&gu4DG`@=3+1d5&d$F{- z?5z5AOHX%8ZEJRVqfRMpq!?^203fLVws&!!Fh*A!l=2A~B$~3eca4U$k(qIknLCl! z8D0(u=NMdq-nM0nOukInM)3rWC4J*#dCLmO+vHAZ`S3P6lz$2Y0X98{}VV4Ky10<3#4T zaf6YNNFB!WDK%6&Ou>~+p&?7c*ZlFkWEl& z2LNON&ph<%4n_eSk&FUB&Nv62T+wdHy==65X??X;UKFmMUZFcjmH zk`J#Sdu{);{%-q)Fc@` zOnigt2`7x;1t-`Jhn#h*AKLH6ZR6tyCvgKA=b-~2@r-gwAmjnb^`$q<-=&i1w7-*H zz4f`%8ZJE&wwrk;>bJIz+uL0X(JFzDB%XxvoRE1603PJyJvk)vNYgF{?wEfTNgNKK zliwJ?;{)#=aa!No4A}pyPQ?^#lVoRjk=G65q11JeWr01BMj*I&`McYPXOYQX0e*UzrjPWxN0e_I%VPI&}poR9|@ z&Uznwa=GW8b5Az#zIOqU&H++#c?TeYmgj}!5CIv$Jp^|aGm(gj6N7^qkW`Y`IKjX< zJdOY-lbl>lJ{go8rZd}Wf<`g-vH=*tIL<~zX$&L3Hm$ohwbxZ`9*N%f)ALuw;%%c^ zX|DFQwDRk-+ivbS(3Jr3kfV;kso>=L zEP_EC0h5A8Km_+0IUd*;K9s9wydD5wnB)v(4D>kQXFPGnam{vn4pr%{%YELr(f#_Z zG}w+QHkIwR>F?R^*;{q`@|wVp?Vy32M3^i=0F>oH!5|z1lYj{!LjW_FvovxtfEbMM zNF!+nkO|s)jFZUhI)T&Q!2;ffeS;AuLlC1l#!t*J+kqW`-Np$Ok9Buz9QX;pSU1;Az)n4mcJ*|Bfw$(ddbnoT4L@dpm zjBezS_n4lIxB>HS`Lm2?fG`-Dg|J{ZGN=GIQUT66A2t949yXDamgI2BFG$up-LuY1_uHfeQs)xP>WU+(+7iw&wtoFG-s7ljH*9PktZ4(+61k(>}PnW&oS->V)o zfxs994@>~O;A024$R?qEi<6ujoGIE)Pb@~#Lk#`kKJa1y>>@L$C#g9YW60>kgN~zi z0mk4Cag&ONC1tJcr{8N@`rBO+y3w@t4|e_fJ>PBZchl2*>dDJ>7#P4~$S0noj+h{G z#&|z4B-2ZA(;O4j?NUL{%1=_cL(xI!sp6`>M%-ryC+6n|IBtVE=kE;qe|WC*=r|l> zBNzmFoM!{BG2b{f#M`@ncKdYy06$W;*pRp*87v9UQ`bE+jtK*B>yg-u)MSkHE888i z2VQbH`E!6Xl21+}C9pZpPjERt+4l#A?c1rSn2>!ic{uH!a!x@Cay@#Jz`&d9zP`Hu z0GJjxDI^}b85rtMBoT~^Zq7&@&rV8ZNX~wr=L?MS!Su)@96(zq?-ARad*pMHI%Maz zeGU!G4nrTP19t`^5AhRonZlx4%VY-_y;C%eLRw^!MzX zI}Br}Ph5Ql4ln@DPZ;#-7q?SLFb^2xk_Iv}^*G4@b_0x_bBO}>9;b|x*E|4m->!NP z2q1%n%=^FU-`D&*7~BFgj=2~=h5_522^~83$?V(=jPaAVJn(qWJbLsv#z#3L5(Phq z{{U+P-xvh*_wdQNi>{eR&{u^s;ucr1G0AtW| z$EY2Nz!)FIarHgu&rXB48O|5E7{)z&k-3T*8TQ6LZK@P?=Yny` zKHPFhAPf=TJ-+A^np?eWx4!=Xf8Y3wW_TQ6A5)%r!8{Cc*o<}SoYDe&o_ch_$j2u= zGDkzl9eLsS3&&ChMtL3c$4=ezO&vxykO9tmf^ZK}j=tmWj{MQg-&d;t059wB^8tGw zL%}#5c*jNK0D;NIK?Hy~mn8Pwtnay`xm0A%MKK|J@#BN^{N2Lqg7 zk~!$zc>o+22cgC|=s>3Q=RG;cUgxOC@dKVSj1oo&3gFq#Kz8S@)*~c>az{;|1A;M) zxFi~vqW-+QJ1(nTw|-YVGEVnjB(3U~OQ+Le-h&J=z$BB?pw8cH3~nGFQNj>F!BfUg z1~+;T3C6}Cj4{X=I0TG@C)D7PoB|6suN)~Loa3+u3UY9n%M=YB{k>nU z)DI|!P<9ChSvlo7RD6jpi)VhCH)X!QtFL_`>ERQU>P6_ZZC^_}rDVILyWZVUixt$? z?$EWCg%XDOSzA=Na2R9v(g+}o@-o;MJgxu?UM7-Q9^OeL)KE$puBUkHU=4ueGup)j z&Zxt3MsB1I-!GEG<*V9ei>P>qQ@7IeYfVeVI<>@$6{U`yVR0dL+5lT?TX_D}DL`^j zVYd;07_eR&?9Ycku{Vu;KrJ;di1!fqH%W0Et);~!uA|~MfWA^B(rvC1&rEqpF|?Yd zr)_g+@+o~X>RhE&94$(cvQAp7q~9*sDAGuB#9NghraU|oHzD( z03v-29KF+wB=wVDEje#%-|t$h+WMa_EcRH*HAXzKPR>mvzRi=;*S5CSFZokQ_a6v+ zCHOn=Pe5N4n`;dhP7%ss@#n;Mh-){p58b)atc#&*g$w|TOVgw?NWlb68XKqZpNJo| z-j%1b+LFsjV6u*3+04fQ7S%N)ouPO{7lx{ z#6Bz4wJldue1+HiQ!tU@Nn3Z3q-aW~>~{N@7-5Fa!p%yJrXWCF8N4Imp9wN*ek|0G z-L}>j+Ms)lLU2hx@hs5ngz`Zd=&lq9a2c;5P0GD7sqEv*lGARHidJ_^?LU>D^IYDR z9(81-=I1Fi-z##L*=b$c%35ly*4&LNE=ye1z94*2zZc#p*YBo<-!a=tL*%lba++c2Y1hcsa zxJ;V)`%w6WXJv@=%^qRqD-ZO`$A))F2r>DQS|I^lLBh!^x`Vi>kmOhY0EMS{6lkrX z+POa`{C`~TAsDKX5-&3+5t7BpA$F4Z-lD}pHrsAiT+39NR=1bQC9B`Jt49M~N-vd0 zA7w9Q)Kju;>2~(jxAW=rCyP?sSkru)u_W;%sc;pWYR$M;S3XE1g?ijLQ zd1`ob!tufcmhc%ctBE7M6XspOD~o%C1TruxBLghMVB9>x#-E7-Xo@$6?MMnqCsw}% z22!IxAmv{J*KoAlX+(|JT zce?IXDqAb$t>f2<*6HBzexDE!8281h>hU(&r$uE2Cs0W&r5Up#?rAp!Vxyqbd|77R zBhm(?;Cox>bbC!)#b`W5sKyDq((dDu6E^o!9Tkd@Wn`7agEAtbwTz18N%f0OsanoS z+gNPWUDLO1I;v2T#L{iMb4KaQ-bp04PW^ORx7BoiNkrBx#fGWjw{s>+-A8o`9FZgrR<>yH&ZtkqElGVdYJHEDB>!tqyK*B#~7`Q6Fv8xkFnwgY^ZOkpY)U*0g)FjW3zy<*wz1Ke~$O(h-F%zYNM- z&3+>2J{N<*u<7yGT-bP;IqeI}aQ1M>W*64iZTr}D86%o$+1?rOgj#QiZUV;*{;jU+Z30gr4lZtFn(hc8DGM`v_b!pPVk+zy53%et-wSFV z1Mc*@4M)K+c*(SFYCpA&L&6fpB+9WX=@4p{H}l+EzNw{2b#48i!8cE+3t65!sG*ql zs@PhvY046MzlljD?ycHMS){C!Z??zmJOjhI=Mdp@m?`0?;b~x<{iRBBbrZL_6$)^Q zsH4@&>DgIy_-)qiM=K;Z50_;sx~-zPAe?S*C2)Fx<;Z60OA^(qX`yMdF_P^hjDd*W z<5tn3b(7{G6`tZENWm-v1qg@c$x&G&;m)*JtiBb|*s8M=FN^dT6mWSfHoG3*x=t8^ z+epDU2JD{>^+>*7_(uFC0~4@=<6jR*K}I{tE8-bgu0dRkg3;x3xBeg?{2N$-zQrj&2ST`IuzVgB`D5LQg4>_ZAMg6@1@=E(^H?gn#LJMH5A6+ zggg*Rqbt0Zj@{&y_Yee|{lLds)M z*ix&so(0w8bLO{$BLN+XN#hR=pu~HGfcZLynIjw)R*9J$D9K}hcgMrvV^@~z;p%P! zQqW4L9E5DMkVX#%4B`GH6 ztej^WkC~>mO)o9&qIT6goI>gvd~#eD(eAG$bwL@pxsyzSB@3AY*xBi_UKJx?Mf+W_ zh=oHtHY5;7sn|?nTiaN#<5BZzaZP)sM-D+{4Rbb;e$EkghnUMGjsk(^0$RNrPWXMJ zUR&z1TzpITZQ*S~(%uQ;icNQ2lHAK5p$ZR%L~R>IEh?o}=2u+v`U z1)N#Cxo@=HUDUBu?|a>EWTWzvZLVdaPkU*mhc-Hl)*esVQiJ86EM)2X^5%`;ugfld zm8E^1mXs}WEM8+N)`(p&BW2Ge(`_-En_VrZ$R#2A&UIW{4zb@w{WFlwv9@u zQ0m3cBpr)1@$SzhkC(6&W!u3;blL`iZs6Sb-%Vi|+Fs9Bw{YG|My$vZ;cfsWxOTQV z0FbS;V!XEB4x>;e@uSSd1}bj#7KGsE4pPziE9K*A0K1OHWmZ*{i-e=R8s67Y-qv<$ z?bm1OmcN~1)SRU$MX7au>U(LTcXqw3yI*|=Pxf0yZ#wGSVjyu5vxt&N&e6TF${036 zj1}dvz@XkC@X&D_l4>_>%m{+sQ6zG23ZNe)*JOm89H~|#g*YHxjeZ@#;q0{^3R<#` z4zCx8HLsXHK}bYa*6b945Cu-~#E@`Y>c!(LJu4$k_{XAneK5yngYezmh;9D>D0wYs zeiW*XGNH*JvT%KB2`*I&HTG5A`|~#y-K`bAN0T(yWu>=ITd(GA-_ka^Tj)}>Z?--x zJ{x#~;Iw&0jNeX&0oX_ccJQ%LlsmEu4f&A)RytOm4)KN5?9q56S;kALO-}k7R*xVt z-j{Pc>Zn!zb_!SSjjxdPZoVa3H05u8JA6vk5Oe9+NcfoyUzq^0G+J2UL{18P94JS zfJzhPQKklvB0+)lzLeHnc5vo4vI1O&w99PV(2m{{RneF1EjpA4&@n7LsdM)zC785;2xIw5SAfvu%zEWQCBOl3dHQv-)0@ z@L%C|%fFlZOZYcSk24+GzlWpyJZg&K5pfoo;+<0F2bq;Zt6Q_$0}`}PAY@;gWbqxG z_+#NcAaueerFDf|e4Dnj#Lm1I!jeD=d3PaU)a+z@j{(_|cNJ)LnOT>UwUj-)$Uxc` z4y*#H!UOUz0>{+mR;?u4)pFgX?%Aa%zMb#f^wO;uB=EFlPX7SJjp@oM#uxZxlS%bS zJ&PJb8@Lsg+0mW=kA?IXd5Lh=Ag0 zEz8DBEV2mLC?P_SJitabZ&x_WZBS1G*Tdr=+vb#Hts5&@wygEjN54g{%)*u(UY+@6 z%P8sa>3G{$)h+eaq}kKx9uvFMd{y8})ws22kBe;C`pZxNK*>!QWO#td29T8e=)uuUqgH1-vViuH;{n- zD7BD6CL%H-S?4&46<22|9@O%&BQr5oX63(BbPL}NUR}+i4NBL1lE-g=w=$;Lgu7NY zF)GRXy`ZFXFji$v@q|8Rc*xPI6+5NwO7^vvG^5{lzTK|7AK5+tSNe`qoko1NsfePX zbljIM6q-%nMWyuHx-5JjYonrg{{ZYcZQmBI?*e_AH+dd!3TP9;CKm}JPZUvVCOESm ze8!d8RJ+oJ~)8({+ z%JyhtoX%lZk-V6m;z-q^4$%;V+(@z8hHow9apj}WZ~;%4o)$Nh<2C$5;@z~jCHHAt zTkpP>zW)H&Ts>P2Q-@(GReNZyr^$XI{?vBxLGhpCdOh3%ch-Cv zHMyD-Y6(vS**P(yTg(;X+#_Prz>F2x5hT$d`E6soPweSXH1_6gW^LAz3$XC3ObLxG zn7;2YpukjjWh>n0?7!OH)(O5g{9tRFS>f|-ejVPV_BT?Z@4WbBp-sJGlX9eTNcQ&- zt4HTS<|VPYEgGbsDQVg^k$*L$H@+divW;|&O5YOM+e#w7m+k9q=9bhEmfOrrV=BZN zSw3x~NU5K8j6Zb_XYVw++oWu^wVv8tYW$D$FT{+pwH`IimKoFKsgK1}RyjsMP39K%IDZa3p-5~`)ecp4b26Y4GZu!#Jy%kg_brkcyidn+e>Ch#Cna+ zK;Bg)5wY_&jmH}Y9c(YPnv;z5m6h7Fvs)zBo4U8(q4D@UZfS&brA836=kH3?_p~E_ zdabO~R>`efYpKa=I*b=uHlJe`g5%STywc4z(2{RH3eHzu-i(X=oWLUg! zsxw4c(QY)0i#KA0g1jO$c|s5rf>Joq|!-F3HfcRpybZGZ+IJCUK zu}L>6$C&Alum1u0N$Cr7lHT;1H z32LxM_gI1ZpeDH>VVigmpvKdNQ;iE-S?)*tOY}?A7{T8txt!o-gA*=dA8@f~@S`Mc z+wvWz(6uPoeUC@e;g4&PHP*AH##CgSqj_;KRUwYyAPmI(%mx;&r>EN}U+qs2*})+> zYi%UW;s*>^?L!^2BzEiez~_K4bIwqqcwe+cD0kYD|dI%wWhi@ zM$47x+fO-s1xMabX)2N~UxNhMen84b=b5*XmJ0!ajJ zRo$Gj$IA8Gpn~|%&5fg)k38_m1_3MyC6CIdE;lQI$Y87w&4K{MdN_4xrRlxX-@5Ft zcW&)Hj4H(|TH2?zo|-=CCAP0!`lGGzF#iCGmGV@Rq3d9fK{ytCkfbnHU`88je5JPp z`@?5Z7}K<%ga%ozS#WR|tD&9r>^Ct=`LM}af{00|>69O#}QE3lFnE}JZY zLHWZm2r<-=$s?t0Y9xyr1Cj_!sTBOmqzQollN$}l2I5snz#}7WPosx+2V?jrbee|&~1VN0d>jiuQ`EAE$RPqM1v9irM?Dl;Hw*)ub^ z_=@5=U0!|mmrookHH4jTAOLv zo6Ykg_vSU!cDcHLnxD!rvTt*HV3d!u}obbRHGZHESJ42h}xu?Ppu~m*MXM&!=h; zUZj=_E$*|Z$)(@j#Qy+m&|#gWvzE$h5$FC7e!@Qr{wRDv_{krHJ{SBw&>{GZqI^2| zo#IasYx?i)UEa9_(Q@z3ct{z@t=)!FBJaY-yS?lwijL()uQoTj;X2m zM%%#pj+JY7X{zY*c!tAEo@=?bx--W@zqO{XDr(-+jo&J|yed__ z?V@Qk)socy=J0Qf^J-XVQKyySYDShPnw>?5#7;48tRJ(JjTl8;Ny6$p%292_$5r&5 z%*hlCWfJF1ceFk~S7&dgk4hd5EWLHo;!MW6vhq20==CLT@OoS@+qNZv>|E0ist zoDA29Xg>{nbE|0@X0JbpG#doI({#;2cj|u;HS@Ce+8f>X3vuGT0y*w{$rwzS2zR?2 zI5HnY(|ir$i&z9Qd{4KrKvhI~N5hR9gjm_PdD`Z!u1(67Y|dt4r30TZnG15IPnAke ze&UVdu9H@}ZcZBdHr3s<+xs4-2kG$=5dp#|q zQnG6I(Q1kl;nef&f}J>+s!WXR3W006$hwhP)96AeAISP#|4va zSEf%SCGRDxTiaD-rt3%Nwzv74OBqrM{E@Q0wz9sOY18Ms^)ijLSs)TfINgG!8A;m2 z<8a2~pO`QESU9K*5M&a^f^+haefhv0M+Bkkl1Tv7li|zFxHCe-Z+Y|cWrsqUZkvE0 zjsePow8P-k^(yRX^TTUl*wA6Kr1@y59%@2g7w^G)rhx_0@#`(>4foVErx3@JS~ z9u9Ij}2%> zu1U{5>e_fF@N?%v2PYn5bAU-)ganbsGn{9(MiSSe`Kxxe?%H~3e;|0r7km6GNT!qN zqgTE9{p-1hZ3GTZ2qz7YLvw)H%Jt(J83X0#BO^Ctw^YYdjo&s%$6RH$=Y{Mr$Dqj0 zI%_Wn8+Ik7h+&D?7>;(fdGf%HPN`q8>qX>6NXrORb?<(1!Zk*wXzJ}F+2WCM8XLmf4oSwsua7g)g9y48{ zX&PW81?zwbTwti&pq+1*@c&aN@kN?gwEC%blUri(?Z(_417_!ifibK`xw5x~#yxcN^UN>pO~HpCm1=v=l}%d)hH=FBOA5W7wuA|Lqspl$&fff% zso72~Zj-xjORMdo-re$z=8&gv_Ets!1m0dQ4jTZdD~?$}>Inp)0FzGpev)&YBmv0c z_U9mFi2KZV!vJzaWNqM{B9lx6jA|$e$jaKragzAtk(@U`c7?|bO;LS3FI_;?;g!+{d#ZO zIpwfmLZhf4^#u1Mjj95i9&l82>PQV$HjILY8RvjcKtLmQ(mB8zh*swe02Qk(jf)IL zEJX45<--i*a0uJaB=_S4lfliCN4h+~>w%r$y@`efSa1L;IAsjWw}Xxd$nes&?I&w> z({%52+tEF@Z`A6F!`c4w&e|zEYVGT0wBG%a)Q8Ry0t*qGk-_RWXMx=A&mfLS#^Mbj zl#H^r0R-iDV<)c|;2a(cZ2*yzyM``@ad|3(Gz#B)bh1YuMP_52z^?F&K~UoW0tP^9 zTDFNUl>#xiw3HSIL>Cdv>PzLmRcAOj!NL!4IRgu*t$JyDHFT2SruVl?UtP$JNGYVH zA1hh(SKj^n`r6IdtGsiA>wrKYV~jHG0P&2RXCRZDa+|^6lY!eL0aA+(Ospkis;#n>dEf89-EFu)%NxbB%D(Au{E-8%QMa zo^iD^!3=Py#03BVxnK*EGH#3!y9D5T#Y5x)xE?@X<4l2t!5odHQZ`FQ^p`HWXp`DK zbbIvZ?#$(ZO*ihg?zx)3Z98kHds)7RLM2i$lgi*^9Ast4!3DB+WMN3jC$0@z^Oqc8 z9FQH){z;PH~Z@;mcnO4&az892!UB!Uk-k}?i3 z*v1AxJ8P0ln$2rwwYP4o-SyeqwyeT9MGG{nm9$p1mn+p?-+y3Hd>pQueCLN9em<`9Alu@_Q4F%V^>tlABU?=Ct(0Qzgu@cexC?ZjaODK)0@3XUs*qP&!cNg@3!7uTWazy zFi-b#Sx!}t1Q3h}Cvn37alyzUqHSJ7yC>!c*FP{^0f0s~54-aaa54ZD$~DBhau{Qw z95CSI@tGkGn@cOAdlfWCyZb=NTl-KjY~^kch^VXw*GfJ zUQ--5y*Q_ByXnf-y7l?*-05f4t`M1JW@ipSQ@3crQou5yD!Ua`W~#k3miI#sRN z8S+vqX*@^by)CBl!Cx|a9TsH)nm~wxQbm_Vu4R2+UxmMST~pQbUHWfyt@*DQ@wQdN zi`ini<26s6Q>8|wNw_AW4zAZk!)+P41UYSlCjoa7%1|Q&Vf=2r z17~qcmTgWu2^K5aqOxWnh|9@$HpBNu$OMcXgJ5}*3_B@cgkXLIT>jht03W7|+-qME zJ|1{3IUK6m*o5&V&PgGoYYzx%8tid|B&IKt%_cy|vrd?mJwgxL2Jb-dWuJ=mUl!}0 zG@9=C*vB7&z8?60!7FuhvF4g7Z~Q^xYmX4k9>wyTP}6)OETY_?qr7uQ`%=r(lBVG$ z%ggWbb4A74`sn&JoAa~S{Lc^K=1W(eP=+N!Jg!c3qZX5KN%BT>t7WIV?C!dyWA=P_ zg5EL&R`)J(jO}Q_ZKSy>>P9hxzyl-Y$9oCl38mxg(v=)#+$xcV1386G8)+)eLJ$Xj zYw)J){t75zQjmNp@tpi%NvV8Eg$W-j?ec8=6B2~rFhy{|fhErcIXnLV_$arCW&~M$ zCbfeM51*`f_ffu$00$1x$EDdxE;E-3OTN`mq-ATX`z9+!n~Sn`gH~E<^yYS3ers}Z zUM%Eri<7BVNu_&XagC*AcmD5X=G#l;?tcFOj~ZD;5NS0F8)*3jp6xzChi{ljpdktg z!>Pb5STbSHE315N_-~*q9bd(G`M*i$?IR{BkO84#@Xk@Qo29f%s<%R|*)k^5$XY-X-|cW8;e( zd3;gvPU`aU8Y_s><3RDAx?s2r%B^i4tv#lj6BGy~M6+mEIZd*r;;m$OcPOVM<7>M% zcB$h9{OA>bh-f5p5{ug+HXyWky0FS&0 z;(29aBDc}JYvHLcn{Xv_rAetrswgastWBD_9vN2*EBTkuZ#91x>H|vfCV}w-;*O{r zEp6ey0z;(5AqrU~owPHp-$-_|2e_Wv&P0TU`$TAlHu|&SzwAlz{{Y1EN2++U!5$v) z7L#yy$6?|xAL)8$h@?Xdh#l>$t##QfoE?$N9<;g@!3=)S2b%tCO-z>sNu?_AhN{Y> z;J4*zD9O|4@6%@A0N6k$zgBZ(z9@K$o7aUbyM?ObXgOKb!{PB%)Dq>gsa{H@H1D;W zZqH7K???PB4-c3Fo2xk2AM36!V}d*!%t-SBC?NwDGO1Kd6lriBT_?q#09Zq_Q}NG( ztsmrXv)%ZcMz@(sEWkWs>190;*@_tO$_YD*SLF?#?7i`S!@4}$SBA9j3SGxLGd$X_ z#k;6(BYm;}_A3vAEv>BLkRD=K`z?Odx;Ae#zX$kpR(?m>E&eR{ z4%$=!9aW*Yk}V=(7}^(fj9Y2lwjzI(^8UAsWk~D7i6PNIqKKD7k%T(w|}Jn02w|$d=a|%P4Nd!xA>vq z-Ah^VH-bD>qiI@hn{B8~d3&nrI!)z`qzEo_>suwsk!C(@%^YzCWipouFXMfO$89&l zKM#B{;JZHy>i2$6hf>z+?n|vU!7gGm{j*W~HH~h)32w-@57YRg z_HzBGEi9+;j;rvp#=}PN=9jN{hW_5u;;+N|@eRIK zcYkvXcJ@|swBkAc06Vq682H-y<~>sDM)56_BGTnzOPxM#Lf9?$ltwBFzmWWE@ehtNj7AY= zIc03A%7sW$l<;*@sY%Y8sU<4P&8a9WSvW0UQ|hk~d}WKoV@K0s@Lr9jrMCFDNv`X+ z@?uTbA~$<^w3Pr#U0zrOGtS;*OB>`szJA)(?vypC?6tiwNNelce?A+1DI~r~Es{;q z!Etdt&BRbf7=G)_5?l!*S9UDkXM#=RzY*Ikceghekj$3L8!g>}!IbjEQS6EB0f{3) zA{9UuGMknrgn=Ft`0G@;nXaW3Ri_hp+&-?lVSu_o%l@b{MJa8}tnx!S@wTTN9zpR| ztk8&3&0~%WdtnqY2^Ar=k{flA5;Y|j-ZL0T^4?NP!YF=g9yQkTt8Xj{Oi3b1Z>7lr z4DGlvnIeJXkjT%pfPgZ^u!mI@Bly2qgl2o9=W{R+&kvcOk#``Lb~xU_K!hSnL5*RM z?_twC9BpMuB$B`GppsthiqKl=eRZ+$bK@N5tDI_Pc-}^movT-pe+yCNm3ZDBT&_Cl zsy>Qu6~!D)B^7bs?$NY9vc{2%e_Q21Bz z3&8&X5PS#m8efLr5d1sh0jqdF$9KLP7xvx}zk<@{)?3Lf^=%);It|UU+0AojE|+_u zc!N*XVAO7`uWeS=X&pXGpTzgGe)fH_M=Rxn2@%f3V_ z(9Zt=LVn604*m%IZur-r{6GDszAS6M3O)nfY5L~3<9`|Hx*f)|sOb{;dqLGTFAl+` z>AD_+;>}LpeSgGJY2Fxz3sKZ2Lu zMf&MiS2u(Pxr0@E8+e#WF*8jxM$+CW)>z2$mK8@*HY}{8_q|vQFE7~Tl#^GKDo2$? zq?aXFLUFQ9S+1J9-2TMipByvZ2Fky(Fm!M&Qkro3%yAQ`X~qsye3Qf5npbX{gj$u` zdbWN2Kkd!?GOMg}{7mt-t^<|w?ED3J400#UAZ7bRurxwe!E$ZnWhzKX7BF8wRQec#$=A|hr|ztT2z8NIP?fDK$J*{ z;Jc)PWH1zRKX-1kIa#DgBe-ak`OhQUZr-zcPcM^(zW)F+Yu&e#TE;DF-%h=ctE=>) z(7xwE;BJD2x=gdewWhCEesZJ>Ns(;@H| zi^-1O)8Y?>VuN1M=9nwWM~Hj_d2o_h%QQ(FM|YuWHgMyqJ`;|8N;4}HaXzf-ZsnOp&Bmc51Tv$QQmqA^A(B3X5Uz%oLsQ=F!WU#smWbVFmz=} zrS_;bC)ZSdzIcD){{X{1V%3eO#}5R{AtcXkmbxUj3erU*1iOK*Y}(REHZh1bo2+s^ z+;0MS-+%E>;a!|BE~W7YKqQrj-p%8$2l#5j-ZqOXE81z=jmD=mF(zH1k55aAdLb+3uu5%EoeSnGZ+@r}*9%2h05o$Pd*pn4mtOR4Pi*;+w>iEnPM3!f&-d}|a~ zkoZf%BE~D*4+pNNZ!<#CUES%{Hcc!JW&&ug@3jpMOV63r39yby7({%dcJCr5a>_7u z6k!?9ncC?^wCv-jJxN72?`tHw?|pw($Nej_8Q@(!E=@xbi1uktx7S=@2JNb)96f2I zo|biF_ifo+_P_WjmcQ^j;vSLUX?zFqv&DZGej(Xi-&vhMNYJHE255RU+*Tv(dSXkg zY8ty-HN~Z}K>q;Q8cdgP=6Txv?bqzTm+<^1_?bAC{P z{ku{Z5(uJ2QlK*Y#x-PB+}~}<;fvLw(9Lph2gsrvL@vcUF(9~#v^u_C-%i@i(3Hy0azdvEP~pAb)O6&yzkofHc;XjU*+_tHX+ zV~rbY6l~s0gQmGYu|8z%qsp6$x=QLRmMu5YB>MM1i9A-~oX?K4YPq&ygrSD3K2-gR zsZJA0F^pvAQt+zORAYWv-9>1(JVHN&-ahkLF1#yYYDBv~(mY?`wRK=5Wpm~0CTRBU z8?p)^%7Ud-2*2T2_^3|EH2X9-ebL3Q*jy2}YLaA2>Did@z-|B*;0yr%p*7!!rjfj> z?MqVo$|SMyq-haxl6G8b7b@`(0W203DX}nH_L*&U=6}LHsb9n$@#kuA*u(c+ zZJszZ*`iIQ)Sy7cOlJi_z~`-%Ml*_oyj!xAoLg?{*0dXXX>U%+AB1ACxO#I+btI(b ztoh+JZ+CBH88qGBuKHQE=8}9c*CPyP(!8<=&UK3bn9k4xOLD4EGM?uklEZ=oBfz?< zV8^EUm;mm5R@H$jBxAK!_ZY&r1Th0RB;!7vaTb%Ru{QcOn|#taM%0=~7lmT1jT|za zfR-U)T;LoW0COKivbQ0n@c!W2Px>{qFNOzi?;h|mS79Me7={FJR98g|vD8sgice)G z(qCu(ox7{qJ3i}u4d~FJ8fm8G9X;#yvU+n-ySGhudM@0o9vJZzyzoMFjXvgA0ov;S z0L6A1ZN0QeV)5(`_yYX+L}-&!Q`TeLQ@-zzfjv$(smZ??<%`3h*ZyDlft zu5{}X`&xTlKE`{sKrfXh4r~t zDD5$~l6gyw-f7y)AUj=1Srj%n?jOZU&W2{F-pwb6gp$@a<&>OLUEI^X``G$yn>)$! zyS&3DS-cutu$C%VX9(GQ%aVkpK5L}q%KhY>mZ#}wh`->LUkS8pXym^C0D_f%#}O=S zjXcYD_JqusDS za+xFW$H6a+`si{b+JxNcHct$w(<*~BjTuqp?^kdwlj9e((|oAj)vV%CAOWq`85$;L z^FGfo5Z#dQhI6tzb|+?DIoJm-8pYByQLl)vf{mdKwZy5iM=sy%1Q19|65HG%G6KG2 zlN1rh<->-v1vt8y;N;|x9)H(u?%=L(Md+1)PMyPmE)iuh+1q_F%MhNPON9`y+nNvOzrYe%~Gl)UFM?EH>Alv&YA+8e5{icHoV1;k&p5 zaX}ms$t-iMv6T~=_@P+ry7--eMw>})$ z!WEg%m@TevX153)STXy@;04{=Pb$N8tI8Pphh@y4KR`hOH!jNW`?(po^9f@T9(J_W zvx?ewxU_qTeDDvOr|FY`2JA(=+r8ScEUe;3^4)`mgK`J1*yMI`bH&t?*Wy&;XYSov z5Q^5K+v78JlSPIrR|s-Lws5ASlG22EXI4{-zgXRE_L_~G?77#HK4UV);Hpi1 zTPcPPE>gEHDy2woABHogozlB})ilv9taz(v9wEllaT?ags>@ zhW`M@oFo~5s(99^y;*)hL3VLOX6FJ z2u;|6*3S#~@)>3=oNWb&1g}7HMtaC?;~*%s7+@FX^8pwn76E*{tDFPh0H2tQo~KNL zH7tI}qiVD8Wn7QmF5T-YF73>u79=x(To9*j@W`wL~lD}M5>pAFlyYUwA_UptP9 zS9gkOu8FI=B)Ug$zhs|(K2L`>@e(d|-D>ei%2pPzu-&ym%WSo{A&3Bx@_+)aIV>(( z_#49Z?yn|~b9}>T4XbL`HwpY%{nQI*6pQykR#G@-BLo54goVMyfRE?L?r$1Use;7p zlgt|cCwI=ku~ryQm;nN0CES+ejm3V+XE^f6EJRe z#QF5JHN4m7^L+wumu0K&)va}-QnOoK{pl->x5P*hP$HmJL$AkKG$X1N5it zx8-U703P%^cQ*`?e2u^n(@@N-y7 z^&?Vur%rQ8IK^HGHy3F0YPP$(?ceqv2_p<|6lM50(7;BvDy-5j$T!0Pkt4Q{O%!O&Y~nk0k~t)h3v!{ESoy38U(V@$YFMV?-MN!-l$6&* zuJ0SSvv*!;T_4}sUxYkOi^M|_gUm9jadf@e)XM8g%i&6&FZP05k==Do?a}-=e`)X8 zgHNzoyfgbgd{OwPsYA2LI{N8e3GmZAD5S{KX)^eZ?c*;ROCW1_WC;SRxDq4Uc*n#a z+PmWyimgtU;6H~x9{44rs|Xs)z*ahq?}%qY3OpCOq{3#8&6%W)ub|VdTzRD}*uenu zzfPp^r-#}wU&6W#{DL^s&b_m1f+UPIg`3W1A|{nqSrvn-tTCwwvpYeFb)?zp=&NC4 zq-e?JLZ%%vOtOnHFj$SVsz8l#6r>gs6lp_TZeKa#Lmy=6R+Qn)r#n8bF@>9k$#ZXQ zF5h25IFrHO5-~KPgv4=;3V1rHMyJ%W+B6&!l24Vl?b=CN&lK*PPU^{iC|vj#<5!De zxz#Q_H?Gfdauu3u+Z|U@)NW>2L_*?wyPIZ{aRC-5mE7(EIMkxZV+-W1U_9Zr2NSgmZNW>ynO%N*@0 z+9-|uxT8c#U1C04G?6rhSs9oTpORXkx72lgS51=mcMU36G!nM(ig*Aqr>Xh3bph6W;-&( z#j4cn(B)E+O4VSKYR*lmB;LtAcky@dUEs(!7We=VRSpSe!NJ|Nj(OTQ92}F7O53&Y z#nc>|n|uH=0)Pm?1%Wxq0Bspir1d17$IwJ!@t1raFyXV32n3vw$qaFU_ejp>$*m*` zzs58342bi{;YTBYcn28+0CUD1@R8@ep6hu#Udr#LyI$8zwXAJc(+LCR!Q&vNImY5}bDV+?-6tK08K#Xrqre1kMh7Pc{gIvy2`3ml{c+md zMyLtruq2ba1%Yp`EO;SthQTKlkiaoG`LUevNzOCV13W1M0OuSXxTyM~OJ={M^jEUd z+b>RsB&RFr_2yUIUu$jAU2E0!v6yU=`=^o5s}e{AlGyg=kTOR(6bmKiA#gf^als{W z!;`@{3+i#f>8xRG+29Te0|0Z|90TeA6%Lw7 z-=(|js#opW?R@NQN~g85Pez`Nrq!*zl75=I*)t$O2>YxKF^*3`>Q^M5a@jfd#!J4; z2;A8xk^o+Ea9@_=u*d)d&>UxO%h@up1fuhfTLnoVF(hXsr~?_=dIlS^wHY=X1{~#b zO9C(m1Yiu{azSB%o<=~SQhGga===HXo4S5|QfI3S3!H4$`)h8>>giv7c6UkH?o>$j z3>Iu~Hxq^j1Ptv_jB*Ii_jvO7tDZqT>kT_rl6@fdBI5;4Yk%s2f*5X-JK^uyI z6&rBQ1_?Xaa=?->z^-yhP(@j}(cL2qB#D8;RDq2d*Wv-8Yj_vEK?yuXcwc)Uw(soXJ zd_OC;{Jiu|{fx7@N8VOmtM^GHE^r76xd#N}b7bVG$)yq^f;({C2|=IYWd)BQ{oLSk z2RO!z{u{5paQVn$<%3{kD-EGr zk_G`800J2BYRS2e4Y(YUmnV2bl{<*bJ_!LvF~$MFJF2~-jkmvLWxcmb`g+;zd+N?w z`ClYfofWOyPP^%QYv*pHB1t2V#dj_vWgCG-Ay6SGLc|kt6<`htETB8< zfw(Cc`=A}50NCdhSV95KyoNk5kQHZ11dEcct(0xZ!Ag?ADL5)V?GVPw5^1|M+D%z# z?ca5Kr=r)dQ^&1@R%*)nSv7uTrn0uruGde_=hVIr_}8UsF~tXp#ipAL+>DWHaYpm_ zUhY{oyIbq_B_+A=_0f}JPUJKVA&TiPEuxMEi>dKn!;cL3kSy9-!>3+P7o7!!mtffH zh)Nje(6!ZA;Dv%nvPWrn()P5WIgW%sE+cXDGx3{_|5$&hAXzu}u3G&1@0acMBK_bY~ z%uqubD+VP7FNppZY1eG>Y5II{NWxbUrO|0aCeg5?`3^RMr+JJaAruVniEgeDR7uB` zr)I3()$I39*4gc)jyPATOWmHluUp4ew)a-itvl%K^geTVyk{EVU+K)JsTS(vB(Nlw z80A^Ac>sVx?zEa86P$VXcG7d`$S`%`=TlcD$9)Vl>`O_hE6~^BOq{3E>Ydi z>t)Q}Yqw<8w7$A7jO?e5ZL4aYofWiKx_aHU(OTW?agy11g~@L|6xxI_X`>u@tJ|r|l0ojMR46KN zNyy}o56l=|6UcSv0F9q`^dMkxs&kSylh-&Pj(K2`(aKs|Tl|*$?62k4$6P8l_)jrhmQFC6@#k2ubHfq*{f^gT{lsur@m01c0hdOvJ%HiA`pU}pic zGn1P1mS{m7L^H!}4US1C4TfQkMsNoJjP{7h2|S`7;_8Kl-h^Y3fu5h;>_Nvouvb>y zUi&qpw`RPbZB^}SE~vd1UaxDnqP6sPOMAZBo^H`yDLF|289Wn>*d+6u4m$QEaz`|U zZgYkXFmT!2a6mXX=blREsm5}0YtW`kU^C??&eC{QVhI=-9mWO&E;;}d^I5KKl$<6H zPM~r!NFybH9N^#v0Am1wSu7sbOQYR&wYQbm%kdk1ZF}2hmv24aeN%sj9+s|8Odf!8 zIoeckxWNEpC4oGWc{zJn5W9fso&gL&$pa%No(Ba%Jf3k|#bZH}>B-9WJmVPSrg5Hg z(~6}v!p3kz^(lk6=Kyp8PB|Iu4oC!!47@7ctt{{FH`(d$dUpL2y6xKczP&80-Je_S z>8XlRSozvP;QAbnoyi#Jc;t?QB-CbU6o3YJ0QBGi$x;RhP8;B%71kSZofiTj0cNx>b@Cp?Vt$T%b%bQ?h6oEp;FU2E3YTIk-p>#p`) z1fQk4d96J3-rYV$9QNQ0^f&Gy%O5`U3GfwA|e$&<~YVa z=v)lrCmfs*c>sWU9qCo17}^`Q>|}lHg!K-+TGtvcHZlKy(|~ETWzn+ zet+f)PPzr%WlG-l!n0=J%QwtoMa4o;8eEp zm9oz(!8jbL1&GNRz|Ma5c|4MNsyFTah6l{KC^mt#<8lB<85|$uF0BlabB|CjgA(^Ni$1u}J5r0}R<> zxXA?aIXrC`zyxgzoVG_JlT*@Gv$}mXOLe@SiN4o&(?DwRva(k1quIWirG59mlh?4b z@k8V*k~6{1ey0VOaL6R_oxpSe*H>+SZ*&260Gwn4j!r)71A;#hf_E?=fIO4;WDTf6 z+7CO9Nd%M0AaX}g0LBRGPf6#6zDGSd1-USNu3J(Nvkb4s3?dR9NM>(kIrs0b!FK}=aayjFv zU^2PdMhVHu;<-3A%h<@?NdPa)oaAl;sL2@QWF7(UkzH<`;%j26B}G4Zc_fghJpJN$ zJw^fHMnKAsMj3@BmDF2STBW7AZM~QLHrCXa33PsY_0w%UwCUXQC0TMeWM{A-ocfM1 zPh*}lp1cETAOvNYemEa5Jq~aPAmshvNe4K^RfTS5;Wu(Jzq^o( ztXeJPxHy$Y3BxYjfJne3kU$56jl|?&^{)b+8f~kl*4nR5w|ad0+S;8H#PYjcC)-ah zj?b<2{4^?%G63U%Pb8kaU>*p=XBZoYLUI5xDL*LBp$(jq$iTxMm>*C{BRuqR=nWSw zf_C${z{XEMc#em*Fb`9n1+=q&XVMCXnm_JqR3w z$p?dh$m$O`+y^Hkr$gmM7zYY40U0U)1d)JA>Q6v9ARkrCX8j`Lg$3 zlgfeufJP5jELNW_y*FL=zS^a$7c``95Myy}v7~r|z9$ zmE#*^SV|}-0Y^cepaI7uHyI@7jsb}37BTZEK*Zp%UYvaa^vK%T!vIEWkZaqv$af`9 z6pj32umEERJYWIXld<$e72()YJ*zpI^0y3MNR$X47lk+`oXIL91tc>@QIyz`kRyQmZUtfIDZ%0WFy z;fQ9>U^<35=s~OiUdtGR^*Gntw-@dBjhf#Vj$-OQ2ba%IXdb#}4dE~L~Hjn{1;C07VJOEoh zhNEeZ9Y_PW@nabP*z&UptM^*ARZ z8RxGJfyNT3ytUTXwf0HhrmF7UJG-+~thTpxy|uUb6SRa5K;x62Opv3H2_zB#=dU=% zL`@*iax>SDUOIqt^Amyy$m6KRW{{DAfx+OB&r&%jJdw$7PJUX2q&dh0{)qp1CI(IO8L*;Pr<%!2bZgvw$(U^y$FPbHNxrdpn+fTn>7V!#rS)G0=09 z)3$!uz0&BnmYZzsp7!r{y$zN6{(tZgnBa~*2XT?y40D`=->yb7NJEZCsOg*!PB`b# zj&qU;UO-X^CpaGX$j^QN>_<7QPIr==NgSa1$A(EELVN|5jmIQPbXN{4ny&pF2@gU{#*BOU$mPhB?i>-T@3PThfW z+#HW?o&NyOew2lY;GfV^_x`6No~NKEBd30PoMcjCj)#v^o;m4(&miwz}xeMV1H>U$2o@J>2%M->k|5Ey_- z=t%i;c>BO`q%hidXV`-_4oKWi0XPQ-9-t81fypJf8NnFmfF*_47il5>-icohNpLFh@xUW>swJ@NGf=ZpYyXJd@x-zOR52I{{v+sgo~KqdB(k{Y|wE4_U8x83SgD#n`Ta#mK~XWvhn(b#jd z2+a3$t&NB$5-{B)yl&eBVK+OIu}KOQHwI>0F%_eGX>m2If7v!|lwDHoTKfL*jP8cQ z%qk?49PMWFE$!hfqT=q?C~K$ir-8g%@e9OI=>7`Ob#E2xQlNCwblV4nZmo5#?CzeIOI78oJbcqV!(kMi zO3=Do$wpE3n_2m56~3wQr%{K))^aG4KL~hhR~uOtgYe_v*N1-Fq}=#-;Qs)Ij6PdP zx_q~uEY}h({%TLEU#<4Nt6em%RL2uO%ouH~62e6LKZ5wb_Kxu$s2(qbz74&G#oNeF z8u*!B`%}G=LFB7w`Uq*tOCz@AdzZauGVeCFp(F{h{{RZ9HC<*~{{S7{>%SEIS`@MH z)`fKD+RUr38sCcK{{V@0ooy17Gev1Mfl#oHOL-1co$;@ZejI!yxN+i*a=`0RD@4By zei}Q?eQJ^b&1>Qh7~Yv>X#QmrK=Cj+@#cPd!~;Sy7+nGuNLZY>faQ6QK(I*ySCjC zo?TB+?baik65xS&;G}^YZxpWqF%TERTHntD0>Uvj&RR}3(EK90*!s!Vh zqG`}9*S4N`R7aG@XQ#yIB#qSr5##1JW<|<0b*BsMbo^-+AdyYNSQurxLJ+F&n1DlznrwQUuqYrc|5W+moj-^n33IB zEB&ReNRZ{gVYGSGvC&-0I@vUx+ge)A$t{|-z1wKr&%evEDJa5Kz0{m#$gOsrw7j1x zR@uc(-Co)w-n>ik;_Fb3eKWxpQt8%g8~r}&B$rep0ZX%}7Vw4I0SYb&k%WSCBC8)0 zxVgHL=1a{+@M;&=1w@iO-gM!xLGzuw_K>JMQ!*e00Y_ZzH7;Yin+bSfvO)&bMh*!C zD&b)T92Pr}FbcWjW(cM%a75cIyxWF9BNGplys>S{Kxb@%asUJY#uV)yY^u(3yXI?4 zSv2-a>2-Hq{QI9>hM`J|<%&@6bmZNwyt`kbid*#5drK-3Bq4u^j!{_dILQj6HaK9V zj^0_Yb5D-yE!behkg13HzzPV-zzhZt938+G4A>-V*ywi>sB4J=E`Qa#c~YIqs;Z%) zem+vGxTwxwJBbHrbjv8fSrLf<9sreCr~!csjoDJWvVa!rf=C@v!%9(4mQhV7uI=fk zXT9`0BPep+**o;rZk6nv(zcee?YYUy;#N`+DZwBiQH<>j#hNp*9FgNbQ{A2?Yd-;lnc=BE<2W9D;n+1e3rd=EPcc)x?MFwm0$> zLS*tS$YzWwMh)dFGJ=fj%CZw7Rwsq8M7IiMHtPu9TL`g9aUSN~A^BBD&g2r!^D2R~ z5~SdE9uT*CO-Q_n5k`ojhmv(syqSgt-~tsk`Q*d62*x=W*>L%C}i5? zDF9_y;2Z_Cw(A%RZ>vnKL*_Iq8wOS*cICJ%8Av6Dz!VUC&zM)-XxEokE+)E=%BbOj zr<`0s%mPRD_@s?pMK1@ZOXIpW6-)9lWyyci3@g%ad#;naNxndh@JC(r=kW^^JX>gt&hT3<$lGZ!r zlm=BX?v^(stb2p*EL?o5gJ9f14Tk#C?#j&CYBo#Zj|?rsTinDhUrTsiB-p<F zH)P=@JG9bvySlqqyV0xLLxwtVV}YX1a4<{Arvq>tDO?gr04n^$la^6|EP5xH#~M7S zN#(rQk%0Ta;iDM}tCBVr%AN@W9+7KrXEHH2<0P?hv}A&$kg=@A@Blc#TylO~?xAGU zpe28_t$4;3WjR#}M(-`;49DeNzbckF1fU~-RB%?^w{?3ou9~-J<$Le0-3LzzP0BKr zR+O4)w?R9*X>HZ*(cNpeUp|w=(*Q@1!#D+0rbbE0CnM&;C5FL(8)0$@s;9%V3=P3@ zar19HVDXdyjo4wpCkw&G1$sPpvB~l)T9Cw&t0ZPYl5nM2qbv(C0ZU0LMloVZKm71yZ}fI|K4pp^uXkVqH87bhRSPK5FlFHDvrYY=gf zxk)@@906U=lAw}aVUCQ&a6*Dd%&*7YQbFV?3hFbxqhhOoC7YAT+PQ9o0K17HagKu- z+{A_pQ}rmdep|gg9;;isbys#>`ZkZ4txZL>%Iux4<*T-i`Xs*=?QW+gJR-<>nE@Q+ zoaEq$}%u>=H!;jkUnkW<>Q4J=O?Zo)S{aAR*&)1@L$!nIVBx0 z?yviKU(()%dTW)g@X=^Rr%YX<=Ib{mq zj0m87oE2_WHj(oYz|KJ>YQb)&PL?1uhEjMS7vq;ZRN+H0!NAFU;hPoe`W~MQt*DZ# z^JzMSAehTIk)kYw4atO1jvVb}RVA`BxNw3bD_+G%O32(>|BCF@>E zr_Pqo9G>;@bHl%}HjnVnLDj!!zleVsd}ZUfHIt_5mfsURBjEo41VZ+AekAdkn*L2E zMc2GdESC1(4Ts_6R#9o%&BI&xhV#W2I*B$D=`h>;uc&EDs9Qwl%G!IoMGzy)HO0Fd zSun9iOcKYuTD~0_0?62Ok(@J{kmwe-8lkz9O^Zs?V1Xiv&q}h`N4<@Jk)teBY)k^4`4YkSx=8(aMr7W3ly{{Z0~(j$nJQG}fhvdJWCg_)ykhu^=v8)#&Q4-02^9kMv{G$+(sEr<{u~xAqQ+_9!Qcv z?4)G5AykjPKyDe*#7Z-aYE|u{lIpbAMz(k9^FIFohPa!HaMUVca{Sj9PK4V1)irxg z$veJPD5kvPoAcl6?}q;Xwm!Y^fcUS&x}UQH{qJ_yq7A!8M!z9ECgnxrhU zs#`2;cX6s|))Gl2$C)!5XclR%0(q#ht1Hy~l{`J+O?ShdGtvB0@N>c*KbKM0ts2Y3 z{wbeZvA)txo|z;!7FtyLMa%*iVq3<$zJSFw#lV)p+x?tcqc_(&Z@|9+X&_u_J_^x1 zF0f2vy@N@T{_-;%;#h^Wui`yZQMP@d)LEG0|p3!~CnnOvi)pHP;lpJsOni&YcR_8Y-q8dub%4I+#T~LU!kF zc#GYnq|>_mqxkdjlU?}b@h4aKyW*b&=-w39_3JMRY0~MMKB25GpB!2rgY>To*h^_| zsn2(*EO)v#i)`+b>NChB6UZi#-Qz{_5pW|*Eg@P+ZSEw!kcNUeCU>=YuHl5UTg#{j zq>wahV|LtKN!(6P(Ek9oEvV9dI(UM^MDXT;;jIC5j|iofnP~);Hu1A~N5k;mPOx3w z5Yt>hX*8x>{?!#`4WBhh~|5#y_`A0!zDmxJ7lD%J85zTjghNPEj|& z!)oaE>In{{+}

    B!Cf`R#gCjybu^S%tllq)C;CR{CxPgQc$4fVbU&?0F9lihRI#g zfTIB5lH3MiVmnU+woT8CJVZ%egGtnIc9-Ok58T3{vk#PZ9V@DxNXjnht*oCa(#qC$ zZtH#R`utQV=FpU)++{1Y*R-PbO)IN(cE5Dp?_^ts>h%$X*394`QWj-W!FMnW&l3Uz za##>s`@n$4FSNnIn@29i5}hS5j@c%#HpFbA%W zc#2pl+&4O$CQA&A1CqsZNIS%MFd~RGt!_@3J02W-$XQNrKYNio+gDzc(z{&~ZF*^aQr#G)=|}=Mn{IH*lSj2v11pRm3?U+`tC_ffz<()9-CyGPncxcwBA-u4~ZK!&)TgYIv(&7+eVC z@azo{Y&J&gd9A}0AReF$b!=}EKY*3Cc|JJO?Ueka>Uu53xe1v*X#{uoOsbetTgbxj zFn0jk^0uz|nzi1s(Oqu2oB4I~>*MB_{wlx;me!Gi&5#wHcMOtLuoZCpE%=#(_Khb% z)q;{s>HZ|}&ZWENWef$6h}KnH#`tp<0AJzc9%;q4z1drRBWqo*s?FO?uDbeo)aYVe zooG19NoxJ&(?>XJ-cc zjCRs$DQP8Vdu*+Et6lV0U6Zz_BT#^&@~zF>(ZiCh?h$b?4drS0TN6iNbYId3zV&(&HqDWP9q z>6*cg25a9oM7#zFl2luSlVe>nq|w06lPu6mLcwzbJ7JPgu~lCzZzS61 ztg-ou$d+Cjw$zL=PQeyQ)FAsp%JIh~ylm2jjZ#Yeh1G8@?|umUVY-e~T|-g$cdlM} zX>WBobz3cBTZ?$-`!d@|j|`u^wrL8(9EL`f1ppL5>%Psir{g#5dE$!!@x$ScpKNRv zNjx|EPQ@!j9q^Xo4KLv|nw*o!!r0qfTHC`IkrA*9g_>t5nUnV79Y^6*{{Rei{{RkM zc&EUz_=fZ0Uy1amu#Z`mJy7e*p=$6&70f6RBE6F3Y-fRPBaOtjR_4)eV}%jEPaRq= zykemFlwrvkS;;ufrEZBk#@2V$D<9u}31>JgCK3^yMBz^v7bi}XWUVDiqxOnhMQYry zrmFo93(_QLbT18v)H*+h^oZ2?{{SeBbo)T97$Qu$!Uo#IW(LyC3Z{~oQb}9MA2Xl~ z50{Y1v>b)q8tnf7Rx%w<(iKQ$9M6UPN#Lzl!afhUgT@{lXyx$6jU;N?rJ#`(<4U%? z^5lue_~a1-Dx{IK%91OjMRvKdd*d$$*_prMrqX9n;hF8_dzjd%-0G4ob!OH7vBR{M#aE5%9ClYcgZWQJ>6SgsWk2Q>GaX!90xOMtuHTnH+yuxx9QPeYdw2b zhGN^?1D}*1kl^qE$IQSGxyUQQAQAyeo$$&OlE)_sK@3B=Bjo@V2k!y_$nMy#F+5wo zHhef-V{)WrQAXk!TVe&_aq|WZu#i^(nB(y^w2VZhkOm_%d1wI&8Abxe_}VieP)Q_Y z3}vx}IbO;VeAj=Lt^BOkuWeBO0M=2AqS8 zoRGaSkf0oT9Iyd}$nJ{ZeVGST&zjj%2|JtkiQBhu7{?@T84JO$h_qH^L$1IHI|8&4 zi4P1w8G%U!S1Lvc3Roc@|nw-~0hlIN7zlE556BMRn`t=< zjN>D7aB0U>VgCRvxC_Yx0A!K41_K{4BLL)dW5~xHBUq>eT$~WaNok7ZgKhbQW2iVJ zcPBX`Cpt@;81O~HQNkO%KUG-Wk>t&|)cSmq_bjL5p@c>Ro8RbX>ftBO}Mi}IdYCr8!{3nhu2_z1H z9AM))JF%WrX8>Zjq}DA#+nz>O3|M^XGC@|1ILd(8+lD*A6waNE^xE#JRy-f^s;{Pgb5-*+h)ORaFE?+eib0!7K~%ql3lC*I_N^Da*v00d(k zU<#uqyKWeg0088j4i2y87NXI0$0WBO{WQ~C1Io+Owbi)reugjvd(P`(=yKCRqQPbiq zzN9&$R*ainDkpD;WS#oo?)my#YqrcW74nmV{{Spxask{41jCLP5W4Wvd18eJ4A>>Yagr3UT;vi- z<;zX~0E#Cg%F&~RbCr2D2#YQ^{P;z8;0{XX2N(d70p|5>B$cPWope@LyX$QaK3V*E zo90$-+s8%jrDtpR)pgYLNp+1rH4IX6N_XFe8DL0UjtBcH7!poTTFZYFS}Fb9Pk?d> zX|h9bpadCEcM``c$GaS2xFv&Gf4m`6oyW^y&4wJWF{pM>PCn@;lFgj8k*De;66r2F z9k&Myk~ZXdTZjR0axhBm1m>EKp9+sg)L(UdTKv4$jLGo~8gcfD?OA^DD?Kfx?`3^_ z{FR?qCaZUH0Q00EgMa~G7oZ?)=ubGoJQL4afJ=6B`{z-TK>>&v2j?DxBxjIE$_NL6 zkM?L|19Qur#DLyrHxtNWPauN8o;kVi+pw-^Hf z3z5`wlaZ1LI6k0~PC8(L^7>YIlPitAuzmaW_9FnCXXU{(p~>VSZ18cr3@|_+L6L)= zp?U35_4K;QcHi;$bm(6+SIc`^*Y|wZx_NJ^(VC`UdB=Q{(+3Bj8Rr}U$osg*LV2SH z)9MZmN$NrA&;S?@z#7H#m~)Kr!8~LTSb{d>DC3-W2aFO|&SRbjPRs!ylYj{XHr(-m z$AOX83;RV$G~J(;+THfLTI=O)M5PyRd1%s0McZDwx6yj&u5>QC$Ay1^ALLA zV}JnKdQzEz=mv668Nob^0C^c6op=OvCkdxHBe@_RcO2mV0C=}J86cDBNGevGW@C|o z$;WZdTd)Tl1M7j;2PUdDdENZm>2|bzJ8#+k1#+t|4Pcp+;~u)_Y#-!mDx=z}w{{WkA-8whZ z%XrN3l8bCkRnHTz9dJkr%Atu)PXw?XK{Xrsj6wS@Ic}F2JBT5(lzg0HIOBKsxeIef z(`>g;A^y~#2_q)qrLsoY zQ-%)PhbL$N5%1B{-%*!04I*8{&Cb`@yOrMNvy44jkIvIbeZ;dyLh0AabVZ_e~B$j3zk zcHrN2Re;DO94REPbr`E3XkrTha(Ngy$0Qy(2Ol>^Z1IdS!01wgPWIVbU7ftGXZd&3 z^r00vJyUM&MZUUdx;TU^_86&T|dJuTva8Daa$5Vqrm~--vOyrS*P6#~o*ro z-({n>TWGYmZ`96)T~bo_rjv5IO|5OqZ!K@K^0%KtvqO?gfPVM!dYoW@M_iIY9D~Oc zzH9&=o8>2W0ftxR>&71)fgtt9G7Vvyh=$%rQbsppBoWgcIKW}I1OQJ#N7^FC)STcs zBZ59)++cC?uqa1PMn|Db738hi#ogZ8UE52&-k*9NCXDDc?>=2My0z82uRRh=^0uJ3 zX2wVu7*U>w1ce_cU`XRC7yvRs8OX&5&R3`)^V1AT&gB3M0CCAA3<5q}PwfEY?a3!6 z7;KU^bF`>DjzI)+amYChGCLmIa&ikIw%i^Ak%P2=PC?tabtbmEX?u;|O|JH})3;q3 zwcp@OqfN>xvyGj)-$!R>_-W|6nr*B_1W##m8eKs&Zxpag61)?{cJGd8ws}%Q;lFts zpjR1ETy7)Ab-#fhvnPsf+fea8!7m8vSM$ivEY^#yXdh^i&n98u{YS&9@|I(|Nuzdc zu36YCs(MVQjt0$vnCA?wo!f!RDi{`2~M5YyQ6V&y}Bt~YOeKXjht|w4QABhvDiF5FRWu)oNC#=T@+;* zC4RQ=^L!4G@MGXchqXK_`!{?fuv8(IeN#x2#TW5_SpNXW--)jEi_{H+wbo>i90qJA z)!n-Id+_4!P1={jkA?B6O|qn34X^>?QmV?bDv2<2Z<01*S)|WfV(RamTaO*YjqyH+@gAZ)Kl4iKpdb|~9{vBMSx24s*c5K=qah zYbnC8JAnXLwSr(t6C7oUA`~Ek7-x}z^AG^qMnK#FAk_Z=XVsUzDb$s;N>gnwg{5Zn zPW?LHt&Yj?FAc^qojkt_2`I+N(~8&K(Il1p?{{bS_Ey^7ur0pHb9->`3=gyUphTMn z&=LqtQ3MSmG9g@m$~!Wg=|$mU!H7`9YL_4`0FV9r;2ppg<$&N9qTU;c!aha^%tIm! zNwgD?>IozuCmPr9y3g8eGzGKKF5s*m)a2F@$2O<`a z0|PxAV;^^DINVgJ8+jPm2`YB8;2O?&O0%-&PVL)8WVEujtJ6=u`gCG&^zku#vx7-1 zsKq;cKYg{)KPz1Ge~K3OAMk;ELI!5tCxSdu0RccIygR9E##u;aX%ing53~}h8LRO| z8_h}^3lNtxsy3PvB5@>A?~L?bW0W{xz)BIoiZ&%>G6DNt@dnZ6@Q;n4^Bjwx3HXBB z{Zf!j+9m8`a8)eW+%t@@3fNWNp#CL6YZ%k?zFBu^*6p;a#-SQKsSc+(8`y#!OP6<2 zgswfjuLkMSuO4+4>QZf4THLK#_O`Zm(%0Lm{(b!}uoPp7$y{cqFRS8VB@4wXOAhu&Ra2dw7AJH}q?(c5I6*Vak>-+DjK zTvl5`zci{xoytv3PBD{dTH9-XT{m~w;jT2>To)Q9o;gqTmc@cFD!>p4Kui7diW`E& z6i<^mw2d?nhr{|I03VegQ}P|fFz~ErbFN@i1d<61nZQoU;iYVqyE!0jCIkdLg``{} zl*8@aoP}UU6~{6rEU`*U0eav7Sb`%YtK~MR*r2A?#y256Py2I0Jm9(tx($PJ% z*>tw6ZmX%{&nC-ZKi^TMC_6>ooe4C()o8`7_tM&1bDD1s=#O(8QTR3|x|I%Mj!i<^ zeWWpGj6}v~1qnM{85TI?No8b}+Hh!*d?z-O8RRVk!f#ht?9QG&3$+xmeLC-ES_yvS>HnuT&AGP+;z8#d_m#;O?CSV(wf$vJ+!v> zQY@(`k|>oTkljVPc_c^|V>5{i$QnC>OS3oAzXAR>c-!K~?J4^#_zLp(Q}Fh&uYS<~ z01326d`01OwQHy@bzg{n8Us+9?Xq7-dHtF#mr}O3xwVEAYhNyTr?&zLJp67ALO$M_ zrO2Y(s!CI8EhPD;PkBMw&dolk`aF*&@b)gK_L9*& zQ>}P@X#N`N)97>CLl29rJ~DV3#cKEhDo&b)9m#4;fiT( z?%sIXOY6AqF*W7%k8}w5g!pewxq!!gZyn{MnA+iQB3YtoW04vXZRG_+BZPRy%p(F& zVUFJxo+i9trAOFFD{E2}YNZ#;EoUmxoSa_HZt}ZtrN6m&Gw9>M{C$>TGpJ7=8dcI# zbgI;YsmmozIeS>mrDZF$qbWXCoNUwlEYg2qKaRSpM$!1M!O})Hx?Dn&Uc(xQSdkUn zdVQiuV+8;T3mhcT$_NuzOuz6<&yV+*kv<@JA`CY5RkFHYE%4;DX)Fq{OOv#`YN|HI zqCpu{Ke%?FK!GE+5iS)JD-|)}NmGChG7bqG4WNt_BCd!dKQSeEJb}27qYK!a1yvY5 zSEoUNW?0Tu7`jo7(~|aGt!?FGot?B==__>oZkN#K!-&v?YUTLKvQbN&=6LAJPSAIk zC0MVP*KXT1{{Rcq{t0XG_sv;T;zxlNMJ@xFH8`1p;K$~{V=TK#b^(0QHyk!{O6?E$ zCO_>8RgwN9{5wTwc@BTIJht4$F}__U>>y=+9yKzt!pV>&G5+DlB#K5^_OJsRm=FdI zSh32L+By-ENhIe3K`s@*$vu(8qkGHA z{o3yAQ2HKtZArDYriM|kMj2N@e zKZtx`b1`-Ztl}Lf!bss%f({D_8b@Mea~#X))}QcB9~xRiw^03|JUyb!$+erqeg)R` zc|m7kvKyQITS&NQ(lHweq=G2{DTs-RHy^OyXc3$X6jDLyGZT^=0NMFKA1(;M;2h?s zw7QDoK(B8a40PI95JAok#S9qZsUVIHHuG`CW_+!zeL8K~a>oru_EzgSzTMYW`yJR{ zqKAgK8Z{>@p0*`&-72|;Ejz1P-pZ{s(tb}%Ez>`nZ`xz_QnUCibqig1!cU7YdlXk~ ztlw+i6!>_N`N&>D{{RU7wW{m>B-A{q!>FH462&NrRC8of7PBQkhr_x>j;JDX z9^T*VmhB3S!HCs$a~#gV78~s?B_rih%1*=mSbS{#n0^ubca5jrclbq};^8db?f%6XEVB?wgpGQT10qnK9Zglpn&StZR~Ib4=gO>_*Hw^wAW9{X`%5! za)(H>i)d}e=fv@_iI|d3=p9vX0StwFki~+AVHu6HMdDZ@ES8!U@ugz8`!oLi6DyYo;`BKxkg$f zr5QoTMHO{uySr|+^;@6BdEbW|MS#S*Sd1Pzl=-ZoR|z<3nn_*Lx1+b;vCJm5sEFIm z)Z#_X)?0YzjO3v#g`Os7bzrQ@r(hdd7=Rt1O@8%BG3t}T!+d*<$&Wb;w`#0v+h21j zT&ej$=O9<6&+u>Js6_|i&y3?%L}9nWn%rgM!!RMgvQXftX*WB3%AvE5-VFHu4*XMP zY0rTCZt=zyB%M4zuS*)`36FG%rN`xrZa8^Cz&HcHMi(%pDC;~of$I`M{^J6!(&!c8l?uFv$Lr)rB3 z+G7tDwxwlx98RF&3c#CK<`TVYb4>W_@jpSjd(AV(S1`)zVg2TZ;Yp#1B|!-hSWn@% zvbURKv4;6=Qt}e)(cLeaLuFh1FY$%tMveSGmuisuq;IGQ|)^?Ik z;SO>gQ|~A~Tjsm%JN8ojsP%;r_<#0l`1h&Wvtk)7z7+WT%8)XyRFk0;XxWNLiqC_% zyQ)6qrH{wp)Olw*DM@K}AA4;QcI(~Q@8tMl!Q5L{mErP?(eh2G${1`zYFCZZmnuuq zEqY$(1F87qT=6N6=fwJkqpjQ|OA^U=EHM%*VSnSw%GFvWGUP_6$};(A&n*qUp=&WE z?8I<}iJExt;W&r~5wGvs)i#GlC6y$R!m7wOZLd+A_9OkYAtqS=0Aw$Z5TdRgZ}?W; zGr7jndBj>t;4TQl2@sr|GU0sd#Qy-Y{{Za~;nC;#zu>RM-wP;W3u~VX{BdOhyBrXv z<3NfMa+?q-3Vf}Ak+fHlOEJK|a-8Y&yC}voit8J4sNZdLR(%=8iQxV#!@g?yW@AHJ zN>jsCytR$5DO0|hy&CAZcPEPb;id~st?OaGc(My$4`1vj3e1t*3;5!7Vv5WJQKE?z zcZ3Y}Zr5M)V2CsP`R zoctpuqoZmTass>96^iEG8I+BZ7R+i+!ozxoWu<+iKA4d`&ZiV2ZKgRI)LW@OVU1lS zJKcEwE_nLGr0yCm=Ho29L3(d;ASi# z@m8+ffT=cvd=<02@cv`Qgc6zC({lsSf$^B&wa8V}Vflz<$ip+7uGqrGA;`f4aUg~y zC?Se&MWsaf2I)xLc_=VTNwhN@s5`U3B!iqUYUPzm^3pO-SE_Mqb*9$4dTre!&BjL? z3o4m=hco!63`BIg)-F|&wcYP)cTF9Q#ovc#09)M4E(-9-q?{f|jQyR);6Vp#kV)J~ z!8xjtGiEHZmI@m=!42~8sz@gxN|TIWjDihSvd}HmhIb9gZG~bCat;piyF!eQmAhau z`G$AW7$FD(lk$ZdgE8Z1QcC0R4nZUU22_v;8bMZVHq%blPgb4Px6bA+Zo)CwZ#%*;RmaPL@`Jl^ zQX3_(OC8L9?rXA?r52p~E}Gv(qQ7^#x2dHyK4#ZV`J0kya_`kG)skIx*sQ*8Y!x*X zlVV(auWu|0eCVA)c^)8L9OYFPs4hrSR-+d8QNtALV{LO4ly?xxDuP62aK&1DhKU?1 zzm{Li;XqxD!igij>0E8b5@GxOI`X*jUO&y@fLwBPm`7+bk!OuN|4|@PV2lCEE$3x z6^?~P8%`-nU2Uq;_I6jZdg*;O(@rdYRa*x+LQs^Y3XT;yQ+$;!z1eo|x^law`e1I1 z@%E-9jA!iUED3Cm9D&au0zRY-)gahcA87?kGMwAC+yR0HdxF1osBHU^tGE9E2(Go% z*jW$0cCNFeHYAUEk$z1_7zQ?8F~0?lKw`500Kz4#5O-SXs6%5i>w0WNjJQ<=ugA;# zv$vm=v0P@ijw_;Z+S)gFdnT;AyXyCEPN?Fi4qJP!_q(!_vsU@vO*PZ0mjZ!mcCJ2Y z7_!E|97svYVnZ=vNdy2$47eeQfyU^@=*oj49nYPiN`g5UWyuY^usOiOINAqF-Wk@? z&jwv2WrC90{+4-XY$)A&v8fm>v>mwvB(rX6k$7ubFqJcC+u3k->sni|2ZBgT={EUn ztZ>VWCgL`o=c*XCtelcfC%U?qyS=r(y>|1t=+bo>d;QK<%oZ`bX$o_RGFt+?et!#UO=oo+H##brAV56rb3(U_o#^B-xW0}glVUroJ27L7 za#T09{1}NoAAC*lwzscb>E_v z6C5!pN-5B{E>#uKpS~uN8*GF=`@K@pi+~g& z6;@_+wI=j2DZX6_jD9D%r*YGWKf9IIJ?W z_imM|Sv_5qovige@_6kL9_=G{0|knoC~sC+#?%3V0x$xsYWQ-%mE6P2JXJLMddaHW zTSFj(naUUQUDZBv3WXVw;fyGRqembru^}wNxk*21Pua>OlENR3H}e#ZM-LyspA|=J z5=K(1=6}LOrIg6wgEH@ueewBXRPzp0pR|wc`xe+I__uc~Mo;yY{{R8}Npa?~0!#>3 z#x_22$^$Z!6t5|m$mwwm-mWv9l?4YbIvZ@gRMe+b|FGSiby*PxG0 zmqtj=sjh08mA%8?eUA1E9aBX*gXOGJ-38RG`Bf#$i<@m3q?*#}Nl9STG^T$x);sXU zFIpMlo@i!}NQ$OAXwn#$DkivLBiFlt#KKUNVw&dVoE(*;uNBXDJ!2)K*JRe$v;P1- zzLdOe!~AKF%Bkh`V~NDzp;k5BI!$uFX-!l8{GzDVr>#W&gOg1ydKZcrI0pj+hR6;F z2OlnS0a1)(kWNU!0uydiC$I#9cJv@;o#O%eWP_42a7n3UyIXOUyAc3R%vcGq6LE&PW%e2FBi z(`xOdy^`fk-plbFb0H%HZqFQK@CZDft&Rc518KsLPI6z8augGjlAs*0!2kon>`%%G z>PIy9n6cvooB&4*0Xz~yj=YX?0O(K54Q=3o*kp~MAjmoD3;Pa(IOLq-rQ*72Z4>$F zySA@e-)&ynoHI@Lwd~#Y+go1h%dVcJ!bw-1%0WD++DRPa3$r|Nk&N-2U~UL5W*^25 z08`O;8%QH6GI5OZFg~~t#wC-Gaocv$v=tc{&eEjg9mX<1#?o%Bqqy2xNf!AX8PD%#ZMRBNNQw&~wZerntrWESC^$fE@BD#OfB zN(T9k5y;#XlW@Q#jyDR()Mkla3PWIE6g!yg*@8d}syN^bf({NwGoL=Ka@-RtbLh3VmhSp>ZTI~z zs%M*xtq4Pw5$4tE-QJwHT4}D<^m^S}eBPI3xwi z`w#~FHwP@Bx_jE`x$kB8xXtpuRV}SK*{!dyrq_<2NV+Wk=<7uQLJc17#65V|cOB2p810Du8^|Zu{u_Yo`5sbl1Pf z&T(>-QoC(me=QZZyT1PbC33zo?hisiIN*WD8*&>bBd7pyG8oF;P=Mo{h9!e3482$q z7pkx%kK!j4AQYO>faJv#!rucKuBGBP-~x_tCzOMXzMvt&yC@MRd7$c&_1MVxBC-$L3NGod{MW zZRdKn2r`_xj=gijKN&TR9b&Q8V|(2>0!G;>B%&NX*Ln^tMPtkYh%KHIR>d^zK*Hk-qG zrJPEMy5mf|aXTj1^EaCf#D8l=lQK98&lpTc5NQr8%=NzoL2+>+Sn2-&XS&JE(9h*s z%0MGKZe)oZm1JUK*b0KBH-QoPsWk}n>&UNkd)uuyQH7RBWRLAp#uzXtR^lPKNjNL} z(bNJrD=73S{x^I^n#$h8R*KYHE5swzZ7yPb$N@!bmV#+yR!|pm%PIgy`66~LUW9S+ zYnG<1q_j>^Ye(-{K3&sE*;}c>EWO3KMq66xxW-$>yKT(wwcRV~i&qx6dT;I}v3SYd zhGacXesyNyw<%ncfOEKDlZ^JYmGdfvP5~nbLw^n#cjZfASLO642Ol=Jv!(o3xL-c< z6q*pAiDJ02yH!jUQf7nAJ6T)}?Buex3!LV-<^JDhXs;U4T|po;vI1n>M@CJDs3&MS z>yX?YY0bBOMw8W9G@jN<{q+27mWJ?(jg{5cM$+u|O{Ma0UY5DCz^DYqafRdzH&y_T zm=H0*3)EzskQ$gyf909`+zr?nJqSC%1oY&3;2h?$Sa_I{16U5c24nr;!;}ni#{`Z@ z0H^~PVICy_=1WWh2kzQp-TA>PqyTV900V*v=N!|UTT`1&-$=bL%c9jQZP|6buYTA# zw3jvadTqMxce{GouKrqoXPW~$b7LH4;vg}Scni>y4hv+SypfWhXPc+?Z(NQp5R;67 zoxlPx0Xe_~U<1h*TQ!1m`ofHiw%b5Yu0MGw91LfmQU?TN)4YvPoDF8=f7d&BP>#69 z7?4glBb)*baa`{b{{WUrd8l==?`^Nv{_XT{OSAI-0Kk`Z{eMlZIVB^5oZ}cE3=zu_ zg(NZOB}Naa<2mw50V5!1aR7o2dLBJCw`>A&j&MUCO}pE~nNx$cn(watS7=zMFi%$DAI_ zF@uqT%7Q`b&Otf!#3tJLI+r|h0^srf^9BI%h9HfnImaW8QP)*_>$~dGy0xCl?)yKO z@3*G9^waORo9(I{AtYdu1~>q*#yXAzwnB$A-_L13eFJFgXIbWliqx)L!;#_vO3V z{{S|gsqQwrEA7o?@^}4T>2i<+XCuE(Y-hO`8P6Hya&wNH zZNNXnYs(xHoM(fEBpi0e0Xe`R5Dy2oN^BTB9-Q?(MsNn=7-NzSagoR%W1ibv=cV=0 zJ85L}-@lfiR|rITJxJtyp}BB)+mcr}KXhbd{KJ~kjepTb2;oS}u*l02rF!HjAZHld zdC567Nd4FFj9_=;2X`IHl06Sq0OyL*iAl5==PJvSxctGvJg+2R5I|6O5(o?ds)~1u z*4Eq6_FT8p{+8ciuD9CVH|f`-zv1RujvcnR%VTPSNehvXNyyuQj1z(mOB@5pp>=Le zs)7#<8+_z~N12Vl=Ky*fXFW1f?62hY^Vf4t7Tqmv72b;aty*N_v`EGbDlb4!x6w39SH{*J$(pXJB$IG z_v-;I+doX6IO8N>jt?0aJPtElvsRPQUD^E7iu~Vq*L&El9=bigSGRq-ewQNm=a0jn zC(s-cNgQ;@$l%fw>DQj5@_X_!27O4u=choUBz`y}9)lyH>Olt>J_tAIjuAMp)%C5B2e!bO|oBQc*bye=dS<` z0X$^oG~d0V?WW0e`K7yTX(asLf0m2MSzEE_Epcf88)aPd!m6sAmMQ~qx!`~aJD8Fi zj0zL#@r;3zHuIMN9j63fCnF;n10y3lunFShYp3~{@tz4X0$5``a(zBgoDAdWvt6x!zRllGl?82V{QiDc`D?#KS~GEsft(%&NF+C6;M-5##}Z?@W8xFtMr200{t zoM7ji@rw;o2?H5Cf;i_qaUy|}*CV0njOXzB zjB(!?z=r$zFVPHd812sQY=Uv<0q$^d+n~)Ra!*c9IqiYTBWjRNd*`Nj?I9l7>-zG0 zj{g9zI&}dY@H=(y`R709uQ>vD`>wj_zss-V<|{7C?nGqs*QX%v&phX#80Q3I@!(Qt z1E4*92VQ#*f72P{;#^?-pkvha@9*^Q?bDFB7{_n({(oM)(SP_FTkrGr*X|1>?z>y3 zZuY<8L==(G@^W%}FC8<_Af9q__yHhXXPor?KhOUFu9pLh3}dD^$K^{(-`CyV{lBNE z#K83b06*dF>^%i76j5(G`rG`v08vFIKp=YOAB8X$ia^Rv0qg94!j^yvD5N>;GJP|O z0AsgR$EQD$ruucq;om*Zao4XIAoRupu=%ob0qA|e9D0tuaZNZpalptKIT#omVZiN- z^uWjz*8AJ<{=Xm>)D`YNi_au+#|J$?I6Zm;0FI!6-vo5vgV%O3oC2hdI_8j`-O20^ z-pJ2Uk)O!(&uUV8{oiqez&z)S05AYK2RO!YThvJ{_qMivUnkY+>DVdMtnGDorpoI} zTcY#Xz4X&TyLtnXduIb4hm4MLa2vim;L`O!QggTFA&)%Hwc3W?I zChxLdc2~Zg%NvGAJYyi_4mmtvbI%~0dYtoyfHB4f2PKCm9R^r*54iYfRZ|M zxq$$12jX^&9)R=3BR5st19Qt0xj_tf6jm>Q2J!-op(J~0QOgkH7^kALNhPkI6YFlu z+Uu_8YoUX}(&v>$c9gy8CiYuJYootSUgArTcP*TkDUX@qki^P%^R-Yua1L_KjDycO z0hL>ed1Q`E{{X4DiQ6ZY*k5Bf^}bhnRTdLTR{+D)5?Z0U-TE@x9msZ{S$2e02H-{ z@iw&+MDO6Q22OvnG~_^DRq;oQm&>`GM$ocaXfVNm9qskjX%G*&G&t$;o<(e(+_K2zLE@=iwh*5Sc3G>-w81in~SA2D7X z3rdbtY-Lt+9J5R1lXB6>NIr2e%r}zmpvPZDhshy_wC2>^le5=XXT7hlUTZIz_~#J# zlZnRj(ZDA{Hc{t{z4<*gQt7U%l_@8@+HB>tT^C2uG+Dek;r#;7LGXU%GT3-x>Mspw z_makUqiQqT$9J!5azFz+YPyBv&AH4b@f&(I_-ztkwz@u+*7iZmEtZoM);7{y$2&5a zr}JLs{#2CX%+zJ_n6@U4);S{;vlJSH_i7-LId9cbMU*y>$Y8aJen%5rLvv$kaT7dY zf?BwRV{)--&jph7yTBW7NsjCQxkHcOaS*5v#6z{3(5U-JJk*i`rX8VEm z2;B~RSK`0NKZlu< z(qzk-G^R13Uy<&cVyU_@%*xxBOSB}yuepZnyT%M$J#BrSoAmdWW`3!Y@C@j>b#Zcce6r+GPFJ$JlWD8(s=OM18jt8I<4>s~SeTB7gycSw|S# zvvyf##Fs;4fo<)PL$Aw;56Z}(qN3%7(aQw~ZWt4ge0kz(;w5(7o{Lwa_fzH8@z=X| z`;XKz`~?gR6;2f61#MJfuOymj%1L|n)hleaTd_oG7z-FiP(dY$bsIs;2@7Q7dkl!k z1Skv6RzhXQ&aDCZ~M!pN02EaZpTpLJAP5MS%Fjg$KD)}NXumO(ZETrYc5x-mYTO~ ztF7I&`5hH;5QDc>(LH)wvRgf`t&UE|L%F|XdDWvr11|8z%95NaqN-EFm&q;5g;AZqE>6%FammOEGlRS$-Jd8hB!vW?K0v#e<(B~NARKYi z8OGR{q(J$t7F+wH?-eVYfJ=O&4nl#CxJMcFDPdtr>XVku{o16hXQuk!xy-80qtUdq z(%0;@vrk=nuAR|Hub3IgR{)+6Z6ss@Lqx$we(ncCK_r54oix_3nBLmwDA@&;LKJ+b zp;sR-$})0J21%=uO&XGrD@w;W#52mDF&QDZw%6n4+5jzrSdq*|%UfVx9X?qRh}*rF za&5rC6U^aQfPQ6FucPLNUjD#p09r?&4w5Y4zD z#p><~aWoS|0cP5yAZSj|NI4%XZ5YmTR^qxNd5p*yMqBrC81i@j2q%FPrYD>T}9iN4ayv5baU4qc=S8b3F2<&+$->GW%b zw6#y)U1r*7t(}d;QLK5~=2k==X?85&2-ncdux`aHYUWXrQPZPN{{Rj7m9*=BH0-Zq z?67&96O1KI!Vy+)nq0Qh_vTjbwXB``HhR_dv27Dlvzk~hC2M7orZL1w4LmV!^CrBV zA~0p7m7=z3O2_->RRp(T;)(CAd^zH4%bh~f@*nJ7RwTBH>ekdm)7wjF4dX4ftTM>9 zsVZ)gINQuVUh>6=Z!Udqdy9V(FNTb==+>4HLvuE@frH-kqSX0TEkWC z6{Mp2u9ms;Jl-aP4Ildjb!L!mCP5XIoJ>nNl*IQh65KLmg1cl^aHy)lpjzkcwHsj{ z*}VCuEg(3C817g^0|B>bS&*?D!U^2rLojc<*%$EaP^O`8;oD1wX%sYXr{3UXD!Rlj zB$f@4KIN6eZ!CA=l!|ZsBsW4OYflQp9A!f9GBhE<-JQ5-!lNiVP#0uW1sRlrIjU5p z2h66Pw^58-l2%&ow{2^^*3VYHCpgSuQl;H!-U;#~>Q(*QX{CN`EcM-8x3$bGQFATS zQb%Qd1FOdIxYH6e$||C}GP2Cs;e>KCE8wJ?l;HI+j}hF?v4D!EB2-=I+I(=9!TE|L zau;SQa+B?53ISyUCmpUe38Y)Op|FWmBe9oJ3a86rvBqD{KpBW5%MM2yP=y;rE#eC! zDU6vKLN>X#nqRY)IB%7=IgoS;<(x3;_+TrVIM~L@PTuog^5stUT5B75q_x-7@~LBE zN-e3)bIY0g-px-)t2?PJ{O@(MRyMA5?-blhWw`L}fquM#msZxW#Jf&FjyrXYVfj#| z=@gEkMlc&L?#EDB7(c>YKJV`zH%ak5#hEHuk%J|yi1{Y~pOMMhqha|%{{U!PNEPh# zORILs3nJb~@-P9xksmf_aC6SqAogX+ti5Z+TCSOFvLx~+%z!P-%RKIz_ml#2a94LL zB#{8nKrg?vPqsie79ysmIVy7Hj;$+Om8mDo{K`oyc52C7#}k-yC3{p?x|2$Gm%F2s zsm1o$-|w+jcxQpI{sr-toJ;)PPN{Kzg>p{RMz}| zlmlaFQroay%v2Y#I8%}d!NDxUpkq)rz2SXjNWAeDqp7%7Dm4ooQtg?*0BviFh=hGQ zfIw`HIaBG=#Hx{h3vZ&jc6Qx1(|?2CT`kGX)Sb0g-7CE6Px z5)Cx2pQlV`8In0A#sdTQRrdjFN3M?Pq%{K|QVK`E|P5g4g$XB?7B+mcuJ&AdpC1#E=Le0o0H{ zD)>-u7$5-oK4DZWc7{-{9A$}c58uW(Q^is@m{#58;X(O*9Wq%<9$Nr(RsgWe4gsn$ zYD`&<@NpkPa=T*#YiVWNb#}CCT{K!X zcLj-;F(2?!~(kOG1ehE2-Ozb_?=5!VAJ z1Qr8uBX$*AV|Z>Oa>6#@$=S+~G7d6SVtpjZKSZg@t(Ogt?X_Z(%)LJbe;>A zjW(3A8+^I*8k=z<#?2xi01Q_{_ELqtoi^3AYByUgFAM9@U0;7+-1rxa@_r4=@eAs6 zsg0bus#K>a%9Q4<>>T~3B2tT5r^^dFYM!?Jh45Y8iKKie(f%-BP4N5S#gC3JbzAK= zEpqEX(gvvnI<@zQlKt*(+f1;U_EDnGeGD%Ymv-@7w08@6Dw~_EO+)su_%)$N3|Ai! z^o>sP*#u(W!a4-rE)ul4GrP-aWHg!NjxUy2MaiXMF({y;FzDr#X&akqQceQth+TrgcGRt=JG{tASb&;a;B(;VcmhzF| z{{RTx%rEqxhSqV&&9E5kbvwIOU9A*_B-O62p=U7i%@we4!_0~?5K`Yh=vtq~ZCI)B zZ-cct5@wOsdp`_LVhrl7xTd`u-pAq`N8(;D zKEzbSViJv7vva8VZznfzc}gx-Vv|<0Ub{2WAn;a{`B{7eZXECjpKl2Y$oTnV`#r%U z3IuJCHnv-O7F&Ptsb{_zvGC51Y=u-2EZTe}NiCPgp?`MD2H6|TNLZCBtfT-N$lu|e zj-Q!4ck#ni)u1VvZL~dJ3npSf$IleH>dF`dAR8#K0)`685~}|I!YlhNh97FO_=n;d zRFLvb;ycq6m@ksX)56w8Lj=if;0!Qtn2d8)$MQ)-*+%NtQ+!FM zYx7-m+Slf%2Pb={uQ#)L>Akgk?t1OV!4wgZZwH4R*Z|79uZMikF!`I52WxnS+&17y z9B?BB3jtuELGKuv)CsmTxS6L4ATdfKyVP+(S3S3|uNC0kd&BueT z;SHuA4(e_h+2WJLcbXiB=O=V<>Y8ls_+RhI5z2&S4Um3^v-pYd??_gULejiVp+v=1 z;Ez)9#;dEpgEvYfj@l#Dn zROPyD#%lJoc1_1^8%w)r@NGKpK$X1Pp9grhD@DT#?+f^vJzglr)-3I5_Ip{}5I|rP zI7VZ?Cmq&}ap7G>!uVI>_N%693xzsIi?pkF-Xpn@qA9IftWs?2TBSfBQzuO;aAN`#pF<&4vm!pTzBJPkD(l1vb&% z-duSP^B`E7MBJk#N6r`Ly)#~)O>O#Y8s~ zuSnAVJ9yJTL`a8*yj2)sy4S>(8kX6BKRi=Kaei&*^B4DJL}fzm2m=K2w}v{jl8ou4 z7p3h9U3;qbl{YPVd%Z2K^is?lw!42bQ++hMPfm+PqPu6R$*%lAwAh;O!2bXm_$|LUbu&Ci!ONL^o0F5~h4}4Sjd*TI_-%$7_JTj9I(%E=7U!PUe?n@aA^9>(W zvb)$fVdIEN`;{yZfW?l|+y2eg*Aq;h9r(xa?*337eNRKUy|h4G7%NR-GD~Zf1)pZ< zp^;AHMO>`!NH5o2ews*HAS9@8-S=-FwmNr**advtr#x333OY)`C_fAgM zw_9pLo)z&0(#P=M_O4wsO>hzXDe-ea@eYS+Gi)MguC@6r@9YpsKIT~@w({di5loNe zxm_Jc;lIZ%63T6I>)}?No;=U_Ju>uViCBy=rBi z&hx`}Ce9Ghn~gSGohMee4C;k$v>V9hvsoZR1GsCsl$iX~kNZ67L(%} z4PMgLDH0tA$F^E@cko97$s};vPpaEm8MRf-2C7T@VjFZP@Ghpk!- zFXFbJ`#*ltWTa?c;!l9=KjAC6wpN}+HXc9lH2xUz9ktV&msPw?YI)i;5xHbQ8#hyb z*!RY^@>*;E00;gm`~dM8+`n(|AC2vPDR?mNd1Nv+iSZKKMez-toNzU~F}ieC#gohQY1Uk>Ec{8!)&KgPDc0QiC7O=kN*n?bqwpW*wz3;5Q3PTJzn zUDEZaZ*&{kW3kci^!s?NZek2&U$x$>{{UZDf5B-#ZQ1NRZ>9K?#s2^f{wU~w6Fe&~ zf_#0V{7LwE@b^#Gj)fM9d!}gC`hK_J{VT)weqDsRwa%$)dvSNEY7k%PHj!#KNv4~1 zKOWwEAJTM*tl;oB#-9dwk4l;DZ#1nB#<~`vq`bFq7)17WT7I%TL!xOC-iC+lt$V9Q z2BzOFo6U5lGv~kXiu@zg?=={FO?Rt&Io9qRjYj)O(Bsv7F?BtITf7rnX}66Q*yNTN zm2Nbc<%L>M(oD%c!wz|6F_U#IXQQ^Ud&Svlc`oU_Uba5x0peC`g!icCmYfpgjp(N- zu2h?p5>2-ld(uwMF=^>z=v^cB@c5ahMWNexqro2wd{yAxJ5SSeh&&&xcoHoaLR(!c zbQ*oVw~Ra{z8&%W^XbiMW3$wUjIN}(l~4AE_MA%TUe{;)et06~EEiDtId$NRRA~(N z9uo1L$BdTl+?}@2*~8lMMgZF`wSLai8NA=!M{a&GxA-CO_TeDZ{3G#4PS!Oh znhA}*m!@kL@<3cN%`NVes9E1>!gpW;T54B%HM^8_`#ah&xI*{fboUpFtm(fHG@ljg zE*-8sH{uNgQ}9*lMAJHi6WTS;hNl67$r4B6c8*15w`ee?&|gws+=D$rAF9_V)NiD>;QQPU>B-aI%xGctN4PwJqx3`WMKPhHhN+@n+URply$UMc=@Xkd<6aSgpUIXl-b@-I(N;9S9Q;G2xV6_b z8=nn96vlfS-vj-hMYn?RF=%e1TWDZscsCCz&D^s?9spHENMqJHT{kPv5=!d(sOqAZ zJ)-WK)pKoqHClZ(H|c-kb~c2l(ah;#ob~pYYE+|INu{J}IbNI6&yhJbqIw^sT1Wg8 zGsV|>q%nBM!QKw>{gPx{YknQKpW$bXq!Oz!iS*kmX*?Bk_IXakE8yE%XH|18>q$A4 zeQNvm3*Qdw3u zjNBEIa(3Exjr=z|B>w;oE>Z}x(tpA`@dsA9d#hF2gUPkj^xF+5O(>Dca!;8ADI9AP z#_CpLom6sMEShT3lC|Qj?wVG$)wljzS*@1GHc|Ao@k0eRr=H5HQgUA2jVg_3tliR- z-oNtlbLM`m{U^HpxAc{>)Mks|UyY=ma~oTWzZSz|42v0P)@A!Ygf4F#RxPe%g4X33 z(3DtW4RUa#{jz*-bq1ZN_Z z2*eV@F8BC(emq?1HrAGYHu!C;>DCgX?Yh&oICVWe#BZ@$-e$If28rc(<3ie*nVT|5 zw=T+K^nVKcPWV0IaU$j40 z;osVS_L{!AVXyp3)gjZw4J%16!%Ycgd03o8E&Mg$lQ0a#6~)vMztR%zq$QH0Xvw>phj zwDq>>ZK}E2pN-xo@lK6*;fwzOjD9@QHLH^-gIUvUHQxd1_VRh5q82)o7FLp8sup-s z-%``s34<7n4I-q&=C2lb^Y*Ivdpn^0qJA@Yufvl{lEXcm{x6#D)11dF`kkfB>uxRO zaI;#i#IRj4-82!XMQ?3XE}mp^#|#7o^R4xAVp3F)40GR?01(AvEr2pIP!L;d1-*>M z^G&;pQkjWaVf#~CsSX<<)fz};I1J0b&0@TTBn{dB0Aoc>D7d&w{d-wIxc*zJ+pPc>oj`};i-{&^w2@UMim zHw0~|q>C8+;;_7mHE;oF zk}qL4Y`s7<6^jWF!#DOcNlMfcJ9qCw^waPvp=QyTj^1U&Z^U+ipENXNyDp}=9-NBo#c?n=oNo@ zvPKC}xt#AqxRu!L8Yp&l*!!~1zdK(5=r_xE%HpH5YgMw^{q3(?pV9dr9^~208Z(wY zla*-3QRl9u32Pnh-m3dMX}Q-!V*{PC%Q45^#pU~|t}?B;q`@Sq<-q}n0Dw5%gGJL^ z4c=iSE^{Tx8<3n~jKqgH2Z6AH4UPGP(v+pRFz9|@;24COIM}8ACmM(>KSff zms4<*tJ0RwMxRI}`Mvzv)LGeS_KXZek_o^vF$4IRtFsOdI19+g!3=S(Zwp{4`9~@Y zhaV_hjjo)4z>+fAAnppMZE?_ETA(|MHU>e%oDY~TaTwv73=S9_+>imQzuFNo#Bw7u zV1DhT+{Y&*k1HdEV!R)ea0%O=Cap|G-&6FAyNa-MAr%_X zZ6uQCT^wy|c`Liw`Sm)*X~+RzAg=*njj}o8Bx5At<(CBK9dlFfxxxMCIOGd-$T?u$ zSxLr0`^0BESl|Zbyz6pt=cx<;8ClSf+r1QIkC~4Nf=MKv1m10_1N|Ys@hguzY2ySa zU=^DuIQel5$B{gB%UO02h@(mIUJTa9I+3>xnl3&RRo}^9+QIcHm*K8*f4b z4z0#D#6?_p7z~~d&6Z|fgnZpt?id6@X4A>ZoE8LtJh>ZdbF^avsUUz!z;fTsXe6)z+sN*)1g<6Xn&r`MW-^SFWqJ5yn9P$$`Nh zWRHTNo_JH7aDMP}oE!?6A`JZQNXAHJBXG$iav0=w``efhIvnx8X*kc!RAG6`WCkQY z=Nu_LPH;#hHU{dQZe=XlVtB)I(5VM~`}rhv z{{XF+DJA>pr`2<8{oO8`SJBNEJ8&|0asdLs$}5?|ZqdE{rrT|PyKQFDX(eQ5{qF^$t2_{jJcsU2)r1Q=}y*+Ab2(>h5>4ve!hLZ9O$j+qvjb;#v}plSyf0;+nnE(_XfHKU1b@6<7jE zIq8BxIQfbBMh`*&2P7PVM>EB60qfg1$@zF7`;r@wGJu{z&P8(#c1Jya@i+%)IU8Gc z7^nj{JHRcBlaeYCen0>m07wHk0N|Vw5k_(j8FP|(Jy`ZazbfVb0JmCcwPe+`vUh#_ zwbbIpXO!hAwKVS2wfDP?m#<}hyPa{qJPt+(##;j<<%r6H2^{>OmS9NZ2BJ4W@(wrv z0LP3TnA@M3azPt_2Z6z^T`z$oDL5_IxFdH$NKufS{KywQ1QZZF#RQTkq3LKH7IjL-xjrSWZh|FUmFs$Rvz;Y8ZgUcq&K-Er1=&Lg~u~ zwzp=^Mp|8ff*WQ$z(^Q7l(1C(5aT2al$2XB6J^+LagbGp7oKAUcBy4>%%F|OuEUN` z#l9f;g%V@JR^AMf9hs18ud7>Lm)yoiit5_h`raVXu|+aiPa?k3S78P|nslVxd6T=f zowZ3@S1C8&weC(cJe~onwIe!;2})GyE@?IH?FhYI%SP|E$7?R3cG5|5w%H`cGG!62 z3TGl*uAAXlo#7@|xY0Znqv}2>Ht3<7;1Q-q`eIwvkj66-_D}bxzhPv?&#V-ta#^O83 zB2ceAhOwmvb!j75nafvHVW+!kOPlOQ`m~=jP6;brDQj!?cemtRee{aq&J=LNV{+Wa zrFRu-G_bX4$)uwBm0IqF2|`xCH9FI2>AGotx7&D@&E`u9t|0!`moE;PYS)^Erz+!d zcy!xKQ*`QCfb$hZQUxvMW9B^Hihd;cSHLD#_?7WTz#k0O6cS0M_^#qb@kxy5YeV4O zHhoXUS4zdUt0t7H3LV827{BAbkMYO$oblC-#lD~MH};m+w9D9Ix4whnzk&7N4B6kp zR|H>4;aF|s)YXD1noG!p*8xnDyRhETXj&h~Uk1ZdohaYbPCk z*GKq1b@Z>qVj!i%d^?YvB{flKwf6C8tJ&=T09pJu`$Bjt##b`i zd@{E9xAATziDYeK!5;{`K?jH1X;|Jvs%q&0h6I;$J;nLc;wNzPBKa75MxCO3P}S`- z7sHPj=rPMIY=>Iaz8TxxT;^ph2HU?GhK5;=Vsw%ta~nB#wo;(C;=ZkY`)2CWJ@w>2 z9c=C+SWGj=KgG-IyH$lFU)(fWqD2g4-+IMjwsG5+mN>pnl! z{{UzU`&r~vp5w%_c=u1!B=bDQU}w}&?2WcccE0_ae6)>J8BDAmJ*KCKrthaL9Ahm~ z(lV5)J@(Unt)s)ieJeQ1i+^6>EL}$w+-C|^F!b8@UEF6H)4J;KXSZ|uBGfz| zmtXMbhP)V{11!EU__g4O6f3dZN@IqD$o@@EfwD8WAD<89XcH;6(obI0H>Hd6;qZ0owHHou zZ)s1KT4}1}r45_vpG{9QH2P?99u=s|gep5(X^yKGYsSs5sXIG#@7KTdS)+K4*IjFi z9}eo?4b|--Hs;}cJ>!21>yqS>(JawhLH5gWbs~_ZXOcH6Rp)TXBf#BFXNg<2uJJdL#crIaq$ujXO=CFDVUES5jnlS>4VTQ$m{RCkTg z%jW0(WLZW=cPZw&D3KkMx9I+*;Y}m)$KG(NnvSKNWIl9@BvvPf!lcREqoX8 zlw8AWbMV_wwA34TNcC@u-wJfc0511-wzctIxj70p2@*IYnF-k{?J7_6&EgM*zqF2# ztLn4se+|AX+G=TX3t#*{)wPcn>DSV?lWxs#t9W-_n%P*yAcbyVyw&WCOC(~_*-__% zn3v!OinTV6RFmKz$NvBlYZLji>em|nw>Fy;yMR}jrB4a!8le&Z?%!ezS(v>Ql(sAo;J6~>0$LS@;wQA0e6N9mElpUOEEL}Ut zo-s)!gq-hW(@jSH>szFMM%vBY{{Vwa{{X^y;=h7^5;1~WEl=Y=gFev_0Rayh&lG{c za}e2`O`Go1I@=@g@DlQbfhe`L|l`hiM$Ds6?BhNY%?Qg9q&G z4ae-M@zYSc&Z+QY#8;||gn};;_)5mw%z0och;*p!nmFPCB4KfITg^p|c^cuGH|(L9 z;@XOy9mTerPJGQI;+5p#O-}o(LNCi>%7>3WC(1FJ;Jjqk&08Ac-PYAsT&D#0yMx!Q ztk39tc=y59;C-XwPk=^ue8 z$l2p&Vtlivzp zcUAuY327v{UQb1P>VHI+9~Hg{UqcnI{4JjWTurDY)}B%i5oz*Vm~|**w__AhNgS;w zl{AMXV-Tm7SI#7`{9d!u^<&|`563Q^@}lW>XarXl%@8eb3x`%J#1P6dB}F@dWsOLY zTjs0pfqKTB8cVHw7x;msN0`LZUg`cMh6tV9Mv~1e+5~1ab|{;QTkpAPQZ$pxO3{Pi zkA~aHxBEYctybJ4LlL}{wgv!*{D{~swg)9VwYMzNu#wqShh7gADsFu6zdMKD8(T#G z0KEEZ{d#yFCmZ!QjT7|p( z){g#SC;_F27AmBL+PG9vhj(HEyD0(Gt0GpoeM(#rWI$4=O57=sY~X{v11UlYEsQZj z2yR7q&-@@(D(krF2o4XF{vy@VL9}InSnhI4w&YAU`3ksgzy@82d>dgBg6XP|NhB_} zuRby)$jrCTk(^{;?k5BmKQFr+Oyvb=+Bz*PyJ(fJ*G<>veiKtO#mzZ?XYxkLxja;z zm7?`a4P^VI`+U2JE?9zEdu71R9tjlXoA?IQUE^|-{m`M+ik@=hc^r_k+pz_Lg^05d zFpK{HEig)NBw!=H&;d||pFMO75>795aBxP{zqnGxNy=@0=Wi@qCpp|$sbKhS%#piO z@d(-uHfl+xcR=i{{Vt< z=_@zw-TNEJH02Nf01YMJ>Dpr~vAQLdo&KpSLn(>XJh<#+kMmgOeQ>I~8nqJ$6dqD{OjozeKmP-g{B z7!q$;-N8G#qP*^VFG7u>kEg%DL-M{cq3#VU<-VT@L zCU1rQBj3r-`ZtSwI^=>Q+l|-kP;Pz1mD&I;FX!;SK24s|#kNXtS3fCb3=ha~#QcO1 znQhoC4?i82)^fnfySHd2@6k9#CDCZQX!X61_IK#xfop*>xbmw;6>odJeYEd)-uphE z%xD;0Ps_A*Q}b>EAOX|^#@-de{{Xd}%}TJiIKap_8QM?F!O6nlHUTF;HaXhFipYEE zv)GaycMK3Zfr1w#90mEX2DOJ<66j#_VKcbrkN^@6&55 zr0@9croNj007bepOPAeh*1ukz9=qwS^uL+36^2GTZW$vdIpCHGPB5pCGxFm*%}Ai< z8Ob|=0|Wx3;ODLijx&*xaM?MmWi#j46V#^wf-})aBxDxn<{W0GQ*pE$jseF(f~23R zIKems9FB9*sCG?BbxF0SDtcLY_r3P*E{xsnYc<_%r$+kT?QiL1YXm|F&H>5j2qCkT zB=Ey_a61f;PVO#55;3%lU~(5Lf)$6|2dB(HDo0(zX(U%ZJk%rx3Nk?;1M83o$ZTWK zor0bArsdQb5Qm03!tV z7~n4gwD;=>AU+r`vvc&uaz+Tp@SF^S4QKtiTpWydBy?fU=I93m0e}Gje9PX2vRBsH zUAuJEYqQ?kD}2zWmSxp6txgW6-dn*j%cMZB7X+ZxInb zcrIgTrBbpfQp>%t+lf-e6sTjL%bx^(&)3lY(?1Em6#b%EA@FyNd_&?5YI}xxjQ$_+ zTx;S+y}g>^Xx?dcZ7W1sA!iNti`{D0BrhD9Pt|*k_j2F>jW`a6IXfdL0{}u}00YQg zydFzb7XJVXG;1G>dhf>HwIG{R_-CT{CJP0HyvEj~xPsqR)Qgu~`I<(NrRj+t+-BnR zw5*D#y!9$doGPe0b5oLy)$dYKP>j-RMHMG5&t`rB;-7>$9}w5dadhyQWm6A~qf)C> z;T0+#)|E<-ZVK{pl{AvJw{7)npwmQ`R~Hg$4Dv?o_xhN2VkEn{XP5VaH_VSDvq)JL z4i%XhRo$6${5hoRzApI9s#{NUc^`*99(Z5F*Luo9a&2O~@h6NW)URxGxmGubGgx?6 zNwvJW2(0$@`t5*UFYS>tcA9m$o@;wiu%wcC_m3-uQz8ZOM3OcY6-ZLe5$6Cpk)4{~ z4YcLcyf>?BGh8&9m&6|!YyLL9nEdXxcNb7-J`b@GDGM9ecnibc6R^95R2094^_U@G zqsXY^3nc`fv*mV;^qPv3Z)NWLt4pUV`g7wrM*#@n=uZhj)1zrW-NoKXN0l_<{oO9p z)8Sq3?mAzH_1j2=wuh-*={B*PEH)wGR4Rmwk&WeJSroj7EO;c91X#WJj5HSW^`99C z?jk$dTdh(%ONiA@;k`ua)1q%O6likjr98dPBRoS&7zMgx9s$~kA>80~ZIFP&dX!Oy z`IHtJeZhA$h&1@*62+uj-m<^TCDazOlw={6NJQ{Rp~I+uF%g}%ug|#%UTM<9^1etV zv%5*O(pS3QrPI6p4V0}AY{xoOi^_+6B_TECULce*n#{{U-qV2>Au^&cL1 z>g)m$JR#tnQ&hB#qjpv;a+*!GoRZ72^X6TaaGSYp%)V2te%7C~hNiC_w}Ad9UD%QY zcG`>hL%|XdjKxH8!EpD?tiTLiX_rnyf~HUzm+7gsxuu9(n{}1|HVyBxFvJxmIN4hO zXB{F66cEQJZzXkiV$wQVB$7%}M0nswRY-~~IaZNWFpWa1G7%yxJI5er6$wTywHPgy zkcwAU+VE{^mE2|K(epCMxO3VxvV0?ytd#0gqdCPsTcs${r^vjVbF4_1Z`tH8D1c2D9QX?E;blk2SoO7c$2ZOAWLfyniYD zKKQM#>pvC#F?eq8;r{@M{vYcp;_nLhhhOktiEV8(-w^0;+@J)!XJoL2R0|@ZJBp}crbYgRe`}Z3XZRocSR0v}bbk##4NodZ z6zes&**+t9V(uwTy}p(N7HrFOUg4eY&epb>|AG*OO9OM^3 zKrY|HcmufyAKt+u<>)lKpA3Bm7004Jmh9uyY-NtzwWP*9&{->(HEEnb>#vJs) z%Vc9906ys>ILAw-^Jt`n<&Q1$vkr1d+k&ge#>^479CB$@X)7mdbzQa7XVGn@?)$M( zzcux3LeA>LFF?s7b|g}Ngascf0KtA`$puE`3PX*he(hjgDf|Bb zH_SjIarsnafCyJSg&>`yrgC#w^3$m%J$&>t-J?Dx>8afMsA95;q;g1CTH_fu4gPkYbT$DnMs{nT}lKaNw33!-D4- z$V1R%1I22vxOp#mMLo9K_WPS_ORtu${#|-lX}R;>_quUOYiPY~t7)qzqSMggpTd@B zAi~%u89k`dra1u5E?OV}?UHaXK>3$BQ-vA8QQNY)Cn8Lo zaTrs$mLLWUP=TBkAOb)+BaAem8QcK_JFsF7$gBY2i*DPm6usr{>#Mqb?R%|m)`t^w;oB>CqKf7#olDIU5`@8K zsGtp`5e$KgG0sYW;c%(A5^nzh!Y%fB;dneh0_=2?H#&?c%)@dNE9GI3sZ%M)9N|yS zP<8QLNfc=vg}Om8W|5_J^QA0Ul0qzTY#~B{=5NL~n86^oS>TI*0_t8RxKE1yE%DWc zn;w^`T-nLse+t=nlKx$KD+`Cw^vlofop(UAu+#4^($3#e)e>Dr>};gCl07=+NJX<@ zJS-_CB^$qX)`FFisGQ> zc1ZFeq*$bPqf^tG>OcWe07n6pq~6iV3@n9RUU#>Jnk5MG`Ej^o?*9O@ka+$lXqPv4OK8(Y;tMA* zf2MhmzJqWcCK3Ii(kbFC1p70Hq?R-CzUA|()pXTQXK21#DL8XGrlgbWZSAVxRDD;6 zIRzZ=jA}i1Eo9%5O|HGWi2nd$kBm~U$?-42k}CvdGierA z3j5SHHeKmoBM`$YBF3x=02u8#e~5k!Y!w-{@HT@nIV^-0NNk@OkuxDs zz{t2|CB=S$+d*uFhTspG#>H`hsz&n43j)dr5Az@ejyM%;*ju;(a0U#3CgGCgB#?w5 zODQSy5b>xHfB*`ia{A2V;^gUHO{vNa-9>E~E4@1P*VFx0$^MMq9On316>+OD_O6=S zF~)LU$?WPRn^$YsQ}dlaWY36lFk7#R)^Y_^!C!^CX5h$zRAD5y)^3GEM(W@yqLqFz zC0x1vm3&)kZ7I0;y?X(XR?%UL;bx5#MdxIV5?j{sEEiB)6_!IJvG155*cL|uHT@Ni z-u5?b_xC$|qZ(p&*j;6h>1E+>iqK5AS`v>6_=?^i>}7+*Gr_elq=cZm`y>x+ zeAr%8X;qRGC}eg;R{T$u@9@4>zcutMu5o>&+S^D}5`m?}Q-)#*A(fd)QOkq5Jsi4^ z?j+?oPnJ*;q?>J7+ilV~L8t2laxajLpya%}f|I+cW(N#DUC6v(4j7X(Pp;bVlEm2uo(Zm=SQ-F-cvykXz@u?EC9${yIp=5@$s+~Gs%sKRM&`~BA5s{S z0s0IK0o3GiS1Nnz?|bj2w&`@9-d{8MR}&K8V4aP}UzFWNWk& z_hPnDl2~p(xhH90amg9TCm$-$Z?8*gKYJ8x$}xt49P)5EEETcADi;LvyBOWCvSKkJ zD-JV)7>oh{BWUT-x~}YX9Ey`$SvE_?pq_B6^A?n3`9noSM3_ zX*`+=Jo;vEpA1*b|Ob ze%OHL8`PD!B@RX-WsCum7>wX^lli2uH?r+j%N2?+$`BH~q#+S^512CmcCaLd1ZB8F z4mBH`V{;EKU8IfMSIgcLcpQMh0to>?YUaecuzu^7x4w(XEv0qWOKAHZtF4TTuG7{j zrzk@9_gZ^h*;%XUtGV1aj{Gw&<$nW7WZQmOZ2U!YAXWxK9K(C3I4q!`1I)whCASwW zIs4s9LcMIkCaYqZE#*oy`-}$L{Bb-5n3Ksd3=Ho1l$z(}na|7pw{vhdoTA!A8WFhU zmJzY*_lZ>i<$B;6e`1Pkvs$eCcM#0ZvL3@J5-3y1Cvb0xWinN<+PkL5M z;nLA^mAzJ$^EoR{b4^rnZtG~q4&Lk4M@?gfNH&-|~$Rp+)fslK0IQz#M(8f;Id%ybl?w>B&B(2l&IF$9# zE}zY|jcVPmduiCXC9* z=s|^4uihErF`liFoOLAU4Nej<1R0ULU_?m9NfOkkIBmuwzRwJ8BuG*!0=$qQ! zR?*vAq&wLsrMta5d2hCwZ{}}(ze8-|8^C#NIrBf=0GSZ+@`4JGxFL6Eitllv7s!I+ zqVUCuA@hJ?c|bh3gA|%Z9QI#dtTSl%U1j9`+Usj1!tnSn$_#B zscEhKUXM##(fkeZ68poku9d1ZvRS^+u4GpToP315PT^N*jD#__mR&NTvfi?`-Wu1? z-P=5CB&uX75JphNM({u@Alk}GmWnft?14^JzFsQQ9kTglfC>r25J$}(*8w>TfHF8N z80R}pi%myS(-i=#kn%`^auG7=e_1yLiW5U8M&uwnN2HG|TafJoJI0|us7a=z<1cTIY zvPXAlStMf^BPAHAJd6dybjd6O0=|JpKwWDeidwC>NcB5cnlP%qVn`)BNg$987_d@Q ze8+Zo91^4#-Zt=tpmTEtGIC3F$v7P`NjHf+JXiN{y5tOg>wb(6D-UHWz9^82@Y`JGt}zS&%Z>Lk8_|e z{oW5lk_kCuoB{&;$L0gLU^jFjrJIq0F@Q#X??4VR2+Hxm=yE~nSRdO+PYWS9&)vpx zkU7A>Ira7AgPM5OS2+2`2HrsgfzMEx9l-+}ZXAPyi>rGy(%WwOecowW+uYCCUF&r0 zt#+OE^H%d(>wRA9OsVQyrcWoZ2d_Ef1cG-H*Mf3cw>jsLgTYcb%J*(D!)Ji)&UmUL zQHb{&=Zr42T)A#Um%mh282q6?1HMnqwB(b* z?Z-yRrvCtFE);;n&=AUUpyT*Man3;pjz<|ZqWN%ooB&B6l5^7}aNgwO13Y#U?PAvJ zZr0k?P1}7}rmEwz?!O=MDYc`gKF9BE9oqooX(ZrdzIZ19nux0@$@`-pGU1N|9-y7& z3F(~h2`Ud72Js0Sii~nO<2eUB@(**!kw zr(0?6t-H6kuB=vH*PgHO{=3pLz5r|jO9CbiSB;|`c)tT73Qpj0ou>hV zDJrA@a##$Lk&anO!5DOj6L7mScIR#b5IPmhovH!B1bPgvc!*n)0aoCjyhu495H~L@ zGErtBoR0r(GEXhC!psiw(K6OgXxSPL+isoiP`qGo%$NC%{!Td?i zI~;WB++(IV6TSU(^s;}b6Bt@7?zFj4v>cNn4Dv>B2Q7d)Fc|>yO+@z)DFL8y&f&UA zO9lrGx8?2Ef-$sYZ8ho5;@u^|R4RKw*KL0^E>Ez`)D8@eYLHw^~9$ zAd&JON#})+sKMI97;I#974J(8WxcK4B(=5gud3hY-^-3IU0Uz&zfSRK{I$Ekn&H0I z$L^3aRO1BW1LY*1t(=^lzN3&yVR@M4WM$xR4{Ump2n39R2nQz^$gZ;EQ}BG?i*%dU zD`jv2IXO+l431kQ702G)-FeHXEMz6^nsouV4Fth@61W)2Yz}g8Mlstw)5A3HbuBbk zTj{>N?Pq)R(H$_vts?HV*~VAa%e9hy5_)fs>wq_bdP~I`qNk zka3ZcKBqh$dSuezb|7Q14Uk58=WAyf$QS_N4#ty?2qyz1;EWNK9R}cfW1-}e>s*(b zdN24t4wkn5cU!H_g*dfz_uFRmwY2Scb>M)#`tm7xBck;u8NeNZ z>NB?_^V8)6uPqt%$EXK_dCoFH&ryyr81iw!$nFM5IP2V;oRRIw=m7Mol}&Y8YiF;P z*Xi2N@MVk6a58d9$vhATOydCa)Qpf%pr;OiXRZcGAC5*b*Er~T;+xxoa7fQm2R%Fc z@Oj85BPR>Twoe%J7{^vU#(L!O#bJBh`M=Bs+mJZwNjL)?zJs*@FLw3!^}*o&KmM_m z$Rj-Czc~Zc^VDNKh#;QAkQ0N{bQ#Zoe?WataJ=zFo7q29zX4r!()Zs@hyB&aIRiQ4 zuQ>cLeLA15KB5HYBcDwA@JPTo91?o-oQ!vR_Z@MLeRItN9YqvS0Ywy00ZlE~93JP6 zKLSR7F^U-Ab?3D+B}W7hG1OzOACnvZW;SPD~GCqJ~uTV~U=RAGxdB{0iTBr9l{{RI5 zxE$bh`?)>2$>-_cr*4$I9N>Cw>-gtB!=c7Id$*o>VcV0F$8MM%Ph97m9>4{;&Uxdf zzd6niKQ~i?c^xnvpJ(?l9!OF@+2}LZJ${(?>rE_9GuNJdb4FO_8R$j^a0=r;FytT4 z{sYMyAbj=01m>02yLPz{da&z0(6285!o8oN@>l z{w#o46T6TJ9ZO)1qX(1D0*^7Vi~>Oc=G+hrGZK8UzD=rnMjlKqNL9mAgPloQ+j=`* z+O=+ry`Pc4*XU7;a*B&dx8C+!EA8sH^03L}ju}!b=_E5SQnpYidxlb=p(GD3AmbZL zmTY9~AQ4ZK%}BRR3|b^ap^dKET}M@vF(nZ!Q^--jJA|^@TEjRNxze|6YV;`JCsx*4 zwY!Y0uWr`5ziBSFc0M;d;_LCS-+LD9WD9W4NSz7G;`}lG27vg8d zd17x4_y%|EBNXv53Lbn7-8xONs$EeP)wkD04OV{Wp!(Z74;ctOf z+Uv%OJbB^-D9w&1ZkGQ-D+k4fcaXC?_+g`H#$>|v5%@!Nw7Ag0Y(^qJxwuvol?R9;6U8C|G?~Zc}T%}HhM@E{uP^BrkG`V$i zyKU~dV&b>5xaEzb5ZXa#&|6zY9ks2snk}R@cCo7Ya9dhLLRmtQm00awG=(ZTk(t&xCjzFfc* z04ZY!&X@>Tv2uYO8Q?_dmf6mx5O)5-KiuD$SvcFH#@>B$>1FdR`UMc1IK&f>*!SgBl}WFqqNaQ!z!>EJ*-#O`@FNO+`_x7;;Y%NH4CZl zuTopv>xo|C>hDy(xYRCYnno=5HxAM&%`OOLj^az9Avl>x8&89c&)QC%B$co4INL{M z?%6x(-F_h`n%w;6gyQ57h$v<`b?oBAGS*E$0S4~FAzpVZ)e%YT8{vs{s zhkO%uzYM$~xW^*tw-*;)BfX6yR8-WwL1$?cu`I0~e#fN8r^L-7+Fo615XBs;@z@3K zNO+~xByz>?E+_rlJBDU;wt&9o$zsN9sRWEeIw9PKc1Y(@1kgUIGK|9`O!oHH;AeP5Qh8v^Niqp;nSRRwNJu9!TOvk)f=S%L5c+R&NM#vvPBHUUadojX=5my| zo%;U(ckH{xJ-!s1-$s7PmgRU1s*GsR!_ub+@~cyfRGU^!%A&O7_rEl@(RUPJW z*%FB3Mj(YID25aO8JjzS1TN6ZcQ4uFa(5LVkC=i%+D_7>w&d%+t}-?iltAo(OD<2OC*v@qO-oXvs#>VHg|U|<>}U} zRPnu)ROG6LK4gS&7a1xz9Do!8y@iK^qHwb6(uo;z;wZ_G2S48#NZT7Z%Q)I_erVJW zLASBBuu_&$fZG)AAq%qPt_w7q)H#r6aRo-@2&=#*fv3-(<}Mhq0ELi@#;#O?2S2+% zGiN_3&gCcSaG69SY0fH7q+ZuaYVUj5->#3ohmltuIm?zF>fQAIU7vM*Qcc@N%&6fI z+LX6Vs-tLBL6Nf|PT26A0rKNGz<=*GK%i|7?8*TQyeMJ7BM5^9*J&k~;EZs7W;Qh` z*G`2I$&y!PSkRX9836@+xKncwF|^>217`(uyPmzfd)sx`3LU_fAgSX8V_m}~7YbMv zBrwTmILD<@F{c+4z8I}Ky%n#kd-*Fah0>!ssZPzuqyGTFc2Bo-o%iUCS+yBt7=>J5 z9!Oj&hTJgY2)lmo%zEL8B<8TCnnRX%MNn|Z8@959=Lhc)03>p!?;f>Pt|hb^ORrF* z0`0e)XJ+Ne1&0L=TRfgfr7h&M7i=Q!10G`S0G*>5E`Pc)hB)Fgf!EBbQC+DmZRgrA zM)b4QrM}&4c1I5-?%$D4Lzz{1)<{wT{_NH)8|KXDq`b zgMop9Lk+>PjmUJ-d_#2H9pq0Ml31uAqA{r(h#0}a84NfTYfIKHY!HXkjia&8nGTxs zxZH$o5{xmx+6H!$yK20FIQ zQRlxmHk_@&INOzKs#RA{RigP{Q>WR~P>Sm8?Bgbt+R-%`CZBe+zOQ1+cz;}QuNIZ5 zK;c3E07#XfE4i5E%=03G0x@X`aePO4Y}h_cAT1m(DTtdd&BOTURcLdA&8 zcJ^0jWGuKOmbgg65%*d~+(9Ge!QA0WmDejy{{R)LM@=KVQ*XCjzY0-lTa~8LyJ`M>uC*@|TiFmD zm@CR22v#+60c8$Z4oZ?+lTXq$U2{=*v>y&>cb7?T_KAb);KY!|`y`lLUB1b1am)l9 zI*_|b4YP!tbX66avWGpb?%MW-zPoi!)-IfHD8@H!%E~cHPgK4uYV^Nmmi<|?d#&pi za&NrU?6oFPB=W56p;)&hdGgjctYOP40;Qu;qa>qpp=6WAF~Erwz7dx4K%wy-r*WqT zo!I5fa7GAMkb&j0s6f~ZTY+&r1>(s`Z|wg72--TkL{@!H?q`ly-T)#PT@;WNK@t#2 zVx@NhS}XA9;tYjRHBSxNN4TL#1m$+%jJdqElt!2eeq;cy!Z^-PV^fv27kOJ-N!w?< z^jpWt9;GZcB588co#$tJUi!xAb6s^>rFF5HZR5-Jw|h%}hk8w`yi+R9`ktk8fhtIh z^6m}xfrbo`PQnsYZ(I^homb*lj5TdNbY-#d_Kj`jLllEU)9vhT&gAR9CMDDg~yTum*kv2EC6hs9IElBoGgq!#`giM~}Of{7(yq_m6|J7m20 zMX1_YPpY2@t@IFEO?7cCw~N+Up@P^-XPQ{%jt69pD2a|K36f?|Iq-3zb z+_|;TV`H|@U2sz?yGp-M$1Al2r2=i*OPLW^ACv+VmrAh3pi00UH&tf&N6n|+x^z2$ z!X3?(00mX&a+AvEozklpK54FLB&_8t+eFoxzQ3cjlGo7;&>uv9S zG`iT&NyJ1q_T+&=f=WnaI3(=>CE5#|h8*r0$b9D%?X?jd&gi6`;e#nsB3W|71Nc?2 z4nQlA7=fNKp1CdUfCk&b`kCp1blFulf&k{@U>M{PmN^^}Nh`4pzOsnEPlgsXJ4Wed zwY4e$Wew%CxFc?Jfu0UCl_AEAq?3womf9%QmDQrH&9k>#JA90sl62H$u9BAg*4tTY zduX-$&R_daRF%Yr%IK4a`9Xn5JOZj!Kvq3=fzgQI49ju$&k#o)wagR5k;t zA7+gFry}C)k+q22pu~krrtN^|C#g6!(5TdLY4dXEnv`04^6hu3O4j_7)H$5Az3;x4 zd#!YOJGHI*cGHPZ1svi_sR#gMV0nXf2^b`R#{q~1ND3G;X04}#pim1>a@@8;l~ay3 z@C&fR3~ps?X9NHRbqnG3LHpaenCC6ze86sBx(n|ixXUg9Jx@6_@nL9yW?9R03h3mM zla1SVDv|&Pc1Z&yfts3lWzL$6eA|<{w=YGm-M4>?+EI&(PA*n^tuJj|wf_JLzWeTT zcK#XCAR+vxBmhU4QI{hpl?lM<{p{qD26Ef5!C?qxNNvEt#$tBot}u(}0q6<9BhX$6 zGK__c0J!;CG62cy2|S)~0_2>NgUy9k1Lj2s1A{04w?l>Ro^jK!L7qKIQTA}MNp#c7 z*Y)kMnaNSK)|)i#Z$G{2ysc~N)=O|qYk=U8*H{1D(W< zdbZq*aCWCJJ0*Uv%HF*i>36xBl$}^w={CI6X|CyCZ6BYWopy@oFSPSMl?uk9Q2S=o z5W4+?QX$UC_Yzr^n*=Jdf%i*SC8b|jN2h7U^gCDb?S~Kc$@G1D#cw4XKwJI036`#;fnC%TTNM|ruVzuE#18L?dNCpysA_wt2UHhGv%ii zpSaR$7hPTYJ$7V%C)8}M?ww+`NKVNn*&H%Q7-tHkC>KhKs&{HmE=lw8+O((m77T=w|=`? z``xyWDpFCJvUk%(9?fX2f0|Faw^i%k3U%Lv+AgPYeenxI@kfnsp?K~rEcB~|wb15@ z6p|OS)HLCJqH6aGBFMK9T}7>1M{bZbGU@V{QZlrid%zk`i7z}wK8vd+lRlvFoeF2^8#sWb+$MD^iwet!)f;kxdGtOFW|N#~iy= zSQ{0RL@gm86^TlnrO5zp?>r&!TjHO@3wdDpW8ohY`2O}AvG$+r4GQk^Sd<1EWVi_? zP^y6(d%Vr9z2S^vMCWzqPJHf8Hfm3q{4H{%mD+0Sch%^$vDrfs;~!?#IP$k7(vsEk z{8yEwZ7q8(dfDC|6!@>f+Ww*?(7ZMO00^d>sEkE=z04a^GjV+JkGc^8zN)NX&vhtP?pc$lO_v zCZ{2}jnx%^+U0JHKElDAXYP<#64~fN`gF1KRNGCYld@5KuKcau?#orS-+|)K z4H>rio0hg}DYl)Ky5D=*zKwRd?t1?K?E~>MTSrTcN-aJqR4QNl+!)ONR^`OJsu-7AYMh@dlDltdEjIRcO4icvvu!(`eQFSbl%okrE{m?o-V*Aozyx;9*2ILL3l`0RSWccXYtyU=|1EV|v?9*R>L>ZvHFOOO*^}`&2^*nwqp37*{d^w~p#%#8o;cE+U2ml;hUB;7^!!!A@ zHWfkyKPyVRv3x@Ki*$w?YaK;kb!BlLrxk=`0_;n{x>%0W=47f3p?+P8qz>KZE}O6YofM@CLaE z*c;E(Nrir3NPJ$4K#IT(iKk~ZQ`F?Zun3gw0F zqiHLk%Ppen+L;4;1tLd=-U83Gf6HC2a5w1wSa;n9P^=u$n zhru5eZvOyE_=Dhx`P$~z{^I_1;qXEbJj?(-P{eI@7*KZCB;OEx85jDyU4HelaJJfQ zwVE&he;oHsARCDXF%!np8IIyF#M>1mtbQNf-zu;w+Mc#z*|#i1M{i~j?a0X7{0@Vl ze%Fh@)h0)k2~IRt}@RBiB|!feDph;@t1Wp~@yY4%CfkbiS`s7O>c zP7Ec1R|7A!S1^7p__yxbct^uFUU!#Dv|!u-2{1)OtPuka>i`K>%{ zu0)J8hwy%)$^bhFCQF!6lriOB0kS^s;7$v8+v2sz8}%DvM-4u*h=ikDGaXcIxga*bB4&^@YKXmj*2n!pS*ajj< zE@9VWnF^5GS~88CI+e!i^ovUfpn^MHN5)pSKW9}UPZ8<2dWw}r4mL@xc$ZX>Se_It zaYPU)*||%%%uf~kqzj!y$fPdeCy157&TujpVyHjz&65f~ZOy?sGuY`4=ggAJ%u;u6 zyprL;#z6ziDJFhZ1P!MrcEZ6iQ)qxht&{Y_7Rp z$t1e@cj}L-?yWo%d&U0%h&1gJYO4AAY!-UEnFaxrS<60#%NPZ`w2x7h(C`eT10_i2 z_-kNrzqBU5raB#h34R{x4xDkwmI)Mu-k|tvyVKokU*a&Adi$p0SATzx_Jb@C7C|eFsM^J4cVgvtIqme%6==FDs%T#w?d_3%M2wFZ+5}PNV{hARnmAwP zDgjkh-cNVg@&ikAa1YyLy^V34yl}~pxRHQ1u^C=e;~C2KET>LKz_+_|l0glo%PRAb z3bcEXSg<%9a7NyF8^;|bW|F;??e4qXZ)q#1=jyL>%$84vl(oc87q*vj>mBVM$#&Y> zeSa^EytC!Q@l(UB2_)u7rpuB8u_neYyT{JbZ)QDm4&2Q{RZUSdckwI3b1}&ROM82$ z)H1qr0}F&wHjlXzs0;%l1!6u?8YH{$`dcw7PF6dhzzzhPJe4YkBLJ4$oLYW7JwmwLwf+qYjm^{_0X2(13I zG}WE09j_g^ntFBXdwCw{{v6Y;BumQ=i2fb1yG#_DPcNfgD}dQ_nPZE|JZ%M94p~W1 zxO20oN%0QWWHx^nw5>)Z`BvLs)h)IAc2XoH#x5==niI6ThPUzcLD$jCQDe$4 zwc$6nM^hnkUTr$vty#;5UCS9oLUyj*rG9HZ1k~Yd$!)3Wk|^A)h8vYvQ^_p}f>aD} zSNBdsGKPJ_Y3y`;Z{lx_3%V<1FjoOp_A2hH zU27M85`5g&y{@d3Ew-)xrO~5ioNHY>X=fI#YioH%>dF23Yh$Cm@UMbAPNl4^VAAI- zLVsk*8rzpF8JUt+NtIjXRgGd&j7uvQV#mz&uL0}c94#)Dbl0&a=}c=ANX1pcjQOz$ z%7(!zCYNVbP|44r#p5V-F(P=MO%`%sxthaD)9#>i(WG@`wzyP%#fCS68Hx}YMQK^< z8Z=}L4*KruLO6oPE1P*v;8Wzc7aI@FhS!z_JzQc2D-QMQ+j-K}N4qc8D! zo6v?T{{XzC)K$ISc(~i$vx8jERIJweK8*S^N%2p_4~I(%=pHq_hfWbIE`zUGHm#yu zvw4xYwkY?pTgLCqPi1j!EN$|%#HzUTjSKdMGY~vQ;R$rhqS=#I(DfENTwKqGHFN0akLk~DSlcAw)-OH4^1xYBI37~DVleWl&ao~odsK4UDhPirYwAo+4z z$hk$2c~D5U+Q7SJk}nYpggaaNH&n7q8^mI#m5tVNSa8U5y1QuS^RkMS zxp`ERwXbL`IkdO-$nzpM;rMFzj-neF|Jj7{{8jS}mZQ(_ZbJtnJw?9SQyQx z7bvy5=2zC+?3$L#N7J$Pnrm7-lH%4UyO$^TR@z>#ET7#fWi!DWF+I{EPbYB5uA0_O zc4b$x@P4rD zlE+SsdE8VR8#{8vaxlj^7%E$md5g_sSkwVJj<2g<{J^og)~{wOhH&#(0{{V%Xqr)l# zl6kS!WLI^;B0Y);8+^V-eaf@_jqA;C2mP`bUWrtiFWwI01y?QKZ@%5t*$^-VTbT3yH8 z)@wwU>uVpVmp>SO7+XJ`H^nan$_B=Jc&+?RsLR1tXw~g>y^-80Pc57W&fr>Ek;@-C z@rT8)+26#L<}F{wO?5IUJMDZC;!DN^IDM%;qiq3X&O)a1<(2@DL5;o%23WBiu``3U zb|iM{aHM>y@jw_ASIK82mMfCXwI7rT44QmwGr2)!h@9YXQ>$R81cwc~a9k6fI^0`R z74XIpPj$;C)$G-;D|-98^i1?{bgN({s!^*YI5g9XSJKJ77MHS3U$%$QGU~q#Y;T64 z@UP=6`hDzf7(=Y++UJIj_MMIvOS>1hBWV)4o5>Jld5+QmvU=8w`$YUy)2*VkztgmD z9ofdnzi#mErKiuSxmE}!oe z8Br8W5kXK~l{vr+Ng}0&&NzUU+Ro-uTjhAJQ99K0BPGx!~;&%A+*$Rs@58&q&z>W?#mfs7MJWHpKOX-Y%<6;1&u=p+Tp&G(!MwN znAkyasa$GMD=g?I@!0hZk^SlyFHuTB#-D$5b@K9ag`}y z>dzHU9I;ZJDzb1=R*ILgii=lvyq#8>z0%qK*=fHRbzMv|SX~3P5m*?(DmRgU*9j~y zg<&5G%m6#^*mdk}{v-I3WeasYASq|su-Y&TP8_I9c%v#@uH|v_qIO*F@!KWvh53%} z!c)sFjF$Fy5IUvfC;CJYU3m*V%xUHrmgYNYe6u3?q0~5LM{b%cRcQYJdojY61;Y7? z(XKJPl~v`qP|@YK?i;oS9;6l?ynWhkH;$@FEj`z3rq%EIZK?f>!r9(?j>AHAF%{(8 zW2&6t2JIHCo6}_7p0@cOn!gbIK-pdP*}+x~YXRuF&(8=frHYnqq%?v&e4te0$C~_~ z$7(@P0sAGs>@hn)9$6cdupr1vk%HW|+Vb&gR1CR7q#?@SM#C+ZG7OA`Wh@tC4aAX! z#f1zA%aC^umun5L(4D(7S;4^hoIY@&R4R;KTM0L33nikzPj#!=^-bAds@GeeaU6dW z#YdMDUd=E0d9Lf#U;hBLJv4aVUF0aV!!FUANJz-Y`InP}yCWom$~gcKCQlq|q~rY$ zcHOFe%^R-J*&(?qenWyvG2Fi>TreJZCA}mcngyQ`&Ad#+Ub zyJ_itx*nMyj&*#KzT0UV)P0Ts12#At6C9FH%<6Hl?i-3!-|(Djjo#k?u)(*4XE|a} zc}&<`@B;2YRC3H%d3w!h)W~u&NMPV8JCMfvRbv^!C5vIRvkG~qdA7v=0IV$7D!?qH z?i+#1w?Ifz6p_0x$l5?22|m}~S9@CBp1P+O)6DiLqdd^PPv$fj3yQ|+u zpRcQr8cGI8P&hkM6kfbCq6pkD3O6#AQb@@zPY?e9gxSa5ja!1p_h`X@Vlu2D4avge zU>!yQBp)jC)aPg*pO+vwV8;wF0`DY_rGOYGVIby(xEb5?5yKTDE5O=5U8M;fK->4p z-b)+~TA6CMZ9ZKdis|iVWukg()7`>nwc?U>8|7;6y_{B-zMUP_-OoNF=3yJ00683$zyuSJuKxgp%SbuQGpX5}fJh*>RpCZd9ALIF%He@p@x;^~ zQUHwP4Wts7jU>aRYAR*W9~b* z;3+M`EDMa1wUyMC*4EbPb)~o4U3V`R#C2&#Q&m!MPD=8PuDM!H{okd#qu9rdG-%@} zBDopd0;rA76qZqd21&+1D&*mb84T4jc;85kHy=4i2ZfIS0^3=$Dv+*0$s+-V+%frw z&X@CQ#&VHbNsJUYQo)Omj0%+8P6;R#quQ)VJAOu^cNd8pb1kLLS=(t5q1*vbK;O8o zSOf!t+eraH5iXF!H>Kk3qxe;}w@u&O+ULuE#8=IzPEl1b(u^N0U$myQNm+ba=&#=G z>!LoJPl#R}Uh&z z{5f}QZ~+%~pf&~xV6AJ7%wKLw;HW$n+{we-cr!-7CGK>q7~GB6YXwFF9ZLw4aU>{E z#TO-sBW~vP>1A?+qSPZhr0nfv-z(bc`{{S5UdNw|@p~Q2y{vF`Zq@HPwB5bcrIgZp zt)8hnYjf+Ud|#%*+q9c)DTrd|wwJc?gdw+ij+XJpxpi<$;yk*cGGzJd)#<+!yg?WR z^;?TQj;fx=oZr1Q0H+m5`4$j`mxd zb=$HWRax=a0rjMGZ-mLr-UVSFzQs=KmHuA1*}xiv3~@!csJ zpO3}PRFJnio!qURrb0^Ya)tJ*w$*Y-MF6V_M;8A87W^>;jIZJZn2fM6i`mE_Sh6bG z+7r7hr+7J&VB#faGJNf4;Y|X{HCU`eg(yh!niAVXe8K+!cIP;J$g0vdO7C7}ZJTW) zOL=389UZ2UMnn<9#z~uaAyya?6=`I^0ah{ROO;3vnH3KeJf{UYK{-u1JG~O+_-^&- zb!OH2>d%{(9YTszh6e+OQL>chPnlULtt|>`PWx!?k?wEtdqqsiX{cQ~mH~W~zmqv* zjlxt>CRZ*OX$Zxi_M zQ1J>f>Q^2a@i;#zxA9Mcbi1W&NFQmqO(q9MB~)ajq>w{K{!j_y^Iq#V?B8MdCGdY% zfM9*2Pu4Xb49ry{nO`=iP5T=OLteg@BHDwMHVHCC3A_L+RD zt(t27)vfQPp0-VDdd`b}(`r_?dgsEw3+iIu4FpN7_-fuOF&+d^%>MupWz#?-%u(Rm`=t4inS^mZnxWK(Slr>s20_e9vR0D(T=-G1 z*@1gu_f=q&xn2u@pbeuF7?IVhvJ^w#7Vd#B#8Er3@?xzMGSHeBD(#l zJ{oCSoVsqgE-ltUcc)04Dp+-XXMST^kJ z<54B8q}7kSylMMNe$E~Vu!~mlU+pWQc$(&Pie%7y4dI^@_^ZT)rzm4qru{z z53ZkUt!)1QNRMxdpTr(0w?wrPNown?+_D90%UiU(%&$`8!d^C>=Hp+xwD?b{z3i8F zSNBe}8&EVsOp-Dlna{}g+uC;Y)RGO^@wv-`DOJ2<% zb!p%5P~U(TleBB_+v1Le1;U0Bzx*TG?VtppN!nO-O&)cbZCRv>;7bC;EK-l7bnQVPxrSwicHb4nt1gn8EiG7q9X2FsBVdO zk`Ku!{0ZTI6xt0l#UB&yn^(7y(jT{Ydt22s)S04@rVT}@6s3ew9+()BAZ4SB^Z^s7Zkw7BneR<+kG%)89@ zQCM2)dR4^gCuLdTYs1EPZrtsCMDll$IsMdvLPP0(uvT;tIGrCP)$I|}*9sdAnUy9l%!+#d(eiiXAh&)cZ zo|WMZGT~xfO6Ng_*5Be+gS9nhhV}^+RWJ0rDDI@wq_MWU5?e!XkOr%%zjXT;C*qAkfA1_8NMd<-L6(-sam;y8Am@MgXxlIhnhh>FWSt=-PkFpev|M%oDO zSIVoE!wo6>I4)%+CgPN>Cm5vV$n@2Jz&Fux$Rak zRb|T3Y0A;J*-u|LkHvbG`ZSim0CfcfLIdeuGJ{QpS(ZiK(CRi8)2m`B5tA107>oeJ z3eo1>>K6J`PpfMBSC9M?8ix~2d*N*_#oix{H!^uQclvg*c(&-zvj3O2g@tvl`6dcH6+tf{oV~hPRrfqp~)26*{bdNUqi{GyRo@NnH&R; zF-kAV^964+EJ(|4MgVQ-#E@{z*(Z)*BU6@Ko=(tFHf|)aTw#D4j|35%fB?vQRj?mt zjl_to%CBz1NZaRSB|vo9OZX% zahW!41e_DQcwN8_I3F+DpYTl38}`HfkjjII{x^7{^9LaVTWEeRQu_&2R$!SdqArPHqZzFFDe5nf&c)9?pOeEkGFr|nYW%-?UVZ;D=ARl7(8U4s5@9o z;qM<6@`|Aag4s&jT3E3X76gKb+2(XD!}z84oFvk-y_6feURF!*KFfon5AA#!d-K6r z+V_=8Y3t`5F8(K}{U(3GKx8fPbK%nh0{;NQzxa=APb`Wpyi4%bNP$vN01VH&4f88E z-XPb&%7<$Wr0w!R-a_Myh6iXkD}onkY!xm67+<-6Zi|sW#P5dkt9;+^iF{2=r_4!x zTj8{dn^9DW2}6;Sy+Od4!3prhZn%>Jk|AaQV6asQxUd^oZ&kqgm@0r3GBNSlMF_mU zS|s$kT0N56b!{}=>*as;OX%vIJ_x`;rFg2VUed1LTWYVPZra~r#N)R+eLyEWi6_%` zaxehoee7^<9aG6?E>9FKkvp#%}b6#oDS#uVV>@q!qRIKk>ke3E;U(Mjvh4teAi z1Y~C&4o)yLjDmPLt*vXW+F2&9^t#sHcSq-Te?vx<_0y)-eG^(M=&tYRiA0l*0uj|t z2*(`tWCV1<1bU9d(lpl?JaTomWnbT&jCGq?>n| zPRh#Pid$`_`j+O3yOHVYCqC|nRQSnXnV{{RRi4lp>t6tC~~ZH734XON*3mn4#) z0HD7i_`?JIM+YfgEr`>kOwA&WH(;4T3PW>%sxy#scVj(B;MS}M!|qDSJ);sxQp+sG zpJ~q2Sjc8$_m>QM7AkN@3yj{$q~5Ch&eu&|%KP=Rz3iT>`TRzIgu}(&tr>E*uXw9# z9kuD|^zuB?(?{_EnG$9mOTP9cqfExY5wZEPS{Yj&1Wt(KMK zWdU~(;dg?(oT&&f2gu9|h3Rc%o@qYCrdrRaT%J6QKTo{AxL}HMR^HARkde4>K*0ep zrw>*&4Ku|$93xQI?MH>Q{I+j=Xf(eCSttyCZ?yQ1^Gr~ymS=M5fV-MSRXM2Al$>8H zNwsNPOX;V*->XTj&yUCP-c3exRk65QZC$(9rx`nP>t`k1YTdQ9wznZ?Yi)3R!y`68 zKf8p*_l$wC%m81QD8^SHf?Fj>=&fOa{#LW|0u>;&$%uwkkn*7p;-4-95C%>TLV@R+ zpT_?Hf!-aBkBR>PX}{UiM^p>u+b6`|3iyKjDcsDhVc>D%ZAW^!Z{5cLBML}yxGJ@(k|tL zgrcv@qgPH*=2zwECYGtC+3xk*^L)?7P7uRJs>ElxbbXWBc)BU8a*{W>_sYG_pL?1dSrWMPkjhky(Mm7FH$42uKH7*#+9T@Rx?QZx!7<*4Du^ zD;W|g=8&(I3>R0T-W%LSCA^LOo-dgYmX0R~!G1B-e{bK}i$z}t-RRx|__^^~>%?|e zdcKdWc*@{-Gs4hYUR~c?+ucv#--faHkHxcG-NU5b-&kAgT5g9F`eZ+Dv+)%F0B*2@ zQ2cxNk^5}?N%*rqp{ZVcd-0}^;H_3$$n>uQd_Sb{Vz+M@j4;qkHOFEs-qc&w#*d(!*M^LHd%^||`m){pW261Sg9DW2^IukNlZ+Iz%oqFZ%F(^h7zvUR|Ex6if*BG`HP$jbhJp7cQ`C1eY@8n z%{n#6)*K+JQ&Mwjy<3zNZn>jpYpW|gZk_GY&A;Tl{t{2O-CN!y8rFy7`|WGNI#GyPK^B{P;ZF(pdhCfN{@%FM zCHktABz!k-#=4_~!d zukIp~_j=6NZylr-A8B18OPwy`3j8Y?RQa7%Q z4;-<1Rq|-loEnRhX{8m)(thr)?aJ@U%kNC`c!%jdJ|n`>rC$w3F{M%!o$6yQ=Ax9T z-Qi~zto}P)q?6^;{muB%s(5Qv{h$8;Y1!n~?blhn_;I3WT4lZc$CIdParkprzLCX+ zl+nX{(qh`i>KR$xO6mp(WVl=lZ|CDmkIb@=G-62_RG0Ugg2=`2#T_4mBPe+tQ7{2u zQvsW?m*QXSyK&`}_$l$n!*;hmciQ04{{U$e)*&kz2;dOGulzQU$jKT+moi^U@*>Fo zPHox?WY3evU$ew%7|~D0odbL_D@Cji2zag(`SzfV>}@WTw9ByS`^_=*ioD<8ocUqn~T3KN_3=> zR@psuYh80?h$`Xq#)Na0hWbf5mjIpU`}k0x63%i-JZ?&C@h2W+(QP0fFBkDGKkK=093N% zNvUa4Hf`>0uUC(s?UUO$2b^r08-c+j{Oq~fK+fPttfv;2B;eZKD%ZZ2yS4SxM)h~H zyRrG+D$;Lc+t%E#x5T2?$-8T++`0)l{pv8|A$GCBO#G^{k`8#30km!fTy6xY=Wqt%+q&xPlS)mkuC>wcuCLcYU=mfL=9emx zz2w%;K3%NU?z%L#I{iORlUCDB)7x6vNUY;OjK>1~OL*n&7T{O=E6|w!R|N?|j8} zNNn`m=wy-@*?hqpPi1EWilbqFAWE>t%FnnIEhqdWjXk7tTj|=>%P>bWO{-Yhpc{r? zC?(v56rkQ&M?PYeD$()B3yS4)_LF?inLcaU&O0eLw%S==L-x!jZ^3mi5QOl!e``*J zV^SQR&Q&EC#WvO!H*L!9@1x$<7sWbM+8(Z&T3NJ+_O{cBKeR0_C6#8xh*d3Z(l}FV z58W1)NXaFciN$0yg#E;tWT^dFWSv$;8QiB}#@-kb3Hf->B!#^t{-1F`LxcJ3$9v+6jmne0N#_l+6ADM+ck_6YJ6f3dlCIc_TZ9#sL^H zR4QIzu7BY=F?WK+oA*&BC|K>5Hb4tit+i|uYtmtldGU<{br-!RTts;G0u z6}GTku*t~0+J}e8#C`}(*<Lqw0tzqO0Z+DP(lBqs!^ z*b2lptYatd2_JSDvNu#(mauhK61~iYOMH=LIfo!3l}V=&3^3XiNGE^^92j_-lUAus zB(+UO@wKCCy*j?v>E?c;TLY9}GKzI!jFoIepsfeXN>P=S(@NG`+fM0OvoTRY4VT(? z4C4w39Fi1(gXZTf2T%@4uW|jJTqngp3OQy69xKbUmD|6=Q^s~YY;YHQ0CF~rmJ7jO z5EBQC*;vav41AO%?hf&6X&TJ`?`fKs^lpW$tU9kKYOfQ*+zjS5s? zH?|AqSTH@+2GB}{@+;GFjN487ttZi4TTL6%{z0}gPZdykDH1DPMT5o^$w;|24s(1`Dl>c7J4NWM_5T1g zk3^pQ@6>+iW=${Va#XVcbfr%W2--+hJ;}felDx-=?>z7LMpSvA{{X^OrJcLPdsS{y zRVYkIpImDCBr1MEdrcMw`I?eZ$AI1EoHz_Sbk_ejFM){N75 zXcuA!iL6_3k<_UvD8F>T zaV<(5^y${UIW=W;^!C*3+PmFs)%NLRZ~Sm6FNXdpzuk23{-?G<5lNi=nHjL9LJ=^r0!$eduY_x6)vq%h^!6P4ysXpkyRwY7!dN3TG7pVk>W0oKW{^>YBOMr^@ zH5-fN=7YAo@`+ry7~VAp5IHHT^x2JBC4eqFJ+6p<*nUHP4xS(X8Y(q6{IS9#A2cISW?2F5W=T!2W($tQ3i@CgJGKKASr#^3-W4W6}bF0-C?f=D}Z zGT8upi-6e}YypG20N@g7E?*=b`#}YG1RMfJ-J>`kHyj+dBXm?w?WO0Yiq6(r+wfah z{shEHHqviL)vZ(IwU829)DzpP=Q$ZCXgqT` z-K)J-wb{K_TluSXdo{7jq}NWnTXlHq`q^ow{+g1;0a7=TbJ1~vq~|%~ka-i9LE|f) zN`dm^5relm$G!+SCmx;oeic=#2)l1vF`NvS94G0+({6h%ZgP1M?BH0TdNZw+>$JWmVwneA6?QQAKAJ?URqr!7A^C6 zF^@3}vM-zVi1soz7>FFKK3YiOT1gdNNUoOL3&U%3G)o(<>v@o*azzuWOdL8JfS`t7 zHY8CHV!$B)AEK#|(VaeJO2Wms0@PKq^!T0+W)%(j+R@|XlG=0ylQmunB0H_q?cY;B3He*xm6){7HE?3 zL1}qS%p`RrGVB`$K64+D(xnMXSHIcnlWr|pT_^Wnt&(T+?+|eI7YFTmJ=sMiPHtT8 za!NP--O}0b(^l^EK6YKGqzhZ4kO3_#1_Weh1tcJxjN(jloUtXUYkLho=0NvR>WTot z@}4;e04jof)={-Ea(3i^IuXyRofYCzB!Cce@~ZW~+HsPhlpHr+NzPYh;YeuSW0IEs zSse6<4+)RBg_*JeEX7o1xj!m~@S}i9E49%m@}#x4t#9A2;d9|u8S^EiznM6+?CpDA z*1FktzPjnl{{UflIAuqOyh(rv1bAvNtihb^8+B#ec7$Ml@fbZbiGQ%X9CAmBJVB6m z68;%xP%|b+8n!clq>Oj$RDruKk|7_zL517~)pjMgPzLY^xg;?IkSdGDi}J0`K>2^v zlgBtLK-_r*0CGnJHZzmzpD#6J?3!I)e)e0ghO)ynuA=R-X}52MX!-ANH|2fVizbPo zjQM^py-lR9CGh3a1;ApY`FF39zzh@A;N)PH&wVpX1mng;bATk!bp^=Dz$E#KI18Mf zr;-Nh+-r6K6L}i~FhPnYKY6<`Lyj^70D~hhoSLY@F`wRsIopA14o)+ij+q1#fPVKK zDkX(&d``>GUXJZgUrSizoj9!;fc_a`% z@y_l*7_QnwoD;3U`Q-lq#J#bDyXM@$0&u_u`3cE90BZZhq<_dgSYWYj@+J;=kl}C! z2-ZLRI2 zTi-?Q?|nAebzdTiXzUvecK|%+YM?l7I;aO2ZUD*tER5!@4-G8%f45nUr@W83Kp!bl zy@=>Dl^uHElTG^yNCwxGf4~s`bLXNrG%6h24T#=F%p3q3Vn}RS$K!lJ89PkhO zqym50J!%4W92wi8>5f~HMmk_~oZ~!Tj)P^U*VS}>n(DN_cWZ0eUEMyLb-tSEqhIj* zY-x=jQyKmJvvHgN2hM127c3Q09=wpfq)-(hGGVJCmG-=B}gWibiGgv zEcRmqx{`SfkT*6rWD$}W@t)XfVrjGfy|~YK@Cz^=tN~%P5^|^bh$Ik(dAm-)50nfA zAcY&w4h}jH6qfn7bj1$p)>3;}UA+~rrLBAQdU_|OYAX7s?|qtzdn>&i*1C7oO^KI7 z)ey8FX|%}NNPUfv!~uhx1qZT#GlDULozDmOHva&{I<&ehx7LulTT3i#+Z;U5?b`~4 z!j>eKBVhn#$tt8A6}p}|JnueXgN&mRRAE$t6cR>491vBoasURcTIzT97fGpEU0la- z9Z#DP*h>Wn1_st`xCj#`8;?b+ryIDfRh^yw(ssMi>#Mcw_eo!_QcXp;rr!2;?yT;X z@4dTqI$dkwXNt6EIGWyAf#IM+7XUE@n8sO1CAn;5@HxiLI!_O3mcR#icLIJ;6!XYn zINDfasL2DUEzNr#iSbG90Jhgl%l8MFI1Ilo)f~tXCJYiah2 zIU;T98)dsjP&pfj+NXc;$^Fp4EAIp3uJ?te(rZg4uDWe&-(9tLT6rUtSFIT?Xjxr5 z**of!vtJiWFC*sk)2{-8KxM!KG2rkrNXqRX9zXzv7$o&7j}`n}1yToKIpF)FFx(j9 zBoKb_8Nl_8OGs@zoU4_|j0`yd200~^ZN}W>1>*#Qagoflh;z9M6>Q|~Cnp1FTR$(XA3s&wX0kR*}^T*Gk*$_DiL^Hv8)OTKzc#1n0JM*X0ThPI_Re z!8keNJnm!2XOk$$%6g1$U7!^Jy>Y=N&Ld03HeJlkc6vx)NeM61XIj)N#Az zCz7}fILh;qc3*GTBL~Xv zKB11@I3PD)KnTj7PhtyHeoGEVu=$R6amOHf^PCnP4>h~xDgG{HT_* zodb-HqvjdFz&PNyI3QynVDd-=mJ3lODj7&8f(T)_5=kr%U`W6vF@iIWxxE~QPn3=u zAm{HW0AY^e8v_~I3EXz$8wFIJG8mD9I;a_8fK+jufG`VSV0OSH)KqE5OJ3>UO_iUO zwY~1s56AS{-!1Rv*1ZhpL&(o?2q5DC5C%_NDeKj?bzU89oRoH+DY7M23(9En;23L$}%~}EO;0s@W6HLToYQqlj*lC zdg=Lf>!=WC@aF@s7~S7J^NiyMJ%G(f4spo(cmDv;jYrQslaL3eKrx(vKmd2fMsti) zfjs&Uag&}$1QL1c!OzehmB%I1(|?oJ{{WZc)ZXgXzMgu1V!lF`(#Snhb(Ak&n5CIN7)s+D8Wsf-bI~qXU(-w%x!7?7zj1g~BsshZ(`o zYz_wQQ1pd5kaq9oPh6794hdhU1duXASvO#qxafXT*dHi6cXPlXU=j~Oo`dY;zRJ$Y z-F0?$S66;rINEA zJO2QAa!V%A2+3iLV?1>13l;#=86{8+qbOXGcQPuJKPxJorODb?XaEPv1-D>V9a>PA zNZ-A+wbt8i_19j#4vakNLRV6DPR%{FweGg**K4GF_*J52iT?n0z?C45L#v#IC*>T2 z)Bt_M6GKP#b_KB67#JY*$j;R`1ZRQ(#{?G1HS3!1gd)}y&!-4&QPFV$Vpl@3iu>v%u(g@!8;B)I3-jQZv8oquHftFE*X8Ydv?-{M1LdI48dV9i*MP!Q1L{&=1hgK|Z+W z1$Y@bIL945nDNIsXaN1z$j0ExRQ#kJt-)e4IOP4@VDq_Dll+1HG0smp&rk{D1aqE% zSD6Y@yYka*{WVGcE7hGdnsKsm)mcBet#@tu-D{^o**xH90OOp0vyOAlI`uqrjGz!EYJ4sg5*YLEs=0~{P2;{<`hCkN2r6YEaLKaeDjGs(s>ae>$6=Zp?( zxk)I!EbOf9d)nLSqTf{doHC1U>$-cr7MgFbM)rDr$`5hF4xXE^K|FzvUqSbCoKwKb z2cQ|psn1-Tp7hSS9WqLuMn@wjJRaYH=yOg|3Hp8B-MQ(mIKdS$#xtB_zg!-l)}iac893ty zuqPa3gUIX$Oyu?x*U|p~lM~zKy4$by>Nxd1Ffw>K2heoD?~IK0BP5z>BalHS8*|T7 zk72;$jt3lcG@VKHIV6nx=ZuBuJ9O$WXgpwc`d|-FTocf9$nV;^Wmzj(J7~1iqVB#) zF8i6&r_C!pFL!r-*WJDJO4s|WD8@66q+^T>fsW&%-~tKs!QhgGM?7P(z~hc^2?rSi zq4f8~0D=kc*Eu-k;QXh#$DqeJ?S$YCq;==(kO@4F#1Kj8!RL%#CG<~Sy#D|N>7}(z z+rMmK1eY`D*3SO`e(R>U*IVAe2tN4!U=MEK_A8v{nnJ*Hxj-2?V}Q5^l5zn61IHOW z0o2ovuec?90zbS7=rPexesR#ME6pTu#E)?_t|EpA)6JS`ov@K4N|L;fD-~5$iHTwd zBNdcr&ZADvHuUnlPW$Mtan+nK$+s)Mm+Pbd0E4}QwTRn9I3o>l zJaXUyGxNfShR+9hf!Iqb+r?~cu3k`!406q?UP{G?jtJv{BDUU6JfI2h11kEc%C*gci-KJaNDS51d@RlR{Zn$zaMW>t6)?Fz^q7!hd1t zv-rzZD$yIOg@)G62nAfrcrBrVa8cAXyM3fHY>js*GM_@0T{*bf%XFKwYR{MKt3JtV z_oZ{@GY%@k;MCJ_o3r;~(&cwoy+_Qf^>&JSJzBcA#~uOr5AhSna>qP2*8T|69l<)T zw3FRl%Bzy!X0S_nE<>);#0a#=cQ((o5H_#f{{RmE0B7HYz6N;bn@b)!*U?Zmv*M_d z`p{gcBh0h#wUb|1s;N-X$Er4}6XlUEi7Jcg_EAnE4XML*sBMTWdJl&dOM3{^e4;y@ zMs~I<6lzZOS!NqU`Cx7(dbpb55d;?2Iy`I&9X`rs5-YJ##gaHCmB>>Y zHqguTG&0(Blw7rTPhD2arL7y<*GtvAGxE&qjWM~5Wk!eYX|~c-la14H)znSYpG_O( zPgJ9F^pmNPKeS$H0oe?3wBph!_7oJoZ39+pb zJ;9uBRtS0j03ZBB_;>KO*X@50HCssaSkWZ5(7x2Vj=3y_1Hx^z2qjjDPD8BsklER1 zYBk(tRaer4sZff$QAu4VWn`_>t@YXTTWow~EWa_#YjVP!YK~1>%2L(Y^jEs|zp3ca z!Enn9J^NVNO(cF*?DmpgYC4O^RQY;loB(oNnFMmYk*Ibv6=2&}jrfJ}E5Tm~k%x^n z==7~jpqd{DSc`36$JeVOM=Wi5ZRf{t;izOnAJ5h#(&CmU{{TgMnU9j+pC1wb0Bw&Q z>q~iI@b1(85DN>O#V)@SL4D)BLJ+=NeS=alEw_c@x!Z>Rz_*K1w;4&iLv)3Ud}lrO zp?56zHw!h~ms2&w_VZjcvR>Rf$j^1E>MbFjSM$DkB8qL-1&L{*We(mJVV@q?o)$}TGP~Z*-$YX{lBN7`CL|7f}0+1IuAdIfz84MThmSPUztAY1P z3|0k8UCIBmYsTB^qwl6EoIY9;;xr2=_|c7(`}K0vVrni zMjWwIynu)f3l;?RYz{J{h3ADLMCr6&3*YJmWR+SdSyhX^c9qB75*1KXf73AX4l*(G zA5hW!C8lX&wJu5}cfArjkqEOJ0_0H|cwCeVlby#Hz#4KaCBJqz5=(;_&f?4mDs~X8d2Od9Frj-J zW(e|25LH1umP93#H_gfFGOBRA@(u!nUPQi5^heL_tRR?~fG+~JVFb`^zhCzY|GtIa! z@k1flM#uJ4`lu7@6M1Zzc()`%5IUp>%9uP9(Q?N*9B5L!U7lS=B^;#L;R7_)&J zYLMx@o8~DRMj2!SW>;gb;_j;3$&8)(UA@5R*L|MHA$4eBzPaAhODHiT%OMWTLIBESCvnS#9N?$S5Cp;u&$I7YND8Z!?g0ZO zu%M1ZeAy%taz+=L*tlaRqjp0!-!Q7Ec6Hkr*gj*)1g=XQWFDiC)nf{X;A0zr8S?=g z9DqSRc_V??^d~-jd9{92l2=yOcGcVKce}f9T~~j0jRd0|dRe_Ww2EF^HPZh8aSK~o zwnhd@-~dYuoZxe{o00|(zHk7~`ZHD)YujbsaD_|fZ92&0X$3BJOQ_ZxL|@n1wbSa31w{H;DSIQ=176a z3|IhicMvg-34HvlK2{*%cMM|y9cj{|8#uVO?(Ujx-9 z2*$}t0ZU*8jaov?cw8~$3g;%ew0NLI4hbL-VMH8*SJJuT!2$goPlvB+mS(TYl*^4m+an~AL z$@1S@Uh%#3htEqjr&RVx`fM#osnSYNdfnQ3B;D?tdTz9}(%GJeXB3TbWIXj?^55h{ z%t>W|$s1H6lFCMTE%Rg&3E1Bi2ObphBwk=XWu>$vD@&3m)Ggu*BCgUSVm01aK|~^56Y+I>XhP^^4>&oaUfAD{{XCa zV5cQWPz$IfT!tsUPRwqpE`_W!5H2L;RR}XjfHz@&RdP8kpSY|?Q^ixbn$=Ywe2s|% ze6GwCfT~J>$7v%xE);TC2LSmvs75s#=CfUIZGGOJewOU*x8!+~PNhWbpELJVxsuUo zrMJJEwfh>^4?LL6nJfs-=4>E4f$hP;#z9a(`G^39MHI&$yvQdQ^8h3$z){BGkO3|; zfs#NZ(^;&CB1sC6H#rTsU}u(A9ll~W4D-%9N|RcJ`_g0|?#|nobmd%tt?Yp0u;VS9 z6VWYR_TOu(CY-L_x@_K?-17aCl=+^UUEfrfD|@XhzcqVXNs67SGRzs2g2nOAAYg#( z4sv%dJvr-8n1MX>JRR(#Y2*`*U5FXr0n>m^0D7>2wzj`J@2dPFwuvp{ zVx}@!AC+6CUl<)g8DK!l=KzzD#$C(2(&QC5$R9UQ008c6r~nM@1HS{PJqWcXGEVc( za>M0NN6Ug`!l^28xZ!dGatW-~5ys3m#{T4IJ-A@!f%2c1Jb+Gl&k~os(ptM;eJ#4b?o~)dLMd5(cWo!9SK3-xU*(=a$&$ z2ORT}&rE^{B+-&^I2@=s1Pp<}$RLgmP7Y2600T6D4l++aF*segDl&djbJHa47$oI# zIP8P>UHfU@WoxY;owa)Eoss3$rkhr}cUpB@Zl0~%XR7I<)U_DGXXfJ|0m%%ZneoUx za7pDr`A-?DIQiI|0ze8&a(4hQ+d;v|Zdp$t6(ClGcnWZN;e$3XI+2zVh7E!MP{8s& zQh2Q3Nt6%)`NlRD4U#_bU=$U|>RCb_NEtcSjXs)NTi;&R+3xm!SH9;)8xHxCdnc{z z($P1odp$2}?6kT%9W5RqeD3CAwiiPR@v*^rq!0oYh<)~#cgjp^;WUBq4&7ssKvbnsx)6Dko`{<*4ca{lPY8c8Wi9&=W zNMw<~+Dv6QY;Ea35`2H6={Fi>kBIdqoupH9*2E+vqui`AVWn7>11+81vJoB~iI_fI>|}6WtjVToTC5^(?7s|N z?J5EWXXh8Bq~zBxO?vE}q;i2Atc40>l_6L$QH+Ho767O_cYvYP@}t)-RDqknB~(q7k0W-bKEG9X_4snT2_~NCESI) zrnwgDYZH*+-V`$)8^ikD--dPJ;;j;S+f_pHS!x!Snx2)f=vVTFkNZbXxzp~gBo``@ zNfeg%K7F0k4J;QBJaP4 z9}Zi~w^i`%<-?7^cWSrR?~nj057=%HpkjHmX_*xEvNDYhGk9{G?ID)R5_c8_nTRctdXT~Y0B+NW+};%O&PG`4rYs+yC06Da zcLyMlxMTMMl5i+Ps#ualejZs{q0X&+H_lHi$qke}NgpXH2+3jw+*VD)1;7kgf-(YtHxhT7G0owyasL1c;^ORd^Ca;_>X2I` z5gb-4#tsim?KuRJDj9rHse*B#==x~dRaq3{o8f-|^*$pbv(@&Tw%iS?#$ms_^C z#y&`N_$N`3!ugXyAY5c}9{>;m>S=vyo6)4*({`r^ZB?%2ZIWKEPc%w4R$BG8jV-m= zyQQ_R@7U-f)ci1mHva$(fP7=-)pbemKyFBAkx2l9jl-b9!xpU+*JDCFpNBAQ0AVD7 zXOC?7~64c7F6Sr95C)o{opga4Ztx2CNttq zM6gM<%c4&kcg-+-3}A(TE=U;0;g0G@0ml~z{5MZcc_6h`=+&(4-}JU_4`$O^Xp&v6 zs`tO8tJ40B7mGCo7+-^0JAwzzD@@#am4@C7DIAQR&6AEQ{{Z|Yy2&a}!T$gaKo@A- zuX>C&2F@Bwhg=?V0uQ=I(Yn0NH7!Qy5gdA)q^<$;ZX}HLIaNZxyKZo#91k-r+k;fA zqIinuE|z!BnCP~iYPL?^ORF#}Rg^Z|518kvrm>0WldfJs&@43_dSY#h*u2%0KB!m9e7EhWl~Q<7RepYC!OlNE*xilQhyxTG0fIlfne%( zxI0Eb10aSdNX`P_9(d0K%9>m72$D3~IVx^o1mTYxQ9;3Nxxfv^c)%fJZRGEc&^H+@ zWp*6&45Stq$YG2U4mx19naNpR{%tp+HXI|HT-#C zKJSO68$rN*LUmD`^+5`Z3}HcBoDy@v6y)*!vEh6@W7GKNyLTDRGlh&5BN@-iPI)Id z^RGCJ{{W`j_0AI0b7yJ!c9?f(JPvpx8SZ2aFKf$&UDyUY7?E&G43}XXfw6)HK5s*c zU)odC-d>!rPh_7}eQ$NM*SS!@!uxfyyrrhw>D52G*G|#?AxOc5I%b}vAQ8Q zwSH96+B@%crk1_k@1fTWELGHCu9c#jPfZe*-8}Z%_R#Am@#l;$8E2mK#^5R3mX?-a zU3Ewv^gf{sjhZZdGp%Et?X z&kcdJk`B?7vDGA+=a!Dn(zV~Z*4>T9Z2Uv<}Or?#If?2REA zB)PP{wrb7ot=hj=+22KXsae$!5OCST;2v^FEOFN%NF*uioHj9v?q_OyHd#B0fZ}pbU)fQc4}9V`C6-%HMk!7~~Diu2-{t)y?Cqn{KY!@osnZNRsy0O9#Ss_hyx$p z+Bi5I43)-3b-W1V{f*@6H#NZw2n6E_5q6MR9D+#a7~Bu7!Jz4|hLQ!2Omsd}I0eqq zPUKVt0bZ;~2XP9=b#GbBEnEwGO(r%H1rpC4sgX_{vlh!`4iqsVLrBGy0ajcU?vD=B zmb0j$^mf))_;0(?-cL@JM)9EL*D_Jtc)6yux^COOTC@4}UOQo?YTC@fbd4`r)n;-C zgG$pcZr`^^?NV24V21mkf=D0?H&<`)o8q1PqwL=e{7l0nG}qR5I&5oz+m)YEYjssc zjQrc;zzxRM+I=o=&Jxl!{N zpp*bqXK5JvyW!`9{x;d^sd1%vr%d=q46-S8iri}&;D{+w8o}+J(HoMaPpQQrW+r4- z3o`uyZ)JZSvPa^-9{9uJEyERKF0(C$hhp&mUlmaSg)y|nK2{kMlaG2!fAvUrTU8_6if@~bBZwE11raD_{*?vE|i z@3HVzm+Wux9F<*5#(xd`I0B6QtHd{&iz(cGUnfSdWB?}F z;t!6#Qs5~60E8pq#c4Bp_Gq!?h+@DQBE|(f z2v82~gtUwE63vz+%duiS%Cc|n#z)(xMcM|$M2~Rfl44=Jh7vIZ1_2~y3KS+gBg5Eu z$K7sQHLHtqvg(q$*K6I|TWXKh@SYBMe&HEaz*cfjGD>)gk=8CYU%ROm)%V#q(%K(8 z=)bcs!5YWQh_-)~Mp#H@8S>Rm;IMGeK)>zboMG5^$9)7F~mlKY3J?X}Z#kRBv}tN_8#XDZf`{eOw<-i20Jt6zyD? zR^lK$!?_kmoqW`Yq1;OZ3Ic4H60Fieb>aCW+V_x_8`m!Eauo=51cYHPArNj;+4(z9 z=X3tjJ{Xeeo*#nVBfN|&Z5O{2CPv@2-B_lb;axT%3J@OxW@0h}lIpF6d;3Uf#^*Nw z0JHvx%p_(8pOL-n%0iSiy=p0f=Pkaz0qWJ(ceJM_XFgTH5#W zx%3e6vw||Xa(#M?T9ukqF|FMtYbaqPo~^waSM@(lJl_bJGLXOtAROu!YzP6t%Djr} z7*mu`HyjM+J)xZT+9a}O4aG@fvOyKgL@)=;UVV%m!T?AkdJ+It1uOGye`&3BM)Obb zOT*Uhycd$+#8>cPRptBALuVDwm|K^V%o4gT;ggGzj=!}Ok&^TLD6v%vK3M!)s*lh`f_dTVMhC2m2qgLa%4?$rpOO2*790ZaH^}gjjVC%!5XSAx1-s)So}ry z4a5zz>DHQxp~C`MWSGynH#X6fS1dN7u^@h6&HGen)`g6J2fQ6&AR&xbzBut!=2$Td zq76PfGEt0*q9G!7`Gp_=ZYOlXr2=IWuhF7lE-bWysD`i1Le!&Ep^4hsLYKd zh(KWw8O|lXMx%8ZMcdC?G_Sk5(KV);9M!yi;b}*mW4WAlbm`H>y4rs)HX4L?R#%tg zewteRN7m)khLJu00EQP%lI5Z^ta@`^2pBYxFpp2uMCe@Xa*|yaNjPYxbP>zd4Pp?< zw^j3_m4PD1Ol!hJZwePrncEcGvqJ~N!VAQsWobaRlw6v#Z<%dqq@#5kJ3F-1leVn+ir-1RhXmxX`DQy2 zQG69DPL(L#a;`}wT5?V6cW2($(EZuHyP05n%|?9-!Pbg1_TLukBGC~+3mls+MxO@O zAb@=3O~f>kBq60fQ>^~b9|HU_FO%Xgjvf!4!xGm17}9mW5$$i^Gv-|e$5pl3aT=2M zDI}n;&Vgko@m6>*?o4L>=T>=H1Bo>hd**cC8h;kJeWGu777o0yp@TuH2o> zyW{wK;uTpCB$6re-%o=(ol7!+$P@T>D@eT_h5JkV6xK|Z`aZAXO>9R5mr~05KA+*Z zB8CCxO(d6IDAu%VBn$h=N{4b(Hva(Md3(PfWNk-lJ^kL8<}o3c%1t$}5%ST?6jxR; zwgNi8ma#Ic#CFByBfZ}b=^iBU9l%X9!8d*}wLv0ohCOmCIOIjixRUQgk|+_Pb_PpG zuM5n;d0?v@*;D%LmF2HQqZwZQ?UQ`cT3*^OH-4TrL-eoWh~iSs@YqkQyIoVIR-CMw zx9=TV+`Btol(pTf>HCwe_{U!G{;}a75BQTw@YljYg8XuXKH0(@{%H?M3gb^*bF)O}3WHU4#23O-9;J zl8=x70BoyY3h7#QrSV%u{?p9D+gsLQ@XfD`wCEbr*G{;wxYv%2s(9Wg*3#8uifEF? zE0?;szmfGj#b$#KP`&uCJ;tP4;^OL(UdLl+9D17TcQyjm7D(>rx-PIvEa$ zEXgSwCsu_3<3Jq0O?E>8iLD#XGv<<4PVtV(IHeYrom*CVx2=!daGy$V4sm&HdKu0W z6)Lr8RHrpK`>oWY$;&7zt}<7@GfyPe_*aXeA#me)|3p337*^3p5o{{Seo(6r4`YnzQN zyjQBvJPi~Unn&5SVlE_&;SYM#+v$pc?pH{xCb$9Fts%RHHxj4YaOj^ECyT>cPO+RF0o@?&_-b9)QP4mXaz z2zWEZcUq36;2k#0;P;I#FCF33G#?V(&G6>#!a&OUcCq0-d|vAM9G5<8GwQkri1m#! zD7?5M@MV*<^2Kq%;$WIo-J-qJnsSngidM66y}C`sX(RYoi}=eYsfw>GqcOzBH7hw% zq~_G&8!la8QR!!EHO$(3=zLKnw}!NxQM7G;#M=Fitz@#nbEGeY;+s{D>0xF|T|(jY z>uW0;gq%kUsu_H^WDaDN)Z3nyK)bv{e;n1O;FA7S;4Pon?6mD3 zRhmSSL=zQwtyvmCQv_&M=oz}nPu zp^WPO5Z3%@;ZKM@6W8pn#PQ2 z@zx$x+syL?%P6NGu2kiJ4%EH8p=GX$mrlptJ|Fn=s%jHj>HawIulyhv_be9QRKL}9 z>)!<3JB12Y#SwWLeUNZL3wG~s9FBr(uQwvToU`!n#FWzF*P`%U{+g0|RZ*lV`-I8(UlXgibt*vLPTPrQ^WAyx+$G#=O(Tc^&c!rW* z(n^#j)#GT&EWqEC&RkV@D%xLXFEy>%OF)$1hB*806=KZmd%3V zdnt8TUk66i)E*317Unq#!>Ahq$iSQcI+XU4SrBZ@h{@_{Bg-~@e{_fw0={o zUig<@dy->Uh%zpU?d|CKU;7hL)d{pqZg=cs1FW_zdk!}9~37?F7 z2Yt9%d|LQ-pxlWy{{RtcXp1e6iW5cf_12{&t*w`c;uFa=^6KA})}A|u#1qE)eDTiq zMfUi2#9kU2j-g`(!HsVsvbfQb&f8MAXN@3htxDEQ+bGr&64j$)FJRsi{h(&lG<&^2 zMe*dz;p_Qzj{h`yL!wJ{sM;S2YG2wm(cB2&mq)#p_9*WB`Q}(A zeLYvf-?gvB-xLoL{7BbfyYU98e;j(ZjeJw7cq;z@#LYBT@xs^sC6_^IyhGyOJzGf!Jt!g$HiJ@=8@&f z6)fRIwz0RvVLy3r(OFv~$OyBx1*LCJjaP`gV>iKoC_&Ayz!D<=)9c(ca-D!cnuyW@NB5#In1+-rUyYxj;d zUAT|!H&ew5DtwBz@Ww=EYY7COKhRNr%)brLeXj9ubqSg%-7W4l<7gS3LE9wusVYXH zg8uL`0;4D$K-;}*@O!|v=#fj{Z6Y|8ipKu{@S5rxgp6|75=Kf&xsiev#JCN=<~Rqk zIXtVh-ALJ`B^5f3_O_N(?7DTf&(o5x6Jsi;31aarJ3A`XBNeP)yJ@>yeNtNb-{mP{ zyNDA#^^2$*fr+$~Y?44BHZmEQ%;iI5%%AGnpJ zDguU$ibNOpWDtxi?Z`e9cqR<9{66rzk0=ml*0mM~CCMe1Rkp}r0*7)q$t)E^E~GvS z_;qT;x5EDbhjXx2U?tSG2aq}6fUiEec8oG(4Fg5y5OEnsb`^#vhugUF`{yf%nJ6&H+@F>6T_iiK?-Vm zE%%?{$ZxF~!mq3O}% zOnn6yLlumE&0du^TBNAKrlrdoeC@?F+O@e|uV$OKAK~AKS_Z2E+sy`@3%Zm?iudgD zpj9#u(%#yUEP_Q)i5w!`RLGueB>CsjZ6wug$bBB_-bkDWD`lxzy}5|5D9Vhhu(C1OzB|)z66W0_ z)&k11O>H&swUXsXW|A{3rS{HIj7#>Y#0wL&(L*c2J%E_I8S zX&d)!k7o%g2bma*3wGkf#+6w~^2eFmnWWokStReLy6>f~lkRDY@dr7?^3CF_R;LbS z2U4t@qN*q9~5a6xNne$8lAm5P;`BMgOs3KU{KF85dXvO$YW_=RPo+TuwCmX&4U zHi#-S{LEz2ZZ1I|G-0->*fQk4*&9AuRN|i_mo2nOrnO5+O4?hc*3EU-t1j^qHN!`j z>o}M}+n$^%b4GSb%2D=~l1pcO(sn&Q-W#M{jiJkuIP#W#fz&e@3bIB>CcHFWAuqO-iAM@MA;0F}L6?!J0A ztD<XxzUo-Xlsiu_*FhQGXPmeYJY@m2oIZ#LhsS&87&tl$=~ z$bs%|rM&YJFtJbgv8pDcEKeP^?Z&Y@@yKS5!scg%5;xl`YBI~^+QuR-rX`Tcyt){7 z`G{NetM&}|;iULq_Ky9Gwa<$_KJZV&y%*sYrQ)AJXe8CA1~EUQve@%*8_)L;syQ}7zMF?_1L+cG;kv`ZpNcQ7p%#1^)Y$!i#n0d9o@Y~n`PT+15B zlBPpC@JmL1V%xVADn5h#q5e300{GA4zX@s|20k+UJott7PY3wY-tyPN{vv}})pYig zRq$-`HU5kqElSvfZs{XjM-moUVTjAHJ9rDM?P{xX?)TB(5bN-UU23sh)Y_7Zzboc{Wjk|g z?_T`3*3B|+GlTMsZ5cVi=opX=a&kr+zXv3dfXGNBCPB%x$1O zZVukZ1dM#ZWr!O<2R+vS;Z&2&Cg5^MByQ=FameVZ2RS(hC#sAvHPFP8v@uznsdurajw@OQ`_DL()vbP8tSAt88HO|1%vfAoUI063pUO^~K zgSfgX%DDj~jEvSNjQmrn_$R^l+SY^cs^j9vh|Hy6u+z0q5NXEF-f0>Zy^}!EEj2Aq zRf|k>9P{b=WzCh<{4z}}64}9JJ;>Bpt=d^`bp>hBb`h5_fC7~PRu@vukcy)usrk?G zRqY<@Rj^;Q>AL0imlH^aDDC2k;v(ejLQ;4pXKnc4A(J0>V{!;d#&Nn*NxQ~PE~{HK z;~V$2)%=n^1B)m;MiUiAh9Yz-RHHg{>eHR23Cr0qgDa5wdcXyX|fqbi# zh9N!Felzix{t6|j_)}T5y7))%ui<2uHWt%IaD01rsQA8nJEEnr}%5f%jS74adRj9BOWPxb=hy?`zXZ8bNTB({1apLu+@g4eFutu6?{b( zlia4A<2(NVi<&3HzZc#MU5g5Mi^0DTuY5bK{i&lyw1Q8usURifTArm-a(ejs$ziq$Tv*KLRoqzU`__qbD>c-ylBSGRkLiTi1C%A z({isoMOjW)PiZ=jM`xl+E98D=ojq(oShUS9)Gk|d6rU^e5BX+xZVkMgW0hZ>nXy#v z<(=SUH&8_z0-wq@H1H5B+0;ZVgH zrPY2hTk7H_U`b~G0E9wEqCYPm7)i)_xlNM)5botyfN)PVooAO!#NVWiO%C zY`@_kyVdn=X>VfG^!H0En?t8-8disIJ+-~Hy~O%rn_E{mVr$Rom*8*w6X)X3z^@8u z9uuGTobV@%?K~TQsOtU{w$*+OT3TG`ZLI1S8m^(GTKF!2S%{v5K_H634C(X^$} z{HQfOUsz*3jC!@?ZQ`G_5Bw3<^Y)YYx8kpi8o%ugpm+-Z0LM+?yZ-F7Qi__=_UI%ljs9#?tn3sY0eV3uviQ zkG73C#-ypQ-bM|3$vCZAwV(53ZqZ#>U#qzRd5N>XDA{6T&RAijA1EUVSgRF?o_m>q zDCL)NTqsD;?jY~jOu@$7ftYfk3b&c%n1}RLp#K2D2fPspL*k#?L*f><072$j_;=u+ zhkP*H2Kf^6QuvYLafJXemGt%`5KKrylj^!>{1BJ+S7NQHd}aNi^=TKDc=Zp4`esPZ z(qkS3)E*@pPU2>Lpp^wk1^%+X7h#fcf~z?-X5mV9vgNY7Zui#e*4LsxCZ+Ud@gB9~ zEV7mvU29hrMpFAK+_dK<)1zs5AIl}w@<_@dF2Ruq0@_gR_el%42WeI+>Z&9I43ar5 znsVCe0e4LtiveO=%~)YW3KmioW>j3imcWp{XbUqklN6~B^{;RL00cJui!I8FpB4Vm zTHhlPP4Nf9I(kUVMspsQ@XpR=>y}}1ylo_s0<7AH{1J=x5!2&uJK?X7wYSFaKVA6E zuRzQO(i%wg@u$QPAJ|DW`k&cR!FBZW3tz)dZ6Lk^+i_V`fB=%xvYJMOgO9BAFQ^ zDEN(r9w!eidDuk6T}31pvpA5f$k3_ABbFvsiY5Y56L?aKz`=>xiT>$ZlEyca%y|+^xn@>uh~eJBWc?_9o?YvM;8y$|!LZY%FoW&!ND=I4x9THG>9Bz*_`ic8T{?1Gi5W+6H9?pPe%W&HZDj3w-Fms-*XQl7)S(_ z-5jcNNk#;a#ZY4#iP%PYQ?|OjjSX5#O|^FC%+u3LJr~N_@4b(YbtO?Y)tj@jPFm=< zzP?R)Esi;~gpC(!V<#=S0^wPP2w;SK#NciPNWd9lNbhv0h_Q(Pauza&c#%#4Cvk0n z07qOeZ0_T5vjx0T$I1wB03@cx#_W-|E0iFEwNmK{DAq;;9?=UX7QYZTJ5 zH1jk{q2o|X31dQjRg3|+FvWK|hnF6nmoX~DEblGuR|e)LXrs7Tt^zcS!SfT%keU72 zZ+7M1)4WWC5Bs z-c=Pg^!IF%vP-ks>80;)CvL3hRa_fNOPWiY-fc!#QMWCwukNdFYu?=tK99oMqL33v z)umNXa2nkJTyAZ_S|-5{AYqjNBjJuecexLMJX0{;27?ySycNCHbo*%m+a}T@lTcDw zb~=y|z#xSKJ1TpB68_8{8;54GuY76oJ;~*choHrvTFW3-h=rQ^;x}OIJjk3mDf`Is z32nUYqvQVo+2Y{&+Bd-uiykE^0ge1g@gna}vzVwQOtI;3%3=x| zWlEd7l{qA=(&m%hZlf7De<KNxd)H8g3 z@qDbOMfiR2qr=Eth~v=wIIPEp9$1l7*F(Pz6VbvgDGSB;}{Np;_7J z@B7F?>#O&4`I-AmO|Nw%le&D(ZLQQ=x_ariOB&GLX*2FkCOP#2M;~I)ZZF$+KQ?Fc zHpl^DSYfci!NWFnBDU48NAElt;_HZjByZA|${emyLITjDHZTrL5%aDNNj&_25r1h9 z6i$$6mfzU%zCpUtv_C2c(V1T|-95F`Nf_G9Oo$~=@+nZvA+77b1N?b5>wDrqjn+C* zkT4eV-d_3bhA43zzL^3tmtq5DLEH!>w*~3`+`v{!6tMG@v{zAtRsGu}r&15f`t74P z`qY#gbt*VJIY(Cx&A7Qr*Z%+w-ldbF_}*CWWwiKnt7#y?7A|fsZS@$__l(iX%cuvn zxAPHNKu-mLQe#q%eLLXfE2aEE(O*-7ON~lvEnU9JY4!;wStruxi4r(;yW5zf%Yh+T zq(YIiO3JK8etehVmcKhsscRn>?zJ{wB)|4{jjZc;a~PCI8buAI%gWwbZ8;I*G&`K4 z25R;H0EAu_*M1!M+r!>Dk6u0`v$(d@?XKX~wM!ok>NdK5tEJs(vdq74y4G%OrMDLb z;te+H#@=(|@gfh2Bn7U2}LRxt0?l%TP34Qbeq;L*3DRvW>&+& zsc9Y!)Zx{v<9$BzCx9~xuNCULpeO96XJZoTGL{bS97`K1hBE9k8C5ODYhDBJh2(Y` ze3~zYRU&JP&891sEFz2n8%c8*216r+g*PfY$RlSHWra%#QCjd7ejqcsG z*6PxI%jLW?p`DxvnO9_g8NQq&TV|eLDVjM|l}V5(P7H2uwliEdXS}7*l zR^`)sbuq|{a>R`1I6H|aB;<7&R?ggj--*KPMkg!*$2&>L1Q1&V^YW6XkN_AN!RJl1 z(1UWlxm~4{M(hd6KQSy6vSEM)RBj^*aq|j~r@HWW5HLwm9E!XGpk?w2{^3)M?QxzD zElF9Wy|mGKZRENqt=*61+2Loq*UH^A>3w(WZF*=?WCH->X+1NIq+=u@R$@ju!7J48 z4g-|{>IfY`47u(JWgjRcjNo7#pTc&D$3&Bzpn`-c$0ThXc^!u&1sKLas(8p?e((hV z85zeL_a@*DM<8R4_|4AB{W|Nm&8u~5O_$wcnbT2vtLm@cb!EP{((Aun%I!Ll^1~=2 zjFZUavOeJoSe~aVw2lrc)C^c-VNuZYfS{a`Ku}L{wL#Ae4^RB&Z!mu3g?vVW zSc(>cJMV}#wk~fxZJ@+Fv=X((kEOK9gNVRr)&cvb0B!-uz>pB&$}wACkt1_`@e4{N zlWUkXI45>ZvM>#~(0rr}oNdpRTg=FG`$ zRJqiiRFXJM9u>2N8dp3g+DKJo+*mUrO28;25>7sTHrC8cvuM*!2_L?BQq_ko^A!;Q z+~DjCGsqkO)$uvzcR5}Z=*8V{&C6?A)=~DB>2G(Y$owCOb2W*nCYGApmP$@3wWaSg zlTEbTuf6)S-^Y^NB&-hNtV;l@a&wG=ah@}iz$}bHtJ50V<**@~fr3C1M$UGeHs$k9 zROF4`{{S{PTJX_!A^=A;ux;8D34E}mV;gq-#HkoNK12r=0x{7?Mdoe=5?KdvW z!}x*T9a(w8lpu`cuOhxmj%kRTqMR+NNvS(6w^m+m&1r9v`C1j}#-v=MCl=PKN#Ei7 zHr4B|cDCxhQt}m)gT64>0ZSt*8(}4hb8W?iu5N56tw`9hidnI0ppEpk;EqM&ZX! zr;Km_ARlE`Z7DeF(sp|%rq80<`r7^Pr_;BDl^DNv&MNxqw2sX#?$*~ueu&sMF!csb zFhL?b0Cyac*~>8`a#(}}fJka-)9u)E<$=@|LAi;~A1kVnl1IzWLZgmxcT7fn(%g_0 zj|Yx<1Q0X3fEfIzgGhY-Ns>kA2;QMV!1=L){{VLx7{SR=f(p}>W!YZ(JK5~Cw@vyz zdv!bN6q6tW$US=FqL9P_a6u%P#f%4$D=yL9 zHEq3W` zmG|p)uU>-sqDuO!HM@RaJ@$I){zppoam0+$!;lXFU^|Nple7sGV1P0)oZ*i{oC!a& zS=)WQr1E&)qwb6mhsU5FDH%E7)p4n6(xY!DVF2N-G53C6hhPM%{Mo=Kou@m7X_7+a zo-||0IR(Kylk=$sxaR=!NEprqV&t8gx_4J?C4E64ZdB8fKG9pq@GXB^9|gNS2tvzUxjwn zY_@m5UhG}9*Vfxz=)VS^P1&kfNhD<44o2dx%68`?I3ov;cwCIKoaZG(dRfTbK6u7u zn1bi!Y^h*=Wy2B)3X(FQUuUV9cxXvl(wI4>RCW4`HyMZ2?~eI!xC~p3zL8slC{c3b#hdT zu@MXcj1a|!aszpIQUU3>@sXZ!Nfg^8^C49j!)@Ate1HrPcq_vWF}Z$I&Iw;zZ6w{> z>e5d7CbV|Ft)~5NaOLG|ODl9*blD|;TVB?;nX31xk+>D=dGD4v=K!6+4o5s^G%U8w zgS`jwU;qOG0680h1CP9Yj?zvJux%?@QHY|poP_yMc}E}(c1D-FeY+6!RXwbNF5>Atppiq>6L*S@3K+kG$R(O%6x z9rSJAW>4o@a(a+5erM`&k+(bmakv5wF_F`0=Gt`Sv4S?UkarW2jo-vDP5>h(YcER1 z5XJ!nZO2u{Hsf$CKw>%C1_4&d&)x=|}j6-&|i*)+; zO3&A)o%TRz?*|<_uirg*$0ukUf%k@bZ9U6;!RR_;jAR^S_c6_SZuljz zI+6e*p1qDvbBq#sCTJ{pKErwpVe^)+Ku9fH?WOU}m^xAbi6a zIr($I1Y?y0u1N%NGlR})HyodsbR*E=aDC5xyn=d;L8SD(ujc(MueQ5uc9YwEkt0l? zumFGu1DyQvE41D}@z1wdhgoMd(P z=n8;9CAl>lLIB8R2c~n$+T0(#$vmzx!tLN!J*8xvuj$j_y}GYG)7|$H^S{pDpvIrJ zcpw}Ca!JVO7-Rx?&lv#m)}Zr<$RrThQ;hZ;V~qDdE(UNgIuj{}k4$Yn1_@z}y+#4R zC+?C0kVXj*m<~H02+z%)2VCSg1aZ62V*$9HTQ8QY?!By%(@yJqY%)Fh$Rr+4c=YL$ zfH9JA4srn`bRoMlk{3D0QUN?|00MFV0|c*4xj4=#-ccAkFgt!k@sK*H94d_PPfipz zFf)OYFms+jBPST=k}#l*(_9DoFAa+#(U%p0tRw>{{R;~ zFpNh|Nya$ira>prj&uFvoQhPT)t8s1w$Y}SUtQ0iv+Vx>ulRNMj%`y+P9IseTw^5M07>MLfW!mAz#x&k zo!pZPc!xt=?$zLKINKzL=E1+X~7*(*0~ZElausK)+lPOE({qw?&x zu}t`@!x553pfWyUW4F8{@I$ZqydO-081B!?2{oBFj{H9v+P60i^92V=erHUKOLA%dNt zoDzFjw0#Cm&UDbKG78OQVSorY!$lBmh8tIY0O5+@0!7ihEp)~u)2!oR#@mIC1}wzk zN<1t=lY$7q;EZPhhZQAjM_&Eg?4^5j@4eEyWx}+hx{^uW*H&vySGjk!_gA&IJWp2B zd@VbP{5h;mV8`ZoZV{3)#lB#%%`lV&3|r;%6AEysxB~^+GTv48u9pQ#$Jy-G9JwXF zc1V!PgMo~W4+o}xgbkYx zOC!3SS0tU@saah&WougLS!tq9-#cH;{@R2By}0b zT`-vTa&KIvEo`7{H zo-@WX$EQjN9Py0w$>;}CeLo+=r8g&^nT|jMgZlBo>%qwDMoG^t&If)+q346i7(9cX z;*M9@{mcgdLF2dPJ908ltx1#FPvStP6Y709$;J;}hYh&n1C5~I9A=P_*m5z!Im3P6 zPY13K1YjKW&H_okm-N1$*1GBFB-6gD`u_ljx2Q4bbDVNB$EUX+LOW-;rkrtrJAu%4 zEsh2bF^<^dp*UswgTN&4d*dGccHnb>7bm?YP7k02oSuV_cV;E!$w4$+RM@Xvl86~=Hz0XRL*?s!q_&N0(zJa&s| zasn?yl2u90PktLbWkKg0oDeW}bpHSjYPy@MTSm<7lB%(^(z)D89#lc(V#M@dGC{^L zcIiV8Dw0==*>0M)iEi3kZGN|YMJE zg4YgG<6bgH9~+~Yk|qQ10Ahvru0rScmk_f3+$#VNx9J*hh5R}e*2dMYXDVXZrv;Mk zLAkRN7~V^jMl1`nOXYy-sKFdou?&e*>-K}tee?u^Xjd!;9_&-Ni|Mf&&%Pm zx1+c8j{@-D!6vx5w~xga@1&Us&WEOhtLu!zZsn2TjM><+&f<)2W{;F;Jmo4rtnj~r z^nU@t5@`B9pW*A50S2Y3Dqnc2^<~It;I&V+YOm%75qWm@@mq$&i&O_Gv7^P}SBYY@ zdw&UO3Cf3$nYG`n(W0zGir;tuIvqZ*UpAWc%QRq4ijjontIwgcUW$dFDdd2K#_-#&uFFSig$n|0k|apkWK~8e!_%jiQiYpKO|KPq@Y!0*_O`a=TJ^Qhl+3t- zy?D4OJ3XTo?6$kTw6*(9uCH>wpW#hf^}g4u-rZZ+3?C|J?Ch?YBMeUWyO!=~)o=hn zZDfqO@|)%{%iL);ma6Lqge~k~xe1AHq_MfzZrJW}0lK?b?Cp0sllQR5@TezbD!W#w zK^>fKtoJQ{en4>V?Kxo<$o$O{h$Xo8vDTcxS=-f7*T`-+yCS z7{l6ViK*LN_=8eT0wsonVFjYXC1qpg-`zchxo|FLMud5tiZp1&H_HT*)?41n`n#*W z9=6)nd!G+l7_4n~1sat(+EI*SC%aa&E?41B>X(R`*@Z)Yeu&$Dg&=inR!CG*5+kb-%+84?76O){^nvc-Hbb zqez(Dc)ED)-pEQok>k*8blGE4w$t9~Ht{6S@=fL4hwQ^o!vTg?;UVjqV-ACoc3sz~u&_`dQO!XasO zb+<_L<&=XVgGRSYh%h2LrRpNdUmDzAUS8bKeQ|Mr;vGinR+{Sm_UX{cBV@}n$#N&V zx^~V>v4z3I1|*t=vvLaRk-h7H0znPYwpiPeFtOUp0-#(IvjC-D()}bP1|>OX4U$iq2>8z4+R*) zl^8*2tfLuU;d;%kc9XT%i^}&LBS&VC01Fn}RdA%R`GF320OP0(a0}#xEi2ors;e;| zgTl5B3Xm{ev9J<%e7`UU1(X3wp&^X8z+wOlDZ>2K9_^6%uevpu=jqfQrUH?^92 zSt~1Pd--kI*=SJ>0uZq&X6(U9CBPsM6k~bI5Jo}4P)2cD_BtM`sjx6W>mNI$e~|$g zW>EhCFp-LoNJMrA_)j5y8%*$Jm9ECQQ6qr4IVLvUv^vPevUvdtDU58k;-%G36Y?ht(v%hO_ zp-{hO01WIVPy(DC%m83`Bn)E&Z3Cg>Hv3(*vd`NJ?k-niWtft4w`%0%j5gc@w~v%$ zR~@PNy`|ooR`3dt%;@+4kU?KO22H0UVG2%J%BqDUi+_56p-r4 z#yq?o?VZPVXV<2Z z8w*=#V=>2q{%jV_7)2&kkVccc00Uv$a_1Y@0~P8~uIB|gT1}|EHF~A0YTezm-+gR# zDlm$1ifujZ6!lG7>D^z?(%K1gGHK^AM=Luj6%sPaBQ6#|uNue@0HIw0+X;{;A>U{@ zqW0?IO|nAps+C=f6v)dUWLG;@N8B8*?;RvNky&F@QZuUX2$-24BVh`QG7P$x`I$k1 z*pNw5?#S5rfE_7L@F-`A5CEBHeXK!rA>2s`k+$JmC4orMzF5H^9bA;6wO995w%PaJ z?pEv2?1eQIrS-Dq(W~jYNju%W?zP)Pg)rWL#7zo}^SKpzj>NDZG2BV{K^sN^B$f+X z@A>(&To1jvAOR}Gk^=_MPImmISMP#C!dX{#Bya}|O0G7Y!*&9wBfbs_?kAxwQTe?y zDdgjYPBETva6$YsIXsMG$EzgU*IjP!(@#s?Uw`vwqZ`>P-)_3=YiyUEomG~lqi1>4 z&1P^nWbI*|M?l~X0q)0u&4Z9*`z6^q7Z%)-0U-Av4vsic@~Algc0KBuW9Rpc-2VWp zOoN_PvBw!8k<|1Y;-YCI{{Wt^$s^@Lp51l~78%IE10Z1J8uO}J-E~@CO>1Pd(_1_K zi*tHvEvD_G>g|2D*7_^o$?j^$rCwYXRlKzY!2mYwk_hUp+-CqBsOye%S`qkPS2*(T z?Dp~ZKtc|2kUoBdu`SPR_O4|vBZLDD%LW)DYdm}aMmR;_Wal3*u;iO2<58ECyO$ku zW(;uKNc+I3=NyyMIUHc{{a(Ahr*4;R-6hLzk=onauXEp{io?c|PMdPFPnKI-m0I>s zeRaN%OSE(&!gp=f_P}9xDRy9TL2Mjg6Y`uX9d?|J#;MPvU)YkVd1=EH081#q0RRDl zgS2_90s+CsK|C&B+I0bs^r=QN!z>kdE<+vwCo9o_`t;2(&33?-xRB%)`@r?VJaM^H z4CezG`9J_>;YzhOpFPv%()ND!y6DTiM zcYB>Vw#&N>EP;1mj1Ux!#dEj@u* z%2Brb?#v3V0o>Kb$hT`8KwSU>wsP@(-NnGeMBogLc>%C6GlDwr42zicw`P_%15Cd| z7~AusL{+28Mu+Ck?BTYmovVf-y-Y1mS;7xn$|_vV?Wbp|?|lz09I|>v`_3u9cG~jo zqi=4S`CRIB{R&tmM*h=Mi0ywVgH1vh5p&D`0H$GzZY;SN8v*jj1TKY*l(wf${{V@i z5p3GSI~^`GY+c+>I-P>-k$_GLw?10sK^P>L@!Q+X;?X`)97GGNxYP+I2{Jrt6;(=n zplk070>#M-d_&ykIV#+r=KTwPAfZE<08&46Zw$p$BU;!I=`$1E4>s74As zFKu15=(@DEy4gLqdY-lxoO$4vE!?!$YTI7-d+FQoM#A`7YvE?sR~ErccO}*>F&E~! zB(t9~>OdR_NL1hrr{(+Lt^Su4kA}6YWF|#XrO3$E=ptL2ZBbuzh$NCm2`}$h7G3`U zd9W3f=vtgAj1!qP{0-#B;t);I5hnWR*_7%0nMy= z246K}lIk{Rjk6+zR42_tE-yKS;t;rB4A--kCu=V04`u&`AiWG)Chl;l@mD`~S^mLg231aD9tKpl4gs^gN%RIy^rMoR6$ zT&P;r2Jt1(2*BlHk(3R%90n{pk)A;uwg&^j#;Efr{wvCFW*&s z>P~Xz(n(s)UfS8MbXQhx?|YTwj^f;io@*hKuo)B`oMB6`AP#o}xmN)}JOb5i5#wJl z%LX&Q_dxX^h8vU?JF$fs2*)IHdC0icY~>}3+#v+<8W{LPhB!haatPWonHbA(Fe!~j zJCBhkxmMl4%QNoffe{u}&sJhpLF9zW*O_~Lt9DM-Z_)bS)o6KgsTikc%=c2}PR{Y) zqqVeJuej(Vy0qYxl>*=byVVZUAS7hM2qT;-?`@>y0y48++dm0)aF}v)8ir4l^>Xqf zfu0EfkT5zOrhOAZz1QGlCyd~>3U+y4XP50jXJ~U2Z5jn7_#RRF@3mQCRovq4Txp8Bw||H-~hmGHw%G~NjsSnjHwHqRH!)BMBsT685KUkB zK>ivdZIi@aC4M(L$6!w(32c~Sbt8pc%oO16BLE<6MOs7y`7csb=9wv^uIiD z&QD0nSGC%vtoHKRc3bId900qCK+W7_PpvXzJ%M)4FPLJs0L9F;vwwREbGgl^>*ds|)h((2aV zUslnzJYO@kl+#M<-D=+r?{@FqubQ#vESKaoaoK7N2n3N7u2pmLkC=I51cxklE^-5B za1jkBREYV5MAc;^frYnKR%|v8EUY&TyKgqC7wp24LLS_rXmJJ>-NC1(F#)9(N7nAK8v{r$dLIf6fcVGhYL_TSyw*-J!ZrH(4 z$8JK9d09MR<2_na2-P(k$9^6w7+{58lA(OND|q*evVgceFF9aIzPdMy?)FJ9h4p*F z#1@wA9wlNVGH~)NQvo9@7TQh@Nnp7v$&1FyUkoJqZ>{ue-O}qtb-mwyuE)}4*ywADBozjP-0XbR1m0DC`#;*#>556pYL!F z02V7ghi?`>(R-`zIU{R0Q@ECJc0>uuz&POJ2LpudYhCPwe z+i z`lF~DKw=wU3URe0Oa>}3@}T6Co_Nka5b){3hu0G$ZdgXcc1qx@EJUjeZTW+#4T3<} zHfO%^xyrAD{Jp~m&Arpm6a|MSS>iYZ1G{J^W)u=PRVI_ivdBaDdd3hy2X?tQ;-rp4V5iOi4Zyc%od(9Qqx?3@&2SVnATkN|WfT(kZ!!qHr0}D~l<7hW5ekGCjfUSv{qjh1k zCI^kv4gf4!S0kU8HVl1A`f06`T*EZHlxV~pTdqT2YOd6!q$m)JjbDmz*RquT*d+ny){{UZ0boBWdW1!!iv z`on|2#P*UB4t&iD&SFkU*upDliyyj33%4L-^u=RktAVvO{{Rkvai2HB%q3<}>xGcp zO0kd_jHti|A%+GyC538E*R{2~hWaM0?Hg&^%HMel6=a%m{HmG^!4kun)O9{c`fYkZ?_q2qh)1%ciUYp z=5g1t+)B!IC~nJzR8X_ScoBChg%YHyNm3MMMrOgum4*wowEL%3Fj-#gVhAk*?*QSx zR+4EVayFB~5zgQk5>Dmy*NF9Y^Di{LU?fYoYsIKEN{RsG3PM@HTn1@3oM(10)VA7p ziS>jrX*wph%Ns86mO6|ulwcUgEyUB9VGN^&cTtv7bCI4|VV^VK*2|h(TFXrq-n-a* z@shtX==vtxwwu{`r>~Z}UT`o`Ce#Z-W9R{Xx=GE5)*~oNg$F7ayD1N zJ~}pn;y;FWmob$;=@MQ^BNZFemyIr*uq8_dKX~UQ#^YOYd?NAf)N3Wym8WS00?c)9 z5ydQkCh`9O9@dXE+eXdG412)dSTIsoNPHXdH1MKL;=c*m?b-7N)$UMlc6C;1w8c2@X6hQAL@1=#YtO#+YXuclPKv9A;`|F#9*sco} zxQ1Alo#e{TmSzFBg^aIVZ}8LN9-SL~hr~KX=tW{9x7Ds~fcZ)wRJgIWge#n=@~2W5 z0Is{YjvG+2)!@4@_={S*(^wt3XmyrCs;YNEB1RyQ0V+?H`-+kgfIl`;p;cR&GD=-# z7^U-TcGb6f-3e8LX(>}}*)*P;M%ugG+ji~d&7tEDACOZ`@jNz3kXdXrsNo|a#yrc* z2zGGK^D8L9`BVjiC#6=zFf2#AA{}mjJM7i1>U8o-Y6e+i+z!H zhEmG8+`7?xAn+QwkZ4{z)uQ{%bvwJmFD09woq6GRvq!dRB=~U zlUKJgYgV^$=UONK01vTBtP`?rTU-0O?6kitwbzsRw0z>z>M@c{{6RnkQYE&Hfgt?5 zt_*-OhGVR=K;opMu(r!wciXIk}b4~NMer9s7r@o zAq1l#-Wgp{h>n-`ewr?ARoiYUYL(Twn|j?XzT}Bj)LZ6oO8Qx=>uak!KD}PHM-bl& zJX3B(#QJ`j9AQzKT~owb2AKp!_W&lA{{UOFjW&UX$tbFXXPlj{3iunrdX}g5PZs=B z(liAng4uXm!Tu-skAHJ2VMH-aqrq#SEOSaDwrj8WNhgX2m1gqVG|6+`d6`1T5H`)#dA9VKY5t0bm(o1f<|MSP>f2Vf&h5$yl3!oS&JV7PvR~LKI_jCX|XrR zpcJ<{#L*O10TdYG0TdDzMhYe1Eql0Wy7rqr9ir4?+gs}!Zmje*r;Mk}tdx@P7S-F2 zWo>jx^B-Pl-T?S%;Y~DZaCm3oW}kN*nq91a6}&~^O@CIH;uu;s(B<(=wzkhRw3hM*{7DQh> z+)hfek2u@r;XVbL)57`(vdSA=emuGuk z+iiW{MO@mCyJ#fUlWD4PdurmXs(N3ouJ=Bj);wwZKI+=`ioP!RcjDg=_+gsiHJ=lB zQ%U%9@c#f=u(FqNxSvPxe}a=r(|koV7Z&#H6I$_Bn$g=N>1#LdB!*A0z83rx{{Vt! z{6y0>FN$=pKI%ks0^V!>BGddTv=P|4vs@cgst2c`g8<`D2~EeW1Yhymk4Uj z+urNRZ3eRyo$5xREX~%PV-ylR(!{M4a_M$jWx}+M5ngw=D1=61hatfAsb!K@ajES6 z+c+pDr0lJCCCwFQcPRVaY6${85?N3d@NaOK%rxuudacqPV(iYkA`l!X7^_PWx^B zms{b#f}gVz-2IKeXAgv0F^OLBBEInMvEobnqS8qXzMO}}mp4<&e9N0`&gMw2?cN)d zxwbOfwBHPTHT|DFXQS!!X&yiL*RI*$?p3z%{{V+PL*p%QmWlwjT1~B__BwT`y|iN_ zPbAl~MEkv}rys*zE5x4_HJS95)8x{8OXEY}4PM;a>K2l| zq`H5^eMdvJw$q_7yb@em`Pa6>`U{Jn?Fbsq#`Dg`N-&G&=1LY`(N>)}HE6D7DatTv zI^CrEE9`$>cypQXo;Nbe@KWLIz7oXB(xp5W4y9PlrD&*8!nw&`X5HG=#_alX%iw41 z&}N1S{{UxSgj%)EqIYT@U&8$w!)3H-vQMzVXJ=~qWV1rUb68wPE#kB@CCqw+mlMC` zACLb4V*PVZ_^I)4OOM4~9`Hwld>!M9eILVmT#?@Riu&KfzA4hI{Bz-lD$ga@u(I&J zxue>?p{(jpsLy=qVapG%mj4|>@2$9TS5Fv=l)}BQ_ zhkhSeCDpU|{{Y0=yuw2qOQZO1#z>_Hd5Ie7waba%c^pI|v`YY(bt@``FJ7wO2mb(T zxP{b_{>t)My|W_CXucPRUDaWC4zYcoM|c}6Z#yXft{=>AvYiEvdFNn!Y2rdd*OscN+;<}Nj4rB3NQMNB$v zCwp2+d8VRzufrb&=+St~!t1a6IM+Y3raFz|zl~*@L30!uJ@xIq#2R5+CA+utZSBmF z%ck7Lwof_!(Gsw4tt8f3MUzU=(#ONvGN$2WXQ!^2X)I7k(?o$F5l6mR9n480ADxsK z<1yiWCHPINc%I|L8Xmi)>wY`btOVMWSNE5m3e>DLyODFH-do6Sb*G-@HjSm8D8yHj zBFfJjh@M@_zfwVWel8w+^j1$Xk#TbXnVsa7H!L>H`%+AK%tLO=6?w1#ZmKv6l3dPj zn@&%8+wAmh-_iA5Pq^^sFUhfVeZ4vTUJ$MCQ}z_pr^`;7Y1O2YQI}3-Cwr^wch@Y; zSC(Q(0{{|B0lAp5Co7YMEO%v`lauBn#I3Z9fTRN0J$I482Z9j&+=bv|l_Uh`*5Ihd zbIAmjVUT%KfJsx!Fu?$B$j=10To4KMKY6lPfw%?63b<}UkgP_`90F^9sn3;LwY6_u z7VBiKcdB>o+xAFS!O)6|gjAK1_6>dhkT}R0Q@jN@0h_smEV1 zYHQismg>n`?(Q$j-SoQjF2Sfiopze8m{J?)_W3f1R!ra$VJje!e4`m*wcdwUBzTSa*z-z27WNnIJ{nnn^c zH@JDl-M4HJl5hhu?F5mQU4}rUjoAP)fTV5Op{r&=F)}-tTWC}fBLYs{k~0mAtj8*> z?!i_^l_Myv38#aM-#;qmX+_FW=CpKnvbV2J`?JN)FxV{KkFl*9ws(|ePOPc8RFqe| zwQ;-AB_#V;_;P=PUlQWpM~7|a5yn^ud{3da)cKFfuYDUZK3Qc7M0@zK&gYzg0UU@eK15YJeC_~Op(pg!TEHdE$4$8YWZ8;dqCMzk6mF*o`wwwGd z>g4`SB=ysC^4w>KIemFbOB;%Ua!sbGPV3!vyP}@0H2&+SbKu4BN5qsZ70-mVd0=7$ zjE3mt9Do$ZWevT)M1_F{UotdzIhpr^M)TpuwQAe#`~l*LuHSY`+};7AuBFh z%)^_Mkj4fa1eBfIOEhKK5n~QX3>qSOY87`jg_Q!R7~f^{uE5%_CNXD{#~O>Bf9onzvq)vPbIWXn3)Y0%iGt<8IDi_D@m7BW>b+TnB**ZytkPpDYr+2fIr07(%V~@DG@&CA4uD1;8cB#~Ox3+c;SRjr*kXo>Fci%#p#3S)j6%C*4Mt zI0BXjDhAXF#fZxo-bq*?n9iGKhlaLI81qZoR8CfQv}3EbkKIr2diQMbGfouB=+UX{ zr8r4O_x5;r*`%G?r$Q_9eQ$mL05$b(Pg-qiO+Uw)y_0IXlPq@@H;<_4`e%lPp(fw^ zLeovrqLsXekefR#6|Pe5GLptGp5ax!_QT**m;M8X#?}q4{?OW7e`P^q@XJ_-!rC{7 zZ?BPJgGkr3Xf$m@$M1P}F@_^{`W}I7keFrEuPxxs++9cQ1EA>sAn??BzO8+8dvW1( z^0e;{EY{YR>20iEY4($~j~M3b?JRptfMCxC2xt{ zyYjm<)tldSWSdFaH$R%VvjLglaWx}{uTE6kjN>^{jJfIa$K!3zaD5e>uc}W(zKi&I z<6j6awR_>6C*ZGuJO|<(As_Ac9z54>HBEZumf_S|MgIT^p)%WQP=<*ZSWj;}aqqkm z6+>*_OzAq`h_&4|;@%q=G`|noyp}I*;rZpew7YwGR(V!ytB*3_t)X%r);DjnJ4YSB z5C(W=_}uvCz~36BpG)}BEw6+8W>hYL;;UUM%Gbj4-8H?ua3;U1>9K!mT3Wo3Z+4z7 zS4)9syPnoPKI%aO`2f|m?H5&-PIZlS3lbyKwLc7NQrkgxkrKjtZE^>ZZtbIsZNwjG zidiR(L_4jdDG}$l z8CjHW%N{OfVn#}BR69r^!nf|nz!Cgj_@NIY;xC9L!m1N-r)alMGB8zTlGa%t04WS{ zoCo{hIk4Xu{wv4`Pl%e@D9Juvjp5iECpiGeW(W#M+qYrtFaiqiTuFe8ZOKwj-4!Kg zr+TTh`X-gM(Okx^4;fbWj1p?sl%$>g-injab+h^Pe}BOKYk?f|+`cpA+1T6(c~)RT zBw^TuBRE9_FlJ^0b8khYYxfEQ_*=v`P`2QvSl>@salK0Ump7J0u*y)za;>rVC+>>J z`I|SzFNznLHy;x`V!?|5u-(O{1G_BPHj%*jB&lMjI4h7shCJ=}h&)ApBsbnJ@s;a1 zbv}2AFXUFvepXX>!)ubEmC%q0Ic$VpRm7M{X$lfr=%vb?m6CRhq^_5JS>x2<`i@-g zv*&M`TDxh>qHmSyui0Ob`lJ1lEn;myRM4zr(e4iGzXo{CblrQya!VlwOUrw6bq&^? za?QEpytTd4?xB#PEbaTJJ`dx++5Z6H_2Nmad@u2>uY~ou+Q`w`_=5g>u__yA?#!WQe}gW*!F4~KsA@XR^~ed0Qs&h!E- zvaOuas~2h!b4^NCCUuH34m)vXqq zQ+I7aqONAw+Z$~I#U4G;VX;evVdh*| zUMpKUS$@qttfBrYw-RaBOM9iY^^L+3BEQqGuXKCpORtpf9vLs)3#r4Pxs4r5CgzQa zES%roOZJUw?fgm^OnY?~kX@;5!AoD-OfMams7WN1PT|G|8_AY7T+UlN%iN5m%A2*l z=~~u(Ae?W!cekNN80M_wcG~9Vgd)=SQj8b8)4KSa;QaST=~bVJG^dsum@oW2rztU` zwEqAQv`C`d5)6T9wKws)2JIjkq8M+JHTzv&*%x2Kh+F zc9SPH6Is}|?uL5oNj2pCpneKOn5E@pQ`V*k*sJ_akGNG?$ze(^wFrj9lJYk z-5;g*zqALz7jpCbdhreXgl>6Nqum^@F+zI>5<$i9oK3O=jw`Kz*3uMULQFv#E z0f5WrY3M)=%QV8`U>N@ZWY{p;PF?NgMr zyl%bOLG*UtrO|})&uH9|p7wl`wYIm#8n3TOYps_8x&o@u220EA1$QCsV}c(--Tw)bD?@z~Dfu~)pbu+wJ_5Vj;3984_n zNYgzx&?~uESEPh-&`i|yvx5Fk`yipd5kQ^>}b~W%Eejl zmrBd?1u7#zx!MpNq}QJFS*og|lIL>wTwLKL6=sr@XUyZelfsf1%Fn|%sBPOI5vLCyC7v>91U^={m-WL587K!)MFcd7FkDf zj2byFJV~zKL%6m}7^05CZGZ*B`L8dSrN|40cyE7czaDCufA&;bZ-lh%J&-B1Zw*=M zJIOou`TF$wrRq%OKxqg&knLc(1pL%)E?jMsS-F*o!9l0m!U-k88QBw_Kx2Y(GlUr| zK@5Zicj-1iFqpr4J zbGd`S!mE7nPgK^Ii(c-EHi~;a_g&AaJU#nO_@l#CuWdiWZ-v_0H}5>{Ps0~6+;7<$ zh8G%Mr(nTVqTD0Gsga~)WZc!<=zq5ix+BUizh`fRR|z)%0F`wQA8GI-Nf}lvWOdt} zAc9#4M$>*#8U!i3b9_eDXx~5fd@ukv78moDQ@Mi{Re>|OjP3wuIXV02*&w&TFLgR+ zh6-+{jH;rMmXc*SJaQw+Cus!$%7%H0R<&xXJgVyLH}Kjm+BZ$4mG7d~`dhAsRT=y7 zp&2!@bkg6IY0ViwM4rm&YJFSdKiWIPeloC{ANWun6451;hoz~}4bEw)^=5uYWV%p|XgSP(a(%K$`a+;A!DumXF zSwSSzYW7yM>8+FLvF~>O03Q5EVN`z)cy>iNkQ-fY_81+Cu4XpPJb??cmk7a(d2zqy z^My0~SfJX%D~44`6@KFjaKT5)0mlCT1vc#_Nz&kum1ZxQ z6`lDE8BzeC794V*Wc=BE#jU5NdC}qli5W|_KX-5#04o8=Rv?172k!22M?b{Q%lEd^ zWf#^fPufFST6ni2$n6*^ z_K~>^p_oe350z2knIw`qd~tN>@~pNpu*f4V@)48(0LV`tFk)A304H*coA6p=Ya0lc z8v!ph+7b7k??|Ya%Z!ndLXKN_A}5&QDstbR(Y2JKuY0AZ?(}cU*IT1lWEkp_ilv6C zpSq&mIXm-8F3#zu(|T^V-(%D+d|cYi-O-Q2o*h9o>~p~ObJ^+U1cKZ}1R;#pnnvMA`jf){0HYU*JVlDj@s;xG7#tN!*m|_Wbmw9Eeh8^m?LkN*G=G)rAm$5+>L+)8{W zrp}2zoACC|(J!9P)aXzpgZP^HqiehG60V^HH!Y&*`b;agd2<6?J)9UCZL_MNV!(!C zC0)`GC3w-xDuQ1M03e|XFYA6c);vXbb9;YrCEfMR%_OtUFlKg_5=`wPfgV`wBq-x6 zyA8R=EQJdPP!4crVtF|`VUkClNT80{wtNdx9!8z&g2eYNK+6j8G_Z~;(v2|jfSzbIlDu2hYzp!0$l(-Xo- zk8cNYPy=wd!eA}{&wP>d3<64%Tb5TgnrIHuhGGT)LQA^7(8K^p;G+P@%5Yc$+l_Te z>fP0(z58`{jh>gatd^fG+4|K=HPl;!n{8e(d${RqJFR>6df6v+ucvr!?@}sn{{VKU zEK@s~LWE<12t-B-#SZBZtAmf6WcIOmUq-Nv9^ybq5BJ^5yQTre5kCS(Im574W^53_ zMRC(>_m{33GEz0dsspsErro?SBoYvo7~r_OPj%2Sg|4NeU`}`79Z6u!mM+{{SI8 zFbdsQ3&Vd9hLLVzxU-IVgj*w!JM|-J5~xzde8J3vVJuEt8<@wdc>4bFi$evxF%rQe z8#gKy&eMp)5UaZ_Bk_~MtFl);IASl!E@a%acCw1JT3c$8dRZ^P{I@a4aafFFr10=i zZCa$Hq^diuZM=H-ewrO%dn79y>l}t$y71DFVIT(Ewf8J}P@ZEIT;|_q2^&^7?K4Gb zWp>c5zS!dy@-`J*mIxyj<+rn=pjd;uu|8tDuod&xyW>4V(@nUV!XGkAC|#5k+vYoP zv6CW5p;?IDL^B>Uv*#?oojj$zfmIG3Ij&?ynm1nqR#Ccfe)XN#T{X6?sM^=JmAapkc$1#wo*!UVD>tJW-tD7G zlqt%idPSt9l2W$UX*=nzr|vbZ%F0k`4)I60%_~W8g55x7kjp4Ym9|Ibz5!KDtji)c z-!3Ds={vSt&hepTNj0svS8=fgBXen|vapp{Hpu6b%!EqYkqSqZ{0I1H{{RIV__^@< z#>2wCFVM7)+6O?foeYrppIDp1K0boZIY^Gwc>c#r)nL}8Nmd~Qo+M@FMfw4)l1`d%*R{cY2iO^~G5I+T+XEMik6;fCO{i3~QVs?s=& zFk>398_P1FlRXTR>C$E$KKdn@hWVBsJxCGAs1U5^x!6?~bYHoQVK;*Ahw=Jv_$r^l zyJe2w!oLGPE^1F4R|0p|d{f}90aiwl9tI;%{{V!e5XmCQvapf|h@!-@U9%Nl636}u zZ+>+RZhN2E=KRHdd1G;<2tFlQ+}%TIXJBn)iuIepa4f9TK$FKTQf)>vg=ox=6LLp~ zaTK3Bgp;z8O6fggbneyn?)qQ3*H^_K59-uw`+9>~D5%q~C|}*)P{X*{@1y9KM9{{XYavrcz9-S~^gklR35NBh>29XG?b7c=Z)+u~W{ zb@I?F#`2lq`R~X70Jrz;L-7s?EMxIbk?^BWnaaE$4lS=NuV#r>WiU#Zf{x5iUf^t#JUNUidQ=vwz z6Zm(jUNoU@?M=3}Pi6fH_~+txhr9u7CGlpXWu?r@9xE%ILJM2jQG&Alp3ww%Qz<2w zx~uL50+x^x-y-WDw3eCTD~W!=;(rg?>8T?k`BqnQIaEeTQ_Q`xk8Fh{#J39Wku#_e zg(~Cu>y~qUsL82#gIUxyO-@&NrqplsOTAxIpMKdyliW)c{H}$bIsC~TS%SNtF`NhW zT`%HSjI^70Q$_Lji7aj7wl?VwpW+v3Ah%86`B8X=8-Z*$zV%xaf>2dSm4-aM;gVI8 zQj}tq(|6{IN%HF5q~4m{rPobvXP12;cs~s1$(K~T6_lY;h9ab#d0OSAQBj38-`||N z>tptQKZ!mXg6h_P6zb4V;cLt2?e%GODerWhKF>|LD-_qahfmXPHCu?$uvK9RbmC!g zXsRPyX@3&!e0lKu$NvBnzA^ky`0?>C#$FZpyW^c_LGfq8L*S1I$K&q+*mze)OOFao zr+ie=Bvr@IwH6IIUS{93C7}T4@mS5R2_?uMItfjfRv(zy>Nv~@@BMjQEz2mK_+%`_Be^GVu3? z^h^0ec%MU(_g2%H1GCfAjX|wo}>e5D(+TPe$UB`2G2j#8Ljl5}ZV|8Jn z_&>uQ9JaW;hFEotJ{WIxI~zz|=~GIzy1cr(iVFu0BJ$+5H-Rl7V|3EVaMJr1?FIWN zd}sI$z8lnjBWPM2mL4v-)^z^>4)~|T9w*XHg7-H9Uwwl)# zTFs`9aM9{Z<*nkuD_eZvd?uEr)rIE0q>HGhmfp(qO}3TpBDA>sCET|65jsF2itqOd zzFB5tCgULtYtf}CJ2=fs`zX|lOO-`l`p25<-bzbl*GK%H#(Bnln9B_FT27OrPSCvv zO}NcM@|8-8a^{k~lqVP@?HI-LUsU*q;*HQgXNfH%Rs)GHv{XAr<_bh`{m@+SM(ku9 zoHEEi;bP7U$>J?8Lc=7qw(Lnef#6#x!*Br~Dd3D_BD!cWkH3GY3=j_3ZB!9}M+#SQ z3_#~3k&}RT6m0`f#^%1%Gq{39qz!}6V{?oQZ3KE8D-Z_iof_?5o};^8^8Lkc9n@^C z+va|HlhMsNZK{&jYj1n&^7Ik!{Ci<4EV`zZA{GV0!xXXn+_`nKgt~#)w94gx47~B_ zQC)c!@kuS(J;b2{y0zNITL;XLKoU%4SdN>XDO6f_iU9!AceSoln@i3Xe04p3bJ1gx{xi?-V z(Jde;f8);wTC*w>9Cx?6wBeP8La=EVgbKeXGArQ%d7u`H&c)&IlW~=9PE?;Ox{B7y z>ziBJ-b<@XQztpAs76iNHc`I2TIx#CTBUn8e!HG8rTj0|t{DFSYw6ZjaS#}ZHM!<4 z%A|lIx3-=}CANU(LKt(<1764BZ6!PqTl*QjsiyfQHr9V@QdyTQCcn42o(FH0gTP=4 zNgxf}rY|(r(c%hhNaXsok-k>0n&__8<*NIW(ceoR#Vyvos%QH~eNuH~U-i1}!A3xX%3m+aNYxY~ zD31jdI8sJ3kwFESAMq!KNgrwlc_W$GgAtZ?n{%8H2gs*)M#(5VHh+nlNo-qqH&~OF z1l@RsDA?t2GO+2vKntEZ8-_`2fD`@}h6u-iRls6Tnc_)gErQq>5UREUj-iWfKi=D2 zw6VDbDLzJPVN<*fO+)~~#xwQf4J;;nn><)ySe`rdoQP{zU# z0^qcA!4mD;v;tL-HV9A$-oW`XMq1;`cElFbL$UclTe!rVLi4nQci6xI(+z^T!x3LR zzr@+pao{Mo1;Y7y^}#!GzS}HM7yUf1SG@LrT&q zBxx;y^ET;Ft_%Fg!DI>0{J}^gXuIi=xgV7 z_?tYvJO?P;N~u02zd^_?w0`9PT!7!gF}c27*%8a}7Vbg{_#M@EV4wI%^+^FL2-rel znC&BX%v_M!T$T%e+W2{CceaYvlKVRAO=)M*?);Bu51ermT(HGdr%uUfINHyZTJ~C6 z+uvL2d(HNvZ32kXNW8N^Rg9K;l01QlsiJ`Xm;Q*m)>RO+}W*~eWPZrfTn()~B| zeMjPtj5U^Y)pZ%QDCG!dTWv>ZlW0;Hz$65&#PZNdIe3E+8;~(vllX%{M>5>$x2-b+ zBfOHx15Deu~df4PW3ro|z%M@E)ykcagd0)jUGcuH<);0VI0- zXL3l*u@)r-Ky_q!BxmL?d|U8^FH2keF&;pX)G^m}i)5({^3c=)BKQH{xvLGoenVZPnfi%Ds>TQ1K>-ELGmot?{>rSRUYjER;107#ZUmuoIIsm2GRE_0lf+Be3UwY>6( z?tD9|c{~p>Z!Tj23jER*Dy8-TyBi#_;YyQQX{hPf1J923`9LHvXr%kV9r^NPk2{FY zJ1GE`KQNN(RMMn{VvA9^Sptpwpt?}Y$RUG8AuF8W&g0b>9&jnerL1-9?%!p7w9)!? zTk5!{IZ5+7-C4hOH+n7o-CgwQ`4P|KWGv!O9e9mE1~6vQS~Iao3ZW7R_y8`@Hufa$ z4AlYgMw2m7H^eP$u)-{FrChp|0IGmgGN`}`+pq%f>H!A7+H_O*uOIkZ0>}fLoPt|# zVYu)cgOEmQ#Cng0;Vc^Dusewjr9m!1A#kqHG04U@1`MF&;DbdfX*A2+;V+iF;eKYCBzPflkm^s-H~{W`ACuECo`h=M#vINFHI{{Rx(0g_KAWx?F4%1Kr! zwSyC$7}c1y9W-HL*Kgd1&JqnG2(k0!m|EM#CJAh)W4IguI2gi9?}nw0{VDkXpDxbp zmn0Trw&Ku`GH^bJEZuai?>-i@9r{+Ml6oXpUQqZ+&$pn@7;+VI|Zz3|Rs5CY7XS z2Zkydc$hCE?tz@QUWT;#Z-i}tU62MW$_Y!BlK{8?Fu9Qd0FRWYAPn+Lt#I1bwWV21 zPM6>vCrbojXP;d0Cbu!(K}j~f{iUMieq~3q3-c&-b-`@tyldhJhx#{(KeEZ`3?3EG zWwu-w+M+>dCIEwgU0IGsOBGhHHnu8-ME?MGru9zIi~e4-PEwT~c%0ke<+Bj>3TOYqFO`$QUwGKRrL zw_U0RKIkmWyGBVd798{-lf~HhuI|rlcb2xY^xRFq+GXcv>31iVs$8hTf)xWFyjyYJ z9}p~50=jrtUO;P77w&|_ZGmSrtd_^`Ht|EX80AbUtmm5!9n@I^AuTXG4Twrai-FWJg(^R=rT4|@myFER7 z>rSpF_EVg6R`=bnr)PaFwVU4kZ#~8IT^Cl98Qrn;?VN&G@TIV$1chvnah<@HHKNyE z)a^}9*!r0)naDV70?ls0epcE*Aa23QBXvUFEAbJ?I@2c@A#E&T;ftJtmSZQDV}cLA z85!4F*12-W&DNxqM^Iw5!5z1L#d#i+3B}=`CqP~8CAX9>NjoF zr1bY}uV;OF+fJKn*jo6LQMO!(?Qr-xHjulOZb4Ea3Oe8g0~{O-f@51qHRtnguaY?w ze7kUp4npxG*07e)22RS zjmyANLE0TjAnxi;0V5fs+r{4PTFE7SU9D!_-L~1j+Z~j#4k|H|b4vG%n|4}W&P!#h z^1hb7o#n@ct|J(eSB_;E1!D4IQUNCbdBuqZS067>2*v?iDRg^SvF5ze6*$XJ@~Khs z91MjZ9I$NXAaG7b7Hu+otI1rBNP9U`J$8~pmCgVp5ObVzbA|o*BV@VG0_H`G@<}Ia zIRs+cY7tLkxvqz*tcCCsp+r6mc9KQ?r6&$n&nm7 z0|N^nZgN044xp2UZP?@%$>%jhyg-ly!~zaOxap2%|;0$wFdqmxqyIu2a{o8G4rQ1V0NwI9 zDjO?-^BfX#wONGg))gFe`4=jB9D$LX0(OE=V0p}5W2wnRQagE!NWeK@4h9ZJFb6os zYe>pX*;#6=(r;I5x25`7YyN2@*H@*!%2s+iU3E!xeydh$4-m!yAJ{geZQ+Z~2x15g zfB?rM3UD&Ji7ZPRvui0aA#__vP^cT0Tc%--Hz*9F8%W@Sa=8Ev!n59K$;aCd8&Ast z?URyr@r>sq>9m|up^=6f>TZJ|r~u>~XDh+><8VKo$+xzTPKj^T@7?UY`mx`pj@op- z%Uu$CzPejiukW3j;;3=@?Y;B^ER(^j?B)``6ptoCj8)3x5O zq`%Fi_kV@fo$d2aTSNf^00EAijDwyDAYf#Y21gm(J%FdU{`XvP4tWG{PXmAf1wh9p ztc3u}Ks3Kla&wN^-Rd|P_dIeBz6is%rU1@J13b9k^z;V=9D=>b7$X&vrqz?azIVO( zZ+Gi$bl1qs@V|F{iR*8}Ps>VyNI4@o?YLlL^6$?FC%$RLPDjcBBRz1(cgjfVpMIG= z262l!S2-YLpPTP71a!$KJmh1h4lqY%lmK9i4?uhM&m?~d!31F7`%?BTT3x$#(cgBu zf55fwudnse-go~1FD(eeG;RtKImSW2Ad$Bx?)A?kb~(uv(AfBb;@=2L>^~_I7GZ_~ z80~Gqu~rH=Bmx%z3dIqF$-p2G#1Vox10x%UAOp}2{9p+IiFgAe1Sr8Q7~qg_NjN#i z;1u8$$j&qNjcI1Jv;P1+)~&brEy_~2f4 z6N7?ASdvR&7c4M*m5G>qryLRqI00}53Ft!x2N)Q};>6;#ay&{%b~zo-QVxD_Hm=>n zBb~rx43Gn8SNU;B;<-J%$H44aXyZ zdO7rBtCeMbjq)(15f;TR3H*z^3jO1hR4IxkP=M2`lt%d9`(->!t4c z?S78P3foBM804H}bnEB`Zn((62OW*A#~H~O$;jvd>N=1xPi*~a&c)}0*C6s3o}2|B za!Efa`FJFB6xKn`SA)s>!wb%M&rWfU4sn5jk#szb0f(U&`Lm23g!9_~_UYR{n0teBzzR>PK9jy-!Tw40I=tZZJWnk6yX-up*=HzLC!cl(h<}S=a0juBN@TT1OdUuNzE@ENCTgCLH0+t2}?2=wV%;1Ucr%65|E-J+ai zjtfYHoSp`9Hi9@Nplge@Za&VKI3;xz45I`1M5HzWB(Bm}06EJA^pkpS`}OSJmhH3O zefK%-gshsmq1-kw(Tlc-;zAMrHSSB(7DQ+?on-T;sk=hFZTfs()5T8v=hS=5&q z>uEM{dW?*Wa5It=@CeUePy1c@#yml37s?2a?GX`@GF0VM2OF?SRvG>x31aU%P$whA zwqP7*{UXbDaNjB3N#KK=kO0dbwE3j2)04A*%kY|kU<};FU$UK4oI3t8UEY$x1=r?e1cnznP!S^LO833G& z5;+((>VI#!9eh)2ydI5ZjPk@`SAuduJoAImau@qThWUFfcf414^-=GCTW!(#pZq5Ju0P~3Twvrrmcx_D18V00 z^Ul-LIL{IUCN-JJCV5y==l0m13idQsGF2?Y42(4D7;`w1kI&sf*9 z6Wg~V97+A5HyQC3lOWDmJ+_@8AcoIXIVW+z7$9@o0E=l`n@g+Pn@ihfrPpnL1WcnA ztfH^J$*nEr)2-XfzLrH0B=V%#q+sMIEHz)@fAwa`rh|X|o)u+VmV#5I0 zqHQFD8%zMe2$Z(rmtW48NsDH^6lBm_I7=A zw%%G@JDw?jbq(CcRYr_A%)p`{%#FJMA!J|)BX&kdCj=UZ5jN|wUm)-xdhu>%W@s(9K| z^arT`aB+g97V#@mmphV+e)iUFbbr#awYnaaIi!{Dm6q<;(O%6ZZEe}VnV34B2dU@@ z?l3qQz~^w!0~tIPGD#%oxj4=%HD1-etLWZgbo1KWf0_28~} z;En?U=noWi&J+%#sQ};}nf4evbJTYjDU*|&j=eLEa1W+>j0NNa&ILcOT;%TOabN~c z4*-LM)ba`79B^8%eHzvD+WIZ@cl1lH`e>c4>9v!x?C)<)p0?Ye8sR&1;Ezml3CLWZ zyVP;e9)4%}jDB1IF^)T66Ze28-z5CFBpmQvjl^-0!5|aH2_qbyxj8>5IO;(awPmM^ zjiYOj!BiCtPERB*(A!SXNKmIB9A_CFH0j>W+WI|uFZ0vM{%0iRX5H+%biT``_vz$d zh{F&SNyr1gJ@7CFa0%!a80S1^q0_uOd3?*ZEN&zRJC6!T7z(b;a@ijv9jZr66X+T@ zgzeOc*UHPg+e=+v%W4`&!&^%-w;HXy z*X+2HYE1-CfXkH(3j%Tquu{m(yp>Ql4_ne~^=Q;v=(gH^l>r4r^I4M+KnNttun|7f zmfDFUum|rc3_NfC7B;DDttN$FwO3vuy?v55VTq%~~PnDHG#kLow z8)}ZXPK!>kMO_m`w}hR;?Gr=gp^WY11{KZrGd4ER3T?)+=wYh6BPLnK;NtP)=8 z6R}{}ipoZv$jB?^n^m=lf6q1EvHBlcgdpX06uEBOyq3-T(zWls)4KbQ3RoG|l7t}S z+pmKlp+F7;K<&)S}=sOnb|U21xr=C^q! zOL>yaP-B8k#m4z%*a^Zc8#wuQ24$}!6Pv|dQ?!>^D{{YwTiv-nmyPYF{d;I|)TJdl zzV4~=HF;jpO*`E|Z@r$$y-%!sZ~IkiGnurnhE@@1c5U*d`r5+x>SI+;F(jEM!7si+ zFi2iDV9Ia;*U4J0r>JT=jmD?qOY7ZFP`YnA=4*?|ZZ6(Js-dU3Wx0{Cp<`5OB6M5@ zG3*FyH=Qed;yX1VQ))3F1`HIE8QAi?s3@SED*&YgYG8r?0CHOCzG6zDP}~uZ-YXKs z5(@&j+E@i7sPQV|>eg=ZlS$jjyGHg~yZN_mb+Sj(;IisCRHF(}i)kmN=k|Unt42P2 ztJc>Xj*duG0g9i!836p>e{oP0E(gjRYQ8w!3kN)Msa$LWIU(av4lr2=QcRdFoMR2h zA&9`0JiFrk45a+gvR=R4O2w1I5x6i27RsGx;nv4moyAoK^0xm>dV2xd9w z-ooWhNlsRZvV5;r(zce{ZTGg8cGTysi&0K7x_0=jt+d+BxnHHyyKm6rG_M535m&fo zEW2B1P~8Dy4(198IT=!}0Bo;2M|Bi&*e8_=4Wo=AjJO1H<(F|R2ml7iU=OBTA)a-@ zZsUW1Gryd6+04xrRwOTztT$Kmdj#f;r%T zIOKIN5^C27KFu7-3*&fCDP)mL62o+|xj@8>D#m!p$plrrbvjDX)h*m@rJk2p*F^eV ztM95dr-zi9zKOK&B+_ZyXKU@Rin`S`4Oz=I#mlC5d2w6j72|Hu0Rce5scwMhk-KwZ+w0R?C?D{QB#pHE z(p)1jbC4O_Kp2sn?N(4o&U4LJJ}1_uaxMHhV+xUhnWd3}kDLR&utM!)otPN}@IW4I zd}FV9I+smf*~L$-p1<&P-=?R13^XanNJTsEc(>DCR-b+Jwz`simUqV6N%%SWq5$U` zi6bNsGuJA^9S(9NO+QgD#3~LK3g$Iof-rWLVhA7tzz|3vV+sofzv4L=T00vsLV^KF ze)8jY5)h$?$U9VEV4=atfA+_X3Cv?lPrKAY7;%gM<;SSTRAoTgSb})fC^vpt-%X zRiy1}CF>vWtNB{jdp&fSP0G)IHG zfhfd=P_cqC!AV6VlibX)Np!HPk0{D_JSujojjVGk7ElM=@|X>TC~=iOQr8;1k}bW* zh}l#C+o30E17v|!qXZIoAQ=e+VU)2dEuZZ9Lfc+=msXU9$wqnPiHIPm&dC>^FaW?H zj4N_2;_sqTUb2e!moA#O->=Ho9A=Vk`d;m8cP%fXT6SH0*GbHf#<&+KKvhyt%p06^ z1FuFPo-xL7Di^wpANcr$bAm}=4h9AQ&&!Sp$2iFcHF_&86#oFrOOm-zGIGa1#7iMO zbjiWV$=#4@?0Qay_`_Zva22G4sZt0Fox8@<-z(go;l_4y)yZA-ZC&lXy8gWxq;YXt zC-}90h4prJ>aBhEvM?I)TduKcI*cWgk~m@kV1Q(dXPk5y<24H~eg>}t1M=kBB4;`2 z=131cdJO&sy5!Qd0CD}942Nq1(qB$)VGDcejoT+EC3{C>@5AMpuc{$_*$IHm$Ab<%3V0tOC(GOUm9CD)C zES!^(#Ai4l9ORPN0f-=&&5ntpf3R*R`4D!Dnx2PH<~*n$8UJm$S4>>4mUXj(C1zb;JK&f+t*WK|&Wyn?402j<9d zi$zcm{3E(HaljDHa!EKDXJB|M!)_z94sv~3S4m3GzrSsh*+03f{wEjK`rR)p&-|a_ z&p1ovGXga$Hu*tPVT6-_PE;8beebwII6Fp2;{g{#msojD(037_p5rPj{R`NKc^CQr7INUz) z(8M=^w~e8A%76g`0CBaKlUq^3ILs66OdsOGYm2H(J@q#Nayu<-?;GTr>h9LQZW8wN4A%Af&;F0-n!Ed}kZyM@66OtgfYmd`J4jO~yz+qgKvAOTiC z;V1EuFP1z)>lh3ID7TCa!vyU}kw;d~&A1RqU`Pknr(2OL>h!hJT0UF1tJkfcpL4Dm ztfOY;`J--GLNbfe+Bthvo!^pMt60~cRMqA&rMH1K^>Y~tQp$bE(+1AecZrc0Y&>A+ zIM2+c<NeyyEWb#9D(BapMhX zbC30Ugv6Wyx8w~FP(DB~#062*kzB>rgL5>vo5uRf42&ev-N>f{2j^Rc8@FQ|;O-%a zIL>u(l5Wvc<@+tvioN-5rR~?f+Ok{e+_5*r0~a% zVp3%A__hF-adE2X*72O>Um3ZG-~oa2ft|-4Gnp@kd|4qPT{_gA#xk$s9SKx&z+gS* z;0XmwmI_7yAYh&c{t#GY!EI7jz{%WDkT~hSMF0?Y067iL=GrqV_zvDOGpV_3;BEUk z85{semmnN~Mliz|3gpr#gd5Z!5!^xo@V{VL1`4kM)^Ilx2GUm< zI1R=t&@{_CO)}iT`py2Tj!LvMO$fE}h-8;Gl9^WytOEk2cA?xP&e6?Q8d}j!Ca$&K z*U?F>wc7qhN}`lfNiF@?DA`|?-6WHW>!+57hDWHh5{aO>Xq;^$W5gs<7!?Y4D=|g` zBoV;gROExT503T7ltPztswl`yc_i~f#sLW@nITUv)sb)s%MdozPaAl8!^1kdT0wC% zklfna-A3_UL33`aF6A(_&AV)OkEucf;nX~9ln=u^JD)1^6(LD3NJa)QHvFT2+zv3K zB$L>A6{R>y+1aL>Y1>E2_HA3Ye?@SNBP6dK{T}?in{UZn^c$~;I+fn-n&seTPngFN z{L7vAJJdE*um`V2UzI|Un!YvGz#=VoQNaL!xK$1F3=kC+NG<@`f?1iBv%0v%j?oT& z$MXP2JlR6y=D^#4P6MboE1YB%BQ;=08-P~L7v%sGEW~Z;kiRhBv~YtNAY*6&E0tHN zE#+sWmo&Os&HlHx-+s}h1edy=-6Q1h_P%x4aD5S%QMs38g;ycntmCnv7onX%PIYpu7^JUijwvfZ*xakp_o zM5A~dD#ZJS0r_{bvJgqaj%pb-2(-&lZ(^}R`xj}9ux-T$&nvSQEW_nrn+w!1AT@Fe zC~2gdP-dCB#*q-;KivXCqwbBp1~=}`bDZC{NhI#tR#+VOEQ_vp4TaJ#;-*4DG~ zeKmi3ereqvoIWJAvUyrfq;Vinm`Kt-MmG_F2X^CN1o8k~wVywXwaq}2Jj{x5fJ=Y@ z=NvFxoN>ko;4ogi3BHxc@?eex1A=z$3IOf~IXO^ON$3FDDWPLxe$zbbxr=`7n2eqd zLN0dTj(`K48$U5@frO5)Tb14S*LUZvz9(R66}O*#;y9De%vfCFQq zfyW>KFbK)cHyV%r5$!H-m}%un=wX&w2;&3&WWOl+PgNKg;GPxX(er^fR%t_99-|VYQVCy%EaexkqX2=I6a7UKS#tCvVTLhB8 zl7~ZuzUI0xaKAr??Ns1r0JzI_VbdK?0OuPlPc4&{s_CtKt)rUl*XFjgax1s0{{X;y zEq)z82E5L`KN#phm2Vj8#B{>wvoekw00I-9*d24%lmY-C zGvUDmfyV@{aCa(_eDSAY?B;dnDuL6^?+}`D6z;039|o z&g1fe#%Rh6pOlbJ3BbVSzPB!2)3-$Azm@8gth?W~+dHQSJH6fSZGXGlSAM-0sp?}^ z@T}wn)^)4GMgqxgcV&~FGVc+OZZXzCeOt9@Tk0MkMjJG1yT-@?o5WUe5=l54SQZ&_ zG6)2oGD+jcgf9aXBJ$ZL1Uep9fwer}6OzE%bsh|uGg{?YPFvB_p3EkInJL~02ei7a-8H-(poM+vAYA1?{6 zl14%Q0G4k6Q-hp?$;RA(K&g%@_S3b#7O$uGdi2|E^|<|-X}h=PmYUm5Q}lf|-Jd}V zJxr1tOSu3H^KoiaanZkZ86<8810X0FWtN-D0tTRZp9!>F7G(?h*~kaCY*f z@OZ-QA3hP{WWoOcgq$w`F6rZ9Gte+Z$R}tg1Dq)YE;YyA+5ZxI_$`2*A z9xsrFpT$n)5o$KEfw~|q=XoGj zW_5CcIkN0nnM`XS{n<^WRfj`)=ErJdv6l4@$lt#*j6Almm6A|%jG>DgWF|&jj#{-}JCbhcd(Aau^y>Wk zr`38(P5ZBzw%W9ulIhWUYpdDrta^usz9DFO=v#b^9`|V6vt2T7khUDg8YL|z#Virt zJTshv<=l4j%?x8VkbSZ}%mj}VSU}kcnIIt>46IJ|W_`E{PC)qv>U(>Mf6~xf%8JD< zEu2h;2X5~#_k&o%V&754o(8Cym1WR zfH9N7U1(nsJ{~upXJ*&-aW><5rcE)thBPb-q|zf3wZ3mJERTU0Lcz%NpZHk517+KH zt}Fv+1qFtoIdPIPwAruAC&~cYG92f4R%)>q#XkdE2Ky$jsNDdruFz?^lz0UWRh`wq zR^>}b0__1v0gPjj)4|`GH7UmHnYg&5?4y0#?zP=tYwCJXr&~+&t+Z{)eU!TMZK8^5 z{g%#`h5ju?;uvGL*X^|Fo@Nl+Yd7yIY0^!+5oxQeZyRYhK(Rr7(k-IpWR)Wd;!jDQ z6w}%@)O33dCGH_DZ4zn_-B{{iNF8Ui){&rwI9*tbNg5dthDMMDHS_-fiM5Y{J|b(4 zO5aiOFM@nV$ad;lSBK=)G;K|rJC|9~nrLMuv$W4;vO=s~?d6da9!E*>zN_JQ-pfbT zG;b8>%-df@)S%U1(`8cmHx{Q;w}MSHhHo)EnU@k}9ya71V~oPVE6NQkB-EnsZe3Jj z+`8SQlWxk=cPez{QN>zuYrJJ^d#mHMtgqL;>qfq-j?d1A?F^Qnp(Ay@=9-JOfB+kW z)LEo)%WhcX3>32|Rr5o2%`U^mI!E?qrfpW4g30lA;iE-|!MYapU_qB# zy_r-3FjsOUU`C-g7cG~``Gc+$vm7GP&rAOR&$^oGwf-NTySsL=wK^3buVrVu=2p{{ z^lsggzfE1;-)TR>9|K0`J~!2F*sA6zyftlZN%^v?Ec%>nAzbg>4;P9V?Y_|Cx82kFnUb@7$)AwniYVhBD&QZVAIDxZ zoCcpN7ythZC=1b`TsV;~-f z3RrL9bI8J2`YERsb!)boi_xdAH(RZ(rkxTnh80Rq@@vhvuG%X%wYv3B&7VqL=(aB0 zcuqeteqSFU#)SwL51YkP? z0~Tx+b@|5^3(11~@seJ52Pcigb}^iipaOX(Ck2d%_Za|M%H1%sU14y=w%`qz4tXGk zQb##%Y9pN_?CGav($B0@T2ppQOKYwEWYxk>R#Cd_)Lyo=w_h~6dL!!1E5i=Rf3q}w z2TTjPFmLtCD-FC&g9y9UHYy0iU>8C2vljrXKV74EZ^KtJJRUE*@OPHW04;a%D%(%B zjxtod20bR{P(EhHM@ZTUX*D6o=jYX|5%9JAXzTYc% zFxXm`$p(KF7Zc* zbnl2h61ni+jj34c8im!Q9s|_8V;mOH$E|8HS;ZyqgWywne2^L7wx3J4y1Kg5tZirh zRb{Z#01N$-cGo3VN8hLhVybu~M{OR!a;PyWWdMV;Y~AfYv)7OAehYk9_;K-TNbvjK zYCjCVA^1bZ#>i@~X4;OOXQ-KP^d!8OOw=ILUs$n%?@x~HwELv7H;s6(TuE)^KbMH9 zTM(~BJpCPUfJqi9!YM$w431n0F1x4U&T)zYWmKV;C*6$gx(KJ%exIW z&%n3w+<5-~07;8|yw9xsNWZm1q+M!EqE)!?Zkwd)8f+W1TSI$xN!3v(I>8&uWrrp?Z$a{FDUy}Nn!OXq2!iLCVF3~_xHQ;^lK zPMu1MHc*c;v(>c}(%Q{yX{%dxB;v3Bf@eM^V5?;GXkn;Aa!SsoBAx7)B2uRgYdf`n zdd)`5*{0h*n)s>vRs41Mx1`?qe*XZ)5d19oK|Hg;b>NSMv+6z-(|l60$R?g0bHrlh z{B7g&A%-Npxz}}AbX`VLCrus=scUQV6dz(X5m@OuO_zmyFBFkTV79Y_TxxTnVF#L0 zHn_i$6%@%nsdmu$z{%ySL}98jNUd}Ip?!^CQ)1;j(5qo=KKGRjL0L?3u~$%VrNCBD zh{Vez(z}`O?i%VqStGTJZN0P$^Qm3vtae4ztZ|`{SVksZc72Tuy6ayVVW$B%xCnZRYd16Uztfo8?xB!ItS~A!mR(O*!SfSIj3M5IHylEHi=*Rzj_YB}l;`ilX2ufm!mV*88u`H@{ss@2k0s z#z|fCUiQ(q+C4VxmYTclU;9iFjF3j)7&G~brLe{Dtcu(x&a5`D0RYD2-BxSZVaWST zV}@dm7dUWZ1SS9^5yG~>t%YK&PIKjv18tah1gK^z7#85J6>#ztVgd}S$so@1$2MCH z4&k>+8i@lHVD`$&Sd0zK(K#6^pSxY4@031FVN-PN9TnY|TlVQ~9lceq-sDR$t7T}x zwQJq-zL&O(N4~rMTPv*EOqn{JxM9kY5HMg~R4JI^kxmKuLa=aEfIvj83hI_IlC7=V z#I69qc-W&b!>`K0nX|o_h97$j4bB0owz_0XxM@~u?XkBN+QEq`t-KMESf|cO8&p1U z!cs=IXC-vIHC%^MVu&0F+bNe&s4x(>%Bi(LU<)X8rqfA9Kbq5RHs7OKSzo!yENyAq zn$NSm)xI00ef3XIMp&Cr@au+*c-jWsr*g+)ip3b0F|z&FV#~e8-LB9gkfehI5zV97 zZk8_T7%W|F>9AW9h>g`1K)76vwvgs->Em6AIO=*k^ohBW|W#(@Vb^AJgl7k(sW zJ8}Z7q^L(^IJ!7!!NF!CLnDB87i_Dtp_PW#EwnBIN3}p*$1{$KD^E3Uji-Aq*1n1C zRUAyyi*k4E@BaXIW$iU-X!X9`3&5nE8w@(_D-mM*NKjmCG4I1}Bm_c3yR##_o7ESu zAQT2fD%lw;BN)kJ*8px~9stXhD71jtv;&Yy$wF8&7XQLrGh^Z8Pn&%P596YkSG9 zEWt;WF7Jk$ZFhAovLZ5=?bJy;vLZ=5W@4+|C`E@VOE(}fKnrErnL>ddT&#eCa=-uq z8`>FVlVU8E=*yMZyNAh=#X^9Oj1iLIGs4Q-zWK`&8C9nwq@#4YH*I@v?b%ybzeC8) zTExW!Ln_2NCrSin&+uA*?-iN2!76`6w ztY@>ehCC_=$;X)L6iV_O$6kCar)Fk>Ezy2=44RF!v64#xyqT6Da)p3g0t)UZ#3g>K z%9mFq<9kgjTeo$Q3_88MbLCtyaS)a!D$1fr$#%;+?Z^dEyyL__2!0%RzIJVIz&a(A z;JI793hrGVMRG%Bzq3}#834;W8-|#MWnV1FQUURJyq=|ZE6K`t(Ywc6M@{6_{WR$N zej%RlPB$G=bER4}CgrC*CreAkFMa!WD>v55&#C#<3QAN5wos*r2Z9MI8-mUN>KLj8 zd=OhJ$$LXAdxBc0An)Ajm>og=*=%u;Mstykyx@JEbNej#B6It%5cs7=TWY&$lZL@# zjnZ32!~up97}$&hlGtjoY5OhsA}xykDDhwfDNvE=O_toi?Nx~3m75EmdW9rpSDXH< z;%3$3B(1%lUR7@P*F~+okDJ2yVZ`+&lqgcjea>M5F zKa4O7oS@Rwa9$R`fOK5u^@d|jV$$J_yZLO=*-P-Qgzuvm(-2C-#C~_ol zFsCBiGVz=)>>vd7ISRQ41&9q$ysx+cJfsp-uaKx1V3Ih?4d7vjQcCpgpV7Gg0Ax>w zK#b}>Cc*yzr@I8kNf{d~&IxR<40j(e@GwS_e#xH-0_|(R6AXOL4g4ygZE{$c?S>B^ z0;PbFj^)VOG+6~mHSx68ua)U;TPw$VUuK)XPSY<5II4D0r$+i+ds|y=HfgT=>)y!x z)IM_m0L(kC8!d8FoRV@EYJ9u^2v#4(l16Dsmp}3hkJCSCkdcDlFaknPLPi0`F^m#} z^tvC}6X2^A-EZP-kOtAL%gb#nenz%zt}@$HZsCs!&2+YZvERW1vpR2xr^AKV+U&qK zdMPkMB@D!DKov_8#1o7z-`MhmQ?#Di^0c(&X+0XzJvaOr^f_06{ArJIROn%wlTlZz zC#B=7YL4AquVtcV<#R_S;6f&<_Y735n~k%D}}NkBI*m@&~q z`y>1WhiHF=+AO~F_`}DtFd?wTg|~?x+Xw4$X8ia zMmD}kkCn#_mujlgM}|{pYQ>IO#Eg!a1hM1JX4}aM6$b!@P%uAvtbb;2fZB2255eyT zUKCdH{@JW}w&4i@w<|5yxpt(e+}oV(QmO;)!&hr*@NeMFsvw8p7s5;fpE_Gh`?*F7 z7TflhD$K3BXmrLA3x?=9<(5ug^6sxo-<5C6(oHV=ek#oNq4YiDX-D_i>;*VlJkw5d zvb0_7;~75ITIVDKM-hQJgEd?lgV1zZ41%50h4;|e!B1t%(_ zJ4-)XXQgO1SQcIo&>-Uj$hNVzAdUQOjua{ss{%%P1I9+$r;)-*UQ>D|(~?a)Ew$>m z+e^Oa_i#T$40U>Uuf>$<&2sZX8C^=MEpq6j@sLkj^iNBz&*o;wOVza!Bh&P)LTLyK zwg@#_$H-P<3dIHr?cKFiK~QtKvE~lzO!z(VYf~xxo8ccDTx6(^$nb8lBwLQ;z?bZS zcx}LQz{wj*f-aLR3c99x^ zoxxAcK4nzP4CRY$Vx^S)ptCmXhpEjqenr2%QEPi{qXgUaYyAGxAo>$3)l_S7MOv_v zN>PSdp>=rd<%*TM+kGw4=kwKJ`z3zS`m{K+!%%}?zcFCwF#RQxY7*zoLyOg^B07p7)o3*O7 zwcL>qRogJB!6DNMGK#|hD0!8FGnNEMM5{KTt;eNVmAcfK8RPQT%!)&YWqf?2qBEbK zF|?*PNg)cWUUYH_YHyZMm73B{ce1kAf1i6Fs8#wB@Qw!uCy2#nHEOt7&z_32e62K< zCf7?|S}k=ynrnaABjdnwkKo%_T}w9WuN3%U0Ad_5cTHWKm1MvL#?l$j%t5OV{>Psi zjlpKnd^>J8Y~MeK^!d?&Ty7s{xSiN4;1&uBHgExAEB2RE(xSA!aU3Wka^XtgM$mv2 zNWzlJ7aMW4o8>ZYELhfCR1*f+Hv+B>5CtH7q!&giqy;1g+RD2&Cg7vfr;uU2*)>kd zt3Fv?{_DHEwd>K@wWmY#RrE*UDma%4wQ~mJJ>6P*r^=nJLe{mmTIzm0+kVC08}8q1 zcRB*8J9i`8Ope@*o5q{6OcU~eT|pxRkP7s+pRi}e$+rEs#J(4_2MW?kCY6GylaU-Y zqDKg*N`Rdc03V*eUVQ6`fmEDD8|~yNLQdvlKvlqIW^sYIgdng`VW{QPbb%DtT9&tA zZ4JC;;^OA+R!AVWgCTy4bonn(?*VUM8$nz2D?%F1u~hQ}UKC*i*%EA1_k)uc2Ffzcf}F72cz` zDJ0-UJ*+2^56vQt#1|^ULl;+T`vdB;M89PCkEmTcFj7Z^Ej0M{u1NBdUlP2s{LaL0 zNXaU#jFv0)SBU=rX+MVE8S(R6L=7R}9nsree5r#K|rXlRU~ z<&N!4i08sJ&)P@gcDUtihlji`Z;-~$%HBOj?Nx)UW#!Z!>Ih_Ftg-Ko)i-X$G3{-; zMiyT# zZigqOe!=5axqEc@nSZG?V=|D5FwN*q(W9WK8tJr00idn z^ew+u@%Fu9%3E^5q*z_Zq%)}8VY^hqv5f->LCdiiRB)bId+}@H9P@eio;`=dNTr>c zJKL+d zT1jydPj?zvHqz2S(!J?YxGn=n6j9?U6U-P=#PCoCX`V%Z*OH{AXS3Ef(_e+Dci*O` z^)_4JSA~@@)a$Mh!NIi_zO#nJsW)Wq;fQxudRfO!noRjy!GE!D?5^G=@WqFXv<-eA z2+ghO(QCK18rHc6qXv_4cN}-K!q%&Qa>59nOPPdFOLXzT@Y*Ms;~qWmZ}wF9QLFeO z`d=RCHxu~tMe(nTv@KFwJx+Kuxoo^QtGkAZ=&B% z_N{iu;;+OgE^cR*OSxycZxPRZH0r^GGd;+?wYia;z%G^6Ws#f~OlaU}s5&axVmvV09HRH2OawBv`T>}US$sKTeZlX0}&1*(en zmptk}*;C*w5BAId008OE3fo%~=IbIoHTBWV~R)P>7@s=-B-C!hm4Anhz8Tx6kK zf&m+`^KeMV-56SmMlsNmda5oPBaPV33gaLGplu;Dh89jbj-!wl zAn-b=)`GH%j=ZToI{Ku#C8mq9`dtcGXjO29oK>uwc1Cvw3Z@5N&W$nh`PFLnp zg*o|813$#0l^t6(Z8=a6IaUXD0ou%Wdkm6J3IZFUa0#kt2rIZU9mM5Sj1QP(f)zl> zUO#unK`h3sFWp`a03?8Ju&Abb$f zlxK}{5u)r zYl_Y{gvqd@xpKeIe7X;XqPFsX;UCk5!vz@;#>5rtEP-PVttZNhAtp2=vY;n$`D^30 znc8@b$ufv^l zLyFBqORZa3KZv|PC?ji6Cbguk>RQI>fT@2aoRFAvJ)qyj6^$!DUqlA~`!mXyJ)< zDzbU=Ok_w5T>h!>-{HrJ$v!FgecckXdU{5W5EZd+_mu z!C25?HHKvjKk*?NiZWjY&E0FuK98lR>At_sS(nh)ImJ+`nB`nS8gYwrr$W6RRd03j zs?;Xrt!JyFeRX@Y@%|4J>LNw+e5vM-K0|o`zQqxTS9J0ND=5mu>Le)c(3M@0%hcL@ zLb$WFYe}rF?jwtA*2VV2B9sbzrjc4)#H>p#s_pY6JEV6m-f!Mt8GZ=<%-#*~zLl+M zJ_y!l@ip$NCBB=c+W6ze@o5chrzCo}iDbREztnXp<+mDjyIMykpFN|;b9lE!q>kQL zZu#r~0NL;1o#WcyX`c_Z5A1zsOov+V^iue{T#{KdO;J``Cz@FHpR_A5M)NKeL`{n$DAHsanftzM9+N8NMg@mNzEPO3@@k6l&`)ofA0=<~TyCE&&R&hcWGxlx@J0aRHI<@JZ_t5%NgSMYy} z^d`0}rYn6`{(B3h`6F<$PITLAd1NJ-LX?OuHkNSY4PGjTFC>(yO>6H#D5q$p%PMoJ z8|dDvzejcQ997_NhRk=&!wQJ{0+<42m1ZTC`EHMRO7d zlTEjp-I6_#C@UysJDF36*QY?fV}5WXn7$;8X$F?thA21%UxolqoAeh$AGkLo2crR&Ay=L;+QEjxLi=p0za{ ztp$G2`tX{{UFf^$R=y02+98^k}ue553UTZO4ps zO>0>2o}jG-oa<#JuBmxzbtA=RWpQ~twrO?CR=!m#Q;cg~R$kHb)N@JMHmy<07V6^F z?QLzZn~%$Q!!5*Mo@a)yLZs?bmJw8=LYya7N-a^8VM>%{?$^0BD@yiS-1ooQpZ2xz z2ki&ok*EAP_$z0pOf@|!{^wV}@fM43t-ao!S{cpmnSH8Vc&_sQ08_9A9Ya@|>h61j zlL_|e=GF^ugLUtTUL=!RHkUpYlf+LAoup9Nc$(|PK6R0_wMf8*DE0e|;@Tuo*D+m@ zHr96`+D!dbb^8JS(VB(5wyS>r0lPBWEcW`P&%_@K=?u|aZb;l;#XXEt;!y78eAuNi zI;@j4QmlRzb?`glo5ybYrmJnQn7rbeUEZ;A75$>70yV*wDCdl^K4+IBF!J|rRE|Ts zXgsz_dnvwV)xGI7r6ikI=J$E6)yr;<#~%~nc(WJvdbzC`#wv^zII2`>u1abfC`R(- zbsmkmUD-P;9zy;-@r0X;cymjPmN^mI%^D1ir-DHnNB|s@kO|z_Wor1>#wAYQ59tc0 zjpo+wW*ia~Oitja9I}u|_Qmom1tOKUGzZEliYTAcL0Blw$i!E9o%w8#Lo7BDF24gk~|P)GoRRxm=6K3oM> zOurZ=UGwXrAXt#GO{d$CLoj2u3wXvs4UA*`laZ6!p9j6nfZF&sScVd+ME9Dt{A$At ze8!Yp*hH~9?*QO{K3_G;gI62Dz8kbfZCg$7!pbDtQhyQM-`&PREL-gM^WJWZ7EnPO z*KRhkIBq#%>q)ikYDIt7%8|aYS~$hq^s?@mkFt`xP*o+P1xIZoN+=xVG`z zrZo>0-xOjLulyu3MS?!y0U9>i89@YmxB!5o<~e7=w)Z%e`%o8h9l3F>G_UikWxjYP z=-YC4ICahe-MD+BT6iYf82^37YD|Eg%^=)%9oyeOE~;Jl zF5bpAjiB=cstGzPiB*(^%B*roBvo(&ZzDTPVdFd0SxhP@xz%!#T+LLRs%^-xX0G?^ zqiI?965i?$l`Z6xdu;BS-EO;|I5&gzcV!}HIZ#H%xXTf@f?g7=*bG=Isp+>Qg{ud` zT2y2R;J$OYvLmyS<0Ekae8yEk2PZpR-~*Q@YW*i|;#*f&DdJ^>lnMlX8MK9i1$c`D z7RZ7_l4OuM%d)XJ!_;zXQC+hy{3W`J4#BjzVpaq(Ob|n$2Pz^|RA5TsPTc7nj*Cs& zE>6wAWet8C*}Bnp*2_(Nx(Xcb>7<*tD{)I`=$|_3w7dKEJPdeJWVm2lHjp_z0W(YN8pV`*hdbNsk~*wsSy<|xr5{#jLZX*wGLFA5TT1#yo>!5 zTL@kWWw`T8J9Y4d4mEuU?A=SDA|Tf670mYdM26Up9Sgq6k2`8nZEr5=+`mn zm_Vmzmd54oo>@px`_ZCNmn-ryEJcz~z2!Z2ZrjJ*{oB>s%U!fO784Cp_pKPdTi#8p zyF&Eay}Z-2w{ztM_;cbnQpdwuw(Osk%koC%!sJ8;P6P5z?Vy2`mHr%SwvhSvo*dL; zi)dpkjTlA3WwVtmtP3vU2L*^i><&JmZyo6F1nG6L6`=+%u{uiS7t3-IE2zs7N%JsN zw&CUyF^rEF_};@=(N@;l{^@2=9f7sEjhvMSW3x)=RhuBN%;zI>G-NGwLn6W_87a2f zN!dkcoHf^5ThH;@WtZXAHziU|QAwrGOWsSBZPxei-D#!%YP#^6qC#YVfOia|0zhrM zcJEl!kalI1?I7ekfx5Tg_;IXjckx5vducA2Y~-3q*urunAUhX8!0yQm%*H>Mvq%v^ zuDM>`D`+6QRgv)~B}k=kg-%d8*r=mvh?2}fA+ww@KF9Ew&!u>}IV{8yMJ=7xyC7y? z^l73|BFXoP#?6N%1C$*}P6wq7lMeZA)NG>nvy)u9w|=_q9hRqVL6U!J=2&bzl$9El zAqjHpD5lcpOJAF|{ad-$Nnl^4Nh=Z=VPixu~%p#CusSJ!OIJy z;3vdFtGmKh>NjHt#oioWnC?;X{{U<@0oqGtK*r(}umt{-yTnwgY4(f!N~C z%C^(Qnvi1^$yJ5oR&vWDg=PS)efKL7ZEjXXP_r@Eh<2coNrY+&q3Gl=1x9ynCQ_iC zO)kx+@ivO4;&78|T5JyL6h6r(5lQnF1hEf~Pn~>YD1aQl5PoZ-7afgE35ph&xtkPfqxV(G(QvTT93m&3ut!s zHWKP>Esu<}D`9CAQ?W5cVlSJ{!@NXWlrj>i&n!i8Up8KNXI!;-QRC8JU?d>Ns_7S7 zfG@bnQsP9B{_@5SIRF66GT*yDAN(Dr=^qC?bns1eJ~RmyMVvzzZ$9K&l#x**+bf9` zmv|>RY?4Bc#OKqjV~)~O;k_Ptg3T1ICaZNDsfpP#_I6Jcw(avHp^&JXf&_`Vk38~+ z7{*s=-KM15(I~rK&8sWvqO-NSAI^MtlYeAmV@elrT3%6vZj+1XqMuFPsW!VD7xqQ? z82Jj1x&TrD9YHD&AZNaFfrZH-<3_wV8&nVgI8Zi?yRb-&ut4li;z3-VLGK7~s=qE3 zR0UFnP6%E(!TZOOx#V%l!%$1f$3JxZz=4mOBm&2Qk%BSF*m&cTSU9aOC1-8g?XK%? z-goP-=d|La+U0t6w_B%eH+K8C(B&6S*5C)rokjp0G$DCr$O(W8oR&D}sRwo`uVJoD zkuAhZLY#(pz#D-haZ&Q)Zy=9AM=M=8SGLcX?0!-<^=>%M6dr>h@xqdL>rpzj$pRTb z_09m~0gR9jQH&fA!15b`oUn@9%FXnXS9_~@-S&Q+^|D&>rEZO@bX|0PJ$1gw;@Z;r z+bffRbG9-UBfbie$p9(HCnF@Dx8t+Ebij-p0ntWq7~p3rbGVEVf_UVC$3<@2;w6xh ztm?sm4oKi1x-h-h1Y~s23~gz$D^InM5rLL&m;iDK3d1Ai=-qzs!6d-orz)y3ZSy_d z-uCOinwd`kqw zEKxWF#sJ#Nn~MMeR?3WLlyhA%xt2ZW`&Re>OP`Q3Mo_p9@+b;Wa-KU)NsAmv%9sfn~$E0chf`Q+rI;N z*3M5dO#@Sybt(2|l^IA~+k|oLECB@VAHuoZLsnhahP+i8d9UEzMb%aE&1ZVMR~Rpt z;sYoGl3AE>j+?Ri18Hpq)KENkmy*hEg86bYM8!;nKpWLd7EXW+?kD)2Yt=kSrQTTh zGV-VPlbkI6Hs< z9OsPn1Cm8#wVjR(hX4%pZZZArZNNMZ0PIL0hNlGXjUzMJT}Uiz<=tnq1P z4y2;eO*M6NuGN*k&i%h#ZN)8sZa&R%#yUp8ZqGl&zbQP0+mW1PpPHpzHe=G(;POY^ zV~{_G=XL;|INC_YK=kx$XdW^Nia%TxC%Gplfz%8hoQ(1gdI)Zj6Ax~H0m%c7`7O9} zfN{=1;QXUF##wZ^uXlU)R(}spskg67wc5cfUac)Hrm3s>>3`F{nqSEw()BHeG0LC- zaAOCdVUS8MsN=uh&M;~p?EAHIxk$zV-59_dK3+nM5sYArl1^|94>pO+gB0*np-JPtna=tnup&EO@auKG6Bwfp&hJvF|e z3}S62w|YNYH+I)|t4*&odCZaAeA!F`$-)p6{HGi)GER5{srpn)9HR$s7z6^PdvnlW zXXeN!c5*w{eigx1Y~o^eiRJ! zCYQ<_;jj;Gc8&&41_{dK@z<^f0IsY184o*?0E~X}GoA_c0CJ}Uk3+^mrkxTz{{XCy z?vO}vlE9yo{_tag@7o<(hk~89lXkZ5-*QiDXg_JI*2|@v=-2r#HEVBUl=2x)M;)=y z3@;n7pyveR2aY{*UZP=)7CpxhcAOFh*5r|sfC0}ueb959AG|R%u=9+qX7$&An6}Pj|b~A}DO&+sQt^dy=_1`8Sc32eD8&Ip&%zA?F40f&ksf01mu@JCVsG zXK7r4R-^Lv9s85nhS7nNF~X2@-yCu5DXL=!jl^fNk%O@0WT+S?jyX8brhN)@-j7Qw zFI~0kX4}8s3TdsQz1EAZm72DlI=-FA4T=-da#-Y_n2y8~l~J5y1mhfXyoP;{bHd~j zLB;{k1byx@F}r|wV4g)=+}Pl-no+{Xh02k#C~p&tIc@xdiLeYI&VHGLP)Zpd+c^J%J~TXE`7@ zE6C4bfDiDDXLdz%+22O)_v?18)6cHAy{)r4r#Nz^(%RQn@=slweVfwG*An2406E|c z5!VE80nSH3j1Hs>n< z+IMd5FH38#wzZYN4NIDptZ>H!aZek9&yX>l+P(|4l;9sPBKdnIKUkB z2PPt~o(}*M&eNa0>PB!wWS;$T(yKaLo~%bjAYhOVe}@CO$Qww$SCd-ptgl1_>l%sOK3V5)UUBIT$>G26K>j zkTyE!u1N;%rD$8bw>jv$ff&Ky z=O+a9;kg4Fa5{mhcvF%bjIYW(n~{^BPc24IPU9Sg1mw8tJ`~-LGD31c<%Pj5oD2=o zu^3RuGqi0v9G$i3S#`4cu9mv8`P$m|Fuk`=r%hF@(${))`|r8R7^WPCAoLg?Fu~&h zr$FB+?T$gl4FV~^95W2%fn0C^&Nkrta5`tMIqS{$g^wO=;~;>1sYg~M@;M^_DBX?O zBsV-S+q^TJiS7YCirnL=9r8Y4*hKIr%`wdSvjye6-{KB~s%j1Y8mT86bbFIqCs81asV+cLMW4 zJdILe!Rrj&x)Ff9oE(FUWAAcEkX&eFh5pi-L-K$O6F(Rrft4k&R0S9W^PFdBc2>RC zy)2h+CvS_@?X9(HT6J%yy!Co?zxiKeaE1uD1_^;ZF|_wRPSwfBB;bw+1mMskglG3s zf!F3$PzR~UeDRJ6!+H$&;q;PD5H?kL`#XX%Nyy=HFmvuZ^{JJ#!ozGT8-Q~IH(YM# z2O0SZ3_9*49Pq6juDtI39-1xJRrvH*UYmb5yE`ZMTKCoOvFBjhkNIH3BebjtZ=0y{ z_yi6)?%lCS(ZFzgiItOJfmOSjQqG*XCw?TZ@nhoM{uVjAP_@W zuDlkFg+3h9hf$wB!61?{cEo{32g))!=Okd$1&*4_&xY)BKJoMJa=&=zC5ITtQI43& zIIUGA)!Iv?+Lz;IwclHL?Wv2Zl#^{*>g{({(YBtg_P1919w<$Veb{C=B#bkFcw#sz za5^2i&U1stX*R15k{L0B)RxW<9FPIW9Y{U%o}QU=q{2t;EfonYK4=Q#CyX)LN{(LG@hlJQ}`>eeA5By;n`v*XiVM?X*q5 zzFPWO-S+isL!2nl;6?`^4p?!VWMC3=&)v%79Zp7W!=}q}cgjL!o(nRO&N=~-Z~(yI zXR$S@X=E)}nbpe>apxxEp3^wYm$Wm@)0{m$K%_F64Ay6fgpwb3BBm`NkZrAA1=2yk#oT((9*$STc` zsUxd8oH|TGD|ldX6fRmM<+`Y5ICmH$D}cGl4f9~pp3YAovdOnDB9vaKCeqi@TFG76YpeYc&hI9l zrTeDs(KNMBMd%=WeuF=Tqn4+jeH;BG&5h%XK`?mkrX#9x4T<#WpQH&yJ<>dFe17Q5qy^j$WgXQTbaoy^lhY` z*IVe;o87DYjM{DTxV!mvvfotN>91#I^f*ly!q?idTga^;)3m-x@h-dOEv$uc=8Zc| z0MCCSzU2!HQ%9V6vcTX4_V`yx@HU$b_07|1_AeQD_1$VHqSfyJ%CvqT(V<(35hOpl z`$S19$Gb92b~$e;);=)EC1%jH*p2(ZkS@QkM+T=YzSzV;w0#Ifx>ldD5cx7(rTI`* z;fm5|)z6S>cenbr^qQ`f*`IkiSe%8)P$?I!3CiJpe+ora9HGW5_?S3No+o{QKE}h_b zX45TPvq`92qRpw?FkWSO+!T$FgMbw0hu!j`uZGV&vt7x1uFr9*UR-3kd$TN!FFRi0 z(I%2yXO;6IE4bnEjH0`PDGM=Z#@*W(?~sBxE_sX+NN_f&PyojjAdg@>0FZJraG4-; zkCbj>o_Na~oSv2D*TmJEY00#f&9t?)yt^l-S9{*eM0a6uwCQaa-s<`$+xLFbYDp{I z*(GGR(1@vQ0!Z72Afg2a<{bbE7=n4m)5yT;P{hsC897oj$s@6B5EnlwA$ZRXfI+q8 zmLYy@a7zpf?kj=w3=ABOMtCIWAXKRVkgCLt%t%!VhDRji90V?KNgxn1M&cLcHO~ri zsV%#7d);|!zQ1zP$4vPmpS-n6uAL)wd+pZmuDx`s$eew!xg-z(W@D3uI8dYj0Nhz{ zO7J)}qiJDvb%Cb9NZr8^gg8<`{o@h_-Pq~BrvY(YR-54>?Y~rD0NIFy*nH#e5P&ZO zB#fK_K~Te<+8bDGSIe-9B>))rM;KP>GrQ#_jtb#efCt?f#t$c;m&tBTrGg2b-`xf#*00OIkpq;@94hYT&+A>0%WE@wmPK+qoq@%Ulw==&gzpk5V zyXbO#YNbmi<$bKWX&%~HyE|$uQ8S)#kUxl(L5u|>cF+bw{H(`0`LmkSjHFA3B$By3 zF_k%Qn~oS{9it%U0gn}zcXu6t3d{>}fMr%-a58ol^8wB>st;yhG7Vr!uKA&ql`2;w za}m2Bf=SApo=62q%HZ_D>yA1U{oAdRzMt1`C(sosRI^Fzt*-UHwtM%{H+6G!Q1LFG zrh+0W&J+*bX9~=~Hc88F#zO!U5}=-QoEzUBFZZR75$m`E1Bc4us?Ev7mNhc(b zKm%qdup1{U$s?wC3<=|tjPZ~F0Qog*PEOp(E8VoTTCFX1zG-Qx(@qv^-F96srs?eb z`|RwuEz9CPEx1^li~;~Wbmu#H$Q zIi(&Y(#IZE#tMD#I2bq}4!AsIn^|wo;&m{^9%qu=96T3$c8TGl^l`A7oGqdoaZM1;G7)gU8iKzw#{$R_IAHTu9oP_ zx10O@Kg;ob&9&EbvH|iX8DX5qlg2PX$0RWRE>8!OQVn}c1Bhf8T#zFq9Ap!N(4ML> zf=?uKT=4@Z_i6?<=V?3voaB;Da7bRnC>g=Z79ixtqaJPrw8_(`mA zPn9sv4tBBRcgP(^2XH;TIgP~U_kP&lf!CAB&JRJ3FbEjnmhU}$q0sUi44iZ)&}3(+ zzz69c+A>$|ZI$=@7fUbDQNyWk(e~G+uXp+M)!jWhkN8P6{{Z>rF#{xUdh#=zWOM_l zQ`?h}f5J;)k(g#2j=Qo5$>$@C;11jY_p(KDL`ldf4gm))pD@Q59B?@Vk;nt5T0`am z$|(2V21aslagG2W5OR3+p=K#r_IACt_5FX~l(5=0XKPt$-uKzx=F`;dlf;@}{{WT~ zkK*7EM@(|6bJNs}jN>OJ$nidy5Biz%SD<1}PZ&8u2?HCpA%+0p-~d569OIHR$;(my00|AB{Pbn$*bap9 zFx^=}7zJ>k4gtnS2b>Z9*KCX`_-oujQ|$O9>d;Z91oYysqzS?5)@3=}WKMa89U3F}M90TLc!`ODF?4 zBX$SN&~wdLO?uCq>jxMo2GKwvvIr!j90EWbZuvnV4hNcq1O8$0WbiX|!#znP3=EuY z10$#>Jww(tVt>$J7(Ab~zH$q425<&A!2!oi9!SyVZ*4VQ#n=q9+~~Wr4BsOeo!(n0b(*q9$4c&2OCce&BGUe!a<~fe|Y?jxFt>qz&Xjl zB#d<1#(3Z#Gd6LY5?7E3D#xJ%3-?DnlY(%hbtDr?ETJ7D2UB@fM0Qz`LCBl^mXjAgSbl zSdr9@2Q&{AXzBnfA@l`7z#tXqF@ci3vCslZ#{ewsTaPyY5wwX2JC9B_jB| zed_Oh`fZ`!4;1))ar?PW7#!?TkV^syBy{5$803;b=`#4sK~6lW$iU#l03e*40_;O5 zzyp=XL6Sh?Q%=zvlPYnXA34G2s^EeSG8u_Gat2RxGU*x4h-?lp$1P_UNoZ93*--hMNHE zC;(D^XrxiV+@Kan`Q)>FxCiA2kmpVx4)|&K8r^^=pmy7h`J|fq=6XHD{TXAP|Yjz7s43dC6tAXVe zU_&!9l-wCSwJpJBD!8v4j?&^7ibp&#AtZs7Y^xAeRak&B%zjdG3Y-o`eWpJNX}1L$ z2{e_6tb2r7ip?tkz-2_U#EOlEb#NF4{w7=lS6A>JpFArZ7cCs%WE2S?XJ-H|)m2`0 zkilff-EHh}qNRp)V&>X)3=5XFfn8=EBLZaEl6TXqA?``qD~PWO=D1BlxrrtQVaJqU4}YHB(jrJ~83 zkn+dbqeuIw+y*&r011^HIc?o@nqJ=EXMotr4u^jwK*ksjHsd_7E1o(JDy1GtHzjLZ zPsv-YytL8$_KW6T?%FMNwVJ)Y?wk2_kaPfTIRQoqa1KEuaKSvU-@ycohCM0#WRI7V zgOBfE9Do5M85|!_$GE2Yk@UzXgOWOpn~!6kak!C2>|>{4{8Y+QT)Is4fVhzF+Wl`8T1@`_TZf6m+~DkkZ=ec4mxKb_XH3J1lKdICw*1=E337m z+4R*~-*xmfozfN01iRMct0;BpH$B|83gxNW#I9F zw15H0Cw2#+#&Wz2WE^sEJu)-EVUv#8QVuXrT0%We54PiuxFE4P$50LcUOJlVRbO=U zTHW_r?yqY;%KnEV(Y4$D5BUq{-v0p4#J+@?n*ep=JoFrnPa`1ll@~gQ&fBR*MsOrO z3CBT>peQ4&V>rhGsfHpmy~jXFh+`b>$4s1pdJcQB=9q2bCnjI~hCv;&IUR>XfJS-1 zG@RYHUAI@gm-#z-`US7k`qTag;9vgG)`17@Y%mGIl|TSzKY2g|^3jeXYRf7@0CU^dWFT$pmEZNzV&O z=W7l3u4HBCb8vxp2Lxaof)tG7DmvtGP;J}NK%@-)#8J|hU*1QJ-14mjkD162uBZ7DaeOZq!IZKwI$prWGH*0#4)?Y6tSbn~%4@3I7q zG2M&>pLTg-1_FWiRP&xPGBRkzn81-|W;nqPagsU#<&Z(=xbN2)F@~Rj@&XF<^FwDP zxdRd8?$1;5k)B2vgu##*6t@TcNpD^W^9ba1BoYTv&Id}Qt#@lHYopz*Eq}hs_V2iw z=6a-+{?-2gyVF$rS?lSo@x?>7VmN{>ok;_Z$L8J77$+QZ0OKXtoB{i|*SR7^$3w=<6~H}yQgT~^ zkSf&+YLa_tzPfe0N%UHL_et{Gr_Dy+4zFi>`gYpJq*wX`JRJ*mI0Wh!Sq;~xm5)J= zn8@cKjd-=s532E?Cs00X%eL>_>>QDgQ`7^_SCtOOC+)>?kCaH+L(?KthF4fw=9+>BbH?v^-~}DA>9V-@S}qY7WXWGC&0voDATp91e^? z<2EoEZ9s4^0>GKUJQ1Czj1CUb(2n$(UUPpj!8|NsGs)oLfW}W!pyz_50iKnJsmo;4 zZo4gZd-u}ct;Uj1s!v-d>E8Zcd+Xb(m&NZ8Z|u7@fUqF6(G_CZJFsMuZc3KP+PT^f zb|;;@znfH)O{oWxO`rxWWat1GeW*gH00Etf1_4|EYpWn1=!-KP477{M#z`UBNdWxC zhyk;aoSJ)vEt%FekaX(p&d^9zAo8Vf2m?F;+Om|YO|<0R$wuDlPTg*LN%O*$oNcbpyBn0LN(<1#nI`72u4LY1ocDgp6Q=oM#wpo*7hq z+@1ha`J8IoX&SZg2HqH>LIW$xR^1A1W(PAmBV?h$P)Q&Un;;vH;f-z;-MYoFU2vC{ zlXhXXQaLhkRIcK=T!L}Dn$Or&sb?6?-)Shj?;WhJx9z{)bw-N&O3S}3liRy`B>b-Y z?qC&& zxn`2txHQuDQr~rZUhi=_ad&DmYWr{1EiB!ieXXUt44Ul1adW6$T{g^OBnap-0;@DQ zVs@Y710dr$z%}0D83>YTj9@DTFAVZX2qYcb$CH*Io*7v3zjPKICWqj^7V8($X+8+> z#ovf^X(QeCZ8pg2w@Ddz;(45TQlt?BG;y@Dd2k_-8J!DY_Byx1AB$cVvyWEszL9UI zX|v3hDgB}1Uk|Knbu+ASthV|E?6(QI+$-*fA25iLz@>D<35%VgqbVoZNv)QySNy*v zVjUKjz|&6al}gvsM$){Vs{Xn&%eT;P9aX3eTWST!VgW%qarfQdd8P#re9a{HJxt5L;SzPgSYPw4*V+kZx!&3yd1Y{ysC@4?N;zPQgF_XdQ^ZI z$m$?COyx2As`kw@z#k4x!i4y7;WDB|c9dE~CP>$C%4G@!UolVN!x$`QtG%rDP}CPDPS>@T1wHhveqvOi%$)Bg7~t90@lj*Rc9f$3|qq>A-Np} z18}4dm-cf@@VAAnFxFZ=j}wI`3>rm*19O!Nvl*Ie0^~u$sfYc7|0kYQ~iysNgINj2i~$! z>NeyRU2#eecbwEHVgjq4Pua)w!uhQp=2*WZ=aeyPex>X@p0%;{xW&wz0W+ND98+HJ!7^!r~tz*H^O{mUJ z&8FoP?`IdIi;7)#x<5Iu!W5$^LNyw+tlZ%l?Blny_I6fUHl?kbRz3>S{u6ve)D?Ws z4#T3Uk0JGow^@K^IAd>R9M2iZB&?tnEZdF-_3d=;+1JJQ1zzXGx@Ck|C55h&b#(Yp z`? zKpX}6kDV+dX+j&7WC{n$xCM5uNo6j^yXkP170Z5qRMc;`ZFJJ^`=_p_W*dYsR*R^o zQMVMYCrbC_yR{_r-*>L(fLZ>|nnXKWQSm2;FPr5!w1&e=iv$)sS>I5UD(+SvIC7g= zn3A~k4G-Z*gY-92G`aONy=B?2>r-A^nGv0qNi1U!*w3~?H!a1axn`6yI>^zU_!#$R z?1>)YMpj8k-WiyHvXDXAPXSeiM+~Ez2<$Vq@>sy$b_+W>0r^-AuvH+jDo4u12EfAs zx6r4&xq}1Kj1cX(-&vOcC@Kl%cQTQJAlfOla|V0^{w#uS4?)nj z-Ui+WKf5YGzzRZxmggj#ZwNx>xeEZrr-x^R}DYpi|80Jsy^7`&$0)>2>L^Uoy~P$IZYe0Z4eq zs~nzl$trlrVTBB$lraT(U`ABncgbR`rzh_boM5pGxZ?t$latj!$mL3&gpx|eMi7Fh zYW&^F&S}C?kTZ;P_kL`A!;hD?IKu`zT;SxTE3Yprw%XgvO)S&1>%GpnW2i|q?R^@% zS8b)P`>yu=6Sxi=a0<9>*j6QZ8(W55r=kIt0E}lmH9R&ph71S+SSvENGR46MaR8jK z*a0~N?mJCV+yKBppl3M8%aU+@<73-)03mQl7z@1g03P6ak&sAIhwo=_E1cm80|RU8 z*Gt(imGw>Adp?P6W+z%ZruscLwbSkEwYq81YI%nw?F>%h-^aKU$XqE4l^X-_azF>?&U*-;& z<2fLn6pWFvf{m?$#Hq&LlyX;MkEZ%1zWb-HwzAVk)vtXtMEz#Y*Vj*z)1|vTR;x`r zD_PD@2R&E@*g#W}^8DdS?_ZdG&=h1TaMC*W&hAMa2p|P2!43{LZv!EYFyJyo4tdBY zErZEz!HH4w?P4%V+zuCoToN{>IN%aHZU=EvPXK_tjtU5O!q03JC9ED0ZTBmlc)9YYRxU2JpHNZ219t!r zzyY(N`}y-lw3=GkXsy|+Uf!!s^|scule$-I%zMHEaXNqIprB&1Tj05 za;nXO%Z1#T{t`&)mtl|0#?rtOmgsUAZy61_0tQAK_TVw)Ps(dP7W2<+usLTL+5(mw z6js_)j2tj54g%*bwu-P4a(N&C03b6RxK;tA1P8!9{_5wV_C};^o|eSeITIo(BaIVE7Vv4~-U%Dr*{3UC1hNhA?h5PYZs3QI6j6l9QG zfXGyXoPm&o0k<&9lCPQ%q+e|o`fJy3d1-&t`sm^De5vxM=+fyIsIRh9uIXy}2IV60-tYZuY+!8aNyc7+@ zm2t=fHq+1nwYV#^Uq#!qI0b1QX=MqV9)|#otHvrRq_4Wt+9w^hzL&nY z@6z4beis{3ycZ&AN;lcNS{M26du-pSHL{kGV?|~Ta&QRAB|%(_t8Lx)w*Wegr0uUt z()7~=LPp?~2tfc}3u!aC~q&F*-qUkFfV(s>}12Hdz!X3bT&QUU5NaPF< zSAWj3Cr@QL)MWcO$XN5Ya3Nb8nC>MI7ASH;;hC|Xa2v(M)`V1|xp|(Q{p~c??`!p1 zpVK@C!713$7?YrH(*<9C&R^gSw-oU9MP1%jPQJztNDuD9*<7qsK zoJ#i}yIlOF55`GTnfaZp*Z8G$E% zUEI@TzDq1f7cRsFR3x_I3J?Twup}2GumdVGNdpVws*Y08J3aL4qD>^PrL|oez5D** zi^I^%sKw5$I7vb-?WL-_iH8JA`#OQM7K(3mwIk4mlrq@KhB60s=zq0&g?S zTn^0Mua@2kVu$7cfEPP*ssI@SHHj?#YYYv*oRBu0762|nf~4o1J_i5>IjMZYh!4w^ z7zBbqDsrbMo_JmtrU@9rj-<4+R=(F--P`iLw9(t8wfH=D5mTi&pC8O9IZCn_+-cWnf0+K+>t3EBW4r~>o=f(|$VaHUGH+M_2248JKYm2a7b z7=eJi)}1GqM$#Lh2OEi8F$~25uM9W@FgPIO44#{Tv@rlCPDxO?1P!4ZIP(gq$pbkb zdm%?0u+xHVPkTPkU2N65Ufu7adY?g)Vkl0Mlay~QbyvG~*H4@4ZTDmT(dAFILww7- zDxk8Eil{NS1cfC?E-8P4szxr~4Ug>h53h;I5p;4{{Y)OMR3A++#;MHD6F7-vKB&$8zJ_F zBr^~X0JdwTg8A+pB_){wAOgDxX2R{-6;2rkESM@tVm6anQe9bIAc6(h_)IW6M!>~@ z2ca)Ko}Bs46=}-zZCzboSFX2P+S*@TH|meI&EbQ^$`qp%(@8ldu9Hg1rEBWC z>!zJAaAkEdvtPGE^-7R_uf zR!Ei;b8w+vRcPb{5gAeDN4bLpE0P;0Z@=3|E}EKzb`hk^3?t8(e78n?v#^wgIAJp@ zAj-3WgiMxS7V*Bn;6Draiue8#?+|GE1>FAtW7Mr}HA}mzNoS8zw2J6UZ46e|FLeyJ zD{>`x7Ev7DYTZo>Mo^KhRn5XP*(Yl~Ib3h5R?^)cUGH=99xlLTnN2uiYECrMsFRgR z^2IqQJM%St8nvGCYW*#4&r6C0-)jV51CQRsCXt_OG>ls06++l`Vv!<+V*dar8-m~1 zcwbmnwb%SVr0WsLj|0bjV3LU-of;{l62gfjMUaRGm4^|Xgeoxy$Ms*1Uj*!;D<_UL zYmK|mE}dK}TygbO&=p32b!66(_GeoSNm)>XwT~r+c-(e&@wYiuhWc3t}-C zI?5??LDZ#D-pk^rcYjV+o%`J$iL3t1f3w!5aL;q_(%VilFmg2i01^16(HG8iWdhji zbEIksAS8Qssb&C8wj`?Gvv=&%X$gws;q~3z5fd&hd}-t8p=1)AO^AF$9ACaARhblk z!bsf&>mtYU{{X~K+aFw>$i?vQ!1@n{ZbHb9ed1kG^Td~IyOV5?TZr^+A_i7heYYBB zppMQEh684j*Dbk~OS$Kg+-L6hAzd_!31Ox} z$gSM(Cc-E}xon0q&7E8m>9^m1aCY|iobx`f_v`h1l^%~3)Y*)_VE%5E!0{@n{xQ#a zxs*}WyA2&&vKJ}yP=0r-#_pc$tFOI}yGbD{V<|zIPG=lDZK z44QaCI_=pskXGJ(B`EVur|M~GGIG$VSl-||jOMdSo%!@PXLGjeSwgP(yKzm0P5lpH z4^B`nm2tlRk(K%*lc47vKF{h<7c}sHf9qlpkHXB3_lvq4=OqZ`Z>Oc(!dg5U^!__J zWlwc5Q^a44p}3nykY+usJ}qR?{nx$RbW)uX=N=DvSM zPt@nb17WxG>HRlFirj3%o31{oI5Pd67a4dJ-~P+!hs1l1Zgq>m=pXGq zThxdG#FMU;EYyvIn~OJXExSBZi{K;X^&zjD{YFQF%Vl#}@cd|(UuH`U{{S-Cv54RL zh}ZMaH{;IXvlnoRkn1ckYOuESjUe&Mam)hnj$#`SDg_H#83_8pG`2Vi})}iiP4W#CMkHLUl-8MTP zwFS=~AjlzBus^m*-agN^3gxa;7F0wD&%de;dF*ECZ zea-s_pJ!)!IKH^2?V$PR-Y>-YrG;sw#O|@DF;yMP4VUb%dWAlEHL&Kd+PX5fe{*>6 z-Ctq|-Fli96GS?YRBFE8!5z^luvK*+`H*S*WWh=@pK6ETK{&9H`U8As!~h7y^!VS zK3@lwcW*wR8%vvt{wSL7FF5=f_vvSA^Z@1l#QKf14LYk#R4vH@$LbR6-us!QWi;3M zEHg;{l>V8TN#ES2JDvdWtt*>Gf#}kGWs%_17SX>p=44XiM2~c9Mp^iN^|pzk+D-Ga zlEuoR7`@Ho)^g{?e*n=Aai93fKXLg#bOi3umUA;%cIch=dL^^wgI@kYu~7|QbVm!w z(CW~q+1jDg=g!^Y$%=};bZ}jOa8k^?CMm1OTpEx#+w`>G{ONb*o!Sz~=qlvHNMUTEr6{5abEV-q6ss8SuBXZ>Dyv{T-(efb;Bc4Vu|G+JXh z-nLO~SnJzrwd<+Swbhq7`)b1>YoGFr!)&Q>`WN6rG((SzB72K_^@V_*a<}jMFpclv zewflVog~EF7b1ht66yk}+r6(ocGMQ%A9Z#%mEZT~B#hpu`FuGiR7|=~=*0u&{(gmV z>XpZGkv`l)YNKHVLYl#q_rw0AmL!K-dfm?Zl+;Cil>Vej6tE^e*HE{Wbx(|*qgtvg zv?5G6{|qc*uFxvO5g%@ZcwUj$V%m`v*3!~^Tp4k9UVz){PONN%Pw0%~Skbb`&>HAsF0Ps8L^7{Fn`^<#sAZsQYraCm_E8D%Lx?l6w)G|4c(jv^e%>H*O zK-J_(-u!n8L+w_J-}m|D!TJ}tl3VHJB1K##Up*E~G%)sB5ID>+@Tzq*Qz-AXNqLk#PEu( z4}%|)<{rRy=qL=~`4LnDjwuUQz88mv2*rzfK6kP8Qo>CM5 zw)BHm$$~3SS_LhoRivL{=+@g|@g>lSE85LnSO2c*1vjL|Q-9!{%xuEj;?@9>)j#L! z*&n~17ZTwavgv}Ci+}88HG~0#K_sr5#pNGA4mi>sZL{qg0~~bZTv$?%%g?jIm{nW% zCmErh7pfCa(5C7NTPKXZ#a;GXX;fzgT9dUHYKoMy<6R+633rtf-5QR;5`cR)j!3!~ z`?cga$zS>H>&>OpKK4)U6yHn#Ao%GFN}-FO_`X#3>B5_DJmlV@41!}UsLbpxr^hL! zJ0K26lXl01=T>JJ)e+e))D|&uu@Nv-mMnjx?8Egx_J5=9EJd%^#Xr*D=41C^JTK5BlGew~s>A8_ z^r@X$hx%BH^y1%Qzc`oWeCgMIUTK}+yI6dO?r?|3>&uZ!oEi2PHoThhS+##9#9dBU z#Z>8`iIwz^qq{%or@vPfRxFOsKt}3KKVSdwW$9UXc$8;d!zk(RRbI;4t7K6#)t~DS z8zX9^XXe^vft=H6H{vVIe$4X3=zm-IQc@QvKzHm8_IrFy<|2o*!ZC*3@z9jji zP0A}M*1M2*L+Xz5(zb8d!mC$H;qY%ZTdy#Ob-&1zY()i2ckF^bwme}_f5_nI`lJ3SxhSL@*d?kLmzOhi` z`BUl{fNL*uXrEA6Tc;jgWy&o1Z?M3rs`rRC1+GDvN-zAVl_*>P;VFB~iG><(rz_KL zd#2`n4a+WP+9E4sa@z(mMdxZD{*p-uh9SKEAt26jB-2k@AiLG4!u{Or55Fw0eQJ!# z=?_W{-r_GB$l~JntWChi&Gh;`#xq5=>?>PHAdHCVO6Y~HFOxIgKlW484g}U%;o|&W zru7%S<1v=hL&}k`G38qs^@eP#16kmx$l!oA)wYEaGk>|A@%@gL$cW!0^&fnGI?=dW zn6TjdGq=X*?Szz?jW=bj8^K?zv}Nu%U7FHV#9ojN3L6RD!Z24o9uIw#a3eW{@zy*! zMJnjA*Ba4iL!pbG4932bw4QvFjQ=W#F0D{Zls|{D;`$Lc%1jR#xPAGYWYe6WX1&X0 z{=6rXY!_X%-7H?%PpAOv9E~Fb3CLI1RGLKmM;-zjRYw}#YfXB&3|H}XW*^Js&S$O` z>^s$O+Xeny3;s}@=e}~yyx3#CzFys`ea*8dvcF9K5>}HmQ z#P7fx-`XsGOkK@O#b{k#jmkZ#Tizsi{kM&)s5ecW%@g$}><&%M zlB{w+3|fwbYP|Vs<674^MxE)sFn)&=o&1}(Tc;+xr#i)@uB1n2s=WJ8^@oiU5lQ4d z=L_QjF&44qEAw5A<8eaurzc#d)ZQ=tsd^Qu@adwwXplvTAIUTlw;`}T6DU-KxjihH z_o%-3V#RgmDa;tIqKIZ9_l6ci3;(87`P=JpT@$|8u`1MiyK9^|*nHPukopxDDTEWl z*rtS4WQ1QgX*WIA{0B(HsyzilDg^?>yeQ&SF z4Q+alIt>PdLP;XEr!+_OFL$+sCtc~RGY#8_j4PKA-Au6JNu zdI??|T=KNJ|20eK((4D!4$dQ`pSP&nrR#rBjaBY;GGc6=&ijcw%B$?k3YJ~}ecK%3 z<73@E&M5ohIIwSvvG>J1{|68Wta|=9U~N9|`90dT_lb9(JvXei2>6Jx3#n?$;xf^& z$wvI9^=uK~-*$;8-E!DdZj8u_z(aYoXA;Wq@pOI<;CiB#5UsmK9ksQi;c6V1bKv6A z#-3x9@a_32GT>(muagj4*SV3MU8}Ee8^W**(ko-xu%>H{f`vRloZset=7ukI!i>7N z6uuG~f9pF*6=UCgC*;}HywSDu>s2kZ=p9Wh&c=8+;eKGTmZ{@sIVRdIK2ma^Y)F^P z?h!z74V7=xsBpURT}ml=+EfIAwf6iEhZVf-ns`{lWmz=$C$7YG{50uWk=%pS{$v=O zUdJfE7?>TzRaMAixSH0}2WYN;j+~Ov)oW@wKV!FmM8e$f$CiX487B%KB$*l>#))fP zqOy3&Uq8Bu`R3?6xu{L4kEWSvtQSn9yFcX4i=2=L$@t#2cw_vbDjbyl%*N$8ZtWe3 z=Nmm-tH)IY{#_a_f>4qjP)#i4;q`}OZk6uz{N4PiSI72gz{=_2wYQr+g3#MSOm?=2 zfvo4W0Zv;#wQ0*CUO8aq-7Phno6rUlP!j9_RAL^0kNEwVz?j*e( zt`3;w{(i!9UIpq$11(HiGvpL!QiA(=?z}khf}SXR>JFuN78;Yd$?3d#Q>B7)VCzm0y>NApNwgDuEj>yaT|6ELWXg0ziE3SQE}tE_WmEGj>4ywQLCD zCEsmN;eN&T?JQ~F)ue7~jO{nI_^1B<(NmEM(IM~0%yCRFXrnl6*Ga*D*FQYUh2o2w zIrHt&2~Qr^n323vk^QnjMK8%3wBFpQrY6{_TYca2EtSpz@KUcu zhWBBU_9NuipzbFg4%87DdV0&3}qQ{g5@^s|otP9W_ z{cNfj9~WrjWZfE2x9Pi&p;d;rJ!Qtq*W8)-w4uFX_v_3RpRPBwnhCnUc3!ntpi|V9 zy00%of?=vtGbWgDwjz04Qv}6U%9~x{Ef*rSk1y8idx)5()k(42dEO05(s^gS<uE(_!bJp(7Z*JHkBurObn z*_uEXof7PU9l{mo0ZZ=!ngI2zWui|$JZG40e4tllWvB>reL&)5@L(#6E&-*94g72G z8@7~{?mB=7SPn+X4MAbS+bsTtY;oFK*+v8QYnVtIEvUIjuPz+Rbz|XLCY*2nK94>? z{X5SSxj_T})0vI_OTNB=xwbmZHEr6`o^_chpI4%l{sc3b_)hcTs#Tmw;$fQbC89Av zDlGs(Cfm9xD=LvCF&N{@S-u{RU)3yvjC72dYq*9->NDQ5pk%-AkZk%xLqPr`kdW2m zz)fY{cO3bVftTELHB9}di!r)Gx@Ie>Pse|sKP8i@3BR^ZtJbxyp259-*yGwYF=kZAMKR~j=FHPCkSzkhmwl+_K%NBGL&Ikv<2OTp+tQVXAQDVXn*DMV5J2>Ua0Y$i9{Lw(T2Z z|Bcm*Q%b^U&K6%k$Qo%``%6I>UZ4QLKnAIYxc$Z2P*vvH3&98k(G{T5IiJtSoB}PK#gEU$Q zT*Fp(o0k1T=(GHwNT9j;i4v@NaC*NSRl9B`E9|d^U*?`| zM{Z^4l?k&(yZCVbqt%RWyERg19->fC7Z}2UkKn;fi<9}Wf_hs1OTR>QF3PN9)dfqC z5ULR$H~j6E$*@dlP!=f6Tu;p0Ty+!B|9_`>Lhl!oq3|nBy}DAUDJ&WT+C|`R3vnSr z=sT{t(1)f*n{)ea;ILeaD&Fk(S0PTSI2)a6yi&D7DU zc!Hf%_|y#5w@{}sBA__*`OWNx2X3X?(PJhwI>t%j(0e3rMuP3<-Us=z%h3VFE_KDO zk3LNJ{%tKZR6Fsfn4n0{JgBmA@L^P$>w;u&tB#-Os-E)w{rGRbw%iTF>qlz8d|Mt) zuG*PBPi^AubX%uyH9)gDSTnYS-94f7@j)i=nqQBS~e9$2=V0p{F$1A zmzDxB(bPiNcReX$8XX|M-K#AiRvgys{6}rVe<#*CHKb-l{5GH3)iX98s|)5rV+J)* zK6T@>;~9P)0Ky}zE|r`pfMAT{;C@b`+s)Zl*1d! zht0yWt7crZ?kINNo8t%T)$yH7L<5*mc06_m#F@sznX4w?lE@GloP@=IhT4~4a)oQJ zF&tmS#0L*4za()A6XJ?S|IWGrWll_Psx(TCCG|ta4J_0`;}L(n+gJar`L?IrcDU2- zKUTb69aim67^Tur1f?e}>xt_{%px!g{@AN34thEw1}3+PD*Su=BMl{_;`Y z$Ugvi;xob$EUpYb+oKCW2Y)@a{xSqLZE!*AUEmF38u(K;F=zt0uGe?H#wZ}77tI3Q z2*^h2eBcN4D)SqgwK4ESR<2TmxdYO`u!6&P)Whu0=grK7P554FU2Ql+m>CWvG+s8# z-y2cbb4U|1(tZ%MXhJz?Ael#@fj8CBXDs}}G-30d?nx`NI94`O6tK6qG68CI^uSLo zH^0f$Qs#zelM1ykEH}R{BYf#g*;1js{e**)!A|`w>F2MkY=7Utg$ZVC;P{`t3(D?c zNEF$T4b0AFq2Dz;)5S!n2A>3%T#M*6S4yQH5{a%viKvrLAEi&@(8`!=NsUQ(rD3Ry zbPHcyoQq!CYzSIW08E@;Pvn+rl#(Hu7L7)gc*dSCto8l}=%UiHlm2v9K1U=sAs#2)<>V{V3u?g*bZ3Wc@pGamb6cDORvG(2 zg3}B;}|&6;p$J;1$q|XvojDBC@l&|Aep2_{)^Cw==R>wKmexcpyBG@hsEO1pG!(cTv$~7?H@u z&Ic$FrkDI~X7>kItrxknvCML~1-uI7qXSP8J_jZOB;%Tf+X8qRGm$D`P0&h^#O)< zGSHh~OL8VaFzi_i&%Aaq?qxV*z5~NQJjbSR`KUg$(vjj1kYj0`?Y5Oc+B2X$k7bd z$)~|(lS=ds{*pKeV+Q zCS6_N-jSa>O4kV48XX_A`&u>4PsV`R1>@Xw=b~7T2fWHx(HyM?CV&MzqHoR=R>PU% zTu+J+8I<`XoCn}E2`r9e{3^KVCR075nL&m~1#n`(K_oz*=G?s|5}vA>pVj%jeym}y zbu5m4MZ)o9D&0s52}`2D_~!VzV9Z=KoI64&xEB*f&<==z?@%aW@7G*{g9lILv#gY% znkRSqoF9<*c|^63JD3^7Uo`fxVMjq9`_aMp^95U#JEpePg{`$za(Hj|haqm!Ut7W3 z`ZBDz{B<^fB^sj~oYr&mX*^$dlR|wh?0a}0MmWuwo$>Cb33Lbph8!f{gX91|81nO@ z*ylVzTUk;du^It{7wR5xEVX~=A@`jKKEn=Ls$(0? zL%zJR7fnEhHNDf!&uQ~PLc_d_^@2naX0t*AwdhjI>%yqlI z<0JRJFu@@E7H4JEZZ4!477%D2C5Q&-==!wYZ`4nycJ{)>7nXscdDbWKj}rL zsAP4m_7_V19CpTX&WYxqSfY5}g~J+FA|65ExQC0}a$lmch62F9NpH{V{P6NI)?#YZ z7%DyB0dyUpm1k#AgT^iQ-aJT(zi-HIK^4Pl(cm>ZefsIc(0h4H@&CSn% zdq+_^>9b-@dEQD1{aqL4cEC~#2nN8Aa}}7S6PfAJa5wSEETBwN5D2-z>EN?{beny@ zN|5IJmLKt?NrusmO-~H!$y3R1!(lWqbveJ-U5^Mz@$2oiJBx9)^I8;uS2eU!tKpB! zf30f)E9S?sr~RCvjUiMjbxLh1Ha4`iV{s?_(y`_^{GHCq*{a}#m0{=Gp-crr$8Cfl z!)s$+Q=&%*!wM66oFqg-wr1Dlc3=lY+*!JarODY`Q*`eh?Zt9Q+tMnN(Lg{E1VeAp0emLZN`!=ZHbhexZYH5{^j(J%raZ2LOcU2e8lv zCg)$Pf7_4>$r*|`z{)G4bd^X2YL02j!H%OnyWdKxo{mM+SK^od*nM-(%Ge6;49Fgz zm}vML5amF7ioLPgiY9Yf%XAt-c$)|+EE?PU;m=7CEul|->b2&-R+H^ppz2bsm6_}r zgvkA232H}C6y+QiprZ|7xCa1Ha{{dyG&J;WC5GVoiS}Z9 z$8Z7N5_6WC?F}QUGbx|r94Ee< z(K|E8WaoS6M201*WWrApSNomS_=E1;T1#U9lufjZ;1WrE%H6N1L3L5YLAfj@Y6!^k z8P9hBnBrZaMOjD!1=$;nk1lvlFuK7^BBKD|RpHKdz79He_r6Bmi42+f;~Q>k8o1JF zz``bok+@J&SzRb_(7}^ILAB7k{W8Q1B4kJzgE6`>pIVqs`ef2i?gDrvctIe;H_Zhs zO#mK30@@{bU_YhU+6yi#6t_4DBkmwL`j-gSY{tXvzpiVJ)wYfguGg~~06VHbbq4#& zyp3K9X=&BEdPt(Ad0NkTFrgg!Kmv-qI5`|jrX0&#|3Zx2wTjfdz^)_{#t)bdBJk@{ zx^^q&{6%P-H<64gVRR5>F5?S--f!@IaA>HittE|5*qL+P?u`*$u!N5&(FL z6QsT1E9<8qS1KxBjm=-=>9v42TPq9w=e^zEd|=E-YT~35luhcAe;(!~^m5J0vcJ9aVvQFnAQu1-5z~_i(--Ulfb*M>JBy>qa(Cp4s{R2s#nt_0 z!;ZteQf-T`*Tf8swAL(UuY^ui4VMK?UsDMS+tP&s{(jK~oXxurPDo}3$<=-TWpO3P zLHfg*+;&2pghk0BoSYuN9ZoD5C|a2g=yh)VsF!V-$YAo^|#`e_HATH;&snr0Srw7-T!XXM#y zs8;NodgSlM+Wj}W@qXNCIV?AfzwjIb5Mq<7ESc4XRcrVX~^9C2PU}TMyTuUUuj~g&2WkQVZjG}d}$Vt zX*)m~+K?LsfgtcfL)wcXcqFJ%rip!LC>Z|;0K>P-^_6{M%&IhGnLAsVk9*s%thetQ zm0y2w(_XIfXtbVGweqHV;8Q#mj0x(yMcyEj-TM$&PNN`-RS;fTH-N;LXaBX5$f>&w zzF`xavpAh-A#1Gtat@DH=HBmLF&ws~^qCbgNPR3k6M&hh*NZH@m23MmE^6a#tol+* zT-K?SR$IH3gSgzd+-wKSe5|EN1R!~UA#l?i!br$SNK?n2(Dlq5GSPJ1#>Kn@CD8Cq zQdL1qJiT*#Kr9;N{9?Eva$r;2@$i@ILrcJ(dum}pKzqwcB4}9VIW4+ze`();TPVdL z-XT7Fu=pvP9R!9)Nxq9B0EW2Wga~HBPDx}X5x|WgM!(aiz*j+{ZA73;}a+ z;IRxBOUdhJmhP_=SmCiDbo|A)1k?EKhi?1D0S_28%a=sUxD5QV?f61t4dh+)5H=w^1(@9!838`#dG z1)QX);fkN^6CckY=5?wZw6f;) zZsE*=@#Dq*5HH_2bpOJ936dfv9NivvMqecJ3m}4Vpdk!@&~HpEa>JyN-YJK>H-j8T zBw!J8JuXO zg<4kRnZv52uO$(0W_GcR{KNW_!AII1FEmLOSAKA_mXjgwiP5A8nSNN%GhxVN zWrFBVO42?GMfHn=>|LBfI;#r8D7daA94T7R*uB6U9UD|oePxuzu@*9)2}+=J!Gm`g z3{up9E{FvtAn|&T9ueokN58Dpw1!L0c4MO+N_8krZkhB6pQmnh6ks|(ImK76bk1n3 z-NKtl5nUUl0O%g9g&$)sd~P$g>ZTzEs9_?Icnxd94jdXG@(CKTC#86yWPB3MS!~P_ z41kH$e!!*(?B^b)gJE7Jj(aj^@zMNq3CXkJBP;RF?TO#n*N+rN5M@g*`AQ^uD3P5vWf^iCpzYA?Z zCwog(zO>+5YtxgO{K4=1<}=bA^o0svXN`|J1hg!b%)frG;5^|HT+@&;-gtC6AWxz! z1kv)iVil!_H6}~BLU^}-tAhHkG3#E?aA^RY%L9OZ7e`j!#&TH=SSzQY#x8i9#3T%~+GR|5Gq%%$ zNtarJObk$0cEd*ZzO^=1wl&h9=+QOmvd!XoO)b;{P1m&}0xI!54?(z+&uMC`WRoI5 zrWA_O%=oCJI^Pc+it>j7JmwR~kRdJxUIR&YnvSWOfZDP z-Nh2HC=jxjwVA_t2yw&GGrKf-FmLhLj76Yd{*US9rtKGsuiNLl~F zbeya4T_Qjru33uc_1a7n43PKSdnI}OJ^kGqE{LTVK!_I*^bqnrc2(3=onmrr-`+{B z_{Xl#AFYrqy_rtOdSaF=wwE3;P_ zhBDl?`4CF$_BCb3Z~Jij@G1J$4!Ze`qWEdB6kNQ=14rCq(W__8M-5$U%3)^+U1Cs>$fj$G96I_DAn!PwNp>f2-VG{>Mv3ofBG z3$~6tdx8B=@uTiwOxa$l=NF;2ZZ^TnM`&}8Yel6)nzi`CH@{Xoz<)`aYE>-2O3#@( zkN!4?F2LjO2tW?h_zv_#h0ky4+xZ_GvO<*yJ{P^FuGG|oE%~-nqy1Z#_Kq%hHFZd{ z<}yPbp)#;W%k#3Sa__K$tlZrd_XVg&j@XMI;o+aB2<4)NDVTGX*L<(@`^*zyx0k5n}^`P?1 zNWV3xh|DG!TT#eqabk)9x%-sf|IxbX{tMF(hI%5emyj@nk%9ko$?E3K)QaZ9Xs7mo z%&~^IhgF_SQ}^0V*};dDp#DDZZoV1}l~IeR7tQ@kCoON(F2{t4OZOAtCB7J5kzO6@ z$wU(-AXC!|cJJCxrNbga80@SxmkhL5$Y_a}J`DPems=b@wMc?I0Z&#`!UtfHQBi%Z zFh9Oqh>b2Uv@ZPap#aL%^a_IO%PUD;!MEvHLp67zYX*VSTp!CJ+w8HV(O4d^cD|wE z$(8)h6LlNgO>L)MX*esJ9Qm5D^hk9?hY|77BOI+i=-Y!Lyh=uD3O_dhU&y|`X`VPKImF8-}&6u6<@6@W327#&^{7Q&8(O;Blren#m883Lq_oQAzg`*bgT&o8J@*@ z`II_actNFpq9BN*q|`wcvY%nC+3eC@y;733(z!GANOZzs$JW8yw|-%Ef%&uh6Y68_ zA1ugSGkj8ObDozdV4tsWKE}V!HR9}*fZuSep>-LAJ-E?V(XD7pZd6oqqTkU~0^+6B zisjk`ga8P)zZQlWN+P?+DAY7}cL03LT;DydkO;Jab-LtlOdUTRt7?Hp%T%?s*L5_G zIW+D&ID{ihuV|DF9K5m=Z+29UsicTmH*CD{;FK*%Z{mQjJKVRmWDLB$zCL6elNL-g z7Eh27GrS$jr$Y44Y-)t2T>yi9pNCQP0Hv_Gg73Z8=Bup7Y?s08Z65F8UU#8dEkZ_q zXaRASm>SeIW)l5`WsLC|kISoS-Me(s%Da9$W5U$?_iSOOlRTnq?~&6hpzB*`jj=4y zF&p^!R+?}b8T4M{%;o23K_*zkSax!53kYK6=>5C-60d)Kx+Q^SVKtkEroE)ZgC@dG zSG(Py{g+f_3=V>)aUtf)#8c*AUgGB5B4d2AwqYHgWdbj2X2WOD3r?KHA)Ff0%QLv*z;pJX+L}n|^Ir|%Z|475p zGOuRTxpAaje$AI=STH}m`wx&1wH@K^{LAU9;GmpO9PF9dMNl2)IpO%+)Q4I^h7s&N zHubRo+bz7@m^S>yE?wjL=p}`s6uI^Q3Rg&vr$VmS%g0X^GGt}nr5PW%1wFr;-g7+s z{wd4H7Lj2_Vkc<$3z#+YUDw%Izq}r%crE4at<_I9Stcg3*B?VvqjesiA-?+@7%ePR zlxs~vm!raN$v3j~ir%N8b+=WFMV?FE-U6hWPB`;tuZP&#zghDP^&hMKwm16MO#03T z?Y)twH9q50^}a~juzBuM$)s8*tj_npu~0~eLteEIeQ6}Nu;*AMYma&3t7}u{?de4c z-cgyFG0`8i&rK0t;~bw1FO1%Pd8iv+O{~|5KG>){|nhlkdT}gKy3>3|i#D|>h z9Y14G`R=0MW~3F>@QEN^RBv1Sv&>RvXJSYtuQh(4yW2jXaGq;?&!Ipf0&&tQwmDQ6_k{0DAPB$K&pLj) zJ*d@}12Yhk(vX!5l^QUx5^26!evv_{cvIxXl1oR;4hLL(E?$jw7kM*k=KH##lLJ3Q z_k{EwrCk4GAnhNSmty{>9EI|YHnIuit!*@Du?k|!id=}i@4>1nx^kV%c24EuWDj8B zU6c4fKz3|^s40h86<_ppYd`k+w2@E_LiR8Nt^4ZdIw%;JerO?pJ-n%=s@$B}j|;>l$zn%xJG?dzXwC*gNcxH+*Ev6IGu;-uwf+ z4ZUgQ!V|q*pxoj!v~L?`;ow(Yc6j-L+{$E5?-`Af)79#k^RWR3*`faG4h~zEwAt7< z=TE7~zRLj~NEyzE-F;lqb7Q2p+gJR-xztv{iPELO$i0Ygl(f{XPd5-6rUQB^a-!bQ z+WM6Dkl7}ob3N}yUq17eiJ+Famy2A8Sv6_Us^Sq)@o@Kh07cxRrZ8Woa3J;J8uq&S z?m`@w#MY13uYFD%>9u-1SX)z}_;$gOQWE|qYwAk-&r$Qgo#In}%eqkp_9`W|c2;#B zKZ>S9YFb-n{sFvhFOGlgvAaX~o&?#r_7VNba;-H{ar0=TS$2cZjJIL-YL0GrXqfen zW2xop6Uq3jX(yk62|LN_3w{*~5taHJTl%rD8Er36R0W=vGOpCcun~(=ebrpyicu4; z1iCfED`oLU9xlD&&Ph%ic33$@O1YW;9{?56>7@R%IkvQCcCkiT&#j1PR6>*O_RXX= zd)wUDQt7Et8R*q(e=5=M9j$h+&ekbAcVs2dY{$q2b}!`q!mt2$@x>~qD+DuXIqI-M zNY+H4et}#2{tlAjW-fMlAOFML`n@d@%BSlL31j|52;OFZMiM~i04@qu8T`2w1b0(r zrW3u`8JDhg=nVz+lMg=?xqfdU1Ze3|4Oh`X2wx$NZxgLNIT*bEdtB6Z)_kje&9^>e z?byNT>`IGS{oW*+$%V>uQ2f<7#>3wROCnY@uq}rDUml)o0ruS z3rnZf62m$B7a?aVn_Oc`AY#E^V@k9v3z~aZ83jaQl{fD^%!7e{K*Sn%0dIS-aYI2k zHo+g&;+N{$XO?y*qL*7;Y+{X*Bi`hC-zgb8?4&OhI;mIIwKjR|ARe+PW>(LB9AF{x zpn2Kg#b%(ML_T>4bqsGpA(0=LfuI1i@Oa$XOPmLP)Vy4xdM2n0&IwO6g2FD%MO|RR zVRLtD@ny*}njWmYBxrpkZhd?$u3>eogT)Vc|Mk7!mYn4UGwY&>vRHe+M127`UoVMfxMav3meAh(zY0lHwawa zVZDm+P3YE5J%DRk>% z5W5%f53sjkvoL1#wq+{s@4eIGK2&FV1?h9Bg@Xf2F14$<1dE+s10;sMSu06~XR@O1 znYOl4SrqbM#~8eyN(K>Slil?EKwtBREIui7yG{0ciWIf#a;`2o{8YeI!<&}Lr`a2n zi$Da7VjZF*)ndqs)BK0W{ltYJDHe(~-O%9;PkMc{;#_WE$$#HAXmQ8+A)^!D?g@Vf zNA{VIoB2l2q^t=DKkXQOE=-4|TGJ3_Jug)AF0-)!+z0J*e&cuFfg_y9?JWjfbo+ zJUQy6Ns8GNT4MRqQ@f$VGg54k^_OcVD`_8ps+_Co7L=r3uL|It|c5&J)tmpY9)_bO4>Y|G;Q%X1tyJYZpK6n4DDjoY7|M{Z=@z(W;s`0YN) zLZ{pj1Z|s1a(aVK&Ot4#xC^K`&17G@DSXj`d7nLCA*ai6?r3#RC)2w_we4%@!&(W^ ztZ|?aMS9s+v~h%tyWtsdhD+*X|8M?xABAz|r$13)6Ml_WZBx;Ye{`XEw?!o#c&bcn zZV_%=6#>cFITRbCqEix{3}6 zm>rAamf1hfk1BTuqO_w!j;%8mT5Vgx#_rWe`}hP}4LN9H&FA_OxunD%S_7M4*s}mv zODC>jga;9AIEU6VYnlfKS+*tWY9I@Ls=+yyXT#Aqm4oWv<2-f!2)c05>5tc-4w^?v zue`bFSmhG*Y(Dwq_OtW|NI*G#z3y9iWx?nAfOeasdfMT&+_5~5M&H9Sn)8#@on`OH z2WS(`V3HazqiNkS;p<$O5G;*z>=P6^yW7jHN4zNM$i|cQx&EEL2b$yFL64VMZPJG~ z4zm1f-S^B*WTcY-XORl#rwTUM)J{I`HCg7jgRWKp9GP)*z%H|1TGha?Ls9*=tAPp< zZ*-`F875}V%fq><_I*yf^%JE0)C3vF>Y1hWZWKfYF1uOGBXXc@ET+qaJV^4FLDCW{ zRI{LD$#5ZIcg=F~ftQ{YC7KVqps^JI_?A){5@-Pql;lD%Y$k_R`R3odvdA4ZVheU~ zLB)uEYhW-f*X*K0jzZX&Z)G*>VWhG2Wd}XhV^(girPk;a~%8%;lLd8#fUy`TLJ zy~rK(dUXiRA1-LP$_8wPv9Gx)Wx3=fYlsrJg*bse#x9?_GWqi02@Ro2T+iQ;G4t#Hjsj;!TA6gcBZ*nm#V|ZYR!COvp&n6 zHF#L;Olj6zEA-7X5Wl+Ok(JevyL#gZnNB%S4(C9eYGVVxDEtXe(+_(1AuTVY&d<;W! zi`p_wrpYarVq!z>G!K!QIoKSQ7(T3P5P~>yVMM zw~Ncvash2>pK3llX`kZmqF$Hh&zW5J*N{NT{bcqtU2R(U^$O|;WA&A9h>`8S#iQ~RNv zTD?wthPC)B+cnk?Jgt`**woe1ujLL5)y~nrcsh#~l0Pr(8 zNVuTBNJM8_i`=ycMMx}L7S;J1 zEP%++j3p(}zF_vW$mDeffjL`qsz*(%$}#awtVEmBVR9NG0(j#TOR}zP#y~ITtLOM~ zdag|9ytcGy;81dx`%P||mYyDlOxt&mTX?!yZed{|B`>%C&)UR@37*I(w2klETq-S) zNli%b#x_pMr?!>1t`=tH;3wG$+uzzFtn`E^J}Ekq9G z!O#o}ckkA>1qRfo=y&C%u`8AGFOQQprvgUS$`!Y5S+kjNi=m z^4CAFSKE{9YxuEVPJVLRD$X7V6uI@}rUu6-c1bn66gJg&o>$ogb0YsKf9NlxY`^)| zUyV`?@uImF%jop8uV-F9M>tYVFmAmgO&Y#UqXqAR+Qv;~^1Kj1>n1A#h63r>W8gVu zHa4ac6C&Ybt@TQ|Gd0efkbmaFG-1V}UYfU-vdWN!s55+K7Wt~#pzG`ttJu-BQ zOJ#qlFE91pT})ig!noH#zC#l*QfB|^8pZ?Yq`Lm3uL@-U_OW;KfmfafhV;AOezeGy zk1Mkxi^2NGO{-yxUT`CghLU9LMJ$1PzrupHZK=0j0h+QvHh_k_|j>3!Jt;V! z^|Q4uy?lJcZTi)_Ae+By*~3Ye@rrN7LL-kpdEQFDn00ujuzxmi>a6SC*RIxW*$UL5 zLyjJ%xE#y!eZK0qW%oFgJy=AV0!Y@4A7e<>9Cui7^T6CwYZ|EG&bd+Qm{XUd#mzhw zW%`QU&NEgo8hXz?vUx;fhRkJLc+V}1*Fboj=KCvxRkX);ELOs5-rw$FLSpa6XNKu? zWS1EGaW=bOAeH#v=ARLIJpIl3ySU$7Juv@6rTde&gui>tBFailG2;_yP8bb~<-XoZ zkMC3aTDBKA7NU!oEzZX?OeXK9z0A`0QnyE@=YQ^7@1R%11VY4BO@3iEX1gv6ck4~* z{>=sUJD8iXBaStClNwYGtIxvIOrNA*OxIS(+`Ihu?WY_=N(%^$n^4^|K;QZO$0622 zsMs{|w4X2@g0U04^75SDSN>OdOVTl<>9<4mT!5PbfDd%mC}oZwPF1`%*))PtB+vDi z5tD)FlRck87KnU)Q!am1M#N(~%f9+XL-Y96($d=Ty_(4_TIQ7N(bH9IUE4BpBRHZa zhOf-4%_70eKcO_{d866Ottk<$-u*|-D&Z@3mAJB)h5`6}>`8 zy$h@u;nJEh_aD!-C7qvx5ljJ2)c~_`cxp06x9UxVxIk(w(5>>jO*Gw@`*QrrJvSH4 zK7A+G%916OD@IxaPOkS5p0(PqQ!t7e!h_c=C^M=G!<@yMvSzLnN>jCGhOt^`dEWHU zp);K?wx$)e5oXGc5ZSVqxbvye<8PnglaVR?&eQ(^*vNl#T5R+B$`0Im{sVxuM61y$ z`oR?z0p>mG?$wsB2v_Uh)&B#w2M~ehZyz-?303fG8*fAU*Z*-jF^iw-&a0A@u9jqz z(P_37EL`UI%~PC7zyA&@aSOSh7JL(xCKK)Uui=2&onkfcH|o4Hh6iDM;idLdky1C^;-`;%nMu#VjS8m7do)BhKOpR!m~(fZ z;$oqGiE3e>B>IVnsMdyMk5p$Yq`CC+0YYtMHJ`lr+xV5O(20H^TY~U+;)@WG8BeZ9 zw2i&2Y<}fH0)c67D-bI!rGAn4`y$-26kv@O**s$sCH*?(w|Knj zb9KUI#Q|E4?#V0kvj6wX(_Q56d@7iE6@;Pp@uh#HbX66w7B@}*8PvlpFeG^M(c0$2 z+sgOJo87ATKAzj{tu?V11G9Df6%Rw_OSNOK^f`o<1-#JvAxGDDnc6esFLULuj=Xp~ z#;9AMI~83yr)T!S;8w`Y?E1L>j8P_5A$z8BHCM=1=89n`_EX#2LVd}?*HqGY#*yzQ zfqG+@%Vr%pqHFI@UOEc9|8)+@?R7ufpinq(FRO-N=3njlXsL4ePx)x7_Qvd&3b8^a zB%*XoldF?7n0?-)=v__IGiU+4jcWdCedt(w&vzq~_yVowQ|hugz;o1A5G;4*v&uwU zF0igOTJuYbPfO0D?~-T}iIfWTq4T>rX8Y%9gWEA++%B%nTzXIe;UYwWu#l`@7uiW( zbXHj7dGm7aS!L!uM`rU|eTkx!sf-z2&TU!iUkVi#p_nYh~|0#MaD{bS*4QdpN(`+9e|+B{Tvt=+n}5SU89o;!Fci^=n!^Q+ zbX)PYD7QGSlI?SFFXm~rmn6N}vNj1SGlz+s;D2i(XlIxC3&9>TT=zRWXlcJ*vY>eK zB$G11Zw%E-*E|M=GVBb*8O#-;+0wLu?q!BB;54J*!77f z=6$v=?TMRKf$Tski7i;pd&}t&OmF@<&y_i9VX3qIC81s$h z=Y4NToBDD&}^rwN9|ry9nv3i7Mh zm+ryKHD7(L&HFA|8QFqv`sgy~mcD%uY#HA)B0_cu>jcFx@GOtI#m;8SmSfW(c}c_~d?jA{$|#v+XR8 z)QE4WxZ$vZ;I_>sB}!Iad2sfwrRwm_p+}|*JzeMGznbp(N;ei`^eC>hdxM%4X|y}C zrHjs<^ZzdVK1qLmal!QFO||}okACsi*wT?v&zYYZIokgL*!d31^G_5u_+GR@4z53n z`FAnIGQq08zP{$B1zK{WTJ}lR=8HIo20os2>cMCE{{YXg_*~*0sS4x3y~r>5Bn_Fl6K|5@!`^Q)+_RITrl zrCXgyeOZ0j+M?xya>>K!1SG{l>CQFJ6r)?`mwU6YANL(D$(v@jzVi!e{*fvokj+rK zThcikXO#x~ERoDEo7@#>2S9zzRa63sqcr^H`hRmkQ)+Nkj5KaO-QMRQRdXd_GdA9W zF>XNP6tov;ZMUtMM%Q|t1J&0m)Nvc$E0}d*tPyikOa&u z{b+`d*4s+0L&kp`@c4zIzFZo}G#xo|nHu$bwEV2l@*SQj2}VBQZeUZOtF9o@&`eYj z%%eZR?739XdpWOO5qPqi4<5P@1ppB^O#$UBVZ5r<^&GnH(vpVyy zkJUrpUj$bW>CRJsEf&45a3%o2bNO}zL^$rsz3%(j=?O+7R71b&Hljb#=k{4=Jr^}i zkDOP2hR;gf`q$eZTR9XXT>2O#c&LZWHFYHjGv$lW7cu(EZSV)f7FG6K(9|3l0nxo* z>m1|^bgdM2U@`a7h=UiSLL%{!?ALH#_1VrMI7?gRT%A-uZlk@qTUsuf} zUHh7hg`2w%bOncL~GmJ?4%*SU+q>KdwClm zk`4E!#v{18?bmX@x%~EbKOTJ<{}0d=ewyZT@A_W0)*2{h?fCYPWN;us`ibF7-GKRV zqWHNJ{(5SQ%CYCcnx?A8(=zuE@mV*pj#Qj^6v`b0d@g)?PjL7r%&F&v}$v zOl_K0@PWgpf}|56DP~CDpz^>;}^{Et$oM!w=!QhdQekavn!fcKUv)~x?1ctsb3aW7i(lP*OZ}x zv6d}3Zq{zpSPEWWHT1NbW@%GfvUQ3xEM8RCsyp@O7r|H4hdB}QR#oz>fF6rLJ$ZGX z?B6W-BaBO)r43k0tpl_S+>NHN6cD^U}@8;i+9t!`z;SWD6 z_p$b&UG&UAyuzFmy4q&IC>~RwLpHN?Y%`K7s>`%b7be3rzOLz>WQ{*MQBxN)<>0Wk6N7!5LJdNa(*JJb1wX?8N=jdeP zE7i6(j=%NvPZ8(7c{FI~n%P-(dn@d9j}&3Zwd+0FG^{YxQ>UQ;N&h+Zw#@wA)`W~#gBVf@oa!R!A3qHMmEa2ql7?=v|CPK$_$Pkl9Nl z3+CtQaBY|ZH#Wb%ao#pLmikXGq@*K?MOsw2)~_{fWWNck*>c=^wYjbL z=x>;9*TKnyOSgm^hX#Gu^IVF?i2hFoo5!a5C(XQlgCk*bnVCV!D~}btxDbF<`4plo z7=-M(Ds_VKQikFixq+p6iJ#`;J2&YL8iaWB?He8BmoD^lweb#Ye)OD*ASX_l^$i6j;~fQnr{GhT zrg_pH4;3`jvK809Q{}xcSJq4Lx?V!ak9!UH`sU15N?UeD)GC4hD$4?()993eA|~mn z?F2#1PM|JQPnJ+LXzu^6*-GkO7)w3H&-b|3v)H z7LNbZ{NvsM7eqX z_gOOK|B#aWD?>f@mOTx3h(^=Y0G@$gGqXm@^B8?2(}JO(egD>D-*wk(JZjNg{{a-b z+#pqTh?_3L43oDElyqc*y26Tb>{1AS<7VaaIH2qD4iqgPS|zY9fkh@eU;5& zgMy_YA_wW!f@42+>Uj-P=Z%G);>~d{G;Y`_4!}wUJ6|iE+-X3B{t;JO&j3U<9!9`f zm6!^d$IbCk`fTE3>*ES$Ot8)MO}Jphe}FH@w~k1uyph_s3272t7qP$O8d*&5`Jet; zx*26AQmN8E=5JTYww3|%7@T<{{bj$?beyviL0H0$_r0YJOdi);d(>$spiNQ(8tT@c zu0JaomLIehp_=65^>w@e;!4=>_zix#B2ZFBJEH36D>{dDrhm83prFPXsvNfr%Uw^k_<@4DQuld*z*S zYNb=*_065k;mKzAzh~q3R^7tNUnkjj^b0xCchF2nDD)(M6Ca&psIS{8(m+p1e7}L? zgL@e%QHPL;Orm-9PdLSq=h*|`^IuKB}Z7okLFaPL& z7?Zl3N1U(NsXH!}UBqUSBo56%fHil4#Ou&K=A!2d=~wAIpAO354dTrMvE{Hpfb$eO z>nUgy`;#Jez~rdENYE|}$}6-WS;6b`%j{L6zZU@1u#V^Pn8PU}5gNC4CGz zCnp2~?c*cuwp9pi>7W;vzeY92*5d2@+E!(Kn+}iu)^+yq`fNGFlRG5H8oK=`jW^X1 z7G7bCqn4jgKslU<0!}5F*E=%N0FKpoF=_MbY=sI%60GqOWv3_tyUZ5dc{+0F-LUcN z)9)*|D4;4krj>&_A1* zkp8m#nQ=X_orz`tCn9-ltn2XQl^U0kR_M_eh@phZUK%La;Rh0yq1m_2iQhEdK%Y?>-Ej?{ZM!Lfr)b zUUkEO2RI+w3yO;R5O`MjStJ;`h3SAm$OGRW`7=^L8)?rk_YpdyQ=v$cON-e8(W4v9JHc+v{+`&l zpFl;igN251W7Ie&NbafEwPB-9|g(w z+~z=O0*;IHLjMNys^su$L~)8S*Mob{ro)#vmT5(`W`D!^E+42{wm$3Ug8HJxol$Ht z%bl~{i&Rv}Ha>m!17H@)NNmROA&NU^8~Wv0l0&`pwA`~e(DW!i8!h|kh|}h8oD+i` zfRcphd89{+G=#*3o@K2)`DY#cFFZl%MR!|xypweUeHGw6B!I7`vn=-Ddgf3x%By6; zFUCT2mcx61{~jaDAC_ghXSz%+f(hc@rx1d23K5lTj!~R(MR0~68+{9hWcV_j!m~ek z>?BKM7G+DH9S@(3yef1n4VozYobn|{5kPllCpskaB4>;^QGL)ERkgmz)SS$woL?Pm zewy3V(Q~SowJ#lQccOhF6H$nIMK4aFmt1 zTk!H$)&?gu_19|8eSGRDp6&s46yrmCae~-bek~+>ad=a{Bz~ZBj@b@Q7aTEqG8A z&*n@kEsFi@Us*_{kaWqKonR}kpl8sOEKyD0P_uNR6Lz@XXmQv4jzzqmncrmF-_hmJ z+M4#a?}QksBn46cLo?orUN;xHZMo38ajLrfG0;R`D zLL`ex7@#Bq7S4OxfS(@&X98y;wo~zVexU`nHOUB0WdDQVT*3%t`6JEqz|UUIEzoA| z_|fRv`jKsDybe1o@p)7p5I|=Q@)m8hN$jKHraMV;u%}ODnSvn9N>P#Y>7Z++ETe@~~&_%=gN_nvF&&85v z>h556aG{G<=2fcRNjMh3mNI}F1agfqo+SlVkXFQK$~lKE7gL;qC1+ z1{ilA3I(~q=8YG7!)(1I^7%j*3+Q9$!l|rPdSbQ#-J_EXd+BGb;oh!m==`VugO#0K zR2c`A6u3G7$SDLxAtk{|{mMSkS!YsL2S5-C!w%|<=0AP&%vmJcK0J~FS%Bf`yGy(r zUZ4xqm_y9HEN8DLKuL6#5~O3c&|!k*$DV&%^I_@o^5Ndl)@=T9E0(y^va?l{B0t>a zsOVFhl;JH22vUU2(!AjtO7HS9KIzL8QUD6nrVAdpeTK~D5I@q`7!xZjGN(D5s6x<# z1V`PP6~Dyh0D%ayt{9viiXMeMTOd4);5vLkt*XFSU!~f#o@=geAN2fG=xCEL7aWqk z>oU1c9W{|0+Cyng#K7%#kaEW1-W@C|L$h-TB#4NhW+}n#aNg95S)Ba=Bo3vV4uVGN zkg6`SM<;-bHcBvn?jS@pyn=$a(-z*X`u=HqbW`(krO|kLtI4Rovwz)c!49?l_*G|r zz#s3Vb$@Ut$%jTm)JgO+`GC3$G6oP}7EWI?h!?eN7~#{=Gn+Gp&a(6E?AI|t{eHcn z9zC=};tS(quDT1NECb&=gDotb7Mf~;ZR?xl?~m-CYKxytn>@mL94{YEjGUiJ?SJM7 z^n7}m3)~k{R@Ku1a0WzZY^T^*yJ5(zhXp{$*UX$o@vWf@w%Li<#6sbW^Ljyl&R&Pv zU0nwzUNBM%R;9_qZA<_J+8BvMK`=79I3^7_o1FN9o2nwrJ@Zz$Y!B;BuuqO!gT}0Fhf2_xLguVn@}12;Ui{386(@-k z$i~Xj&pVU#lBqV4q*4Gb>Phzh%H!548nLGos8j?x=+t2=MBF*fAJsw|%F$u&07Qcw zQzO6M`m`QlN2Et_wq(FgCW-|3z59L0i^-g%5l_#wHrw#N!m0Ctw84SGoa6QIt={vy z&B@_2kRhX)PC=zv5cuzp+4nu(%xeA@&(()U1{>ekA%{8sP(i<)xFZ%y4+xa<^;=hcCtb#SUDocWJ$} zidDBtiJa>KlFjCcQm#CwOGvOaOU#`A%X8_ugVNOVeZ_& zX!y0SavcKFHP0&>-|Hl);<1RiKlN4;%%>F>rtpry&=l|fNWdYQ>TNjo* z(u117>72&ryifVTI9@73!Kdnp29_&J)C|LR+msh0<9?I!mrH|~wkc=x%BiE>9u8X4 zPM|rG-9R#O*e9hSF&M`J&AF9Mgk4VgGhNT0FBw_USpJdD;6(NW7^7)P!!)5|kk~;g*`5hpbz@#yf?)N7E+GivBMR_)bab*YMM z^o)Z#d~h^ezHB}GV*2=DLBd|JNA9mv%?Ba07eIeWDKjl~I&gGor`QZ&i2bqhK%RLfLxFs zLUsgo04GTo`Tg-{@3#6!kM^QhX|~M+p|=v{>(kR|=9Na}*tvs0CW*4Y{w-PH?F8ju z2n~Zyd4WE5c#UIpMBrD!R|d=zub~r!4wk`5!k>!^Ue((3-??rq@{}(OJmtfW+-SPa(y)OX3S``H*Y>V_M zSXBMyDK^*Y_v{w2EC@dq`GJiHE;6~F!*3M5bzt3W;WE}*{vY6U$zsv4+0=LcQR;V3 z#!8zRN(8Hxrof2+!Z^C@#Qa%NbOH`wX0srYawCPq)TZz~w=y3D0k+5U2y7)kr^N}@ zM^9VU+i26@JZ{;n5|?tCD`m^geaEfUX@oUSAwjq60J% z6^-1|a5vw6!80_f>y`C;t5r81h`pGXECv-y-TE#o)%UFC=UUmW+3Ij}bNO94b?Y<3 zZcXXMmzm1yswZygO;TAcF|qS<-LV6oW>X`&qptf~#05jwqk# zoc7DtWPDED&_7M$>*bDx@_u+ZuI|@w%;s|kob1e`*78k}B~!AJb$|$%13`8m+r_hV zaQ9|KJhgf`SYcessrq=Act_wY3R-~?|N4g$0Z$q7?t$~9lAz|%odBH9 zZol?(0&kFmXcKS37Gq2K+6EIr1Qx-)=Uqq)=(*Ce83B^S;{mAtpv32PJaoq>WjF9} zR?fipQd`5oAkR^oxndkGeR9v(?P{sD`lFFa)tj+U2LRsg*c7+1baclkcF_ z2u((^V}PRS3r{;Wn}(AcBqJxH!uEJMkWAaL*aWkh8&#UzU~AmM%q&p-dUU;joxO?} ze~~R(8=AYT37|mF5H3C6G6q6O zULfY&HBatq;U3@z#>PcWUM7HT62r*a#Iuk0AQ}Lt=U_l$Sve=XB@b9Ni@tNSF@v zzw5N30iuXy4u&n2Lf=9D(G$Wurko%UqgSFu`D_YPf8Yk}?;Y?<~+wWjaDBcV@q5nbPq`spIQK{dTPv@R`pz z4ugTV6~=~=?!qFoNs;ACf%znB#;Pw|u{dm=KH5Hgh1T~EbOKn+X$d~sTV4rGH1hd1 z5wH^EoF`U3P)US9cNPHXWFv3N07%p@oSy_hREmZsC$=84F&1FQ0y!vHVvCphIp?vz z-yUx>Q7cB;3Ve_J_ICGIdk%a*MJFDf{-cyQ32F<})MaeHyZcL1S>MKIiO)`b4e>{& z(P`{3WUy_o{@87s#h+ODNBc`wL8i7M_(1Gv9XBLaKj$k&s2XL7x=a>Ckw+Ee+OPe*6JJ`Zx|Kfv;l&uv%?MDr-< z*&1(nWr4zMYVQ4>AJ8o%ef9&B!oV0j3x>${-1Q--1G9otb0+YPCUfcU)Tj?=KP@bY zlSM%2LZOUi<0KjS54E$nbe+up#+wG%-w_R$#Qa!@?11NbXyl*FlxRcif?67nGRq z$2?Kw`wTJHS6@el3O<;gay*1$5l1w3;*F&n&nh{kZA;ND7?33+V^IXF+&J0aAd_(8blYR_prk(3Z-!>A00+ z?dCP{Q9#k335VfCbqA>U%|9%fE+-5gp4_72$xg5+uM$ajp;Zkg=9EkF=iXQG#s zmRQi-UJR)48s~byPjUc~6og+$^fp~_9n&&*KBAqBjIKZ{iH0Zbm2U*~jXEOyvUq?i zyd1$eBh-~I03>V{aFU0lCn9G*DRS_tjIv>9QM@_~0Wzg?$@|9!^E@7X2bROwT&8L@ zFxTtorBK~dV-NmejY&#`?7q(g} zYlySM;crf(7+FE7%|z4^$R?Ci!zk!}ByvHl{kEMQkC*ypzYf$lf41^=mLm%dJo}z5 z?rHqU$`=J$sFa-WrZSXF%Y`!#nj4qdi0{T#ae zfoQQ-{X!42S74U|#71vAtYKgu)A1*O+z|i*6_b~D_6H#SsBsP*3X{&p_bn{e?RO_QP)JLa zpf}Tu#yjR{Y%dN>kxoDJ+f%G&wNOUEKQm47Ab5n{`~sQ*=z;S3aaNN}m0mTF4|Uf& znO=2ZJx73O&{N;TIlRmU7>mN`e;Y%QW>QFi`_#GhB-_jHvojNn@2r2Mwp%VcZ7-P; zYO2G6Dn=K>h-P7aljqL|jlVtP{+64=j|k)Si-Dy!h;cJFr-hQD@W=;<-d{*;k>ZDk zrI$SXS^0QcF(NocrD*JjK9B3nf9`LkpFe0HOqwQtqA{pud;{| zY*%zGhm|y_c!i$%?Wg?vtuN=^1!Nw8g&W>*V0&Hz6#&P1PdI*@>iq3yafKFaL69CU zFpv9qXi{%+;r>O*kfaRmlDm=35=6ngO5sOYF7*?Z!x~y6i*3a#&Ayse&$RbET|do% z2MfQo=8WF6EF3((GPUPtX7yfHVXKTwDtR3ZQ0$HX-Ol|z4zTZmu&I#COa-FoGP5j3 zLg|mcm4qjVq`j1AfZ3U)XBVcrW!S2KP4#Bd-fT2qcLdOgXOT!?l(I76H*yVvAsY#u z?h|3Vt7V43?MZ_03s1qq+jTNu9x-!sGr!Rr>BprN`_03Xxv29dR^=B{YwC$3--CPi zTlZRb>oZ{CHHRNXm+^D;xmFh{yi6n3Z~!nownL-ILC%MV^%tBUUqEv!9?y?Z#z=~^ zSqXL}gS4NyryrHby`eo%W%+n1BTnlS$d1WF&3Xngg++$ef#s#Fq`x@?2mpF3w^n<; zEmOET<#aXGlf6t~%#M9Dv?mw;)h?X=M zbT>G(d!It&)Y6FlEjs?iB;aG5;#e!>N6d61M&de(2SBTpaJQ4bYZkMfaQ?5UL|cOn zO}sCP-r(FRm87&z+g9t1SaW*Z?~{{el1+7c_x(x+;nB49xq{=T1H%XR6N~7Sk&ix^SITfcZQbu~L_ zbZ)yQHnU#hdA`a-#ilb-Mq^Ub(h7r-lRfG37wbZZqvjPaZPxE6seY@n($D_wV;-}o zSb53FWG`oQ44zixgRw4{``Elz*&EQN*f7`j;4UZ7e$I$HB}-6i->L!ti$K#aa$sOl z+Rc&pEanvo)EVkSfxX++2D7R=;u9Y-B03ZSkx3a%Gf99g)zk&PAn;1P@zNt}Ko6fBG>enm{8v7T9zxlRU+E6}jXlQ9D@7WYORr+Zz6yJdC=wR@3 zS}`^_JLFHa636w<(L%(Km+t} z#=5s+Vw#~Q^J=x!(AIL%Zx{*-};qdzYj7Wg+c)$Oj}-O>XYDCTim7eyI20JHJx85|mPkd!YC z@D7RiL8Ej#4kKX%g9%*p8}!WhTDzt`gyA=OHk`f?~_U`42!QsNMt*5o4e>_i~iC)6W#qq8bg^t}&h|!~_naPV9k3B6O4Z*GV zUuoxiF7xnnciRQ22OQchB*ij~QdxhIY5sgM<5xs_AdtM@dIi{{}- zLUW3laPs@EkAHs-M4wzICK(VkRmT<@n)#9Gzjs&@Lki^UZ_2&A@&O>Qru7hTR-=02 z@TS`NrLA^l!aXl@OvBQA?t?Znv$nXC@N-5&Ma`|B($<|z2N$0nR_xvyIZjd^+Qk&4 zy2EgNz|W`T@~iNX9mqrnLGi{k=`Qcn@u9VLlIS?{L*al()29g&zdoeIf=iBl+D;xnbDYF1UzC5ui0ISg2j8HcKrRU`YqnqL-?bk}u47s=12 z=uJlE^W!#YFS#WR%uh8vju+_iUi9r@fAgG zZS&ep#N@em4^t;qGiJisT(ma`0bh5>A7QD<}gLCWmmiA#m%iS$UiK(f5tuRxq$i~vx5#;P_x zo;wC_AD2ungNGvn+w3ny@qac+$YP`c=iDiTE+pM|f={^2$uYy&-*U3RsbDk%o3xOl zJg|_^GaMt6we#WPM`{bA#K?_evFxe5@J@pVn&WR5($xry+3mvdDyrKFW;uvrW;Ht) z%#6V&LZ{Odbt-;fiWjHZFoASmWn%IO4I)IpPDs8WuhL4GRSJ{WwfKWETV;jcX!d9~ zJ_t82Xjk(baEin3HjmZrHYHXp?JbusW3OHzCVF8+kLcS}JbhNqhZr$w_~dm%rznO( z;Tt7z$tDI!GE-fWvP|+5*sIBaLodC-fF+O_iOWh*iDbmO!mPQV&_F7ZED`!3n#mp& z)Cmpp+&WPY3W+pNb<=Be3stQnjxA3YlwWe{KzaN^L?^uo_W}}A$q0=^Bu8=@r4vy! zgMoU8t3FU%3fg$cU&yWWpvHU1LAz_)SJNvG*#YKe{<%kCp3H0V(s}i??0mA@mAU{O zJn2iiv#3tzg1S2e+pf#oC*QTI)5?Z((-W{-vTc+xo8u|QwxOKen*nT>2Eb~TEsGzF zw@X$N?SgL`^3)h`C9le7tuaTYxA@*tHKHoSi+cc3cb?8YZNPDLg4nO~5HK2do!O!Q zklDoMA{QGoxpoCTFB}JpNYXbEh>S5=xd#@JmpSJ@a$N2i?8W5daI3AUL^f$77adpA5oGotjS81$;UmX+Ud%FUlS_G<=v z_qP42sn}^k(9(|XeZj%jsbjbDm7I*ax}Q_W`OOalZv>AlnV}u}@E<)O?h+3)8t7O- z=lKb($8JjFS09gT==Ea6Tja#y3nMP;IAo?aOxa(`&4zgLvS`jEZh9?NaMPNQD*xJE8bknb~eCB5~)Sr51v$oY-eW>v1Z}(ZXd(Ce@T4AWX8yg7bik8%e3$Q1J>D<7GGQ~}^>U?3JA^eN?f!Hru$)R6{yJkRt9cbZe7Pbg(EfIfA+ArfJ2EX#Ne&`Y4x`O0 z*W{SS+3EKi3t05u%05e&q~MmuAGu8KZciNUJSj5tY^z&6B*dBONBE;WG zWCI*#Vua}?i~jHA7h~PBDTwsuxs+LaS%h-a74I5*7LY&L{}Nv5utu~$|IfUx&!t1- zZ-m20<=#d!irjl?ji?B9C(MP$9EFmw6R9TSn|VKX|IY!k9Ck3il6BuBL#{F7ij!(i zJ*HRHHlxxkcu2X+CD8vO6Fj?gv$?mxV(6Rc&&Qi!D$}xQKgL8}1tJ?Rr znx>Dmmr!zk&2eWmV2#8x2-nI+Bq>)=cB^e5;DSjaGXAE29RSck# zPC{jU7ew$*oZ4-+r*&&@6Hjjx?E2odra&EtAjTp$)>4?HW-d?q@el~%V;OHZ{bib~ z$ryX9ted^P+dqY;rIOX@ewI1v@nvYsl~U(wNha%AxHTQqr)7IzM(wvCm9Z-Cs6PBzI+JJ7ua*`%ep48q-PCe0QlJRZMCZ$g%lqn_4jy%=(Hl6SN;OB#nS( zk^=4m=RE$Ji%PvWCvIC#GFSI(?xgMKebv)5mlR?n2}w>-ov#-wSxV7K@+9MeKN?Bc?!;Kni$9`2k#|RP&Wr*xvEM2J$QBV_Fo5T zlc-Wl{{X^k;U@z-zG71AX$*2olr14VjFpZ*mHc7jUk`Yq>25UNhBm$)Q50y+YvNr_ zMUr6>Eb{qRHgY6BbgI*sqB~(?RdT8eat87nxP&5G$O5i54NPAu<$)VgSF&B8Dx84W z3b`bxTJh(^H6-O~ocyg@l{mKj+pEr-T3O!Buf?2H_{)hRmnCHzHEBgqdV8rkT}iiR zdvdFH-rs*%{8sS=#A|o!q>RkkxBWfu@sOPNY-t0xqbY5Tj$ z@>A1oCX&0+SzoF=dBw5OV$w@g?MB?r-t=P{ZeFXC*R8&xPuc@jk|kKYAu2g3Al+%L zTo#C`vas1^ghW+=S0y52wUCg>A%+i*zArKX{ex)&zTLiUhNhviAIo6VVo=I_z?lq< zfrf}-o8jGm#y&CeJ>p*7_>aT@t-NqaKB2Da+Kt`J%6CtFJok4p%CcWbTHbRx!Im(j(!3^Va%2s8Za6 z8fB2+s)9i*2n2xjWBwX1#gP?Jqv)lBDO6Uu3dE0>B~ok>TazM&1aJ!gsqhkA>M&q0 zh&7Xi1Z{1cj1Amm^Zn!VU~+dTU^JSQ$Zgv0w(8vNGf5(z+^N_O>|kMb<3A_^6xR{f zNm37CIJ=qwfYc z(yM?^Vj2~~x6Gq&2XXnEB=s71?HS^THu>6Kibm47n^oF`0@wh_BOokuhG4}<%Ak@3 zergRm6UX*_?m$plT~cmX0$GZic)}|MW(pMT1cJ;+VB=wG2mFE_Om!nscVX8bcHNtA zBj&)*W+ZXTEc+7O)RWtJH+Al=l$zaNSN{NSTT|1@{7m8;x}uZCSDU(R`$$8!x>I}Z zo{xJaq59Y1PmlM0J@Iyr;5{$J-VN~Hw|#SDsp2hW&f*UWnXWcVE}CWgM3P-zBn>1m zOqNE<`s~AQ6&67$^-qo-G5F{3Ustr#bw3OESH+@TJ{!pVO<|)QGsCkzQazlMLckHnt_wx8i|6n|xS*TL|}VV6_Xbd5h=)a~^77BO_Xeg3fvpq-(H zD_eKfAh~@oVeM_5*T|PAnbe$@Go7U46yltc=H<2aY3ZwRY2RgY_TC)vw=}Cp6e?nC zMx{5 zh=eoiD9#G8K_`~GgYIl7E4QQkYyGV}S@Y-`c)o>!Z@1idAHrT1(gK8i#cy?pV1{U6 z!|ipJ2S9)oR&s^U@$=#Stt^Y-Jp)DXgwC@>lEdM%t!h~@#GpQ zPy1P1ve=Is_)1(w6Mdr7O3}hOc8*hQ)5qaRqLxVJkrqG`?9U)m8@ia?i<_U?-r*L_ z{C}j|My#XFw@oI<49Vsfd&sm1STv4QHv5Gym4JhvEPEc7b!J4={{XWtlgvO+{fo$z zmOzR^Brk*P)A@VMWjkZ2CXkWAk#~YmsL%#S)d1Y&hh zU>f+osJj~%AK8g{_E`%-cF|6*r_1(J;c$cR&k?IQpVJdivH`BH7D+?yRBrjZb!RZd|9=(X1G7J*NJsAv1CZ?JRjp5 zt&y^{+dtEz@b$X5a2&#I)gTUz=^8YXTEKs5D~kfL+WcGiwSIiGVL5{T06{DVm3qIonGQp46*?lNj0=4H)5`g?CwJ-nM1sL zt7+A!;T~BjMa5kuO3KYOvW@n&zcav(5csKsYMg(zV7-x(biIyXE9l}O;B1v@U9<9vpeXLkt8=KlZ=zhuwa zAL2FDwXTKm=T_4^H9X#J)~n-KrSM0Fw8+#blKMS!UV9szX@k=#>8STK1ST8m70dKv*l?!UNP@&9kgq6_kRnr?;E&|Uecat zoMpIM#m>GizCR60QPHJFFA*73lWi~Eu3PCj!$y1+C+*Sk?(j`({{RgMtm-I;it3&O z@a>RPF0+++BkpkdL`ja~=H}x5Msfg@hn1N`vw&5Zh<%KUDVgJH-wRF36Xt3X-VSoRyZCOL zWqVzwv`<|&KdX3K!yYoLio;dnEblajK# zm6elAd)m&{bcc9XUAdf&B+&4(j`KyBkBjP76$ zC)=r3Q=QB(6d`Xx*bTUgaE^_@ch0L1t57Zd&fL-(SAVcdo`YBRZ0kgNjMrK2+Onq?7G^ zW!=6`?HKdNxLP(_=4;G(WMOj50+PgS+N1^}XnealV8xP-o8VdeRduN%%IO*{nUqCx zZL+d7$s!ksqYTFb#tBLM!sH^_5YiVk9v6kMr@?mk5WR0DdbkVT+%Ps*>s;myKtm78cxnz@R$u^U`U#hyk zyWd{K!vlz_RL69sIr$! z(RFxmrI;kw*DS@kZMiuckSRtbfKXJXnPw{$Co5Ewa+CO{dnA&&k2BF}Wp0L5@{GQ1 z#o#H)r3WRgRjl00&!&03fI6Ys+8`ec^>02O>+;V3n|PUgvk{twW+ zZxy^2x?s6C5?rT>d;u-NH`2jx7nfopL3WWd{it~p{)5Q^sw@!b*6TNF|uuQQmqYicGYU_q4|NTf5A0e-n5!8?I{J-!bW6__?O`g_JbQLk`Yz(j}`c; zHD}m2p-}A~$Wg$WA;)Wf@J*kLlLH-x#qWZb@P?bqT|(!_8Z*ft$1nE30!wSX*feU5 zeI#3v$=ZpP{d-H>TZzP$^E8bbGX!XSn36^wQ>e@g`%8pLmvm1d{m_&`$r9&kJ|k@} z?NZ!XT790**5dl|^HS8I)3p0bOM6z9;_CYK;1Jna+1W+!m~NpYooa`= z4$oE{l0%=U$W?{VXXL%K-6u4YuW8Q8LoK$0M3xKaZMa>$$#KW zOK39#&lj4vY*C_(lTfy0xO}}o{t7GmDa9JZ-xNL|$TnkrzwGU5+kCGueA3_iN57ro z2YWofJjfKVjadw1g0f0Vn#9wSicPgnO?28yQi4rAETd$!vHa~lqBe%No{{Y3`h#wHOsAP(EgTb0D zhlDhN5hM2xHQDh!-N|ywO~T*k@mrY{uc0Gh4i`EQCZz3zVR&Ak;9fG{i{TgBULQWF=deVyvmoel{H?P zl8w22qLZ^q&dO4fz4r6a`|c_FKyVfcl$JX_!MQ>Ws&wkYbrVWD$_mLQ)st~=ZnwYb zhr?fot9tQGu0weio)gWILd$O%h!DuF_Gl$ki_AEZNiHJ_%us=FpFh>s7rq>{wiZ4E z(r49XiHvMCJ4e=>%-Aa&mu}OfPJ&e;TiM~ai3^#Ble*de0H04Ef5C7X6_q{<{>6GV z_3A{{R>N0N|)U zw^zmsNp#EK+KSKN=8txTCHQ;$IQT_=AL&+bOm;q-CC-PVX&xZfZKFvExm%wR>hUtM zNansPwhxZ0mes}8PIV_%E_QKT{HtwWGKy*5{_WD+nOev3KZu`6?iR(?#M8q|6J9ji zOW9N9jF-D+r8gMOHtp`T(@))6U;0P*{{ZphO!zTtsbA~5x5N8?h_T1zS$JQ?UM|xu zv`q%)(Nb8o4;tS2v1*rs)=Rc{bdL#Xa^Ahs7BlKvZMEBLx_|Tc@n_=RyYUysnum_O zMez#r#y%;$-)(K;iF`X}bED`sQcoZ{CxG;!e$eRpbV)Q)*f6q&9W`Q_bLPu5x5x8} z!Vej0I+|WsT6o7<)^8=5t~Kp%MS^)XSY$3oo-VZnj>bEQBoZy<-R0zvx}00e3oF~y zt$ahKypjAv_^G4#4)vy%Ht?p6sL8GPg62KRaLX>DwvTUPD>SAXdwU@qNbVty7@&qL zc>dQVh8HZu$yB8kQqfLMFukIpl2V&iivIu>t92)9e==v@Gv&FYz8dt^+ow;ST&{MD zy!l*GowR)1?KJsYzQ0f1EK<7NO`>1w8zb{l{{U3ftaKPqyb`N3>G8(^kzJMLi*BJD z3o({b=gVmz%C*$t)#m#ii>BXrj}nzjUkTVYvMr|G$rM)_rHqkT+9W`rFyCAx(#0Uh zks_6Ep6omU6!9*%r)gLB$+#8Q{wLY^+I=z?MV{hpTV8l-FAv--YaDMRL9S5@Qz|mY zI*7Hd?)B|r(JU^%X`csL*juwgng)vmmU=zBd&KJ+L8a)?MI<6)2+0>HS&}kYh-m#q zn8%$;3h`+!SWY&(vQ~2Bif;PeEiG*IKR3*H{uL$6qa?3*#Xf7RM*jSx7^kzAjt zJ@to+^u|j~XG5{@o&2b>#b>X0i%E-9o;chUFxgsOPF;rM5ifDFDM&X#vYGR}d&k#a z9+YW`;5}ExdXNHXCbQLN)3oA;B0~~dczWvU=W{S;XzuP&cN6EXRGtS!wb!&2Yn>DJ zhSEGaB!Dh-Tm2e1WpJRZ_fXBO>6a3dzCdoTG|4Z_hb1Ia=O&h?9k#UTsCdWYZLf>9 zKw`CBO7q1Rnrm8F0LvOIUKnjs?(z$D22_D9t-R7&*nl1GWQzFd&OE6kovhs9CX=?x z?I(VXUD-3t#PQ@klzBPfIda>Y(_EKM`z==5F7Epf+WdFZXP?N`yfHnht1`-MHObP<+j;G_27nMaY$jEIn^T)if^?Lbo~=t1XCiSr$vn-wbQ8L}Xl}vC_5J z)lo!%6lsK|h{Rdkqr~oG_&o&CO|AaXJ}mJR&_;?O()<aOZ8YQYa;B{JZMW&Uo?ph5Wj5+ogwkonDwJqS*NS#hbftS) ztF+&p^-XKX`ta0l{5hfMZ{p2!N|NGfu5=Ae?V`3=w#c%}p-p2Y^GK0N8(b{UE||<& zmPum~%P%=?@!I<8bN0=F`SY;ENv>coKgG=pH=OC5u7U4x4Rz zraq^CCaq_6I(WY75ZYia;H}&f-AQh?33uW=-?S|M02VxN@!R1?!CPO4`tG9Fx;2-J zJZa*2n_JYpIjL!Icy8+c@w{E*tBoH|lULG~;@t+Frr2uMOCqqHB_*Ws4}(9pkHY@| z+466Rm%1Oocr}eH;wQs&@VM|*-^3q?i{YESPe}0|nXJd+9}_EhkZQ+Gl1n{DPJ>9X z)GjTgn)d4M8;DMxEoaK{Kkd=r8x21}(yadg;GDm+2A6%M*;+|;tN4>%_}Al2TU)oc zj!PRsc|VDMB1w1UBx~e|FB<7?7BFsp)B-B_E*NRo#8ydZzX{}s&dWXbsAO6sh zXg7LSj=yPdf}Rr7n@4>j@4|i)*Ze2qO=|YVf~=Z#+0g8@txoCg70O;*Uh0n5YD!+* zPK-oyb$$W=|1)mOFh8Xk0Oz+Q(yNVvS|<8KM$giBlz6Lafq|#3$ zW-F_AXOXa@V&vx@=mM?$gVBZ*O%AhLN1JIbB~;)gU=#aLe{^ zK$2Wz&T{ulA5RTVq*flhBRM9MgwvF*6yGnij<>!2>peYB%lMBs!e+JMIp%dS4xAJt zH%_#+jkGum0z~1;DKhSE{{S{4<8!Ngs#U_|fs>XH{fbG7 zm3xdFZ69Tpb@@ll^KQU$!*|P)bMl}VuOYqoo$*&t8)xyAy`r$mYg4-c*<9YM;pNQAvEDI!3T@Xm!oB*)^z-I#kA(y8WgUp3`yJ2 z~Ta^q>nIe@@ z(rA>O%1$s`DI8<~HxbEhIE`Vv&KFF5*eFMz0BjAzAbE!wBj)tUEN~5QiK}Z00Bv@6 z$s9erGX}ugM+kCoakQRt2`%@k?0W8~2+p%=K+Z$jVS!xZEUF5Vxa15B0y*bBFsXK~ z+IHPIyX@0;S5{w<&gExi%^SP5%@uu{x>{SNwz|`))syLxVi0kYg1IBELC)0}JdZ)n0V5bGsOk!S?U_AEj#gIrg5mOa0h|nuK;UOQ z)`VK^(gLjnz~u0gF4t4E70U>Q0}So~!OzXX!R>^cxh$|eoO_y`nycG$)(%_iO8tt0p3T|TCQfJ&w2q9N_$z}r!k_o}C{bEUV zOH?i!WF?q@OBE(2C`y!KU71jWk^l-vO!*&&ykFtnGfK6$3#soiN#>QcECkX^DY#I} zD-ynTNiChr{;Vp2x2d)9--U*w9L+AEgxR!3&YyBOIVcNcE8$A1D#+)$9GBT%j9QhQ z(`xTaJ2!1L*58+!XYRQ#6J@w;J{mHqMp96qroE#33M*T^+g(!7^$Bf)oWW+y1ANM6 zRRM~SKm}9~5tRxlJ2@^kplIS)E(js5V*rf&uepfn{N_nyB0x@^n($=#sT|I#fy1T z3K+6bt_IPH)0zqED7$oW)jO>%cI>a_wd#FjxZ5p+7c8mDP5cz)M@R12+B&-{zm}a2 z?`tc3^TYQyZFq3oNjL;~W9A`AIUpU13o#{*j3pEjZ(~9LE(Njai3UeNSP-k_;45Th zhs|6JUNV~LNw%}mG8ZUe@h+c&K;ONC&ul?u1g>LN?YQJUHMMUM%0Pm{Lo65(8+fNi zjq*yVP-oQkeA4w@flkr@10l8g%o0gz(z5GyWv;Pney;b^p`1AX00m0!GMi1O{3`3B zwVjfBx4X98^z=5lLd&{syP1%NiIvsB49>_Q4f7#&00N_x95(9cw9~x zv;aUnKAL!6#ny*2jR75)#?i;)4GGISkTw-vRi(i!sk{S>;dd};20z*q)RcMBcUMnK zw3D~3-)%S7W$s|O`khr4l-gFZoN7~c_g;xz>twZ7{Le}fv`mY46cUCm(s^EdBnC17 z@|0z4hIQP;Bu#*-WmIP!=fh-suN~OQXLK!1y`A;ION&&!j#*N^Ry}eaMJjdoBSkuZ-CTyu6Cwxrt zPP-S5?d8=q`^#AW0I?P*$Cmo%dl8%7OXM(s)8nOU~iEB^pL*dN*j_22kb zem#n7YbRsjZDux)%el3m%n+@>jyJjzt4_0SSf(QjDdi5<&*N3dxG8H5_LX-7V^q47 z!K}q#&SDJ2xN8ai&|z$02!zOl!5fb^%szjp-uRAY*X^%f_Gsj{R#ADZuIZy_rF2+U zGV6I1f-usD60BsZkfprCPAxv(X49fg5D>Pyjmu8gjG{fWK%z)wYkjgtj0@qNM4*#~ zY_j;#$IflqGFNMM+SSE0ot}+!y|&k>_y-a3Wi0BulcOlN8e0QIIz5ahc z#I_G3uLPWYyaV#__eWkv;6438lb(mul1FS2f~P&OI&|y-sPb`~9OIlE^~m67CpqH> zJbq3b@Ib)H;~40@axid403;u&;5a@W^AldB6?sO_s#-0Y{M&ZFeS(D^Tx~yS)S}v3-roP+(*(EHpS#7IQgrw=U70R2vm6qKXZo0PiH+&BfPZ4-o!(oSr zA!Q5qimkybl`ZnN>1vd zf?7)}-P-^ll_ls(5_&E}V3Wt9>-y zs(bBqds}tpe>mF3l6|TlnXqk;_qU_{7hk`w^-_v=wbIh<=#{+n z-$%N-^JJq0=Q%uM2Oyo<8N*~_u6i7v)bF?sI*el&+Cvf!;;cGn7#JD*zLe45mIEY$ z$Bcq|?#?*$$0w1HX?XQG1Y?p<0Gwpw2d6tvxC0q&Z`*dfmoD2|ORqk@US&zy+oqa! z_ux(jAtj4oDq-+7|wo9 zMmCsA<|m4Fxo;elhc6TvJ?W3yxx;NbkcbF&tJCRHJqfFCI|XC(Z`A*AGBV3D^N z896*uWc0gz-kt5Uw?(G?@1Q+a*T0|qJM@3j;|cQ!1Y@8X2aXG8Bm&2RPfYX39bstk zoM7aY`@b!|BZ5wSdXvW>V;%8~ zU}O?;+?72K*N>F;#t0xUT;O15k~qo8Ip}f6PMA0cBn&V+dH38&!8`5PC! z9+}#C7#YDF8VGK>CIKkyINdSTd0|1_*428MJToH`% z#s&u=y)lsY)*3D`dhHk9_et%dR@To?O|8zDMi&Dd=Qse5n3I9KjH_e@0Q|?;r?)4uIg~-hZ4!x`ha>CYX`3Bm3LN2g=RsElMbbB=iEFa`h| z9{dx|a7oDGwHiEw_eckTMlw0%w{i6y@r-gJDU-p*ao-^D4%qVqiYtrgattgU@Ldu`tDQh61_W{b*G!C@ecT?0 zpeGn31oW;M(^q!7weP;J>wC4Pm)gm`*1u*C4F~Z_YP$7$JKglvTU#{z%wb|sj!4Pt z#t0_^Cj)Ae+aTvTIT_lha}6 zpJg2Y8TZK~o(?ccImb*8I3NOfrQ;m;AY^1`0H4SoP;fE^aY}zo5(8(Dd-Wrr$pab5 z2cZ=8^87mg0ADXHNtVy2owo1meHFUBJKIXzkUEk+okrj~9Cq#j&jW*+naLy`G8-W0 zIp>mkjDBSDFnA(6axefn#~!^ma5)&r8@i0(@_LC}=Naq9P7eT)-)Y8i&Uy98!L4N1 zF6#PQzUy0G*G+b_?s=(u?e=fiUoGvf`xLHmwYcD89ga!wo(mjWaf}@27|9tqJcEPD0GwojoDtKZ8K7aGJ%?_2$9!@19eM4Mo_SvF z^tY9-zS>(=@=o_wI^(kbzc2WIn7}#h_p_ck<360^5ASj5%`@K_z$eh~NX|(hk&JM7 zUb}IHc5%-=PXoWoa6!R1$UdhT<0CYkeFix^6Y`PC>UQ9cnFL@A5O6tGnl-1o_19Y^ zqP6=kFTlNY-Cf(Zy=|tS*7njM2m_9z892@W$iO`0uQ@pw#z_W|fdeFQ&voFFi~-3! zV$}#Z>_Yu zS~sPvw0my%U*^9505{obYirr9o||dbWxun?{{Tmy2Y?qK5_us0>$>uOVtbQ}fnZ+P zkbiM=_i{2@B$9A(ungmakC(r$H9Ug6eV#m=fsRS!-9M)E z*KZ=K>Y8C;{+TMS06B(2I5{T_xZTtcKqG^kCMOXj(>zJTev;RJG`=S#z5e6 z!NDL*sc+C|R)fFZlaNl_oFZWf04XC3GIBXJAdcIC{f}z7z{<@aDsi}s7}yX83^ERJ zjB{H>rE6JyrJ~Vw(RS(ijau409j~^#f5F*1cGZrK=Fz%19Z15k&PGqm<&Tt%5x@tY zaaSV>;9#qIl^Gxb#yBAIr>GbM<~?e%M{GIr%8U+GRFRXBjixSrn2-SZN!oL9Sb_*F z4+Dbu;AG>C#3|rpeK66AdruWVP;P>E+oa7QPGmlcooQ{G{ zazN|Xb^yTyV1veU*Rapy$9hu0jD~Jl^#F|Udh$ACoPmRZz^dM3bAkcRIu669-2{5` zz}xAZHKaTogN!H#XalJ|j~V3Pl1_T(G}rte$@kN4n)DT}((diD*Vjke`p~#uE_XIJ z5snXDNdbr(ax=;Lcg;6!d;y=&Aa>k4FPp37DCZPm*00KbC#xaZ>mIDP(KuJ4B z;7>eOd+VsJ!Vg8rU~&lRROLnvLC!XS5BF-`Gm)g^-L18)(?@MuwUHvJPjjC`CLBTt-#s=&R@w<>i64hDti}U;|{oI$qDhUJ+x)>?oHc3PHfiD=n zz-=ZexIiU#QbARoL-bGvGjz|H~O3w6Ng zb8KR3a@QLad7K9zhfu>IfZXI{;{)Z}l30^~Ig5+Cspb;MSdoBBWk-BuuqPXGpyUi~ zY>~FEje0dyMhlezM$EE->GJQ%Jqcn42sk|F31U;;%G+;kEw6j)zfRruSaz+h+V0;( z^wH?Mb+UFxNM;0c-x=rt83b|wB$5w&kVgQH5Xczx8O~1Oj04J$!yIFl=eP$XbBHyV zc*4IUcibc~=y>3eJ$T1ba!3f;+)KEWZZ{mVw|;pfhWWBs003_I>Sx<0qL=&)uYE1i z?{57A>gidhd+XP&o9XG>$#>Abi)#YK5HJ}ajNs&)F&HB}gTWc;^Kk=BwG=C49l+#` z#FN(;Vamucw48uBJOP3Bi_KB@BFM3lM=Dl4VTn0(PGGWNN6g*%JQ0pfABXkx4KL+?>$m7ZDDwsZ&rrmG2pPc6M?r!>=kDZx z391rVvy=C-Hyn?Z@JSd4?_&p`C~>%waBEm7PzE-r0CwPH;Abc9^U29#c>C2NvZ>&P z=%8heNZ{kCvPM0I^+m9Plz( ziRY1x$Ed&!&Ug)yI<(qd<-S~XCkna7NCXmoY#vSl$Sn+X61Q13sx3~AX!S*~JIVFKoYU^ixZFPO^t6etI-MhB_UR&F3K3Z$& z&OqAgAc5r%PJ;lE*N~$ekqr2#x?WNb9`+93- zsl%8x07veelbmIFIbL^Ua&UMj2c~+HN0Wch#P}a6%8r1ZInQx|a53B(?mU?~VBnHY z0Kv#P&IcJD!vq{0%h)QAMD`c1+qZGZII*r9$X#yB_wBdIFfl_ZStK<<9+V)Esq zy5IC#-(N1zMWF9%-Co{*jqb0vSKqpC%#1S}e(FQOJniIQH()*SfCvQj!65P`7(QEi zl6K=HvQm^^clP5Ts$k+6a>!DSo}KtDe?z|JrU&wl=>Y-|@GBv~LFDN+tt91*x+6)Tbm zJvVM73U1pN$QubOmIrE{LBSa~^j*Lx+yGO6D&v=3+RtUDt*?9PuhVDST^i>P!__&#-l9643t2nnPmWh z#9^`nFWzQA3pY6oTj{89))6Hs-co5@E5<3M7iN{;P5%JlfzH-W@_Wh3N)V0g(!XbQ zZns?z93Kh* z`X||=awKoQ<7+8}xbqk=8w&%w@2j2y-~rV5e*%@&HG3zgHSYO$aMih2Sv*1Oe2llbzhQK_rNy(3LqLg2VV!72p7S z4nf8U1pLLaYtuD_D9ah#N6t^n!OjliM&bgTxC8(OO7*O#gcJk?JcGa+o90yov5}D3 z&rS#!=QZKg%W1|^v{F~KovhZLol?I`_0r_F-QC)2&24pOcJpMOB2=w(yT!$ZKT_r5*k8R{l2;5Cm>|xoD7~j z*=CW3LlhsBK0aSuB&H=&YaJ+~x>_61T2>{`rC643Nm*8Uqrbq*85)L2K7M|=@ z--W#2Zua~Q6VmGT{{RZtvbwtKui?4Lwuh!hGO$Q62i`0Sb?OX&5=I8x5s$h_`G!5t zpKPRUwsHJFdB#XgiQJe=q|XCpZ8e#~lW7jEI`i zo91ZaCzU50U<5cB+S_)pK8I)pu%?s1C(w;3Z0cq_*vCm^#NX2d!Jw$Jvt3tIr87<|eK;K$j%Y`)S)0$_9; zjFOg98A)HPt)fjOqtT_K-=>|mL#OXfD(=msn~VPK_rIHKud36`BhXuM4G>T=8CY^T zP);#`PE_?6z#QO%wI70Eyb4)d4d)^`2pA=KW4IhR1OPJ2yEr2Py<*!>wVp)=GmM-9 zj1VJ?7H$fip#j4HTW&B;0qZTas3K6n0yco9Rlp=j*#ie9k$py6Ckl2AzMdZ-i?p4z zX{ORoc=lSWEqYl#$FGN^s$MNdQM%UY>16J%uC?;Fy{_o}zz88(SxYhV5P$+81Aye5k$?ye-eBnOjDo-jriFt>pfFLuWhy{< zat0KEkV2@&T0?+6w~G8SLji(F`IxUILVz$%?5V>Xh|3 z!$;CU`E7~9kWLSBagt5|I2k7=uQ?pbx<-;n&AT4F0CR=O2P1glM?$27&tsiY9JvQ> z4oC$+`F8RfJg_Gi;2wdG-8gtj2W7y+DxIJLM>qpKoOa0I41!3m7lT^+khhdl?WU^t zvVN%oZoRcuYWk;U_UoeArO>1_eHdpj9EHwt?s1WlG0t**#^aiK(R6M=iMSnh zw=I{;mS%O5IjCn1Oj064}C_;kq9WGIT*DnK9{;Hk+S#{gw8 z0RKP$ze@3pb@Y2UrnH52h`<=n8v@{*lDl~^u^8)vfVs&P>EWpJMJFVZve(|e-PQdq zzP4uctJF=n)TtY7%GzoBySuwvXQF*iAi9snAT-yu*LUzMWV}+Wu*ON+RfG!43LUI| zP*4(Zs#%6;eNyEES~A#xN15kLOoc}5DM=t=s1E+fNjbnApP+P^TS?GvVzLrW?=94f z_Y$l@Fm6*vIB&C?RB#GBzZ71af6=8sI z03^mQ4(Y8WCwnV9+S*@jyWaQmXHT`MS}{|c^+~(EQ_-fXO7gawD=)zunVVc_!Z~e) zfWT)6FbMfV2#_fQEDAAVOAnatG>TrZ!H!l8M+Q!qQGi*Bh55NZA=|?c4g z0vQ7ZU?+`YW=w*kA2>Ny4b&^-kjEU_kHYt|$P{@Yh$^{g^5g~qLk)~b04NMfu>_L1 zIr+>&YF5)lsT{KK%%ETj=ATrX*G@f8@EFU z$zVqG`^ZTlK>(6D%Px0dgUQ@xgY9Q;?$Po91rdt{VUx&xqXd$7p(l5B85-fJIkl_5 zO&686T3@B_)q41KGTg%lUQoohPON2VsVi&l-tPYZ@HVox+&#XRe{~|P9vhC&ATXBd z;(N2yfq?`Qx^+E5asVtbxcgs${t0WICY2?<*J0DF`Dqr%OZ#K043-(5<`~q4g_IJc zC{^5nn-!aAx`g+UZ`7o8+@azTS=rxPhDBKkp0RWLBd5YV@7GI{z^2Ir+O>=VDq|{cHS8XS0E|>FGN7!)2 zRZ4xkVeV30h+aRV7S7}^eaDq92v zD}Y9M0Gxt3=DtfX)^c0ftu3Xr?7ud&KN!w2F{O)3vs%8kX>9MM?5(4{^whZwQRIBV zO7oIHJcT3!yJ!O~k-^F6K0#NHmGfbT131Ck*Cm&noMe_Ei5vn3eq1n)x%r0PbGWF& z;Pu8c$P5DkjFZ=q6M3UJasdYzqPxqZ(~v7g+aky%m4!;J-L$y86@se>DwZsNLQiBBLQ=q zV;Lu@B>I83KG+LbM=FDs1FH;`2R$+hlDyyykidh$&ow8SMnPPF0nf}qVUS51f#fhD zfKkpqY!EV%ck0#Mx_0TRwchvF=6uFKGmND9Qj2Zb$9{=6m7Tjc<*#XDlp)9`j2vf{ z2dDr6yBzcZhEGs9)`w9EjFEuZBP5&*0l~<~$RH9)Bz_o5cN}xUAmfrw2M4AHUPuS9 z=M^xC$scs&eeaaubGHOGPu<2doPmSL!qwYd_vx#(*7oh|eRgDFGeu3kY}L1ECu?e# zewXX3Yf}B@pe~2;WP!oxHU%o*Ff232Cxe5>-Nh)}$Ck-F9FTrt$;jHL0CSvx1`h`V znA#SL2XgXqHkBat0N?|Ra50RWCQtr}Lp z<$j9S{d<{Wv%1w!!U&S>raO7#(>2{U+S>5XG>33v~mg7^7a0b}& zPT4JGDl5v_IHaO=UM&Nq%Vp2{?#uuFY-!b`c z3!G;l5Dy~bMQWz(#lSXt%JG|l@8hjXY}w2KP5VpJCF zNh-h+?Ga=Ny!{SeJ5WhIuCHyc%Cz-*zRJhX;_*?ODz&qO(rLXDwy7;Tw4X<-?tYVf znp@2jYPwvJ2;?m}jya3M*2X}vv~jFxTq-J-ECB(SLJDnq@NbECcXtbH^KBC(0w!qC zE?ze%C6p=_5ru8BmM-$(2W%VAp*=##-{d)ze#cdUn(3+wa;k?%T}M{vUW|$4$Hu$shL4v|q$}#17_G z5?Vm9!J}Ik(YTsay$LK)-0xXof;hY@S@9mbu4)qB>)Q3!tE$SrT(@`9$*9~a0O+wJ zA$w?J0aIc{Dn|l^jwoR-BR?YZd7tR>&f*2ya0d)Wm=p+63;eld2vtBKm~aUWSB-Z@ zu@{Ai{p-lkxFj%E2^uj_7o0N;v0@6dDvYHY$?TJVWwyF&cg*bd)2B;re@14!XN|J zhjuu?+nk<#3t(rEyTKl~JOT!DmN__9AdH^GV>sxzqrBq)gVzU)5s%?JK^P;Z4nW5T zno#FF9zh@u4l$epHlBJM9ofTV91&Kv`P--b4=-Q5ziyk=H1FR1w6&k5pQl4pdXh=W z&UrlY3F<&2oSuv^wDZ6L3k>ydQ-PjAC#MHILS;f(XFKJo4Wzcq9Xoqbf%ruR&0k$tMKlbq&-G{cujv>$yUb4oxtF z(ALCG_9yERNo##{*L%3Wi)H0*`m|pX z1A&0U9h-9>o1BmcBRB))P&mdw`BQ%+;Br`=SPbCg^%x`qa5j!X89Y@j-F{vh9eE{& zbDV;B9h8s>$;TK{=LF-AQ=AOs=OA!8oN>v?=yOr!()LfbzmH9IzP8)UrHNW^Z=Tv; zc)ebmzMETVG1%d-3CHvp9PZ8-0y0OTrjvn_!8{z08yMi^jz>Ack3^pdn?;}Zn<|`ZuPdPbeU|P7?0r`IUo*$IRLLDj5atpZy~hV67S2b@!5PNfDZycnOkRS}%mWd-oQ{MM!xF`T2P2G?Bm%(X z0%)gBO~+mBevhW={rx`s+b0z+?^V$**Sg)e(?qmdYGsKo9D}s-_$5Ij?(hH#3iWc^ zKsW=E21My+BjK5W$z>ah1}(dSK-O0$X+)Lte7lOqjGQv0iA;NQU?{C4}p9!XoF^& zpyi1UCX|zaw2h#VoZx`{32!pC3Y?`Tsm0#gyY}eT=__8>e=9wnT|v!M_7vqg zTJm(GccRrhT|IPZuA1~Yd%Y({z0)Ssn$8%r7RZ;$kz-aW+oT~tReW$?j4(JMfNJ>% zSh2jd)vxr&mPCpvU1N=|r�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

    kyLs>N3y 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

    uFj;KM7!az8pkL-Sf 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 Cp_R=5 literal 0 HcmV?d00001 diff --git a/frontend/projects/shared/assets/img/background_light.jpeg b/frontend/projects/shared/assets/img/background_light.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..0795145f9193d591e318e689863a27010050c215 GIT binary patch literal 2720635 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%0A)-CK;BV6Sy*Izy8%fsQ+qS6 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

    UMUlb(094G4wd8e3 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 z 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%0Dwry<2W33 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ⅆ{$t@v0|3lZ&e58nbmS(d4~I(z3=6oy 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 z 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%0DZAh`dek&q)r7 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 F&vCCl@nvH%EW<^ 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 z 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

    85Oa54@vxbu)m7;F=QPB_L+Nyz|t^)U1& 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 z…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%0AjD6 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μ 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

    Z zaq{|!=1&Wm-lR4(wNR*D0IVzlRlo0FOGf=Li_!$$U}UD>)pbhLM!|ej+T#3MJWcci29vi?z3k6RApWzghPdT#h$gDZ*Ql2%+wPz z?)L*}<<~>kgR^6VRiPQLd{_c9g%#4+F@#4r-WZKf&Fa96d@@y;u4sCbbpKU`Iff^Hw*RZhDB01?e?Q7 zvO;(O^d{2moH$~Fpn;9{>i*4oR>!?%D#(Hg zo!df1EWLTUC33w8{c^W*O|w7WDi?aF5PZBAzat!MF$V&&!pv;$k$4>Cn20;yk^cbY zgscuVfkHF4wI+e3EZo1P4+)yT*}m&WKCpNgU62aAG#?QM+0{%+ZjHrHjD=c$1mJb2~GG zgoRQSXxIu7PpX}8Zt(MKZgv?z=E|!M@I?Iw2&x7BiW9^Q!$z*QHB5cRa8s*^Rt>4G z_x~R|_W!Piz{X(S+y4Q{p#09ExJyz~bI5Bv<;S{!U*BKgG38vdt?OqUWOZJB|2hA6 zH}eylb>@QiZEzC#-2^s7NYlC5a6|F{_hN|qtR>64NSt^)Bax;nJUPo_gWu>>zgUvqRRT`kMEN-8<4WCUo1jK@_mz9UhY;B7cRBZ z$KhRXUS$<-$celOj@Z3>2o923J7dkutYh45Kk(RoV?D{HqiPXq9rFOZNxX~{+k8iN zaP7a38_;Qls8*DU*H1U6jA+U!a@`B~Zf2%im+LMsAIrR<69Q$etgU6r6}tOh?Cxu& z$M^^Pj<85&w)7U3vvR7`ukANp?R$*oR~ZDH&)Xn_GklicG96?UULD9~q5Yr6PN~kE zvuU60NWpP(yH?niKP#2xeT!c&%TCqBmRr`LTRLUXD-5_D%mSr+WU}0P70jA-q=S-b z1!nb&&QSxYeMcDkh|^gW&UYsBoEKUM8$T?6 zz>T*S3+tV^mAY?+5ka%$MxAGzOtyLL@0o&~m%lxtcy!Nj;P38xc5BaV3YIy}#1*2f zcds_HuO(!HT6MQ?TVMT4n!eXKHgRtB`_N+be;H~#Zx2+xS+2HRRYM9}889g{>6f>6 z*lUlOg)9JQ%+;_UsWh`Yr+3R?bNR{RLx)nnq|A(0_fHR<8rii!U%5l% zxCw~C{b!Qs3+B_l{$d^XE_XqZNpD4{Uq5DCkyBoP#9W&xwf%J>E6`XDFAw>%1$0j4!yZBNB%s_^qN~?s$mzQl)&7R5itwG+ywxSq z?F1F=j_$hd)~uej*(wEGP+hG{Wq>C8)}2`ef!t&Nf>&J&{koY3X*M%k{iGB z>B~^&y0=MZ6EgvU^|s%&5%%Yr`KaTW{EU>~tr4R{vjg_f+`@mZ-nfNJh;PavN#@o= zWTF;4=1KP$;i~22hpHpFS|Dk36uMHu=O@_A_>FiEI{6zv6c(|T$6*6B7MM*W<|7u(`XEpHq zAuTOXpVE*eq4{e$~4q8$|Oqv71@i{TwD=h)yspuD}Qq4i(;{NIZEZO_TzS2SdG~Vk)dF+DQ{P7@ zVs+Yvi_S}r6Yh+NVe8V4oO#_#$Lou6PkyY5FVVsnSu&>zLZ+J^6TUb z<^)3wtxjf?UO1r!ldokPoUbn?S5^rh#U}?Iv{`30;aP{BJ|Ol+Kk&#*i(r{ts~9Na zPe1Bffepro6ThKJw~6SPXL@Y+fjRkM^^uRrqq-AZQ=UQ?DiZFYIUC91U%RjlV<1L6 zK`8L3$oH91P%m36k!sN9f;qhc!1?*5c0tp~n!^)W#ga`@_dnJ1n*99U(5Z+n^}2!_ zm=k)JtWRkT(*-<+P1%G`d>l>7dL)St;nZ~kd6~kGHwid^)DK>*l{yyZYqrlR15=c3 z#>X%AXG~?5@;g{h5?y>;n&(7o4v@<*jU7_yWgyM)26KywYb8O?G_gH~(8-KhP^vD) z)ogp8T?p9{u7$VJp<_Z|Ay(tgvQL92N7vT^9ONP;D1S-LVKf5RzE}Ch>@#w*l$r=N zx>x@ZRuQ&UzJ1w~TJ?p(APFp4Uben-Jh9q6R+CZM*m#p=z32Neh0Bht(jElUJPiKm zgc=EY8sPT@zr63#@AUqvbap+_vXds$cOo1Co{9MQXLb4&e#cVREJ9xt1!t^lpIh;+bX0<|PinxDI{5P~e!RhTRs%tLkTzebT|&`9y}CEi!Tm<`u| zmV9~;b|N)^4Iq@|CXy_PP_THLvG+QO!vm0qi~58||KI@031WOaxGFEJPaX4@d6W*gOR#H6P+RL9CNK&1j6W^B zrMocR4>Z5w?dEgujitID`$(Ed$B#reef+KEq{`}Ed0@*W9{tHt_g#p}(R<35k}IHr zL+y9#&J`ZN(i-yvQmP3&WPK zNO4PdKDp?Q$zj)ZW8E;dr0;bRis#=L%<)lv0rW+feqP7{SZ=CIG<+6o-eo`W?C*$` z72Di9S*K}(M}!AfJtJZx`o4l{^^imVGCA3{WC@gdT%7BaoaR+MtpDcyZdY8(w9UzL zCq(dpJxe>apcGMM_siWTyQH2%S{qSoB7s0z?m3BoV!Z_~L)4+=aPMY1w~42(A&Y^I zo97?hskt)a$<9*&Q}gBIL%p)hBBN#8Zv?Zf3jX&WfI-Zt{IyBOa?b+^r-us(O&)AS zSnu_~Z5yQxqt~d+kbD zcp`r%Q(Bhjn673ig(W7(DU=Orr8^O*N0T!d)ABP7O%@>JYCiCC_SeUa@Wn#{k&>r2 zmRTX_-^l5Ro)D6j&iCIjn%FV?h3>Z=_P_?KR;+Vt>l7%}lsz;=~aTc`>sR0n=GUibiA=(|ooxutpwvSf2;3>6hIG@8t{@Jn947sCWxkHh=mLc_H5 z`N5g$NwcHPvHs?_Kb$;C#l!iAbhhAOx5SdisV9S#`f(g0(!4_iPr{r%VUw!@;%!al7-6TG`Feu#VRE#}ow;_uk zWPG4e8~e-_U;gXkJocH5E@$P>ozKrRgv}$UTzrkir~*~vemR6DXFB& zp`K#MSnChczed{H-EH9C%-!5xSv$tY&-VxY;92wZ^Is zt2i|HXdIK65ddIGJfifA6#>SceRD%fgE{g)fYcwfgL+xzCu;|kp{C>Fgafo$w6b#a zJ}U>~?0Ut`C;hHIm*F?mi=}z8WHN+u2+F}PT} zO&9j_-ZIzT^unaVXPm#Pt({&AJ7d-d#QUsbgRv4v=e3)E5~*V zkmjc6j{`prXSIKVr+!>IozP!zoM_zl4i*jR$i@~x=FwEN6$I=BS?+DDom>o;R6lHr zBuBKAoM8XU)TUcz50pMu!dD@lRqK;Mf|Y@^BBNpLAVR9StCweE(ETiOF@QANI=mo6<;x%q`+$QG0#=O<} zwNc8$GeKojXLHm|E~_m+y$Ew{4|Tfb)-`?wTVxhu7_g6y{cs+tW!f^eKJn=`Rtc-f zdb8jBopkc1pxQT4H!^{5lVW7q9B$9wiLPU?A=8#Qgb#~OUGe(ZxaV&~XvUnO{O9Cg zDBeFqd;^MwKUQigOc61}gr^9_nv4cG=WPW#A_+)=e$;705nYET-+qO325wXp6&|U) z;+jurK7;nR%5~3O6k=lOl;_^MCaxiZ@7bs`(;ILP$A1rp`U{q(nk&Zu>%^BIp8pjF z2jGw!&laG1PFco^#Ug{$LiLGdfM+&$X)VHCxx-k8vc5Kol2@^xp%Bi$64=OR2(lN1 z>EWFlR*LsMT!l`wSAxs08+{l4MT1zpD;!yVG8!;_DdMW5dK&l^>v6Oy1d0wc&bHU- zC!7&7{bO^c*#87OF0=cQ`|oIaOq#)hwFAGbX+?gdF6y z-$0B>Ro9Toio0Dr5AKM0L~K5yrc?N(Y^Ohp__5l_ic~1^4VMyq{lw zXk`Sfk1)H7emmuK8};>Fpi?g!Pg zT6VxFeP?>Ed-p|-@#j~O(Q=gnvd?{SNk){Tw?ya>a%_rubJaMbv}(~U1Q8$|{7CKf5SZg)xiCk4&AD|TJY9;#Tzqe3(?Z2u+u@f|X( zDag7!PWLb~tYl8B&m!4z4c@$!6FS})F zMsMkUVaabm?a0)N)&drR^6!q;xIPIwZJDB)pGj|0T6raa9G7P_*b!VP6gI+X2yNq*J|m*Q}d~juVRCo$FjL4yC~KS7y76|`<55gldZag+xo_d=9b=a zMnx|cJ9bkoX(8sPa*;bHhEc~$!Ph0@ zO{xBONjqaRM!OgHfXez~%Z}ynN4~jw6Z{7yhxac711753o|>9!`Z*Pi*p_~1!JG1g z1T*_88AQ&gPKNv~t*H+NItW^B`CR%37YrcgP(i(z@;Rzi)o%waOo7gK*|M_Rt<cEA2pN(Souoy2JTRR9jg0+LQt7q27 zslGWrQCDlhS%^ylWsiL#ye@I!?W<8FV$p^MM=GBKJlH;+8B|V63tm{TPory(#TEFZuYidFGRxoh;k^xZDHQ<&}-J8-f2BwOWLOXV|J~ zj)pcr%Rcrk#NY_}=diDaNK5j27WX?=6Nz+jFaf&SpnrIob%MPUBh$r<-?2B*)Mink*Cl2e5fbj;*k38U5emcY$D9 zs;0%3nRiZaAKxY1ishLtA-}ogPks3msPM}^^&si~C;#ziwWguDe$Du8vrDJ9M3znU z*qw{Y-CsG|@;PhmiX+3l&Z9=vyHcDJ?~o!tqbFz8GO_{4N_v;nLcL(GtAV4!;)Jl< z{4T#x_Ttks*FA-pmn3rwzKC1Y$lI4)LBjXu&`u~eYxN#^0}CEANx$~l*S%2vFsZ8(!zo@MKg&MkNmQiWyU7?t&BWggz#T}dC4(x=+eUI`~D?7`((mYEnvdfY%#5!wk)L|NR5QaJYwnSBf)n9=z%$jjt zWS|{z#_C(j$!sL{=dp&?Wc9Xl4L`3bHfqIBw;QokTVC+d#PWh8%`$1=r1(c_d{MeJ zPe-h@9S>RV`bTM`W^b~abKNQtFM93i!+ zAW9-27OiYuKgEeu%+HMoL_W~({Q>WgYq$-$5%(olud9x2yBENA-WYt$1Ws9xpSjSP z`0B#$GCi|c9L9H2QXQy>ux#B=m%rc3`u0H1wbwfXvTvpTn*Q_x)=eDRHq_%lL0wZV zBs+3cH8Rd}-*9$1ksDbQ)Cq*F!H!@SJuIK+Z|`fi4kH_%1jA!tOBlV5rbxRuua_G|uN$w-&0YR4 zW!m4YLCy6z18nk=yJA7(u_1aXrUm-b>zL!>^RcLMXzC#>VdYEbOIgv^kBoi&a1hBA z_RO(NF`Ed(3BC{y((gt&v`G&M##gRDw9mRzXU zb(wak#+EVO=-j^Vk^@b42Rz5(#B=3uzZ4@hKI*Jt-_<0jbMtQ1r`bEq-frGVNnb1! zmvU-~`H*&)h-OUsr8)6}yvX@o3K}hm_g4SjWe2~QM}0%!t!RqBNZyd2At$%5{ zR&|c8>P>zN9k!AV9*ZsV>Y%52`kK>;Tsi(td?iAUS55IbH=I<1fI2B<)%NCH5M0_> z5vWS5mJ{qXPzK~Z6=fGRvxVk5g|ROVcX7nvbO!;Y%S|Wm3}|4s)RU zn`!Xvtv;;@z0+`uVRGz?lds0o!&IC1v-#XAfn`a0^9@ns0z-4A78#C=canN-QYr#d z+{i;^nWxi3e@drICFVW(_x<;|?`_|vdeP`}K?Iz5}JbVv@48%`* zNm5+Ws!7W@p3rJm4Vti9Fny*~mc3ITlqYs7{#FYj)BDx>v!-bjKa+UCVX{Tca(1Wn zam_M~ukw0xt@X<6(uO3VfvPt0s5ar(j^(z0da|2Z!F`7|TN0zHU2?$t6ZW zce5%1=gU5}`9?^?fHUfo9210 zeV8J_MN}WBJOv`0II+jmC7#k?p^=Wj+NmFXUXR)sno&Oy1FPh_+R~E)-@nMOHt^ER zAdGwl`uU6}{C zaE$lHLInl&9D|gGtFbD(zfH)KTM>GnKr*a1`Zu0!;|z^E-WqwpAH{4}S@ZnA;C`+` zm#9ptA1n6+fiiHKWcusYD5p+qkSm8Vkoi$`At4Xa69ncyz7u9D`o?ns>WAw@iDOh}j$_S}fhQUT0(v2i)&cINW`Ugs6i* zL&^rCT@JRrl;;c0Gs@mqndt`K(=z2PS7)QJUiaeVJ`OVG$^ERJm0Zw8#U<;olYYYF zH8esz`TJ}w@sgAcm@r}~Z~hq@e^L|XX0V8dw#^H0h<5es!!QgISme^@9*M)!w6R{t zuLi>zwpqcW0vy^A(M3Khq0j~Hwm{@CIlfXcj+e4G%5+)V%H)^^`qF&#`5w^6_#fbP z4aRv~y-dM8N6oQN`ma#Lw6>GQ5R!i1NoMQt&-l`ttw?b(+Tb%zV0G}x_LM~Nd2M53 zrhx$Mn@OR7!EOE!z!Rwwt?JCy zN__j;z-HDQgsehip?&>;q;k}DYXB0aS8ovoYq_4=uRr!JJiygc5>@wm^vz!OXIokX zL{K$JhQ8gCaG`jdU5%aD-Cb3*kb}5DIKXT3FL4aXm1>!a1c3xB@i?Q91rOsvE$IG= zRamesQz#+*vED1oz0x@W#(*1jshz2dB(g=9jMRuNN1-UtAh&zV@oxD}R6J zWYCUK*bH~;^aurmWb@VV`~dLy@kEN_Hgxy^q=(oHenOUzwYnYS2bI6ctyoai@?YBo zP+)2$WjtU6nW5Iwp${H-bb3l#7oYWNK_0zY81uJp`HtE`);3(-Mstuuc;|;vXSJ99 zy8&`_8T`*xj1~U~@AJ6Mfh0kUJOiKB=m=(9%mO6BZ&fL$sweYk0CevXTlzYPI_46it}W-Er*tQ_r+- z4B$06`V{UOIBH}aJpQk-XCYjWl#-&1vf~|LMgMa}0_O1fP%sa~R=ds#bP&qBX)a+h z?fHc&-%PC!@=wH>{+}u5pnO;I9)u>6heQQnbFK0dv+EEROWny?GAGwOfi`|-^M0rJ zl)qhym?p|oAivV1T0*C*&{uq-a#2dA!T6eYUU{Za1}Dl-G;!VyST^NsiQYMb8EzNm zEWW}S!j|uMHyyaeBSa_!V^f&uU@VH2a9X!M$!j}#+j!~c`!v3hX+9j;4Ja0laRIs* z`97yhB zxZLBYH~Ngc?^cR*`fOL*$@aHt-%JIJBKYn2%gLU7Y1d-DN@Zqk-Z~M{-)TOABUx~` zgEFMd83M6fn)^NXM@G!VxxuVQIEf46AZ3noBpM7{`qb`faG~tFPe{6cbFkl*b^oZq zvAw|3p|kz{#BS^o1A37OLO;VJd33!Wc>m=w{vwHMKErtOSh|I~23?;EbL*pC`*DWy z2-dBn0rweSkPxonGZ1N$o_4pB7&0-07Y16dYq=W*w#p3)>xq*k1O5+5XZ_cN`@R2> z1Eh0EDnq)FP6I(Cr9)a`jP4Evkx4ob7@?GafYj)QkuswF4 z``qVT*Ym^inDhHSjexu|h&wlupxt8?C+E@yhzSAP3+s(fas zcV1zwc}6s?%>NWo)2&#DL!Oh;znWyZxUun zS6cZcI$7OtDVk46^|Snpkcs6M|1Rp8^uYG-%tF&%ByIQ!Cbg^dlq|a8r*&1y3U_3# z*WHw5YnnFB*e5&<{{?o$}=g<)eZ~*5Yj~j`!LT<#0`LS@kQ|>fjQ!@bTyb+ ztq~N9c!TEeX6KJjkxjV0_T)j+-{_E`v_-+`{c59sb@hhs`Vd%302od}Z}ZJMHS%LW zkGD8RN_{(upZh_&Le#?9Jr7C)MT)WZ0i>wDb204$F*Cd20leXy*5sH9u?W1a4IY_~ zCKVpi_JCLV;@aX~vK`C{5o)UavTN^7+-uCx#fy+9lV(aeugv{4Upk--n~;f`+m+CA zpV+KUwwgy24IWHH-Oz>gifI{u6sfNIKXGkHhI1m~Pf~Z_dqND-*pC>n<~Kn}IpLQ? zNix~0Uyd_26!3Pg?}P9NfP{|nDr-F1-Slrbqs$RCd?@i!odxi3ATTBDsFMd^G_JSq zZ+X^i^sn4qd$zTii(9XeCzMI(SN*gk(g=E3(d6#q$3bdMh3&(9NX<4n-dEx=)nS;P zF8^%uoaT3{r=vSPt;M3sm!9MS-={6%&A#>-iy`gvI?R`SJxVm#i-gTdCEok-C2GsJ ztN!utCw(f(!u~7+!gvGBum!WXrh()Sp|CKfiCf1|u`Jyf|K?Paw0rX`RsR5?1Cc}F zGOXPStA+^5D(dsO-}qvCPp}6&DR+yrg_GREfMj|leKLAT!mLSB#MAB5&u7+5(|M)7qxARO0byD4|=@^>wdOmEjgCWr4 zTb%66V&3AB?I-Xx$Dl+9zuK9>*=DiI7QJ5q2~_cBGxe)DiJ+}+Mx<_vv1$Kf%fjqD zIIt)qJ6>Thq^`k~no|tL@+iSVm_!BtN+oLP{VLk5sIXwcBp|vwDL}cqjUZuux8q&} zi;T|;3C42lGb#6q(3m*qNKV`{Enh~XnnuzoE+Wd6=)0QM(;hy7mlfg4bvxa^V~El0 zWWf75@P@UYgHya_avh_0#D+n0e=*29vF;mSo!Lspj_ya;00u>>hiReT=iVFTw zq=<;pPAue8lY0fiuwCqu?xIA7K_@qiNjp;fFwMdRg^vr7A)Sw7K!yv89wv^E18WO{ zW3bVA5eYOQz39{Z0IPiYxoN*0HC+w$yxe+}=Dyfr#*#|OBSEElrJ*Gor)MsdLZ*Yl z7DMSP6S_w3nsZBiv0pdEhBkLzXO)foNNE@PwRX4rZrf~NziduqA`y1|KEEX75q26` zh}lIq%ySSed~KT&tcA$TQ+*D@Z=kc%wrvQOf1G%tAlAH&qIEKbm0T^B_c-z zTq<~5YchG_stM1FRgdA5A@C4=4Xsyr2;~5sfNtjX=0vb;9h-KrbIKCm zzLjoM%81i`<^EG%eRIYJ^FZXNGkrnJ>t492r3HbZR_m8v$W9^aWw7z{3tf!b(I*z4 zB86Ws>peH6wly6d+^z>)8ENT==)=}X2MxI;ryPm13=Z1k>Q;hH|LzZ;>@-}xnj8GZ z<<#3d9b|g0r*#N9@d;&l_R7ZnfqMezaZ>5`6q#{*o4)>u$Fb;SoRA*nMWmQd2t{e! zpjkYDq$BE_-l=F#yp#98)X)uNR0`A_fRj#ZhG_P%cL)O5=lXRwlnS98;g;8Jhc(i> zu@QjxrGR#e;q+_qL*a3lZIdau$!wt9@?zpXXZz%&WVkM5h|^1JA%#hNoykjxK`Lwtrre0v*wh@{+;xgn7dvym5ZW*&9-YsK&vM0M@fd zCsP^uGlK0RpHq$Mv7RJfNT{U> zAobI>f4epf`~=ej+IgCxClwIpYx>}woIUY z01~i+$2_*vN0buEpDYlvx?42deGcr&?L2z16;4SqYD2$3NnT zyOqbyydSy*&1A0)L0ZEoJhzT=V^7`5wsYi;4w|1fTaNk{_BuXxHU{+3S(=tF{#Y>A z2=pwwTRAFTiH!>54UxUX!&SW1;&>#FLk_JsKhT!7mwliYITJ=^k-=hN|qBP|4K z2UjDqB16S>X8XdzmN8du@14PRjTzw?x1uWu!irM}H;W1QS@x`$&$;;Lu|F8v>9sHMWC^=ot!B|M5>3u9e`%?z}K7K`ee zsxSKQ#a!n7qwAI_T<%$_vCjf3__(!KtqW$}CRlMA;>tBQx2VIj3keN%Xq~y`T zRU{P;j)qkp{X1FYkUL-9Ip4Kb%fwC?vs4@0ug=edIUjEraT7&QH5`YBeouczzK~CX z!q&LxyDxb*t=F_ATRE54zPV*$$uRDDCRsYOS<`f3os*{3h?1-K_5Gn`Do@W$j8Ri% ziExt{K#2pnoUZ~c_BktMq}WsqK^UTrD|+~XDPV{iz)4Ldiy_{U_;eu+0*Em84U-U6 zv&h(?NFJ#u25r=<+r8ii{YVuYG8oC@zX%zw=6+AgO`8AT>gi1ej@m zs0biZ1=#TbyrU?kJ(J|{VBVRoUbhAKxCa;x0~6t)M(m}r(YPMv1QWBX2fJ-?=B7LA z=ZSCzM|pW8QZr{hG)f_}_giNx>QDUKUrD2|4j=%Fu_LmTr3aDI7Sx5Vjt*`ObIu-r$+TIL%4=aX(UBKlWM=QcDPHP?_6GvT z6~rqr*7cPH{IkUo)3D)8KV-j*rQ8wx4UsJ}L4YK_I1El*|ZS1ax@{s@09~PZR8*F7Nnm33^YfID~)e;H)4}cW;WZfR$VxZvw z)HTs~oAzLR;Wp2ny7QZ(TQ`iNAoG^|vXH;H=kT+7A*B*0r0`kFFLZ^iA0AsZc%ehR zBRNS%e@?lLT_$N@6~`cz`Wq?N$s?$lC}i$z$RRvU4v=}?2xoC00iIl7qn_n5DDfT; z#pB`!sSogq=7lF+Z*CXcbYB|3tr`;GvnESd?o=Y4^ca@;tRdg@buXvva!?WSfek)j?SW5SVh~VlF z$}l11?JD25*AB)uc1}IXu>b{;fKS!@#IC&D(!vVYU6%8PHPj^8w-ahdl#X~F&+$Fz z$tw=tdWl^1*=PAr=& zM(-c1j>s|}!q$LMp3C6VYyD(&LUDz-zdgaob3fFcFK8stQ~s#5ZWH-lSSdI z>DX7Y?2VnHTr#6<8el|{VH~HIr`eN5bj`%!OW*e`nRDoku)YY)%z*OCw)ndJlf6@F zFC89*$T9CIC08HJDNogIFE3D$Wc|GF87ZMPdGt2SrfGfCtvGK@fgFxGfnhL60H8#M zGv^t6F0JdkcRvAlbpR(3AQ|Dd1@HmfO}OmaSGuLmn(so5wP&VW9+quGUDKiPbBJX- zW}bO75}N-~?F3*aAR1;GL+N+dK`a#+MQ`th(y7$^J#X?e;Ta)G#or;KE@B?pt*@NX zNtDyzsL_pTlf^)(@|>dpdzWJA?$Xx8bwz9i*h_S+X?g>ew%pK-zB5ZhTWi z%HPJ}Z^zhW_3@GF^5Xc_>+7_0+b6D0+)7J>yM4(4#c7Ys_fkubaHbQ^q?V*UPAK3^ zO24K)tLix&e4zk=kBa~kEF9w{mx57($c@;)u{{k`DC{8hD*cXxa@aSFjH%jonuwwB zI4QqJc3Zk#K^?=Lp^}Wu7iXf;T|}B7SSjxO(!7A8|Rp%GIJUFBVabO4GDy}i)h_$X8I%3 z-Ekl-0VSlL8Mcigklt6GV6rV_xBo8s={Nf|3M9Ik_xhsdtz2!8ouHK6}{Hk?C@Qk}?lo6K%x{SP5LLFp5Lp}YfIv+F6 zwOswOd<{i6Hrf)eHmeTNb#~!X>1Mu)`>-?i$BE%9T+rZ49-om|iGDFN*)Q?e70)m; z#1V}0y}n)`6inzO~AW`4}I- z;_49bx3q(g2s;en4{`if(8C%PLA4zNEQ^*XHUAxmm&Ad>#Tgy$Gg`|IAL6(lFq(6_8p*fS(+|D zf9&?*Fb-M;&St6G@1JOoDetaifl151 z+9@{@W>=;6&)hd({1{q`-COi3vL<^rn_I2iX?((Mbn=(KwM?GItrJF0UCIZs!nCuN z$a*G(+UF{G@YOk%7RJj|7`nnt1-Hdj~wPff}?H-C$_-ZYgWRzQJF4mS8&Xr+x zdLJf6DpA}T;j}LK1FKm&u}jR*z}nz;YARyqrZ1iCzbA!GrLZq@*k^@KJwp}eoa;<$ z{}{PR?kx z=w4$1ha(rYHtbXQbZ<j@XoUY-D0%KDlS6SDNRcF)%;RABk`I_n6Exjq!f?0J#Z;j zzwADeFe4-$yB7^noRY?i(Q{nOe&}KB%}YSDfk~cbAs#a}YSOq~kuf#2 zFc#ro?RKuIjYP&CF9SF0e$UNN=4+s2U;@rk zwQBi(^4-*Gyy@5+=hRbrJ*8ZFcUDhJi^r&A4X><+lCXT@xlPa|bAKg534A}fOn>{J z($rbb{E`CGIH4e4sy(?a5R3~zHrwd^GGAhTnfCO4^wR)CPfm!gd>~3$SkhD(<$?hA z$QD6AXY+Q6A$De3ao}cyL!ZUGnTmONo>0N?!c;6B_mI~D7}8Zce=e!`w~SBYnS5>5 zXJm;vL~ZZpjm{%)1k6!JKEd-iMe2ysGfG?KKq5UbD=W!+%*#s!K$G3!D05q_qwA)9 z6t{IeJ#F-gp9OD1)YQ&8fX9Q=QD8)ST9!bj$o~D?t{eh@+)+n5VU4}b?+$#Ge{;$# z2}4yNZf9-jP3O7YfcZtbcJnsajcc=Hr(LB!g6-?$>B$es|3LZ5!tRj04{^## zt)WzlJrPf!8WyJvqDw_12u3*_Icdf`N4)AqYW=sJl#sX~QF+^{tX=RixRUX1eZTI0 z`g9p`3!`}K3cME6Ur6n(1z89|KM)X%UFWQ zFNTlK{Oz){9Ydd$mJ)qNA?|qC?Sp0AUuC7JxY*fW>r|P~kWw`A>7=Q5Q7d`Kn z3eLtj&j#tag>=FdMZT3S9j>lFs2%T=O~{g)cmi^HU#M=sYSji?Tb#Yd$G3>0wkTPA zDf#PqC)52|!`luS1&noy(mT22)B(k;dM>c8!8zcZHKAn-b`m{8tg;59Gm3bVMz)wG zNXo(2!HOV=(jZ*(5C8hs?`(vWV5_qer=MTP=7=T9pcWh;{okb)(lxm&W?kf)%UN~{ z&%?rc|Hq4{T#ig4QLu9pSF%8CQ7jy*auJ?o=y)a+7xT! zD}d9tvjcd_!{fmwkA?Yip08{S$q4x%B+V_Ko}AvCPjxljE!0l)ENdBFn;%vkOZT1f z^kv5NFGx}WV>-FNNhQF%|ML0UenDxV(^w={uzUh`k>l z8+dtJe9uUNxDV6^X%<;_qiaFRtX@Ghia;6f`L)Djd=FR;U(=LL{ zaoa)3@#-kmuOqoz&mV&-ze4sk62}!p(sp<2!~0J8!@0 z`+wyST0)G>v^HCX8;;lS$_f6P`SphxM8h}0)lB<9Y=NHfO5HBOBg|qpN6UxtdY#Dn zhtXmKoNT{&lTaWekAV!2oCKXcs4_cwhW_T?fqj9$uX@uRQEGDZjK6A#ff>A_vgHO; z2B+e(k@WDyHQ<6Iz_dQzUmb3;)>IbOwrvs;!(SHy9U#*F!BEK4dn3sE+g-f$hQVS5 z*FuPV@efabe?R}33*o}4c;8N0n~RJ%)=CzYkzjI%uwA;y?4_&~D%vL*e#~=zDfAU< zkyW0@AKz&ZhGNt?9U@U7MWV+#>FAFHX>7qMnnV-n5D(wk8{|a9Tu&lFC?j?6G`h z;Ec=xaL zM)gKH6Xv*Zu%>=E?qUgR?c;*6(siw0fW3gKhTmNyqv0qL1#(zI#^@h}9nUQ6GqMHa zud6D%o0F}ml#l*iIbPDKO%puF6TDq)$-Y!sfm{sp1*bYMN}g%>&$(CcqW>_8p@RIl z5Qx)$AoCU?X4Jy3m~KSQcWoAjVsb1BV%@?P;f=r2&a;aiSYy4|9rFk}6F+X)p5)=l z8&Oq&d5HpV3cNp0WNMs_m!Y*b$yMlJ?b93D?weD&+QFs=x1dUb_4Iqa{d zq-Vcm^*-$bjjZ&^b|`f-q${fMM93a^yaH`cv43!sQS8lm9XSj0z~x!md+DqP?%=Ka zb?$Gjx0AGw{n>{23!H%G9oYaSl2PuZ~>;SNHZM|*Hx9jZ5uJ_2JHTiF?M!#*vD!}!|oZO7L*#{1z>BCU2F4@LqzM7R3YeQ z5j33ypb;I=)hB{V?H0dDL;IAJ?P+Me+oJF-Qo@(F&}S0j`^Rl@@1X9s+-s-p;O~C` z#qd$>yQ3oj#?Z}+ia=3pv^^w>Qa%#qKjQ4a_H#7kTn04yXE&!{t%!<6GZSW+eQ<3l zJYRgdeZ1|(H(+UQe{nduF*}~dTL9$bFf;quf5N zG9>q3?#};kVeMy*cfR+(I{5w{GE7r_k!li0h`YY=%_Cbwq>c^;op*92Vs}EF++zQQ z!wHI4mxssxKa2{ps#9aWJ6KU09)o$2uRMh1A-E0K2~x=e1Ru-Yc`ma>oXM;$5aOUu zrv(ct^J2?wN*B7JjcZX}!Q^i%k19njADl^ko-9AeP1`+1{s(x>^RIZ8=cMm=`;-akQq`TXZDJr;Ic(;#%RAEhVM41(lbJv{fl8dC0*+*=F*D9625h(V#ERe4$ zr)w9S_G7H^UR)S|{ z`9=bbh;ko?v}>}_w~%4v7CHG#bd7kRx#rI6e^7Ohzh6=m=u)bJ<5}C zBGh#198zDs@8B+v9{M3tW=VHAt$g_qecX(B|HEVfr*gWYjav7Gd zeNk_aGFkJknY;AL1VX9Pt~{LE52H)IwV=_6?gIkYv&H_N5>m>5&d&aDSn2%p+(olz zd-llyiz~x*#&QRX=6N88?zeEa%tQB_G9&eGXQTg!1KFbqt`o%OJV&|mMlB*cPuI`b zfGbn6loFAW59$ zJLPv_@fF>|jAD$`fLDaao}(9m+Yu7iIRfzZq&@q$Fgs=cC}YooNA-APb}+h*KR!%e zf_h@iGQd2pq96~|>%`_9R2vlA{^{&RYk-iWSScb;U#Rob7a?iLuYMYawiGU67aE#40jU(hHtb%V!ADqa+fv3-#_P*KGQhi<~`fX z89knE%l;3bI^>~4W#}zzE>j}pY z^=1wH-IVy&7e*kOs@#ydhPN*wPd&n7^3kA!pfqZPy6L7}gMTT{D;p<~#M zkK?X_V%&L1?aotY^K`@f3tzX3S%cc$VAg0RHoOB5l>voyK%jE4vPg)X!fK5`bSLLU z-*>!b5oix~^eCn0;lguf8#qA;87Xt$5_gaX5X6Zgw~vhPuYz~t{ni)&<}q`KaXM%R zc5<%U8>cHA(^t;^2-}%oymz)5ndh)GW?~|#FyF73H4}KZ*j(7Q#sApCO9$wwu)dC< zq#Pf^J@76G@N*vHHT28k2$Mne@A8CIN959WS`Omn&*3bK;k1ufu?dEV1?LX4?`^$}~KQrfAX^sB_ zaF^G&p6@QI(ziKnC8JcqTU-^SIM~#2P>L5`$#4KlO$Xos;P)KS@t{=YQszB>D(IJ^ zqd=Eb5S@nO*HScVfJOU3SDrIP4{}7cHFh+3IQ;#H@p0CAY$rIuBh8VNJJ9T~*x!9* zS4W2{=dC8BT}bJ^QhU@&;GdE1_#bN$e)1Y?YwS(jZ#?z_fJt&H{82Sz?DkI$)~ z+FiJD7VAE?@+4=XhTe zQ`5RWUk2-{7u0?$6Td5b36rwwi8o%hL99*} zO!zf7Rh#cOPilt6{xh^+d#z_=JY6ndxvL`)g(WoS=(gkHF$;(t9&Ugt*>_&W@rb05 z5ICFSDLh=c=aCI3+l@Gosg0nR8;mT0zSCY(6*%!703_->$AT8_Ss$eIy?e#^WYcRV z9S~)(ew-)D=>_N;YPeeNC87y{Sn7wZ8~sz?X+G1`&!ZLvm5J?$7r(aSDkVH22p_8`aM9hCw@6DP?(fXXRFO zWB|0Xb}=?dauJ^WY;kP<L=Z*KBBO1|7t8O!j#JeQ+MU>({i5OXJ%Ao-7!?EtD`;G^PeL zl|U=l+ohpL=y0K&#av~_c7xDcl729yN+&@=fZ{9+Ly*H?*JEn^x^gHgKY0pv zlt-S5`vv~8dJ(sX?Y~7trv#q@4z@?Ea&lTfbtG&)Lah0b@W@#B3~c|Uvc+(@3>IiMw@d#lE*9DC_7-+qfb?4@$5)#f zK==K8()7S!#lt%WEXqt?3`_1*Kp=2X^`h#PPjRMU&>;bo_5`Ir1G8oEVMqZ!(}pW1 zO2BUpK;RWYRt8X8aQmkUBJ#{_jy%B!t&8pXa&h}Cw_aBI-C3Ud1s67KtCsP&`<6i$ zEl=y;L6)u`PoS#jXc%hZo$R#^-XxSB4{q`uHsWOpr{9)qVGxn19*l) zG2!!MTV@kyR5Z@>y|dkH@~TG%8IlivTD5&^6SHDOW|K>p=zz_X;#P&I3})R#o@5G` zv+OcMA2&@4R|pkeI%0CW?sV21dz2sC@{Ap(^yy=ZN@vP`F3v3vITV;UWg6jz)s7a; zjGz34bALF^*CMeJsCu)gx$Uli!m0glcafN7noF*8qlwYJ@DKMQlefmJ?jLbfpGJ%h zUYRJ<5Br$Zg^2Hc1jA*PPRkLME30;89Dp{z#kTOn9zg6zJ z{(2I^?e?%>stPU!;;)K|4kTxu22d9RCArffMN=o=UxHw&SIxRi2=yxuMV~rY#owpH~EY?A ztgTU8=0B;$wBend!0GrKFTgp{(2Fdof6wD@zjrf-MA36EE5y}jB@X>m&weaNRR4Rm zl{_rrabyyc(-z^8pVZiMz|fum=uy%mo`%Ci6 z2X>yLRrOxvM|EEh=8LqhJ`g+u3?|~21%ZSAex4n|>ZZ;Z@V~S?JZRpn%c`Co`o3kI zdcDd1r^0M%ees@UgvtC#>vXWwMeC$;@iNV=`IOI9(MgLmxO@NPWwoM4o65;Bm#yuj z!^;&e&|-uI_%liJOlpYflv~9aB# z9lqrra~7k{MFE9Rb%ZJlB<8i8$u~JqsFMW<$sY@4=z+Z@!mgg#NA`rgxy(A6UHN$M z1*a!QQ5D}I*R*Tv5+H20`x~ix*+S(-nTk(P_XqL@e^HwTk6BFO7cBdKNA=xqmvkBm z*zOnz^8NQ*b%^;)xg(!Dx%PL0 z#xPSnHTkHQNb&ptM|p$q1l<1O#&Gpat<7>FB)r7ge^$3gn4OLPdRaG(!D&jprjtHZ zi?$*8p|rc827T_Mj(+%etW>sNIZ**1%8u{n9|xyjouniK9(H!L>yH{pR@oAcYwdW$ z-YLkMnWop|m@BfTetAtvaa^0_2~TaprNi#GCfvTFwc*3?-6#xZZxJ0ns|BBJw3XNU z;0BtK^@=XxpEB2fzZ5|W6$CyIjO2{`yg^K?$K?FV0Vpuurr-DETZmm{AAds*t7P!9 z)YwO|Vsa&?d&{*)roSa>qli_p%Otx?q*$t+MCwav?HQrN{P9~+_xaU%8$n`cq5YX{ z+Z-v;Dr76%HD=ZiUZCGdEag_peWRUSX{oZOogT;r^Tg>Ib!vYFGdto9wz$Ap2D=46 zMAoLU{%wh+_%O2#$Yz`OuYKC!Luqqay7ml?;6v5QAHteYS5@(mkVY2m)L_dl$)yg^C7Q_RizHgyyL?|b1R2$ zT^kx`aCi|I#n4@g*Nej?d8P?eH(adRbzEz0JVfFi97Rx$tEuu zyY}@o!D06Em2psbQpJmp_UhTw_4xF(#&>4-TnagUajT}I{o08o_6RGqK9KNjVmm>ZZ+yyz~)iu`76Ej!w>pN|qx1iU0z%FV@9{axaS9lk6?T`Da zxQ`-?`mqDs^2>*L)CI=#I;PVx&<BTNRw4jOWH%sX;fH&Ur&KZ38 z4l2>fxJix*sWO^1nv?~*=53Kv$;Sz@4D)+(x)D_A9Ur01H)RQZOwo4K%tL`LMtDO8pQyLC!Y!;*mwo z`!|fwI)o<@=pb%jN4&TNg7BA9QN{WUbYUl+b<-(L{#tv>g%x39AIe37Xf>UNjNf0o zO*dINh$u4W(kEpz@;z2FmZs}#%rr8jlEmWQOhG}~QYD6jYs2%f<-FYAtU5f2_ad)z zJWdq2Fn3*y8D5nYkRruuoK}ds^dqy1N0*v=!xl&G_~0ONK3Glf1#G7y8~tolV3nKy zbsW1i&5;qKAt5#OJpy-Z1r?|quvBXoy}1+??-sUKl$ZjH&Y7Y>@!e0;KRxB08k`j` z?WbN+|EOU*@=FQ@iwIL*6BhapP-425F8(=&t$ZWk&Ykis^sS!z(Yx^SOY_g2D*@eH zCGn7*+sj0kLZHaihqA%Fz06IBc3H*V%@V{!=ESFe<08%b5x1(cn4de`oPYF$r#R?6>0a8a`cnm!<&jA-(l2brXC*IN`dYW(&G)3rFjUk*o7doxtBVn&6<~ z8EH@Qd!?BNM~ufS(p+}5h2-TGIUK&C9!(?WehBpKUaOzo7%Xar~fc+ z&05UO=FvP_s~^qZ-ctizrHNH>va1U*8c>RB5Z?A72-JNz$aBK0YT+2^+h`k(Hz^+* zJCvnmz>%GmlTYpv6<8X?rhR+$qQ2WtL<2}b^G!AYX$t@-eLaWY{x0#B7C=#Q8K=_8 z%{@sB;BtQC^8KXTSD=bhI_q{YAbQ)W@76AYCOzDfw=3-Bjdl5tj~!=>yc z1}w_A!pmnaCcj^Om9(Pz4c-oN^Q;%LVMb}L@sGzWcF4>(lAAF03(+?*ejpjiDzvY9 z(5{K>@Z9O5RXfOvAY6$X#fBAj-mrwofBk6bZM8h)YASj8_b5!4VQY6e<3ed!M3-xr!v#60_>|@jAu%X7G`2j)vxu&lKVnF%(Onnr>oJO(8+`l^TYWtLX-8kIT4Zh zPYb#f9MYuXo@0zYTI6FbVQ2q|WPET6r98a;B@m&sz_9Q<$DeA94RZc?W-mFX4<%*% zf?8_Xq#@mz(=oJ`7T+AaDMRN8utxN^d3xXQ2iy-gb^p3F@?vrMIrS7o#kFB2RQt)! zR^y7k>gpTRnpmKMdBl=wa0@i>@9M|ojokh=WO?x4#qlz&3>}BCX)q;j-^5Sx5<-8- zS0dnZJDN=Q>}a*XmIHA4T>tOz5Ziq=Wj4J-=X?J4x%3ItF{_&Zlty-G7{kYrw@it{ z?ubwZNOV3F`FNl}<7s_u`O9w`7<&NStT`df7$$vMD^9(KUaYWtqLK3oNOH_U+j^I) z^k`e3f9GLLoPBvjy92Uuy4qw#O{jb=<2fVH`vtwbqhP7Tn|Mrn9DU`rVOznUN3hCs zufIjgEwuL=%wrVmxsUAU8KRIIstH^VKK30qiZ~Nbz80^|batMYHQV+t+Dmveq@b|M zs>p{j325^*V&F9_e=QFGmCv8NQ80b*>-3f?-P4 zqvZ*q#hYMJ`Ojs9S8ejsbtS$cv^)1g$fKDoo1YL0>3QMuKOg+}CL0%Gbw3ZdZ&3)3 z^&gi>Nyng@)x)14n0zQ{pc^C;Z?W>vY*OU9+S2l4m9Zzy|$n z+q)5i)~P+S9wZnI4R!{PU#0CKOj9I($$o#MfARTQ)!@DR!DzZB6?_H92CA8W@o*0) z1sY`edFU*D&H3ZAgRH4ar#M=svezv)20j#nn^d^Kx#P-sw0MsjaQpIB_lh#}{God; zjZp6u5eBryzuwz@paJ)?F?@}v_Nss=&z!cR^z|v+pHbJ4^yzIqu3VxRKeyM1M_W7X z_otsjt&RsxE_RjM!7RDj^#WaQ z*;ZM4>r*=q#s|43-0^G2GG0td3dK5g)%M_*a=lk_Jf8dy0Hi0@L0@#ximP{t%+*;pg zE8t#NSC{xl!4svMOSBsLVe*T@J2s7%+5#D?9*NrTQz!U>%DB;3etCBq=X;KtEZxie zvRnPAt(A2pLF|((EYphr7fDO`m$j3Up+Q;_uP1R|k=hh2s(Iz}C7{(l;Ie7~VE&C#`J*l8vG~{`sc0cjO zpSal_BJzoL>0JI_Evb(VPj66^<&M&m+55piE6pob;iS`MrMMvk`d)>j_o&$3Kk?QaB`reU_h~-iWJJgH%!2X$#dE~cM< zW})b)L%}$&J$U$P+<$tz0)0MpIY@8$x^7;hcHY?7x!Js8v_{7`c+a%{=$0`^E2jhs zasTDg#?lmw{*Z=Z@m|#obg$i4a)7(n(bkvQ_?FEVWfVKJGso{IExQo8yK~k+pA8)j z2!-)pvaCpVAJQ%?1rV%^cH%6s58Yuccs~MYH|J-zdaNk+xv_r|<9&zRKfI&H@_cD~ z6r$dS1@;Qjn?fF1q1;(7b&Rk=MNv;jW0u%1vx>JFX-fYb&7N~z&aNqwTn4YUCp@kE zU{xi(cTr)|x4MiMHXe@j?|qQXqK{QdX8WO9xx0*ygCpwj!0!27m{yN3ERRMS^KbcP z%PV|YwC>rkm9dAITE?(OjPfVtBkjt_^QPDjVR#`Fm%F%TUH>wS9{Qt11rNROh9_U~EAyO*z`!gwwRhqSQ@^|NwiUA~ZbEn%vpKLI~d zHoLolZ`q796{)ZJ^S~Jcw7+=Pv`ie1Z>vuPtG=huuem0b-(QNpq zC5)#gRAxB)1p_-q@o~bli*63e0IPF?yO>+ewcO7+jANT)Z4zON?aT^xp5-{}-$)hY z*P+rbPM`f1;_oS0Y zXyfU&NB4`lNG24=C2#INkIRwE!{RQgIbrDAo_DlIwf-<#Enwe&fV$W(X9A(5l6*xu zP~r304hg60^w@Qwf*xVvG+CRg-Se`$nsx})yo8z(&0S%e(Dv_J{_3bnwWH#_>7!JG zi8jXj;Wi57c!j%_R(&|&k~mo7)-G@*xWT8LCNx&hozaEy8opl~a~A5~HJ=T8NK_wl zDY4StQ~Bwke=JTo06J>HK5dC#<)D0bIochR__2kLI8|}@_gpUC?c<}E49Og>s@9s? zT%#r|dqdOvMA7Q_#(!#^Z_5T2hz6Q|8_8yDk zO(y6)$-1!7z8?5~^Talh!s1(NNMOCSUk>Re;O`r6Z7(DJbbi~YLtYqL6ecQ+RYWxZnfA6fAq#Jxh}!+!|; z74a|Q9=8(+?(Du6_(tbT(Cx&4vK>oRk4l$Rv$Wd`lS_T6Neazv1hU*q8YA6D`V~b( z2TdyYiZV+_XB711y_T|8U)|GI+tELQr#iKt?m4Nety{85y` z8LW|^(&5y6D`BYG&2+NNW{%bdzK88^hF|bckJ^vJ8nXOq@%M^;6n@BhBI){;k3PTS z-Fm}W)^v*t{WDOq)|wkxhP9^N_=0;qMpG7-2B#m1+Bt2e(ygMixoPF)iQSPkBwG07GYBEJ!?Yn5nqL032y-NEmq6Mek8iqtu7gDP zcvVfk{{Y2}SWhg79`jMMwX~h=K2`94k3JIk1*VtwYxo0Ysp`=AFx!68KeW3?;@Pck zR!IZi_)p;Fy|lj$G<&O}vRK*N_=-OqNoq&i8tX;A3ni`6uZh963@tiz;@Vu?vF3N> zcTtMHrM2fcrMs4gky$$O=B-jyBCOlycD!0nDy2rF7L#w1oNBhM%CEnycvHu|J@IXg z=Arv1e#(|U9Pp%b#AEpV@y}AW@iwJnC9^0RnAf~X2Zg>HXi}ouoawqQi>bv6MI?bP zFJp>y`Oo5Qt%kL!$2aW@`%~V0Pu1YLyPhu&d^w8e#a4FL(}>K`*xjr)eizc3;gMr@ zvC|`8El>c;n^&RnU5CcMk1Gzb@k7U+IQXSw0lJze*01cm4e-N2Na9ISdl7MQr|7z7 zoHrudSm<6H(xQ^y7mC(Zfdkw5eyJD3?+J^WEkolrkEIJ{jKksIgB}RD@fFK7sInO3 z@$RQ_q}pAyTt_p1ZR!e=5~M~H#FFW$InRSmEeYW~*h?P=l+E{c|w^X^5Jnd?U zDYi2C0_J3iBzm9P9}8jm^{)&3LbV}BnIdWs+#EEuK#@`hIecul!h+yvW zBeu8-6>@VLY4S(0KqrL&63Pf_rzga3h&H?4=fgHI4Dy6gTS#BIjso;JUb{{W_ZEAW08ZeobGa!4>pC+yCuigA?~%Y4MS zEbL%9=Z5a`x8DnFw_|I6XY03d5OBkSjUiLV_XB5-n;$eW-~1YsjrxVcUcTHMg4aV zHG8!xlv=a3(rT02RJGFVrrOcqYC+v=8g&)6T`Ov?{JvUWEXVM<*tP!vf;>s5jNqF+ zb~%FNwstJG(SQb2sOf>6oQ4Qj;EM4q-a4^tukOgVokE@2`IZtJ8&m*54U^BxalSN9 zg3}S@c!BNCNck`I2uNJxg__ne(1J+{t%5^mAlOd~d?}OUi^aN*-N&Ep3w9aCHz0d5 zPs(v1Ef~N(|?5K3S)Zx9;ww}(*X8ODJ94bZf^Hi@JS@POZlD{ujs&?5w zp64vE{1=#=ny-js;070QO}HG8Kh^1EV{R}>EXQ)La9XAsAHqpME8<&-)VCgVccduE z0ka*h;>2y+tvC)aMa+g6)p(8LsTxXgf$_zS1H_-;}Tem24I{-5~f& z;H!>f@jFM8_g$>nR1tznS69yBbNis6Dfx-oTbWQzS<;~NNm^-d%e!se-q+XeIu%?x zxBEp!ui8zuqSnbRb@abY54v`i(zKN<#boh@r+9;JQnvFA+2y$2ySDCMl#%^LMrF zeai5r0mn{C=co;d$WaL!QgSZS50T~3~?F)}=o`e!f$@Oj3Fpp^30+0%W zjD|dI9r?o(l2j9%3}ZFg_-{l@uQF%G*pq%`03(IV1t5TgmfN>;bASk9NUp^fWqmBV zt(N;GrM-N&OyY$3c1`m1yH`!F_e=2Vt$hv%$r3RO8z{*GabidfgMb$#o|(WSsln?a zu14jNW6NL%3(#cak^mzoBmzOlQPcb--;d6nS zf?ok>0GS`{cw@kg_a;6=@`c(!1Yi-jf_Y)UO9crfCepp0x?5#^lKZu?BBm+AOqx#02PVBKf)DR zhio1WMsjk%du@+|d^>9@%^Xuak)6?r$H}=sVBtt|uCAy^A%IfO00f%pWz$8%#<1I2 zNSH1A*irYZGP~~%h;zFmB|#)|NFb45p=-HX&0BpJyQ+F=eu~$(eH^@FTT_&!*`%HQ z-tD(-Uro9nHV1@p97JsZ{_x;n90CE_z+;b)9*3>~7ve@C3(Bf?@D<1fPT~RG7$9dV z2H;l!6P6~vgG~=h!CR{>JOBs?*3ck0=%IFHZ~@u@W^a^}f-5Id@Lz{+gBwwEXE;`5 zdt?i5x$@g&wN(LtbGytEf)KMJvC7oXF4pmqZEG8*n_lbe@6~V7x8k5jIN3ppYcw<4F~Sx7;74H?3KfcoitgPYP`R$` zSoj{+C4DYi3(!J**D?oS3EW+bv9Tq7Wo3<*Xc-a+++DvlU>#G?;)t-13@vP-0Hv2i22aXo<-a!L-g$YuMh|iW~ zEF6Z(XlY$17TRv=S66P&zK?Cb`<#_!%{bjFy>6}U?a?cxqSpH8^(tK|SxMy2X>}#b zrdCPAL1Nhe4WKA_hbmQ?;Q%C^gc1QHSD^!5&F4bd*=-6WQK|W`>l|^eK;tJEI43-n z9kd=j@a4ERi>7K9I(hk?Y5vagt2#0;j=|Pw56`n8-KGF+ZDtu!u6#F`yta*~$8_d{DqaZ6PfW35_A#RQBvgo?qUfpiio2$DVvXfGJzFiu% z+vu*_T05;B*KJQVWD!Qr$XJ4N{?T2;k`;bHHx?ryzE(KHWMf_KlTf+W3) zN%VFMBizpsksEkLFS0GaaG#x78w-+~3l=zc*Hq=R{_DNEXqMN~{{Sl(Q^YH{$x1hA zcUQc6Cwr~klS{7WmVuSq&~DF6j!t&BIZ=Q%oN_bRiod5WS=R+}nd6X8AgKi9f#^XS zaq|Ls%zjxwR0Fwq!CkGmHd_FE=j9xNG6=y0^t+}YM{)td0FZueNWfwV!2>&T!B~<3 z&UwkFXLWDCe^>Y3&dqGDdbAzwr%Sidy&BW4yL7esk;?J|>CVD%0SE68K~u>&>%kZY zI5~wTY!X7`h)Xn>2Eco-_Pw_o4uQFRJYwN7Pqq3O?ur7 zynV+UkOHv|r#Ql#DG0-NCvu#3&me=JGZ37W&Ps;P?Bsw53Qjj1@Y`{b&OTvcW(?dm z8o}m2Ow<>+ocMO~o*a3O@M@~WP8=PYX-IcF*_b>Pl zUDmg|Gm4iwZ)dyFy)C7`J15h*-uxb#3vZ3T1@13(cr?p2@zv*;W73mQW3$3OAeF<% zZ)bO@5)l=lj@C~zdLly{t0cugLG_5gW1VwE)Gx0-JZat()TI9agtt_?eFyeD_~GLV zG?P;CcZ{wid!)GV6p&5!JGg?}>J~cmcDGYQb94a`B$509@IvELxA@ucR`WyFK8s5*6kve?*9N#)3s=Yg2`1FO+qS#&T=Lx&{v5{I=AH2C#yU@otnKw{+s_?EqJGalG586mN2||t zkoX<-OCJ_qUQ6POi&3X|zB@yt$!@xSp%vUZrISf{VKlmET}U&Hvok8GjoFFhtdZnA zcmoO!(idc0;zv?b7f zB78`jQ)x8z@eDeR#pb~0`R*Vu0 zm0U1QwffhD_@y2X%V6btiB^+Mrq%HizR-sHZBEHqURKlNc+M;PV-X~lt~*7?nW)0; z`_10ge6n}e_D@1+PTQzA>>DJ2Yycwy7zYC(w-se5cqM~I2S0b_C}IZQB2N6p2`z!0 z;x*cvRHGSd@)P8}h{G4n=(DYMZT~ zIL7EAC7X@I$_H|sDwQCD208fqF zeK&m_x*6>VB#=PiNE=QR7BpSdBR#0x$>8 z0U64j!#G78?gu>pAaohURhzTB*G`u8U7fZ|%GTIYi%)0wrSg3=v%B*1)&)W&IUjg) zjGTaj?|i%*?a0B$Y-X8n7;Qw3d4@ORI01LA&;U?K;O$^AIN)$^tYkUDgMrB)^&kQ0 zIp@9$XE-DS6{rVOa6snTGC<#a-df>!XExKL#YE7JG zn%*w&u8GCjZDnNJdiB!fsZ^N zj@TKHvW!L^N>ZIPswu@kbzR$*)@^NdX1Dq3e!R!v4+h$P z#rD4trjKyazh$o!YyM2}*-vS0;vWuaTHdp5sl{!16Wk>Bx0*t?z7|Ph_>`>*s5;>v;Dvr;T|v zIu=h4fqv6i+nR90%S~3wE;f3%r*WwP;GB#C6rzHxj7A%-M(>yJ9mj#f;)vqQ2FB2G z0tOtDfs@7*WQ92ZjoV03*67?&Dw20FUEGqO;m`(EB=SiBsR2P?FhQrnm}VhKZIO^U z!=6=&@$#y$86$QWmN@VFJgT@WSzlW{G)~<%Pgbt)-6XdB=1ERXy%S2-v(_mq+jj1+ zzn}<-x43Ko84wb91o?mrjk|UX?K^oa3EPa5Q&T`B(?$m6d)5c82(${o5=L|9C-HI= zWE1y#28mYMlyyx_xhb7P?zu@l23j>voQo`uR;eoCw6i`8P3u4AY*CTK&o?` zg1tsb>O&q>V+uw?DL*M3V3H0cCf2LBmily0@4M-H*v>N6?f!47^YYizuEpIj7t}3K zley-MWq>LP%BXLY0gRu&@~FMv{E-umw~V+Fx@Ym|=kh zxg*N70AE z0l{vB9(gOiT9md)d(FP;)=J6QHM6_E_SN6Mi&CX2E@so^I$8pfxB*4V6Fi<$z!`2#(uiMcrV0&xdu%yQ$d9#NPByf%OKi81%WAn z!iM=<3^qz^l3+vQAak_&TzrEivygCDle-Ldj1jvVSZ9mEy1am~D{XTqRmLP}m6-~M z7z1)_LKTMK>@I#mXRz;DyKO-gW}s<#N#sH(W~IY}sAT@z`xyDdMdyg|$H80@nutAwQMtSu!u^9eiR}i^6{n;VvJ`z45)u>`=uSuY5LRHF zjdqCKI_z=2Hbp33cIO*aIBmb%xddfjF2lw!*7X&eC@-mi(zH>h2r~3P~on8ETPqaNh2Nw@Vg->H)W(o;e!K!8|7tX zt|Hdn8#^sePgQwM#1^v4zhiEW3z+U1nfD13{d1{QBsNPiK&mTG#vUcR@kX!WPY}az z98D$ug$RwLB&YUfoug<%RSOvp6~vl*Owte=o}>ko@{(#=ggU^?Q8LV?)cJ1AswIt; z1CW5K$l(U<%ntI%+Od4eIpB&%=Pk)5TKZ6r2A^%(=NBvU_R3_R%^9E<|YK;s#}$$i6) z2^nAj-HPapTDyJitX!M*yS|sdP0t>1+A3ChZj!#+CY`!%WxtU^+fB4(^BLqU2H=k( zuo&bYEm;9OfGVyC`HH#ufL#dfSz-v$K6S`XnpAJ7rC{B!UEiuv-dARwNCe z5&-}ZLszI>M9$XXUz`Dk{xiIg0;$0nEC$d^WtqSPW5wkihet zBB^7Z_%-XdPP?O0`3lUdy|AF~Y=#4Q&cJ_kt%Bzpuvd33A;qQ3tGuq#OSQL4<c=Dd|Lr++lq6Huo+M=REFc5n%9o1Nm*#L+RoZreg6O?u60$>MQHDK+uvob zjrr=d?|!_c!tT9ef(ViGo_=P|1E|OdLk!@Pldyw~6nOJ+4?+fVK+2E-3OgOVV|Oi# z9;Azx5rccU??l>4HkDHy; zz14jzuj{qm&A&GOR#v~5-mdm~-_F-s-umd)x@x+HIrhLjjB%2A7#SGO4;Uws+fG*p zk8{sMoPY-bK^+fXxH!o*IRhtv4qLW!>H?FVK+he3-~)e1`W#3=xR-Z=kmn2-qT$m5)YVd;Q# z#tzUAJdU23>z<>aA1$(g5HXArdYtv=JdjQ^oCAZ;Rik41bJvZ)k~m-nPhv<4PTmO| z3grvN-*dLUR@-iyeq}A0gc1Qbd>@z&7~thbRE?(x0argT;NvG-zoczqdCOg0*wCgiBhe{7|t*1MRwYc!MFy0!Q1+l6382cS90U%JF+ zoB`8;-`6LSC?g{PHby}MCkL?{^KdtGg(TlTZ*YiQHa^GZJQci&FFmUiyE`|6F& z8|AmOZiQ~8IT|{8>?zzh3V{2_t+!7e` z&ze}Vk59Lgp)SQA7y*9V+yX!)uoxzIPuTaBIRq^>h?{$>h0wJ0N~Z4l2VJiQBA)qYMZj@(f8ixNY1<00f8#f zsZgY63Jw4uki*pEu^W11VQZwA$;)y<3LG7zEMOBDAfO{@+sd4go>W!llyBM?9F}kP zP!t=pzzkGi;~2r{Ny*OEPUOel$yEgHV0PdF2nD}^a!LE7fKE>DJ;q+vEo|C%ch}Ku zy!KC9KBQsVRdsJouCHyi)p_Xk^V;X$Kk!QcPwk!JRtIQr*`vgR2XhRcANX0ev|F-& z)uQbom50bVQIFQ&hhJ@z<7fO7J_|>i&tHlkvE9H=A}!Oyb^9Rr3gAE{n9Qh`F(grk z`#E^i4iLw19xup$_$A9a{@7k6NeY1f0JB$#lOf`ffgU{Yvo_e(QP_Dd#N@trbY?P& z{Ymf^yWtNFd~g2%f{I>vgHU^GQSk@%CO|&Ntw}35{fzu61DG36wYpiF(%(xu}AjbfwlQ^+=4D#sm~CX zHmm*V$tQNb+a~VX(Kqm>ai6z_pEO^xN5@H1!S+^h+ui&iTY3KgwjzS!0)9UD4JTEz zxzeL}z-IHAVQ7}(SzZ<@V`9J0!yoj3XL1htmvNFgfnr^lys`Yi9l=#sCz7O-l7Dr7 zZBK}w1iVB0B>a1a!Jieh?Q2yp@KQ*uMv3An^?g8G{C)5O!S)lX=n&f~Pj+se@oeNt zEa53V%i0MdnZFBT7bz@kQaiogVDk%zor5EMz-)F?f)$BjyagvDlE15c8}OKgm1b3E zPIPUIm7Pe+4o}%(?aJyUx>411)oY>i{{Tr`!jsPM6yZ@-OAAeVj%_Yk-NszfmE2t2 zxn7smEkZ-J8|6T7P6%ZylB^2$@3g1`EsvCgim~DA!KdqbHRvG?hln&A^)5&V)_R;b z1eQ>TU=gl%kOnixRJBWn+rZBel2245HVMYo$Q+y=hdARVuyv`L*3RNYAxu!p>Nj8` z#JiVi$P0!U3}hGt0Lzsl_r4&dUll_UN8;wCQYt#NE5g>dR`j->wm+USjAcAMYB-DQ z3hJ#5p9y>^_$H@hQbf@~;vW>xH`&qk2zErq+5_AVy?0*tJY3~U9Jded*C-E1B{84x;V_T>!^oXwYE8C^G)Ni!%w(;6&Hxjf^O{-~d zeC>e-y0luS zX*DZKnv%YX?WFH(e^K$L9AtE;;c)b^KGv_ar&HO|gy!My**p6;1mhTN;yWjQ&!^{{RIv(e#wF(`Wb_9-JYa^tQCS__7w_%J$KuNiCRfcD2>L&)hPf7kD!VfTJ(2H0siz zoc)zwiq!9C?E58c7Md;3*f92}2p0%W4-4ktHd_RYU={-z1y!4cEJ?%GOI9N@kUC(A zMsS^ZMaWjlk}{yT&PidP$EZKxtODaEKY%uj0~7Q7O}iUPCiIEF;@v1&&LfdyAUQ&k zg%RRPzQ6EQZG?yYpX}5EcZB$8WeK-)29f8Pb>F+U$4Mv_ z!EBaQP!#Rrso*b&bYDGOf^dTOoBGBMc8%j}DpjW|+gl{t{0~w-D)22@OW9}8sW)X5 zsa1>SX(YdS2(4eIeb1x6Ywc1<{5$ZkMYJlD-Rj;r*ZjmKWCu=$!$q;0HXtBl7m77= zwWDMS<|8pHxcwLK^77|U_;=v#N_hhqH1lursCgFJ_U=P$By|kT(Om%olOqNDREo%i zHqXm{iC?w9!ynpK`%Ra?atj~$LUav3O25)CuP0qr&gWl>?_1O@*2_}TG&{SCeKFF{ zL%h}P>@M_cjZ;g!hR*uz+ep>=Rqz_!r1&e~7rt4beP$06Ttc^SO>W{l4;J4GR{~I` zSl#@)m}EtbW{YFRxF~wZia1~UFNZKxt5Z~~({hZXD7ei^O}4aKE{giyHFkL1H=eA2 z660!8sqH9DMZ$4>$;BmRwX$hm?@Q~wti3pa(0ZPSl?NMg6rA7=Naq0L@+p|;d-MSG zJ4Q#LUbq+xSc9G2-cANe@-V+J!31QSHwOi~fsM*}02+--oMW65^K~a2j>DkFMhGB* zf(}pN6`I519X9!1sYU48N;_X&G}hMhS|77gZmlT2TTaX8Yp=WKri_=lIL~}`#xOwV z82a#k5-Ip2KQPB6XD2Jj2R#YN?hnhr0MvOPk~zmtd+t1d4mjk2$Ds5EK+ZuJCnFf{ zRD;eB2ZO-sbBtA~^Ia=^tokji-%Br;JvYm`U{PaD$3}i1DBy=YS4nW6{q>iMoIQ8stz~i9y=br368j_qE zi<0Jxx=r1tmj3|P-0ZNeQVK0OM#(#?uFBt^;(WjH;1>9SYr(9#rODf$^q|C^4peOUNyo~>9@+VUKCS(C!F44b7@mo}h*SW$^%xtzVt(<XCsAIL0$xYLOFgG04tOQb$J4G07va&Hy+h8uhIf zAlC7MMo0skpSs)}ZX|X%&jgd)V?6e&`jn%yz4yJ<;@5tkFP^Jhf|7H)NoyPL{obiv zTKey0t+cV*A`_zNKoAexq!}Z5;(LLBLHUB<9lR1a?^^*0n$L_MI#K`~cEIckugl56 z0AOTf4B)Y*iT?l+Z7?w$Ua`j@b8|S{xFiF)fX+cGNfuR^xy}b_CN?d8ff_`2G zI^nZ}z#t6ZFc=@h+OMLIvnUI|DhXqZjlg`T7$tIjaCsbxi%L`do|{4G$I44CT$Kdy zO7H+*;K)(blXwB-VB};j(s>*(U{3&U;~2^0@tXW2FvUq?>tAcht!<|^+BJRGezr%m zN)c;UsAFmIs57a(UonVq=`1+;{aXSYQ%xKm)4` zoSqLzMm>Lvb`I}ePoOFXAaHmXJ*LJ%##r)5$0TPVh~#7(5XTwhjAU*3nZ?v{ZRvMp z-mdRkw)ER|e&(LhQ_)`jTK2PDbo?Iuhk{A;CxeE-9;Y1Ro;VzgpFnM{3j@f(T%3SF zQVw|pG2Mm9&H+7fnyZd;&;yJBPH+bx6P`Qgu^n;)SX03D$-y{0WMl*Cyc597Wbkb{wWEBG^KQZmBylt;VBwj|LGAay#AWRTRDl%6CJvt~SkC@{>Uyx@GjN#2L zSw*jj*>4+a(|5Y{^y&E581T&Tva41+oUQX|88`69)nC%dc{?9|T3sXUAOrG%bA#78 z#xaa%o}SpnZp7e#18p5J0XZDwk;f-I;~;QwMr-EZhrTw|b#_>;qm72qgArD6Ng(Ai zNK!e;$iY804iCTD$YoGUjmMsO#xvB8pz=G8!;1Z*D$Z4SL31Z~q}sEM^jcfZ_FZm& zJ!d&g^7_)JG}W4VH@1rDHR_snw|$M(+wbT)<2;_3asFOkiX20|Pk6uTp(S zeYhm%qeGsf2a(Qt5d5P$0zI10ZmwO z*z$Xf;Cd6^sLAMf>_wo*X$J$)dY*qg0mrulcCPqJ%{Aq(&2QzW$+J1~wQK9!wd~Sc zz4z1a+;KPqgWJ>YoRR1{a8GOz*i?fV>BbH?9X)a~duP4|dSD8!t_bQ#;P)e`C)XgH z^v~mtX3jC!k=r=u7#;KJ)a3W|?xxdmvs-%fx8u|D=y5dfuI={U`s;6%%WH${j1Dk) z2b^GMZVzAQQsb!3JCH^>=R9-QI3OQhc_yo&$9(b7^TEzD^#=#1TxXF}sVqhYdmgw0 zJxRdh2PE)Ee2zzrS!oj)ij#ypn{HZBFJnTqrwSnCzG?SMPlI2jv0!wi%}r zWch3psWqa%U2SXix30cVQ*4VO&a;`gQKJbxJ>GaN?aGsO(d(tHtcIB(;2ZsdT_G_M> z-3@`3ZHv*#`(gN)9kO^QP5|vCqt_+Q4&n~crIt`YByvj;j0_S!evgYBJ4Q~PlAZZ( zo%PdeclGYNv+QT#HyGBBwECNjY^D5aF6rA_bKj%3n)&K}fu-b3#SQAnNk1rzDZt6V zI|e}D5((e~*P6GGu#Qe1_m;HIX$}$Fa|&R{c>t2Qe0q=10Gd~&Q2SEagK3}ao0RjqYROg*8@F$aC6D+ z>(F~sn2rhLbpwyCN7Jz5uXBp}nOhR0ILR%Yx?4><@7ccoN6$h|gK%-?dMy`wYObGW zf4g%*NFZSU0G@jNdgqLv%AHiv$Q(8fc+W$QJx?4GIpkoD4LC^O-yeu4`Qwhhxj5;N z1l=t!wU)mw->+NrMWo)k+tL33k!p&q=AZA6`{dJvr_?vlVD&w_cI(Hz3QPHxtNgpa z>u!vEkNUd&(kG&$5)P*r#(2r&J#aI}{{UOD$X_vk&%aFlPXigP)Yn$DTJ`O%)z!6M zc&z(BxsRfm<}bg~2R;7)4&J}hDdrDD`uqEPf1Wa&;?uKE>f5fqTlHHmp=a6s%#wk9GI@Tl4<4vC97d8*Kjo%VOm*nLs>@ z<0I-iboc)NJk?({PgW=K1E=Gj{kT1G(t{#@we-n9rsKiituhWCi)M)}Z=|(vuJ_ZU z-&Va{x`IyWwAQ_J*{}0oc@uZedZ+_D9s%jcCnwjoIqL}@#h*^O>(5i1cOYjKr^xV4}NkFu3ICwPsM>8^s2;+o;vqA z$Ki||9{oWlJ+gc}LrKZqcfIWN+pUsYKDs*(mR+8^SwF_t*ZQ#TF_3-9I42)BP&$l` z*yGb8tG98UF_Jjvj(txcVBize7{RL<03I+#PbcUBCnMN$a5)*qYOx?-w_ep_R;8`n-vH<{4dK#Wo6rLy*k_H0mm5r?lac|sNnIA z-;C4NF%04u|6$qRU5lXHdfiK-In@ks{8#8=t5Rr?47i|zgsnLmfa0@Ve6dnoF2q< z;CDQOo_lZ&M8!uuXSZGseZ6zX7{NT?)H};{BOH2Q;N)^U1B1x~^!anlPX7Ql1~3Ob z^N6Rj4$IQd<#FHV;E{l`L0ZkyYur>poIgcaMdvoj4^C$B;=b?vj&nLf5hl8K~xFeuA(@@J@$S|72QRAEvwCUy zYwK=-Zj^~m~h-#(o&WYnbB+M(g&i~3%Z3MVDu*XM#u(%-0~~b&kF0f^HKdF)ji;Oq zp!Uv3e}4P{oY%-cEhK8w0nkiB=LGT>Dxq+|t^p(wo-vbOi};CK>iC*6gzt8m-P-Cq zX`=MK+4_eBK~#-ZZFyG9ds^GytG%?nx|TEzR#R_b11=g*G9R204jJ8DSd)Uh05CK6 z3Na*}pHsCmY4@_ot;`GZvg3ByL0&fSfN_F%4n|duPX*y;V=kMy-;0Zo066)vE&)AG z0LdHxcM;BO(=}yx)9(V4wIF6DG6`=lX?zCY@CXMzGmH`ic{wIG+F`F!ZM2d}tx}93 z>DPUo^;(~2iKeMysjG6QD9T^>9CljzF4sKH>&-|yhGjd!Trtk_atH$?Z{!S+6-fl{ z#~-X(8_QSA_K}n_DGW#~0XX4_z}!@v95Kdgqtx{q2Z?~42`iK#n|l&KCusrBc-@7^ z_rM!T<*z5U7R)@*%vFKFlO>Kq5h12Lt8<9Pk0%w`e%V4+Qap*NV9)S5i(u9ORV; z1m^@Dz>|P;gX%fWCDaOz2+Ia6cqHR@%DFpu``H75k=Kwa2`2eK!*&@NJ;w*+AhB!% z@0=R=>{Tf_OMaH#-nP*`%WXD&545LE$|>n}dta`*uU+=PWo954CxeirWb!gIoaFqZ zWap3vuK`7*$=W#}@r-1gu^1T0B#i$63GO~(ep;)HjAW1r>CkrhvBq=GN|VnlSd(P| z+NTF2jNyUCMmho1j9`K~0yB(od-1*Ay581JJHuT&zMa{OrF|cDWc2B_%jd7Anv;%l zNFD2NdCieiH>}gEz~oyg_(%XLFIr19$V$cPHO)E#f!a~&58^i zwpM$v#DY=;BpiS+cQ!GAHyrWIo~BnR;$)PZrSC`9>1}n<+4kR4=4&a}%&^d2@>Hw6 z^wv~ty6J7Lx>xn%eku5ZEq=qpmoc)p*#@tEu)@xl02=dm%i<}->$!DSu3Qkt&ADY^US*tG$lM4306x14wT+UOn%DVN^zZ7vX4r?z33*=k@1pY4 zSNHctNTmdryEF5r}BA&z8WkOt6O<^zxv6P0fD!~9urnstrfHO)YYuC)*Zf9zh~D&^GyA@xuvC{ zJN2^nb?Ma~E;_b3134c2;AG^Fn1D_I1RUg&d92x2?t*i-0IoM=U}S^2Lv7EoCpqc~ z+GY80JAuXl7#nfdA9;>&GDc50+l=`X4DfM)K?IDR26l`BMtTOwAau?T^i3;r)3xo( z4_}3O>G%1clvUlW+k5$4J3DzUjkmtGW*evaOAt`#g5_)5#?aW> z%djBR#l%iJ0w$T@je9Q5(4ogWL~5w3mSpwKKT8*%0Bn3pV_^q{zAV0-bvRevuz0t` zN#Teh0}87f-fHkp4##KN17Tx9BKg#+8E3Z`0_H|yP=Ls>$Yk7AM)eCSmXblYX=FtQ zd%EyZ%q3D%gk9Y^xXmY`<+ZeJYsliY)w{i}U3zYki#BO+(#@ZC ze!`k{u7IDl_r(U(WNE$}{2}m%f&4vbZ>Q=L+)t@|UAXaXrLJoMZBee;<3iECA6Q%4 zT3g3)CBV7W3dsswz{BFt9Z#id-v_kqPUpfN8@;sg55~`r7qH$>d#Tz_r(bw4#-0H1 zkB4Jsi@qAwbd46+ zpBnr&*7b?6HJ>j309(-YI}6@CkFDddxV6?-Ofq~w zu4rS!U$ftgye+G1cCbz0?}_?F&YNb|;^gXW<3ApJdXD1TM4r>_B71E>N2AI1Zc5X8FU9WDpJ*qlj9N{Z+ z;p<=C{u=f$jjps;nsU7NQ@3N|*~ykb&5@E{JBvBV;2fWra&U6F2RX}gnSB{6!BBp1 z!AJz|C|R?(jmV^e0+JVMfs$)h;E2fsoQ4IX&UTyz$r(R33XTR8VDdJK7j3yg4V)6+ zDH$VxOALTA0)v31j$7u)&-H~EDpaUi_tMR$vgNjmSG})&zE=FQw40N&cZ+)Hv}!uH z^LBUX0>*r92g;8bCj>jXmn*YBFpREB6O|!Zcq`(X+dLXJq(Q@-X5K~GyoiwZe!DQpAAcC8p{Z>o>}eUv6A5Z zo;jsLvrB>tNh`WV_ti-)^BXm^lCz5odv#eDBxol_-WVw*nfESm2@#Z!<=Dq436UN- z*<=OL;sa}|N~{CmV3s9{f|+2&hTILf09TuV;0&t)RaU2my+}rUwJJ$e<53Z;;fu7l6N0e7fgQH2Q7BdF>*XFA*>QWV8?{}t_*+&CW0j@zCAWep z_Od!77~Di~&I>BO1Cz9yR<~}8clLW|q-$v1_Q@%RO_ISZEwsi%NLi77n`;`y=a*t9)kFVYyhsUHmTbBnZ1?NXzL~wpyjRDq}=)ml}L*R3DU* z3yrGd^oo2%f2-Z8$(5AlNofc%lxzeXkjhDOjjBqZDt5>DN&6e>3I6~K{{X?(xg+~m z!v6pg^ytF7$fR5N3trU~SA4E_I_cY-2U0?k3npvzVUS6uJ<6T_eSo-DjO{G5$n(T- z4iZz9>VqMG$YYWGb>i+4N<2YS;rWnZw%7Wyn+r~)qNaTTn4&hY4 z;IOg@7xs2Q&$c-JJQrLNjwHYMHma-!3rG8q0w^CZ02TlX9~BvY;W6+VD<7LuU8IqM z*HT_ALpdjVc|>D54Y%eympOm%S7OQk016MCxL=Iw5rzX9bx(#dDN++CU&_J;JRw7e z3?m*d1;H*a;Wx{DFZE~O&a z&Adhe2?Bzlgpqs4$DLj+SH}MUYJmw+;U9)DBeKY$mfPXCgrOr0suhRJxmGCtVbFvO z-_{lIRH|_%Lx|+&bg-F=a=NrR-V2wd{?wFpeXnGG178_BSr%nMOPAW>a`^PKj6JV4 zp6Rs}eG`53JaC+Ifs(v&%do)`VL@CBF(V^!#z^3VP%^-k`S+9ab|4VPAcK*>QCQ_AHMmG0jH*~J~ zz1^LkYdtpJ)@4PtQZP>MmM&6jM(&&4tLvv*Jr`3pCK20Q&29`pTHG?3GH@lAao#3b z8bu2cGCL{W-!q082lTW432ozq_-pa^;(v*C9UoNJ(tn1Y8`D0`qf289>mzHoxwtXU zBoVw{DR*GaD{eCFc@fpWHAQpJzT18?A8<_|h!3a*#{&C|l(Dv?EgI89y zSij{~x_Z4Yy|wOtWJe(2n)H{}Yr-?q@9W)kzMj(htzTVl>-21YwcmkbWixnB$5yOx zJkPP|*I`c>Bt@x~ILQn0Ha7qP-CNdwwm-tO;%l!LX}Kwo{tLdjARI9P?BTp_a&o{s z1>96_CvVE%@Tz_xg#msS>yaIqEZVk&P_{_UWYnW09k&$Wxg;({f$+EDdVo{m=CG@R z3XNOC2XD;WmHyXu1oaQJI0WTmRmjRTBJCGsuC?}&PiU@*YwLYg-shiJg!n3|N;vfx zJwM*5OGMJO>ibPw=zW`E`&s-HKl2jRU!0+(C;zFDchnnm}jlhfD4e&Am!H-g4 zq-W(BAOcvqC51qK75qvk1Hd}k6(jD=qyo4AE(&Ty4ge}~(c8b$1M&JP8bv!n&`$_yQ)4tr_V%Fp~cCqSnHNBK7JefT8+?!`{O5$RT%NSs9%_Se}H}v zXjiM^n{O6)eiyhFei^Zv3#*s8o*3^fuV-PhCttJ77U@}8aUzhL8)_*YE@-m)HQ=V- zGn8!wD7h=Os!wa`{OzOC>l{xF@cvitP{mcL3&K3GuAZt;k1eUV-TTV+{P*$i+6VTQ z*ZvyGu3mT#L-4J$+r{B0FnEH(^H*sk*X^&Tm8F8iSJAU9aK{luNyt}{cV#DYN$}RC z{{RIY`1c$-jkKN>_(gFXb6eWHZQ(By7$lBJn&M9~74h&=tF&&~dB#RKG{3av%(_pC zJ|^flI>pAWExc=>=+=|mTSk%#Uk~Yb_DLI?HCuILYklljWRg2OI=rrS{4;v(CEQOP z!9>(2)VGF(3}vm5BvG#P4kc33`Foq@R8prbcYjQHS;CoCVV2XYm|$UElTdDLRElZS zrsS2q>o;`zY?oul%yT+)R3nC-v5Zs`Z=c-KGIE@hnoTEpHzm~i_g4P^f|Gn}w6xM^ zkKw<;g7V$mK_)aG7(${nkIW4UFOFn%GI>LJ^BWxG)k6T zvS~grX@n(Mu~$zTfP|DdLnHZza+y>{iC+?UsH*9DNLb@W8k?^yppo`j)sQ;$kiJ0O zk+cEH$*wJ=Rlnb{N8T(PWbY8Nleh%kxh0Sc7a-+GTxGv`!}v?#^?0ei9mD%cYtI^$ z)!J#_O3%q?y6Uccz9);bsu7p6##C{Q^lnZonXM9c)4kK_YoBg>ME?MSn*P$h9r%6X zzZJvq%ivSZX=AKh806BtePp_-X*Og>6mnbmvh@9`<|tyb-Ea(6iy)N+$c=4h`~m*} zg7}?7Tm8Sj1^8l12T`bg&6XN9>{?_}wbb`%dGS8cEcD;sU0p*Z;Jbp}1~R?eDq%Cb zKb&jtPZXuQcuV4h7k4_1^|q_w4Pxfr(nk|RYdktmsD&W3)2v0za7hcRPG*vMH^nUQ zk#lhEUzQ*6TFY0|zibbK_cH0LsY`MDK6s=>9J-LVMvF|WR&Uz+I2x8k!N6UjJ#jxs7)ZdnX3H5_#Gok=>6+0*51NzTgB+n0OuZLcMt?CxrYH@NPc^>L0Q&_$}hy zSHn`-*=oKk@z?DRx}KvE@$IIeJ>w5j==8N#~@HfQ|4}3H6ZTp`Od^+$vo*C1wt+e<)FnE0G zzACgtY5o(DG`%7@t~DEzDTLj9kMRmyJKurdwO#F$ zLt4|}@t6D)wq?{#g?HgAbXWL0@rOzi19@aGW_ydttwhOpabntvO>KP^pEP#u96eaP zI))~aaByl=z1bxP8&rm`-GgcJt9yxB*3};s!?Tj1j&f_4>a$6yCY-*nQ8#PNF0tiO zYfIf|m&Tr4a~6;i7#+n%)#Y7Lj@Bw=D&@;45vCZ8<~2~SXr{i1+saH~<5*Q#1O!T4 zfDYh{cMz=3Q5Hum0)x0$gbRqwinndEGye8GY}i^i6UQju8OZsga8<9sv{T-rtQuByvT zY^`qB{Z9`87&^6Ee-xAK-R-TqJFBnrXQC~~fqo_UseE_wpT}PlemeY9y4LiKFHq7o z>t7JdCb4g7EiLSPFg$mtYr1Z+X>JL#(L6t*{5$Xui*Ecnu_9?&KBb^}IsF=s_96J; zVc<;@#(%Yc#LtBP0Ps)Gf^)Id{5RnL0Ek{1@a?z8?-+PLSd{8NV(_o*`#icwiacPi zJ@nDq>z@_xd@HJ5I=$>aVeo7yEO`X|zjbff=TEfokL(ruJ$PsKIoI_YR`A!v58ChI zJ>Hw~llH>#--{*F#jl7D!#gcj%6kuk8a}(J+T7@RM}>YBcttMsYsq1f`^UOYt7&nl zX`c)HNBCc;+W50r_?hviR@6Kd9rW?)TBrOk9}(#uG5w-`CQEd?S68|^mcSZ$it6Artgwd~e^D_V7(M@eBJgrxVcQZSU3)^SO6*Jrz3(e>1Em~658 zS`x3BRZ)uiyNswsO6x@K+@h?nCn&9MmGoa{+WydAu)n~~OH+sTWB3i?zuNcWUxn;p zu$SXk#<+B^5NI$#XDqifYdTMZHQxILefXMzS1u|8}Oe(6ZpHwR@YMt``sD~4-5F;!E;L#mU_+Iy|t~X z+kO3`f5AO}V?Wux&rk99?J4mmTK%ScPo_^SR@R<6w$eTr{3O%0hqRU<7L)MmPZQYb zQ7xiIEiJ74N8)?vuB_}P@eRj=w7mw)&av*m;_}=aqUcVpWr}>Oktsrwl5w(E)vLE= zv}s!DA2*!l`L1it9AyY(^keoZr56;^SCqA!uB@ALTHecBufqQT3it-=;-8PlhI}vZ z{{Y1w9lj^p3AKy88{v(2>#a)W?e(#@5TEs3_+{w`get<%G_!G4)9bS2G<~l>q(d5HmRWAOQ=Qi zSH+qC0BdiF#`aIzJNBCR7yBgmb4s(Fb?<{;4E#?G-->)Up!rfqaTkg&{3AZ5o9?Yd z7IEmys}OGjlHySPa-;`MI&wR^j_e*k~rpFguL^Xoo0)BI)oKzu^dNRkf@ z{72WI@r~`isRIjZw7u|0hUW0+!~HhQJk~cqW%#M$1{Vh5tl`s5#k6K6(f@FCE$3qS^dL{h@Wc-vN9gj`iVSt>NE+ zJ`B6C@fV4$CwW=zrSbQTbpHS~BNrFG8S`&e&rbC%Ys0^{SM3Ag2(^EX9~Cq&**ErZ zzSG*zOw%>_bgzIv2<|jNIl7NT@W+6BIccG49x$~@U7pt8`zK$Uax71HsHq})@yO`Z zf~c`GsFmEDv`JY#d7ipo?Ix|>$#{5-Ors_BmZ-(qB%d>FxTh5wZOO{^OGvGC*HZ)H zUxYpj_+!L!>mRnC$Da}Y(ti-GAeL)C+0*uS*CLw3MZ9-uj-BJ*je3{%{C0Mh_cHF( zEUgXCil6Ny9ZDe!_nR)Y|xCMe(=o zbK>g>M6pe*9dF=&z=gSr*X6mr(;$@mSnoJ#*)Hts08D zr)xpVDlYTo_m-1Zy7hfq;ZMS^g4Z)@zZkrA;g1!3N|xeTwGR*Jn(};B@hm!y@|Te6 zF!*}*Ukh7bKbtE_KZ|u;;p0hcpq}V6r=56<_Jg$hL0<^?D$Q0jXzevm9$Z1MT-$F} zM3YSL<*Hg}I(a}hq&F|EVYZii;VaL4DeybRI+%i8QX!$(WQMYf$vUGU2XNUufi24q zkeQ@;BHSI|!Q4KR@Ylkh4(Jf5i$S)E;V@fM)Fe8#sU(W+lNQiow06Rxn|~w*A(k&N z6>qD;WVx;~F`QDR2BPGoxp|`bTerI8+fMhFCw=rhEKVwgIbGCsrnFx3N-IkwugeQ9 zTvxPkZOAef+(BKd z8jf27E@cc@7It&7ey0h;NhteR$;m4=(|3OE*0*(Q{;i%>OvZBNgdZe(MOkjHmus%d zDfZIq!2ECF_^kD5{41;qa?0QR8t8 z6~IE+F}TBJdJ;UF#OMZv;#-9-3+YEB0;2_00DdqRX~9wtLJsg$4ou4_g$fniqT|a6 zbbkt`9d^G){Z5P?CR3diyK{xUFNw}AZP{M-Pi14lH0aAgft+9f_+=j{+6GP+J#&&& zjih5NYUELbknTi3bYYcP3@!^P*c1-KpOhY$2CHZwc?*>|JP^tPe8tY}a=E|*c2t9c zIt|+*HD}Hl0VEDa(7=E`V#}Q8*BEX#fEK?g!&Rj^zs8-pnoC!0W4d4PHuBf)Cx=Q3 zPF8Z=S-oE>z4~j>+f{2@YqnPURKxx}?cbc{OF-n4kbdwRyX^-D3!XvAx^#^opZM{& zUJm2-a7v8h3~}=UGBOEeDmmnek4=Zm##bALNL&R6p(JAgv9MzbIuLgQTWUe)Y2{f) zP8k9o31Sp=0Iwk65Jm>t`wT4#Q>PZHC#I>!`&#Q>o^O2}ufLU1G}2WhpYp5iqrXe( z=X*BYw>ie}=7}uqS_tqFv-`O=mLY~m0Q|Th9I;gx;9wqZ{{TSH;k=OyO~RpFzIX~s z5JoVh#Egoy~!ALQx4X(!= za;g`07aw?#aga8e;LWgqyZ0$VZ<^}qT{}fzzMZZw8*n3>WS)HKc*ZbJK_e$Un*6+b3Yp`+v^e1@Z10dv{7@VmG8Q_kFt);!{;Dk~~APE$5GwYtG*8uWJC#TCsjaMeV zuYT9jU){5_y3wZedTXiFs?SCBxh)p=dR{x-c5U_A_di!6LUi8#@JFB=O+chAk82FlNc?4RJTKspS%FPiMLMhh{<90PY}5q zMq7&YBF*`>;w*(+Y_Pc2h--p^Ou<%}EEN-8=e zmiG5syVCmU{&y=If~*QmK^|MhU?j0M(rKzD7rwTOOOR0mo9i zxNMf{ak#3Flx7suUlWVl%_VQ;{{V*B?Cgm{Rm~o%>Fm~zv*~SByxo!LcHTa}SauN$ z50Q@K7-NP6<8qL=w9f3oGp8FTUz>B+ja75rrVu`^zVIkCW7uobAy(V0)pFFm5h1v%Vgn#;hO}F*{;V- zi&QYjvg#Rjfw#<=q}mQ}85r`k*XiCfFxyLMty^4OqX0bHf0$r^yCp+~D%(LPZVG~N z(4J0zCR>?qELEa~*~-TM04Y$}J4jq(jiZn_z#yDwDamp))wEixS^O>CHs4F%efwCo z2DDa5yZPTl?)g>y>v}8ov0Hx|h!|0xcwA(RsUrhD2P2dBe)R>986W~dBoYV!9#;Sn z&PO=N!8zuWf-*M}JxL&u$FATw7(9YO;9%ebAb>|qbJH0hjFtf73&}YL02Ud?l~d!F zujsq$_mrKNZFl*{u8sGy*8N#F)W-*f`H0R2-0(Q>gSZegk$|J9Zsc5j;!X$(y^4Z& zE)Fq}LB}{ac~mAXeN`LxL2H`FI=0feFlN z5+DRX5;4odY1w4kx<#`HoUWH;U?zD!{-J~XEXC;ai zlY56^88_gT+DkAB#{dLs<)zZ6(WCn`h0VD>Tyr2kKm?K%LiNi&47f%2l)z?Vn`SWRH1MblB~f9BjqBv>eH3*NnKj$S=l|>=2up4dvvyc4s>~KS?BQ%q^J0b=};9VS9oM* zy}=)K@wGtRw3IxX7XJVW{4;XuAH@2qhILW@020eKWyt`3>}par<|MKLs>dhfBr7#t zKULJ_f3p7oY|e!4QzW*Ua>g7ND-x`Bv9LKI_OpYYhXqL4n#WWJFzYfSvW>DPpJ-#; zHxfty$iVJjnP1h=jmI8MNY9(zlS#Cl`E6^hb$cr={kx;D4;alkIIBIA=385E$B7ur4amhy#pv`e-RZ!g}~$HI@{+fNO6Oa2Kz@mu15g+3nWtK*$tL-D7JJ}||q z!=ZS)$6hVFu(|QN=-vbP9pPOT%y_58ej(JXrhOvgPMB&k*+qLEk*7&>WAKfg--;q4I`Ed4rC;hgFNid~R?k<{b*R@_DQ>!ro!zCR(LsJKZLeM> zGPAFkC;c?N{ir-Y@k78`?}&U+{{RIo{{VuY_-poi^gX>EI9rzOXM{4K8ATwiEfMZbl-ZGQ!=^L`)VH4M&m@X^9y zs#b-jomxt@NkOScmQsZpZalVgca*IL`#T@3@Qr*X8x2)^UPm`imNT1+=62_coTQ@} zJ4abrT}8#Es`A|`@4^Q~(pO6OC*Tj+W5pV`i2fjWZ{mmS^Wjg4`rpK#8^?FxZ70B! zco)W>5QmNYd*go-coyqH(mZM6y&l)Y8btPyT+gmsUusJ%XGmH4Bxafj=3x}_%CN1& zCM}lQXrn7EN`~IvP3%SFje0Sonj1BSY#2*iQVW;cfHt=1vHa;u(2dwJ4{{Vzwp5sdRqkVVc zUl(89>Y6s6;w^2o9abrProhj2Zyn29yjqcp5w2KE70fWhe{C$fdzdDyyEW3WFoVSJX2 zBDj>PUz==!NiH5KBU2*fgD{Q$euZ;sXOY0Pfk7d1!D9=B9I?*O8ICYmaQISxO~*8< ze&%XXNjq+nv|4Gark49HSCR4YrR?dYDo>tQw4j6{N(LJz{muW4nPMd zwt7|^k&Toalv3UL#?NJ_%__QM_e=*l-U*K*%`_ z_$dOY+AeiTfGja;nHV|c(*WgmfW%-Qn;3I})`YKp`slBwt9vfH-L<3YM5DK7d+BA< zU9Zynr)R6)-2hSn&fa*y!B9G!HVDVf(2j(jGIEkBVh95y9&iSG5C|M}BxgR{XLXT- zxTqN;b7vsuARn7Jz&(`UpCB^Gbsbt+23_vuT<}I=3z4}&Kt!!5>A_}Wz;RxWuK0#) z--LI58jakc@Ry0?j~no3n$uL&Y*dum=;HP`3YL*@$Qf8MQv4{DF6WZ+GQ}??miaIU zS4+2hg>qClWhpA{!-7G;z}mIvWi;IfUX)T^)}*RCB%4yGw`wWhPcK%@@zouAl&3jK z@+&2M6{*unb-!h6Ew^?V7+^9n{5+_@+&IdDgb)S@%MJkG0!>-7UPoov4l>y}4bFBd z_5d6);9;`IF~);w0dO<4e4rr;Gl7txH{L1%JmroFCal@68HpzWag`Yv8R~nC<0Lb2 z(DHNaR8ehPw^r|^tygo{Q7wBjZ6W_8+?mXjiVR$d=K!CVZS&+y*Q)S(jn05&dVoj(908IB z^n*a(5{zNGgEs1#yfZ>x__Vc{K<& z(`luu^0vQ|4Su%ZM%Gd0aS7e)#cE?4j|d@M*U;Z{Ta? zn)CZAIQ0Jj8TfwkSnl;8Ev!jGYxoyIBZr8bjRaf`m&Y1ee@d}=YT zo*0C<%<>5&M-iRHo8(P|`Hg^EV2$!ZmQk0lEQ{fdTGCPWl$yd}8o|6rzD01rt+IWf zu|IV!!p$3g_T7VqYV<#dzYn}~@TIStx`zJ% zOqP2Y?c@ZKu*%cKN0T&hO0O8@Ac;zwM-M1p-{g=1#u*tv47)dySQ5oqWDHc5WArqu zVewf_Xhy9%l<`=3LNy~LD7e&$ij*a^p0BQ{D`~0IgjMNRjHInPa*MY$n{jb%S^Ll7 z+peBS{2f7;+S_gA*Mg}uZN zlxXz}T@FTy4ce8qp8o(S+wgD1Z-!nn*7Uyu=)V%YFXE3A$ziYRM@`T!TK;u|!@9kX z_SB!+_RS`c_ieFgi0J;j_?QCeJ0Yy6MN;a>pWTt%#E{{RpCB`&pXD@hi) zZKCP7TELb?W}f2a^y%w<=067uwU? zO{l};p99DCNwn$jj+<_?c$2|5J{#6_`>7?>wH-Uemr%Z)bNEB?YvG^7PlNs=m%%?6 zd>to)b;&L7F0`2A)ql3UAMp;-!U(3h)qWm$#?sQ-9Y#AC?(FXMZ3j`d(>zt6!#ojd zx;26qlE18Lv3DPzJ*~XgHzqh7ZbFu+bM|~fVn*34(907Qjz^5cbLFIxIaT)_LdV*Yk8-5LHt!= zdF2B7v)#+4UA>l@eLFV?gg!54IC{7|qcL@HSSq->R4K}|T-#Y({!Q+nj?VDIAUl*Y zvvL{TB)mp!o`IP`Bb;QZ<6&3@%xQKRh5%3$mI}aZ3_~y^5^~C+$UBKV5Hrwt;@NC9 z_P5%=m{wKZtagTZm<^ba9ICG88;M}-NM$7QQUor?0Z!5m00$*V>Ph2*NFa6NIOqKq z%Bw6z3R8ErNJeQpJE!-y`OaYSv&VMn_5R4 zM$5PWK+Xb;5-TSzB77Qw>o$I0^Hl|jx+fJh`M-I}IMhAIvZ zAP~czs#gSHWRa2p&s>5kbZHc1E^~$IR|E_Kr(rn3#&duMMl;8*;-IXwcfOAOudTW( zG@Z3)Et|g9((T*2+g)#?v)O2k1E@(LDnQys)3lJ;&&mfmBXB2aVU7SJ97005$;Lq? z_JG9TjGUKdBxjW$IN%n*6(02?KQJ6&vT=sV0N`Nc1IYmJP6-6kg)BHK00B-1B$MgO zZBy6gQVCqPI2=>DcG}wCzSh32U1|60qPtElz4dlZ`bVPblGCNHeLE&2#?NVR7!RBx z;B8E0jt9(Csa&rNQ=UQOk?d~6?X!Y%Jiw}0oH53B0g;SlK- z?F45t#)B+bat7cD;E-?+IXMnb-|_G_Wk4A~6z2qzq+nni91I?YxT?0&zf0-1 z>KDJ3%G!Rbw+VEbd%j-0)^~b6f4aK$^hM}X_l!t8jtK|`#RWho9Q4je848D>#a4lU z)MV&CcOcpeVSObx8 zL|3x>r{_|nE>t!n80Rg3R4CdoNFcD}*D{lBtsdKLZ7i>6eXncw)#__nPAV;Jb?a*` z*0t{UcD?rNj!>R(KB_PeA1EV{&mNg19P((}p2r1)0!Bw9kbdiQEH?~ukZ?gFt%M!% zz$4or9l$W`3ul%Y$-z_2Aw@k@bmzGT9Go1Gc{s@Gt;R65r?h|7_WP~Z@4knePJpEQrH6+&O6pFsHL=1!QyLNgWM*sY`-=DUAe&| z;|;q!lb)6}%+e8p3fu78kIbt0QH9}ijyi+RSz99;RYCoUK6enZLdVnrtK0CS86!B` zxxQ>3ILWBZZ=%<0+4Q@<`|I1&Qqp!;TQz3dzVS~)m;4R89(3`Xg&+@@a52dWpyXiW zXB><-ILRk9AX0hmNhA}HNjV3p!vX8u9(m$Pkx5*D2UEe^I9@;?oZ$0;ju!-wDqW`o zx2pg!SBzwG7&9;*cLX22dCy#A?Y_%Iv`=oj`SnkvOqy5ur)B2%>a^g_I%Oa0gI9#dNV+lYa{gj4i?HFq=Yfq~PR+!o~&&3{G+g=A$R< z+DO~9hEiOp7*)EQF$A+@4aygirz0q%63=owfzU2d-m?&macQ?#AUJm7K z9tHtlmnWUl#3GfbT$kDT}$$#)mfE)I{@nf+AXYBRj7LnMpgp2+YUkD~Oerx-{6nn%4GfmMPt7yOQg5*;${9VVhK|Ug<;G z+Wj9oOMaH?>Yrojui8)IMyX@_L29;V#UB+S)Kqv9)%+!;J=N@*Y?AmV!?91JwcVb% zrRjE-+SQ%h_ZIr5i{c$yU4k7}YiP7>Hu52>&-2fNd@18^i4u6%!TuWXe~o@7>;4_k zwLM=~@Xv+spHQ1m@DIb;bxVzBQSlzOw)c9bm!W7<>auD&&90TG=@t^%UcH{LY?DnC z>EimCw$iSi(#p!uNVUJz^;zcde}?375?Bki(ykAQykTPm8tgh=w`=Ea&=oZJ)ZNK+ z7U?kOt@w50{WsxrjKH7?J ze~PRx*0${W+IgR}tr=FTsl~NMzq48D4P|BF&x!hf#j91+ zJWJu<68Mt$N1sp7l1XRQXVrW+uXudgYPzH|+1*QRyGzriv+&uAO;aYL;Z(G?va;3B zkISkFrFpdUw}SRxB((EQcDDi<6-4DjTu%~46!GN5WGjHiKnZSJS@BQ&BsV%N7d{&B z{)PROX{}m8ZK4avEa9`fyVU$a1*EfF-dqO$%6Z<)M&8ME*0E`}7gtx8YS%YeOK{S} zvfXcvFOv~lBU~?;I$<(cP^l}^wA-{(g*dfERD6`=;O#vf z?I$Z=@7h_ioIRW;7fn7`^4%uVgKb?W6trIQyK8o}JuWS9TgA0CIa%`aub(y5<3%e1 zf;i)nRCtUiimH6pOoC&0NedlR)^6qCY7;2Hj||et12P3gje*>vJ-d9hNJ0kOCSd2x z;LM?(>Sgeamm-tXbrrWQmrl3uZp}S--ZE0=eCaEuoE=TH()%^nqPJ^n*};8&>#$vr z1{u@MXJ8S75XIXpfr1h?xMs;<QHMWn;5TWZ=wUUAvw zrOKtuMS$2ZAt|;N1gROV;Lz?cwLfIIE?9O<&;Nzhr*I9}a(KzuGh6(eMZDGx3w+-+=siKAYgL2!6`9 zS{z;^@t=XF)^z(19LwXs0C*^d@zi{U+INwYf7gkaQHz}mD{J}9&CGsK#w z^e5my2Y7$s=fcm1pAEb#sorZoAMg%|CY`0->T};+YZq;*YIoOq-l3^BscUJgCB~zz z+-f?5Y5I+wmG+C~E{$q4LwZHQJ0O4Z}_rjI&S+yKaRhUAq3UZRIg`lH2;j2DZE_hOD#xi=wGm4U$ zpEGNg-_`yMX49b=tjZOoCG7o_s>b(8T2hRZIq%CWJI|I)r3*IE^n1MEnBdHl#El{{ zv_YVa6suuo-wcXlX*NY5C_=NY-M(U?%M`z5eD8+jPBi<~-Q{Wz1IjM#jBKjbnuUYM zJa-nCS(U}T!zSB{T}IZ&=Tq?_^GWf{+IGKrZD-(C)-@e7RPg|jZlA$kB1mC{L z1nd)jui#B>b&KZIZ*>>*d=sz5VQD+f;KtSNya)76%+DRf^WNJzJL7@1rOt^H8c_F=FXJakYV9VuyW-Zgjb)jleFY(TI!mAIQ(#7U6o2x2b&V=IH zrD<}lWAO7gX4_Y?jh`!5{;R>}-&mxc4i}7V8GG(BN-i%%?XI@9+Iqs#lZ=y}=3|ne zXCApEoURUYgX(z&c_d&|y1rXgIocQk0{UYI?+o?H%Mt>Tr0&it8K;sTya-@qOl>KE zj_J6eIf%#-KiD)yqcq?wyk(y75K8C2dp%19E~CmIH?B4t9nN zI0vCSw`RFLQ&E=uGTzH0p$BwkSqf!`1IiKw!2}XEf(axLK>|zJk}^D%!j{j>HsHPp z{u0=1?fHPo$KE&x5?ovYX9Fs%+p-TpK*InDBw%n!E7%d1{U<2N@U)dVs!_j3%A4uc z@2eTPy+E zpz=;wwQ+FTsJ3DA9nNIrZY)gOfIl`qeaGh+9Fhh|&!=ma?Dj-tXC+8dIt5~Ka04$R z<-iAyxvpy4NoKcSl<^{Dj^}vE;NS-82pAb`0ydNSP750hJqW?gDBqUJt7xLG`Yj!` zw!5D{iNI8nzU|&l>E7~j*HrphtGliB+|O9goP&S>P`$7RL&!Y*$A$!84c#l#^h9lu z;9%o|0agb%AcKNQ!O2{JaDHKsc}TRhmn%C= z$OVpb#y<9G*RTlmy)9Ufrt;S$f^oV=>IWbKa>O2a>`1Fu5Go5&4<=Sz_1swkjo9US zk-3N6%;Wbu*HJpdr};>DC9M?0_z z<0?;fT#g9`C$0#_PDe(HW!l6j+sGd%;Bp4=afVVpP{EE19tql~@+{THRU1unIa=z< z*R}7bTj{pCwpI#Ptu=eCceS*#>8<!zl0qRK00Jt4E`ksYI6*KF`?0w^o3Frwpe%Tnv1mG|@se=+S#jrXOI1G6E**M2w zN8UK~u79gyC3z^y$*n%?r)%9kFMI8?CB~n_be-+_K8t;{y6JOHCdNs?>+=R64lttt zoaK-4bHF?T#Bd33+G6qQO4n}j1h0(0zRy^s$m8aLr>uv74{o13*$KkI|P7O)fyC$u&R_d3c zZC?8J_Rj-rm)2KD`!V*rs0Dn3BJ?~M&JnOqGR&ipH)D$WBSrBijiwBI-8wW*Ryj2F zRv-dZSNE}GoxBwer@4&aADg}(c&@`kx|OvHIT0Bn*h@ym*$a_?`(JTP6aeEcbC)0= zdegot_%c@j$24puR3Yr9Ddx7}wOvyLkeR^XsmiVyN&Pz_&Uk)}7%WD4EH!m??38Q6 zmRdNzWfc~h-tT`czn%EUDaBOA&8!ov8%6V|!gp(y>d9Sf*Ho{5$6!2n;`Jp?n{SSU zn+vQH!60p%F*xWkoHloGGUM?F#cD=$t5;BRK(N#oIRpcdBaOs-xac{+Cxb1|#V-z6 zB&{W_(Gep_AV^Svk(La{_oJgL1ue^9g~`Tw+5SEFD&4|KWvP z5tIbD0Pt`{eXTs>4&xqN{ua?E?Av-;&t~rIx4zA5qdpd%O^RuykyM+$>Rhj7->tS< z_gyX54;uK1@t+Pf#DGXwmK+R>485zT89PZh#&E=qwJ7nAh@t?W1z$N{n>9OC1pL4Z zJP}}@LC*jgLFT?Eobq^w`0L@zLceM7)~5#GFv|LDpn2Vl{>8$d--2e zlD`jQ)uggI+_q}bZcgi#{{RHvcC_oY?sQOi&%_hA@4OGLE(yjaga#PvlNu46}XW{{X^au0xHU2G_|gjI603#!pr@+WlCz&wG2j2z?F!{h1N zGXDTtBA%PW4W^N{jVE<=zP`3c&sV2eRONY1Sn|6y%U1VIU)A@NCWzN=MLUkB81Tk2SA)$wMd`mX;(l}~v?OOV}OG_@Ar={(w>tT3T zFwAL2r5vHkGHI!MURAVpw=}fZtJ7QCTm3V4;!S#8KJ4CjKK98BOrXiGXtI#F<8ZgS zJ+OBC$F2@nHTi?%YnwSdU#Uwayq3;poDt-;!sWN;b;Y{L7$+nUUk4pq0N1^0U$j-l z__?%S2(7=Ij2PT&^4%#63lhqfcJTl~QV_ck#Da=X&GUArdv$rJUFuFP?M2LuCzTrc zq!x3=WPF{awu6(#-pX_NpBZr!ag^LC*Ob#qb2&x1E2XC;I9YjHZT!Ds@Y{p&d3GjM zF<5_Nc|pZFbEj@r*YT%oJr$f+UADqpjz++Cka6FJ8O{I)f=As40CT`M7oa5MV+Wnb z9OILMF^qA7ILRR3RtGEzB=Mg?$UL5z$m0Nxa(zWu2Y@^Br?BctBZ0`zVa7+XACS_m zR#TOv`JLP@+xMNVeQx!$wfy}*qvb-BXvHYT=_tKCqki3ct#sd{wy_~|mCkSg0f@=U zfq-%gae_e@3TGp?Z6`$ z`>IF-?)X18;))f0j4^zUN>PjVZOYs^QolBjRjSck{3FFY79HUfqfRNh(Xvrme(GI8=6`3fKEEddB6iF+n$xL7l(9Y3S-l)*8pRJ*x>Lt zvvxV@jPuSjU(&fgAC0F-QJi&G|bY%TxNgn{EkRyKMB)?|l+a zWS*Kdb3?}|{91IK&l3^}K7>F=90D_vcp2+Re0c!>0GAm7=Z`-J86!NvIN%OQ>+=qH z?0>QB2LjRnGyecQ(Br>#J+ZtM z`>Xjc*IxI~Ik2wDMfB^nt+G$1zjgJ{;Tz%|s+=1c!2>_*2oSDwtA7;0&~G5BL|k$QF=;>E)on!R@p0=bun{rT)XRInAU8KB*ra zdVIWf{RgEbLy3}K?NQM!p#`#v{{WwMy}zx4+F>lygS)p~KE}K6qwm*KiXRZ|Kj+SG zubRZ3N$nFad}BQT&71+>7T`IFwd-#FC63kS?xIbvG3?9WxPVxxag;){{VKI>D_DBU%#k(Oh0Kow_0g$J@hys4Sl3ZVCSYrZML@ z`W$iIkL-;w@%Bq&$3t%)PsMOLdvu{?yhODA(2cvQQNHnexb36eU2nQ}ms1YXUd`!m z)6duLea;j96I%|}(|74KgmI8@@(!5koM)*V;eX*YvLpd*C_aX1fa-8R)t|fwIRF!k za0W+obgK@ZW4Ao^hAz18l^pixzqrT_mtsKOWpDVw7YFONjCMZbo(K+D9w4$yGFsdI zT`%tS*?jM!)hoL-Iy!ruv~o|kORc_I^w{DDjBU?IB;b&Ldm!K*5BjslKd1`kTX;CPGdW-FT7UYu6G?^hQ3TWvSge$tay_Ih;YOHI1puDv%o zKln=J$IGXv9Ah_ap1lbBI3py00mgfAk`w+Cx%fX~hB1;e_J@$i(KoR$97wTSh>(@&X#Nx^9@6LG*C zg#hFbr}(Uy^$9WtyAbd4X%^=Lp}{h~FiGo?l6fIWtDo?SXqhBfM!uMy?0`r8wj+~+ zjkp{f9FoyarLhnt`CeI-Aqj>#@wzx(r|KK>iDAz zUrqFBJ(1NHMOpHtvuVXiC#CIl`z>$X`8wrw2EqQ=cE}jnrP=|W2*5jl894wG*yn;w zaz&^&16P<9Q;oV+nILC8Wk~2i`G@f183#8%;StdXM7S8w-MqUQ>(>(!at;V5rZ_!I zB=DAuasayIbDPV?&NGbWVn_gy$sG^l$t=4tTGhecd&#_gX0G{N{u^)Pw%>d7My({$ zPRVWisJ`A;du?Q&ZH#2M)z)jmb%M+1K(X%9EkgzS91K(Cbm+~-RgQ8u;|kR-A=TRI z$NnbdM$%k|-J@ETP#{tm6?EL;il#_VSNI#PXfK5HZ#wv|+KF43!BKm9Kx1WYLlt?S zE>*H5U`mb@sQGFS_(n8zy@P7V__e)eNiJ^NfA1`J5E|fM42|lWcVw#v4T|8N7a1G# zU{bX8{{U{N?!BaSUh1{CN!jkaj+oS@^}2rQx9*bG%T2U>eD=MA?E12k{{R&Wk)FTU z7HUX1Ipx~~ZXNvw4&oX?4yS{idO~~WMzCH8`VupRBm#IHermD*00`!c4n~~_Aayca zu>+FB24jJcdUgEjRq*bPa2rp9Be(Ae>70UP!N+bt9t8@8Z58DkbX97}M*O{8?`5^t zyV+l9a)zE-YZz;?)mi+!v|8wAFw`^h>b!A}_?BBAL)UP~>4VNe>&++pO!*^JL-OYh zr9yMl{+o9PJ+g7h$Q8J{4vqJQpKedCBqW}IpPcjjIRy32a0XrdjiZczpuxs=gXUmk zBcYRzU`Jk@iXIxPUlacT!IM|o`txh|e5{p^X&d}2*OES8=lPt=Hn1^^*iP&f{{TRQ z9&iEw09<(|2RYlGIRs_9wSWOPu>f(v)8fe^uRd!o2M6Ci`8`CMcAmKc)*??QJIENo z83oDbp<$DrqtT;I)B2l8aCpf>f^d4A=Zv1Gx$Dk()&jdu(wkj>ds6G+(QAJDwbxxy zYO?DUr}ty7-l=`v?Y+)AORZEMH3eSh7B<5Jp#(fmbI3ih&UmU4-0G(U>T;nRfGw;* zAH<{nJqgD_*BKn=Ij-gOy(xOx!N>atzdQg)1ZO$H>(?Zjr7oAHlG(AhY=THIs{%&g z3EmD)4_uSlNbtv_$|?S{!`Jv8g#Y2P}9}2q4$b9xU@8RJ$*ADBCyzVpNP_Q;dG> zw*-Jj;gO8s5>M6|g`S@qMA6vWqh?|qE#pSWf%?dZ3CUhSC;Oye06tIgtcbeKqy$F- zW;}wt2!P>Qr-bsT--zQf|jhq&cQ&AQdHrYai5foZqDPhl>qwW?FrMa z%Ot~e69s1yl?P)GbFjG_{{R*jfs71Sn0QW7`tFjFqd9Bfi~}I5V_i;AaRkm8%aMl0j^xH4JC$^NXaC$X~F64#a*}A zzWRKb^tr|@Q^nAv<1S|vE2^uk)`@vKg7ei`A5_W=jBoZW92ML zD98gLvT}a#+DQQ5gPxh@u7yc7`I~83ZQD!hYjpmtZ_qO7sM3crUkq&b)ugPt`a3SY zE@aFYj!EE-q!tH`F^~v65TIwaNF|pbMnh*D092Ad3y{Pvc;^gqIK~chxM!qz*@o@8 z0}KbC$<9YYK?fKh;|Gy|GMNaF;eq*x+qnyLAn}3EAgRd*Bx98a3|ymWJv%$Jt!`UA zo3_1`?3RbnP{l10Nxs+LWwKZ6qtmtQLNlBYKo~ss0Pw+=1aa4CExUn|Hi=O=0B0a> z3PJYdFysI*+q3tH2ac~;_#EH^w*Z5H2Lo|D;ElQ3Hr{&mCxZKr*@w$|<2v)>wv*{i;*&34y)f2&xnZxP6{B|ztsk^(ZB zf_>mHr0fGA5w!fdbWP1F0Mm;WV7Pm5NmI9JZR`Up0IUfN5RggZjDQ>V1xsJ;J=oX- zFl-H|CHpbj`5}si+%j-Tj1U5bHEdm?j$KQ0BPe-%rckedSSOkYAca)RZ3RB?UCV|( zULu^QHEr~L?H6u|Exfcms`sfGa@y%$%cQhx@HBmj|q~o5W&77Vt%o+p@}{Hvl#;ODJ69JTKnik74l>f)029 z`s9JnBktfXWaRDy;9!%EqvilV832GV0R#{U$6`MJ04;-6HhVi>`dZ!FdMhjW>At^t zRt}6Jnzgzn{{XwMXKs)2+St>Atiz$)N8Tp~oM5g`IXF?f4VCVu^ zg>DB29rp502SRhy>I?Jnk{ApO5~J>slk?!78;&-&-r!ap!U+*Wq@#U4dhG4nZSJ+dc5&k3S=+q=5czmdf1aQ^_rzW)F@ZI)6^ zuo6CK$~Ji`v;Y7bxd4;60xO94!0bFZEP45S%@#EuFi@?m$#6zPZroW5GXv-`#uw3b zr3_Ecl_h5`LULlZyfI|f!eB5paZ#coPI{3_?yf`1`B27y~h-Z_8xV(^q-*3n; z2`Wx8jDSBv;YZDjqSmQZgG$=`P~`sbkmPY3!p2;(YncG@w~y;8Dov)9jFmp>`5 z?>Q@K<$t~1-95W{X!JSRW0E-=`$|OKLj^YM@F7y zW^P+#HwADNn0d`3@Xo{;4&oHC&R84+oCN~CHcMf@&YYLXXHm{o6ewZ>;0V>WhHk~i z;xYl|t$ZiqpB!sRrub&TNRsNqO^)j3cr5Hv`%$?TdUQ8hjovM-+V16;Mje(zX&d|Yc9GBi}%{r18qi1i$nm(1F_^tHc4{B}WT^cJHy#D|b z$z?W;YPWW}UCf%WhRvnEyG=SRO4|O`%J%r#$#}heZ9y$GvR$7UbC9h z#Co5PBbj3tx?Y2z>RL9Fb1L1zV07p_L*l96`)RosiFYQaVWHe<)`@5KCDZRDxw#Q_ zSK>Mpa5Ul1E^3sV>B-Wl`IM5sJBt0oPR%OHH*>Dws5(NcORkyFq zLx(x~Yf14XmVxjy;7@^d{{RW;TI`<}elmE|#7TE;;{9X8T2+^ad{#eg?aO@)*Q+*E)Q2MRPJW+e1Ihm)G{1t^TpC+Gy6A1(%35X*DYyD$`QG)NFM7 zJGb*8f*Y++8_6Q_Hllr@o=8+~EXagE%M6KO5hJQfBKQBz9N@kNL-=Zv6Hz@keDBi8O6b#S(}`tTKqi zlWUgq%@h|=C@iUVWS$m^9xD3qY5HcTI*Kgy`A(tT(1c?fX?L9 z`QwL*f=S7)WiEMHeVD~-cCDj+Ul83ofKQNAC~gJ9@&*oefzL%aL6zKBIO$GVA|ba# zGEPDJLv1+ZFxrjs=V)w$)PsSNxVN4#@RPFy)}n9=92+fLjiUu{EOIc)NgyubRg|z9 zIWzdP!uT21p(G5uEvBYHOsLw~wAy)6Q~)#AEHb0|2iZx&l2qioD@`?PStRvWes*i{ z{IYeD_K}rHt1eXU6t87{8}9v6y`8LST+0{wXO(Pz<*zGpKqMK!T(U7-26iqLhy>t( zE6KcEWN7S^#1$6m<+mG>?p7;yMadBUJu3$gMYcG}-I z>@34-Ft=^vJi8`QGB*{=8uQN+>K2-dS({trm?67q7CULtRljloVI*md+e)I~WChw> zFeBf~sk(I`FJ|?HlWL>4x|6=P*7m>SvGe(bZfbH+oNn~@B?a+HFX6TCZT)YuIM-F& z4oSvH0EQ&xa7yEF;EbG%jDmThA~5(1klTpq7zYeT13xZG@)YHV%DKsOr!2oH##j-I zuwvkq1Z0p2E5RE^21<+(7pcy2%7uU`XjQg^%AZr+XQX05%ocfFV0)p$wrct{Kv+TRsSi}N0*;W2j^8g!|5aCL(Wpv5VfR9zT+6dg2s6vb@ z2e7$Qg4qXdcOG!c3iNHKb_O8=lEs)TV3o@=WB?cuxC4eDoPo4s8CE=1=)zT8(tOgV z6?LWUCj75-t@F{HG^^E6P}7lAZMS!=p>6#wWqYl(XVL!vvhR(&FW{e!9v<<}jl4&D zqUl-|iSY&6S$r|6&k>gI;fIU#Yd9cl3tOhQl6#B0duWXI!W;)zktDhEQ}si`KNJ2M zc%Q>I*ZMz-i${B+T1^n2!=5aL;K@8bWGS+J2?prVnoyDX@hnp=E+mT**WoqunDk!~ zIlzDTM>T{1wpCtjI(Um>FkB#4+)9Emhf=IrkLbU{Ng}lH?}s9SHbiX)OxT5X;Zn_F zSA3G0$_Dx5S9JvK4TK-g{w{E?7ZB*;{iR=TII3}ql{<3MN_Nr-KaJk)>87Xbej4%K zX_eHefrcLqDiM>ZDM?gP_uL}=)l-(smg&W6_gdZk9r0JhmL~Q;5?frwaGFi$gNw-& z!KRHQ@g=2{%2iv=K(K0zH>@mnK4VvP6?^^)+RLSQSK-umazkwvovwJ6CtHiC?QP>- zQ&-eH^`2Q6EMh}v2z5Kic-4|LVH`uryi=Qx1o)+!=2*1IE(u`LZTlXjV{{#|q>n0C zBbPgvfTK9dx%S`qEM3IcTCayZH)93e)~l&_qQgwlH2pT;P}DU|Pgd9F*Z%;sbj>qK z)2!#zbsa}gy3?NC%T3eaxxBoaWEQY*DHPv@4zTch;sZevq0!0|PHU*p3IRmESHE|lQqXzJC|igvqwwA1i+SCejub$O)eSDK6o zYbve%&CQmFrr%sf*DWhqzOOmfbq1D2FvWdurC(`pJB{Ywv!0Q^xog_a+PC;NZJ5)XD`8Zl2}->Q zD9PIX&J%-rCn(*|MJYS(?{#j8L6D5I5`IyD6tVe;P^Eh@+mbTM0mmc>Q0-t>1QIsm zIp>Z(R>1=UJPZKGa+>FKt#?D#97Cty#Wcn?o9wS0#5ZOzK$b%d%0nlVta9uCK(dZb zR1S?yibw}JB>w=l&OtvQARn1 zovx&tN!wJewc7XJv$nQL2+;t<5b+$b+Uymwpb$2J_p|EV+yD{MZWx3F#&W8pslfyS zGC9j*4W2WUqjwi(xo@SL*~ZpdrrK7!(&L1k>Pe+`l6KnGcU#?eS|#5?lyU}T+$14` z07gR{q1m7d|+CEEvyG>@K11F8_almL9k+UMs`=_MBrWN~J0>aY@~B z;;20~Ub;1^dLN+pV=5Im*CwNhad>G?eAAVptmw67_KLl()~j1+e?&j<*4`_Ss@r&9 zNwq=_4aLOLO24~jDx2a3f})Z0L`Y{*nG_wdTz=KQCst8$p=mR=E4}QN32tN=#|q=^|scr{g+!a@V_nQhCdaS(!{|l)0QrN(*EkZah><*^nDeq zef=-(CF7qsvT9cGqapcY(zLLnpgCu^E?rcHW4s|zk_c7~(fdUB>Ul!8v*qOD5$Sqh z0Fjo)Y(Xa&C_KbgD8qI})A{&5K6qx^%y!VcLfD9waVD1#U!`h z84Av``2PUm%d5DfUk~f5^GO6Sq;lICq?ON=5=5=#NbJObRXo;0epOT+Sc{tf8$!6`={!gLz?0+6U zBg-qv7Pz3Is+9W%mNu^UQb-mm_+Xe~Sy&K9+&fF-_~r2?TSwGm*Hia$61cR}u#A#y zP!QS>a1L5-hiy3uVlZ!OhXnIs?D zCMGP(&La~A0rsv9wb+Ua`)1vRy?B&-!)p?|K-x$uSQEff+lXLE&2z&fqc}lLNmPub zblY)W^14xN``&$aN7br)F^Hh5(5FIt(SwAe1g{s%bkj*Ss_d@bjk_OCcxU22jWu_% z)33E@3R*So)Pg@EB3}086+F)_6!SJbk}^igu!3VMS2+5g;p?UMj6O5nNg0Lf(pUmtsyc3o;ZU5WEIw zbr{s87i7|Wv5dNNY^5ZZWxn_LE+Ld7R@9VKV$+W=B56vc88>w=wAV9zUb~-%pR@({ z+q`S>3T~;Wd`|IX$W}}OkZQWvS52;P4(Nj^RROkxhERv(i4;5*P4i|8$ zo93Bfb8oAH8y2(avZAOg0?Q|sNM<3KGQ6r10uzEu7O(G54DeEhM}dq}j9eim)%8s% zzr9&@zf|meCT`;isjcm2vtMJ@-xE&uUb-Cbigz}jWrbzisV4I&FR`9C+vbSJ%?yE* zY$aGTmnsltc)8m*aXOYHD-nk~9Bm5BG87NIzbMXm$USS(JW&bqH1!!Qx`ZmMOELMP zkd&266;j(uGmrv;NY7N@t|55mjaiTYBz9CKbBO$+SwSk`GH?da1_30pg#F6`rA7)# zN>-1;{qNDeZ)vbRoOR8uXNiDe*y+6}}*V?OP& z+T5`rM#c-eBFXaOI0{3kVfjt}00m_R@AjJbBqLV~H|*Ww<|={Jv3=tojnXkGGt;2f^#Cg*M-_7PNp$@<$^&_`~9zvnsSjm7VU=NS%W!j7Y$5bPM^`e<|Yl^C51V z_b|Asdo_F0inDK{O=z^z{$_aCsPKMaD9X{6E{kcqHOo3uO*=Px**kh!v+^TRw$UK? zZQwiM;rkm;6>HW%6MoNirfBg-klN@X_GzWMx6~d<<-VRv?L5wBnIf{cx02o^GTkI= z^(MHo>i+-*J~@bVt3_)s5dOdqbknAhCG;~t!+(oSb!jd5wu$WZ-9{!@W71$kk!jY@ z*(Hp&)^W5yEnH~&&xrmXd@s=Sry7js!T$gibuE7W;#h4op9;gN_^MqJ3ypVDyprEa zu(OhH4$U2<#nhJaUC$+}hGtuJi|I{Q#rDtpDSUYGhl?(>?+)L5WBBj;G+sW3t?O1t zU$*e~gDih({Zd443ESDtt>0)`)wSn?mr1|Vw5hbcHVbe)bqbNlyE49mIE!K@%_tWR{Ny<1(Qj>3*i;J9}D&>-tZ8HNYYPXLU*yhxqOPB2)A$>*#n#R)h=HpIly+Y-# zJkw#KU1;&`-f3FBo{T(6;(bQK$4k-grhw{t+*)<5h1`}>THD-Ocz?q;R_eO-<+c6I zyc&j|;r%~Zn%S-d-XYU;y&-S!?0)k7mVe-vf3_FL&xetGUbyfNhyMU(FWFwo&fe=$ z{jPs)?-khmEBH%kr|Wat&!_6X1@LY4rj@JwNjmCj-d>5PS$KEiZ-uoBsEw`uv1GGF zDt+VdhgtoH{{Usr7HQrW{{Vt`e$8Gh{{Vu#{@NNBhwd)V?IHV0cmn&wKeLy@Uk~_Q zrMlESdGN3Hf7C8o%SrIIi>gZws61!!vs=?H{48yw)T}&3Wn-@1K{iW0#Z;xqmC}`2 zz2xb+SuRwUGiuwXzNw~_(?)m-6k}Psl`N9xTFphZXCHN4$z7|yXx{JMx$}4IxBCVD z(w`bU0>2#Zr0|dIANwZHZ=}Voe%@cTo}*`?c)!J#7aB`h$6@eC!`ISSc)MAT#JYX8 z)$fOVHSmi{`w@!H4L0lImG#}UH&@?Y{5A3S{1e~yLe;e^-`IEdc=31b(ecB=>2a=W zzqS7W?Ionx_;7*jo8Jd~Cex>$dwoLN#@;&9ZoF~fdqqg~Z6Cx7 zc(zuaIq`nm_K*FjekgdG;%DtK@qfnO@KVp(2g2HI)yBEt{{Vy<{+Hly*=zQ0it55U z{bNn|i~B|2=pG&TOW_?CPSVA_*NFTn@L$9FO|GF1lq~MPEb01~zL!bxPaA8$3~x1f zeja%L093U7s62J3-)XXZI{l3Q0AkB;6nH!KTky|`tPRq_JWb+_637xo?)_|ps#Y7yxk=2OG@mT@?|;!2e%JGgUuIC87Y-fP~K?ADsyrjt3d zJ}#C5GL9A$fS;w>Gp_ljc``{{Znb_SpTlzib=*M@H7aYArv( zJ`%guhMLg)EASVK{vmkJ;)jT}W`g41L--Nkn>{8SU&NP}u*VcLc%xI7;a7q$e{*pM zjIaDP_EDkyZR6b=;HQDLNv^&rc)nj1_^Q^{Yee{4;LnH_-Zc1weP+^mmoNKB{?peJ zP2lFANo0yWL*cK(MvF#*>3^~Gc2H1K;;+F!je1U#ajJgYf3zRMANVH^!z-;l zt#qH+pTL?%hpPN&y70!i1E1`hFWGzG?bV-*j2i53Eta9;4~`ngho-rmt}gY<%zduu z{xP-vp}%AggA<5DTX-K!_`~~T_@TUOWu;FH20NWo!ymK9fnUQP4eaC- zD%@CHd_&j%DTvlIbkeLQWP;!8)eauv$f#lAO08?zK3-~#w;1Udsmd{%zblhn?zOkU z;xjyUcPCpDQc;U(xI$5tK4r^vr#V75irzHt)wON7^Ln3y{8#%{{?XnY)chO!B76ze zG>?WFeZv0$YG3>)I3Lf;oGZ7-t5ga z{hhX&bgwAaJ_`QMe-5tg2ckMs>LH^JXTWNnAK0bK6#@a2K+op@~ z^G!%}FNazofacl_1L2>8?R-1n4FWq*BQYkE;jKAGmlR02P0;x_hCUm3*Tm9C9*yDY zW433)&vGJ#NM&$@hcPY5z_E%Gq*K0QjMYVgr{{Uvk`*7&L4j`XO{g6LrKZid6q)doD zEBN5W@!#XbZ0_kUqh;c+8EEnNOTu?I0u^|d!X5+C?lh~kY4rV3Z&@Qr1iVEGnLX#@|u+88Fh>0TH4zmIQT>Mebndj?tEpd zHkW3GCznRjgjbrN4Y}9tQoyFd$bxp_TbUhM_U?v46~2$~r-HmQ;c~XxE|Y7fxnmH& z%$kn9bB1urW`s#17ThMbhGRbykhbn8o5 zFM&lRpZ9SpFe{9czoN7jHquEP3wf)|xh-ws$YRp0dNP%{)US;91|??z$g$c8p$i!i zs<=|DsOln zRhr!26**0|sVOXCDuGJQz6avJ+DqX+ktEi-Jl-+*$EiiR1m1MM5b&cqlw!z|S<8Ji zYQeW7Xo4pS!aIVluAZfA>nXrfaCnMQaE;UxT<*y?%N=JYqkj(8c5K3qTaU%tl8sp= z({f7Di}zaQle8DR{rA`9>!j(>+^(H@s7tKs?x)Gn^f;u{?#mL2o?VWO6s&^{wT!PE zYz{E8E3u!%8fD*xVOx(GUieetg_NP@x3}@ut8Z!I8`$=z&28bxKGUj~nX-jm6)hsG zI7DJs;@=Ve)BgY%^@~T*{5h%U-wL!byh&%^D@ZhbTID`f2Jc^XpTv{Pw0TYT8_Osp z4fEUVC>Q5>Ue4y~;_`dTtzTHYn9Fs4s9ar7b#pAGjFU`cSGk$w-WA?ijG0p+OPMyW z!sebLV{p=O%kYt@8>Q_ld$&%_J4MQJcUH6ZUpd`@O_H%V*acgrBVKnk7Ed;Z&2VXDCfPn4!BYmJoCJPLa z#v)<4P?-W@Sd^2V0gVc%aCiL?HtFr+ngxubqRSd1Yz`&Z;1vaq;?0~9jjR-nq_umw z4s%b7FqPqqgfQ5ZO~SP}PU$%-LUFpipIctdTi05-d%{$Nq0HcggiQg&|qZ}XgWP({h0A;;N80avjx$ROkd*Z@3KPcO{5^@J4oN=Cv z20@vzH>l?1o7Y8kc;3!EytR9)bl^f9 z@tz0-;Nt`4Ad(3@4naBSbIxkQz!(kL9W(Oe@J`-T;PI2UIRhQnjH8U@N8QdB-cQ2EpXw^1>#_!Q6zoVgP(?87YP; ztsxR!tF5oM%KbWg zh9=KzJ*{T6zbkA104CXd_G6FU9XjW(eTf<57GvBFpyc%}TnzHW?c=!^I3VFb$Qu^n^9?BsLKY9x+VZ=8}cIXy;s$UJ9}oD7ki16E8#V2}vT z(neVF!~xGd=dLn+K*<;FKfQgl>!Mz-Zr|pC!LIjO>u0sEt*_f%*PVxFj;9?-9CbZQ zbGYOmnYjl5XPg{>F~$ZC-s|5xk2%K}!64(>oq$36**VWG^&DiJk3qYk#sxcR#!u)- zCnvZW=bU353GLREO>K4Pw0he_x7*Y7IcB+KX7+ks*IKKjx4o}-Zr18X6y%Zyaz+8< z`kdpFliQpFkVXi2R>v6Y$1Fba&If*(KKu|zc~wFAhksH}89B+$M;I9c0E`^sr3f~R zlGz#i&5&?-9E|V@C5{exUsowfd{cmUvm zgPc>uD!^ptAoIcC?&t3gxCfp_;(xnbZSCFn-=|Ic@3-DXwbItRwf$C>-_<=9{ccg+ zv>f{!9!~AUjimL-Cu-w^mIPEx;kZ&yUQcYX+M@vA_0Dt81P%>PEJSCfGyFjCK;#_m z&H&E<=NTh8s8&3VM~KNI+!$km4g&N9j4oVTTI#QEyKQ~+_1mTV%X;dP(_YQ~ zuG)Dvh}DipckKY@>&{QF4U>>T2X+oY0@4y!7*KLlU=<*-8%f#$Jdnq5zzlQpf<;9G zcO>TnC!R+_au1;dsAWBHaByc_kh$u2C@1d&$OAjGo31yL!c~a61%&s?W01vu8Uf2hd=_zpq z<&1B087nHRVP#MvUon2@z&TDq^B5Gz%-eIiyj5OA0#^hc0V)PY8!EtnRIp_Vzz+Q6 z6Q4@ab&E|#-Ya_yoviNL zzU%Nuon8`Z>zc{$)mqIxuG8+XZ8~1*sc0WzN1oBKr@*3Hi-y|r=_t}+WRX!MlH*R0 z9fIq0g3JJtlLDEd=H?3#k~oo}o&^ne0Ly=8i8efU9&X&tad3_%R8Sca!$_;SLH2lM zDQOgONYJ!vi+i_0D6m&$S$4$EiE|9G{^_kGQwpgpN0=}?{{UX_^}e5N72cn3 zP85I#9ODV$u+nSVQ;eI{b4Rx;()wSeuKx3AVk^+88Ol=RZRvZZZeMv{vT3WN-pcQP zwEhSF)V@0S8R4&pw)zi;ejIq)!v6phH17!bTg4t1_^IK2L&X{ft99TFPWx5xyzK$G zk@fe`W7jo^q44gun%<8JYWCWM8dNuS786JGKfo^z_?PyJzVT%K8PvQ7;T=leEmz_l zhk|arUb@DmYv8E0V`R2^CYHkY#2Pk_q3ZV+x@oer=NDYI{shNl{^Oe7yAS1eI!#gj6ZZnsJP8WfeEF-us_VfzIhyRH~5u5Z71;e_N2FJ z41Ro3eVXh@u(D5gC>aW@!Y25eM%OKMYYQo&S*&huw5>N%xw5)~TYLLty0nV=4?4o; zI4W*yiQ^4&$KrLaz2QF$$*g=&o53)}{gr)tr+9Bk z()=$blWi(oOwdcJ%jantf7p^K<(_Nni=r+rg}ez6`bP8ijs2XyG=FAz1L7~kli>|> zThz4OHq*sg!s(ItH%7I*)h(sewRHH6rZ$&-;nudYisBn{bu?1k&3kR7SivfZV29=3 z5^+vLRlM&jsfxonK|Dqq*-BKY!i_0ZsmlwhiOtS8l%oB|Yo?E;rgC)926K;SNlOaHM+aUqBI;?<5N^k+sRNj&T0?)lj z7=SCB3@nacVOL_2nL@|3fUhEM+)FOP1$|ZV{{Z%L)BYN0(0obocC7}n@TPW_Nc9H1 zzSiw*AcFBM;=XNW%SmY4Muc5QW&NkDN-d**D&lQo=H;fggXN29R^kZnZCz%xxKwzh zPcaqJbq^Ua%LG#=n1nJ3BU}eoQ0m!lwa7T5CgNN@I+$!a0lo8KLfk#1=xbm@v#u;)(PB$qVzE;8Y&RC7a50{GRT1oWuvfpOx`y*%%wJrU-hh)0@ z9g~vM0PxFi9g$q@Y$~LMcHm&{Vh;9a;XEhi$>8q?yr8_Ycvr)c$j1dtuc6pHr;nF; zVp!#XBw&Rn2fvOrN#^uvt=)jYY@WMZRLr`;GO}G85mMP&fGI&2aa=G*NL2} zL{CF3%Zz>VEv3fbK_G=-i^B#XvCxh>f~U*`Z5ayOgPi1gF9#rS2m}J8kao8%;)Om; z1ZRubj$3dzXs3;cDgg|?DJM8MAOrHLQE5pgv`t;DE#CLTg5KB zcXze^p3#h!aJ)eXneQD&LMU1F8>@kq z&H|A)AP^MeX$o0a+V5mB+*)9gvB@l~aIJ+%PhzBkzyb)^TXSHZ3GjOv8MGZHalA`C zov9l-?zpsBvd85L6z=)CC5F-gI2|0SaBHLGU0(d!?ycsnWVSGcqbW*0S5|9PWYgPC zwOj7Ho~!U*#XctR*N%KU;{N~ucz3|x6t$`D^`8rAx(=c7Q$zS$sY!XQ=vtPAdbW0c zHq&FC>RU@Y?LebP70M)rIl)+7+G~%{9~k^#_^IJ93F=VX{15nz;U>}iHr^!A=ZE7D z!taP0WRYk(g|@qKqG>v(hAylnxVF<_hUO?VYb^{^mu&^S1*7zMwT*8; z(zQPmMXmVDN0-Bz9pu*#E%bMKe7AD6+HzdIwyR@#JhsTT^0Ad=O-5Krjjm)tBv0{~ zu1y-agx>jquk0_GOlx%20jJqn&1hUAoEQOib;&>4-8AC3{ah$kdTV+4vFU32^ zyhowh>mCQt{8@Uw1n@)M_?}-9>befQEyS7?tkPLs*=hDO0Q^7$zv;~sCCkHc6}%I$ zmCWGGUg7+)ej*o@o=q8}iJWbR`)%&tFbFFeT(+7VmMUfvN@VioRg58z3_Wb0E5*{w zC{8qDl&L|e!f^I!-CxK=wdyuDuk)lai=uzqLWQo#p>*nPUoqTX1ulGEHtF*LG#nnS5ktEuNyrquJ+m8 zd4EG64L{(i{uk9X8!ac|kH8NS{63OT?3;6{d@uOJ;SY^o1G2W6O`MmP7aHD~@RP+h zntqK9>Rc_gj+f%iKo>SvRuUU@xIb)u+nyDMCX;6s z#+l&#R^~gHuJtQ6w~y?XHf=OPCU3M{qN-jAQrtiCdEz;2^xp}5QkzZFtTfBZKMdWq zmED{v72H!L{;_x@Hy%2dUp3F2t9%9cp*nu$ z?xbk-pNHNdITB2}S!N+TxXkFx71B+v6KC;n8gPDB!MUD8TP(x-3V5t!TZc5Q#M zm7_Yf98|rf+V+~+=#SgDV?4)acr42gjjbxqjvml&SIa2LE@>$9Hy0OYey>yb!}z3y zHO((lkLHf|MYftI!2yDK&=P_C#sDg#V5@96Y+zt{cmS>3PQ`Ne%A=CUVzi^?Dt6~^ z3>g3?IAhTJAH+2hXkG=qb@}D+{5zS4SsLNVR&3<5g1fSys}4bJzh zEiZPR-&@~R(e>L%t*l~^up~U3V7_?)xavb5UnGDqMsRRy>smt_Wn_G0a&hx*2RP)g zTsdMkk-_AVg`sVg3IJvRoE#0Rq#T?K0NfH-oE|tJX0AHa0Rp~`O|+LY)hDV~*;?&t{V#QGIy25te7Dgh4|HRb}Mw83DY!aga$0 zd&Ux~Df1MuWh@tIee0Z&kV_KBJq`#5J3u4O)l|xgS&HOtIL<)Ab>$) zx!u6s&MLK@Hg0d263jrs8`B~ZBJ(inmeQMdXy&s+5FT&bec6)Ye%xfNbIL=h=3I``R&eA?mdJeqv z-j^KmdFL7QA3=}^2L$Jk1~b8*slW%EsUQ+T9RC0hT;y@fa0W&O92Da?A9Qi^V>!w1 zjQq!^bKj+6>Nwv=YwxzM&ucZMo|o^j%gY|k>87oEFZdliv@3uC79+((BpTGhtaF`rpf-<-{0B|`6jz$JD#1=f@8h8g77#;D? zwgKb=_m50;2LPN1b)Km&CwJ+-i(7pAy@$&l-;3}4eDoj+PXLZU9S%4nk?Gq2ZpWa; zDdH`}bJq=m1~K~IAy^Hwg4w5AfN7>oN`Ar{k;GLasa~T z<~;ns0y)Y1t%5U++<}j@l4|SARj!SBHudP6eMRi!+V|GichcG`cKe&_-JW0iOq}Fx zw*+o1IfpxdBOqXv&O7HncCvM7^PtVblb8tmzzpivqTAD7!t7FnQo2^(d+O7Usl6VaZQXfk<~JyJh3kUnECxYU`?vt)9+<~04oS`p zhaWC+v}4d55=j6Y5Jus^$nG)LpK^*^k_g+AhbJmNP*`LTLgPER`344f%(5;~Mq48) zax;uR9|Qsz9!dg1I3oujpHeT~>$2Of$@#lA*>_%i&YOEDZ$FjO(cbslO@3FnRIZ<) zkDKo5BoILu8obzJgMeFhPBWFyAe}j&sv}5Cn9ORyUHAn?7@Gcuz8!oK()E9WJ{$d^&;Ro!Y;Y<5F z%_7Em{4@JPe%kln67}DT-xB23=dyiSwcQWK*PjgZ=ybbXLMuk_-jP3s+TII$x$YDB z`O`chYw;5M;oriE33T|;@q6K?fG*=`rVnwXc!S5D71FgxSLe$lw#%;Cxs2qA(PIeG zK`Q?MN**QG?6qA#{t9X1i#b{=y(9Mf{gS*n1h5I!t+f9Dhrbm51Zo!P0|f~bFk1MU z;R9QVA!S+OUDnBJ>HNpzZxz?c@fln&wPc+tlB+&ncan7FLHkR;hF;E9qunO-KY#F> zBBPqTOsiAojYo%|r8p@k%~qUdtt;uun$`R&?b!Uy{{VtvY2GC8=k53LYvKO@i98jr zct6Bi55hl;z8XZ%C`h2ho~81}&~p%3g+q01{n8#6t%wY~6T z8rd={U|YI8A$EPy`%HM-!BBdoZlSxh~CAO~HHh$xR$RU-|%4yS#7eCi|As$Qe zT~(ypf?UpYsz#%Vi&XBS#h)EW9}B)G5Ljl<;lV5v40(SP{2<|N<_hdE#Y;E({$58YoK1AoG;_?v|o7Cr)CbAh%$iM|qIRk}6~ zK|8=X%7wsX_*O7Xjllcu*aAwN^}!(qM(@3Y&N%|VvAidr`yM$hFFJ1b)!G!VZmC(V zJi8yyJ~Khb7lKXO_?kVH+#T)FZ*4!wWy1W9G1HPW$lwq$f&j-D^x6&yAn_Vt53NWO zr=Kw-jF5Lr-y|}EGqeyxWC4OJy_r-8;IRYm5y|PE21(#?l1RZUR~S52o~3oEPBH^d z*&&bdHUP*tZP^?#1Tv0BEA?9Ks7&Vz3O0n3CV{|%?Yyv#O zK4Y~(8NnbN_rjc-*49)FXT*PdBUnViIVuL5r1EmSfK|B|$OFF>n1>0cV<-I=P-B6d z;nWehare6tK*7LJLYs<$jJ??G)zVsNCho1K-8A{!=%rD(>$8jVs?^C9AMzuOaR#jjNlWFBVfEYrU2RlZY1Or#_k$%UeUJ}qTZHUX`{D$ z-P@znb4XQ6PTHiFj`q8@y4|f+pEd8Vk!*a@DdPZgpq@Y~tl3aQ0h|tUc=rc-In=6k zATHHx0yYzZt&xUiC_Z;TF$W;-#bLsu0O0)02TXyzi(rj_XV01tdjyC5*TsCyA7#io+x< zsOo=!h623aEk-XdVs8h_3`q~P43WICP(c7Hi{|5?snmi7E$BPUYBD zLhj>fh>*>}I0W=0*F5m?n*HLuU%H_rpR~U%t)-Q%)%w|+;cB?m=2|Q*trL~>3H-8U2DLwX^_E@8PZC_W=?A91@9%QqM!(9smNQz2XO#yk# zMTBArCO@Jdv)_w#Pm7vD{6*GoJU`)m6G8DZX|}p1hkbG4y;oAz;L2zHF8=@z@e{+CW*8dP@;n7f*@WssQ-twOQiVE=I=;{A zHQfvH-YF$?{vM6~)4{xP48F7}W_9AJ(t}i`2u2E0i;9AN&Yj}gY2HaEZC$Q@+C{5g z$u5}_Gfeu;rPqh9Mcs`0jg*?!onbb&X0pB7i|@1FTc)X}TSB)5FC&uX(q?!ikhi7$ z8`nHppeDKD4-;wkS6&tH?z5+Od&7F2$u4ZPe-dc+8lI2gokn0@N#W9U8RF42OO%0b zEa24iJvR|t{fV!?Benkk+UMXSXg4s0Z6le*7YvDcy0n)l9* z`ggSvSlh{K4AJQ~a>Cbh&unexj@IFSLcd^N+DE~kwAQ=(L3}cc;r6$nYQGLV6Y#sm z_ge3XJXaTquKZKszY%J_Gto6$2+ggHw2?`oO>G{hHQ~Ow4|Azmn~P{>(7&`b59D7E zJU-3x{v5^T82pO0EH)mcD9XKf(1lDpRj9@_;NggKl5v}+xnaC{n&rL!0HF9!#JmlB z!j2OMkEc0RlKskl^y3tpR-6^LT-x($?C*5G*_v?`*q$Y6EcJ-(+(=8ai_fzXvUy5M zDqPxa5<~1nn) zz0oy$8(mMs`lv?oB!lhO&8^s-_U;>B-JgBou@yQ6B$r)>Dot84+&-iRJi%Jr1 zF>%#u?3`3(eJ<^5*>>Fh$z$kMjAi?~+78jPR-9odsb2f0ns-`hs@3ORgof(CUTKYX z(G5h&I!ihx)<~7D+hAB2?h(0~O`#PGkgo4Dba2{CmeH_Ox<`b(YLTnE4Xpc7!<5|% zGXo)!lwhc0863Li@oW|DZnYbDw1^>OlJaYqZap(L$u4WvY{-z<_tZmk@W zT?My|P;=TZi+&zz^J$iT8u7P>wH-?D?a;?%VRs@c#b}J|Adtkc+`P8Z$v>AHFP{!> zpnJ%oNo(vdbg@c=s#B*@q#?@XC`MC^Z+6?|O-9;$mc2=JaFrz(%5aROC1|;&C$^S$ zSLwF;`smGTY(>5sb}o@rw2`wihX4i*v^0$Q`F4z{C_&(x_m-Bw+SYhPzz5_Ac7`Mj zZ5wdK%AL3)X*f9PV(QuidqoOHE+88ihDMWc4rAETJ36dtes)DaJ8d;~>fQ&{t#WWc z`B;Kf{Lz&FsQ{rUSd)cT#t0-D(bXNhNb0g$p*3df+)Lx=)x5<80|E zUP&yi<>!p?xC4R>e6~9?sV6UcWS^tj{hHNz?O`k=Xz6P;ugl%Fy8gd*yX_tr5I#^N z9OUgGN~q3yj1U*7Cpp34V?lt}#?}llTX4qjn~dNd4o5l04oS_qPzPbOf~}WUATa?5 zE=E8E0Hhzhae+#a_2A?-z<2?6s{j?SF~RCUP{W)aE8?-ZsYx{}-(7C^@>{#=?z^tX zy@iFa?&`~}me)$!?6u!UdRKze8lJ4`56=#Sjg8qQMz17!=L7>dBLEf8JAoT{`P3@u z>H!KZ?#igoR=Y!x1^^@w8IJ`)zyN_=KZ0>4qp2z9blN~(ryyE32+n$zAg~HE(2zxQ zS754XxdR_!xH&n<{q!e}dY$T5J#q&*=i{-`=8K%Kqm`ZS){|PTHS6bnZg`kkwTqff zC+^=*CYA5kOM3i@`-U^l1`gxYj({BCa7o5U*&is!T#vhff-*)V4>yx)AGJS(@NRU^3V54QeInu~ z33=iTKSfDKw;;1fW*T;%;tNZZiO~y*=Y_2vF>xF&z=7qTv~P$bm*U;dfq9@$r4I|~ zx)zG^#jok}$8#R7;ad+9wZK{J9V|`d{h2*)k~@p6%|=q`cH&BILq;vdKEF)cT=7*oZ-yX z<1SmT-SWL+($%J$cd_w!yy~9UI_q(45eEmAfLPns@jY8y(j{=!w}#Ml~0H&rIfM85Bwl_XR3HBS&n(7&v&63*t+l)}#%>~y=#4V&=TM(ey@CtK<7@pI8Fb62;x7%vR{Coh z72be=S@fB{C(Eb!SHs#ai>Yf@x>c?J z0EYY`lU?aHY;EGYiQektQr0~ABeJ=aLv0PMwNun0zfZtl+0oF-i(f4pMy1DLEx4eG>FM%vKr|lB(KDuk;^@E@f>y#Lt!h>DMK&Mpy`Ea-oWjGIM}NPaJY9&2BFpS4xqYvS7UX zV%CbOFHvp8lO zNKitYjBF)<1S!KVO9tLRARVVUwWu%pEuIUUH0Zpy@CbPunEar&+@2RFYOX;z&yO;H zygumNz$6q_$vhrU9D>R>8~{0Yt9ZU?q^#bq>1g%8Ypb{S=zA*-hj5qfqiac|($ei& zH*T6APIynpkVU0I0wmWB5-<9jd&WECMMeb2Z0t5L$#Ps|Ze6NYyJqoDp)I4EJ8R{A zjj)Rw$93JiX+C|a`@Kjjft>Eg%s3B)n#_>+Z3KEH)W2t%c%*3VERe<^mQ?|Str0;W ziKI}<0_4V6g+`Ot?EFmfLjGofsz>FA^HAJrEXqdXu!g=xRv;G6>|lmMax?UpDOH>k zc$w{^P?eX#qLO{D_MgjT_)d8WR58_}u(5Wk?$ua6XLWZdM(tfKov&u^x$@V>Tj{QK zoe^a(lceen+w$4P#j@vbP7I7kUNXO50%8P_0LK`R4l(ku9dHL+bCM2J@x^@u@wP}? zT+v<>c!Ov+GHsQ1J}13ajc^O7X4=^G2>2vmx6g|i41n$+Z^%C=B}RJZD!>psZrpGV z4R{&Lt?gI)MBgh~DLrk=*}Xpf{%7o53miRMzKVEgd(oQaX@517YTlMf`TAQDFz1e# zT%7&VI+kt+4S)}}6mv=$v5-N?B>bRvC$>51)Dh5d2-{b1$Qy{`86@xqa&yTFI`rgc zuuvBx-zR`Dz~p3{j1UGhjiWt5&j9gCbt|RL+^rO~Z&a+h-&KE0TeM_uR*o8T6szA>JjIIv=*E6D_EA6Vbn{-WEw@qz+ z)<(YCQ%*l--L&bqt+#sqmaLckGQn_i*9tN+Km}b%1Y-vT?ZFrToF29I55dO^@bANG zgOPiu1{rR@@R_FLoCEjrTfTGi4x{8NRttAx#IaSBGcY+^4l+o=+%u0~y@1_Y>hFW{ zgWwGiV<9zLWF%n!0ITt+^ydSfHjSqrbba2es~KK~d4+^3Nkz7rPoh!vN#0$$TTM^O zyi2FgfaXa>DZ=+_cNy9AceS_H{ZG8%IYW`2NaT}|yBRpa860F1Jw0mdZH_a?9eKtx z!5|QO9y(_OrxdN&6v-SCc;}!w9kbXThuEIAaa)WI82*6ch>uA+kQv!o+76$d0FV4t=C1Zy0`c4TT#2z4t~Di`g(KR5sz5{f!jal z*RFn^oMNI!03F>ra(@BrN$c04AB+6O$5HwJ06$Eg2jET##e4Ck29^H+H{`W_{JQk& zVeKW`O*%jGzL)K$q?A;CXSeJABA8`7+3m#=5#*Hx-|euSG;^Nzm%0O3ouM`88<0PFSt01A(I>POUrkL8cRepIFU za54|q8SClncG zt)qXA+KR+r7H|r+_1iREIRSW^Xbcb z;B@rOG_vi&k&-wa@!x~^=b=50K%v1Ws(W9n(#vnlz3**=-K?(PcH6g2tkbv4^d&M5 z&Bq;hKmBja^y|pVGxY@iUx!XUhaZkAu_T@kT;qkuZn(+GTo$c{v)1IT^DUM>ur5B($>=ZYQ){Gt9x~RUDtp3I}$Nd)1E==^y|k%$QVAj;EIjD z>GcCR7#STq{YT^9JkgH%JxLus{Q>Kqy!!#1QwpE2el~&u_23RZy^aofu6Gogvgv)( z?cZ;~uRe!6w|n&K)6?$ty~Hd=MoG^cgVTH@G;Z@kuAI_#gc< zTU=nJ-GDrt5_Fpqdu2( zpkHdBkW8JQVBzu#JRRf%N&JG4Z$?gfx0rdy3KxtfKu*f`Ma(y%3>5_N@u6bz3 zVZbM`>+6Oi91r3n9OSQiRFmzuoz~X9n$_#j+nM!#TK+w|eyd$cFfa!mq!4?OdSnCZ z+c`b{YD{B3zQB)Mb-?6z?lI6BgN$_~@$N?$9Y;*{&VM12gz!p%>C-3M0Dy3KB>(@PV$33!m>9wXo{qC7Of--VO zIt-445;~K~&P_7x4+P`B0Ou!;2p#$B_3UXkx$1H|Wk>74Khr%3`?TW()RnYLU3$MO zU(53HYEJ6!uYD}v_35`lcaQ;|a6LgAx#`~{Imzk|T=%5xJ$eid4@~6bfO2vH$smEo zDP&>>NhJLSdB%AIp~gK2AY}7YWPYT8I2(u~Bc^(W>(izO9dpNrk4Y&tYu#CB_P5{W z_3NugL{oct_48lTv%R})>S_o58Uv6CGV*#8<+vk`yb=oF9AiA5J~Q#-5vuBkaa_## zP;hxDzcP|R908TbQl}g1>^(+6Enqq5X2~EBNmgIOAd$!D2o>>%j@TVbQ$H~RZ{h*h zC5F%jLu7OVl1Wp6k&nW--h8#ymC~K}PRYV4G_SU=r$+Cw`lpAKU25%F{42Y?_&_^&a9u*0LMI> z$_nku2PEz!Wp@QQEwJ!DVxH~R2aWJb;0zMXhj3y-fsx5fDyijx0Z!t3EiYKGT{l%} z$_Mh`2pqg}GlJW8M!%yy|HfewZVXSP`6+Ml%V%z2`;l%4z?O_2NysFX|+`93xY7eJz7pLRil?%?2^^#s(m_q^*wxR_an&*MEhk9Rn`KBxGm%Qam#*Rg`XXxQ+%1QZfy5^U1ZY)UhLPIV7ms z5lId5kGe=zBLQ;90Zz^NnLptbf0*NRV?6Ew^;kNF2LJ%Uun1N^E<+YPHlsetFBFyl z9j*6%P`g1O0Dp)EBRCwl%fYUkG(EF|OPk$}$>^4v==Z+grl6zBgC40sLu8|6F`jIaB#sGWkJbogMvu%Tl1~=icNI^XDoCGBd*lU@!m$ zm|z|O$tNQRKdSKl8Zn^TO6^_6-uG>2yXe=Rir#-klHenTj8Q=gRd zIqBPg*f=9BMhfN1-`+VH9P!QubI|a_WQF8l9(b>$!c*j_F3+vBcjfD+PHXCw)%%|A zG74#0+I`&>wC$$PzNA+S3E+;01mu!(269RD+7Cc^E1nKCjkKu98$%CXFmeDLc8)g# z&m*w{{H%WK9Gnhux02XU0Kp`jNF9P--R9FLUZJ3Ui*2Lyscl1SVLQ@9Q>={mC?vFn5p&9$nLyBxblgpr(N z;eZ_&j1O-(_^hY<13^>whM}lQ!TYThy8+Y;pc8?(2FB&V9sdAC;Mli|qjc1LqSw(Y z>E+jR^G+sFN~Nr>noV!;!7sEAulRRAU*-0<5g~P&pe(#cNx{1Y%diZ5bQ6%9D~49Fk7l;BGE(GFeNu z%SqI=>z9hw8EynITu&&132tPD+S(&=ad7b4DU?HR3K083`O+AzywrPyl>X%LaiK~r z$}v%jZcW)mXs-56r?vHdPjAZVVc#=q&hFP*-syQ=zTLFnLzuZR$6f-W8ySs3*TlUskPKn?vp9N|@ zDxTj`@ouf+ZEH#JAB1hL#f(-O<<^g{THAPv=rj^aiK81Bu0ORdRV^X13GqCDbDx3TM^h z@c7glM3&||3%yF~P=;2E^1#X#@E9>8Po1{yWR2FG*-grNRq}a3foUE=I%(WGz}ieo14h=**@K=UHO-dVQcQ6 z5&RWr@VCPD_S*H#{{RucYb_s5)~qgUWVVjS!1^4z&x>rd8*6)g2FFgbuoL)q!J5vY zZ6d~&kZGFUoh9UV8pYn3s79?M3&aWPv%XJ;i^{%$` zO;g4CHS+4VTE~WGw$VIWd8OD-sRJwCYWkh+gfFPsi)bgexxY(9eOacv)jO(C#^R@k zr&65h!O2O|jHP)}aHFfQD6ie})M~8?X|8TdJGRd%3X~mL^TttDm6e+2m93++q_tOC zOH|U{{l2mP00_nIp>^XA0=2f0@bkmEFU9HfPX}t&l3eSWCb{BmYUkmng0w`py}FS2 ze^a`PO!$lAy;U!5tfwh)s9oE&?Do^U{Nru*Xd)?Siv^98cCkZi36)YSMLt!vtV_OO zByg-=OySV9geyC)>{j*d^_;ifEtm^iT~&NZV7g=$@LWBOuZLnDCclSHu+-#vEp8#x zXVh%1u4j1RxYXmh3T@ImHInC-GIN>04RGQ>a0q6M!lh*S#~CCR8$iO~JFesR+&7f{ zMx9<)DJrg)E2$QzD5%D1H~#=HT6HG9uKL?cGsw*GsY<9_$T1^jr7kS>YA0+hKH(rIrwd+_&>s0-+^r{$A{7g^__C|Eki`n zw5x9sBs#8~@V2FAZFwEEdbj7+zaqDXd|a-(p^wA5%1aPo2>tGrc@jjffJ*yN$+ya3 zG-QX&aqVRG@7p8eKgN&vLi}&=vu}aV?Axhpo(R^pUlGNrM*jd1A^4}MXg&(ov=0Q| z=vR7#w|1HiwLXccc#$>hZ8pX&X7Ud*8-ZmYeOnCE2krQ~g(B5EymVxpNw{0t*21)) z)%~SSZ5mHW{5Mxkc{Fj6qkzublf1C0MX63QPEnM(Q;JDPo}3#}YA(y0-Aw$4mQe2@ zDoW*!0nUD7koj^M(YRX8>{6Xe`;m9*ck*ZZr3=f2wI=5{zeN($U`bR^{D0 z?{}-$SJ?a)5r};CFJ;%Jm*vvx&8OYyt>#kMfr1x+*v~JMz{tSsyYDc_+@S3_rPx$= z&d?7%xfu+qN~usrdJVWa&e3qk`{1NA5^@Fu95RE!VYINoB(n{@!6Yf!n#CFrMB=4~YUcj;>;_22xjb#7JF ze9|+HFu_6K6y)dSJ5(qnF5*;WbC9Lc!I=vZ0VMK5;Dk&lJp8%gS3UCFZd}gR%#yex zp*apz5H@fDUzidxlflQx6lRFyWp>CUjoXP)ouFW2<;lX3*kU;Z<0OOAOI4#AD3jkl4o%I#Mp$~y=q7hJStXOK{wa1`fn zKR)beJo(rc$5vdhAnaE8ff&efwD3a`56ZuPEKHp_MonJvvTI#cmHIySeIDbB_hT5s z%}qPLik4WK72K!5?!4aanm4qCHXUeS@KC@8HhX$r2GJ&iyc7iQM%EYhRwm)08l#N zKu}bvEUc%E%ig}~_(>tT@Q;Q8{o{XP*+9%NBi|CWqJl^tDm)4nF}HRA+J#2%$vi}% zQl=LVTBK8^s@ZDqcTO$4X??X$+SvPE474#gi{G77QqfsB^G4~byKb!2p6c2j(XK!y z@OO!9;9c|G*xBjfLdHu;d#Ko2aMORHo!)Y=^RWT>nqrZRzu(`tXT+^f_Isc9p8cWx zCLp%>h47>Ha?|YmC#x;C>(2@J^W#6oy-(o>hP+py-%1%Y{bR%WKaadosaRfFguPiK zlHXBzZKV4u{2g;@X433!vW9&_$6p8Z7bt+1J}mgZ;13GQM00JlCE?fQ06Ma}GDR#{ zX!G>H{1v+C?!Ra6_$UskrpYT`+vtC>7KN$7W`*vp^n>y43+-UcS~gf?xPt!TQ# zeydh#EpP1MPSJWj+_baZC!?|akHpt=%zQ(tUC(uSHQblRY36xvE;Sp8UU}|rF6U`v zxwyHOX=k~bV$wXU&oq)tHu{OL#5rg45|Psb_Zg|A1EbB+7HxWfQ^Vz_rN$M zz}!bn3^Hd700aO=LktGqyqlC8P1-B1t+Lkk-FNAKBS&casqWR1O8)>1UF@1kE8DZ` ziP-N$fxuE7l$8WJkO2Wox{jk5Bo@yEZs~3teXMxrXh$IRY!G=?I3%|YGR((-IXS>Y z#5fuGR50C=Qw#wMla^tY0Fm6O1no6>rXtx@Nf;j}etvEHxo^I52`l_P09+h4RONT) zb?JNSwUzyM+oj2iw=z;zYhNVo+RgP=eR_5jFP9Twu0oOgLmRRDK;)HTyM9Btwu0e) zZ>m3IeN#x%{weF%I_{}!rdhYcUlaMaSFEdS1-1T#cPei$8Cg7pl%o*eDmX$UmnY== zhLNF#itZ$5*-CNx)Oj4C9(IzPCwQ(~IcT|7yLZs`ID0Z#Ms0$}sJ9$F zMCW-~+EH;yyWK}sqStMe&(VK~KNGwU;!Cd&#o-&fdzFh`wvmw_XeEhO2;!77xLttA zicwqUecQlgWMkGxD#;v8Dv`cBj4J?GyL`tgmpuD7-HEc{yrmBDmIlW+m1kdxd-l$MRYzH+c(5NhLPlfaq$Df zR^WmM`t4pdTx4Lf;G8xF02$*A&raTDgzQJ~K&K$>L-vHnUzm141_*9>ITgF$v*!Fu z_)Kw?Z;BoTM=P8K9w3OZke~!0Lx9+Qy*7{H`HaI2hW^d3FJ%=t(X8LQs{uA9ACJMxqNPG|B zv?YKF5eq6VRDueSOF7MPaL)?g-5ZGAP~Kz~W>J=jN~)Dm#j`KWKr9E#$r&9_jkL?X zZ{okkjZg$=ZN4VU6wLEPj#}Tto*jrVjirsHTr7w}B$xoRIZ(0=7W2e96xY{QQM8RB z&mZq$N16pz1NZPN#{QIuv_S{Ql|ty(dgrv%}9N-e0nTkzL?HNJ=0AF}K~+_8wWyu8`%lB$q+bgD(bq(S_I-QBS76`}jccRoYOEBp41;93!va|WEC}4b zFZ(6jweN@iCteKhl79=L?hJ*uN3TeC236WfC{Gz38zn}2&xe|bZ-?Ks%-gg7023b? zZEeSwgF@HjbteQabA@hB7#_eM$2g7h@jW_nx^S<_QtIt{iaMp;$9uG|doa!_`)ZMJ zyp#4$_Gw0Hv~a`@;g#a$Sq5^zeN z;yi8)K`3wwXBfc1$`DtQzV-1Y-J+H>mNtouODZhL@wb&G*-}JF0=QXFhC|9al2EY5 z?+=s&4V-QaPF$|wRAid)R>*3V7GE5X)d0M3e)6v;kuRgtfExrCf zH20F$@0C3gx^{}v$#h!Xx7lf9jn)jehBk>-$x>+M26FfEIY@6J2;6DDUg0d88*7A{ z06fYVzZZWstZrg^{7eIwmpbo7TPGWju_tT zL?DuPytuTrwYOxR2^Q~Fxw5l+R(rO&{?E0)y|evO1H`#@M?6Hcij-qU(Umz)P>;K1 zqk~P^*(KH4ce(RV2|BTF*}28LMlp{y^p1{ANu=~@>&oYq__oILT(Q)AJ)^~cHm9v= z^Xay_PnT;m-e2lASJrw!X8STo9rXbeOcq$9M7U*`h}m3zZhygFbgPeyAGi4UFYv=k z@z3o6@frRP_*=o(9|pb!_(xRui}6QF*L1ya#2Wp^k*ZwjT4m_)y_9il(4BWm(brnm zpwS_Y4QTjEZ9yc1_UGbXz|Vo-0JJOr02uz?zqQAQ{{Uwj$u#1Z-wHko>Xx1({i1wT zX%unAK7kL2?Bc$Q!4Sz~EShEHz6$Wxpjs=IxVHG6rYsjXsp5V){k#4&_&?!={h#b7 z@cZEh{1Q+0K=IAAw~hNv{BqK-VEv)LXa|Z(thC<{_%FfG=w2-SpguS2Hy56JCy2BU z3;6M3ylDRb;VJm5r)bxg5ncW{#Jo!mBjS8ED~91XDirF{jeb`MB{dk`Ia*I;?xdxz zmq(?F!BC~bm1$O;H7Qr8QdFd!)ujfKifOlWnwGF!ys}Y~Nq%%`-|$FZi2nc${1M>4 zi$CyH{{Y&9;RpN@)8P(@qTJtj2jJC}mW}b7_M!1Nhc9kgS*^Sg@QcBBw_0z5bxl&% zd(9^6#y1mdzY%S`i?IGfiA6;m6J{tc3f|dUO z!B)N&{1o_IVRt=*-|$br*aJ-P*Tmg_!uoci2BCZK?(gC6!1#P0`#1PObeoG&rfPRz z5WHpLi^bL9w~JM}@e1kjLubYPk&Ca4gtK~*uXdcGn|4x?*ODCW*IG8xx5cV<_-R+A zLW)VPv{#KZo|olIO>UzlXiWA1awJ*j`iGQ@0j$o4Mbg%eI{8N2t;NJxsw?T7h;lB^s zL1m$7mbZy-U>8pCb%%wti&(6!?FwC@+pVYQ*eo49Eh=jRg=r-eoVk>ol%cZal4-3} zm%Oh1*sV{H#bYF@PCnA{db>&4t0a?2t<{sfpq`devG?!9FNi;|{{VzEyI%`@ZvCqM zGJf5!qeySGf7!eCI{1A50J7igo26@L_tM*0$?*fm{vFdb&1x$hK%1M775H1=OnSbh zZ+OjZ;(6~L?@+e+`&j<~f|UGK)AXHJ;qUChq<9nd1o&|>t)0(>zh-?GU%mLl;_E_^ z#`fMb{i1d2t!Lu@0Es7!Qy0-m@dv}YKA|<)ySdQre#vDOkH#8rhkhb>q@f2g^ z7}R-;Ax2?dhMx?su3fJDWv%JDHLxsX7gug4SrY`pr3_I+Dl?R2wvft-$iO6O8UE)i z;HiOYK3tP;wVzbghIWw&vTrfmEL&pU$J;y|;EOq~3Vb^7-n-)K$drk7TP-%r zM6$FE7W;{%@fNNxnaakq;ia|4X2SeY_xmHulxl* zmV2I5KDmpiqZK*1Ywq(l{vB-_$t9+*OTCfIY5oEa7VT>0&e9A5_S!ww-LEtG#@Sjz-K8cAof(^yRC!HX=qh1*Rk!V_^fGO3KB znFJ80m$&497=GGVk*&TN_(t+`urZY}j$l2uhtD_`+|g)}P^X#oE~0KX%1C8nJ|tEt=W zD=m$q6lp$J@u%%q@heh*S@=@NPxxn}IWj?SqQtj8C!QEVRBP`Q>bB($oCw8vVJ$xo#fu~+Lbxt)ZE&1GB ztl=3uQf|>!UuN|Z)g`Iq7x%Y%?xQxNdvSGnb#My3#-np}e|akebLPo)dm)-!lFgR^ zROE6n7_x)yZzN7+3RjSsAxcIV5g98HWn;VpyfXr<5E4WP`(*_{Tt~R?EL&o$H{J|) z5ZEMwyR)|?MNbRu`&^hf7I#H}2NEB$GVURjz+amH4vKzlpl@Hta8+@*oWi4>Svbn0 za=e;ScTKe&to!+N>-4G+rO6cqXrz_(YAcoNCfu*+-umo)2k^(knjO!@Zy0GhmXD{s zwWo*e1-ut%*HGGBJ(ijK=!B9Tw+_zlA!iH;mK~}Y(08fftv+2Z!d?i}^h+r;yB5`T zMwkGXvfs+OzNa%ubpppLft@}HEu?u7lFQ2hV+JVb_*NIO__Oh5-s0d(cVh;NrG}0M zSl%mJOM53{98nldX&t<1JoQ64D&;)JYr#>Z!BohJ4T1f+!|Tz2g4KBV?wQ%ZAs!^pWLh8;@=26irq`%-bZ+A76Y2jkw7<2N_w=@*Ba-|7b zw7uI)TfdmiPvS3*^joE~eP-T9NRo8hrRmQamT5sC{e}_`$PP?lvcqV|7^fG-KO5UI zD|=$h*=)9zVh0GxxGZ4+AwddNa-_2^4h?g@I~)8$5n}+08)XO_md3_laCa2RJRr`+ z!i??Ba|Fpd9jJ;EDp3FZ;acynew`0jhvO%XVt^42gCdQRZktO!XbX~5 zy3V8^!6G#ZfQ`x&kmqs_iQYS!2<0|j8VcyFp={=ekieBCyz|hre(NE35?xt_#9PNCl30SOINA$v+kRY(9Gsf;{VLlUWuxWDc&*MHpi&)j8J7eUCnO!m*kF@g zyg#0CCMKh&JZ*Ve2_)qOcHDJWi+bp;{{S?ND`6-?7j)^_CY_VIUhUJfvfJ>}t+(d* ziQ@=yEysoQ2UQJ%H3Ji4mBt?J@}#jN3K_G8W3_;aFN~VR#Kztd(I&w#XWM6ah6 z0f8P}&C-nW56C2Kz#I{Ry^i7m-St@NoKE2%Wm(ELyt$ne^+{>_i9I_vzhrremQvlP zO(*WO;;TJfo~_o3-&^Z#(ze~xd}F&LgYcjtgOESrBfr9Ay91W9&M-hEl2|F++1gg* zKN+q^4e*u;L2s3R;VHc!{LPWIZ5T7)1uR!N1mor)dC~ACqZJ2KyA6;5b%FYlK3u}2 zF$a^#AROeAQ!m2%Yn(Fb?0}r+OG`&R@$(5(fH@tBkUB^di zDfG6MzgxQ-EH*`_H8@2(bAPJ2h(@wiCzpy&Jn^?o6Nb<2ZvugpD?A}n^)^qMe zk)&xD#^n`4j1|V^Kvx+M6-LrwXtH3^@27HGV=UK~Hf5QH0N<9I4T2OGRRb;s{{R(3 zr^jI{+s`Y#vO_b8qF{tvUqNX*g=Zuyyps&N=l7>}&A<*H#9k)Ubd6T>8(V8>p|txo zjG(6Lfo`!yadRREP3+DtTq7$f#BpZ|&TIBa)u#rnCfA+Q-CL#fZ9Dlh*pfR_diGr0>3o>$aO&cDB0c-NTWlw7;9PO6gy{y!(`b9CC5$ zaxgk$cK{AS>aEn^p0zsk-RX{_IoptNo;~=-BODA>qZk7NsRV+-iBX&YNF%8JBe)U( z2PLrsXM#b`s3-4?6Opv3-GD*+pcTmg@vI?ER*I5Mw4M8D7jByGwz^*8lT_C`N%HFA z?XK5b-Q6c^b?7MG#2gcXGxtso+<*a9JqSDu`ebr$MQZK<3b|l1a;KIDXy+IlXKQkC zka3!+9m1i{%vnYb6tM@W94TU?6VMKaZy6PSJx(~tAz8j`78?f`VsaTU*ctnz?OYO} zh+{a4F9TK*a#a+$bxUnyeK)?U-Iew2#Hp;xT=9&lsOhzn_;q_~(@)o1cAQ#XAseKR zoP&WHlmHE^3XTp*&KDRM&UvX0pES74$fuSg@(Iq| z{OZcUsW|~jQ^pD7Jb(cJgI5Ath5=mQoMD05PXi0V8$caYWQHJ|j8}BwQyD@sQE;+N zzFu4WF4k{X-*)uBmh+7aGEs6_D@y59D`s=8)T)2&|wwsDpKIRt=kcXP;K zqX#76i8;v?cHRqHRU>K^#(rfl$r%6=3k(gpTm>g29zd(Ow}>1r52A);R>{X3nB;}r z4sn7{7|2l#ytxBvmB~54VtVnN-3sJof)oZAJm3-3f=MQv7{#0dM%)eE`V}V};P&T&7#_m3H7jEb<7glPPH_7dCj{r_ z<%tA<++>0~RY_wUXKqP33QHW5j1?s0vFbtYGEW3YGu2;ay1QxHM}E57$+vOas_2qe z>FIW!+x)Mw37zCPI30LDE;?`sRXJ>93y${2RYx2oP&_VfC7?6LpD`MEOCHF zMs72bcTUAcZtm$db#$-SP42hTeYE$DJ5tjxto*$_T}p%= zT!D)3D4A&kmU2NTqDdrtunYhS8noAStZnwF%PW5AzE6-N@={Wz*UK)%X8^Wwf~raJ zy*p8w*+Xf}BOyp7i$(^GTX)j-)mv5791fIJuNJpfS9*Ld&Gb#*b*t@bEIoTb zv$CD8>@0tGoz9nN0ID$Dtg*^l<$^UKau?6bDdZExY`J0; zi30@o!3sSG`%^`?U$e=7aW)m(%zZxMNV3Eoq#<&kuQ^2|`G)~;#B+MJzMBdx_FBEQ z%F4h9QW@G@zIKTQ(dDQktf4+rxmo$HIa#&5n$zA*Yo_`=e-FW)r5dw>j9j)_G}Y|6 zced?q+R16T&!k1zgXN4U$qeH>?m5bB7y#qtCy+tfK&=>Tt#~p>3gdYKU`gqn%At5U z%RbYboT)sV=`JG!*8;%_sfG34#QAObuE(7|vX2r*x#%`ZlApPfcIs-kwE4+u?S1 zPRiENrKRnCx@!8_Snq9bblZjo&`ovnk@DKfZxGx7*}mbFDcndQ23zLZT{t??yeBNz z(O9bFe34vUBCrfZY|$i%mLLz_fS_<$LS=Y69Y#rHBUsm@(Nuq`lTGmH*SB!P5-MtX zY>_A-7jTYk+le~>CQkmwJt9&5iQ~Nv?3^JQo{g&bTH%3^hi^MlV*&XAQ?^+nL}11_ z7&1rZVyJuEm7>&Sma|G%PTFdkX9e{$tR6YjoH^v8n~HY#RqnKLQgT-A+O_Z0 z`ZwUW#-9~bKqau#>d5<5&jtKx`%{57Wg|( z(BnS}^^XJUwt9w>W2oMEdqa~*_*}LS>v!HI@SlXPZ#8cec(=sfES<)WX%4ey-Z9oc zvF`1xe;e+!+2#)%KVZ1GQjtd#dd-fZ9ztrkxHfI7g9D<*fr5bT@)E2LGCeKZsr^@IQ;ZFX0~zOQqfk zE#vSPi3f>%B$nEYFzQ-%m!w<^dn>zmwEa5j8(Yh3%UdhRu5DQ-wvJ-WCmjvKG89)5 zsFdKyaUw6xmvvN9pb$djWVSL%B@ga7COu=Y7+g%!Uf&N&uJMxnA^PpcNx)Xx1`6#w5~Lv~gN`sl zL4hl0X~noy48HkIYC;7?QaF z46w;RDzX8Rx%r6&i#Z?+5Dr!SIkn8Wbyjape3P~BrI!7)(#H)tQg2-(mDQI`Jd#Sy z=Nx=gIg;V@FCsiT^SNNCZEW~m^P}#s7g@hokepEXWNEHW5y8~{TeM+)5M zl^J1^VxVcZaguW#tWkByA~IKL&g}9yLW_ZrP!I)eMmI==?>TiGak~tJ5(=)(p!zca z4tk7aTO8TOH*Ws`TngiF%C}carGamk3I+fQa!Qp?x+20ND+VYG7D*~SPwVCNgd4XmJG50vt8$PM?1JmEnj zs2CY1a}C3i(bqh5JdJ~a&&miOxGE3Ji3*eR92KcT@znS3zb-%nJc4>CVsN=;;ajI9 zm%VStz0`NVo$tN-+V_bkz28kN?zLMb*S)RRrO?8JZDY5F00nH6<&}L&&IayDAe`qv zFFE406Ig8_h)JPgfI16{a-@I=z`!N3mK&EjBRwJi09FYK2pIriFdK;jkfpfE3PA(q zCuv+(POTT6XD9&)5fY%151WP{kC{L|U_u+Fa2Inh6sgM6PkT7uZSI?D_FHworMGEw zE9%yX*|x5(v`bI9HMRVY5!Z=_NY>@tNsmpLm4GCcNaS<4=OFH7JQByKAdi>B#G!1o zc=o;^vio5;j(kPht+yWh)$vXNZxJcI+E~>_9Do2;`dWiuYviXQF%QWxlq0f5Tg16q}P) zYB%qrvP)Yn^uKiU=z2fHODJ_89C$5GpJ=R_{=0Hr?xT&PTYVE$xHBurVJO~8fXb}B z0<$>UE7xDc+P%MnE!xDbyoTE5QX$tg%XwmX@AW5XR!H?VPcwecn|ftCsX!19vjp4|542E=zNU}uvn94~|GF_Ag zEdKyA1|WGAxh$**`5HtSaLVksU=Z$!Q#=8T{Mb?mW^DS8#p%uGj_#x_oz_}N3hb=v zt6>J;yS6@g+Zu%nvuP~An)5iKF_!~!?wD>+7c3QWNL&npq^>ib3ED>k-^uFpU?@{= z-@1;Ly|hZ(Uib93k%}{{To_ z1}xitRZ>O+5Jm|HBlai$30?a>d@lI^0B8GG+I&aQq12$Z@K?f(BTAF(f%OePQ@qu_ zBzTU>>rB*LBYO+meN(~uWU1sadzFT3JBBbasr+XPy)Aypu|Nam+E=B`=6c)zRSDq-t9W?Gd>RXv?pFYOE~vT@eUt&`c=AE|g%md6*H)0Ikm z(e@aoxs+uas!l6MqI>r5y^qOH6-zyzhrTA;%+6%A()CEL6=ZVC_ST*unnaD2T}fG@ z9%lalFChzn9D`rj7sQa$e$M)_Ea&?};0~%J*k5#tJOOf&xnS~w%$E-5JIN<1`TPF> z$Iry|Sey2Mfl*4>>Rv6=(Iil;iwqtww+N0`3dTi^K4$dhC5jpT zW+=ZXTY{+BETK^DJ4-*1T$ldV)PYlgZA#%u+I)mOjfy~Fw6Gv#gVZx;*!58qo*D2% zI+p(cifd2Wr+Wng)+H*tSQ1pK44j1n@1Q^VW=eptwNsmw$%RsD`|Zmhx3*(TJvqEHr<^o#oo=tj z6-zKH^5Fcr-I0(8#{i6S00a@5(@2N_oDQJ}9Bt!~kO3Gy$^(u@393mOt`9lL89d+& zfq<2arbsf3(P>gMh$ffyX@O7-FG;$ik8HXFY4_6O)dOJ+Eu@wVs!6Ro42h zsPkM>i@v)xtMb)5?Y64T{O(nozBmK|He)1>q~LAafsk@OP`@q#H4woEfJQ+aVNNrG zz>qKr!91Qik}_wP*r~w;Z6J*9QM7;<9N-LqdmLos#H4e}3?0OhK{zKo{n7^+86c2x zjzwoJRkZ1C)~S8^^|R^P$1|0r(t0~}hJ014!A$aC`%*RFVMd)ZlP{%*gg3lYZPLge5821ZEZjDXlvjOB1fLFx#U5&$5m zBPXCBgPux^ax!+{fz*x-YQ-4A0B$@Cj!J??32qfZ;~;`~&j93eVlizkuWq;fJo;Ym zO?Na@6SmzxT{gYmyf3Aj+{A1Y`mRNy`qL)-Jrb@a)GVfRQ&P zbN>Jz5lA>36(EiY>y_u_2C&$rDMi}t$}4S^(!0^^uWdTEm`akj+0mzGebujK_OjJz zmb&#z%wgnQGy2INZbL) zBereKpSVsi2G$$-URg$XJeJOIPv!h1sHS>I+(7TOh&v4wJ13ntNn&Hx!xmpn_ShN~$y z+JvQNYu+!y0AXnzZN3?NHu2xb{cl3lZ0rkNq_@5|@P3F+JmP>VP_jdY& zTF3j*;py(RPuZ*f3LC2GFulRK{l5G)d1~^?5yiEK#Giv&L`=R^%QxCB?JOfI(itL> zcd?cde1k1~$?)gl=Yjk;@WcKI`>N@G2mA-&--`F`bq2lSuMTONOr9fcQ{o@&E&EaU zb4=8=zZu%-x+bHk+-mWrm#-zBteTX*9G=d5cy&9|;pjCh&!Id=c#rV2{t6|ciKo)^ zPYeFu9xK%+vbByW;+7=7_+#RG4L0T}Bb)sNP4$FL9jngq+uO?kwYQAd@L!7jLk#Lw zF)>ZXoTpA)(u}?3Rnq3VZCYOI(IoU&YRC2GhuJF1C}3#lr#Pz8w0RnnoN6@rclTRX zlD+TM>FnRMRPbsawJ+^=3J)?(J4pS9Cop3O@N2qf?H}ODz+r|6(D<6-J?bVX(jVL* z^4xrL@oqsk?Q{PC1uP(qy2tGg`!DL-kzHO>2kc+rc!ZLL;ngR#y4lDe&mt_0i5yAw zN5vAif3<(@VE|^H>r?m%`xE%aWM#`u9*6Op<8Fdx4i#gaz_$?;NhNab%*7R&O8E2Q zoUFgKxBL_}8z|Oa7XJWcSy|g@Q~kC3D_BVxW>k|QW08O^@&Xj?g&7!+li?Z?`u1d+ ze%lhT*LGX`btP?@(hke6`)dCHM8?XUDe(1YD5Zp!E19>WjIh+97Vp;bwcVSt)gLE( zc#J>7Z;7SGcG&nvOqF6!+5RDTT5=o!ah2T6Rlvvx3P5A<iG2AJ`wy_ZO#mS9?|AfK_!fSDDd=vE)mI6&}Cb2`AJ|Dw&wVOU@LfH zec|I~T)ONb!)K9<{LEL&$RUBx$_N$xyWwPKhr!fSQdeS0t8-rZdhcu5A(CR+K?XrDj31Y9+<}yzn1h||(>$&L$qIQ@(!7mM zOOv-Uhbx{HfqW_c5H|*JSMLx=VUSIBGpUyBNN{#wDLLK5Y6!_6HsA)+k^wp6am`7j z4|D)r-~dSk24Dj-1BAvv`Bx+6%VRt@>^{@l$uzZ&kH1abw0+(5wbyg->BcIOh1++# zYR%f)JAIVBH_-XJTqJmhULA(EGlRg}rs+$^92^Xfn}q>zI-YVo2qHN-@@2_59JKNi zz{zE8ob!@0bDva>Nj9?L-M>t`~oaERzILWtl9kIVVat_kRk-wh91D2>15dw@1>}DY36Z_D3 zBoKEu02UzN4W#C-D(27+n+74$=%gtaH1+&+*$u5g&Enbf9)^7InPWS7t zQVsKHucBAGvTwcpdfB(%rr(kh=5dlSEJGv?K1Do?wpBqVp4)&YJC_p4_FCSMITsfS z18`KCqy&aPdpS_byLlME&f4i&vvYCC{{UMa0|S$Yqdhi^9AlgeoF00fZqhv3-QOZqRlU#imU=c#2F zd3T@_l8~ufkl8sL1|K?*+fTRvame;f9Rq0^843^j6iNroN{|8C0Lji6h8vC!GCL0s z-TR$Dl|LfD0+2&4%nYCd?w(t@>wtkO)G^}5|wnA3{xxveTKrTU0 z*#L}>pk~e(9ipp80K)en+xT}VKXd@VmLLXM6@b9!Jp(R{)KV5;Jdt`n8y zcLcUN=Q%Z1BWx0?xXCI&0zymfCkLrG18Dh3ARK}#&XnJ@Ny_Qj+k4;SwbuPKH;nCw zj5TV`@lNgCMJ}o~>aDHXR=T-l?Md|K04@yhmJBi$TXI0%(FtT$Q6U|ERAGj%)Q|Wg z^~=TkW&BsN61;7ze#@RHauPt2Omts}-wYqEKerq z`!=QEZDB%5ksd?oBt$@v?^Mc#RWWd+I-2vwJD~peJ#E9w!II& z;0n%<7G*PwT)x#do|oo=jjp=s>Al_7zpP)io~@^NXG{2F;$IMJ+Lwg91LAF8LGTB~ zO;z_MY4*BKx2;JAnRjc% zw-y>#g0=quiQXL4to%{%OTqf5haC9pPPEjmLC`g;Uk~a!MysYrJ+vvPXc}}LB-3NN zxX~;wZLQc^GSDOZ*d*2k*D9^%Xg(%*?E#Je;Igl z;k@{}hp@SnD%8W%hAR<9a#E)ySJ~9246b52Se z@lCH}l}TAULG!m26&T6BURLyO&OcNB(Z3vY4~bqZI(LA+-w(t47+{Jucm$(=78tIzuEgG^JF%#j2r= z{IB2Q>L!j+w95*hD;08)Uo?ts)uQt9xFNPGs-Y1GV~9Lqp*bF3%oAQ$#C>9QC(kCe=4mT(rv-Ugt65*oH>;qQ-ipNCrYuZVO5Z8NF3ig<2qR#+}!nnIGn zDoGUX#zJB-`H@JGxK=)N1)+b@4+4JDx<8FPU#Dn3DuO*G=UKIm($?}TS8WDuU7p%2 zD`mTaGKhxWSix(C5yoAnXN4lUME-B_d&A7bE5+5vb#XGQ&gbl+f6Q21njKzcDr`yw`bUwkU(_TDGUDqt7yp| zA?M{G+z*-9ouD>Z$Y%Mu6weF6Zm>+U#US$*MJtlHX%=-P@VQ{XbU93w2MdGL#c6Pw zYYCt%SpCIyBYKVOLyWG#>OtGMFasPC)mKe{!|g;HUBa9?64;v~BmfHF{NMlvR15+! z{Lfx>613psH!fD&vrRiY=&biodv!lYk0vfsoLpQ})80>Xmqz}2y*lnqJTtTlrwumY zWrQS*TISepP{vf0NGIIc4;J)cyLMHSuw@a)B#SU(VL$GRxd!gpN6xY#Vm!i0T=3ye zG8E%+1IIoc_={QAJ}7wF#`9UfxVN*P#gRiC{zQosR=UB4Ar9y;B7+7v8zuGyMHh$T zmtt>)KNe^H$3}Sm6?o92z3JNQG>Oq+k}(8GhF}%rCHJg8XhOJ5C5Oae)tp_X-P|p7sif@(wvS0(+U=q~gYnOdJU`-JiPxSi)BI7Vi%We+LTh<$ z?k*VI+vy$@(R@5fg8De)C?|B17G@>>}RgIg2(C41k%UG7z#jYa0)UK5h59}o~ zSiSx1$r6d|T1ZxC?n)0PDBUA<2`aWE9)CR0+sCnVEhSn*Dlvjm30>;JoCst908~Zh zWta>FZg$v>Ent~#p+_Hk-DgLm)@P!Pn5R7HZXeAh? z+T}_L+9j=(xAnW!`5aDRDaxDnblsdR)GefWZm-REeQmRUf#?z0X|Z6UC_qAjS9&Qd zS&EaL%DdYLHju|?Wh3RCRt3VUl{`kkd7D$^Rs(2Xy}R!LkX*4WNXX@_%kC|eC0A>G z&=?GEByIUYDn>yBoT)g$JuRxK#^BtPC>SyTGr0mY1R=0h@=npoBm2)A8gNdFQGC(c zZ4zDV+t**3*2vbBRMcD5HsuuE-%F(0Z>6pGU21JwM5`6p0eLp^Z2+*z+zO7nnD7WA zfJY=AKHvS74a)et!h?{%Xz`WF+bXJpJTlP&@i8HYS((5%D%`7KWyi!20~B{eZN@Fg z%8autj0qz=INalR@ni)9301~)9o*9cgR z#F*1Nfol9y#H<2*Et}dA=XBMbz2uXP+*(?-6{pG3pnI^XlbJ6|Odt zF^`(oF@i}@0o*`13Nmqw<$O2cE!3&ut#NoD>bYeY$PFcgVZk`w3;o^+ZofY5r__z? z(>9~P8}%q-&gI|>NZXP@7&#*?+~9Bxdf8Sd{gu00-D|Ctr0;J=t@ys@;(6u`!#Kxl zr#w16oN4^;y7aZKc!$S^*{{L3r}j;ROal-~o1H;`Zb)?)I0TXpAn*Y2Eaa)^F~&{{ z0tm*^2;}5$00K`W5rgkv9DjeT!o)EK%E)xe7E^lTKA`UO?)~$EInQE8L-==Mr zkP7t91^~gqoc;rhWHAQ-uTG;G136sdsRZ#6=nttqI`BKG9XZbdv4TkGDtrUTBw+6C zj2vJd3Z1-iaf6Tm0|2_#_qCP!==)jv{oC5X+Q~My>GIQGyVJ2WM-1<|fdNP(+i?Ma zBO`F>oB#>P9X_M@IN|&s8nGX_*3^Pm=QM#M<9>} z7a)O*6T6XtllM!EWELBS@1y<^N|AU@?6Dyt)vjeMRDam&m2%3Qv0S{=(|T_0XVTm1t$ytN5VrfL z7yvhZcw@$La5Il^cz_f~9(r(gel_sPTt2g>h7GaM+yLO^v-0iF z1ReMXZbnGp)#2kG42}l3r{s~xpU)t22GCo!00a?&Yx}E*^Sr7VW*VQ?XvdbEEWM-} zwWDQw+S>2YEmgHYi}83IN4AyWFN)T8icdtA$=&Gp{88D51aNW(JqgBt1IOw5QkP#| zdUY7@&|?5|>(rC$jxhMc!_CuKuqU_^Ztath7o6}icsb*(FZ?Ci4?(M0k<$g)k0U)o z9D|a7nE>vueP?-hDsje8O3P1c4$Gz6>!p>ncJt->jwhuDuanhjZ?gB(Z!PY2USJu( zT>TFp&mDSW*wXG_&z$F+BttiS^&|*UsnEu}N!2X+F)Zbhky`{crO}W&-uc z>ye%~2RJ1ijp^CLZZBmHMQ6Zzy0 zIOhk7G$!G7n=pIiIXU_Whf&u#=y^1!#M&sw{7&qD9Dq+Jt03veuLq_&3q8u4U+q*c zqF=p&dqwH*U+q6F9+ncrO>1d%=$A$1=ik$%`Ua47`x~CP{p4Vi$UK(=*9V}?*B_PTay@jiw+>-t|$`RIo~ zkv)2z-!biq)B9sCc553#%`f?TN!{tDt$OQpTA=o{yJ>6mdvf2cwchWeH_WI0eB~pi z43V7s^8Wyq4;?#D9kc%c9&&W&_tA{~es0(pKIe>rE1o_m(7S8eY0pih9tVCDobkxy zb>!lc{t}%GANdYgaB^uJexRkHaYWe*Z{<~<_AN#WC zx^(6K?z;Eiwz_no&;0qfxHG5t@G0PvOQW1sEI zEOgEZ=sWzpjz&ny2ROhvr;iipj7~MHLU|Yn=YxO4Cq3&KXBlnv#!$as-qP~d z;`8;LxR=uuu9%AwPta1MUJqJGh2=C52o_Wq#&79!^=h9G5 zlX|#u~nyaLG3CbJ3+a7$+bV2ftu@4DphOQ?ev{#ABcN zX^fM{1b4_FpJSYw^J?)9P`%%*UfOAUJ6UeDd$hH)wXfT%ICGG5k0L z9E@WmmYrV2f6G+ko~NF?9FjOEr)-Wvt~qDfOSkW>=G$Es&8^b9^Vj8HSD#qEonJ*B ztG4deR=$SlMLk&LW4EZl>T{oObI(ArPC!$%l5vne?s7@aa!AKspp%>on!q~UkT~;G z{{SBCoPtOgJu$`zAdK=wJDqmPK?Y>N0OYV4&pe!T!0+qNw;g=vBy?uwm{VF__GzZA zuT7qx7h64zDBxu(iQAfK{5@@_Oa1=`OFEou6;K2Yp+1>boFApG( zkX~2@$S3Dcq^(raZsWS~ABlAYib3t3YT9=oyLaj45ypAQHy|+e;}~y*k--vs&A-(J|7))SFk1nsvWr{dUs*jV2d7fbk6U9#1$NjAe+x{^0A8{o+A9mR z^I`*_{nt$Y01(Ro>;_MBo()o#DS4T57#g2sT zlNmY4KPc8)2%(G~=xn&zY{pIDZ$?JEb z)27F%M*{8FuD#o`==8F^pWo13Rl-3&;=>B3qbSB3ByoY?2R`}jUl@43;+Ijo9Z9>C zj$El?(gqj=?rd>^kTOm=82XdMo+Pu9-f=wrYwbi>3hjaH_=-9+ScCvF0Jz4zhd%6_PT&lH+e`1 z$vFf&WD-W=bA!0#^~eUK@jj*YDfG5hInJh_?dy-Qf(XW0b1yjSjF8(%9F!9@ao-~p zU{(-v!HGMEEwp{WSb#7OE0d0zUMrPeT`h@bC;M3BscoBN(nu;kT<0LD7;YP>0M}ju zqH0RcEyXsj)t|K4TgumV({AUVTM5fvlzu46QnIqUydv%Qce}9@YqLCvTm@Ciuo+MW zcS!q{10Dw}{pH#7AC&KEdbop5MmvF#mNI{MO9>>52g1iA07)FMUP6MbG7pzYa&m8B_pB;{=kNjkp;_IXJGTRlJM)8Zf{Y^B@XByO8Z7C?KfF+RP5(2?}{o21jh+ zDK&okC8n-Ay}H?SR=uB7q2;bV$@057B<;FM#@g$rmX7v)SxjCl&eCOykk~s&Yy*WV z2vScO$zBv3a9XCZk#DaAC6tv2;Ioa{0SP!=m?Y=r$RrG~3!L&xKbJE{xP>YP?2vX4 zSY@~1o!oPhFaW?f54FEKW$Bf2Ll5Bu@5oeQNCSbmV~{(ZmBow8r&-6@$9XH;M*bbN zwyCzB`fqc#cnQieUlpSpZDzFjt?vB#tq)TqK8odtTqbf30o!xtb;v98MYtYH@Hsr! zliyrzg`*72cM?w|w&F`LARaT9zy(2KKnh42m!2YHWNp!cDad1ypDl|3pdQC3a6Y|q zMR4+6n8Pz?2cRD>JTCwYgOYOGgN)#TUgkxWI#K4Rmo?*OZS7~TTc`OavsUZCW%7%Z z=ewL-dRi*mzdylWVI`L%Jf4ID$tO7{p2H;MV{bUf9A-Q7>@q<0JOFZfV4R$jjxZNI zO(T#1+$|7k&Icz3sW~fv0R(}J93I&jIphK82RS()SKs02Mm(-9TGwxF zI$1Bq+iHCjXvHhpY`gh8w(aSAb@>%!;d&qLoRO1^H{+HgaSBN4NgUND0I}l(ameU; zbIx!uags6tU@$tZxd#UwKK20JpHGzXP8X)qP5~g~W|V{GY+!N0BoY~i7#KeJCya#{ z$s)a~FiOc?wz{qSy6k_<_c0Km&+g03Ay+$jG2p4(*$SD-W+AloIee`@S&c(7 zpCa4^AqjPd?HiEnC5w5ng4tyONk9u7{#$K&*0)wS3g})7eQQ+`{{VOFx_qWNC1s7w zWIV=aJ45Fucime0tgi&?y<*z;TXyKVC9lfqU0tr-elIx2)r4lFCmkhZn^$Q@%Ie;# z+q?M~QFzlW16Pz1FTEgvA<0&1Dv$b#r8e(_)V<1s2kR#z`L7?r$^AX4Ckl z5$(J&UYNE+hq(pOYWDV9rV z%kLpWGrZEDFJl)WbGwGerTkAITH1v`?F4t2LJl5F>#Ini2QiR;a1%8Q^ z)2D^27Z^qk>y^b>d&zWmzh>5&Z@Kw?F1>oURUD+7Z8qE0X=dBM^7?so@j0Z50XNxU zTh9~fM)yw8?`{>Z^!rhLZF8dwdmj%7TFX<_*5>XgqP^9`_V#n&Y5HaUvvq5zczfBr zDdUCxob}%b_`c@LQPUH~t9_&R!{C>SVDQeb;;$O`UfLZZUk+=g>PyWt#eWKH^zRvK z7n+^Mv*OEZ4GUiI_%@M2tSzOe9?S3}!TR6Btr31Y+4xG!#$G2H4zWMMzXWSHx?hI0 zKLlv+r(bGXr^M}RR=!(}cg0>X_>JNbe{oYFhri z;F-Q5_`h4c*Zv@Q(^T<9KNI!6Q3GD<(s+%diEZR$xq&TomA27V!%NWYQY|M#(=C%s z(rm4?cS&;D?H4U$d+G7Hrf#q@rOyKZt%EOQXT1 zS@_?@de*U}_@Cjw#61^O)c(t$_-j_XL8|FKD2HD040Q%Y%6ys6Ns?Clo_x?Htps`EOPZ*7-P z$g%uZu@xxMgM6;5a7VmSlNLyoA2?T#^J}i(VtUbFOL#c5>EkRJQ?U)9hw%k;5)CDGU_?lEWY! z#<60%GHH6$fVR=5!NN0xz`cEh1!XNB?7rq_2%#{zLTA_K&xmyb001tURh%|HZ5K;C z?nv<=-kXU;499}NeB6=3QjQ_hjWu-T%`IK!9z|>Ey}Lj2^lD-y8g%a~ryKfTmDwbc zcD|e5+UQm{M4m847Y&vSw^n`<(LW(Q^quHu9!Ad!Y& zl;nKa!MS_9O)203A&j>1m2KDx#P0>%004Y&pkaY(Nv&>v%Jca%v{A-x-Na<7TbIL1 zz@bwPfw_t2 z=KzvVxU6W*GpNV|U?d^jp?Z_F5Dy~*AmK>>gTSW65D(Y02LOV&A#g#+AdFxR0nQH` zo>-?fcKKUsA6WJe-mUIXjo2AOno@ zK;szif*9iQR0;tFgk%xMMgjYvj#mq}I5@$}bvf3RRTpP#uSLDPCHgI1sLpz(oz?oS zUG&n=T{qjN?!{d@ciI?*CowxF(g7sKz>EZ3V50KU5LlctoQK(G#nB+P7i$)53};|w zW@z*B0PIL3BRiFe=Q=3_Q!6w9`@ zWNt?x`!&gFSQ)LZ5!e6iI?3t;U4h6J!R`jh)Mcv1`BfIkm4Y2dn^^65NQ zo>*M%OFxJnEwKfY{b+P+6BM#Wu?1+zmn0}(%9~5Hx0*MSGgKF zj~o#KVzrXi+G8vm;PTb0@P8U}PpNS35khJ$<`mPKl1~20rQv8R>!ZEjmEDigcnb^9 zkHt<-{{Xs-ed#3|N@~u{HuYQCX>E@hkHr2Q@SnwB*|SISzmK$kg1#Bm{x0i2BJmf* zy?V+GXHL?z?}VNl)xIR#{i8^`wz;$WL+ct}gf#mri})n8i&fMkp61U{v$UGdZ!7-* zf}4NAL%(7#jQ;=$elh;b9|h$2)A7^dH;Vjq;ZGF!i{f{QZ9G@tKZm+>{tnjkUl#uW zY+GpeAMl31h~Uz!bQ?V{!y0w}0K?0V4PRJl*ShT9Bfh$_wUS;x!(IdUiShRT0O9wH zz9#s^ya}slcU~>lbl-+w3;Z8#;(cbu)5ZQ2)->N1SY7-=@x|(BD7)G4Tz^wb>k|NsTwsW1rAubQk6(^MovjZYx;I8FvMVT zoOLP^jWs1dYZWyWE@cR{Xu&#@YAcmWwBYqprx|jy@%X;kIShGhvmNId<~_%Il5$CA z=c@u(5muRt6(gW++Y^A;EAxarqTpn&4U8$qc8sf*JITu6HbSW-Gm(;4lk$wXP(TZw zq3~ux%om0sbMmqI@sc^lPH<054mr+1ukFk^Is?LR0h-*XbE z>~N&uf=TI|?LEa!DFrdKkQ4M{>CRo3sQaXDC!M6W;#7U=r+pfWEEPFoZ~-I? z;1Jls>$j3{$VeRIR*I<>#DTOPpk;IW(iZ@YyI&vykVznI9PWnpFl>(}lD~AHmA8O7 z^yegCjP5xg^S?JUNj8!R=>?1w}WHjz+ZS4 zzY0Wn!BeSi`@@wWKLaScK_?>seZ-Nlf?fthaY{kT$Uk~n+jmkre4ymE&;U6H;*SM` zyTBd4;%B#T$ZjAPqaDO)9 z%F>lcQ@xa3TXNf9-$vRiYi+O7sohGNO-(0v7+Kk+cNn|cEpOL*HReY;?tya5PwxpJ zHsQ7=a83s7Fe(@t{KF|?l^4eCwVDZF0W7Bo;+NG36c~A?R zL;+!$*f5?)l1D{ow;(J_5)cuQ$S4mF0r0jTG~o;-dXY*=V-@)>?+i_Kt6I0Wrl-_# zPZQ!Y-Y>;br!HtGgHcy;jCrv5c{HtcyK7~uZKt{Y5&py%iK=)j$MBdcXU;GniRFeDP{{V{m<9%7`oV;9vZCLla(m8?{)7eD75X_ue#l>`DNqy z?ks#Sq)Q~)E{&$?*IK2_ei`ucTWYdf>H3}A*K_!*#NHveySvmRmsz`DW0z6YwJBz} z6KUFAv)e&yZKZk7fxJ26?~5KPe+PUQ_(kI%i(VzSyYe-g=%lsquZ277_X*Sl4rrPOV2F85b-{brD|Ude`2rL$HKlk(Y#CI-8WxZ8a->{7sXZZR)^!C z5_o6BdUd>4I?Nsw)BYBGGV%Pv>rC*ch_xwnk*->QO2;?iIx(R~0a6%DI;BZXs&I8K z;|FMbSCfpClB31RB^4cH^l58rtEZ~Ecek?m?qAtQ;C{WQ zctiGr_?N1F(m%9Tqjx{{2kdeCAXxa5;)bPabo7pGLfgfjBk+ZVt+kukBPG@CwzaAF zCi>dZuHdt=)oiRTF73W9{hlNt@u;g1#O2fA${mJo==b7ScW(d@J!roAEpL z#PQk)YK?RH=Aip$G9F;J*-P_A}{UmOeiJ0D`n@zYRPytNcCx0D^3O&psXf zgnSdL*~z5%kK>n$wSV|qU$yteD;1Ry^({l* zi)6M*Q`*Y%>_&H0eP<}eWAPGimla;6Z)B#Xtkh=X2`gRN(^j%gG_T|4+)YZADN>ba z;M7`Dqe2v&X<1v@soqWry<57Rn_H&Y_N;%g{{Y2*hI&8zE>DcUDEKG;00hKjL2D$}T2`NV;k`4#pBACjEmOo= zcDrYEZCgk9YvMocPyYY}7xvHbUb*mB;Az#b zCwZaOV)#wqU12^a_}bG{zFDs9v=1J9Q1Ft%u!z@8y@q>@Hrw($#yXb0@fXGS-aGh* zsQBOF_ryOC&i8uPi@qWFlUmjFZxTMwBHr@yS+6g3=~mOrRE;$aM&}V({hnKRVoBh! z+K1u4i9Aa7v+DQOI#f^@*2)`uHI5A>Wn$NMdTxhhW{M=6$P!5{rLc*17xS6cS#7^l z$viyA={oXs)uYQwg*OKug7j@r-uF&>RPujJ@mF~{;_mzK1iVWCS$A)}+@ylF`U`;>4Hdm5qP>r#%65HsO7q-^00L96g`pO%0^I>@{-ZtIV_@H=0 z;ecoO#qlfP_rMbY3I6~HdRF~B+Pn#7gQFPLlx+LRgz3jHz%eB(+-YXr9oN2-{N`C8UUSDR(sJpb6mA?HvgG=~X ze{*g2oljYIvRKo6$I8<5l#IHV;#NkpiNh8R0=3L(5|)YD)T=Z0z83H`t<;Ha;Qs&y z>)#Od2V!Ae4lnHe9p+GnKiYFz+)7Zaf?{p$fVX^f-cr^DYD zd{fsV10E{)xp{A*=yq~Nu%x9jOU+uK)A14DPH>OmBrDkB(Z>&?V*epxPR zS!Fp*t8&REp=+*J8ObQUuB_zJyGq;j(#T}mo+7e}ddW%2yZgF0C3Uw~7qZu<=tqmZ zN8vw(ZK6Y$Kwsr*EKohSfYeoE`eop_6r$N?c!*x z+g;Ucnpl$P*+VSzBmCXrUx7Y2H@4ARwT_()>~C(ZtK8}Oc$?3PSe_FM3#e*L6f^GF zBl)9Qn8MB@ZU)D~1t(O#znN!7xPs}eVh=QO+Q}unz~0?QA&pt#W&Q z@fKj(p%+e+nsQNErS7KrrsSI1+_8&x)1~^QfWXmOa>`IiHr@G~wXYbY)%jksa*9nZ z=UeeF;}^z{iIB-@@dM(Hv3sRVfFBImeUHPw8B{`sIN|W8hhfrmR$!?aR~k#)Hpt0o zWCV{BxUr8;v`H;&on7bhOxL@Wgn5*1jaYDY40OnLC5d2m`iRr4bm-JtX%<`M4-k^} z?dQ2^6tR4|Sj)U9&Olo-zP?W@|P^mmhOrN2hb{3Teq!kTN5wA^7B#Y^E=ai?Uh z(ci7FtG62(WwK6qWA}#xCp>(^8D+>U5Bpd+HzOPav~%(nJe&Xs$rLXvn}B~=B_i$Dx6MH7$AZ;Cy;WdZWoC7+PFRzDinVI0LA3sk(_E8W!*?7B_e(D z`SHY!1AMNMyoJg0QKMzv zz>p&cGC4c4aYVbPHqiZ=IPObB2obRbixyb-v1N@6o@8#UV`U(&{NpFrG|z>95p<1f z!;vQUHHRDc8no29|-L$t_tGQja^iIpO*!Im50cr8CXWm(lg*F>2N>g^Qh5_(y^msD>1cNL2-q)szo0 zPyh%khX4*6!U%OgjeoQ?!(p6!NxpVvKPh+Dd{#*eg;XZ!K>N6Fmjy`%y$4oNHo2#U z3_!lrTR7eF`7HQW1z3W9>a&b}?x2(V4oa_*;oNqUuHDxE0KaYB>!t4e+GopVQBNMF zz2QpMeLamkJ@2)=-%h8*)5C~$mkW$N#B4A|99`)*k+msBITn(4}1c&<{ z#Q4C??u0hBRmRl5Wyd_QAm?h6yeI%Jc1JSqw%0}*i_5+aPYTxxLZ?=cvjD+B4U!r0 zfHXV<7&t^bvwdR3_h2Is4oK%Db?0&s_4qA(BQbJ;QP)xxTUA{(Z{&C#Rl{ z`e>Q#W2bx?O>XJyW&Z#_A-dkq{*QBv@yh4LlNBTZZ)?MYzb$NEB;z2G!MOmbC#cPF z*8c$NCeBVJ7~qfM1%bc-a>tw~BxeP(2XEuW+v3}W&VSMD&pF8d076cn0J-jX#&SVF zDLhTF2HtW;2c6Nf91q>(f^spE2N)T~N#Re$aa-l$Tvauqa&}f)T|=w>uXkm0)XSad z(NfaX;H`h|_G@;(;4*oX=KS(DrJ9~d1eQ>8Hh|eJfxBQm0UZahX$l6Npo5U6&0O*n z5Eau3ago$#k_h=qf^d9-bA{9oKQGvaxFytQJa7v21#`|l2e0WvI)0D$^15=7)Pl#L z=RJlokihgE$Fai_}OFcT5BFjjTmi@r9#cEv?IehTFLUwn--^uQ}=lGB8IwMsBQ( zT%DL1EHY6?IK}`3j4GUuya@_M0IX=hPnD7;1Pl`Vkim}}V32Y!Mou{(6JJx9=eUYb zku4WnYVFJC)i80rrqspt1DYw_Urfgb#eH|PErBT<~%Nc({MKrQRHD) zu*f+XCviKf;`q}{$2ts*cmp@&ag*0=x#XO61F7{OaOpIe0A20QMn$090R@LXTIaR~ zdE?Totn%lLLBP%k`x=4HPB}~*4!8v8JOBVZ6gY;vX~|jb@WJiN-tWGu`+1jNEmqNV zwUnB++cjjH?Pt>OWA8i9kDm{9Tj1aDkjN1tR3ZE?u11o_6oy3s7TXB&Aykcux}g#0 zEC{T0_`mS|HAkLL6SF9|mAu#R{<|!o7^G3LWU@~;A+TF`f1OUqf{?!zTlvw*U1WT2 zL7bcbQHD4KV6!nfFOWe141pW{s!Nc|GY)qR#SR%%0kh=b;Ndb<1===%rv!MT6Dua5 zuWcHV{#!e_r>&E|+HJ9?)L@!x$$QrR?XZ38LOgCj@}iMRkF2z7RZ)>lXW8aU&J4D{L{*(?73$| z-0^@3462O3F^;|@y3Cqwm`U4doY82B zwXF17T>IDl7catfwg|pEy~$M`VeqGk_c$^PVOLLMw71SxNx&m^M&g}SpT}>5_WEkY zCyt^L0_Dt}4Do!Eu_eN;@9cAe08QU8j21)l63t(oLNzJ0MuD&n1d)Nz;~=(MfOx^= z0zd#YE5nHKu|dZta-3k3oQ#a;An}or_rme*QqSwzUz6QiH7jVMmh!cgx~H?dwud+N zbtyM)YiaJc=N~O}y`BF6E1#gv@$2B+h1tA$dH@FnJPYFRG6Cgx>2Y9y3gM6O0vS|b zrl0YT;FZl0j4|#l8cL-^^03M|_P7F&cGkJ;vEJ-HTw3~2N@}tH>o=af^9N}1zHF%pD2su-! z7|Cny!CuKGmaV-s-D|sD^oC7_sVGKi%bH3pIV)=@-pNHbyV<91r|K@9;O`sw%ituR zwAaHg40yld55WsBiMqeSEAJEdL&J7D-o2%G;={sPcZ+4U*8UugPT$9tx*}Abu@n#ei3WQruywKO=2NVyr8O6l8cNJrqrhe%OsjL1y9MZ3H-n9Akl}S0%+zikBmt zIoGy|YAwgv%3R4kJ=Xp)NQVioPtPPh(K)iIT6Ur zM+a(^3)JVFA0oJsBY)k7Ld1aU8^$w|S$7c5<#>&XswTkB7?NpWn(0V**pLo*3d*dY zjN!1vf}{)<$r)tnpS!};RihbQb2RVOy;b$^w%VA;oN&OEQ=G8@)UW{K zgTUH&mg+Rx!ZJtzgC)pqxFaOU7=TM5!OGzLqoJ)7@npoD#Td`aoz0we%NCD;xa0$X zPf)yLuB90zZd)&&yLEQc?$OzIJgIW0YwrI5mzPVf`)#*Xt+!_Uzh|E+ZqH1GmKAWv zpdl23LC(-h3~n2{6VF{+#Efxrt;riia$`8g(hOjY%Z;iz!!FIl*2>;$ z>#AM0UDI2>`ih%tb!Be;R?*pXzq*qA%&Ce-`DTppOKk@LHUMQ^p}T;qfq+!t3}kD& zB3I03Q;;@;DyHQs6o3>3;B{c6f^atEQ!XbC;7o`>$sxx0g0=}_BUsyZ4ge)dCuj~w zHJNM<(Bd~dD&jYhQGwdHWs#V1j1~>Z!!vRUPAi(%Pfm|Vr=LdpdTF4&l$={ulG$D@ zJLzj(-QT~P)a;{@)gnh$g>VVlgtp*tj7}E>XFn>FxDl2krR_p%ZC_7FU8Pozc#oqB=N{Z%BT~P03e;LTmZy?4%Npa05b9N08ddbo*@7Skc=q# znn%XcKqZw}115T4U}q%ss&y1&%-g<=X|r~_SF_RYroA4vGLS8m1q>w-;I2`3kW*HgA(l7#oFi$3_iLwYMcNxbgt~mJ@C!ymRr9CmH9bI0HE(S1Xcw`_As#Uwt3^ z1@m1~B|)cUz4W%1T5q+qcGB+Od2yUK8O}43Sd3>pWbh9e!5HHQu@DtzIOP8Ty?{aE zu>|FS$mHOh^&*(B>Os!n2?US}6M%kWlZ=uGCj%|X6=4QO;t31L<2cR-VYCu*PIx&0 zgWsicwS9Z7TfVE+`t-V85^ts{+Rb)%v%lW0ujPKpp@t$dIw%C;FmaQCoE&G4cp!7Y z$u&G}frZ>S$8M#*Vg^29M(&$?o=(wDEx3|!2*Bub{?4_C<-cx;uRfbx=%owW%G&7rYi+w}zW!EJW;h`? zV=PWL4ZL7v9A`XZ7zd7VinAMt@J0g$!!qp$XeXSo7zFY$`@xb(J!)UGF*soV0DI3g-)=dQ0?Yol#$Ce5= zDA~u#0+l6t?mL4W%be{|u;q%OhQ#4#fyU9JilaEFdpfk^I7vsBRHUq$X*FxLC3SQv z74bABA7@szHwKzTD&&U zwVK41&u?XDEn~8UE%d?ujO_)SFi$nwpoP3_ib(>j7-Iu zTm?w>83F+ENXP=lR!ISJ%AOHtsa*M@DW!1`4B#skh_)LHPbhvs8JR_iPTy3zw(_FV(oY3=qr`C9-M5__w|7&Egr4A9TS@10 z-uk*Ud6JB1eGFAU5JSVg@GO(PfNVOsyo5ij3*Gs&blIS;<-rD8^b@ zS>8>>Ud`K8sIdI}6%x|(fC?JfSvaTHNXC4@(%4%UoJ z1Xl)E>XI~ZrogHYd1)y-0r{~bmMp*p8F%h~V7~~@<6rnDpN{m~?+jG@lWBZ=>8Aa zFMLC&=+XGI!_jLo*j#8@-oGuni<`SiW1f8$9YWC~dz)LR;7OX%=eJRG@fb5B`1w9# zQgW|Oy+qtG5{zYfc8nAv;-sM5qU@#3&u^S{UXEc#F_kAxr5ccnQG!=~^0P@Vd0AQV zwv+c>r>??4kxNF!jJq89hdV@=Tn{Z92WTu5lZRDeLb?nKM?qx@?_yNS+e758>x+jO z$=rBg4(t#E3?XuAEepk-1J`dLk4W+7hc9lVog!N%l`QoFRz?Cbr)n1#dVNZ6obL~vvZ+m@Vcg$Bu~h0PxISc_jb2IF zN3N?|uCB{e)%5Zu8#bh^E2N^-pwd>g;@Wn)>3-(c_F#Tx#__l|%#E9}eo(l^cCg7W zj=+-B2N(|0FadUk5xjtB<{xoLVtS3kK9~iAWJhyqrRKc3hT1kCG?Nk{K%=X>DhT4j zo$ZMJU%mH9uL{-w0BHRJ)N5A08t`Vl<2#)$`r66vAk<*e;JA(TG_kwC(@<&JgI(K0 zYE9$`aW$m(Fk)FDvxGdWgz7~#DcN&7d#>%fCuqm3w$@GU-6Ca8wQZW!w(OOhcXF~$ z?@P7SuFL3Wate^=1=JACIA&r22j(S-0{~+xhYD5rt9UmZJHz5%aQM@joyu>`CXOPx?26#-A@DY z!7%93L@*1?(UmWTP_azl#zJ6_$+<$XW5Vqu@!^qzZS#Uc+s2@uR(;&C!we`R1gmcO zMnJ`TU&O{(ptp^16|R|(KTWG^a093#a8xoYGwytbRc*V}H;qD>gaFJ55abd7DY>$E zQUWmS6n*~ynMi8xr#B>>uHQAC`&#$4-%UF7wwEwbih4;t?OC*y>?n!?%P}C>S5c3IJ>KT zpL+V~Yj1x>^xJl5`0r6V*N9T@Bq*@cp(7x=w02QO`_YwlhG508sI0i#^6e|gxRu-|l>Ms>#=@Hygfm z-R*1I4ckX=Ep+X&8w!&>gY7w1loKN{VhhQ*D=7o!1&WQwoPrs02lP|_00c{q&-f4f zOyN+o{8jKAINQ20{{R$bt_u;8uaPqrQ;o(l*ad-4=WfM=3pZ`0L7XXO#uZ(d0gQb6 zLE58|NGr(sf1@AxA#^`z_%r)SL9~!QD||Sg05M{>9u4s)@NQxV`#1~(VVH$bc7;#p zpC4r^oF$8kZCe+Yw42?mT^FXR`Zu%PX=C>f32VpuLW@h@mLC^>>AF$9{O;AS`8%JI zUl?qK&9ChickWB?6#PU*4k0L}EknlYK}VHWZY@_kytO0d%7V`y_0jR#>AXMtH+)vT zUKd38595oH!N36Nz5&+biBBZ5tcsZgHXTuj3^@Krz9(D}r~G00UpF2#_{$2FW>RLf z*1S}a1UNr3o5I8@uHx7%4nzTFt+d0U=2N zhV1WMt&AuIkLA7~^VFfh_ivR|f>+k|mI^CQ_KvH~{Qk#-r*omd6=f#hc+(XcBm)#Kf{91I*gF2mGtNCV~^0B{H_0Nc=eNv%?8 z{tH%{?c4KuTV6R{&06;IcfObD`o6woB;awt0AnF?S2;bvIURCAQ=U&sQJnWYj)y(+ zIP1qz&p03xxKY61fxyWa8t3pw%xniZB8jG$)v8+UG~x6zt5{$k`6P@06X|Ax2XdFXE?||!^U&T6w`y8^R$kb z-~-2@=Qtx7JmBQyxOM&#F@?x&+!hBboSuYmMt)J1Y%M1w@spjrwn@%1Gs@=~C9|G~ z8-_uKq1AO;Uv0fr-TGPR{DmH5?yuXczhsr(w%+RZ*lb`GJNP{bZMo+l{HJRXf&myg zB;bN_akQTi*l61A@7meW$r`H^ib*yyPe1Pp07C_eNYsT3l8m@vupL(Y+Ym`S2G3Q_ z(a6qNaLKi|1`IL)e2Vj3StA;)(H|oa0A&YmNppZ#oG=Q+U~+dI#4ag96IN~6_Ojkd z@2lUsOLL+sN!rfoD>k%$4g9aZuIY8u_ej1VcwRy__?935&(GoC5X49d#|O;PlLYN- z5J)2g5&^42$DR})d&M^DI+AovT}J?^1)ERCKm~c=9>*siHWs`Mk2X$n4gfnz&OZ1f z2c{T~0Ko**t1amx61EOhf~ngi;Ht9@tT4cl-yo2Ar+|xlt37&XmAsa=-^%)?(Xw~8 zk6mAqznfkDdUVl!D84!HU?8`P?2urbK9#AVz|RCdh+&)&yOYNm86w*JK=3YAPmQ#7 zY?1TY-p1KGxFPL^M+dPd2X+T5^C_C>XA-|W;6{acJQgJ~GOR{MI(1?QqwSXfk>)`C zPS;5J2O}6%L6Mvc=NMwkk%7lkExpo~kNiEAy58?=z5Zxv$vw7C*Shq*rFVYsr>XU{ z9xU*TgZG{+@crh|g0WpBO~KCQU=#z!HxYr!JC5q7`Eiih7#JJaTKj2W2qxC{JAO!Jv_?!WVExpy7--vPnP;YS+%ORm%hrz zkgU?QmD0AUJKoDreqFC-`deG*eRVwc;xUi4M%gY*_7|~@%rk~(hiCADNM=&F-H;0| zKZ&m_rO_pdIhCXeaG5;*?6RonN!^XCx%;OK-TV=LCHTTLR6Z@$*>RAvSn0CkhTZq9 zT%3+h?x2j4KxCe8iGD4*w|FJ-P2rADGkk5PX{cY!434jhG5)a$1b}`(!uU#~DLUpC8Nvox=E}B^-yH|JawbuF_X_98J3K#xaDars(3>Ycn zEDlC-yMP$vh9SXR*~W!}l28!i=0Il~_aD4|RV}cQj0PDQ4dwFd*XAEBZVI4Kp?u8k z85tN&n~>nH7!%1nkD9aJRMiS?7gFpYRFiRlNhOIKfN{?xDb8?PENjzvOT{mBYkeGb zOP5!_;jX(qOx&HHy5D|n`g-*2m!FrhBx+{3W}YBCz=V<2d6$mCO3RL1D(xkTf(Yb1 zX&2gjA+N@htGv1VSJC}~}`Vd9EiTG%KdkWGhKH#hHfF0Sma{tEv9!BI6SLB^Z=TzpW~ zp;EUqW_xQNhdxnQ(m+|UWQ3UGc95>njyBhfd^^ZkO^tt@x)5TA%H4@fODBMr&^w{{X=~^^5n6Djk;} z2mb(TABeYhh&-62oXI7ZieLk3krYvp63-;g>-nki`}TnFH-P^DXm8qMTGlk55=nLO zx5YmPHO758Z7yvsBluJBV@mjWELRV8C8U;8++W{a%NxgR70t8T&P&GwOZtW4s~G10 z0D_8IcvzMZP5U-{W%zob$IT;a(&|4GA%KOS=G`ZRwF!c>sTmC(ukO{{T3aSHoDmbsC=j8xaUnzNtpM;~8k0Yei+zw6E0J z@yG2q@ax524*nweHpfNrO5S*f!kVs&XEvp6X(Bb=s-VMhEb!_ROCm87eO{WaC$)GxZ~v@<#d?l)*Sx;(*_wNuQw1A^58HS$MAuSVCUtm^c$dzfJrgL zzaVYInG}(LPEJQWup^8y9BI0rvcNkQwIzt0(W0RB^|I5;eJ^ddd+KX97gLd*WRH?EqGr#Rq{3HhrI1O9_{LC$Zk z0SZPj_NN2@+d$7jfOyFxf)3djo>TLH9xzG9GN`1GMgb&pKrNgebAoX#@+_y}PH(0^ zFeC%#vkZZ?NE~iC!6N`;0OLwepIvp1&rMQF+kMY#-(60a?QXg)+SWGC(~%ID?#`EOidh~+@fbEf#jSXkS}Z6<%*T3Z6eju^=tUSkk}kq|K; z?QpwtcWn$fYsn=R`+TjxdvU-|m7fcM2SqpmbIAd4S2b=qSlhxRh%xgZ8S_eYo-j`3 z!5dgH3QKM6#!Yopgk+<5sXN}>>#L3JZ!I_1wx>-gIJVPzq_noH-PLH+QhWE`sqT#8 zV)!iEWjv4$aB{#fz#!z1+ld)GV+6#=Bf$XRACwMQ{Q1iOGnOtuIbs1g$ZQ6o5bqy0 z)oxhlZqj(b!NFigaM@x{000e@UpN9no(MU}AcCZACj_y;!Qh+~+(Ti$dbRzp!tAV* z+S)FFD>;8Tcx(PcX=h2;(a>*0OE~%_FM5LlGiui4L%@vbH|o) zd6C6wd*Q8X!J6Q;h%(9LSnHO0mxnbt1Pr%!cb5A7%1sHkj>6yrDi7ul2{XDpF~Znv z9xcw53b^cDN>ysYs-b^r2uVt{ohYSkRn_<1pV$$?RLmne(!EN&u#BLboSb6fl#*+e zEgqb=Yip|?H%9y4dm^lbe|X6m10(lfw)TCQ!TFG`-=0Kpg_XKUi(P~fG-~}Z{9s3d zQ12?|1Q61%%&LEQUD=Q_`$5-q1y%7LkF03{zG&Z9(=N2wnaNKnZT{C3OCqk)0a;sm zE6W@0W_pSru#n_j+pDsXvLfiGXq9Ab!I8rNyGbKz=X)wP2>yVfn_z3uRjFdAN;9)k zg-Fdcrp_;2*H@#rk>X=AoJ}PcEInw?PH0M;sk>b`yEvt7Ztc3ZudhLE&I(L`x0dP) zD@I8RoC0{_LUu}p6-YQCx5d(FS2yu6F;6HUi2}k(`GO%aF*sugkRg;4B9=ueiRK~_ zE0VC6PIY1=IUq<;S=4Vx+*P%ASJi%GG#{C`qJ}R#B8%>e}1%JK-(ENAX|90v5_VUNV>}V4{nSb}5wkTTWPqR@?zs zz&J&7pQ5dVijlc>EXqh!Rop`ms-xyPa#$-I4mOYuNMDuy3SL=Vd{5S;GNx`kIjY_# z%`A%{yt|6; zAUx#YtgE>H0DO|T%8~iSdM;`ZisowRrLCQylG^s}?{xQC8_>h3)tuy#vQ}+9Z|iGs zdtGbXMSb;&v8oz?pJ@kUU;1-?6+fWzUIt_F7i#dM8VJmVX8Ck>pSAQO>aj<&8v zt-eV=ENrEhBPY{b%%g!^#*8H)LQaIm)nLSRPmrkOokGxdi1?C5Q~DP~N-x9ncd`UN(D&=nc8#je5bs-O)8Yr!&(>!Nk1TmtkF|>JP zcX?!JJp153j&)xM-Rkx>GQyB}sciK5%<(I{0@i8RURyG*W1klfZsFDARdr+mnT>rt z`%f6A@R#hDsx+GMJ`(z3B8J9c1zZ6T&kLC6XbR31oTyMZBr$IyQPZ{r^l^aSPiX*%&x<-@z3 zEA0x0030{j4;!)%ErwOEoMO3GTf+O>_cqcU*k<`8*vzGV`aF^>Dyx=|?q^}S1$(E! z8_1*h&*27tEXJo%SMwy1WsxHA&b@Hwa-miQZKN9ua3S8!@+ym;<)pF|k=(S$ATR$~>X#W6MKG&z}ejf4ov7R|YzNKhdBFrO| zw5Dc<0Du}cV~wFl%vD&f);>z5n&-o~+?!(aS#yLUSRgD{uGV8IUB_~g>!J^&WF{iN-bHb$~voRr5P*t(pLN1vFYTPX{wc$vQL$# zE$r!~XQIBVWd8s&s|}A0X~P67L?mTXfrq@iXTj=Jm)(F%D}4MF`Ejini(8UUP@oZp zRwhEHdhvmlImiI*W0CU#s2g{OEbv_IvyU4N)+F8n0O4@p^{xCa0WHWG&NebA+ zx}Dfx<%2tJW%4$H#5%D6ZUKwrt}<|NJ-n)eo*6jopw|1fH*TG7uYWy{&8uWH%yVqQ zQM*p6NvP4A)nGtM@ic?UFr5=W@UGn{TxaydEfP6H8>ft+x;!RVtWjE=w(NjYriwnqm5 z;Bp}=Y1605+xgz?^rN!$Uy&jXNZ^2^^V5vuA1(%S-xxULX9mDHT=X1{NjU)VyCVeS zfJiv|!-7bxr=HxQ!5rfm9AE*)I^-UJoE#eqf&d_NCj%USMlcB(-~*NDaga_5w4&d< zuB~@%{wQC|ZvI^gO8)>aO?6spr(Zup`wNW7v{%eedC9 zp*%mS#u%S6_2lD%H^#gIKp7cr*%;uAHga{sQ_JOXT$NV zDpbpA@+7sV{wt}Z`>WdS{WP~@>+Lt;--dO&J6q{uAk7*+)OP{du*^!fAb+dO(cU@c8t+hP) zV)GpoV<}&O_xbhf%MXU06v@Vy2*}4-20H%$b%z|}a5`XQ^^txW_*f89#3nFQ zERu1@LJ43-2psx>>0L_SK*K9=a7hY8c^h&@bB;q3!OjkPl1?RC$VVb(Z1(cs2aFy7 zBPSigjF3P8wF@rcO%laZZCRwRrm*X0WqWnmuA64@IgW}^miON7&y{z7)y{2x9(ZIA z`1c@n;rDuEfap$eagawC9)(^$A9!P_vsn&D4S+Ip%9KZ05$iMD ze({)}z0k7fp8WP5d+!}lxW&|CfPd66bmPeN868_cTC4YkZC)-^e*1a@t>5enR>Fz$7>#FyB*7`r4t+~#h0{C+yJ|40I>U;FZ z%Z`TwJqQ$|z}_Alu8V6Mf3nPSI^&RV276$F2fcJ3+IGP0I)r)Sfo?}${FB$I^zTS@ zOHMJUA7~RU#ulc#mf`33qK}|jd&~cGu7tjZ6j)ZmxraBz-;<_P!0md$Y?Zgd} zjQSJF;B?1+pylIHgCi3&a!x#^#{_~wCkLLL0nZ1uAK9ER_Qt~Y=+{*g^h(_yrj`df z`g@J+_G@cBZ+@xYe_dVqZ}>p;9P?~PPB}lWz)x;)4^F%gpYVeCd~$8F4`5r+j(}i# zao4|k>xJ+?bsrz^5s~UXUiioZILP$LU$+ne@>qd@PW3p?bMo}#Jx3VH&lQ}q?i>FA zpZ85}qf>u(W}|Oj>d&x7rE4Uh+e+VMTjA4hmiphwi3RROy#p`XHcGK_jwVj`1 zn;r}B_$U4)k^8YS5_8b<+~a^Vk4zDayZ#XE0Azn>LPsMc$N<3U_s)Cck4`(*(Z918 z4RNsb!$lxHM_i)%jPwH|1mxxusM!nwc%+=?_iRo$-~v7R9zi(gnk9nB`B(5Iv$J&D ze+K(CYbCAiZFWYNtJ&|tW#r=~F^&c}$Q`grz|S1@%A3T-eE9Q>3@U@3 z++_Vo!RgzjaaFlrk?X-ap9SBlD&r_b6C$Yd8z$0^P>Ux^P zWpyyUMRkf&kGKM^0ouq20FjaM;EW7%3CG5_{vy^Ry}kohyC`OLQ|6Kb9F5^r?O;NN zP&VLaIR^*hGrYql!cdns29s?xlW%G<0kEY0STwY~bQKwUp#lq{BR&BL? zZMW%tm5)yNj}4BSX>Bcmja_89nS^Q%-Ij8)vD=KM?g${3E5j&FwbFQ6-^0hl+DqJA z!SZ@#W(uJJ@i4D5ag{(Z)`qz^56ulzpU)gvAv>~0S%@Tow}l6A3g0##wig5BKPf@0O>KK;G*@z} zDFxM;kTC-T%On;E!N@8c9Q@hG%09Ewuaf%47YxkaQW6+~0l;uZMsNcH2?KTrAaP%P zlw&fiQ&FA*o$nVL&z?_Mr)#?=zby}m&oUaBbYUk`+9@`lG*`INOX2gkk|aJE@cB9W zHcoJI(jG@l64=Kh2RIxrN^krlS_nD&EM)b`Qb!)l7?3l`8ON_eZ~2mA0dRWo!-2u> z4oN2%&(ol%`H$K&gZ|bzImtX@oSugsx#?e3Dj8ByYXe0|rONGZ<#$?M{{ZFYe4J-e zGHE+UZ4z5@^m^LYyYo#M{{Y!K8t45M1IfSGzPI)6aBZHh1$TY{&^indm*17)x zt|WEj4CATipdB{@)~^@GSdTcy7%yH)`IL1SBh(y$*D)Cw4EcV;=S-24&H+A$uS}d^ z;GB6Nm%AuNDQKLuOGd4&l1=qVS$Ulht1GAPYVGRmyC&Oq+eWTpww@>*@y`@0_A7E-9< zqY1X$d%JAAdUe+43F9dhbQyYbWgs$uxLKG2ar`4_AY;F=HS&e!))CJExIZ90RztG` zAH)6NTO$qfk(K%{##hZIhbY_&e)r{82l$wl!CaC5009`t$6|h8x#T(H0IAx*iKTyRKWbI@Rg@0lIQ#!2D2 zu)sWqZ1a)PaC&2djF4!^{f`B+gVchfp%`KTT=gY#z^Nn=Tr-mPFlnaJP1{{x*joAXO^MH~dW!9Vit)MS6JLVj(-=HTS#IZ}8kwX@=u%jvl- zjk?$yzF+xkq;jW#cVL`gjAxIVj%dh2-E*9*ISN4=R(NvETObU8HxdEK1e}sO9}@lD zD4cc<>qm*yuuPtDK)fsz2orWfg)oSxX+K*I)XuOK!UgU$xgoPuFu zM<5UYB?u(w;3cA$pCSYfszSsm!dwQaQqcgNeaLMLC+Y#&JI3oU@-)aS3aA>Lk}A% zB%-gnyVJJ)eOmJ-op?eomB!Z5T{mvOb^M*b9A{j8z;m1qyf7K$5*X)j0|RbIA#;{Z_`7^rv;_kaSN*)uvZ&Kc5cX1u|XiA+IZ)w!CKFs5xaTOxL+yUvnwdu z80nTl)Q(Fs^x6Qy71U~)q}r9=+Tlo+IPh>vkCg}jFvAjKP#dNLbRaWghLa`Fj5UPQ zmI!u7B$ozh1d9-~ia_@+%Z5S97<@^~Li*EBsk z;tNP;)N~n)_qTDXrk$m0&#B+Qw_a3}JdG4K{!v&&hHouOI-Ixbc@6^-slsxjI6_J- zN!rr*Z??L-F0A-`&oaYQa*S%l%IYm@;+y1d%a;A@^?fgGo22+tUh!t3;I9SvX5JT@ zP}S{XSj@oNm^ABa%}(}7gqVPW|CG>R=@LkBVWXy3BDKj*Ty!Vv>vnZo8ktcsA&EmwwBt& zcxDS-6G@lCa_jmHr-yW19_8(mL(w5ii0p6D0Mly;;r$;_mgVJw8;1Ne@e-}Kg1lv> z3!!&B6KMBt1-#ISe#x#&8J&W!m9fp-r6Me)K_r#{J$}#Y_ugNGyltjhZfjjJwOh#G zBu5##y0C*)l3ckVfRf_n{J|o)Z0#{F)gO+(5!wV_iIUrCn1(5&@|HQ~3mi?YNfZ+@ z#$-ujfo05U!(aulspZ6L_AjITdibd3&aCQ7{jV-*UOcJBq-3>eJGU!6b+=uQ$$U$s z@NmMo$ywp?FoJPP(BxdPil-E;mrWg?O%nKi>fwvtmK`R5hH%9ci8l2pxKe)hNdRF> zE(vY_01iq202M!m##os(MpY|mU?^}esabNPmjB2ukI%cW>uPS?_+c6v6Qy01&UkFl)og6O_0)h=xAqe+eQ zZ8ONKAcIS>nI7XXqpy<{!#|Yr#3Z*|yCX=fwQs~%-WFdG_>O7*A$V`Y%q8&h$7`(H zLazyb0{BYiBF}YmYcdHVxbv;C35kS}pp?YAx@GjWfO_B8t zUscz%w}pJkZexxFzi_kOdF5{8SJl)kHx|*a%73(F)K{Mx{v+vkItHB((RI5W4m+uZ zy~Oe#3ixNk+5|Td+zV(HNTicT5?Z9Y#8HqChDI`eS(IeevAKm>QIw+Bhs=tn4u@+=yDN;9Hl^`Tg~l=C4-K#}F~nMqn0Nf{802a$s-SHi zVOKdt+*q?Eet0|<>~}ngJ?MCnHM?miY)%H$FCj7Q^Oi|I zZ7+_$7Jd}?zfSmg0a)ZhV-W2$yfO_~YZ#{6f3%X0NFDemJ!s1AG$HJ{a01jhr@?_dX@@O`eUR z_>08QEt!rnZ!Vdpz15|M*&~ZdNZ_+F-OCu%pTJ>dTt^y$LKKh;kn))e1{;cy;1HxC z0g9d5$ShuyG9+#`v~sI9)sTU~RZ^g{9stG;1_4}h&0kIZkq%|;uPIVV!`^XssR+ht z@~bX*D>Rw%^)a<=c)}j!d0`~4YqZs_?(D3uy}I-?;3Z=nFcf2V45V?#%y=LY#{+J7 zDt>CWY)UXW>A}exNGeW7GI`y>9SJ9=CjqWX$$&_~INIc?$QfbA2Gt;vO5hWW0N$FZ_>o7s&QA+R@T?HmQLxk z^t)@7zWS$gb|3%%6OclM%96MT?&FdawoU-t2?`ptH}RZ+pzguSg008SKxI7i$;rte zbrp$iHuAfUNZJ=2i91Gf)Rx=Ip5X>b8Qn`M2(~SG|Uu+aGOH9jFcqERAesgz?LB8gAreO zf5A22(CvR}{{Rs9lTy%a^~LZ%!M#TR07(ASz0j}Jml5a*3PdCFAb2s)1Oq}=LS@=~_8 z?0T6_Uo37Wod)@2=A^8eNygH4-8j28-jDM?KeV3|==YXaH+DL%i{gjUL&JS_qTWj_ zgtus1w%ILXS*>JfrAL&<3Aa}gI9OZv7T>krANc$5YxY$Aj{g8=-xU7RzBm5>gc`#0 zL-Bd|W#B&#z&v;H>*Gbvx$%$Ub;;8{6Z{RZxwMm3(JwUHpAXx&#Gf8r=sp$GH3M~N zX+6>zCA;}s{t6Z1uLNCuZ1^Map6kQfHlOhu#2SB&JWzFC0!yoSmd*Ye-|ANSxrfKz zCGifIqH1fYct1(diP44h-YiS|`~LtFK?VN+hOBM$`!5iFFY5j(pTr(6*Zw8x_WG;q zo-l$Nty{+$&Z8EgG*+^<&|-e`n?*MnBrU(6ih;@{IW=u19!xVsoF`VJq}shW^C&wg?6r!sv(v85`Uq5k)Mujrxs#~CAeJRY2?{a@ zQb!G%ok_{zixZp@00n>`f~1vFM$lV;d-VdmH&)jiTijdD$`rSkDoEfyb~6=XaQjFF zv7NgVHqs58azig8B5VD8_KO z+l+nEa!qtPeZ;nj8zZne3PR)zg4qX>2vf9$05(q>fjGkw;W))gQce9<3MX{pKD_iMeA()LeHH?!#7&${jANk!$-6fwy>aYp2>#!FipNi&sVG3H)8e>nt{ zU~|HSL$v9rcjQBJGvnqf=d3IN`9lyluqQGA05}AKd2b5c8=r^18NF~!*S6Z5vvc!# zTIQo;8RspZCdwe#7+esg)B|0lkYiJpAUJ~700vJxi{Y|Z5Z}5OKg6d1VTEvCN4}iN zC#BkqV||wCx3Az%@<~~x7_05^d)-=g*8N&vFvcy{*K0Riu?*zk=WyOL>PYGo;~=;n z=pYWj76f6rkdn&Bg2#;Ul5x*aOy=8mGmo@$#(0^ro)7S-KQnd95PH(wANZG$Il`W# zoB+jvQ@5x%9EBu;aC(&%^?KjUcCuTirPhh1^0|yA+l{)~+OC#%PfnJ)ZC}p%c0K}6 z_?mbd2Ow*VnI{Z3&oqHS80RWn?e64#*2R6z0|7PKo}1%Ska`HEBmk&O08TcjVhKDj zEn?*j83te5u zW2VV;k;dlh##$eUZQv}kkc4Skwe_Ws6NYtYp^?m+LAnu%8>;v_J*KVkw)> zi$5Irrs<;7WrB9Mjvs^n021X_D{RdyaW%|vglU>THI5Nkx3YX+@sIYP)BXs2Q$G)E zd>yHLLXS=G&xJJ^Zf^W(qWA*B!&UJ|fppImzLu8Oo&@oY-L;mK+P$1V+IKTYb*sp- z&mNZvk{NEiQq%VBn&-qH4ZLxA@J81|zVMfftUOxhNchh+&aFO~4W_4~Y8o_4eek-% zCAidVukNkppY0|$vYO@@tez)jf0~a6V{zGLHcB&b#9?Z>a!EHXYEDqJCpT6~R!KOg zrMolVz~_{3SnR#d3M!3yZlcvF!c&5jz1XPf9c?FjE30+;+xEJiZ8?4%>r=-Luc+!8 zr^l#dx{^q=^^ORBF5O3O1-Y~-9HJ=U+vY92_i;w?z0A_dJ*zYEwMzsa#sv4ORgpS0>1Py}X-azwBuuDf$iz z$*N?0C4|Fb%YPORB3)bdjI41fJN+ZX||XhDZEQ{fNKdq@M%-0As&`-XQo}`$p-15$$|Qb>r)= z6Zmd_3Ru|q!rI48)U^E~Ek{k%=J4*Ls|!oGH497GC$+k1t!0AkOczMjk1U?$Xa4{N ziT#1RIjj6+);vGsuZmIWUm5jHKg2qYk*WMJ*6&)%`VR!@-U-yknf6P2S*)hKgHE-( ziW%QkmD^8>;5tWfJaB&(ad(EibolQ%$6>N;UN;Gd%p+F|i=jo;qh6P^r8PLzgK=sw z-No5TJNNz5C*mx!8D$96uNqZjMm+T9`DEo7!8`lOMXPe!Pj!6}%6N+FRM7lIt?IT~ zZi}a1t}kxb|uX{va0 z#(pIHNBE<4@c#hzjnKRU`$hP#;LnV_S8w61TUz+P@b^K`{6XWS)%5=W23u<0Dwo8b zEx59@yYQBn`bDYJ^x3>8CxJEJ3~08uI+ua8YjnQRH2(k>_|@m_&-)%-2P5MbinN;$ z^7%d-*1iX8K0C6swA5ps8?7edc>F08`lgo@HwI0YS20C@cLZ0rkZMR|dcg5N?Zf*a zc;7_UJTK#q+B;Re@Xv^J{Z~iTG|4|@--_B)gG$x>;j3B4t6M_HN;md*6Ik7A7R;K) zp$D69X?p}y%@iNDE)&dMOeK7EJWe0jPL!mhhpyY@bnVT0RUqS~r5p0v=`HQ#VmOxv zK6t`(oTjA<%C!z>7U6p+PIqd_t4VUpRHFUk`Mmw3{{UxS6n@S>6}}~WKlp^&MwjB< z8^ku2emC)!yW)}YGvY6awOxBn(Y#DNO<||lrM=#T4~aBi80i{`)Afe6*R7zvhfu%q zW%J3S>eoD`jr%V6=UKm7%lie>WVl~4-uK5>HcPK+T2;$WZ9VV&Bbs!#kEh8ZrrV1v z%cRu&$Wm)*Vz!!l`w!ZG+E2y*0I}EYTl+?M&-RIL+RMUU20T0A?}mOCJ~Pq0b?^`4 z_lq=d9Ny@D8u0%B!)ZK9_O@CUfoFYez8cWJ%8g)y!zByZM-*k zlH1&WW9kU753xcN&l9{v0swu{zNwuxpZ{2?vG@5s}yUMTg4x8{Z!(JYSS^P)hM!5?h zxSrO=H_>z(c@dZ~zrC}HTif-vi4m@4xxco#nkin^Xrq|@h7Wr9SMX!Ue-$NNE8v&H zPaJ$wLg3w1|kLk^DvD+ub@HF6k}pqHBw{)U`_qCyg9l%?!{;$m{R; zD4&J?9^6f3`!N2(zXZG*)?z=gd{X_Y{8O!d)gKeQ*d)1%Eq2>TyFL>5W#P-lmrS^i z>~>xczp&Ev3sG*Dl1&T%{3G%E_PYJ8e`z+<^iPd{v}eS>iGCSfIEcIl7B{@R}l+%R!XE=_>bFZj!LQlo!Y|rS;;pQ)C9>UVnvSF43GMzCcxwHmc`c9pCB8ni z^FlOH+TD-sCXeOqbN1=@72$nc!|(_8X`A9#iTtA+Ulo6BPZ8XFK-A@tBUhI9M))n@ zi=PgBHSpMuD|pN=u4>*snInhH7ceZXZ2tfSYdQ{@;JaJNG<^d@`&afoq?Z>rHy2u+ z#gpGVvx|7OR+$=kG^wJQr?s`Ucm(m>7$bGtZT0kD1$-Ug`_Z82*ZP}U+vz?R)O9^Z zcq6jZF7>Tn!X6ygb&V#*(hx5vTWv#AxU{spxsp3YvVzx9HkMP)b!(qH4Vm#SHf~s~ zL}}BL=H#cUjBdTu+FaTzUMVR2T~)P?69p8bN{gv$E@!)vQEu^0O(l4@2Pr9eYH~ji zKWP5|+iT;566hWv_`~An@V(p#Zr%~_7MrAeDDVihirfopMevt`H17rIm(Zo8h$Cmw zZ)K7a13dC1p*-8eKeLSJ;%$3Wx3(FT+AB3O&4^NYCRez+K#`zWj87%KmBYui<_rXF zkE!(iFHf;;ns$?<_F{`JflJQUEnwhd;8&wxNG@E(1xw>TeNinRYWDY)D zjn5>3nR)q0cFM?CH)ID^}HYdoI0fVU3|bWeLGI=C7`)F8v#A zyKk=NgUhF>SQMxx7;dI=s!IcRG+2>K;f_)n12A3Pl!C;MDe)4q(yW+{XVvc8=2iRA zMK<7B3jD#PIV2u_V~+m-Tk4($HVdtTf%aH5+X#fHv7b6y2f6^L50@`2Kp;GZ8N;2a z^QXl99W*^3!4aW$lK$()6G&J{Jjb-U((LWtF}M;POW}lgav9@h;bQZ+rn-1%G@Elv znI)#Ko!;+#H1a1darUY%Z<}?ZTS3Y0nzp*6d2%d`%yL^mHj|lEnFOM^U&iaywMkiOpS+T8OGUh6ucE#CKHp0gxl?T<*Sh4?Zqr*g zD=UASJ%jdn^IrSnBJN}RzXY=RzFJL%w%46OQH4fjEX=Ktp@*0@hQ|Z(wPH)Z3r6?_ zWbt7wk++-sA_ncaf1F59${c3{=h&;?{0Gu6{4?SYhlPy6 z;?)H3CH1V6!#mo`G}iOY1eX?*O&pJHJ=L>EESyKi_~M59!t=;LU$pqg4p8}HWZG-S z#iJrj2avgwU?33cOB^Tb6mhbbhZLc$`KNwuY@Ryl-pcE3EUofP_^MG-<9WW5rw&%W z7S>%AB<+2y_IA2F67>nOyO|DM1--%A09D%SZ6H!Ye4$=8A~j%&bGTrbzUZ>}-8aNf z7iQ_OnjT{q3Ri z8Ipfpi(5ZsrkX`lr?=17eGiazAO)9{j&3m|flhWOl-#b?-8c&B_u z`d{6e?X9f;0H%7mgZ}_yr*z)5@8$2)wfeiYt*-UC%KStGc)~-HNwTnFNiB@p401yD z01W>C4&0VGW9P7A?DqpCe)MBFAPk_%8?p&G1cEb@$-z_Te-XeQE(4A<`wssA^y!>q zAcA=(1EKGbPo6@5adLicC0<)R9EHgs@<}}4gOGXWYkWTz$-XMYG_;elw%4>0=#uo- z-QMS;mpjv@`@$P`zxfufhTz!*lCgkSpgwB>gPuNK0p}_RAd*CWzoUHGMYA4%(Cs76 z4^lY|w1bQugn~UzTD*qmJ4yMowFtu!rxO5hKy2U>jz&*%qXXCUME?MZJ-1LyFfTY& z`A9-T3}BoSle7_&!2nmY!?IDt&N{o&R!d#^Y~H(HTf1uS=4p%j7EM}DXXLiut@YQZ znkj4J_lkM@qjnDj9ONA59UCpTIV9((tOQUubO$)&f(YC|$KLL8MtJl%&q1$`-YDoc z@=pZdw*-|txxna2DhcnNemsskV1@v6$Q%)owBUeFdyMi(-RovfDowcEy_Kx?U#9&p ztJsVrl4B$dD;f(N1bh&ag}b{eG>d&6H&uFHEZ zdRcy`>cmxB@~v$5^ltjDw@Lb~p07cS;16ECFoc7QjNs?6#(LoHq&z%*2?b6vG7dWc ztWU}T;Z8;gVhO^a#^cwHm?yF0k6d6Jft|d9b4c73<0BvdI0vRWe7MgfW1Mrz2Doda zr2hcz*S6mG`DyTwST3o%{4aLZ{oejpUxGO5TF%R&^;fgr`)S*+ zkj#3pJPtqv4gmy`IXF?c4!JoPJTB0<0AuEF;ZygCIXO;w=aRU?;Np~bBz&M}I626` zH=?MlKA+bjMF-Qh3VFTrr>nx2~{ z?N9#z1n2Q#)%B<}o2zJN)HQ3r2Kanl>b4v1Zf)(gT^q&ld?3=UrTb;%7Pk;UVY>OJ z{s{?U59}rJ1}G%^HlKO>UcKDXq>B`X%J_ZYIOJ=qMnfd(vPfr^dwC&OoX0#lw0T2* zl&yMiWM!iXn$%!AC9IaJ5x!6ZM#e0s35 z;|?H=Y$R)_*QBY`QgD=Cv8S)Pz4g^6Wfy&VKlI0Tn zr--9cGf|R^+^plIl9Pf>q?&P-tH!X#<2A!+x*O1ySl{)-p z_<0A!=Ux6HT5yJ68Ck;rssp5Bzrcd24Q~aeJof8n43rYvJ#U{8ywi z+(h<%Gx&QYv|br|RK36WcjJk*Xm0d6Ul{)YXFq}e0JJk+!SUbWKZZPMsovY%Jbw}_ z9)Aq{R<*uC0$SW36X-2rs%mXyk_b`{6Y5&#jus1XK7*({ikALkq-o!_{{Zaq1-6Uu zqv9`zKW_g3fVwrzI@OQt>HApU+G$@Iye}QHBsX#VDE*-3j@du7A+whK>>=?j{)401 zTd31?Plp=zvLbuG3n#CLz+x%Z%JZt(ReDXzG~GuTIazW>ElMq2rkjkLmGz8O&!f*U z(!)}zPl&i)mlNRXsMDS|3qzi*I8DV>saAwxH_EQ97(!ERUQOQX8Yv^1Emy-9`ks<3o(sE+%WE6kS*HEZ_tPw@9i@q{{6%WAqGg>L>Ic$VM8I%WO#l^2F$_=})VrD>LS*BZ+BKlY9k@!O4Z z>eze^F}y_S)rB~^=_Na~sjq0SCZ^I}`l#OSZL|5i#2*5+zio#v0IUg&x z%Tl(L?Jq2DOGumw2l$#P1WyDlMGX zH%!sArb%v1nDZNalE~~gNIbG11>8aA%-;(988Vp@4Ht>xwvB+qEX($VXZyhdkmXP+ zfC4cG`=c+MS9h}7)_=m7?5`}r)U8XEs*tHV zYF^S;e3JHj+_RHbv|D_xFI_qw<2Q_aHKxYTsO$P*E4+pCESZ1|S7=DJ30o0@qY7~B zTLctva~I-|gk||`^=algz)O7|;`~ThA66=jkj=xY5=aDmx$^kDC99GCjquOFT4+Me z=H2+y?Vu?05Bj||UGRZfc83|*u9yrQ68K(s!fM*zfb?}-{{W--e@gKeh%eOa1gk8i zVqC5VmeDk4a2y;XdR1{4*A%^qjiRs33eaxcuKd*%6|a4ItG!PT+0cxX6HPlM_L_QM z?6&&bSuW|dr%kMUS(*uicAgX0EovZ*wu*laN^!P1p>%%GNyJ6}7FP z+V~b`Y#fWdde#XQe9QnLg4gFE1_Km)H$x!CGG*|_mH4>u$G#zqWs+T6#cHtDmIr1e3hF zo&1jrL_St1sGfD$QW{5SEr3E1PSWWdo_YTO2(6q47T*f=WraX2`k#!}-coS;C`_ylbP)^9Gg+ z+iSZFg1`lu?@zLQp#rfgl1Let2+FGzkMU@LAD~G<&o8f z%)Zi{MIUxji?Xs>C#+T4lD>;{>Lq@=UpjDtyk?;*UR>Q(`CYxoboEPGZQHKb^sArR zGvSYsc-ke;h_y*#js+9k=}_scms8xV4q(%y)F!yTj@l-Y<1z$ywQ;^C$NPbWw)}qyVepYZp80mBb_YuK%Z%lURgzD zZ*zBV-F!OnZ@`Zid}H_%r2J#?_m92_e$5{cE&N4&@pH#kV_WgpiZn|d7W2lo5ZmdI zcy~h9wJS;P^{q3*I$h%E{v5qFmfH2i_OM^tD$57V^LQ`zQ}KSQq-cHs_~-F2;opii zt1F9rR^Q{N!<{Eu@X5Wlw)3>#w)nHc+LYH?O|-%(u7fXzyhpM->j+Zf<*b@Z-kZd~ z0{l(z{{X|WNv+Rw;%|f+h4q!*hw&%E5$l@I!YHq`cDQG`)it}VI@??Drnz|1SlB;> zykn;LJ6(!q)Whj^E%t3%KNlIAd_>u8TNARzPb?*xg3Y+^GX7K+2i~bW@_)_-e zuC)C#;=X}tHk+#e073u0&+@K~s`zKbx;#3+h5T2ic&^5HVz^Ud39_CfomfX5?Tp3l zG~12KA{%S;g5{byBxpo(LA%61Xa4|;KeXrUi{hOh$6vDt?FZvegxb`%-|&anv@fRW zUk^N8;mt(%##D{<)g3Ea?T*iGfGjG7PKnKSxql?tvOygP7OuH^lH{msq$HdTVDY# zT9J$@OIG3U!f{qt=3LI*Y|?gjXT(xo&gX722H-!45CaeH1-xZS&?mYZs{+wt2=b~T}0LR{}oTPNwK#i~td zv%jT}tG);R(((Kv{gu31`#h)Yt?={X#s2__{wL}_HHXGtKG&}8G~FHU2Zp1y)9<_| zWukqfTaQm`D~qUQgT=ZuFa4!;9o#V_QyY&D@%8lgJ|Wlj%Zon?cs@OMTfWvC!CnQB zE`y<5Ur*=Hrs;NbTwlv)Wv4ij&rTPYH*>{nZEF~Gb}}b1YGg)xduyAZ_g3*8xFx3(r-V%eAbK6t#VD5ZI0nP7S1 zMHc&GcOv0X!7tZ$UMsTj9Ckh))4m?bZKv4j+FTkWT4%+72k9Cl+AYS5Yj>tw+c$`H zEoSdg)Zw0KG?{dUZ8uVyZ7OYQTbr9rWi=D=8wq1WE3>zp9L2gZ99va@X4-*b3a=Vq z5Qli&m;kLg?Jd-Op6=65luIbPww~Yp2H;JEk=_kf2;I@7LcU}-HqzV4DT?UClA=g2 z>eV47DBd!%PnIcN`>ktvJ$Y>Hb#-eiGnbwUE30WI%-c|E&MML6=-rm8?cV)9kdNc9 zi#0IO=(ZL*_l52(udVKFbz5yGPP}`WB9W%BYwaEuxVM_h+)QB9C(@_0x=4wV?UCch zl3VJx+I_1*CV{2cX;$+lo|YDR_2r$upLHU|ZY(cin%dsN>f*`m?PQ*3)8A6LXM{bx zHrH>nlMI2p>zM5CwJ9y6vPo}auz}f*`7I>7)f+~>u+-hBSS`iIp`^ud_Rn;}^49+V z>{`4Y>+m}N0KvA>c=9Fqli>dVhyEe3J`c9E(Y_|xX+Q9c-)UNm8tt66`Zn)3P1PGs zzSnHxp65ccR@3Y+C!RaYYmXw<`-2xeMHspB)NzisNjC1|c-}OnQYrGTWS#BTSAP60 zDtM~2>DrW~Xr}Js(^0%zim4bjuhtye>vwaf(LONv^TXD5_P0I))+U15BL~`&llr5|8Pocact=;&a!G0In@QBPgq}-SE$=)zXQyfJbkJPsiS{idylHi#LV5oHfI7ah<8K1^ zdsx#iJWX?`YrY)Ub&DMm@;kk1(#bp};vHMVJ|WQbt3RTzQ0cI#b+O^{$o*8Bq zIXMAIX52(<#Hm8tRGi?PsK|}6*K2p*67?mv@jjJpsoYwLpGol@!dlBDGTg?NbNF%Y z9!q#r&xj}5BLuoA`B}nbvmY~>;Y72WMs&<;@*oMY0HX^TBmk^kLEH#ejBunD`m7#1 z56cKk5l`B*lZQ2)tu(Ce?)2%kyQAi-U|b~S3KgRpw+V7dU2N96TI*Np_h(_@Iq&1~ z4a|ntHDBz)NLgY+nF_4=8;AfY1yry&Bwz*&-p02RCET7wjuu(t0WM(&25W%3Rh~V7 z5y3dfB=C5z1%mo$Z>5$!N_ZKef-u6|FgV^_K3LgsrBzAJ1{)2uaO-VvQV~!8027<^ z-0$*>37D{EX5X099mgc>@<>nz01S^ptyoctt5Hr-oOzOpy1M1lnY66acDlQJ?8%H9 zjA1IAwre71ldpn-rAu`V#n8K_vj1~p(t%g=Ab`UmvggD+lW!xJktdizu z1LoWEjPk&&#fcvvIU9x!03+qb-nsr5yEocI6F73)RAxnBWeNx`Hw6SaVgihXU}GmJ zYeL>LEYf5ULzB9r*b z-`;83)^>68=#}@fc1;o$BGNE1jFK~!9LT^Dq<1a}0Fi@?5OH78cl;3v$@pLUP`eg? zC&u3huZIE0nID9{A??~R$^mXu1xVU5PFIiTNw939AY`13k@IKGZav8W1Hn*9?}b0n zFZ>YObpHShziSBgCalkM_O=i~3jV6j>Jeu#x0XT|RvSUa5M;593X{tDfSisqxc>kV z$?D{{W)J*3QJ+6_}Nxt;H8D`|KABY=Yb^4+&bb0RX5GP0E?lagEzNDN6hJBC5qf^)lV;@v_l ztgbE;{pFfCWXiW7Zjvb&5E*$Slb(5EM=2yRhGFIspqvIDGbv)AG7bT5*d&5-+1-&3 z$S?sdj&K7mI_Eoc&@OYqJaS1H_1lYn^5)k~8f#Ry-u*7T`q<`DcGFh1)vax7-uJTZ zuC&{BdP3@2b;AImqBvX@+K2%dV8eX7Ks@I?@_O@W!C*{ojJrz^fk`M&%l+hF81b~> ziucG`^D~ruDI=leWMPj`Mgcg<1P}qv4mdYszP^uc*@;zRHZyMSGk{gP;N;_>{{U-| zC%x{X^;7v@UH0&v{z2BoIC3xNZVC@@i#EEEz-sPM= zf_Uqno7K!~^W(S7Ly|L`3@8nZqVQN8f-nFh738|12UEFh=Pu_XlsFqe-M5ej7$jsJ z+<}5AH`e+s8tA!te6F;9yQ4^?mA2XGx0~*lXUf0CP**N+&EM3K#!fzOl=3*oT!G1I zvX(JOrHkw&U@Efk#2l#w`kzla0YU%fHd!*IxzPeuO>G!BI z&a-0#0*cIe!sE%jt(9Zf&eEDR~g78AK^Rzaw!I4AV)JX zCnIj+4oL)%262;;NCb1qAOpQ+dvmlQjyXX9sBO;7PE?SrSY=7t4`Klr=PIS`b<)>& zv)0~<*IL;N)QEAk@)G zv~4g2IQ1cy9R}dwh3I%)#PmIL*(7&769PUsT%s1*Q2zjTXc;@QSw`F_&ji$RUZfaF zEn7JZ2_5oOkTy10WG>*rh*6$vhHmdgb^Y0Oy6Uv;)6Yvb^V06_+Wn-P-6pTf(%(&b zKAUok^AWX%I0b+MCw2+y6!O5f;sHEkAZ{`9!C*rMz|Tc0HjbY%jk}x4Qe@ ziq?DEO)sXNRI46-tJ7i}$ zB!tPy8*`8`}r@MV#4mBCzN@BE}G92^mi+3AshdIQE=$>%4L{?Dx}*X!P>=yRVZSuC&(8ZnbYs`)PEWS9%E;Tx10Yd;gTNa?k&pom$!5T*kfS5!1F<=5fTJgqk;XH@B$6{# z8xku9V4;T~5)=kfc)`dApPRTKfsS}_@%ET%@LKcJnrXZ4tnaqzzv}nxz`k5XCnnO3 zN_%N!oL%g;*3R}@KcDUI!7mg|b*cXV!7eV6=*up%@Duii&>7p!G9>>14E_XsN$|zW zeCP@yUii8&0)#Iut*?`JAy`TD4-WW-ZEyAy{{VuA+-@%V*T=7h`qT;)R7k!u`0JqP za|qU5smfafQf2bYX%St>UmqWS%ld`1mtXKs1LygJ!k!}k0D_nJL08C-xk-F2CyU_< z6KKlXc!tx>4#)^32S=GoZ~PVbgJ*U7IDAv^V>xSoh@L(8Wpgu1S}5k9!ap7LpBco9 zBxRaLO&UEY%43=-5Xy4S3VDCXIll}2do0Z`kfF^{V$!!RiZaY=UB2GxZFPHZbNU}A z&c3U}`F17EdmpLJq-5Q_>R22-NTl0a$*Zl>ceT&f-x&DH*4O?DnWM(i#Fp@UOZbW4 zyXi|JqQJkh*TgHBgvp0f3+hcT4J2sOM$!OENXPm3{ipTU);x2jyqlI=PYr1hOBlm> zGEZ}8Vezw9@i@AG%-?6y z?|en#Uxt#%fn$#`{{Ucko@oq`!175PNEC+&C45KwSw^~d?G5oiMno{jqxh>-v4SNy z5n6fAbz-|!*#fT0dFmSv%;)Xzc9lCw%aWsM z8OB(XxSSRQazQ6G?7B8TvMs?ZTgrrUlB9u!I3%{xIR%LX5_mkH>v&Go{Pb(9)oY?w zy{)fqtp0m(QG;5q=CXF#dhh0wR=d}IcsN}2Zpfr2xf9#S$%$F4a9 zZvHQr{nc&6jDwSm6S$w5&cc%n`8|RE;aR7!S5OPl>>o0-Fh&JNdgq)oDbBP109pnaw>xBxfmN_@Ff$$i z`3^d%$57og?Y0mxfE9@f3EV@fsUcCenDNQaB$Yde`RYx^D^AvXcG+LD)mql;WN8$( zX|H?jC1&om)n99Ct9@OFpOt37133Yh;1zNJ$5KMz9$Pt4h0ho(88S*RM%g4KNgNNn za$9K22@VEGP{ewZ(G?1qAg~O_1c8&2mgF7_XCbqVqZ#0g=%YK?P6#A{ka!_TWf%bG zAY+oprg#ClVBBSIE%mmR(_XiF-@UiJ`Y)ohYfbL@TU{Qh+huLLSk93E&jf;`W0FZN z(~**XW7BtB1Kdk)qs@%;Q7ykri~%fbmKhsJ870?&l5>-ml0?qo&Q5oXf(}$}IPb@% zbAmWHscn#~k@52hVgsMLM5&Mt1~51P<#W~ggV`B7Mo;3hPeioR>h}3vZ{#@1-C6IY z@2;G;cYD3H)pk9(@}+DWbIOUY=eRG9lQWavXjU;KQSNz zK1``1i3Uq!IWEKuHZzlxk~ts+`MCp z6B!>_f5ANU5oh~#{>}QEJgXaBd|HA=SsM!-=j{Ig@k$p&V9LuR%O{jrki}$TSEP&b zeZg6z)MClo9fTPmXE|G<$~aI?VgL=#&UypSx_-r%tEc|e9|3QR04=pYh~8@)sYGvt ze-Mzf92Hh7zc&4DY$8+CYOD$f{_DOOFgF)_#h zQTa7b4KdgbSjQ6QPVQW)bD=q{KX?19DEi$lirb&l*fvJ-B^$L0brNrt z#i^wh;;nX{J6(4^p!jj1d_D0Gg0(GgRPauNWhS+EEz(CGp{1G9%HnsQPM1cxx4N2b zG}@~@oZ55`X){_`eX8IYAIz5zR`@%4b*$Ylfvt4aw7Z8+zYtw`n@w9~xrWX=W?N^z zyIWf*H5-w86gLsy$pO7cqm?afrVKpW!hR{Z)hCBexX`>UY_V#I6}_vZmN(`p{P`GK zGigaEo(T&yi(z*Rf?3{i6s{l3^}mMxB+~{7QMtO9>ejQm4K~`=))Z||f7|s~<~B!T+}EFp#A7lUw<`4&+Jc1VI<%KFk1Cfn zMD~kH>G^y%J^URE4u3_cVd?wUYEh<>j%3wxW?vzT^Mh`N@;V)F6k^tcaq0@m{q*9{+7WCOp(VP_|j=+ z-3u2i%JM6pTfFc{_<>~u zi&oOwUN`bd?Cra~l~__tE<_N}ezR`V&iJ{Z#Mrbr`%CMC5Hq_RNl-dZ%0q|A)! z#B5?8beQ^w;1`TFKNk2iQoGdV-7D(R<k_sR!6?ngrYOh)4_r!?z9<33h2EW%xrx zk^$psbeCxzWrD?wd$xJd9TQEvNbN<`*B))an^C!rHAS77(5grKi4lIU{hwai+roOK zjjXH+>NZy!nTM7{){rz}e3QCKQU?WNP_o)Z6rmO=phWx|#C)d?vfR$Hrx!WSoRv;g zr5N)otLoP2G`Cu8kI=GAZBJ{4i<6eBHrC0w#kXw})#Cg10t8_FY#%%M(dQ|3~3R&MFpTk+E0JrBFgaW0-6$_rGZcCTxG z?)TSiw$*l5H@+Zv??lyp8vI1k;G7w5ydB~zV4LM)(cJ0RYyikmONn}`kTtS+H0bQ`!x5nU^mZ9Y;F zlt>Z5+!@L-*ak=ptDlu2j50=xj0IKz62M_T<}&I_936ygBPNQhIq_tL0zPq24ajqxp63Y3Nr5IOFt=~2tH*Z@jufuXg!6YapNe2f2 z5Xy6mfIu7^Fdr~%V{yiu7z)P)M?ZLjwZH@nZ9>GTC!U2^732|^7#8YSuvWnzd6OhI z03(1#)j-?wNg=RKv}E(k9Fi5z4mTVe9jc^}<>w4=TRdkk`bBItD9TfurDrW0Z%ZVt z+h^B%^w9Z7A9fa#vWmQ7)~)jNv%7nwnriRW_nr*}wF?Cp-5tu4xROViA;(av4hR4+ zPz!^+gHklW zS;w^IAPHM^KuAoSE*Rr?yS)!z4Rwc;ZtgQt zYqvcbs@)pW_w#+3@`Q|L(d=#7CATpqt8CjOX#>2h{{Xv{LdGR1{!_9z+@?bbeaSN) zPw-B(+GoUVD_4tDy0MN6FA_3K{f8a!mP6r#|m?!%@dZ7^5z0_zP-rn+Q5=g_b zuP3!(a&COdOwd5m%w-n;0AV>>T}D|+npoXVO{`={GV?S>KtFiCcU|GlTl+riSG|2B zO4MYw@Xon#8&TJFdqHjet#f6jMR^QbTm>f7G|{X)_V8Td&hkip&nalgSp7Wn3GMP+ zWL!Di=t>;6rmpHGANhEiR&8#Uy*5VJOhZ+vrzpiFn@LI8rF%O)Q`I}@uf4Bt(SLzg zaLRmFWUrOK@QsY9OEVWuI!n7uztPjc;05ITu^ZPg68GKm6cGhBof|B$l^<%3z=McHc8{2w+qNa!<6! ze;<ooe`=sPC{{6bKIYJnm^OoA9kTR}ufTuhuY~_Hj&hb!qdQgj6sM}TNZ$$0WUHYB0 z;^R`XwUV5z)9giU>(zPcdJdZ*Ux&KLUJEs$$`V6w@k|{XBooF*Iofhb&TGm;XH~x^ zX;XMlx%pWbD`b+`O#So8000gv(scJ<_(1gl2?2$HDss6$@R8d|lE8t%2aw-+js`Ja zR;(LRy)1g%5Ll0!IXT=pI0TH9C5{`M4tp|6oUm4J-j2SU?@K+Mo%MINo!QTj(Eavj zHkJLl*4n?^(9u6#ns2|Q=zQ5um2AX=E#$H8BxD(7n;FT*LXnbA4sq*VldAY;O(xe{ zyorGf`YbFnv381gK`XxMRz1TzRa=A$0DcD>YE`>(RMm*RRfUo>F*sPuY0HnsY#eJ^*Z z3iUY{I}SkY#sT0Q0x^z8Gt_izDaPD^j2vU2$?eF;Oasqj&;w8)$>SuI;~v9|0=Zs$ zh6S>D#zW4dTO?lV&@A8u}&=-f2((Rpd}HhL@mKZXAQuR%#6 z4my*^2N)ZypAqn8u+|q} zy9nUp0G+u65(=DcB9(6zi?nyPk5B7EKzIwntZ=>^w80tW zQOMRP|o#^R|tDOMMSUkH9_| z_H28j*LzUjFL}MO;Us6 zPle<=P36wv+xs_Bb??fwcFegTZU;CZj1!Z$RzDtiZN?VzQcej6Pt-@sbF}{e$FR@1 z7&*sr$95fXi%I)@9okCI*ePqvd#A43EneM@3e<7&cKW?Y-R$8nE!S@L^3zpjpNHNX z{{WwBg*@%XrK(_KKia&kF2XZ$PQ4jz1qjB}6l{Y3N5dHY{HpT{Jel5;b7 z+d#?1#lcg9#hvNwPg4S(r-QV01Dw+jjx-)~E#E=U*e@3x_5T1>o@0G})0e%?k#a7p8nf)8ABN{69Bit3xU>AttROEHU4 zjX7W4`z!mKY3bj7m)0@x-@`|rvpLDn7c=9Im;y|D^y}P_nosyv-WdZ1(a0q5Zf=Hp zIsX8r9r?#2B#wEcK0DCPKhh`nKV-TG2aZpZ zf%NVUeMq?BxLtj`JKJ>|{f_tF^KW}J?L#qoxKCxLFOu@Q-q!T;Du2Sc@USEcM;wAk zyS`J#a6Vgw1P@-IdS{of!@mrINP^@X! z*OB&Hpfk@c`@V6=1Y;)$B=S@K6Ymd$gL5c30OH=@_dQ62#5_P+~AIS5OLQ7oboyua(h$LZ*@OA-phOG*Ii8camlZB z=+&>+;kER4UxmIz-|&Oz!~)S=l1bsUJyC{F9D{yy)BsL$I-Yrn`~jdh-m~3|k-p;b zv)8Wcmd{^tl6vnsKjAddun4R)fp(&F3Vn@m)WAhG#@P76(csR$)yX6Or zpRl}PuG(E_w=S95(a584<0VM`5H{rS8vt%3;eaIkX>eM5*?hg&+{Y{P1s^{EHU`yR z+5Yg)%t`!Xi>ks{h$>QCmP*ljHFU3KWwx7JZEb7*#o_HH=+|{3`P`SiE!EU)uJvE# z*Fvmw$uyf4LFWgl7#TP#!wtu1&MBHSp;NuKfEn?euIF8ij!0nK0f)nM0CFoL z?(z*Z02pp9k`r+(Tqq@!ZXEy{M%C4*sAi2#6h<&~G*wgAsjxb0!a z2gXm_N=YQwYc}q`2Wz#i_wqkq!eC`y(QeVct*dO~Z4&hI>$}&cz1Nk#%Az(Y45d}_ z;2}Fm+&E?>h{i@RFb*?cK=@}46HdKF^Qc2>8&Yr7{K=(=_4{`cka2MJ*DSUR$tS2QWkaZ5`{YWrVnb!*X| zcuV4&c*#CYgyiIdxC4+k22jHzIUtY^P)9=yo-&N^u&^ZK2kVoN0X?#K#sMdx#|bU` zn^XwMIKe8*mf&YNQ-Ti!HzZ@+RbzEK;Iw|Y1cS7KbI>+A9)pr{I$?g#{bIyQoD1(4=`>nRh&rNkd2$v4fgx!;F?IzlB*4isRw)5(DlX$XcUy*P)JroRQzsNrE=jt(@ z<0?-R+;Vv!UoUHWS z+g)|q`dQlDG`^_%-W|#p)}t3rI@|27>214d-rBo)+e}?s#cgzj2{^$8OE(~&;Q>Pq zpL-mRna*p@?q^w@iRUkqoPflDPb6gLo?Lp4Knx!&%HRbUDgyw+7yups0Z7LHgx<6{mGS!8OvgJ-G zY1vy#J6}hAyq1={?I2)4Jx3=jNWmcF?j&v?@WZZf1_syz08U8+9N+*3cHyz}5Kqjc zkVjH+l1(>r9E|b7831#RqbCQsE5}vA&MG6EkPZ(ZkO|$p{h^T9KKy4Lu~SB!8{N%r zpI(hwb$)Mtn^^Vd2W4ezt>1TR>(Oa#Rr+4UoAQ!$1b`Uiwmxu2@h0MM2?T?Xrz$W{ zZQ|_1X{Yg=&!~gu90m;)vtSiH4+IWa;6Eod!~wM=t6o94vSuCb)%%A`PFoD-NCym*qR}mUmn5f>##@5~Y@Y2m$E!M8j%<*x0 z;%RAQr2AgZ39h?4zq{snW8~i8ZXI;Q;JVV(P?!0_jY@H;tYYqh02Ym zJBb4T1;*{$Ps&R1v;eru?iFg<32){i7@3O<?YbE%dY%aV4GOFjY42S72w$4p>lK_H65dBY4B01$K6 zBolzZ6VM#-jP&NS=eb0{1dJT8865~Ldx8c}LAajhI3HJ)<*J0?7}L_q>Bsy!yZ66c zerIGV#Vy)by_>gfJ$_d6IvdNGWQA<4N11u8NVbuPn{fc+ATAwtjload8(gyxxi#!s z{8pb1eja$&Qw&p4eFIDI?VOufNZOZ)W?e7LS6rwz(C@qM!|bR)2qFu~{3Fqz)%wrhi11iuO&_7^2ZDz8*vU$8JOftwVE=d7G0Phv<|!B5br4=@;(_2~H-8&yW zoZ@c^l;byb6|+`u@s}qm*I32#H0`f;d{wFIZ8gwLoa`(L<7xwvF^`lI7yu4BpYELT zclVC+OBet+Z2jPVMOEJ96w2oykkM;6%);kDKNIfsNqs zNa!=qT~Ccda5xHFU>(W;E})(ds69vuy$K2r^)^$4ry6jy6_q$WQ@#D$^wQo*tM0lV zoK{li=9HYTEA(pGTf5b5tJcq>x4M4Mt>*kr@Wgx)*8VbK_i}Ua^TnZ#avZ5cDByxg z2MyJJg-{Ydi!4BM9<|{+Oq?(tP3^+%8D=|3JqFQ+Y~+%w^S|uocYIv%OgIP4Um74i zzF&sEG;xwX@X7*6-ay()-~zuzIyaT^goe(1W#RNEJ3umBO399d91wb_0~pBRe;eb- zCB_tKuYpmAyXWj?_S>`D?z267sk>9X_gnO}NN=nB-LK|y+QM$O@qkR_tVsDz-Y3vy zhxcbAYhg(l#&R>90-uk5G~&a?>(?57r!G;MOE|xpazgF^$W93g7z~}HXLEkVmHS8h zBamt-d*Y}%& z5vwAqe9m_g5H3qM?te%0qYUA++E|&Y9sJ1v2aUv>f>l6m#N+}41tf*!0a0Et7R)w+%B9p0NIO)Jxl&11 z&JHjRGrX1DAoDlNgMzz;196NT;Ya|CgMv64wx64YE2%k-E&~!HX5^9yA2Kc!at;{n zEDv0gSD)^C8+he{ z1&iat@=pZ!w{0ZtaVP=gEX2<5xv)m?3rUu8qXs}qXLAL;e2?Y}8)*`I8Cp4|kyb=) z<}!u6fv}Q~I8Fco;dxhbs^*OF!4#$oMl!KpcgC?cz!*h>fDf5YS0Rdk!)^xA=j8cJ zvgy~9l-iqzHAb3pj8f&%*+F;K$-P%YEOupAFsbh^XHE|BN!}^w-QKEJZpq!PbZYl` z$~k{x&w`;C^TQ|vsM>N_LlW2uFij$b0Fk(ym1ZDg=1`+N4x70HX(e|tB!;OaQmz40 zw{nxo+8MBSV`CBmfWQE!lag5NB+9{g-I7jE%ku?(gCVdop-CL%V1h8C=~a3UNHrNN zD_-u&C%d=FbXx1N=Ej_)pS{g1w36R=xh?ivX>IlMkCTE|2P&)(=NKbu@-j|vqi79* zf(Xt`ZYpp9C4+6`9pn&Lo=-c61zXz$VH9L>$RPB<$pGNzkVhR)9JVqD%<-p8U8#_ZsL2g{zJcMt|}4<`c7!IA*$fHTe+NKv?hj1Wl! z*S`Xq$~gc62m}L_$;KORB!vKwO5}0@!2=pP?WUT&?R_1zwx1Q>R=(qplb1yG*2>yl z^1InmELRZZdKAFn+bxoMXCoQp?fay# z&H${LU@CA3$3@;S8euJ^nFa*leNAZSw6ii-S4Zly6J5+JH0fo+7PM9Adc8%*hUW+ILN^}kJls) zjI)b_fLm@H5JAXQ$qCT%0ahfjDo!vP1B}sE~@WrJYk?O~B! z)J&!De}I;6EHMKMj;r4->TnNGMr+B&Hs=<#y0)4onn_=6K1rw~Xn zlP>7qLQ!FcG8%B_3kjFZ3xLcBW_XDbESuP$t^WXHuZX@J_;Ek&BYCR$BS7&h>b?p1 zXK!pZ4~QNv@V(XBM|<&lapC>m9Pq}!sYz|F{hnJ!)NQ1&lFAGDWw^evx3M=Cf0}r& zf~k$*9Lk0rN>wFS0m!1_pD)*Ns#fQm7K>MS+s)d~?YK^Hqn+UC&NofsB_{bAOX{^` zuX#1AR$lj#?r?v${{Y2355`{~elu$x71h#veH-C^h42$jT_Qbt?JjTh-voF&#ag`c z>bg~}w}o$X%@#R4L-u<{)h#V0)KXX%Om~+})vtaw@onG3{RK38jc?#YzY;I?KMweN z#0{wGKN);s;4KYXS+S2&->UdC!oCyIbt!IccMVU@v+>NZ+}K}OA1cC6F)Nazc`mgz3VZn{u;!$*+3% z)b;ThkF~+#D@J!!F-nvo(~P4hE`D!*QjNJ{;msW_%dOie&+(MQ7umck`!{~gUI%w5 zW7O_^DdK;MI^qzr`EsVE@lVB`Gq>}O#b%Z*IT4yw`4w%}IJwDwFZ@%Ov~u{5MX*LH zM1CIlU+|y9$^*X;tdV>;XECu>a28=EHUa!weDdz<7h@!kc`+rzHOwL+p@=HdV1-mw z8=vKmYOj#0$_`-rZKb%~CF9y5k=ijenUzQ@${8KP?#h#onVG?6g@^=wep!H{2*s~z z?$eT$N|J@wF6#XkSGP;``KpyYt8F_;+U+Fec9s4VuC%&p`|6uIO=rZuF7XJrkHnrS z*Y&t9jM7=bs@+>n4Y9cptnx(#wUv|zWLtO?tT0BAh@()U00#*aDy&;$W*BYFAyyz~ zf~g5oK_lktoz8O13iMZg6xD4ssWqKO&GeWzSiCXorF30KQ;PcF+r@XG>6(&SUF*<7 z@v~msX_og^`g(1W=6J-Y&(1FW*otWZ00O&X3RLbJcDQ9HDgj^%HbCoNOGYq)iiNc3 zz13|md+Bbvy?t!YI<%Z+X4{pPveoR8c9UAGXtjFVp*n%UIV6Bf008Tp9F7+|hs-(o zg6ACS+d6;<1mpqFLA0Jj4us_LcqFmL0M1y#C^^CE02nwKAOOJb+(=$dt1Ek}$anMj3_xCmfEtO7cy+JEhxgIxY0=t@XXrIAp!+-|c9c*7|wq`q^6g z=+ZvX@GGpI0q~mV2kh5tklTSD+uE@!jJM6Og-}X>LB>H)JEa?LuGj`*BDc%1Jdqo= z8Gs-VTowcR2?0f~`Utc182R$1&86SD@F@-#}MXA1QKqO%KXDg5hW*8)78z5pbZ+pTM_)a_E5W~f0@2st1O zkb)T zc$_Bfxf_(103D&S#IZH?To2|8W;+gERs@W$)^!*hwk6=G7yxii(bwR(s)|)1Cav!E z*6B(~?Yi6g(av2}ds>Pu^2Yaf(^Va{?bRo$?0#c@*^{XKramM_yV%DU!?fJ-%vCdd0__XRf}u-%r!B|>j;0vFZKrW&Yl3jZ2PAC(<+5-Bj&OdC{jiJ4 z`%3&wlgyB@Zw25+6*e&VW8h$_!CR0#wb;zS9P=D|g0IZa5D0KpRz_Dp!hURpLN^S$ zjA3w~02x)+?){GqMy#^D1Db9hRiwG3ugw(*r0&ygG`d^nMkfo8sfn#9#d1nb-`Xy2 zTPt$MMzm?Y9^GusOKX+$E+cdfu-sa!b^&BbN!qI$xyaAXgf7c`|RbSh3h>e(qq_IJ9vdf5AK59vz{oMI|Tb3dq5 z_Z&T|ZB7eB<82dqzGj=cPTKw`>(bcE<8O%mDAF~NZx4#Rb>ja36Uf$3#c203>l*Ft z%&fjm!H!u1&Rygv#hiymG03x~7uvH7GR>%3+zo)ZytlKsK;gc59Qk8>@`TEvNWugg zQa}pVB_+!Z8%|RUFwJ>mZT5%`BHM7VA!ZCjicm2Mtgc85z%elH8Pmr+?H#*8w-F4p zIuhVuxc$hD0R@5FxMmq*?Dw#a6V} zw9&yy$?~a6>QiaEwS60R(@lKQ-Aj3AZlK<1x)s*g%(1I9@sRTU^5s=ogD{PEZa~;l zxK#ydP2$ZW-wSQvoe>I>7DUvq(2c6t2?Wtdiy0sS;4Gm^Gbl1Bhl4t8sxIdU?$QyK z4CI1x*fKLd4)ytg4%rzD0P{c$zd$J{f+)Ud;f$$}<9dZG7#0h;5!pvAk6bVcsz^OQ z*;F8#_HdQ#^@>|r>wdaD8%Li`txA)#lZs1Ec}h#+Z)DQGi=%z}_I@2(pNRf3(EJ~E zETT<%J$@)f*q-Lj8(kyAI>(5$%em4dw1(OX9}MXF<>Se7H0yD1Yc-PFYR_;q%|qO@ zKZc$e@T@nMS}3|p4N~0eT6Ch`Ju)pq*hhbFE%cgnGl*>LZC+Rn#n0L$mg?qv=wXnx zw9-T5UkI&WKN2)s$AM;(`zyybww7u3Wt#qZejj+Hq_&FU^#!Grk=h%JyKB3tEuw3y zTYD((Ba-ShZ=y9n5LsARY5pL-p5}XbbW39y*&Iu$!KAIM5ZOEud7orhl^)g3bvXRl zWs)2AYjF&JmGK-T_=B3AC_*ryP7OvePU`)Vc6_>7?wV=aPrJ%+v>sI4r4D+st0_4( zbr%{TGz*oVMA7xF zLgLwF)U`{gWW2nH>O{w&+eY7Kp2F7ZKPJ^)>IRBoX|T%?GQ}#oGk;S50PssY=ylCE z{t6G`6LmI&sB6CsJ_^8+cyVuTptIDhv`^X!(?z~$Eg`l3+J6sPnXea2yRuoeJ5lyI z;<<@q8ej7R@cY1iKJl)X@SDOv4?H2O_~*p_G*5{#X`UL;JSf`tiEbd#E$uJ$S#2VN zPt@)w(;(BWuJty(mdbR|Vbiq>*d7SQ+qcEw^Qzz5xz=A__&7@VRZ2eZEjZMpNwsAg ztGTA!r9SVK8)kVP8wrzSSjtZIG4!#so0M9V{f;Kke9ui{?(URTy4=LpWox}V#X5}l z5zTjd6tXg{nxqh$+qfi@M{>i?M}ioOEQxHE@I}N3BOnjcKNIP4Pp@lNI%big{R-$`&Rt*x#iyoNbeYpX@GSS{g}&ed)eoAZu1r28hQvRcC7 z?AqQ>wmh=QZ+9ZRlSTG}1kR;oE%r|@?GkyBtdDZPyaV+`J{4)YrlWb|-yV3&P|)JSO7E-mG>gqc3kW=uPNh30hd z)v)oDlw&zc2}L<-lp1!5OO?H}Nu_(*%=7Y`v0`as8ja;fojJ6*WTNF$mswdwYa2Ny zv)0^~dv2j3w!6FW1e4s{*zXH8YjhfEMXOI0zuMtr zHH^A4X?I^~xJ!BLo=9$%&8+lL+LPHy=FV8(YVswujkJq!RQ-u;Cxj#-)+@9|BHd2A z;Hyi-(R>*V-NZ77Hrh6YVDf6x-P>BMziQU6phuHZwX~Uk(=`w5y@ur?=( zyldf)3Zp^e-yi7y9=V1~dB5Qh@U5HP>UNE~=2HZbSx2gB*Hgfbk;uy)ixt!;ZQ{B% z^W0h|ty?^!ho=hDl9VGGwwhMaEo9{lo~>QGwPhsC-d^g|l{m%oE?#FAxnjNBUQgXx ztsga=p1ld}yd5*@nm389>~)**Zx+7s>lgAzYYnVJNxikax3{*rvbC{-9a&6j?G1$S z!4h0ByAuf6_bfE4o83+=4^Okyul0NOicb#sYeclX@n?y3sA7xDznUu#3h9?IL8aQm zGwKrF&lGBHrAvr_`z*6X#e6pSg&)RmioPHCBl|ag&z}&!Km2O(_0*AgPRGXDy~V0s z+-UYUn%=r1_+#N;5oqvvR+<)-e=Yw2i@baBK0Px+(xAK4?z}JI^JgSt_rxCqd}r{^ zkK#KY+K2X%{hz;N-5wkLGRFJ%cJP0Tw2u>b#qF9E5Jjl`6aATVj~Lq7YI+=MmRhB+ z#f?`+@rAykt!v_$ZQ9oMXufWz9Z-{$9u}nBZj)E0tod%#q~#l0$+na4Yb&*sLX(S) zcg?emUo=}yCZ#5#l3!-r)^BdFtJWg${{VumE~of`;|~V-KJpwSnl7*66xRG>0{Mh-6EiD8B!kDUJ~sRrvsaHt(|#a)PS!32Hr7^_nk~11 z^b5I?NuZ8ZhHH-$c(+k!G9+tlJ+_R`6mAjWd1Wc)5`0npmb@EbEw6y=elGlE)u2V3iF|o;XQbU+quD^V^Pur1(>(VJ3<|8bYiVsA#6g{{W!U58 zZxHE!0_>Li{t~Z@UO4#C;;%M0hfnYiho49Ax7tO(mTO6TN8(VsZDvU(R=d#jTj(Qs z9!Ox7w#!^TyP|l9#r`VYeRtx|j9xIfiWZjpP}MK>yT*>)5;cX^H`X;~vRK{|Yavy) zSP@knBP^n>weYLrkA`)t4I^38E%Xb$ZpM4-8yl(YEm&Gw?UG|1rKI=To5yU|AL^$| zd$`IJxQf}z>k!g>~-|MwV91v<=YPsTP)~BUFs7vO*Cf zi3S41E4b5s4%}U*nc{6zSJeyQnmb$TT{6gJiNW($;z_bXyEu{&w`l#_C^7pNg1#Pj z2TXX?JO$xf##T(;_>SvR)-A&%j>YE}0c{2mm*tK~l1>VXZ03I|rUIpXB)!#V%Iu>i z++LK@<-N3WX|uW*IK{;|C^R@? z^DSCNg}2#iC4?oJ*}!4~lHF4wK6OFM{B@3GkHZEc0ewTp=x`!dAYEwy1`eRJ72A|5 z2Je)TyTJ6{g^=1q zBe6=_4Nv$p1A z7(a4&cK1Tmwe2z=4)~Vd@;~ico2E$Z?(K++>~pImiF+i-a;^e0O(0^SS&l$&7lLsL zF0@{r>sR+=o#LtW0nj6P)>K4&H|Mr z;N)6XptL(h5+oxlLGmY^y+W4(WYrnw@_TJlXr&}K$ z-m@JeR}GvELr`ouB|v><<+8avA2;tX!kmB(K*hfZjKm&|%s9jFXeHUUAo^VO&oEv@*1$5sWu6P=shlX*+3|f+8 z00GG>f&jqBO#GweuxWp7VVrvVZ@t1w_HO!qi>ck1Ca{oA+5YO!d$m%H^xgcodUey5 z_>=ztBdpzWH2WNvJC1(CyQm-$&OpNQPC?H;dj~exAoKg+cy2IVLGB3|I2`b}BX&Tq zLHLiK_)TUQ1dTq!gOY#b86P;xj;AWP0D>DBJFCwj{{WABo`?77IOinFPfQbofHDto z4u0wU=Zc$rNm<>wbMJN6+3ENEyPlq0{{V4MTi%pcYw4%x>|LKG(Ksh6gClS`5&*ma zz~`Lgfsw{fPh!wH@b$6CBg+^A9Yx#y;1~d;@<+-~2XD;T@#%B+M9xN0LEC^ZWDGZT z^amV#xz0yVV9-D0U$-0qhQ{27TwX|iaqPStW3U|wKIad&_1Q1_aIb4!>biIA(mFAA zY8Sorwzt;F`lYS<`fgM4DE;sx3>eppoOHk#AdF|*(~v=~eRz+jryYR@BLma|bC5s> z)D}Gli8JRf1b*#*5%k6fZ2An~=Zfdhe(wO2{5Tu3N!&<04xo-U;Eeri=<^t@TDQWy z^|Je#*8c#0n;2o6yX|zA_qNv6THansqF_F340FLb=NTBmAf7;m-%0WRb}a{7-D>IP1qej-8G`{aE)_{RAP`0v zWFGvui0gYhY3JJgZvOzz`rWdsNjIgR$*pv^P2TH7((kz}QJ=D@0CMlQ2N>MafC>A` zaBxQfP6){9(OLqwfah>Az@&cx`Q&59P6-$!91a+TEOxG9N4D37Jr&PvlK9UU9OZL@ zNg3JzJZjsFTBlM6lsN!r0I5y}FsB$KjEs}gy0CGxT5OZQri*9UuO-ytsI70id#m?e zw%cXcu%{t^4y%*LZ@biIs05SOIK@oLKIs|Bz~dm6EI0!vp&)#`;N*eQ01p_>I0qdw zf;st1b;tt*@JPrwGM;nBcq~GUbs*&DJx(#x9sLKUmb!Pp-u&;?`Iy0Nz3%n-tGzXS zHhot56lZuXWqEZg3+-SSK#8q2D}5R`oR5{}*`w-+>BiqGKe9GK+bZrkwWB}w)~=~x zVl;J*&gydT%W+<~zkRjiG5oC9=6Eu(>KB@0GbmXs<7tbx z&xLs7R&AVy1SiM|1cd~hJpe4%xAHcibx^uB@Q}))+H^8OEJ$3mYD2TKDh5(GO ztCc(JYpZD1v9e2lovnMmnl-0IABvk=MO02!mn^TPo0EL{U0;Y;EO^7X!?i?c`A;k$Dgny;9IZxDWe?q^qzcFhF)-GQ8 zFzaqDqr1A4$qkju+uU78Z#1iKD%lxU7;aQLTi?$wmm7Zw_=_sExYIt2VA}f1nzHzP z+G*XZ*k7$|um!1EXtXxTi}QmX7n=W24TUJ7ZsLTT#db+wzaT56uUG_RvSal}nW z3qNF(x#_sumMZJrceImD_h~Mc*&cuKU*N~VkJ>Lw)IJ>ic<>IBlijjuIJ4~-rT)32tA z-%0T_x-WwDJy_hstd9{`c)P>e=8Tcp=}X~@ogY@wFD-N{7(8mXr&IpbgT(gMmJr2c zFQ&5k94=>z!(%Yer_DGj)FR;~?`Kw=dEq5_FL_-hb?&6%tk1=`kA(0UmJ=I@r^`by zr-#H69`)2QD30^I?ZfQSvbLi>xE7%+$(Iz5+apRmfF#;j@tYlwXswG028keqoj7sIQoOgi6dnv8piWLpsN6TJ={uN2dHlH(TTj6irv(ndk z+tpc~kZrDGd8Rf{AlOyauVP?9Awm=}qWPgp{{X86qa$*aja}9zLPPLBO5FO!*CO3!=sYgFG&64QI@Zk*Km?ulZ# zy4HLbW;UZ8@?DFs+82<6k_g@NC@jP=T-Wixg;@DZ;`h3CVu@|xe+S*`H&2Y^ zBYSIGrChHWX_ZLla04~mTWA_Jpbc%HXtrb!f#cG&$cSta!H(GrGY$dXSdc=UsLVFS z&Ze>XR=R`QqZKV3lvXe!VUNsNtt4V|lAr)lP6~!28cK(>N>FOb&8}HAm%FNzWeaHU zYwGmruPmC~!QR$QO~rB#S`3>h0~TdavMh|MOET^qD&3{ENhiIsHm@v*mbYf|N#?o%WSV&9wVn19 zEh5JWiBXRK0F@A{`d94xqxg0|3Cp2s9u?92S^bc@h=l9PSQpycj@y5CD1S%6Jp&xiZ;-0rXm(bah;<{>K>?=ogXP-mB=oBhYmtV{34>wuv>>*|vYAdPDkPD%9~TjV!c=Z9oKt@kq3%jg;a8GNUR4{ny_MVDdQ_^_O*qcW zo0>OnNhaK_6xYLkX7+lucXoPKpW}bo{{Z3+pxSqjv@1W@8{;R5H?$K+;SUphK>de4 zEx3>*vFknpYhMv~%i$r^?nR6jI+uiQJYnE1I{FxOYp)FWUTc3g-*&p< z>U#I=Tk(fc(&Kx0^?wS@r3;JSgIdI|7)kCl(X041OUrC;C%4oku&+FVU)h)9b(P3bJnL$X-Y}OH9Iaz#oua+ zu8QKT3e}?N(yt7475@M(rBjxqbW5Hwb4@jC$-|kyh1868_Rkb(TEBsHNPIuy_@~fy zOV|a*jdybk-S~gRdUS|h-&pX+iQtOkLh&A#a}&ob7rJHKsuETb!)-KdtIKK-%Ca$; zG5gKQECuXc;=~AL0+gFB092E)lJKBJl*O zqE7($`d7X1^mCQlj|=$q$~m?Ne0K2baKs%MU@~PAzRM4sMsbBXyFC(Z+A>bdnKka& z?_}dWe}~lZs^FyFkXk>SebP|m0)=;wz-?j+6Z0@CRPQ8^ zLXdW--GW7L+sdFQl~`?1%DYBGspoIZA8EpnGF7lQmLDY-T220uC~K&t2;d0iQjKdY zZV8OTaS3~Q0br@V-bYs_%)#Z1guyTbj1?`DAS4XraCsRdV;?cxPE_%qR+b?>d6!GI zy6dxP@7e2ntG&GW(41`fTGPp-)t9T@_vr1pD_s~QEfYHtf?6_i3B#rr44?-anXnX< zDS)J@=C5vVr=8oNc74Z%Q@KzOVj0LFV{SsHMr8zNURc>&;5azIE4(gyhhZ6fHWMSA zhpA!HJ*1f!fEA85<$-U!0Nc6H{yTed=gg?epL z0qMAgVYD3OnNsXFCW0F+-rwCbGDPk$xRBbz# zjBUv$ourn?2oQ1)%d`8rVa+*C(X_AxGYp0*I%I{X?r}^r)P*`cU8hgnuooKpTQmBqq(#f-VkP@XF zTbpSe2I3=&%>XL}MPS(;yYSEAzs2u^*Vh`S!EcKH01!SL>X&d#FRio-*G(@{j%iX` zk*j!TT(#6ZH?J(MZ4{R_nx>t71=N=D`JzR@UoMG?VPg_cC(FgWLBKtJdA7xC2?`4j zK6GP@sAm`#Nm};Qq}Yw{DN| z{{X?7Z|uwQSN3Q4EAcaYt0#lJHLrNW^TXHQ4(xHT$0*YF;1G^sP(bKgKOT#vUP;#5#T3c*jN8+3s(A zM4lhh2CJZJk@#0!v0XOP^DE)LzyAOTuf(r~9zSghMc3o-SHyn{Ylp+S--tEu3ut=u zHrl!O!KdSNx-Z36(XaJg z4(m*g$3yUxH=3l^nvM3OZDrw)2ifX2U(Gy2kYhMoin94-_?q~9HZv0nu2IB6LaTM* z8PWE5j6!m4N-=SzO}J{*w6guLD9o~)^CZNo)M>`G8clM>7My1&Cl@6*A9dbbsxC5o zzU*JaFXutP3>4+J4S0|2;q+au;b<9BQmccunOeuUOVjy+yx&nDobFIlE!DWYsJhABp1WUlmbBFJ`K>w!Epw(OJi@;ib=F@Wh*ZKcS3}qR!<2 zJYdJFUIT%iptsC7WUfXAa5@k`d*;E;Etve-QMxrC=N~A};z7pI#&g$^@VuGu=8Ve3 z;q_>9h8(81s49)eIs2sb7$vsg95+f?jMu6<{hG+|2?UugqQ*cWl|)Jl{N&(+gN3Yb zd@dbzvrg|_RCRXR_T4w~Ij0|e*;#XIuF2ZZt5 zUZ)MfBQ^a8f58lH7C!?1*9yv{F17HPoCaVS8^V7YmB`zjpoIjm0F_&;c*?SNmOD z+P~~Y`&ZbQ_7UJ=jqPwoZMPhX9mA&^9t zhvKhA?Jw&Htq3{WsCT4%C^$75xJKlv zDJ0v=w0hY)y%n{#yWIEqTAbc1H*HBMtU|L*NvO)NEt6Nb#je`BSpG>ajM2neDO`M! zjuA&0TxW13Vb0^U5XUTVSb>Wr{-`6`*Ckh>#uVdr8AEwwuwYqo12HZB&^4`akpO;w znPW_=A;#g5z^WDjke6m{*e$py#?e`i8VJT2!5A4KnG|wLgMb)v3Xlde#B<61yTIYp zFc@~@%>9iyCgZMUI;%h8Dcj4u1Fw!r;t^KSA&k( zB;(~fFJlvMyGKu$u|^@Wf*5TB4Uvb=dSLKYt7(jK(Yl?bxMxi7UViRD+<0sO&NIT{ zMrk{({XH$@wbNZvS|;v2*H`}l1^T`1eYfcDtw+rm8&Iji+niuwvT_fq;BF%v5;6f5 zdfQgKwI8~af%mo@tPbKw-74EoSn_g8<2;I^Ew$8tej*U^N|00ldKTlO5~l!e+78kf znx^r_Ig!{f2coe90|}gN+6drdIo^J3WQwDtIn+c$L6-AA{5{{XEX zsO=ZUjPNoQjaz38!m;Ww12b~GI3*7l$UK(d<&@1lvalF;X2~T;EEwd2h9EH@V1d&f zgAJNb9hO&cjT@80b;m6Li|UjG1ddRt32+7dVw_K6Mwz;0Y&PDteBjzK*7fG_~9 zt9?68d>58Lb_P-yFClQlY57KS7=YUdJ5M+jg2Bdj7UcE|!6kh&v}6t!AcAl}eAAGU zPInxWj1i0|0CWI=$0UKCK_C)EZ5b_ZD_Yxi(LUDSvRZF@yJ(Y3RlWMVy}d5`blTf# z)25Ra{6@|};Dsti++YF80nbt~gMv87QED9?GdAGNxI2^rHv+0V@N!0T$y|Nly(=qE zo^f!XyJd;a=FZ?3Dx)|jwn5$01CYkLJjo>7IpZXkVaC)Lzyomvag6QAO}Mqp zp0;k+eKfVL>DN`F*q0kCxXXQ3-D0k-v%g;NQs6F!YK(3hcRFO}IpppkuyO%nIl;-r zQ@ym3;c|+ADal>R6t)zWF`dhdsm3_T^}sh8IX4V~{AZA?ow?+bk_k8@f<^~ID%u%W z0zj?&BxI173~+g33vdV+1CCE3xh12wy6v`_t*-5(dp?)#yB9}wez&`8TPJ&3_FAiH zr;|8&5_s}Fur{bFLVz$bPC5a{AgBWX9Dq$dC%VquoVF7snC;Fnxs(HfFfhtSF|?KI z+Dx|OW6RFc80`RZa4-lsIVE=m+Q4<>~pk?gOUyjQV9oeG6EEF^9-pyh@}N) zn~HkdYuP(%zn7c7s1vrTPWtk@H+0(aewSAJ>~qPX-duC$#xln^D#Yg}1gP5IHz4E; z4m#x79v{>r1o@HYg4<6A91;n}a998aSR9;@)1fol+bAxEvq6Sd6I2Cj%hzc?@#fi3C$5)Y@USieU0jrZ5gh(gpzI85kdw z)u+!&&06tST3c;8dg!k9ZG{?+Gfg#Uy)@frzix?Wp7+tS-ToGQQSiTn{3+lM3;2V^ zUJ|v{bU%pS8~k_RsP$WO;k)@H@h|NCsc0S`(PGwbRM^i9ekt(3hxEzx*sf#MHCgpL zJKZ|g>(8)>aWww`6RdhQwdIi2ygi{Uq_5(;%XhZC(XX!TZ=`Po{h9(H{>Qo2Mwh8t z>K8F?+Oi_vF@agzx%gZAX8d9JTk!YB{{RSduNaL_;p%ug_fhaSg*;o}?+kdi!#Y>Q zEn8f+xW0WWPVo+dtjnjk6VI(mmh)Tax~twZyy8;&~oO5Zqbn7gvy77jRN` z`)rC{bYQC_C82X5DmlN39wj~_@yCm`?=i9B9bz3_mT64WxqUj>5WI{7%u9(G@SypG z?FT4FQK&`Z4-Qz%qI^ZuifXEL=XrH#ep#T7`&kzEdOg}j7uxjMEksRisah$woh~4` ziI@n%@;?$psjfT{F$okli5NqaB0V14FJvuyaR+H$o@4o{QXCa%+r+$7VKTGeSccJ*pWY>MLY6hJOd z%&o8m1P~bWyXD=}1h&)ik}`NF+4L!*xY6M@QY)s!87v85xU_+bZVFYHt8O4 z=h=*IF#M7>f`Oc=R^H4{JdE&2JC0PA8$j2w)pZR$BQ_He3bK<4Bj*btB{1QYOKxyT z13Umj5npK!f-3u4;!fQ=Yjw4{JEYH$uLQ1^+v&cZn(5!B*52Pn+dfl}HmZ%dz-;B1 zuUwJ=2LSZicMfO(2G1wv>PAQmxETZvNgJ_@(Lf3l&m z^948=&I+mTD_cj=En7)!-umsbcI{(W@26M4Gw!YTKFO^$=#_Sm9oWW6AOdi4y^6O3 zcimBuf&s=dbDFFMSaZ|1F@iEcB#fvnobDekdB+se#PUW7z&YUVIVYee91s`2PXyBA zu5fU``*IJV0P~TIgOkDOo^-7>rS;nPwU=FQZ^yD-Hcw4f85!?a}G1mKIQy2&uNVUC5Ny=_JFk>mbKvg;FyI0P1hE2MgG@e+F3kMF;81|KU*f}Z5$Cfh1 zA1&Mxd4hUj4Vg6hmGq{TRtSvW71y2aC6r69W+08cH_S;tUYWmpvj6G{&qSHxp zMJwIxl2_|@ZnwGXnmnkwaK9Jvvbowskqd~5Gknhx5;TV+%K?faDB8$a9G%E6;4vlo z+%v{yGNvJgpkN44A!V1!D;k5jS)GW^)!bJ+rkSlsEMu^38hd!ai37TxI*bAbgb2zig%LH*)4Ta-7U}6vfS>T6A1??#Y)QDuifTKHc4sMMBUQ5cWUR+ zz5utA`%g#IW6||%^p@%kR7Iod(8KnHf_I3Ul5Zbl7*)evOKQ-_k0g`Z+{FTu>fa4~ zV`<<&40!9pw;m&tLAuxcdt>5JYpCeW@hL2H>)Y`ov^rmawC!H=!kW@g3Df1f)%0t7 zOEKihd21X2tu+sVwGR+#_qJ@#^`k!-^_|URt8gwx3rz~Kfv{IBCP8a2b zYFf%xZH8aNuV~&Yw^+1W{{RAb`qF82PZIbZ*G0Tv3V6dz*KDGdu5In~eQv@# z+e@1mt}La$@T}`=sA+b__T(KFIPGP!;5=WU_>$kmdN#G<>9s3OR(lzL;Vg&67JeG= zwX`-GLup!eg{tV#X!bTR-yqU0Zlu?*HA(I7{Ky^`pI+5w1TXmrT&SBW>1W<2y|Y15>frjq4K zq$HOsN=^Hh(P*Qo`YuU~qdaCELabz)QjB8lbfas#J0+#BD<;*}$Jm-R!15wyLIcSx z#D>D{nnzKCo~^e71hE^30drm>@pc=XN5uB=+FHqQ<4Le0IO2Io0&Dawv3_J`^N=$( z(&JzxnAA70Xp!G}Hqi)XAlrffM&8BpK*OO73pz17lmLThC74$w;yJFgPZlrQtmMqP zELQ3+x5Viq85te6gl>TySqCR@KY7Z3KJfRnz~)fI%9Bu!v{#yvi@lOu+Fk0Fo8NsM zzhI6YjyDe|DW~p5xT&sd#YMH(&iXxcx$?ByZ;0+Lm0L{IRSXwaZdNHGh=;dieez1G z6tr^0(apLtUjSv1^YW#PuzzOTAP3Dh>Yp%if>eClPVy85%N%nfl_ZoE`hoqv_S4(h z%WNCY*iQMK6h?t#KqF}6X7e6Z3m)WY8bvI{*N@ACEYO!M7F8D#g~J&_l#z&y9I0er zOkQdQUnx~a7&GJgkHW0g<0YI!*v6b<@G3lxP1L+AtIM0Sc1yYWH;H%!meI;9Cb??I z622w&T?X`8r>fa*mEDey!ul$BpvR)&55Pkc+bQh6Y)eE%zhiuE;R{kL2EP5aId>ZSd z(BDZMR|{!6-nG8lpR-AGYaFi4aTk~HZNtRo(&FbT@W~)ei8Qi_okVXaD8^KfF=fgW z`_5G5zHg;}Wmw^{__n$vI*y|)pTs|he;E8bHH^jn%{TUc!wrAL<{9ITHI1&`Ks~4rzy@M;(O4%8nkBhqR^0r5W>8q@^xquGb>9o72kr{$GO4 zoqSCiG38DUe$xK(oK-%1G?mg(g_F|F+t&k0W@L&51jRlgMW7 zHnD;H#&u#DQ~(eu05EN?5a(x+@k_-TPbE=Gl5aes zSYZpkSb(JdeV$G$9g|dU(RhwmD?2Gk)7^Bti_vS>Rdenrd)P|q*Kvd=({~21b#&~c z^iQetH1q5?!T$h?+B7BE*@3u<`T%kelDzFu4nW#48~{3PHf=shyks9^G~OA|tz%bP zmoi5FEzlhm*+-V}pR+j%8JxIg18H3FSMr$UZNTkhv0#KI09%O^;BDMg5=P+ces@10 zZhGAUT|B>v9zh=U)4VW|85VOSa{mBrn}lTGAPe>q3kGK3s0ad)_4$q+%O}KCag$9` zvrB8#rEPAz-7U6S9yS`fRW6&+HK&wa`t;KKEj#Faz56nYA@MWAA|e;hv+>=c7}dPA zBg49_+N!?pNn3R)rFN(xhu(>!^=H(Lwxe{Yt`SAFX|&+0>^V^9E3+;zGN5fB1{lwW ze#@-`d`<9KR^{$|bAUls+I$(W8 ztLLM$eYV{7p9E@V{{H^e9fLDSaISMAOQx#2?Z^>^l_X>-lEod#13R}}S_v)^L&`8X z9D-sz0!J>n1AsKtb^~$C4CFcdV?4@b7)rOYe$SPA+^Wg7 zcAlC)mHz+}>6*1#i8PXoJ?E=UtJ$p+R{5u;`+5bQ6TnyOeqFHXhvvpt{wG$yEpaH-+AmE;IrzKg5KPkodMzIvE zn||`r+a#91p1SUjKZz*HrEI=QH)*uKb?9&E?6pUlxEqP(iju=}f_MxzjBF(GNjW@% zc&c&_n2dl+VBnH7frbR5FbY0xjnojU{ljWm2qPSGkO3rQ?I5y%PjCnXVMy!1Hf><@ z$vttBLHoy+T((aj6(P41#xMqXaMGL;-9{_$OY`~fIl!%!wqx>yC$2$PB=#8u zFMM!7Qced{6`Lq!9e(g!=aoL22vy*W?IF22DaTt@leO=vwz_oRdu_j!tk$Od(UtXA z(X^kE{B_f#({j5gkq&q`;4vzAWA{fH;d91D>>h;YsPMOoB=Fp_Y*4|}MpOXnkDbR1 zatPmmLHcAaE0Jh(_OokXCMsboDXN;V4mg){AXwzt7ImrQrLjVXE;FI%wpm4-+ zRE}$El$AE8eqEl9>)T?W1}xmfD_fD=&sJGKA8UX0~Zs&8<48wwi9WT3GiRFN-!& zuoA(}a&V?HdCwR?K2mtwxa6Gkw>_1g#eD)*8xeX$FqXYr-p|lT-KJ} z_uAd9yXmJyu6(91f^gNZFK1`86S5%D{B$M_Bmj6Ws*CH$CemwM3ZWs3qDt9-JQLAo@>Hvu3StJC3OKqagaK4 zST;uEoP`7i1mmdBcCs>9Y0OJ!W#=d`Lm9HY1_)5cfH(l>1y0)j)l-$@IbQ1VySDMY z_1{<8+MXo%UWF*$G~+0?*DK|^R=t!L+EfSJYdHtC`RNPHv`C0SY+g9l1chxoY%(|_pFzZc~Y`Qppc-9xH%ge5i1$H>mXadi4N|5_mZ4*!?jR>2Lky#v7p= z_BqHPgU(KH0NOw$zXwr~isu_$x&9VmjB%0AAhrPIgfI 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

    ak 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

    _1zH~z=@x~T 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 b=@&Z6YNK!z?Ny~AQ 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 z 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�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 z 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

    *Kkx@cvyN+Lx|} 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

    Y4 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ϙJB9!)f=1wSaCVc% zPbUWifC$GF?$cK4{{YGLv(sMvwAl`Q)%sff?9#oo`}ggjnHVRq$6mR?z{Wtqz##gZ zXYSN4lnf0gUAL>>Mh;Z5=goir3X!zN<~P*|yA^y4y#!{Ox4@T3cS}YLVCho9!GC zoEZrNegRlm{oH^-+(UINypjOO=Wm?0t>Onc8?{z$Nf_KB0eR@SAPyIgml+tYjTD>h z9AZ-5Yvo8JHZ5grC|t2(6rQ{;SnLNv0EsPi`!R2~XRqj0wYs+UzO8JowY8hy@$G3#5J<_vzyurthRWcK5PINpPII13 z1mp~zqa>Vm9XP-^n>fCfAj##@YrP;=kE9*2XRjxmJ;jGj2_jsWMl>C?C) zAo`4XF{vb@XVrOcziZw0e=EdlgLZmsw0o=C+Fd`>RoFKUbIB#Ua!9}!$QS^1&Q-DU zf+vW#283P#OsKFQ<;1GGG+yUv&PK~&F5y|y9 z&meQ0k}E|jZ~A|SN3+|pgH3L}eFtqljyM22ULHu2>9=9(c$AJJ$UmBu#U@se}br%W6c>4S`8Jnh9h!rgYY zmDc{Y`QKJ6Uiy45^uOhDW61vi&~m)-$j^UFaC>6{mlz}N(CR{wu~;5zv1WJ>$jrT-NOB}^#1@o{{SB?hVXNf z_~39dNIf{mq4~484wSe!>T}aL@7s(F6M>%Ro}DSVBfE6YdXv;}H*=0KahwyL_*|an zo^nVlfrHoPA&y5wjB$qPR}4FQKAK+bTTQ*@zWqIKVe+>2^ZBK1@A7tkm4KBPJas=o z^dx(dLv1IHImk@oIXS>M1YitjCmfJK&l%2lbOL~VNXW<;B!S!$l1RY^83%!oMnweV z5!+}UgN%cWo-kDBZ(QJ&28rSAb$<81ORW{#*(Yr;t;VAy_UgJVEoY)%lJxZAZq9YP zo(6W>j^O_Q$GVZ8qz*wGj&avGHY{>9i=sFpcI1F_{+SUQut4fEPfVTx85LUO<5;>l zzzb?eUe>Yh0|kyw;s6~;7y#9qANd5_1CMB?p%Om4B(vN8wXYXDnr&<8y4+QgCv z2Q`nN9l9-<&f$xkDeeW;&PtxdmIEATJnjPr(o(#%+mc^DdX~NPy}K*i73G$lgP$!a2FWoA2&G|!kwh^l14a;%yL)U?IWotJ=h#% zoB~P77$r#{`ju;|K9=q1p8a<1Yu~7vzWZ(H^x3|jcg?cwkDT&bIUHo?3@|qg9!Nf% zf;lB>sUYm&0n`q2(1DEgzyYY-?dO)~gOW3z zSxz}Q1A*9ZMRQQbEmrFLKASr(sl8UZ?RC)0Ri@j!Jv(b>y8Twfw#-D9oS&XOZ4-tZ znbooY95x9Y1MIwpURaQ}`X^%EYU3@E1*?KNUAgPQJafQ3I%`jweI-FSW2$k0NnNha zKme15M#ww^k_R~)m||_TM!_TP7bq75@D@ZHeq<-_V1RM*^IW*P&QiL%y{}~NymZso z?(}A`Nm;ved-b!m@3OOBk3+Opj!y;nmej@%+5RGF_esQrh^{ot@W{$z`=Hx`-~hQn z$WX2~Vu^=|q@9*U7WbEPhIW)F@^tp&e$d2{K2Z_^PDThBi!(^I)HPJ`?w4q`;&}BP z7X23D=HA{PH|%&~+tTTH@b4JydRw{QVc0`GNfumpp%J+HzcaGw`G9nBOiH1@Y% zBELw~t3GW!J*?k?OlvBt1-CLWSjkw_$mEd3Qn2_p@_nR7lGnK z8B0Yn6he&>LM3LvlZci_Pk#6t@TJo) z!8uv4cI~_F<8I3O?a}Pki1E!+;-80ZWd8t!&g;RKy7sB8>zb9^t9#-L$gLC=NWx06 z#dj#4MIe8G=|l%KTEe`mFJ9r7j4*u15ZF(F|YZ!-;+ zDgvV;1}dSE@vW2!W4FJSY!*&!;6O;+a8=~Xs;R(Ur)k2YIE;7G%J8f0N~1|==GEPn ztwF^B#4Wed0+V^wRI z-L|pw8ap`bBXwdGyryY@ZNb^&P{Y^s>n$fqw)-!JblXib&;YOfpQf#lkw)cVBbcK5 zNaeF3nVjH)PFA!-ExFrlEu{5w>uvKAz^Qnlbzm{~noXeZA%+-~D&r35BW6E(-c+AB z$jZ0~!*Cek03(t{0ykYeEFja0OI3SCt0>uO^uCE}>FW6>UbL-uEi9I|eJ-_b+TTlj z($ua|fXN{A2XP>g&;mCB)22@aLC;)7S0D|?l>mZ9FiUfs=Q$%7#s?de94(?4eJw`KuAQ<3-#s*(McaXm_kOoFN5JBpCkn{ljxet-Y%o~zH z1Sn=>++g#-ARd*|Ny=7?mX}w5a=(36y&kseigT1x(e0~xbXM0(@21PPf(2v1;0zp= z8*oov1~36DpO~DUaw<@nAY_q(Mo1vzJPtbo*=&M2C(@+}?o?+3k`xX=897ig1`38C zlgZthkq9T{1+WPsHYWokJgF;=qj2hdGq$>Ahr>oUlZtIAH0Re%Y@5@)+uhpNIMyQ( zCgP%>O(T0HZ7-$#?RT$1vD-zD-6|Woa#tW8jS{E;kCd{u^#{4wt(71Q@mDnQs%nxd*je9R`H$tQ zY4$T-26i|fKG2YWa2i>NL?p3tft`4(Vlb3ba;XJtEnT{;?%KYorj_*h9dvM*tV2pP zrzX{`qTTgY(JTBe-7RbGm7Q*>E1$AKbAC{b%?i8&BbP$*2;u9vF=Ni=CxRKTJeKy3 z7WQat_YsH{ro6g+#GRrGXo*K4E*$OyaQ+?Ob#Qzu@ph;qlU~%czX(DU2Dg_`eQ#JX zoB|D&k2=`kwo0V;(Ul}5ia_5s z7#ynz;8F-DZvc_oEU73}o%=rV;D;vKHAv;1RH1!HsMt|?@{J_%EXpC++Zm! zoEN*?T>x6|$ceJsluU|ooc!Kg^2x|Ysx7!STn za8$8q)i#0KSl?L38HYu-w6L^Q`M%8s)JUs_QnIzRjBw`)>%lS-r2t~7yCxeKMlYt> zUFuGNH~KY=in503y8BXTT0FKLU&%s0c`GWglNIN^y101YkZHG5nUF)K!uOskyp7qF z6aFRoFt*bae9OD-3L<4H?x`N-i|27U#v;4BsV8e&-ju@|hg2JTK zA$4aiWfv##=%kgOXMI+^%k$mn$8eItIbSO8IB0^-m)ny1nFpe7(o%T9;pEwK4`0K`6N5h*| zpW?5?eFNdNQNUaK4)*HC*Ti?wl#G_N@ZN-};sp|h^2A9r=w@{)Vn_|q_=m=yw|Bzr z3gaIQejaN-6m?~n5$gUwW1@IyNQzx&gGRSEy56lBWLXvq`|TrQFPia|c@=#5W3dvC zzd5#=ZZ~pmU3O{dZ7qFwwx-y>sNrstr52XSE@i6wE1FF`(^l5~H~VtR^I!2ijcMVl zJ%7fMg2m5*^vL`>pg}5yb&BI&*HlY7N5hAL>N4^9k~Oa2#kn69c;mre4N~GCiC-5! z4}2<;-IZ>1D@)B+;(v~bBoh_xh2i*`^(Iwdq|adlVS+hyhB+c%$sdYewYTjT@kSeq zUln{qlf#-M(HnK}uY>L+@YabPxn+)9X>?x<%VizH3$iKR8KC2Iltlul5)|Td#lS@r)ep~AF zZ8dddx_s^@HcOdNk215fleLp+TaoLkzRudEZr`k)F#WT>1?XCQhr^m@#NUZC5T+C2 z7tlTzcuMasjF$^(rA4cFzVgMelZ$naPB#JM4RbUIny}tIF3h>e}1s+Dxpm#Vp_H8m^&m!ZvvA42sIXSlxUB z{f<9oqaFVM?QQXld~5iJXwH*-8~8t}iS)Y}n>LwX|>O~joMACS+}#_Xx-m=Gv{k!YF3kTGeHJ?3dc2*}|pdxVyTtu(tv?p5pd0 z%{+f~5BMkdh`a%(>DvDQ?Wgh2;cx6;;Onb-CSM0yTrb3*jM}}Du##l7@Hd3@dz*{7 z?-7+*uRKSKOPQjI^G=20n%*93$G`AXzZvM-9q+^M*)QS0gg<2e002%c;FkNtcCcUg z>r#r_d5ZRZT6;-TPQ18zC6vvk+1_dv4I-_cwGyG3{{S_0{cm0IPOW+3J!@3)2a3E$ zsZ7^euZg@%d2y*~7t^w`w6ok_&3ioW<)~D+ySkb{5HxYZRYH00zB;u>7{*E|w5*-l zylr^vH_X@gZM~VqNn~PmvQM*gzNYSr!=XpNQW$~}Z@7inj zg8im7l$YZl#jh27O_mux(Whu4@pPX9_7sll1&o~h2G2nZ%YY)#?))~a`(1PB^2zgnu~n5-`}l)W^KV)m6i?e26GuxUXqty67Z1` zX*RK6UW6fLh7T()%8Eg_xffTgzk382w-v|=8I`j&Eq_(iQMX9CYz@Ik-gaW7whL~N zq-H-c`4%#A26lX-=xJqqu}-60$t$b7Mf*uIOF86KQ zRGZaXOWNt#`Ze22*r_y^W!>hPC1xzaWM!DM92~lUbCOhr=PWV+W00mxJ_PUw1TIV{ z#Ha%xsC$=Ok%PGH41}l$?~2Zey9(^*I3FQZJ&6GF%uYub#!2~l8xE2H3hf<;R@iV( z2pHl`rz0H+?%Ay=%{J0jwYJv#Uth;f+t&Jzk*%72Ro6FbrEBc%ugsj-+e|ZH&I*u9 zyGW`5+!@NSnn8tQ=11nR!OA|+3sR9@-9fI(nR4&jx_$tOWIAmGQSLb9$3859qdMp$oP32bqK#DWG} zE3{Nqge9e#y4AG1>#fpH*SqpIhck_?lhNDk?5%Zo-?G-)TIXT#$KuDtAA$ZOpTvI* z_4za_jeASD(KY)Pf(=u{ejxDnq=^Qh;m;QMcT!38y?aBxidjNiUs|>1mhP9f5<{rk zS?VkI-hzGx{?qzinc)8b14sV=3Y+4s)`z8N@9sW2PHwWzZABTQFPl$#-;gm zY5TgaTdmV-F5dO*ne|u2Z-qWB_zU8#TSV3q#X9$ebp1l&+Dq+E!rIq|{70o59X`_f z;$26>cY2hzD->e%6Kg+UADQIM~0kTHPbAb+e;kgCpQsWG}cKa!~GrboA%k(G_4jt0e;c?9pA>Ug=0`R5qw3` zBesX)hllP?p7vU8_Mv~OK@^@T8f(lXwu{8m>E0wmERpHnH2WRBg`##oI{lR`{vvo@ zPl`XX*wg+ud^v(dx!1fE;VG=_wap<#yJ{0od^;>wek1U9tt1BVrP3nMb&Vc-%Nxn9 zqK0X0?4;nraW-Lrnx|G1lw$d1Ii)+t-PJU#o!eSylULHmRzD}DnaA4Ut?g1%RN}cR zB%R)#_cBTRQBP~#w0!Aj@jmtmKFzAwe`q4U$9U$rwP)CY0DFx-_QDwfRoHGO41Rs@ zF+ixj&YR=Qje6i|`ZkB9*hZ{o^R*l4RtTe3ia$SO5!6S+GBzZ?9CBxB*d8V{{T(PaaeqP7~(0{gmjFg`I5D) z+LT*L>f3pr8&?5ZjHODvYAVroj4dSHnn}4OcdgP&I_rBQ=%CM~3mtuCh*k;xq0 z+bEjdWwg|m`Y9vb9I#v4+geBoATm#B8571`l$Q-Mu~x&d-Co5ETrnxal5&hK9(Q=? zlyy#4mrGqFnz~vJ7ztBqRnv^68^$+lODj7yXQS5I?%OH7#2EnF$q_t}#gpSirw=M%R=Pe4{7|CBX zjIl`{m=|lj!yxoF?Jj3!8))0|Y1-ObP1F0g^5+gl++w8LZOJPn)t^nU&}e#g{7VRO>cb+SCGlOa@pew(!pQLeLwVh_@^d z-1#A}o^srY|eA9Y_|ZC#XQZMV~}s`>S(D7{i?#iyfg z&g%BHwC)KdaG)+ZqDfW z=H&RBN@i>AGRMR*ZBZn_WVgE6<^>Av7SdQuHWz|NCP;~80ta-9PS*74?-0X%sCY)< z86{Y?C?&nq-dMwxhIWo6x{ecr0Cb3|BeO=4Gcqr-&+z6`8^4BpNvLVefDrmF@kfWW&lIxSwDZg1*<`cV^vGlom~Sp( zfnpn+tamo{w>FY3%x$>Fwy$W7%>ASuslK|j`E^OPB(D1Jwze)R5^I^o*Fnsp9q#14L9rl&yx(Oh-3d&(uM@W)K7V8^4*X*ofcvDuP>{`>8l{ELW zNjO^9OG~ADCuW|P_4N~P;Qs)M*0$axpTRn(hjrMK_kK3;tok;WeRni>QNt|S--gDo zc@C=fAh5Zf+TIKM*yW9{^$TfUAGCR0{{V#T?DeZ@bng(yq4=`Rq`tNBUxudDG+Wr^ zGL$CwPrYj^<-CqrKhmbLyPeT45smfCAgHY@{xs8cw9>S_PJLg&;^D6DJSTAS-RZt; z$mV$x#FU!ZrCH?M5nz@hG_o?ha>zrpe;O=T*7|kEk7<9Q%!(q>^-W^z$!RQ+$8Qwy zUff>X3uRY<3KzJNFSG50yl|^VoOLjfsTUc-7jDU<(~{BiZ*?ba8cVWkaD?R<#l}x` zw3Bw#D_N~$yJep6sEL$Si?L-npCiAAeX&yo7-W!tp#4@eN!C#7+XT}&&rMkBGeenudejWU1)4tAk zvUq>Q7gH{o;u&LtHIzwbtryh9XG|JB%;ogwwoGjU~F}t|8SS0pyL^ zDAx?@69-Y{M|TV}h~ttwiDiyi$CvoKLD8<3Ek@Sr)=TNU$yVal$>W(W4CP`sH#To@ zSQkl{NVjhULHyG!!qqJ!FqoWpcSE@2y*Y(lUKlb?8!^nr`X4E5$UD zc6!0PYpvWG(@h?y);Av?^_^kn@W;eWUQ7K-2~DP@q5N3zZkwb0NYTypvZ;G^y|9>S z31b{PVYs)t(=VwXmdoxFFX zH1hd6zK`(FU(HxdZEqQnKIpCN>}?rs?QNlr&A_&@vOtho z+QRoRz_GxSxSBYc#vx&@XtI5m#Mb(ymxe|PNwMdP{_NI_)4Q+p@ zS=dJ6J6pJ*of_ihH7F#txR`mpPlNmyKaaKPJT0f*Xxe6zrHf5t$G#=;2Bl@C_;*3l zmQS)APPql{6RF_@X{>7)kYvso+v*SaZDoHYd)=Q<`~vW9gW*pG_^;y+j=VLg>wgs1Jub`k zX82RB_IP4P+975 zrnHf0nq`KMX>I+ndu;}lV|6_GW})I8D_YWJpXLwR6U6=$*7c1$SMUsaEsw&Bp9?3$ zZ41L1F2Ai@&SLOYuaSG=-xKIwA-sKFJx5v9{{XUlLp7C@52tvGQ@imL5o*?V=@h;k z{hI#(f-U@c{gw3}f*%mSWB&l!qr!gp2wx1TiX4}7t^V|3u+v3c6_x3-AelBmCd>Qcv;m)I@X}X?|r)a(@(e6BNrue5+@Fm*x|Z!mM(;4QdHEYpsdtdl$ubObDSx^;%6xGM<=%XB5R+U%og8`ah%+)`-6S49tk{22sd3r#CTw_h+B zBYh6j$sS7y1hK|+<7*Qu`QW0$`!UQcZdKbLE64QWUtuUL(;AML4Er-{C)6- zoa^Stcj2#ypBns8rFjHK@myNm>gUH=edJQ0j%AY0%2a69N1j7&rr~^&4}>4E>)b~L zzLoo6*$EvXPwbx#w}|0ZLk<`HFW__+G6+Kkz~3e}GP`+%NrbrTCvbz5YHY7+bk&{J zov$YK>1OmzE~oGKJ{im>OPZWi+DUUpYH2TZuX#^&+H0p@Bl2hd5g!Vi7Pio3au!9$ zhoH7BxPDN@XBdf;4>DI#ynN>(!#YsWhMxiYFVF>eq271$V^o5W~i0yZ1l zVlcpy;II4>o;em9zuIH=gwdzY^@Cgei9R*Q<$wqxN$2<{0xGUuh&Kx!Ji4Ym+H`FdWfynurqb!r^tp@4ID&;nqlc|hDXXe+oky=LZ{2cDC3obm{Xa4z z@Q;Ke0HSDd7Ws&}(_^+)Q@HF&C(@#giiIv@-c*HclE|uM9Uhh7e-2$q3CmGyBuww+vj#*ZmBKw1zXSgO;Gb|^MRRHUOn6IKhB;$mx|O$#{4skmjH8I& zJr75>yl~r9M#O|5-cm(u3Nc(;!tsn{g`6wZYe>_f7Sz4lCi!5Ny>GGTQNrWs`|`rq zNj+1HqTBa+PTqF+eGiB2e`C*!dX1-nb-ORwOU2rN@!p51__x5tulySY{r83R;i1{; zUMjWI@3ng^RkWF{yiugbEXk&<^J%)ptlww;&$x=>ZnDSz3CsIKUE12Ni~AOMvrw^u z+Akp+#a|8W;ET=k6K>D=NLAxl)+Ci6f_Pd6RAD=wm6u7-JQWnSdJWQe zVr@#|Lg3_#b@c3838^H!XkSsO|3(CK1mBbJ{Jma={d&q{-#O>s}520D@kA z(jI(zeyi{cLa?@hnrmj%JWKE~*4bRJhYzRtg_&cGj8`jdKAm!sv5l_PbvUMt{{U87 z_T%uf#+KTD?AiN7TcSq{UvBW+KMj0e94LevQx(Oh#FsKh0%S&#*f@*Ml~oPlNfV>e zf8e1%2Od}~wSR~I0JQ%Ag{~GzS*O+i0B7HeOJ<-na(3-eR&y^|Rn_4AmRV1SC9onx} z5?9$K-l-}6;k_SF_=TluF(emucKXkX z#1_6Bv(@izw{u+p z(tecKe&0W{qIri#*Zw76O?^9mXxp#BPuc@Oxwf6sIIZTjwA6kPk1}b=2{gj~(%VlF zfjz;Qpn|)tH}%iB}y>&S1yWkT+vNl*1Nm2T-u&=VVqE$ zYR?Z>*~U%sN}MT1Z8gf8l_yf1E|QexHDsLMxRLzITj^R%QYuBKHO!!=8GD!MQ!5vMSLafEM z%<>Z%RAw_4ud{~}Rdk~ntM;>D2s1x$rNF;#L08_+jxkK;6LI;O$dcm7C27K!;4Tzj-k7BYda=x$@mt zXO_KBhrAi$%ZSQZcu&QXss?Ed-++8?;nJI9c|n@t>@Bw720N4$2&z~yB%jyWzh!$F z42I+OH25oaueW@bpBc4#5;v9e7B_?7rKHFrSCA-G+QA4%22IC@*8c!xPlV4bEw28{ zx)zIYC0A&4KiUJuH$GMrZy*Ih+M>xRNaf+aw+PhTn(_d$M*NnPKBaAKXRO<6OXCj#Tj)L~7J}bSTU|EdWmK8gWKBZKE99@Y z;rKoO00eZ^W_!;Td}95Xd_kzn(TQ$#ABi3U(53U9G`3`dO*c}~rMDT4V~X5MBE$(* z0Laodn|{uo2XfZ3_{YTBY*wa3i6{6KCyU^XN6e`+oK7WC-7A_#Bp!I2$me!KhiFF43cGSaH2Z-!ev76Q7gzBKTvVM9tvO z0sJ-8@&NO6X!V~15T&`27_^%WSg=CG#|)F(qcF#vx<;8kec>HPrUsqc($(+F@V%iM zDO&#kHmvnIaGXC{q^(bkaa3D;v0qV5N1K=J)tqk~pH|wj_3iik5-;{i*I*i5wy)w? zELJ3eY%R6BSuK@OqqvP)3*9c^Wn`K-?gX#8Pcaf^X(Wv#9V|caNneBC*-`j&Nb%Q> zEi`DQ6Qz}wrQy_th@G!hWw(>VGpyt7jU~hRl4eOHcYHS0PmJw;4NYsLogUI{YAeWK zTXuQH-PYM7JCT)d#oA0z1A`(>=kW5DmP2xJ?tUEjy2i-Z+w1z27hxfdO6h3^ zw6@nUM;x+Y)XcDLjTwknl!I7Pz|Wcf?s4~*x~kN1P21i{x2^n_u9|&H;I1Z=VJs&f zQHrwVSe&N~TUTpN@vBbuzKN*y*7iQ~yZ-=!O8hLkStP#k=foQ{WGKcfe+*3!7*V`= zIs|UVATS~LJ2sK!#kY#oKj4s`4IdxbA02#WrtD@akKyeV%AD>Cn4_~(hRfq)pc~>=Vmnqx<);F1~^a%WfZGnB9c<4IHhO&Y0B;L?`c6=+HTruyY&UZ zz9Un+qsQ1PpWKd5mr;(1G@mqaa(-`_H__>@)N=m-!7JvrV)kFOUbP|MhQ07)Hz2x! zl1g}j-N|9g65E)lCCCkm&;I}f-tqmG1*h!;rOh5dSnj+JeQf6(kR*r1*FZ5DP(*zT zFad^7&sN_Zzi6ni2gVNV*N2~Y!hi?`NdRTXCsjXaU)mxt6#QG) zw{QVI81Nx(F@cBhlPTy%2t9}yT%2j)s6x-*ij9?=+h1iT%I7V$>Qz1*@hN+<;vBZN zi{6$C2AlYIalx%Mi*{GKR<)Zw7Jv9B$Hp`A!{V=p*H|O~{vq)Vt8E11Ab2uG$-z5V z0F1>{xEtS>)PLZgKOZ67ZM1I+Ybnl7pX0ko$r(9iU1LkrT&fZY8v(+BlaW}5_JsYR zR1+u0PZ3+MOs9oD8n9kI@GanJ4haj%CpaANGg$u6pB@>ux9thzILXKELlAbMh!>*vfeXV2?(YGKC&pCfc>yPv0szC6P#Yd^ z*mw4yQHXp2aUy~n{zjjNBO{zf1l}+JeAqjJF~}xKB;*~b{yuzvjDkKhc)nHcKj9Vl zVxVJSCvor*Vy6I%x85XfA#fmX+Arh!1t;SNit&)4Tf-j=a2t#q4*@irfgJ+{Oe=cV0fXY^!V}7@9n&B1cui`L~Mx4g5&(e9>C?ui+<; zbZI1IPd3v<9w@L)&VgEeQ^IoV`eZ6Y#Ln_um56zbIYSn~>a+ZR`1oWm55=z(%8h_S zXde%)kwL=o_HPG6GjdCO*FPy;+k{}oIlW)vcg2lx@7BH{_=@n5%2n-jDAn=;va(v~ zh#5KokiE!1crKWH-ixzQX=!`%sePO6b*r}by|nIod3OzQYpD zS6v-ika}vav}>!m;kUjK)FE<{_*+mzjBIOsuwqq6*oHy!Ga(Eak;pEt>ZMmWczXFr z@_aLMA0QH9feH`ca3zqO@Iff7MqQj0U8B=4Z?)MN8_i02TzuQw2sa!7mK!a|0Fnmc zNMLeD@R}o2)*}F0-p{lTm7dvg$SR-*wIDE7d~FCo0hF_CBhjar(x{SZDd^qpZ7pYX z`d?MHnx?cq=8i*_Mln;IJ*J$^D7AYpf$++D$bsd%6_O_eb%FEGN4gpbaE)s%GrG0FaTUtkVwVm(Z zbK3lI`xwr)`ik28HPAH$)n7-JDIm1b-d{4$7UkGOZ+&sKz*$U1WpL5SBD8U$3q|;q;9W~s)-1ng^J%7Oej(F! zO;&NIe$;;jWSOASBAKrz@+|G{E@krKAX{2XaU`BmfuG9C@pGPghNlcHroOQiDLA&= z6N*xHZZ7w-=DK#ZtgQb4n>ddhnp4TMCtD2&OX~BCqsvhx88uGnO)>t z&L8{|H$&2VU*g}|`qx{slJ5G~Uj3bJ*fI;b5NXz*9V|>SPi<=yF~KBO+H?;T_VR%6 z6-gM!89%)-_)9^W_-Yo`nsP~JH1WX!xV>A1d*Ku}LQW!*Lm`b~3{EqYlt`}_9|8XW z!M5KRJ`8**`1$*PKgNHGeiE{`@vnqGXO{5Yoz{io%xZ&7)&48m&k8|l;V7-tXi;jq zZJov3sIc4}PRZM3@e`X(!V~6|rETn+*(J)q7a-GaEeZQRmwRf#%7bCze-PTbfD4?<1=KsE zAgZY>LXGOAF5y2~3 z(yu$S@W;jy0=NNzX#5UTj3^)uG3Axc7d|c{G_5$K=)+W%y`)pwbY73iw0?;`H_N#{ zd%}44qP)JTUU&CmlXs(SdS6A<{9=p6-aT0XwfO%4`$FmLTX&cL01IE@ND9r8s~g^G z%&c;(RBR|gAxngbm(gy%B>Z}ZMur_L_N(~OX|$%(Hn(G{x~BM*MAsVMhrB^Nqi`%r z%4Cu9rR3T~U#f%Ruly6>e6#942b?D0RX!B>%IE-24q{IM%osCcAG;xeQZfi;f?tWh z@J*}KRl0-W#oC5V!f%0oD7h?G1$qAfg>J;VE)Yt)k180k#&{!L&QX-9DMy;_GE}F1 zBhjvpe?;D?+r-3ihE-BamxQr0DFQoxfL=9$V^YH?BTt9$ssPMBTqy;C zIV?+g{-xqy_$3&S?f6fn+&OHtnm589i<)yTFs#bjXNPP@Af4$E5)d3o8D_!tspi-U zJgQh|CuMZ$)4uW1Su~e>E%nz^Y(Em=XB)?Yvk9keU-lXl-tp^FH1}I--%h9Ih1ZM! z0BS@aU3_Ku+c-U1-{L=rp~)B|6|#ohBxiP4sXKrS+e0pO&y4;$$i7~q@i*gS+lC5V zd_(d4%EynC#=3(mk_vzfL@*?R#{m9{-|L_7O1PK{e}-NyEVuzQ+fR?0Y%92_PyyDo z_!SEhFgB`^$?}!kTz0GCU-%{d315Yu5g!G(O?Ts501&`1KWO-YZ5St$^ADUc#^5%N z`gzu0DM2hNlWl7nD%ZSie|7KI{tLf!bIdhWXTdnyGkQ5s4~C3mwWWV+uT7WE?ELZ6 zwLggN3tsD9IlK%q&3)p365Z~`?Zu75$gDnQ&L6Jee)DbQ<(pTLh`X@9xpGcL#onOq zNGwiTR6jObXe@USJI~);w+D|7$J82 zfaO%GBOGZyA%DR;lo4vkKbu=WPAZv%;L}(M(Yn7ZmKrwO-F&rO?61AH*!YIyPn#q^ zg$sS|Ma<35B!Yg*GBVvlVD`x@YoEB%Qbs$x9V6s`*lC+M2RyBrJAf=Rxo`m(KQKRX zf5Kt^00ih?m49Xr6954~VffGSZZDTS6Tii9GDpr)01B(0E98j?f=?Fz0KqvJlPB!M z<9R}j$7jYLiIXb*@qm{f5Mo>~EI`||5;6Bsk4fXOk+S~DsNI$S0NLd3{nh-sH>>UU zYt2tMsNegf({@+?0A{m(>f74edv9y*yB`d%gtTYQ?}d-@^Te0sS0tWIy_yA5PC(-u z33kbH2Jn}M+vIPHK0DQZ68K)@Ot?ut0(g?jGN=}9GsnI?aD}FdK;qpl;SxsM_eRWx zVo@~8u{LLi@r(Wn%kc9}@Me?yGv9c3z}_kFx@xz-v}MJ|_U^T=+}qCD7KQL8?M{-K z#;tz_pDmhd_w(G(X=SI2v#8rW%Uwkkyq2HQUDUtuN_*KEElXyucW-snVXc!@e7}!rFLG!W0nUN@dU&$dP{U+?CH;v10BS8g)%bDI1Vwx!Fhs{ENqg1IQ6L$oalp+(P6W?+2C`W1hILqwRhG{6W{E zmR|whd@lHn3?mNT41O#4AI1(c8ctx-^;F-ri3L8+%)4K9RbJqD{{W0UAL9=O&m=xL z@K(K{G*0O9>iQMr5EHdo!d{DUZ7AB&9ske39pA9hzp!>Pd_70Q#24SSe;RAm)aDTER;^1n z&u;gc-=(g*r26+-?M`!ch{4`=7$K3N2(6Oe!T|~iV0U2WaR+nfJmm1$NOsF%XK=^w z8Es>b62#$%^3K)izZqeHw3aF>p?KCHN=iu>E0>*4RFSwwTMLlei2$zzoYh8_@jwcY z5Tp_$k=uikFdPB1pxi-aBLE&ndX%9?t=wtTl4)%oTWFoG<7cn=+hfd@C8w=fu3IGa zpIG~;wyfQ}*3YTNUg(|_n6aP2-XFb@a!m4R)>25jvQ$Q<$=)?8RGAW3e{=vPitTSN z_?4w;7C#9-Em_6k?JOj}4t!@M771%SR(BVcT20QgXXNR&a1^+_hVM>-?#5eKWxCU^ z77cR6j;E*DZ2B_G#4+g+-aftX)50GSpk`J@)O=m9_$yhpx9KDn-`Rc`@gA3c0|l8H zRMQz<7B!J~PjKA^k@2I!-VN9Eo9_>N4e?)r@9lL7SYKRf_dYGrX0x?dyLd*cZ2H4# zmRAR4ofP0B+obH}hEgi?Ow@u$N701^Bn z@lD<5hP*Q+--Bn@jD8Eg@b0m7diuS+we8L4g0*c6#8#HK$>48^UKq7DCs18yNw)Cy z^~IK#b#@#0NDjceltowl26p?ph4xwN!>3&!3R zvay2OLGjOrty57l_@dop)I33ZZ9TrPZGUSfk*!((05jq^YQ9^Ft!Pd(`auMcM4rzgDbrX86ftBNZKdE9=7RqD}1*$;E@EKSgc`N zmTa?-s?wsz8*WL1td`MvhCh*jXq^~B#yMu((iIN`g!xfIAIx~2V%n&Gb#Bt4tmz^K z5v0TiCuwWSPudbIP{^{&C93PMQOYT`-K`saEw@#rySwg=dQ_4&#n4Aq0a>|_5$2CEf#q12 z&RIqV_GBSS$w;u<$UuaE!!AJOBhEtnqj&KyCm}#@F|hbrlJ3t}(ynB**R1s`3z+tK z)|#fDb7?$ag2c77$pofA6f16k6)54`cIPk{%*tBSGOF!UfRU91kg7`-jZWT1?xDs( zaw;Acy4TssHj`0mS84LyrtZ?)eJ_62AGd2(-LI-|UXICWxA&9prsTuT*@epz6oSR~ zE^_&92J9BvS-1_50*$P+0!Zz>&}R$-DB9|!UC1&O-?U|jOcJWc00$t*zGeV<0Kp7K z@s}!2D{oIp# zwRdfny4~)U>s@=A#}#<1%c{D*wtTwjYb)E<&s0qIGF&zd!h*^VB%JwyOpHlymwpCY z?iNwd91Dw}#K1G%G07utKnFQ#3+02AC3YE9HWh~Q!Esa?B`g4TAmxc=1oR3y3d^(* z8Hqf6*#7`(O@o8xl>>v71EX~xFl~f^f)^P%Cj?{Ap-QYTCmUMNTj$@0IE+6P7V$0dsyL8BVmkg z05YKDH_E|Kj;;5ON`hDn92|K3zAzXN3x#E2_l^i%+kRa4C!RsOe`)gOR||yH(J1 z)@aho{`T%Wohnf^=9;=$))vM;$m#z8XpbCgzAn7hejwEUqHX{s)wi&m>slAI*tZE3~HrM{^)eNm)*N53``MPsYn{hD_YNS0#EpfD*evrd-N zPPT}Qt8ax~FStCAQB?ADha8 zgzTo|pYt@FY~sGmZLY1hqo+$ckc*zc~bM{vVtmDhjR?KP7@bQBj$> zX?#m9lu^wzjKSTVLca1gfrj$YLlA@q9%+mjGb1A~RUT-3P4>l8l7Psm<&r^7%(z%k znGOSN4p-(XxKZ)9a$>IM14qCpUsMu)? z%>oT;SP@(3I!rc=_KCGi?LI3*EcunT%(LoLaMiIgtNW@{rBYFD?Z%vWos+h@CYF!N z=J;$Y#Mi^&sdD>VMQU_u-&M^~!aUb&Wp#ZM^*smS=fiuijx*dwJYS{wOTjut<(;35 zJ|XM2a<-jksNP8%+jvvLItx9frQ_d-dZaEP(flQ&2xA)s?!Bq#nk0>^$MydJjxTiY zhWd8D;2($I2>eU`01EF*T@q`5hj$)2@P~vh{8y`5+QWMfjelrQ8#UIUb>nST!rohX zr|@QkE%c8M8eUcqd9O(9X?}Icg0_Q`%{hvH>@cQoP!K>R{+{dbTb4}8s zTbmsR!u}2L)y37$y{9ZUdgEKoccwP2d#K*&x0ka?C)=;$`1i)z_lPgNbKq6F~)uq0@66-qVou=67`bDzp zPiG-*Lhq3lH&+t~bGD~VIeR*46%->2B_%f%{He)%zKQ<-8*AH3TPSt zeU^LcRcP&Hy|c8uXr4=TkbQ;+Bd3LNlqu7MXJ+ZRr5h!67P)kcTXN<1R@TvL;bVBO z6Iv0CTD7XwiRE3|i)Ozz~V zWocZbEi1BNBxxXxkCzhpLBI*;l4^Gnkt~NQ!~v3^f&jt|xyi=iz#o`kzFfM!-O)10 z>Pcc*q-;4X%-h?{<%w^bamHT&k~lYF*IrZQzSYLnUoZtAt_eKjaUg?`4>(=9BR^?@ z#8AV+FpW4tyK5Ac-IlLS)%3f49-AK@kHzD$vggEBt6P@d?A)AUz1)7;J3^3Ro!sj-YbGRFZk5i>|`ocn+W(o^afa%oMXPP)Hmds^Vkub3c2{ zHL|^y+Fd2vb)n_Ln{VEXm8|t!TH0M(*86%p-@JWgwvY~a`AHy>K_fW}*90g4oskBMY=(X9c#BPCj4!V&z@P1yN zf;DwU2P%07)P2whBo3U8pb~MONUa-PMP&q*0~sAvbCZ#S!?KZ%4+o4g@JE!JhCK2H zcHods(r`13^cgrkasc2EH0^Z>BLP){_89~aa(aSE6XaPrBIUhdocN1Ra^qQKr>espqp;VHFn;XR_yJyo8LtDdKy!w%+;0b?`v-KO)FZ<&r9ySx~Sxm zNkER;B}+?L-cux}Z|@~l%)&s0W-lV5G)pm%$|7Yz2{moywz#*qoS9>q-Z@oN7KH># z$Hsq^i_)5MX0i>|gZ13T}@eFDt zwX(CeYySW-l1L_&_U6jtN4EQX!dYYZyx)kh)FDM2DXU-H&ag(Qb8#ibwTYEs=Go;$WWQtKZASk9Pqp!Ov*79Pw77OzM{s0& zs1XTNk5F4%c$z2?gY1PTX&M#;&2oiGt^WWOcxS=dCx|t1;ctw-ANb?p+Y1lvD@`iX z!S=oaon3;ov89UY7q-{yZ7slsFQU<`uJ63CBRW(Q3u*kzT==E&BJ#rG$)%UUejJ73 z)2t$&$k%nd+X$3>n#K#ueLC97BY6VNawCo?_s&*WR}d58VX>>u3INkn^dCIUD1Y?}ABXB)F zRZ>@TWaB?af?SU6UAsA7%F4>xEqgm(zfT%%$=l)5DJ!m)-P+b&KNPnv$$cEe?uCIW zp<6Au5OTPD3~&JifC$e*c+Qora(6~pbUU)hKnHf^Kg1400=ZHScqCR#`mE9CVvX6s zV(bWE&gJ<>IAgg)V*{KLcp#qY>jffa0|lHZ*g-B>l73v|9JgSkoQ@A>BM}soQ?qMH zK8sGa^R|lJZ@VTg&vxCc(@s5?!@o_|?)U6TbEfI@t|R@_q!IGSVZh(=k@AokSdGJG z-MkP<1afzlS61(cNRlzQh0bK`STZqhF8SUF&_;j_u!N|`&DenI7x$?HOeQfvNqqWEX00a7W{Ce-y zxU!W!_i_}eBaCz>ZVq=07AK(F)QYzrpjCGKy@3u%!624k4iu4)ykO@96VkH4;{ft9 zKyG*dfIje2NGBgCIpAcPPavLvXOa&b3=R(<6T#>+f--v3Qnt5$jh&La^m<>X>gmo= zwfF1MJK61Z=4fm_CF zMEY;PmtL3dzHg!F(x{-Fl5e86mPtD|v+As$U9>f)x@j14qXg$1fHAZV zG<5Rh=aG)Uh8sZ1KYShzR|Af%?0Hr)5;ONn3w&8UG2WAwxHy2K_G2R zmLLOwa83a{srmtfh;DUNxgdg}K>!hq;Pk-8*1_G5GBeIbD~WrCkb(gu79e2(2N^g7 zlY{aRv;mA~r8RCD3Bf#qFhg<4KE*-fuVa8XIkj7BOV-|2-SxJbt$zb`iRRrWA0@ut zR=$g5uYEh6{++0ZCftpj0zhJOf*+vacjcJp=Gu71d9JHQ@syU=@ql+JV5fg{P#9-w z9QWIWbAUil2~*^@w?w{41xn-RVaLmY2>=Xba7Q^K99FiOa)SGL02LsG=KzHn+lF3* z?+PEIV~m13@RjAw6r|RvD>k-kqS5@cz4g?o)r_K)d19Qb_18{SweGg=n@gkL?F|P~ zk5!CJrzZ&6P(Uw*`LIi>1<4IHkWCM`d8<`juAxXwVZ5Y78 zC2~$r*x>3p#U|U?x3>JY*H>+~*QL)kqS{HV^?LbPUwbVzev0hp{6nRGX+XydPRsRh?U1GWyrN~k+dNCk?wP)0xikVxo$ht@6OHzcm(!yUx#3K>@l zNFl!NH*eZ=+kswts6!Z?iBQPo2q4i5xl(|Fo(#xg7AF~= zThB<>a&9lXURv8!pG~#fvB1TotWqh?;xNQE)&cS`3V^}61d>Qr!CW1{E}hg-#~w1P zv;aoYow>#s05BUra{#V*IL<82jwH&AACwX^fHtUB;QXKt0V}uyJ7XByim({SAP~TU z3F-+ybYlT~>#+ykmRFq%Ywc6LF+Fw_tu6NTX z{PGI`2w+Aq!zVd7$R8jr!)GG}YMaNlVu(QmbJVXm%P1j$I4kH^XwOmt&Ajc}SR5`( z6Wo)~SQ^SMdEDtKn(G2yViw|CBPK)~Q}&euxoo3ECMSvxH{zMXY? z9ngGM%qsAOLydwn8To)6Isl;Ou0=fD zAURNRi~v=S0D+DVCj^p7;G7UJ1vLKvy!Y2moh-H9`a6BwGwV@yc7p4yJkrxkw`R1r zZrbZyUWfTceGdm4K;Rw9K*=O+!32*&O;HmTBw%zH8Dere;A0?ge(vQXoD6eV{Nx<; zByRrzXQnW7*c^Zh4s*Bzi;%(!=WbUZ=LCAlpI`01fKg#WI*4v!IMI&$*4S)f|vu8QUDhL_q0mwZ@dR3IOl;CV7akyby z__4TWa<6O>pkR!Q@(-iEjf7|ZS>O($M94Yrc8m}LfzJSwoScg6boC@{Om*sVM?sCL zw17$HBP3(4+;^70;3B%BeFK`gp4O|@%!d1-53ui`k?*49^gTKDLe zT{>T;uuG-zZZ1mGlU9D@IsV5k%Zl29(@6lgw*G=ir z-)k$QacgF_vt>iik2WS&9zhIFG6Z9D2K(41N5~3ug?t&ce-UZVYao?ZOu0cEpvYxi zGAW{oKnEsPMNoj`mJ5u451`3;ZyQ_c4S0c!PMh-+h29w>T*V&;WTb_WBzI*2L2T`V zMet<)De(@qtgfSOme$u^8fjFxmFHV{AZy4&#QR*w4YS71qDcJ7ViJh_&OHo%9xjz7 z3qO5nc>El@t@ORO*G=uAS5dpYtgoVX)x}w*vv=r@1{-Zobu79zs7D7P)^oT4k;=v~ zz{w?#IXjmDs!?UELaiauHFBzQ&UE|17SI^;BEnZE1O{R-ppr&dkFuaP4BxxcELF3d z5hSig?d%B%p?*eJP_ke~K4Jk@ZHs>oHP&WLF3KfG=HgozL5!;5L6%d>60FV%3PQ*X z3{w(Ra=K2MYNEcHXx~R|8fyOlh3)Bs#we@W`)agy(?_H9dY=R~sbLA)EpDM;2qEWi z6o7ETH;s8CI9F4Sa!JiGwJRBMx$c*qHpGkp`);8fFjcRG|BtnA94X7K+2fa1QM zcPH-0Hlbx<36X{sOmnaYfV;8>H1haH*Q*VcoSKhh^>)_w(%aihmG!wa{l@g^9WCzf zWv2Vz&&>H~>K07-l-%0v~G6^RwRnr&&psK$V=El z~{S75L*;S8Rk1>v68>VZLQM#p-P!0*XT=FYMXN zNU8L9AbtFukE`dKUKbHGi+Jw@Cnzd7fUaz;RG zlaO=9OJwAlQ9L;2?h}G~Bc2Z#C!F-hPBV=5uXg_chH%tQ1fLKsat2Aa@O{L954tv) zZ|%uU3@O^6@J>33m-cGBexDKWMn=)#xdGswFuKl3Jrs1w+nn)2%POXuQ%kD0%F*-F zOW%EOzOCANEo0NH-pj8~FGIkL*6ew?Q-hJV7d-RWgPuS+2Rw}S%gfvFMa!J@#7q|i zAL87+U<{H#0DyYex=s5vU&H}F5+VbRPlaZT^28jhdaE(yFdr)dcvHETInDb%-$qDZ zi0E69$AvGL5$?wDfyC-%2XTQ2t6zn1p2EYiEXZ%6kS=+5|6oP&%3xfz=v zj1bVEAQQ+xE(je!H1>jWd7O}VIgT8X2LK^;BLk-4*kFzU&A7kPU?D}+u0r{KWS(0V zDnTv#yeg|5!~mpWy338_)`9O=eVv}GcAJ0=XQfSeg^uDz^o*`ZRwY3tuu0=J+YCdM zm8A4nTHWlG)|S1lo!QzHbAnI&dbUAg z17vbD!N4JnZQ@|q9uLRPAQm0PR4p7vUEHl3P%t$q3&jr(rZZZdabI5I&599hCQGL~Yy!je<~7X)$^ zq_ltdlwA@Ie$bF*JXD2_= zby|1ndyanUdUnzIwZ7e5``^s(K?6{SrcIW!j`<+klZ8+YbI_FM)bvb!BcBi24o(Hw zJn#X!lwbmIGrI?;%EbB_)jVoSgLn(2>drs}gT2a<2N)`C^4t@&Deef!(eeF(W`1yd z+m+)09M1R$J+emb*v>&93iW8}?`NzZ!@AamRwX z{{XKYhn%c;5*zqfp1nhQV?QoIIIZ+-L=HjAv+{Rm8-ex&fwW_BBd`Yxf`ExYPJ4=QUEyIK5XC|5y@lFfOj3FchGT*mbd*;es-wC9}|h(1LOgK7brT zpn=e2;W#)afq+N{kVzOQ*aTxa1j=#Mn}Lk(kSW3TC5h?C!0vO5RMvBqlv8T!WZHL1 z`ro#V>GSHFx67w{+hu)yeRS*+pl)_zFh~lhgV&*F>;`f;$?JgB!8`%Dx44mk8QVOB zl>_^+MyxZ1T<16$Bxa_CW0{0@kiFC3Hprlsb^wg>qd4!J01h*rOIExZSBRv}%XYAc z5tDN?8hVeIoS1hk&-{FdNjPO0JPX2MCo44;*H*6o0F`vT@26cp`}0bqV%lw8X|0;o ztrC5Dr|0UP6miI~>|HZZEFHGEmgNq*REZRBNi_y#+!=7cF#~pT7#80Xg>ZtCjh?!<7pk`E z&tENVru(fSB<*WHpUT~>eLd9s?C-YPo~`h<$5hljapHSV3+sAUhwkq@5oM~{-fEh9 z>b53JT|>jr%8hS5rl%tn65U*R(b-){$rPI*G04ilT_1#c{p@xP;=kG}QX+71Z{V*3 z#^C*-U}-|mXVQ^b+sTDP+aeVhMKQ!yzIFYa8u9)p=^AdEcWI_-8n44o8|kZaf27&? zf&`OK{?OFzjm3rBuv$vwX)vEIU8**VSrTCEAMaaVhrbeUblW-g{{W6!#+Z^uAMBnC z@GpY&IASs@iF~)tAH20m+nK(WeGe$G_$T29F~dK^KaP5sKmx}GyKke%wl+K^y|$Gz zMIHkJMZh9Z<=I&XuDTD|SK(H#vRnTE3HbY8IaM=wlg3)?tYcQlW)|}4;S@VLD6R@D zQ!B0rAf(_;WDBQKGrX)q*ll~r6ILc2x?9#{-N0Q?6y z#-|UCHHRZUZQsRT7805JKd)U`+&b>(+F zER4!X5(W}d*n9`l>|+r4KjNRp&jQCD?;cvtkPSlFa;#Y<4yd!-y zWO=I$dd7nrS+vg5A{lP=LzWR>2?v!KeXjgZ@Z&UIKllOS-9E_WlU?{x;!P9c1%<-0 zmlCd(G_P}SYH*DhlK4u*NxfOsktymrpT(aHO(vUcz6J4Zx<}?48`!V3kF`Z2fbp4b z<<;%Pk_J9ln@}pQ@-WE)u#@6sdMj<#{vCM7;Z4{frq#SRs70@Mb;k$J`4;C-DDVYD zRkmpri-`f8nCrTnu@vn6wN%xYD}3qN&sj^FR_LuLw)fF9lBOFECe#wXjw_W}w`H!2 zv%j0yQ&!93ufnZj^yych5-qe1byXR3Uy42t)w~5d23H~}wMe49(JhL3YZ#j3MkO)^ z1mZ&7@zT6Pwn?j7_{SQt>%C01d7OFy1`T zd}C<3W!nOMkXS(nYiZy?*d8f>fy~UoPZ>h;OykmG4mh)J^zcg{ch*(F_9MY{elZus- zS}8|QcUxYnlke|S>1AWdtCe0&!Z(f6R(jt??|xoXwcnlZ(H@@H8+p3ZF71lrCV3tJ zqi@J^QDfM{sX|o!Q(gGcqTJ)f zKeOkCykUj;H7|z#Hn&FDGW(LiHnXX!#*j#=d`Ce&r6mF0C6vvzNLZ*3d8we)M$Em|vpR?*^8G8ttyjG=~i0pr;!e_?%+zb+8ZNYGIx2{!*#u{6!0s$phsR{u<-g92!^TW38 zW4zUGZ|(yK#+{>)d3N%V#BFP)#XOeag~ypZkwqGYCPh{GeCE&M$H0r|$J>59!blG0 z-tWP;Fv8%hm{}v6LY_Hf+z{q$M#Zp6Eb`Z*XulM`1V$Asz9xJ&74RT@U2PD%?$x7?pyV6U4@mkt?>q9G@X{A-gUuDjp zRj0(|-s@Z6b0ouqTf*4|sEFeJR&LKzyh8wE(mGKMUmDvRRX83H<5&(u@ z6HR9x3Mo5Y>ekNRjf;>Z87;W60mFK(hk2uGZyY`h@khhY5<5wShePq#h4l-Oo$OsL z7VhrwHq|afPutN>=^hF2uAi~3^qXNS;g(CNC%ctc9zJ`sI959j##L4wQwpFDL$pyE z2;o^uV4#X1u&D~o@?pSL1eRa|ouHBc!2;y|9`RL}QE{eUAm%_&TZHo4pO!%Zk7}Is z-n*0!Hcqug5F;{PTv}STL6L4RBbG!@nC><IgXoWE70p8B4o0oZy%T`2tQOBMpa2T-4G}bmP;NSz7XweqNef`d(`x zYdA}YbuB_xAVeh)TfNyK2>TA5GedBE$sQ=g-b2G~&I?K9mc(8pxP!u039fuX9uD|b z;dw-c9};{_@x_mwe9;AG8b^ohc1L%2601hGF)q7!vXptW=iBx*{HF28?Z@#;RD$Zm z;kSgmFYrH0xpnh(mc4Hq{6n}!SB!`82Dcj9K_e>2hFv?unpF1X!HVHpIOR`_yiejQ zuMujJ>%K1W2EF3#dQyuvx8hw!_gU8N<4{B}THD;-NhP#$1u(<*hcH?Vn-*B`uN3IY zx4o>L^ltiX(KOz@8nat&j~5ffN|KVJ2KG(8BW*f6y)U)m`rlLam&ZT0=fHg`8<@Nm z;U6A+c+_q7v^tKnb$#&b;mWy4Otae9U5C~0V2$x3T1nwu7DA#!9mFxnC5PjGh#$94 z$NvBoMJ}79_@6=eC!ihCzK8Ih!L*%HSfxe*ZahFPZ@f~=*&aO;vW&I3+3RMB}bag?rx<207rlHZ9d9YXGR7vRI>UMFf*yjr5QJ9?HgI? zZS{@%UBzpq_C9{LcZ;ic?HWz!qTChq^5%PL+?#6X@aJ7qP?l{}+FnmJ)Xg>Th;b_SW?)(+2fIAc|84=N`<6mfTNjzLgoFIKW8t3c983zwI9V>?-OefLmlK^2-7tw zbcwH0?2j(i*F@6)0JMB#a~sL!vAu>}63ffnE~V3gyw>$KulOjZhrSr;b9iI+O86b& zpN2YJ#9maMCGj=ArmL)8NTH)iqtI;s0MNYH!^%YdBGtT7FB$VKv`q>nb}S7lTcsOW zyENq1of2tkw{m@LW5%mn5jiI**-56=+WuF2EoF4B)z@p;jPNh~6T`-Knsk0F`2Fz< z!yf^BGXpf5y`_{<_^ZWsAy?#&R@NHs+rmB`mhh}l#?9ipso;4;GU%;y9JWiXd+~Gj z2>qHKcs>#QEtB?^_>FEhMdKfcmyfD=a>nu*8It}u?{t;XE@ga&?r)=B~G= z&-arovmRDF>kjgH{bw1Qa*m1jE~ zD%-`nGN6!JMLEOrRQ6gwgLOS+l4~m&TGhg-)HM*6wt%Xtv#URt@`Y`nMQt4N4t`RB zlzOh0;2#TU(XIBks4eZ%;zMs79z~!akN}qOERVvj#q#3iTM>w`_3YsIa;0fPbN3?T zuIAfL4J}u?tt(k47Q5eb%dL)zPWPL(iZ;>RCw*E<`&}4Ms|uh!vJ?<1pJZ4u2q4Mw5Y9s z$_ZAkmHc;Or^n>zHV~j#)-{(curAVD_me0%847|mSkx;bua@3paT=brsp}8E_Ud9c zHrSL%VMbL^@}oIO_K*>Frry9~uhY@WFf<~Zp&F8DU){8Hv$}eOpT z80fc2rmX$xyS*OPR(lAA$+?;S?iGsRKtZwj zd;MQp)ya~3pC%)ahamEKNyCY}-9_O}mToc5}?zeX8`}*qdYrDV9ZQ1Fg(%qe`w$8O|G=9D}R&#Q{R9o)0Uym0jI;F9VaFdf?!;Yp)4WYUJ&z z-&MN5mc4K4`+{-RUETC{ySJW=KV5whLTJe0NF*E_?IC_`!~urEz{%t5l0u5=2OJPH zk&pJWPoXC`&IrH9+=MqpvO1^jH%-XoE(rb zoSt#tidd?al1ab2eG<{>*Lz;~*87zdqSmg-t<|;C`fY8tce`&^KHBupg1+FE}vn20lL%N79=#Np%O#{lJX-Q!Wc@wy@0evMkJ|t zz;?rPgfZtJhdoXRBMfkhw19bF!~hEprmIAkR#J)Vt~{pTGRR1c@WgGASMMn*TXsV! zBWX>iJT9!BlZ%{tHl4LwE~`b^>C>*h)-h_!O)dPa;bj(o0uX*&XsB zP$FfLHjITOfMnY&O&ZI&mQAv92p&!aci#>^BlyGNH;L_hVes2kzwoBDXLD_HBoBGUIq)RY-F}$ZGU;DPjY-cFULkmFV&Y)#K;EUFvdK> z$WZN9SrA*ufkGA$GDwW(Wp(* zwu;mHDc{34`l4!fTArJyTe`;n8`YsYZTuE-==yHI;Y%yq*`ML_OushDt31OdsX5?c z`Kn<3?G##ksV93YyK?kxzb~@DW_f0H2-3_{X=5zZF^O7FM%T20c9yB#ySwVtZ07tG zZ|!cZzqGW;o;NUqcda`?;)^T$XGE3s-EzTgZSV9LL?1Jyo}6G3Z-(I9ta0BRjUQgV z@ceMycs|9nYYC!hH4PQ@gx35$t(g^3wNDP;PZSq=RLtex?@G9uNp09i1k-tlY}@o( z#DBBj!av#r!!Z12_)Dzlz6`p%mNajSzYSTed?%vn_kU@YO$+ve_(~zR*FF|%l8bwb zapFxN-RS!4aa{O{-Mnk3nQzzNuZ({Oek*(u@uU!ZU(i#-`i7*}PvM`4{tmX%uY3dJ z*lgt%_qUo}r=&q1i+d!_$sVwl@WHECO*n57Xzse~qPd{rxm<4u>+dIausmkS0N85PLJ+6WlmJn zN&HQ1%XFJo-F~*$y@a-k3rIGiBR|Sn(E`gO<%1VOqi)44%B<0%|H7KiD=(KA6QeE3yzLwKXt&N-{miF>P_FD@mn1_+(yPcsx_Qd5( zf>_!(o$Hm+^!-auw$x?5nmILZ5Zytl_`2!;0CR0M;8_~OPY#!5($~YwJ~Zoe3mkVK zIgrBevbsx%b&Y0NBM91mg&TZ~Tq#zt zw(665wY-yV&t&YHACl=}nm(5p| zg!XMJrN>zY$sSUg}yKB?f#ONFZr3v~#eE+7DI$|c&}Y8ZBeyaAr{Nckyvr{Z>CTGB%@~jG6YjN*R-*~k_B78CN+{k3bUk=LdD)gy&GhVT)L`=W_;Vf6>0bO z54I@mFE){Lf-SB~NP)|U;+EtyMyRAm_IST^cDI_Wj=i>@ufXuV#*J|$^jETK&qmUH zU5=~3z7y0uL-6Lq#F~xVF=;nip1BT>7;Afr@UdR4z1!SEw|{82v0J-~m6is9V44Vg z_1NtsmmVXl_*(Z()vxTeXl-tFGT&%~B)EB@i4kN-+A`MQGX0&P7YrRtOq&;INj-bR z{wdSEBctiw2=Qc>r^5C(H`lrrscU4n7Iv~~lRUSndwpUPQ4x_ezEOK-cp6!NiR_-` zt~v=cH}N*>?GEEZ)Gp#rD$r@yD>PGSHt|EYD~SxVMRJd)qhvjkN+-5xOwb~-H5HssQLW4p#?t8*_Y&J)=@W&TWR7h&Qqq_muXE-I)J5+e1o5xIi~U5| z=nvu#*>lEvwwrmU&uij;66-!J_&cfHTv+P*bdy~ReKz04(A!^WT9mp~t6l1vg|>rv zC9TqZs@hxWQ_1iA39Rysr2VGd9yd37WzD45Hs(Pbr2|YF>M;WZ!rV&!Q>kT^Se-5t zlhkxQW(YpZt!bAUu9NdfAiP5N*89wE&XU^V=Fz;Va}%mp_>bY{ou?lG{{Ue4OT(Hiw}-LlD{t=U1@XohChCD^3eDCo0;?Kmtgp$W&@Ymu3-DnfZ zcrHE}c>c!EUGOfnmtezxXLI4rd2c*F70vupvJ16?NYxC%t~C8tE6CuMKdtl+iC?ns z$1QRlL&a7XpRwQV8lvh=JH^&Fx0n9_1$A*QwIq`mMRV~x~DhG%}uUY>CXnNlGf7YlUC8DB|6lceT3SY+S+^C za_`N}8>M?$CbUfbSNLV|v*CZj4~E_e@k{s%;(zS>sB2yq)ci~F6XIv=XYn)RAH(kq z{0`9Xz9Z^dN5TzrQ}`tx?G>qLKN)nN9(XXptazWs+K9Tq=pvh-xeKw0L=<#?`LL;%Xx74(Gmg7#gwt1n7-uB;5a~_d6jl4vu zcFi%2$A@wUDsq$@smq$I;}-p#oZJ;P?HuDeP73Rm5^dg>E4rUQ>^vh|iYehGDOXX9 zxg!`#NzHQowHtEYNhi%T)sxoNk@xPO`*nOiVY<`yQShdlBAvms--s8sp^z?GMK=Ec z4r5=HSTm?Qg0@4p;`Qh{H|^sDDt^K6M#jc9B#2YuW~VOPnHO;TUxAe(ky%(K*N=AQ z!y#>_^NQcY({4o?y{z70jhD>7igsm`ksPE&8xtJ+U7>W4vm|n;X#%1rLu=uQt_TYH zWb9asJ;;*a29cu;A|!?JAz2niD!Y8WsEw9}KMGtw!;PhSf{>;J9P6uNNs=Mpw}t`Kf()3Wh_=lKNfFQSKP1sD{nA? zjoB!2ti?kQ-oHm_`+Mov%Bg$sp5kD~g|hgmpv+_$+!jCW?+oY=q=bydE-v5%5W&9S zf6nV4hJGx$NaME`E(+syzLzcPl`pswEiI#mINoF18>5BYy_lI7+jQUAPvTwPogK%U zX=Ktyj$*sFx3LixB}gi_H$*N25u0{lwB=jxk2f&M{5`?PpV~%^SEiM5lU&NyZ7Iob zeQuNdPk#-A;|zOKg&t_#J$|bj>aC=%_Uik3-|Brw_LcZQ;!AM8DE*wiC&U0<_ZmIV z!G9ANOEx#e*1r(b%tFeHg>4LnoJJc4y!QLYKeB!7WXYp^dhn5y=2cIJ*3uLJ##%Wc z(PY(a-2`W>B#e-J*;Rp0AAi{2#>? zC1qtsx=B7(n{wy$+toeKqr>GqTZc;cXw7KvDbkbLHc3TAF4{D-^E%4c~3&r%s@5>&I67MD#V=_h}8qMCbOt@XX#wf4{WO8)?54MQ>NpSIWSHLlx8 z8_ct?(tLN}Xl7RVT}xw9zA5uqV z?~nF!%5pa``vZ7?Fo2<@wkM!@v2+bJU=?C8 zBXS8~rN|RkMQi&r{8f;nTX-{5ksE}PJwrwyraG%V+(<}ZN~=P8mUd!EJZiQcQvKd4 z@mA7vjFb3!CuP%Rf5`LkoFNI`RV7tBw`k%e3pSPSw5@dd+t$a}HkQBeNYx@Zz7G5@ zfRHoxuZ5m13@`@|E!Kx4a1}uhCJ03zFaRE=!^6MuNXwmqPldk&qE~O6$>0rk)yM>~ z$Caf+DJy~UuVAHAsap8T57~d>-f=g9ZetvhXVrW*svDe^&aR-3yu{!ZAnrl6!)XuM zqv9-i^Sn1}7H|k}5qM=r@K}}z+Tmc}ZrtbL8$CfyZOg2hX@iJ0L+RZz*x@fQGvG={N!|(VbmDpc1;m5!LLi6YNQ^gTR z1GetJVGxxpcQGRhex5YWd z89m`FT%Rw)q;AvGU9Ga}?tY2E@CW`0H*(6>eg*xRp?1dCU2?+SQMUvAW9u-=i^em! z05AyvEpFR>&!6y337EsD>0bmRZQ~JX{{RtYk7*zR7CT=V$K@6sRaFVg2S&ih=HU1- z<1IKC-@>|@Fu@HFhEl9ZKk~-qgKaFKMp&rJ46tpoFT-CDS`{y&-l!NLNn;ZQ#sF+Y z?nwoTKv1+HGBKL`)cg=vDNm>JGA7<`;qT2q;pRjB|!Ke6p;nld|wrT$W5VebE;N%jvelLmpkQBjK#NQn4W+as(%JH}i#f~^9l2ow3TKs!|hT46rD!+rRqAD4YWwJJ` zIOjRCAxX-WU`S=p%zp5>Y2dvze|9_{r#MnrDY>ym*hvhVKFqEZ@>~UA?f1F`t)q@n zi*cgtt@tF~t{U0*(`VOBq2b0MrR=!ZF@&s~Z0bX-QuuLe-B#UO=c+$tEq`PW*|Si# zSJON$?HSLPEr-Ovh=CZPImFQTxVH=#6<$<=NZJ+6$?@oADA* zyq4=Xiyeqea+^SA=dfe>C*k8|;N2`)&2Vi@*OxbNLhyMc8Rlsg+7YKf&=}&6ml~B#=CFu=w_S03Nj5sro;{Dz*tt70~<54D) zj=EwxtDkeX>?`n4;13RJ!x#m>;XU!tJ4Oxx{@e~Q04Hb%Ip-KHUH<@Jzk+YL{{X^2 ztsxmdFOPh3MotDPtT$kgaskOLxSV;-?}EM_O6+Fv zKZDuML1{cUrOMH~#<;HJCz-y5D%?NwzDsyR+HAS82d3 zG1#1`CAm9~fnTvsoaEg6RnZHE1dHE`+Eh3vIZz_hEgeH=b8T(guvL_tpMaaeJ^%z5 z{0-peU`Yr55seZy;~6Ud0NMEm3IRDJu-JIzuUmM3!&c+{7r{Orj|Yafx6^FMTplqN znsc0e(n^*pGCuWv1`@oKlA4oF*Y}@z-rn=`OKW#MD0pd~(s7+mF3hJVX4kTWEq5K- zsFSyAKK4G$yZCMU6Ra;TpYdzK_Y=ps0UyK#*5zkx76o9{r;xh?^QeqD;7V9vpPM!P zJK^=U)X;c$#@-&gwTWlgExaM9Yu6G&5z4YjZQ=Iw1UM2fXN?L0=B&ULIAYq_5bxoKytLvYD$G_phH+MxpNBX&t{M8}Q%!5_9&^@ehOiJqLpI4I&@evcx`$ z=3zV+f3+XN*yc!PNUdQ=QdNcHFh?89C^5~pH&!@gd`Zim;HbPZj8-NQQ;gNBa=5mq z%><;H+nQQ8XSzQX;?5$=s^poZWk$Ml!c>fuqla*AY0_8ZZnBl{Ze_`7{5ohNBtOe`HS--7J^-MW~Tvi{l@{*7B{={hBh-3DC%maQ4RWWszAe=SYY4 zC3oR(6{LW+rWshXGNf8`S;1gK`4-VL{LC`V@}?IeP5}3KyNT8xHIx<_l-#J(o$TA| zrQhwN4!+)q$%ADV_gN`Px;VbLSILRgMwR<;zdwbtg^Syoq`1&#gUIf(7 zAxk9sY^8E>&NVJj7TT=Iw;YCjvIUv{0B7%tS0^dpjY2V;fbwYYp(MJW_4<-9-bew9 z?FCLiK;V7xbKz_IfPT=EC@L|!>QGbW18&u5vZEMKT;O$ba90*j0ojNB^2B+@Cbnsv za;GQG7p2DKC5nKmP6P3Z_$u66MzcxLP;X15+HX(qT`lz4S-rJisYPMrl2vF%*7sFD zYp-=}8l9f0+sydWNB9TvYCF5hbe{;zW{ng3581!t%8feGe+AE}+S^;)ZDsKvg{|C8F4iqG9cDGU1=yEwm=hYXSscjHdiU)! z;O#c|;ID{c)oe7lllyn!!?V4tGowhK6MPu38O*Sj+FZx;GLneQH|#AVesgLb2k@So zsaY;j0DB`K6?$!0Rte(f!*B`SV$Lq;Ux5Mzb z1Oxv733q~G0Q`&`De)M?u#9Fw8WMJwK%vmGZ`pt2!fjLF8)*n)xK9~)F-gH=hDm%+ zh8;=ZFx!G$ZUf|Lyg%V+<8pj0p{WoVfJ--x!Vupt-31$H-0m@gsxWr$Jj|XS@ZH>u zjp2O+0kp^e021g}l`A1dB1>>olBpvW$`#t}zz-+U!v$V%-JwoN+T7E3vP)a?ee30R zk?1^!6;91#@UAIYC6~=x;df2rp89S1*!w!;_E`A!aHKDSqdECY{{X^Q;KPI%EAt-{ zase!xST+=1LR*J7{3>ROJ`!Ahx=5X+2`?{6632j4Nf8)E_o04kyBQZXAzA%r^)(peZRlCRI# zo*D7Ayv=W`_;XpXW!wTyV`%DSEsi(dLmZp_KzyZ=Kvm=BKp~KqM$oO0A@JUT0W1a< z+6gw4FCykBE#O8$<}7GLKw)znZ0gdET6m$eeA`E-+N!qiG7T3>w@?(71I~`fJ4mO^ zmOnk5J4vH@5jrzJVm zB9qC~?I*OEdGappSV#atyD*i5X_Oe7cb2iprI~*Ft;u5oM`Lcbt23hcc2K>tdB#wxiEgrBpDzfi zkUNhtWc~Ywb^AJWr2hbkhouK(trp~-+VeQHwBGT)`nG(p)v3ico$QvaEm~_%y|laE zri%RZlQ|({w<^zo>K)IP&c%c5Zz-8rZ;ZK)Facn#DCFOGj4`5RH0{e z+{70$2LeT1$XqL{WtO%swar3c6#01wqBZklk(Nb9jEuBcB<)p3Rtos@cS`^bK17#I zDU*-^c_SfId01dwq(BiEqNpY{P_s(KqYiwsgSQPrmpm^*4oR(T%&gkg-K4G6^w!9Q zI%-KOX}c|2N#5~F+FH$}*P^#lqCAnvc7uf{%L-=PQ)n%-jN@EX zBbL{SrkhlyHu-MUqTy>bYriXWR!rgl0N|Jo(*DTWw5_%_hs_u9-e}7JLzQv^6lGN`%mRp>LKr+n81ydDHeE`b z5tFfqV;VB;XCYLT87i`c3^Kcvk~+D8Gx@)U` zdTe0oeh%=p_0rwzpAGygt6#+#k~`atH%_zG)66-Iq17U^OY3%KbtZUk;VBpce8Ct! zyA5ky@cYGK;ctz<7=9Qm7V7r;JlEbo*~8d2K98 z)5SYqSke@^5J_`q<$@SmU0kNr4rEtkE@2K>w$mhR;7G`DvN4mL)y(gEIGydTiVHy$ zny!|!vnjK;x*klH(`k-?iT4Ym9Ke>6aMGTfOAQK=mXWtAy1#b~6k3!#?V~(wPrEC{ zCarb0`XrO&wYSx+Hom&vzSI0`ty~H2b^ic_o-(_e_i|iMrN`j?e&M!89U6>1fQVT0oju|oK#5GxFXOaHTADCGiVI#8A zWMt9q?=%OES%=v!F753iWqru98+4OLopR)&M=Y@d%BVt;3UZbjN<6MfB-(M3y3sFs z5|dl#`C3U`U#Fhps=@PerseT_t}&IbTOJ7a|T-sf6Zqsj4OCTy39D?M> zg<#!Fe4v0-o|}wptr!4YTqy;CMvO{EbH_|D%7OzgQhrqpf$0~T_12&^>v|u7{B@8q zajL*{U0A4M$}RP+0NP0upnx~Mgn>xHh1wl?8@RO3Gk%w(_>04Dw1=~U#I~L;(nbmW z-p>$ek>1A{P;f1t-QrNG6CagFub1PYHlV4_6VlwxRD!aL)@`XI`hM=}>rKxW6N7Z` zH#p8IwRpCr(O$|@dn;M&-%ZY1@kzES!CQZs83hW+eAe>RjnTI03mkF=H!c;(+{UM{ zNegkrmkGIuj!l~;E&_xO=V@gt!jMrPAxfpo(U@aUtVy`F^;aAFb;Rz^JPIjDtPo;>Q+FtUrO}lHiE7MeyvUj_B zY>o;PX;kNng-fnfoUZyt%`5r(Yi+eSYw2$6@9$=?)F-#o^{qPQEkeZ~{R;O`Mz@OA z=6GZtT(f$h>R1YFtqG#Ey+I$c#Fe+5%`m?d`a+q$Ac_1+585&W}Bs4#|-w0 zH18JMH;Z0dQnT8}Yo?D9U28UWHWuvG+O!vzvDn<(-rmb|AKhBIuJ~LQiQ|%3z!{Na z-5ja7@DxYozEy${1BGR9rQgbYS>YcG>T*5ir+uhsS1SaXR-=DmXQ^IU>Y7Q4T~fzN z*CW%CTbu1FOW|&|(3meA+Rd*k+T2FA)|VeYjLNCv<0WMz)%hm`)kM{rzP8b=Rok~l z&KzzPJGPW18Ap~;Z9AnNReN)Fvra8rt3F%0_&@Mh!hR3cEp=}XLpOnSttKrq#aC0o zF0=6i!we^u#^>T+hINT;Eg|P$}3Gn;qQwto>_1H z68MKtOStYd?+bXQ`WPXCZA(sTuL<30(#En!JUVWc-#cH1s8VpNMw}s18YLLoE-RJU zrKP!|(t11VcA4UGNzT)kH@j&<%Uh*+LF;)%URLH!#_d_IS$SuSJRRY07wN*oP>TKZ z>7~_#-VxNHyViVD@b^>EHS0_5Pgc`)OBB;3@i&JiwU<@Yr?AsS&yKt~;b+w4)I2?T zqv>sJ;9r#fFnlu5ybuJ24bm_k?^) zZGUFk7Pz*S=48^YZM7{r&rn;2y7oVXJ~Y>^{8Ik_3j9?Ky^qEX168xqbZegzJmS;h z5%9D(Q|R6b@h!x+wousk&q2Q$UH<@pJY#6q+O(RThLfd>*(VlLY8@Aj^a;E};jb6I zg>8E-zo+RwDxUtv{{Ts{w7v0;jp3a|v|k+Q`sSglSoxOU6TByRX8tAA2A6MU-X_x^ z(KV~+x#P+3>*2qQZKv^0mEqU7g5p^xZ9d+8TFyILsAFc-H2F02zDRtC zXFp~p+Dm*ryQq>CMwR$Kh(8XreFsm|uC!e)CB2&B?&)BX>Um^qT|!G;D$NltH%%g2 z>Uxw79{&K{MqqS#CW<#my$|4~yKATTPsbX~+)33(D9f>lDtKxf^Oq}>X{}qerG8Z2sa^U2xj;t0T=HvF zt3~NPXvM3?-sP3$O<7r5=``C(^>*rFx5K{!XwcZf4~L-CCeSUzO>sT3bE#?(!!5nj zUc~ZA4eH)9i?Fx5po&>g!2yddzc+Z-!51DDO+Qr)=jqq?T7{X6fV0_ZmVyZ`Z6(1% z$g6c6u*n=t7+B_ntF$IbKIgNFSS_|ZaI_Z^8<`q*3aXI?iBjcNCUD6i`DBh|^PKKd zvBDy@@{fwzCYvwAUm0K8f-k%=t^6{+2x61X7Tzs?8d=_7tf8ZV+B=KudvPMCnLNn) zWQ!`=$G+gtxO)eO!Z|2LoT9zXSSa&2#xGWy=5|`e?3U<^J!-zvF>-QJ<+`)vyKs(< zO4=!2>APENCVYMNW>+gG$XAdU2;T)%?PPLULjntJ17KhX7&uwvWL63WGC>Fd2kw#; z&gCUZJZA%FY+&NFXS*xVBlDfQ)2^JvZ-s96K|%O=)H@DHvkSoRyH^ z0ssMu{{RbQZppyp0H-zhhHpXBl;W?-udSaiM`fb_0E1)cu(XnJc6Rq$+V@H>*0)7{ zZr4rr{UZ1o@f*c{82y|)A*^VBvyP+VulQH@UNqLcL-BIk<2Q?Z3#0fq!H?qU?yoLERK2u;Jb8C(4epaQqxet5dX(1#UmqCRe$n3*CmtZvwJ(c55@FEw zs|{mDjcsnujVFtA?Q&*1t(S_L#_HyIbj$eGC%@9Jt~HOgyoF`dJk`0rx#e^(6U%Mz z!^N5$9~7qed81wGdKB89!c7nU7AC0=#a&j+>bE+7iu^}vmsef|jCg3u)>f~q-f7pG zfA*Yn_;bSgl25N{F!{Z+UCkBU#CL3L;xNEw7V5Dya{XNtqpgt3aJJnB@6pDf#qtsiLZO({7h;S{d*-(O!c;w;Kk>0zr^sr5Kh zjW1;yj+|!~2th`wq~Pj4RTUReIXya^EV_!@ArUzFlm=M-Rl*FYbl`O=%vDq|LfFnp z=dNxA%NCTTcO39TV}=}sZKDJXA3!+T3fGcvC}L7~6*-F}NHMtO;${Q@n+a9G1dww3 zz+nC1`A7#WNdyJXSSSIG3j%`#@J~VW4E;4~n217Hddg6#2WdSL`!=@8rnYImW9Qef zw>}w1k@V)e`!`o^>e{P4ZnX16B}NW#z>E?==O>enfU(aF>M(F>$ejGV6P>3c<<3t) zRGbCN1CXi;;5IReTk+0*Zo`eivBrB1#Eyh9$=pBy8uPisr#S)eSE`H#W00h-&^H1> zBw!JZ*zqc3YGG4xo71h*yL`G@{nhpCmCPw&=T=EynYXRpjon{M@4wG(mg{Y`Ek8`N z`+li>!gOp}>DG}8%a@dol54qlM`K|d25^Zh&2(SqlElERA=`!+H61$JRi4jR&{paR z^(&29^5*9JT}5iLTSG0Kkkai07FTEeUGiPrS|GQQGs*K8>%Refd+=qa!y69<{50?v zz^{c`?Yx?VTGq9$ct-QbzBt#@QHI6M^gcE5o{!?QXDp4U+zVNuz3}a(hk2?C4Le7Q zIb+vi`c6L`_;*YAb3M0<{u_7$#$F-u1e;{>FOR+=Y1)JXOPzen*z}9f0r<;Lwa~Q` z%G+vo=S%aUx1FM$WxS5s{x6fq@x16xohsORvZm^LCr#9ZX4I5anvDI~D{Px;-4=}f z2PNRwilZz;#!^tHN7~7%eDQ@yxV3tblbmF=PBGG%8gfgir`kM02AbM@7YQs@cIab{2EV?BTWGH?A^isMtiCJp z#*?AxG3we)r-h)=8&uHsOYL__@Wz=InPp>rr)l=~nwF|!xH3T{w9rTPm{QW%O81dY zw^PA!7w4zNZE8OXY1S8C3vIp^_%`2NiL~v0KLhxZ=fyhBjnH2{Eje`m02oVo;%x;8 z6FvT=ZGWy=%wn>J4-l&?nsD%)Uh~CXErUrOHStG?JY{R7TFVxX4zH?Q&23?7((Rbo z+Pu=pvAoB7n@N|=bo5R|VPG@_cOy~Xi6 zIV7U5cHPy}y^+#OdzIRtfB`=?4gnbeNwg3#$1KHp1Pl-$Te1n{9P^bUCm;-Py)*KR z;~-?7nC9*E6>t>cm~s_yj0})KEJzr~PDVL7&TPHnA>e{JB$C8(c;pVbBb)<++zeOI zywyfFmrX3&(`$Nb>*t~2TdPgzn|)i+dOn-2b=N~`O-e=wC7b0cRf)p^fSABZ)@87QU;uSTuDs_5#iZ^FApadkG(fz+Vt=OBqUGT?lGu;gtxCk$!O%pT%hml*_~oJQDh zyhuHAH)H}p1Y{5g$T}Yk{51HP;_Xfgbnw6S97YJ{ThAF@>7E7C401;PON~p#b7=NV zCMZ};Wk}h~aWuYU(X72ch&~B?Sn$2{@ec@JYfBZE_KcSv5HR?<);%qwVl^3GLR-lo zv62nai@73>*;JN!lLEOZ=jwA*qh1qnchYhG?_1lZ&s)6_wDS2lD&E4ZQj&_4p~|IZ zmF(?q+O)5(`W|@Bc*_x-@G@{oAc96X1B~SHz}ri_AL1?BzdiaEB;bBsKqD$MBe_{I z<;stO2@#aal_vumiBrKCJ6U<$4h2dbySIGcf!F0720`R6Cye8vAXlS989JP*_xtwu zc6L|m<#nc-9(_tNN%Yr!Z_y`bv-N$w3&GRZo}7-y1Nd+~N#{7=oPkafE(po&Fcgpu z2qOb0Cph3|B&f#FDu7~f^K-x?jN_k|BrZ-50Bs;{$)x-S`9ed-`w6?eV#Ou*FqCoyT?AR zma8S)^V`S1N$qsmuB~m|oFrSMS&?oQInhh4QG7oDvDB}vd`+!u`hAwN@@Zw>Z5?go zxzug#-6pZJlTEpMP`_%lNT7h}_cFc55ZSa@A8lA}G@Cp99^UW65lg8MY*XRl~l zCAP2fx%M{^L!CksoMNMO9U_yIS2K22jBU*=Y`STo^chAH72I9owMpM~B%>>G>&?w% zqh-$nr<|ksBWXPluNEy>l*f?vTN6u+TF|+_E*>A#5$y!&atO0m63)WI`Qpfj%$q^ zTbR<)!%e%6DP?iZd6~KOO!t_?G)oZ-!nn9vRlGTU2imUfldT*8DlIXxA6F z3kCL%XEW#)mR=jw?k%;YOY500qP^5?w5c@fMQaRX^7_|S z@s_JEh^#IpvY$?$!~5|&yh2-f;hO&H&ejKsAerJ=Zdx}g5?P}V-98l1S>9_hYjJpc zLeS^Z*4lUlj<>1Y#Wc`>U=l$+^IU2Z7#Sm(pqAd=OMvTiB6(zp(vIFpr@FniyP7+l zMn;}!c3l!cQNT@*C0BjuK$M%U*CJiJ?rB40it1%~W z;LFG)kO0}q1mmcuX{cJXj7P7;vl!1w#w~4szHbx!sX~ zan5)=<6qBha6mv5<2((kkOL5No&mtdag&e;=BTiA1IlaxkCj;taCWG`C!rphIVA4t zDmU}m_S0<}TfJ@3TKX_a-&Lj6lGAHzrT$6ZZicnw%KJbpag5{=4i^kb?oJLri1J6a zQk-?wl&jQRmRZtvu~UzXOk`aM_SsP@v|Jv@@SNq@s34{Vdc=)CnDfP0K`2|2+% z4>Zzq)bz(ryz+SCgU=%zb>ti;BztE)Z~!MgGlS?k1Z03tGg2w_J#&GB+d1Uq`gNtE zwyVEO>29j+dTFb7Z>tjoA5b!Qz~u3P&mGSM57PCOrHY25e(% zU=O{|85FqBp&S#?`gP<1gVUksA4X#t=y@0?>T%beGI$uz9QF=u`*V;_4Tb7+oc(ix zczki<2#xtDfmCqv>$p<40I46KkdW>`p z<_y85tNDrtazpz~i1s1oh)T{cK|x z7_FmqtOO?18Vy{zx%)9yz*=>1Yx-pix5oz?p9VM!R{9)~$N_uvkhInH_k(Bvj@ z*F6XTbAkps0iG~PIOhZ(WG$ZL=YfI=@7x??jN}hqK*%YT1muu%SaLbqc|3f;;DB&) zbBttWsn1npmDZMf+m`z7_4RjJZfj1OZCc*-(|uOgPp;ltw%zY$OP&uS10-@3>N{9@%b#(*$?GC5ap!4qE`(QaA@C zTl>sP|BNdO!G0R$7AU<9Q5G}o@3uh#znC*12)lu~*vyq31Tx?5Miw!8GQC0*R^ zJOEgNK5e5QkXIqHNFtN@{$4v8@=~qzL z0aC||Dc$oX7y_p(*=F01ly&1dJpGOn5d}>(Ew|MrYpY+c^<>{&RV32aUef7(cYE12 zrSI}Rn(xF|Z@h{*af6mjZX+2&0Lcn6Gswy7j9cFlA1`Pi1>C@ZFbT|KDYS-VCo0=l z?(>$;Jo0T!IZ?RbzVi{D9AIuZWnyu_I5@}5Fa<+#cpX7wzy(Mo5^(t4g4hEq^NeMN z0St$ZiQ_%imF?czZ+mLix3=1LS{S-Y?QhvDzRBv}s@dy%n-_QN;NWmFK@7WyEa6J= zk~ehDbDZ(C6USbB?oP$Y$R{c{XC$!4%t${kI|*;OfIe$8UFQJvfr1Xz87x8CO5uP~ z7=Wq>DxjPi%9iZzIUg`AstL&^Fj!!O+@Or)0zhA(6~R`rl6SY8SKTGMPp$2u*8Sdu zXzLc!PU`Kwled++Yin7y*+xVp;PMM&B#%}K2?Px8B;y0CWaQR-tVT)B?37@^Hwi!oC}-a3FA9Kz&|pQm;{0WJTEyI z86b2xuLh?2X>Hc;b*8%YwceWFOEcD^9#oreTRj%a(a~wO?(VL&ZQjVKCFJvN7yxpl zkgI?)at_{99Gr3q;EpnLXGz$DwT|F2*#7VsC#eG*42&;K9B}JvmgJHTAmxwElen*J z9I?n4!Rg5BEVn@9U=Tsc1moR+3-a;@7+eF+Hh?&%@g~#Lt9q@qYkggvliR(lx>8O$ z$@#n6qSLpNy|wjbQBnX02Lzs=gN_b4Ad$f&1CB{1mn=GS#ySz-B%Zm?LC_8cahzRf z)Mo{O;NXx34geVpR1$J?kPhy8WK>`SFwf!uz&IHo=dLlvcn2gYAXaY6P4&C$`EU2> zs$JhRq`TYEr`xrywY@z=^AER7ed1V=lk%LBa5KR?f;thyf#;@r4ng4d&Pc{j9Pa0U z1`YzMKI!$q#(LzDk;g;Gz&H%OvJe5s-Y1@exeeE+Pi0FVbkoPt5Y&EDy0eYI&>r?P&# z^3=(|Z*I%V&t<23wcW=A4WIOuWA{i~X;|YVlgwy3fI%HOJdB#O zENt5)n(c^hy0&Yyu_vi%5UJn{;OCsEBLkU_#vU!a!rORGMGcI9$Lgpj2OGA)gMorD z4mS|l!CeUA_=Bhr<3_Nv3~{>R@TpKYaARA!Bq2uZfQ0ZsQ<5v|m1)1S-;z>V-=j%y zeQ)>mUnA_K?YnwyX8Lx2E}LkrwzF9TQ@2j?{!n*KG-|$p>=`FNE&_s2B;*2W2}yu_ z=TEmn220AT!6X6!*sP#r9ILiQGm*|{@Slq=PH#L*X=HW5Jg0R@;>XhVsZO@6r28lGBx|_2!IivfXyQ z{{R81a!-A9>u<2Sy zsyc4cN&DY9@22X_X!i5e`NK=R(&o5HS4i{!{-c9ydNnhi2xg0A3oPv4XN8%5F^bR!-6nJvYw*X+$p6|t)so_<; z*SCAiIHlU8vrm9!U|4QPuF2szdW0OORmxj6QoUKLt7&IGMQe7`T{PDYc}c!S6xRHa zPFnKWwvwCD+o$QSlyq-~{tvNXCX?{bM7DJt&EjoV@5Em+ADN`KzM4%u1;z>cEJHlw zu=EWs>Ma@kt8WqLejRL$_P!9%Y%SzC5&;=)Hr7d_EO(EW<^l2L;x^gfw_hIgNv1LQ zf5Up;i09xcU#iCg5CHjY(X{}PfB^`$as0|o;)F&n+WbZRp>>ro_+!JCUKX`}66Lf@ zXo{)N-niA!z(ClT3 z(cVqnTb9Y)Icsb6e|En`By!!#8plu9^-QKk&Gnp+!o`3r#^+F$4jXCCA}1<$9PwIr zvfOEqi8W16!+sruoziOhm8d&G8-p38wzoekfWb`r+agtT;XY)z@YlvYa0T&)#O&jxJjbHTI)_Z{eLf zMgWq0xfb(Lb>+#~sXGKyf*G){`%1i(<3*_GM6`DA*K^UeUyPp(bX9M(d`V44O`wQ8JEUCQF&ls@=fl?0Jg~(Ii0` zU?eK>kCi}VPgL~ees+^wzk<=60Q;N!EwDGP56BfI@F&MjcW?Y99~m^= z9y60Awv%qgXonk=L89rJWu%M%Uy*K)yM5w5kNYGfd6Vkz0uJ6unX$+j-<<9soQT}G z-U9hduDUilYTl4E=GAo&fH9IQNuxwkWXUtP+2D;8x3OsfOe<~#1kTdKVdj&Z+i!H` z%C4-nNk;1ZJoIkL{dC~8N;h`zdpB;4-p_qsORdkEtUqTD4c$aex#K^HJ~)s9U3AzX z@b!rSfhzB;$*jmwHc4X9fJQ)Fz@EQP{hxjo=-^2&!(*w*8*tt$@z$q1D}q|~ov8(W#Te>L5$^g0w{WRu<*Br z^wYOU@b`rD)`y8|G05KBDsWgSclOd5@r$V+Gni$AQbkia7 zqXq@PmR4e^wQQ|qxRA34L`YenM0S-_1GpXr%Uu1aJYgd~m*5`=d_1)Xk&FKT8tMjn z$cc+$u&|0nxbsnAB$>1iElDVOV6`lt2R@e9RzpV^F|2qpBt4nK$Ex>s+QrTp^-3CfV{i|zgz zg}gT+wuz?rd&4%7;ZBp`Jts%-m5h<5cSm(Ti)CwndP1(^_g9xw5wMp85d8J=n3<;) zPMjjsyJ^j}Z!cz(>fPkMUZ+fOlefE)fkAT1hZHs(vzzKYJ^?w>hhKyH4xU_FL?5&sOy6ufIoa*Qb@Q ztJv*tr1PxdfQ9h?eTah17Hvu>6Bv&)JJZMj0^xI7%mR>W6qpf2AKgKZNveU zvKm`+Ga+1%0g$?#yyUPYxEpbb<7e?6qc-5I2JB}l0V9AmgbI4+0Jh%QBh@`^ES;9bDs?J5H!bdx zOS*lV{FkRsQ=d`Nbk*5)t;p)CKXqXZor{n#SLBKUS;%D}jBB(Eaz`As*Ne0?eU_Rv z)%%CsB-QmvrTIWO32$iyzDCst=3+P`0vi>@c@eP7K^#Gqw>0-fg5z*tRT%<|5>?8n z>h5;s!nMVnp~GIq87$4V-qEFS89-oI#=roioJfCwz8H|p=hw~DZ3s9Sw5G$O)ouJyLaMkT3I}#@+^>qPbSvdJ72tolXF25 zTroLT%iJktQU*w1`1V^P)a9B?7dEUn?~}|d6mF21(dCeU#2w7eHl3^(5Ge`G!x@*( zXp}60qyV9eDP7=@BLJo_2^-`j#!f>uojApDeKIfyY%VfY%wzXs%O`2wjIadfYdeHY zxeDG@T*uoqoVlL7yxUo%(puZmt$Hq~-j*NP%_OaT8*$&^Y3ZZacWWO+e$1o~j{Xe} zHu?HT#0y*<=+2S&M_al;z_N)sLf{4ijpG{?m-TWeytwm%a~=jWjo{!b9ocLaH~`== zY!INTen|e#P9XU0@ZjwLwB9kcKXYq6&w_kMY^jtWe(|>9On~n@KpS#DUW$_foSd*A z4B>IOlY&N6fB*r8M)t!pn(4qbCf@%0Qf=PN#x3izX+OhL*uu$bn^%sBt35QeytMpx zzOI*%o-nvM1R>;ta7ZKO89fd+U@k`?sPX|LDuX!Mc-_g#Q-{GLlaPA0eo`@4!VHtJ zq5HcO?I59I6sQX(GCZ^;7k2@hJ64_|7(XBbExU2tjljzhgOUpED<;r~00lU&VzeTl zwsu=-*3GNv{QB(Pw>q6JXLY95{2jHm^xoE1*VjD6k>r8~0mjzIAP_n+1mku?VR>E- zafp1fKm;i*fD;S=EC&mPF_Bu<-dyZJ-t4#^x?G|s^zV%q2=YciB*dEzSoxS`fYa7 z=$8F0XXk!`_BV~KuaZw)H@(|>?PS{Dy7KGa3&@uSeQU(UmCKciZ8J-OVhxarrU4wT zP+%woF&WRA(q*&P!tohZtf0Eod2P>gZ6%y;3mx8DksC;$hEUNBq$vy!5m&KVX&3UU zPp5ceL->CbnR}n@ZARVgTJ=4C#{>lT^6Z zd|kLMEcJWD({yNx;|(5*r&;OtGav*UUt8WWTn{jY%}@56Da%2+@Y??%`{Dlpg?vH3?A{)lS>t`LKZos_Skfj@3`zjnvBZv%p$Z5JtAz?M7>pMNcz_a?JQ0Q6APdL? zZwrhZ{J@S+JQt{*XBwJvt!-DcP0l{Ee3B-d*w-tpOe{ZiAR^WCTH z{{W>+5-*K@A$X_7&9OtPqwE>Ef!8b7;sIPQD5Kfm0a4^u@TI6MvebFgn z&>j?jcoTzBHMNX~{w6Tnsc)GNQ9OZ&-L+m$BUR&Pbu^EqVjMw4i!D@Y=O7F~uIW|mBlLzu)I6Qc;ol8jxCNW-UJ~%l`6?S}4rH;KLn{%G-ein+$i;q5 zr_xwQ5ndxW%Y;=}Cf6E)Bum9jq5H#d92(CqgdmLuAu&j;&j(ceU;PGm>~}OI}KMPWNz)tZ9uVDul^E5=MsZMu zKWk-X)Kiby+eM|;(dM%}`jzRz@K=)2S}7&dM<>3oOKEkj_ddJv9gl$j0B1-eZw~&` z-Zjx>vXOkhhq?}{ZR2UBnIzoM&!Ah}Sm@eoDgFGdt4*dO0Af~>Vj`{+TK@oogM3uE zwtX+bHd;4^tb!OVJWt}=QR7b)l7OUFF~?b;iEcw9Vo@ZxC{(ybGRS<1Ve<;pQK3p)%|^-)a@F$LbMmCD`#8NXcVh*QsY)`8 zYfh9M+fkgX?vqW+OKtXD-(NfaHu$OW2jX?oUVKvV{{V@6R`Gea7LoXiTfLi1vX)`A zuA8E1%XMdB8C3(vr@>GZPfjwAZwPKix_l=Dm`6 zuS87j$R203W{sqfyjvDC>mC~Td7|HVn@-Sl*ss1P`14n|g40a!zlF5TSH-%O<=BZM ziq<=OJ8A6i83>J8E$%0HV}Z*oQH74at!uY1+gp4O@MwP!_*Uakm1MGuQSsf+gRQj9i*az1X=v1(X(>t%Z( zRZSB?wU<-Y9JiH-Wx7-QqFF&O+-eS0gZUQQi$;F6_(}T-d|vp2rvCuKSE=}T{5|j# zN%q}G#-2FTQ$%Zf9EEF}nKd7>M{N_FsFDZ_@?4U#dB!m;J+l7U{{XXB?DxLY_CWob zZ1sN4wNm>W~nt`-^9L#wp*HW$|TNOtC7DYx)H zi(l|je~teD5iK7<@OtSV2s|PsQ*WmDP6(yeN+NBJ2{prMZ19rnzs=HYGngR89goVTK)DhsaBmk`^qlL z?)Pg&bls(E^ipfdUqe3f=Tp@#C)71-+ndYFw=-Pb>Nhi7-rY*X11!@{@=H9YAeWJu z&jg>C68l>j?&L`AY-YNUvV~A2n=#Y&#G!>frE{aP6qa+)cR3 zZ<*QKURhb+O+I}LWzRJiH>!HZ*0t@jSJwSnZFW~Wi|-q1dYWTPfY?E>C}9hgK^pDI z$%+WoNH_tRW6zcp1xBt`X$+DXH5pCphD@gGg*bDQg^B?pvBozea9aZ`PHE1sbm#j) z;IS0P?NP^&IN zFxrSPxe7jVqYl|z=B$^tabaYZ*br56ZV4c`&fkzoT&W`nqk5?<2_R?AshA{^Z*9|h z+R19(kA9C$t)bBft0!$0wMzEW@LktUTIpnw9wG#jXA6usl@P!rhK(J(#YF{ios2Sa zcQZ1)`TdfuEduo?k zYM)i;?rl!#+R0g2URUXTFVj`BcDKyCCE~#md%_bv8TTBP+*MSvg2ZKTRD>Y>&B4xW zx~1k?*Mj_oD8bqg23cs`Q}@4Z&*$;!{rP?K5i7}%29;JM8IGJ zI3$x@#+Pjm_H+_jM6rjBS(%e0mM0{Dc`cH1#Bz3lfDLd{ldCrfq`k!K@6WF-w0n9k zolWB8)~`)=ZQn%geI4zp{OrsqH0?s*19dB)`^8dM$r%}6kwWL7<;ltUmm#Z7G>tw5 zCE2BQB$CoQpO~;X8-d3;!-Zac_olIiclolRaHj`u(}Gxola>b@5C9(_B=Vs?$cJy4 zl1M5tSm%xi9dHR8k@Ew_0@q*E{nqTSYwfn(H`eR%ved!0n)xQJt9o?R{N4Mfsm`=M zPJU20jCq91d}c>1DK8GI{}nxOc%E z1IloElflM1j0~x4gk=AAiHNypvkqu+1OPWO5?QnuRb zd)@c7uDw&$rF*2)xj+yxjPN^0_QlvVn`>2E3}R< zcVh$$DLDXQeaAQ?=RDx!01|p*Be)n|4td8ExL&vbZ7eXLV7ArH0Slg?h#+M~Msg~g z)RI=Sve#azJv6sRW$Wst`R&(xYi~}y?$(cOs7V7UW&v0XoE#9@z$6TiLB>H-$iX{$ zRr@Vg^1y(9e*py~x0G&2iTRQ=R^1x!9Jxh8e(=MM#q--s9zJ3GAQ6Tj@CQ9PYxwE1 zR`Rz~6}6VNAKEmzE$!YRnQW!nCBP`I$-GNENL0AmzI(3dqeqfyBS|r5h{EoXt=)|A zFa}r}Xyje1B1-I8iB^qFL8A)IJTB29CM6GuVm@G=Ib^rGh?5&eA82432XcjVILhuS zbMq0&*m`?U5Jz8a*-}tSh8K4*UP6uv?oe$ zrL}iWJ6lHVx4*pClju!Ka-}6W-YzX(-R_>9ZLQxe_1z<@_;vAD$Das%Ne_(4tU1Fq_v*sLGf3G?#0EW=8tr-Ecdn=g{GyX-rW6|iyJGXitazV zJZt+~{5tr*`!;yX!TuQVWxvCpikkiJhg-zI3(_aoehlhT!L8{HdGRmczMrgIk?@no z7WOu`8h*Q?*-v#0x-O}zN2E+_BDsf8{P4fi);U%OU`$blw*-QoN69Qt6tS~J@i26m zWk!-d1g!Dy<2CKClHx0`o;$dmOmjyeNz|^;0c9%l5UbIF-nnAUypiMMI5P)|#6uTF z#+D+TNYsr=c3Q>3#WiN6(@S*yS?pkQ>X>NGjaf>i8O6p>-pScHLtQ1S>1)}$=+91f zn#`R$RD=6PZT|q#o@5eQURzG8guygZiIrtkWN>4;k~@Wso(X1FGc}Yp2)aJc93fJ*2O%i9zmsF zPOS(K#)}JDP2|F$+n~09r<3|KqkhAB2aP@*_*cgN00O^hZ97@MyU^_0#4F-065PsU6_1UyjTUsbl4-7dt6e_lRg==jX7uuy(ZlB#Qj$@H zctTQKsYUZjQL^cMWz)#$rIftUPI*ncJ&zO8p*(#PA6qncBxv zSmYZB*slt(b_y44h@pf1@Psz^Bsa^sM^j_stLt|Qt5_}Uds#f|d7ddoBPy8y6m6xW z4S^dt2Q3;g6rMl$dGSl(2Bi*@@qfVjj(~5T>OC`Dwp&ZT4{K|0HZJb;KNVcW)9%A)0%5B__G3QWA|NrTd8F1OX}#p;(fLe5ArY^k>6H8Bxofi5Q6Y zU~%{yRAW;KiG^6nyIQ5vSBkx^)L%<)zstbJ<@oFrqOElF?p?O zBgwUjMUQeN!i7mmY^;7^F~F;kN`>>eK|>p=uy&Zrk*hx7 z85S~n2{*`goBDpMC578+5eRN42=GL21I;1{09KMFc5@uEB7}{?EYYE6$lfF$K|%9L zILXO1*3JE!+1lD9)%AL<&lYi9yC}U?(`huVd&c)|*=c@Tokfn1d8Ef_rdaCti)p8< z_cz*#*=es8=AkKP)Gs8C`pW+1NdC~JQdwlR0?OXkb3`R}O)0ghEF!u(=8)Qrk(wA+ z#M)H%R`!v?T6K;)-8to+-pnk`^2m>KZ1N-Rme_?6VOr~2e6dbs62UhLwq(gX9&1P! z&RJgJCU!BFEQTQ{g)t4vJY&yIds&j-PPNjkFD4RRf23UL_Uf_Pi)E5INuKG@$^*^h ze&sG_ga{SZX(61)CenqK)TEl(b2qD2NnJa?OKoL)7)i-;w3O3#Z4&u|%UEGfNcZ z(nVE}GBk3sF3qK5D+@)nk=x8g*(aXZL8;p*yVEWsh&wE;W@q~}7ZN&xLfgUS#~jKs z%`8v2f=satv%gEH_|Hwbm29=R;vUWh8#`IQ)k#hH#1zR9odv zZ{o7O^}d?4y>`|0zgN)Xe}y$GE2i|a<+HwxFEp;K?r%$`D?8m;Flhpk84PKK}a=2v;CQF2k9}laj_%>x88N#3q=FdlG8O|P4gvjxd*Qd0{5DRvqr8syJ`cQ> zJ4vB(S>EfznviE(X%z2ouw2G%2Aa`5@t6Bf&wNXnqAD{Q`GHPGIa17o76n6ssU`%ODiMw? z<)??4jQYifp=LL4H@X`Ai&Tp&&L&ACMUH)+F(T?I2696~g%NcYTCJX^=L=?;F6~Ph ztS&ZM>Q=>YOj23S;$#tF$&x(BF5T?gl&PJenq_5cc%NxwiT-uk2xd@lcI5oUh$^|k z3IN+t!ztTU(Q?TveVtpry|la2xzw9UHQM~q*M3!I-K_fCSMxeQ25J5w*R<)|!&>dH z#H~8oDPLxvtB((SNz>tiISNHCg{|EiE3&Lyqg!0u%PRTi6Eu!3=At}ZEtaWqqgh`x znw^=uS^PWWEjoQ0QHE5B)I|)QTvp99De}u0q;`y{h0IWh`||q(Xmqv#T$g)LVQ~@fMxs!SNTvR(>qfA_*Gn)*eh6 zwWFxSa~)RIQsUj!5E-D5+KCVdZXKa^gcHN6bnN+{^!JxNNI0b%tKB$0pS{bUln@HuC& zxb3Ms4>7D5ow5@=pI(Ld9~Qfk)bJDgleYn#}0Xr6sFE+&;^ z@~0Yw;l@(3RK+{o~3ON&@w65B}&;ZU+k z9>|}}3iDgd51)KW(nrHvEi1*p4?J0`Y4K`O-s!iRH0;ii!*CW!WoTc|j%!Q96GuEV zEb&Z{{{XF(6x*K<6NXWYsw-5ATD887JGE{{($}_{TVyocr3Ef%tEYGHrFCm{yLxE< z04;r6;8(~00NN+^d%R6I;l86iw}thqTY-1*kK(EgXW_23Yk3l&OBppgt9?EOzc()^ zxVO}FbhvelU0+{Xmw|s>{to{D!9so&YTg;OxA>>3{7n6nyjfy&+dCGz(yu-t{?7By zE#>vAUFh$l_(#S1$Aebp$XQ2mquY2S>AHTWEyeU2?wjUaTIwHBG0yuU3HQ|-6Y_$lRTD!B=En4xeES1cV z+O{5gCXF(zR(j3mm8`9%m?3wD+U9%D2kLhkfr2}Wi%We->GrRvh1Ekw z!qy2aBhxv(kJcd7+#_XWD6U>;y*warw6-AGf6u;Hn~sikHWtRKWcq@!^`6BKJUXmF7S`bE|2j~;RW~X`{Un-OJ;3k zc;MCbPY(Ex#M8-ps1WeabEbH1`UF^_Yj7?EkwLv-@W=MG)nJQO{{Vz)@8V{d%&TFl z_;XMAYpq)>ZdF>=&JPdh_m;QsI^hsYZ3WsOF+wbC{f|w4Zxi{l|tl%L|y%jX6TJD#ax!PNS`>vQ4T{=l5JwSEm~*UCTr*=fh8ocBgNQ zJ^=hqonvO*DtrZPMbtS^%N^&3uPj9J4>K$wjY18>aALtZ1+&w1cQH@!ug1DN`GigV zx$vLj7J{*>edD@lJc*B%;aQ=P!Z+^Ia2)zYuk9J4JF7+T1NQOo_m!{%p&y9XMio|! ztY$4^Pd1Vu+7w6R$RkB6`~oYi)BgZ#KNMIHG!GGe+CCRV1N|4p-v&G(uSTp802<== zz?XW1?aS^hBko+jcQJWzOBX6uRADr%{haE;5qihr_DZ_Hl(|*z`=6uXvno=w`R4~~ zDMpoK<*a@#c+yEX*}M9l2z+Vq)(#^YOSx4)XTI={jkI?{09-R&THBE7IB;TMf;k&u zM-12P{A=JhWhcX)7P)mRu&0XrQ>02duKlTFY7_2_%JYy4uq=6F^proh55(w|W0&H0 zjSA-qo-F;I+7$qd1DzMc`eqv&3kD%K24Gben_uwQ{{Ry2g0S%)!|hcG05+xYhsJh} zc~SG*{{U#ny%9m(0AH3h`Sz+w!}WYcN6S+np;vu|B?^?lLfR$mhIn{`yvv~62V`A#21_^t5@GDuto0t@?nppI3* zey_Po1D%L|E^0Bds%zgFq4|l5J3k+I-&RltTWY1;_e=_oif{%bViOEcti}6Td_xNV z0J-=#cDxl!pM?G}(!+eq^SqK?z^eFAT2%y=jX^G0nXNDFVdIm;z61TAF3H0-`wdr1 znV70gAZ6B2_S%HXc{Aar*LVI>zeKf==45+gR$JZ&tOH z3bkp=M4z!q-`&;na_hHdaPa(U@#T?Khr}Ni?Qp6V{i(ctsO>hNvKE1>$GH)%G+&5u zT|*uf-~Cbeaq}afQb;9%+qeK3qt2dRh{Z+A6_H`1%h&6eXx`R;YBGA?y4&y8jI+v) zE;+qQP|@04(9_*kzdUrer=E?Te!m<(AY6aP_l^8e(QVG_&jeiG87GDZP+5=yBUR2$g1C#$#k=kY4+ZEx8c;y;sn4M*b- z!n;(BK|7?HF{RwhszN%sj^0NMtCT7Tt_qXFLSD`pRSY{;O{`uPPV1L{axd1;eHFJp zf`(%7DJ(`YV`i<*c}i~n>(M7uSFc5@>ALyA_>$608>E)9G@!V<5z^GoRGmF*^peiiV68iyVb{Vn%011w#I~eXiX3qdQ z-L&rbpW(@XF}Kcz-@w*~&WIIOg@U%zl_hqo@YQjHR>V`JtgjDgPFL0!T+x%aTWs&M zvFu^EiyK`psZpF@v~rT=jh8Flaf-Lk(^P!5HN*?S@Y`E*#1@$toMUSbv{~DhkCYqO z6bcB-FV4}$tlL0-R=cxZ!HPzf>Q+EFbun5y2Uz4Q@{sDR;Eo(u(DUkEB!N7{{fzWo zJUZvh@b|>;0qQP6Z;_VXPYY@Bv`rv&gvjV!!yhc2&iFEGo-Qx7ehB!_!%q19+)qQ#k1e(F9ksg#k6F|c87sEsp~L~oqp{90HSM>S~xf;_S$`p9ESNC8;=gh zDySze01AMGa;(S&PFZ|cyFv-auQH9k9sS$Ax4oLT%ZC{ZRY|EztXvyOy<6z4o3h)Z zevHV6#+Tp$VdAMI0D-;bWX zfp#svB6#uwgHzUY*<%L;TzEEHkkOsXxJhH9+n_EKF5s>MYznwRo=IXb$u(+wHj{Bz zdOoT4OjvX?S%r zq{P!$&VtiXcx93)jJTNfWXtU;0)eqW`d|JL?+mH8kNX!#aD2cKwAgn1p-xV1@U4@T zA%Pg+HY?}f*=tjmTk!Xe?jl<_9Xv;+Td=j#FZ6hK#idC*yIbmZmTxSQ8?Q9nqPj@T zShFjmN%Z`2T!(>L;xxlt;H(KCPy%2O2^lKnjDT`J>ut?`cb~jHYR{3yxU|wrFIc#{ zXtnFn_E$>J^Gw?_#!{_TG_e&e&YXE?CavtL#Xb8g-+SwOwquV9cvmV1g|ueqa+X%P z$RqCuwHW)L0stW6l1k=Z_(eP>2?xTOJ_k7#7MbhQ{ymAnBZJ5TuR)#FW*nVXCBWz{ zVp7-#Bn52t1P*Yx1a;eBGZT@jcFqI}PEK;90!9eQ-QTFlhkMuiEgj1 z=Z^Cn-K+g>x>_{-to3?X+x(u}TT64_@QV0Rj?>|NEk*&#+Q5uB1a!6-=NK$-Fto<- zSA?V({{Vz;%oC18cC2&Lch7H~+yS|81_w?BbogZie`ydhPY^|%5L962ILQa6&Chd? z{{TIPLDe4}z_vmFB%Bkmv7F;Q`hpHCPJNnp*Ih5$x?P>q@Aq@hIL_eLCN~kI_Cj}gz8jzQ{xy=~8=Wue)9P>GF5^ zkK-4@-vMd<2JsfFXQv`fX=x3_Btw~7deDvMh*!FFMV)T|3`#?!QbPTl|n z0g==5wtIJIL5?7efJh_<+NE;KfX4+v0Bt8|P&*p>EULU=2&r~X&f2E;>8{<9zk4J4 zXTsd`8nCbHxS7{ZvgP*EQ*d6+lI2p>Sv1>P>Yr1Fdvlc-C*|pq3FyZo8?%gah3D>* zQHXFxM}DA|A1LlJF@t~)ADLR~UeI+Qk&sRZ$;kmm-xOlyRP*V!DqG&9`3D+mPRH(}v-I*h`3t?O+EvAo5NhsZcRY8h+Ba zUOr$BF`hUjNc>MDr?~>|iEX!E(?$*kqo?HOJHOH*86ceJEr4^AgZFX;XFBvGuBUZn zrTe6wm(kz0p1K}3X^X;33t#s!SEEy2Wvb;@{A{=EyPu^OJ|eU-T|{l}*p;$%Se8&2 zN-hAv+DJ^M3hmj!94f0fBuL{x~~A01!Tx8wLWt!ttFpe5=|$GihVS4N!wL@ zI$xr8Ka9AtmL2f^Wa&K}3C=H_C+?+f8`ULli(8-1-~1cBuK07ofACPx8Ed{Kn^~7h zx&4wpC0osLqxd_;9xl0Q^uLH72d}}0Pxx!$?-J_wwo7eqGNsk!o1?l(B$J!_$YPiK zSCiwH!fVNz;@evB9fGn@Y%hWsr79Y#p88-QeyvFLX4VC;~f5E$t z6|ejhdf!ft;^OT!uYeyLG^=?ROlt`4RF4Gfvaz_5Nmo!}`V&d^wYz1%xv-m6iRQMu zS>OAVYdFy%g`*JdgJ+i-E1)P(8~_U7spRiJ-P{O2OUG_d&8Wq~Ej%SDHzeE9B$8@L zE!x)oG}!p=40NgBWR+^ryrXDRsY{hz`_0Bw=G>&y>f(}Cx4nNWKNdb0ON{usXo!5N zyzq~V?7HQN{{T+#)vzFl_$)9F%06d6YR~bP;Vq6#-agYJP^`?dX}Yoy7k=!AvPQt$ zE;!D39AiGPRnr1BBPs%_u|)(ZB!lL0oyA5*0Rf2N_d?4&xMh-UqyvVURZ<&var?lk zMj2I(05~00tKg?PJoj-*Ua3E`efryVZEw*10-ac;AKz7J+WhmSr^9P<(vMZAGrx1< z{{Y$(;{O1_?Q7vjh^*~AXQFCX4XF4iC7e)dGTl6qc=y8a+ikT=WVmMgVTdVEq&OUd zhd-a!m%k1K%RH90_c6-%k-V^JemIVIXzb-z4*GtVbkku(hDcF_QYx`iHZY&4pR~j> z$MBBI(U_@dLy* z#cuTme=ooh-#J)p?wVCM7J5y@ctdI?-a%`Hid7le=EM453(kVWbEcJ^itUS|+b^#&x|z;k?#bnQKdE*4t0FnaU4{ ziR8uhnIiK_K9OcjY!m`fj^Mi-!VOJ#b@1leZB`>-u&uVTw$Z4%@rA5-xqw{4k;!ok zs2+G-9a(0PTXQQ&tXQY1EYV$D+F9KA+r*M3{-vtJDu2Qi6fYz?J-o6IrhO13o?NCO zv9`#KBWzMpO65U5pQ+qwYySWVcDW<#i7vGylX!Q-OB|x!Io93fYo83e#VRGNOr~if zWOhVER)s`gZ%ZA^B$fUv*(q6VWbT^UI@@hti+^seDx{@o^V-{UR7qObx4QKAWu^D; zbHz0|^jWNJqSJf_r0L@A=Tw#t7wTHSmG)`gBP20KjOy^l$rC{~#1gu)mt_QD%NC;7 z2(cxNipGetMde3u%x3@??nUHt##pMedCW%Ae|aufY3?sA^!v>}!V^B9b2r+w-G1x| zj-#hY5B80Wu5Q1wA52))jN#3#!XnGIQkI3%PcJG>J4`cP7Vx%*b^eiMADMHi_??@} zHlVrVTSR#9V@=AX<0+9cI~|_Y9KtClG_I`O`E_?oq`DZsINpWI+H})x&OJu}YTVHb<}|f^eyjHl$3s^Ov`k(pcGw z1aL5d(%Lf;m2I0@P)Q_i2{Fkmk0$4l_b&Hur0n$FA#S9e_re|>)YHor;@(|DU(;<2$bzZDUg``K5f=Zf3x61zzMCS-1(MCT3HN<8^r8{2@0uolgo6z zF$EN-0cKcbzVaGTBxJR>oxHqLnGmcI%1rlYj8ffPG$L4*=j@RP?U&qJ#h(bGDJ-9} zwv9QI1HC_JKaKXUH11?GENyKWySb3Y@yjS>B3vY3%WTn40c-IK;ANe_Ywy_x9YO); zF}1M$u0B2KUT2stB35XvtnQ!+*3+`S7TrW-BuqreuzR2D6xvESYRNrp{e{!_dP=UB z^U?I|d^KFYy$H%uq~xO2?QOlr+D*qs{WRBe!QS5Q5&;RhMx3yf-av@qu<*vYsK&cvw~{R)?X7_pg6$%W($WiWIjv+{(&BcX z8zs1!+%cX{Y_R>Of8dz9SByL-r+j4a2aUgHO<3z6+8ZtWbMb5Ti}0Iimex9oX}X7w z^jLIhyjkJj3eBuGhpXCwrA9nW1)cttr)m0*fq$vr-v0nSo)_?kh`uv^(O>7N?>H{$&tTk+~?zaBMzf?BQLk2PIOTkv0o{5h-qM$!Hd zHml*SdecbOpTSy;nijJcgKu@Yp^ty<`t<3}OAU#oQk-KsI<%K0pws4+IYy&Zd3j$l zP1(vlG+&ix+)qa=uAri;P0yB4g;-vbi-J+8;q4q`-#bx$@{C_Hw2}Kgd*K~_Oqkl- z=$AIP(C%51LPg_3B5Q}0t%CWHDq4wdo-t;Kmf}Xc5D4T({LcRXg0Wd!LHitO@!g_5 z{jbOG0$*v;6}*mX7;k(N@m4)bCXOXb2V2bBzngpvvKU%R2Xh_hKBM~?{?5M){y+R6 z_;c|W;t%b0`#OHdz76na!w-m-y4IuPUyA++*ZwP9c$>#wA^odtJ}2mY5%^DW8%<`*&A;HT{{XWm!;jf}_7C_$n1^9Ibg1jR>kKnB@!d?{c*NyyPeWhq$X4dtcI9zy& z{%gCLv`8e==0kI>J@3k9{85Um>rk%b7*fcUEn4=%kZvt$rsv&!}b? zI;yQnQk6pmpZmr~PpNi|Od_&-&-w@o)ghU)gx^F@P3g>UU|8qm*mtZB+8j%cU1z5NKa_^t4c z=JIP8J}~?))HO(&(Im3B@fE#=%;!>lntH;QlgKTXPS{yoetan7AM5t_(uF2@pDx14abE%59Zt3Us>r|r;BX0KMGpvHdh{p`)U5spRn(M zJ{I^F;cxsCtK(0{&mBSFZyf6WFuT>hDf}GJd>Q`$3I4a^4R6L;_lf*P;~$Bzj|O~J z)-+ovZN3(GUq<*>KY;X)2i|F(A8kWgxYVCYODq1a9^x!gr3flY5>s$;bZc_*r3rIR zq*H_D)(JF{l5d&aA0LO!-OZ^M{(M9GPTuQJFhv}pfD&3msNCJN%`7g9BnSh_@!KK> zM}j|sA^o$y0em^rKWguc8Z$-lN8<G$PI$`%Y z+A$J|Wa0I;G2d!CL`!TQz^$s>HNjT?$z(*^~{$g4jS*evNO|HIViYM|sh3i$PzOpf=^6r@r;ct;T#~22z92;) zZvgIlpcRK3S78{=0AIW6PNK4NgXMO!lx_U3?K??&CFypL0})a;P8DL6uXQMecM^xD{HmRMOqEtp6y=h(U!Vy`G2kZUW~{CK>0z7 zi!+vVRX^zw0%L5cQU+Oel-xlK&WzF;m+=DQZ<)EbmQqz&oRRW?#Hoyh`F3nBQ2g5% z*0hkRF%AwcZ4Lqw>P6HojioTm;~*<-U%E>$1)d#26v~Hk1wlDdfPshF2pCdCnOqht zw`dBk3X@e@q-5f`lU>qJm04caceSjvzTSsc8l)U$W}0p(tuFfN?C)(X*0*}A-1FN>_hDv8Z~b$?kge5VyMhH5#@*kIsoMviZE3Q zk=Grq9hxSobMiZ_vrew1L2oMJJD@ixjKoM&ypke@G8~xpNh;kLFLlRTIR0^Mq^{nM z*Lzz|r!G1Xl9E?zrPb1DM{N>%+itg3-M=YqRxKuNUTt>L+8sMjZ9`YrVb`s7T}Q#% z_L7=4`MeV9`XpC6$Ajjww$x4LwV>)r_-zljHA^KyEda~;V%-F(k9d|^o=>SD-Rdj+h0eb>6)jCd^w^);w>Y@S`UbI z`C-&WuBT_>Z%Degk*=(-EjJxQOuCNqLzYdp{{Y&gt~+_MT1#t zHrKlLn>1zapULxEy*@1$#J&yCZ5|yL!ahCJb$PxB_>z11Ewq0Ed`Ysl)gNE@ALBC` zM{qnle?8^;_)5!ExOtz$m$K`?W0QCcD0tf=?D#8;8)nupsLI!2!foXw?b`W}~ascM>4&XI8}QC&-~T57%}*DrL zHrF&&x+P|!^=qSi$={hu6)CP{lv-(X#!sW=zL(WouFps}YdHMV;0Cw6_34F=B(|Dtf7>wGYMMG)Y!9gG&>MXzgf{V8NYKB{J-iKc8}45bMWg=! zU}!!Q(Dc=VMze+uR>s;(x$YqT$VuhAh|46uXSu$=nT$sMS=|h-Wb)#7j4VGUd^NT3 zZn^Obz}^J@$AaEXYsCX!No}rtS$LKjjfaH1U#xgOeKLJQjcl!P#)*;pB zv4Ps_PSP~C)35%hl-g=KRo1WeDB!u&0+g;<5^; zp@rSV>ayHHGW(nbQBR&VoGnJtTi=-_cJ9@eER~YJx;1p$@$oTInpU&X%iU>O`Xyx~ z-kYgj%gGscQZybM)FroyTZwG+c#7LPM60PZk8^JnM&e6VSO#RhxwyD^%uv|a&or{B z5u~0c@o&UhYxr*G!q&3KCEeb$W#fN~9wKm8DzUYIl02)zayDWS57G_-XKtKZsh!o$*`6dNS#L0KL?2uYMGK zIJcJG3H)sql{7k4-;4ZFdn_u}J`u2=Pq)zRbxX}T8^xNnkNhKE8`I;n({;IR`#7p_ z#8gzNRZ2R0uH3CH+v&^R*KbwkRVppYoR>9|O7_t!C+@A5m%CiHOIKv?^ACnT5`0PV zfLrehd^gtbwAl-^dadovy`6%@yNQzPR=<5eOjeE}MBrSgStE3GSt61Y_I)$DRPi3Uu>BzZR5yB2XQ!rZ;VH3~dC2Mv>dx0As+7S);a(^W1h@mC&Uswdc;3zWa<~ z_Sb0Wt<}Bv*H5Iw!mW22R3kY`>3f{s^J+TTd&{zVB$mx>yghF{(Y3X;w3A8Dh2#;!WVW?g{@HSW zKK?FvM^4lJBHd_T4>fDw7B`D8rqx%&dS;EUZL_&Dy~UNCjpgsIjZ!%u}8uaEA0J*o{p@5VP;#QqcbV)DahYj<}w zn=P%rt*Rm^ic7O;rum{9guJ=c1a}ZzFP>>X27E`T$tT1Q9r({v(QoxVI%U$dp9|_M z;jJ2dHc4*gPYvk$rmm~v9al@Rc;zd5b$qNN?2qZv0FINc`Km6`cNtm*f@ z8@jsEd_yh9ov!HD_g0#(hi)wH8&j~kwhFR~$1w{(JIzqCz%JRXj4d6?i5Zfix{l{e zxYJItZGB+|sby)Z*j`;&-&@;UX;&h2j{XQ|wT|Oaw|SwO)LdC&)!yE3CTWIt{;^v4 zC*jwHEOl=P_!GdEUlKkoc;89H5NS^biZ6U9moi0ZE~VnVXI^`qEn$k%RD*Q4ad>!K zOKo*)9;GeZcNRToj3@CHwf_JJPlf(Ad_C}Y#NUjc3N)$o9b3d6B=IaBA+(3XUMJNT z#9CCA`V=H+H}hzAk-hcqwW>9(&BmK~X>Vm4DoXd?oMJfot|GGbv|&yurFm4R3et;7 zMx-dT+NJFmCp(p`s=4p~0K`5~k0l&Ls#I<+3Y`koD8V_UC{?Wq>06QWII2-jNv>p_ z*W>>HhqTRK#gg7xcz?s*C-F-xmUj=Ocz;N_xGYxTtu3XV?#(p|y9nZ%_#yuQLznGF z>MK?j?x}V@zxZ$a8T>-mHMCnfoKZT@=P`J0$-um^eKe9C+wsk*?8b^RMnDoo-N5lRUyOzpZORF6e zSZR>mX{xs}T&9hsS;21arX*Jv7k3g(U}8@$7qz{XNEA!qKOVj_d@}I+_)kpu9jkb6 z<3-lF;XOv<$6CItrFh3n(tHW4$hK!i(tImEsRx6u?sZ)n38b3!>@>^0G7V0~#%&W- zp4NHnt^BI_rfr-`G%$2rJ)_b|Ikb{oubbSAd74eGSt&1dquau8&kJzmKDD3b4!^TX zE`%>mGUxYXxheZ<&Du+r(t@XMd&gF}SUwQhd?)cXucP=E;?}>e{ifM1{9)t2hq~v5 z{43#|OTts#Lkw278vL5Zv8Z@XJLtm24flw2({v?!c<*$b5zW+bcy^_wr^B5#dvT=r zt-cC)%IbY1T-0=b71-*~YMvzU)89UgsQ7;B!07Q_E`@sVPj9K*SVe7ev+6e1S2r4L z(pX;e-a7b=@mJz<*g^3t#G03iEVPRR(=^y(xYO-)yEsw>x3w^MZ%2mDMYX+!k~X@% zlEv??u1uFYoR^mbI?#v2)>>YZCV``TJn(*%eKM;yxxV^MV&W+sCb<_A>K9TZ(9Pxp z4Wir63~9Bag=c~}E9f$wAH_++reL8umxG<6n&zh0ES;2Fl4&^U?(1jY z0mcsH3^Rhng1dJG;1EKLV2?vlm9lqpw>ZHJequ&2q^T^!s~nJe=QNuXgSZX}2YVIZ zoPnHxa>F2JcTZebjXYD6T&~Xg+25`1`fQc&t*yS~`#o;;T3IVCbm+cMzOS)rOPkB1 z<;8fh&5g`tG1|mb6NHO9B3Tab14!$f5O$IX`Xk_n#ZLlwZegG|!(9aUzV;>4tUPb6 zYm(hHmaRXV5!L3py2ZYgZ4i+b8yzOfX1clZ%$kHF5?9TEZ6#kW@s`d7JJNXLH&U|$ zv?E6wte7NWnNjwtfCqZrh6&}jHhPA#`hSPc$7!v!fpd90Y6Orf*;_>g+|o)ys!6Ea zBq~pu@+b>jRp`$V87^v;YC5MSrP5AH_LO?r{7pR?X4rbK4OLW1ozhxLF=|@HJ4#8Y z$?T=kwC&&QFOTEK8lHop=zco!MyKPgM@lx@sMW4@4+r1rHky8+6af<6)56Jhdv=i8 zBg(fjUki(9T}1Foq)2>DKOOj=Pt|lU5omrQywjgWvs()reIHhrOR%$&2#vf(!plz@ zbas))6WhspX9itFZhb~enC>MG{{RJiOuz7NgRV5)7f#YO>sy_DZdrUlwsv}%xQZRA zC)r_Hbql*w6P1}-@lxE(sFDVAEZhVWT^5#Kvf2r54q87pF&dWLxmGy?@zZN%4nmE@ zDQ4}-vZ|1T)ks27jN6Ri6&TG*&QFtDB>u~K-sxy{=6ReeDpI97v6WcCRD*o;r^uHl z?^I%@-R)y6b&?J#F0PoD+MsX7|67T3=1HeSY%scH8p+NbD4z zR1$NYr;PAMK?80-imJ^Gq^tAW#6vMIUNiSx65C3Q5^_UjIXEYw#9P?7NCOj;zzBiC zz#&xO_h%&>a4@_U`9)l@gHpb9TO@gl%8`w;LAm9bu(9NoVbe5p-o%WJ!jvS+3&kBO*9O~ z(B7etd2+00F#{}2qEfstjgj)801)$Qa>&HPBV2sU;whtRc_RuW1qdT`bLe^=?Q?=Y~zk0R!q3*j{>qDm> zmrjIJaFSfGo0^h*u6A6lB%EJ0tfb#dOGj#gWdmyCoM7W4C!FVYKm&kq4&DGOnuX;h zNgHsxTW~#boaAwUIO&o}8@mHuE1P#fM3CnNk0qGkD`O|H#zxV>0OW9K%`ZDtB>mop3b?@^HhSdtBo5}UTwfc61859+XE+VQ-~+S* z%0GozWMB??HCyC$+(6s_!6k_wFu*y%Dt7VEgMi(6g;+*N8OK4(a=>H)bI3UdwgJL} z+8wpGU7Jz0u9cI$w6@xL>QcJVw)ei8Ys&szEo&z?F<<0K5^G*V|{P z2aYm-6UfKi^y}B2MtyTlryO&PjBo+#*Pi@iJvqqFQ<`lHUb^Y|#_sz!wwED028h+~#0X&hO-Ns1z9y^6O=Oi!(8Oa$_gNzP1vh`B%Krc+t$nn&%UcI+ zw_EMH+({l-)jrmZcb360N4DX1u-T6wD#-ZSUuaF)AeK9tnjO5{+T92ohYWZe9KB%gegAb=S@4b5w-~I7^Z$F|taZ z?$y<|y4LAg-{#J)=j|F!sz1|Xx!O_LRm&-G7kp+lc@cnaK-}q^WmJ%Zd~0^I5ND0U zq6hukD(z<4plwM2*azANX3rFSKLFJ-NtMQd93{4FjN+LB7~a#Bg! zT&-K(R!ZGt=02w*R1f95Gc{v9iYFlf$EZLb@f=EyoBw=v8 z4@~Vj`_0Zs1%+<2CwQj)TkE$@+xlD3=V><<;;!4~Yh5?%qHjytdb_jK4eG79&pi&@ z2Fo!gEWnn+w*^5foxlJ^X58vqt%_i=`EWR83`r^oPzMC@p5p`@=D8--q-c%_B;iXb z+CsCbTnrL$KtdaE!0*8pVU*2oSda?j5Tu47Tjgd|WgHO8lakpu!8tYkp%jsV}#=KyZN;Pnu+g{{FO zoDcwJV~pfu9AQpz&;{h=42&I1ySLfCouA|7dvvyj_lk{^Yuw)UUuD}()vs-IPS)xx zL9}5&&IdRI@HxvCz}T;-S@tTCUP8OX@&6bzbzOV(}yDtN}x zw<-=mIU8FC1Yy5l21-J9RL95DfC+DZ@;hO^0T@#l=-&0 z(#vJPmYcrsTUjkpb)+8n2fJ_yz{Xo3@=E1+Bpx$?Ox==MxE=A-;5JSOT;rX`cNymc zHCN0zCm>|wuN{f%gpu-+I0TM5W~M@Laxt77WP(oOGr<$3L#=jb`XpRO^~bBqFUfWOf3kTNm@0O|Df z#!fIWK2irm$T{@%a30)}-J6av$8*;lXQ%gbNKL-)&-(c-e7Cn3b9-#6-3y^r|dhP?Z)6{j(W~d!{6P$6J=boUPWbx_1?SLJT>N*_s;~yy(Y51&=s zjFpp;SGP$w(SItsdj9~MK8P0ADTbEP=@2eSnV_|e*C3J}LZIQZf?Ee^!!R4E4gQgB zlW}*T+m&ETUF-IcvH)^2qUdgH0gypbcPLYXUopj_+D_o!E!3O>?=9;)7AKZCh;0mV zO8JG9oCafpdMiH;cuy*BEbgT_#=#}o4tik7v&FL~_`If3(+mM2Jk7~kH2pc7PomZG zKJ9PYP3|bJvPo~!{WWiz@4LGD_C1nsAN)PF2hQiEcw`S0rsG?_8@PBV#a8$SuzpC%mlHuc;)HaUyBRj#msganecJa@w_6j>6@B~O>z2;TqEE@{-M77r1o7vN zuH+xszYY97p(a1p>$g`rgCHw{+kERL-~*5?Ukt$g;G|spf5q)ZztTP+*!XQ7f{1hv z55pOcc1ZH>R@TbsHdJjU?;zuAC|)|a6`La7?OOq|VTuEQxdZpp&lubb1HDzYqYjNH zI}rIu58Eb@i3ce6{$OBB0;VfOje#M8x|62uqqXU{>E8ZZ z?$c`O(Y^b|@v`OqZf3oIJ04{}!q|05lJm#DGVw2n3KNFE)Rr)ysW?M%E~g+2Kq5F~ zh>^?eP)O=De~1474s3`TXM}C+EAvD@iuBa%-L6Oc1Z zzqMjwLo$L{fq&Y3J4Vn^Q<~HFah-2^(MejGsb<^lqt?k3sLM}s-+wKaD_<0n`@H(2 z-0b66qyh^aJqn@{ZJH4K3h>V~FuJkY=U&FzQzOIUg=|gooh8ma#hA_}|6eDDhpyKyUMJ+^T?Z5lrV%mN?h|iejE1psE!@ z1~Z;xMXS@G(rex3N;-S3uKxfgm91^f<4Z*JzgN3Y-P2npuYDGpuIH?3pA&u<=!mx( z*Tj7){&65Hr|58AYf`9PprMOTgxJJLTw+OLRmR34WRZ_G7ssX5)nV`-!;c$y#O~OW zU8?DNTd{sl`$%<0W(-b5lUtIzw~$?e^g0*Aj{s=lKe4_W>6Zma-Epp5CC$#@7_+3> zwawhifT!hx2#DMnQ(}W&jU18eTX=13bhwp{V$)@~xh)xTOlC!o?AGOjV<8Jh%o}D> zxuuKeykiEQi91@(>1f`X+eFj5w_{k-97z!W(cZ;Rh!`-iM&`HJ}3Us9wgQ5oMvqs z!umz@mTodKfp0G~ohsQ5)CIeZ@i?PVm= z-lMa3j`2=0(OUNk*t#-!M#@)JShIA=)E7s4=lYMm*kw8Y^N0^bK ze6QyDsvQ{~xvg#o?0W1r-eQ%SOBi!{EU9=vYkriJ2b&;?MWeh!5N@M1?$drzuE)grh>9sU;InZ zq1ePdpMrEt&3-vBK6DdD1@@MO&O*1^Aqs_1fFo2Cvm7-w%RW`KTWuw$CeBLDJ=dq- z(w{6{-IbND-o9xxv|4m(&i35)%a|dK4fpZd=}JL4)b%a%5rephEONV;DFIsH4&vDv z8`iWl>5=aiw<~!lW&~U57flN`TX7F}C(NOa&^~t=Rw%obWclk%_|dBPk_5T!^ z8gjOiSa`3*F~@I$R6VfqUYi>rRZ`1$Whs%?-AZMWJZok&TqVg$Qfe*Jn|JNll=F8}{{063a?i2HRWRLUN?B0j8QoOd_H-<%xH(CHDtF zqB2=cOW9+BTPwIu=_k_U3eFG~xU{>H72&dS70S2D*b2mCGVJzWg&(u#yYWNAn%9Ud zwXG9Rf*%nLCL^faUm!sps$N~*GK;brCbOvplf{a=xuBbBeOj{5M^j zOZ3>6%a$>6)ijcCqSHsEJyQrH0YKRtctqW;NW548A|{86s>!^QWjhG+oi zKp4L?cG7$+q%jTm6V6Rq_tzo2qGgC-%BeaUQMWX(rROs~9YFIkma2FPh2?Lh*vdYcktM1XmMW z&erj)LFOtx$^ET2r^8&H{t>&i@~!Q(>uWny^B{Yb zW@Tq+b}4p574sMD_8|WNh0XBVR=R@PS+su?EzQ;4(m`(%p9=V{+8J(cZY7EfXhpg} zrKFhxBA1hDd1AP#V=;PjRC>zIM{8YOHFtHh)jR2~&GY?EojTBs)UP-$&8}$ZtoPMk z+qC;5>VFP?$e#MACGg$)Byg_1@pf7MHTc?D9$675v(R<>8~*?R>3X2w z9lS;l21aAJ#G+d}qZxyV@i)c4fu0q*Wbqe{n_9b#7dl77beF~RmuQT0i8YIx%RdcT zmy+h{R!B7)tF#g%G2Mpq7C#f#KWxiQ2I^t(hvA-$;n`Dq!Qw9%$b4<$$tBo{71h18 z@j;>KGDWl}miC&hsE{d)Dy&wpV--@Pyq!sNXq>sUZreRKT4=2F)c2}W!qAIL*d~%( zywRMKv~8nucY9jPR@1xR%D-wmtyfd{_whbmYHQ6;Q`OVKH-=eZj@j7D;C~C>TLiPP ziDHV<3t8>0tnH$X(IK)BCy{F+{hd5U&RG8dwr_84uB@!BR?g-KR^s;E=ZPcJP?&|%_w-bvyD}6HBG=|t9 zTWd`|(#pcwBezRy8(6Jv;*JQSP?`2RW&M;9T;H~rVHD!$YY+xWP;E4o+P;Y-{oCHn=-rckU6T3g&2!1FRm|JIiM?);S6r)Q zYb`X<9;NVqQMa=Auke!c$NeHV_=BR^J@eZ=m7rZqQMS`=W8XZ1rP~Ig@=1v;mkzHo zsO$S<`;R(nC~uAR!Vx5*D;Kd4g=qwjw&C4&jljyn;zHhAY>Y>6rN08Kq}DEVEhAFX zby?-T(X|LKtu;o|B(l-$B(jzpm?lXvuo$kOh{X`Ih#V0om$`*~8owO=H+a*;F}>H0 zykUE16G?xn>E93Zy(_`y-$}QGNvO>Y-kz4X%p!#gM{|25j9HY$B#$CS{_YODqZYYa zT+wOAmg?z6-`>5tyI%I}owB7_#iWy#sasXseUiP^o9$=0`nRm>9vAS!#c|@#7kF#J zFiffC&#vkaM}Kms3W;T*hJ9mEo={p8g3j7m$Xp{hX%!L;R`Xc4Hy#c6d9HYh1}c$w zx8iKGd^hl(!bg{=X}%kcu6%i~#t_rwneYd$^kB)3iq$#wm=Blw2;(dJiZb_IqDby(b@FPh`*?+j~N4~%3> z?E~Uof$;>&OSY+`c*jXuoromHz7e&s4`|~I3(FO|sg_ARxY?r@3l*ExX~vsMDWv4B zE4JhETkB}2d)f70PlBZysW~+!w}O|wXUl6@x95Ijy4jK+4{LX#Dg0^UPqZkFROsFj z(=5Cn;iwek2$tH-?zNl3;~8y7Sh|su=Mlz+BwmWv+Rn-|ZKBx44Y_YIgm&W6CK%<; z*qBWr2X6LB9F<05z?K%Iu{van19*PsC*?z3>JY5MIm7ejPlf_KAdnHb6((&9>a#?X0<ck%wC6k@mpgI`f*2kfd-7RN11drRjB*M!HFDf5J7BlnF2I$*C5r4h0BumD zk%Pw|mCZK)01L&tTit$LFQwAgLrBx*YWnSEzi!W0Z#DR$0uMbi{>cN6P(}wmIAB4@ z;-EM&hTb!RS;7JiH}krxw82!k zM`T=Oly4-07am|#i5Rm-lxavtAtY7Y#+)MWbldH1p1bJuw!TTfn(36G7^Qo5ysp)` zZnbXj%Iz+_i66{=k!~e(ftw3kCX#tEklUvW%(*0?aS2chWan)+$&%c~zSa*8Npm5N z2cAdQb-UM6IlGJRiJlF!4s4Wfs<@fV4_K^}*q z+9Q>XOtRxn2wb$HKR;23ZeJ}6ISzhD_=o#v{2lN#xB6Ft^$l0z&c3lU1o&dg+rmB$ z1mIm--uSBW+UHr;Z5PW&X0p?-EpAl+w$<&;)bfs%Xr!Fto$bort-f87-@dVLOCEh} zWjZo$Q%O6doA;ib6V>->Htv0YV2`Tm38d)O8t%QS%Ge$k(Cp`JVo9A>8z4p7Q-)au1LE9L)yqZbGQS4tX z+60O{s;Ls-svWCO3QczqYnz#Ft(6r*+4(wFoTLsT^X`#mx;t_Ymt-3N5g|fddo4dk z(d{Ee)3j?dIFJ{X<|!|k;t~!w>Jg$1!G_Znt1%7=tjN)``xH2L6H&$0Z)MD+-j-`< zManHZty{lNRD9+mIGsr}zD@3=!9fY&~#Gl#!0O9d327!0`L3qB>T-zTM&3&W%EVQ_b5=DD9m1@=+_lVZk;Z|hR?yn%y zFVMPQJn$ba`>NnDxpWlj$_eSq&f=vet#uUKrz>lsTC44IDB>kmt1I7oCf>VUwPkDF z+UY&@H@**i0{DUPSkE`YFNeu};e8@N-X{3P@kd#*@E^i&2O{m3T|->)Ub}OqX&JXz zroBsOujbUQ-Ao#Gji}5L)cPliG=JEu;S@8$@jv6IjK6Ge9ohtA@c#hd4V~A*{{Vpc zb=9#2bp2oAkBRhHwVi&;d1>1Bz7LTdx8B&bl{(KV)Bq z_c2LlbK&3F%R-;S-Za*<)??&a_|M~BqdueYi^fg25#60v#{*BlVy|(fxPsOwJ_)>* zS?(s5;ry8{WNBua^5O5VrIus9X)Yv1X&PB1EhLQbM$G39OBO8Hp}M}AV~HN-XDR`X zBZ2aO78npJC<7yeT#w;G4t*a%_-m@(?ULd+tYYEhns*OA21|KyB9&4I$IRu>g3O?T zqk=CmB4DAK1Nby_i3jCR#WmN&cAvS(KhhEJKUZ+G2J^LFJ|*QTlJ zn`+uE4=#=%?SRrq#~8|O1e1b3`99$7$vr^t+-M#P)-{O{ZEYAVgcX)ll%N2%S#~K5 zM>vlRNatu7YWB+?26!{WN%ouR7H37y>#w?4WDy)?k#V~U3mg_Ba78heZT|qo1X$Y7 z!`8yq+=7idg^U2WX4+mb><~Ku$g#*7OCxMzr}P|?gED-cnysEzg=(!Q$rpcn-Sv~d zbe8+AP8yi$*5-{kw5+#k>u%a5*4ORwireAeguFW%T==^D-AS}At68}{9^G!$t)-4Q(5X3dRGg&KPVP^ZI;|9RQMR_Vms@Ld zM(WLznauQ{56oRqjqwd@v$^tl< z5t}^7tAmZqNaCQ5P2as6fZzc8H*yOxc9SmXI6p6!x1l5wwP~(I>E)L&UffLJq(g2xf9dDQbcVl}GyoVQ80**_(&uTM00QiV9j-qGo9ZmR2NZ9LWX z)hlS(HZ2H>H?go@zGS5@CIs%uR){%P7$EN|+lsIYxlt`aZlw8|ZG@4ztIoqvEO-q>VBlGoZ>w>8klc9a0 zNo0_!g^b9iQzV;Jff43a0d}gWF`lB+!kYcmLQAV_4+2?A<7l7G)%-^~l1?J9PnHQA z?h$mB)1!_^MHuuw3rCksQ3r=2PYT=0tfnnHPF+J?o-mFXul4)oX$pq`$hNRW5og3U z>WUS6NNj%0?ALH?xGD^{mp5YW;^_-E?T!ZRte|ZfR8x|h)HpcTqgHLYiN+RQ>auS9 zy0>>X>bV%Y%Dx2b*osur*W!4rsK%fB{SST zv~vWwW`ZS@`X~07@WCw2XciV zkG*4#1!L#NOiTb!$$(27i9*I)$e_2&<{vNSEV~HBeE0Dy!`fz(aQfYqtis)!5^h2#NZBaeHFo#qvq`kAb!)e4-s@AcE>eT{ zQq^0v+g8_9ljgndyse`+Uj_I-#2zoV)owIvjVjI?HG(;k`sO$U##NWgSOY;X5s1iX zSRg|pDPXL2sU>0 z_${9G3RO9%LtMEevI2RbZ^ew(`=W%|W=ixm~SdthHC&xUHW1Y4U0N$vE<) zo%L;6(P_p>tJ?1F`t-T;+r~srzbPR)uFwWscJGui3=ZZTgYuJ%439Yg2>vzcKRG~gU&PCH~^EzGBA0-&1r4jhX?Ouk&rhI03hQB1RMt&i0#;L*QaQ= z7+&2h(_1yuP1EnS`kE*6X)jwldi?Fzrlkv;WOMQ<#u#u2a^wN)Py&6f`rTA~I&Ar~7x)^?8 zJTS=YK;RI>fH}t*Ip}+ICY`f>JL5d%P5~YH0Pv^2Mo&@&9$pR!Dhc_B&N0V1AaU5| zw;AS|B-lp38Nm5)8k}NDM&X_TCututk@FVI41#*D z19c<&rZ}fbfZ*fhARLl$)mJ1Hz#F;%dTrx%S@MV=sT=^rU;?M*Q<1v_Fx)ao9Hu$| zJsNP0NVKfon(E%ZowWI0+LW8-P2SyCeQ&M$_1j0(%905Ncsq|zm!1zCw;+&kFbeUL z@~%Z0M%>^6Gn^lp9C47t8*mBFJ61Nc}BgH&XR zNDKi4WtD&gGXOv(h+qbATOjo!^)^$I>jSqYZ9VsSmeR2$pB`i^2@^#jF|g=W zt!9O<^tm46P6Q*{J0zE}$VdVw9$0iNu39u@XoN_K<~z5Rc|#H*FK`{T0k;tV#uQwy zlvT&>$OkL~We8x*ohmySE_C~qz0;;^d&VIiCSTmhtT55YxCta@Yy7e)0fBH;g4d;m z#o{9vsW#)gzOq|u88zg+*0x%7I9(XZN#B;*rKR^;wSQKn&AYclwzr2))RCIb>o-^# zgg|0o5I5gN1;|ATWcg$aS)1;MCvU+1Gx(eEdtYA@{5A1bui?#DJS%p(Ov;veowO3I z+F0uveZiMV*Ywq%5hR*cw`X}}GpWtHNF!C|p}W!bwvH>SbkKE#Rr2Pxc8=ENh{6Ee z26Owd5RuENB*i(*fuA>%Zy~YN<$tyS;yG>_b+)+P2@tfgyq_bnQf5Ul+p`elMywZH z!wXL}q3m%A6=}&@?$=VXO6l3DE|>WprUw~QEuXf-w@Rd4)Re5Gv|8@<@@+jG&)6@8 zU$#fV?~R@sUxwcqbWaQX2l20nFD?Gdc{E?!pRzy1>7_Ots17F3gd@Iv6BD$uUn$3s9i_K2kT$98a zUy&Wun$N*M7zqM=Q1H;Rm2a&q3@_pa)1&iZU1H!#ac%jjePt7gcj?pFJj)cV1Kzp0 z)6pb^{k9}+t*G1LLFHURvPPa@Y5c6If1$n<{?dLe_+M+M_(NaQ;P{j9-^_VG;T_d( zCA8Ia+jDsx&FtO+)TK*{p9<>UX8YN#p|g7%jX~2=n@+pCw6oN0e?6_jnTAze;<7AN zM-@J5n0d-t>jx;OCX~FB*4MLJAA5!3yt^`>@R{x%OPUE&#B#@)GU?4^oOfF7qH|5F zo_(ikaq1zXw78CWVv<88gpp$Y8DVgb2(r0!VDQ9^E5{7^5edXeF^*reXzz~;4(7Ia zgXSHQykN(GY2pAhsB*Ez+WCbK7J#7KDJ*SS?QN?+RNgL9cm2^ z<3*hMj-{mtbia!lRqmN6)D4_hw%SjIJZ&u6wvR5aquiy}iWbjOn)gHa_Ita{DVI;x zb&FZ$vM@#ci>~Rn8YhY2iOb?>ZeA($%|^uuk)f3}yWuQsadm5N4YW)4`5t*zN)+*0 zR91}Rb#*N?YU%Etmv3A0wPt)abClAhdXz0Xa=fWZ9L_R?rJ{_|v(YQG7vy8D%%;jXl2 zR-HVZK2?$#kQvM=ZxrSuB7p?*G-7fY%LRp|m`LlGW|5yOeq^(F8rJUC29qOvGeaZ8 zxmRSV8ag;fnYW$6*eOzo5%#j;SzJx0NVl47junX#z*SKtQqCofqGBDCGbv>YnF9nH zK+ATb_67YXqsMRJ9UALJyiySA)@EDH7U97z?6UbvZF3$AMRf>{0vSB^lsHOP z7Pj|nB)ShI@or&p6Hgt?Y>4g!z0_|Mut|~S$K9kRK+FimTd6e^Xsr|Mn!UW{D`@St zFk-t5(ioyXazrg|)-Vc|n%)VOBWYdcV7sCU(v7sfmrs2ot6yb$ch_?%RB5hnd#k>V z`hBa~{!@0n_1fFJdQ zXR5+jT*L&MFgFHZc?yA-a8gva0ZTAYPd!^6gdn+6(aGC=bAHpy3_^77;?;@W2bmHWw_&7_(@BZ-z9 za#zh2)Lk zwvG}EwwGw8>I1Y&@!Z?W?<6gTW<=Zz5FJ<~qjkkoA=_;f(Mqn%BCK(=Qb!pARZB@c zz%s5KyrCxKkTWEO3M4o78g{87Ni$1lszNaY@JA<@040@-&m3sT&AwK*lt~FPO3aMj zRD(9+?^x2~RMp`(8hUI7{?Zv{i^^T(E$Z<0<<+@$QX(o?NLZ4-b$Z;IJGE!4O{HYD zcD0qCRc&$mzz)4WoteHXG#T#zGg^6yuWTfH zJ&ESHh9+c2uFg5^^+*JeNUF@B18Nmd%3EtI`Hsb;UoaJXlo=)^aMCUgp&MGnUt-SD zh)S8!<&Hv(tg09WScIl8-hdx1%Aj(iyuw4lU26ySNtGW@@bIAsn}^qKj8${<z*6Cj^|L-Z7-~D7VE>>lj}Cxn%qeanW1U(YF0WPtMR6p{{RU0_PlrJLWfP(H0zOb z6@|*(8!>RPiBw#{HN39yAR(iPl0A`vWt^mO`F^+IUlm*UC&m5*`2PUnKLvO*##a9T z2|g?M2VC(Ff;>k8U1**?&}=o>wZow6T08xw-&D{w>kAq5JJq>{XkoOT3rAV)K1boN zTk5psIYCY^w5=T+d0ZR2yS3Aj*}Lk}vbw@$wC7$bomsDiD9SdpQ;KqpRHD*RcXE8P zadJtwdwnhN>Mw?u(RhzR)HT0@zZP`ON5a=OF+7*vD)?pN4*Jwe~fBPF-w$tOE`vUkk{{RIG_+8?EgkJ)rAGAy8{ye_$ zHi6-9i{Aqx@m;rxHLnN!OYr5jrinMiFAd#Cr1+aiKM%eqCA@m(kEefa=$~i1)GVJ? z(wAJm)KW~3jUTel>_2nj{{R(7rGLRSe`0@#9}9eO;h%>e6aE}{k4E@`@q6HpjkVth z_^-h*-bH__T=+-9I>(3nGpjzc9n5+@pWv6%R&6EDp{?o${XX4yv+x)8NBx@r0B3(2 z`2PUn7wq@p4;lW-SDrf1^$!I2@5H|gJ~jMC{h(&?&w%x9b5FX{JQb;EzZ?85b9>?Y ztIbnN(r+&{Eh6dHPt)||x4hJ@tf$p2rToh|&7q5^lU&s0D_(6mB;yZtMiP@&Zq0H< z*=mzbFX-+G;r!Ptg$mTLv8fxy%2Sm-Nx?ZD47`3v{nZJ+?)-rrvaECWzqith3lch$IbZHuEvXob2o?NL4r## z%>ECMx)MV>BX4FUOE1cY=MND4GK*cfYpZ`9_{KQoXK@tz2g9vJqXuPY_l-ltnw%SO zBMKEGkhhs5lOaHvkt6&I9Jl1W?NrDwJ5oS@ab*IPHa z^q~Es{5cAZ-?ZkdFu_y1!rC2^Ghq%vlfYKNWqpifP^dm&cBuixNA{}lEv$-{AGA)f zb+wfm8*$<2WN8<12gtGTn7DXy2ig`qU7|A>L3Up&=ZU@>d`pafqkM3>m9~`4_lNv4 zr|*6CSo}M1cY?=z6%B8&zHd;AJZnw<2Huzh7B5A_0b%&q>gB6)nPsy1x^IX70JM#sk#l!z<9`jyZ3LF{-(6|5YPycC zr`T9tTipfZYe}opE5b-sqh;<81dgj}~ zx>WkEy&3R~x~{L{sUyDAtS$aiGt6?{8RecgH>p#fSf$T9r*DV%dn@v;%Xed|55%&Y zO1427QB7WPrB2Gun{VEljqj^!F;}wD*`It5+PB1V-fFU+80x+*drOFHY zg0JP316y6)+v^&?h3=)khT;{QURdm`?BzGM52nW?RyQ!g4=FG0G2%n0>An)yd;{U* z;#;KqSB5+jsCbjY3GoL}wAJH|b^AYqd<|`>-Cyp3Ep=PLsmq~ST3Os1?MC*=5uE-` zc)mZ|V?opI{2`$J*M26@ZuHOXD9?(nd>` zb))OhLu062Ug}yNovGbe&#DQu{U_u90Es`gZ|!&cK6t~xzX&`>H;FzVTfwAT_`k*9 z3Vdqc4t0Ga<4?nxtRKZ%kBnyc;o*-6_&4LenWp%V%XwjS2Z)~e^o!d!@bum<)h_h7 zyggx_4>7}WBxM}8GOsBrZc2-c;Oa&SGP~6!rp?(V^=;hNzY_5M3p{2P6kys;a9@;`I>C8LYgk4 zX|3IU8)*Lk@K$>!)w~PiO>e`J_%7Q?@V(@p4Sp4TEckW*015v9hxAQCTfIa65$o+E z#5#A!PlX;avYyXa(*DEaJtyL7M7r&+u7^so)pUI=^&LmyzaM_t-w^&R{94w2I(&7~ zH63H)Z-*>&jVIwJi|lRm4<7h8!&+UfgqAjU&}fp);M*%-75qKCZA^F@#x^$hciK;i zyh%Ta=NDJr4%2S6evG>(&MMTEI@w)pGE%gv&a0A@q?2jM+FGRFCG5K0Soq#1P9!{{RI){e-+huXxWw(tm1w9&KyDntzG)pNbYU{0{N-R{9o&;iqK1 z)U=&nMfiU%fo$3tc;L9y8u!EyT}NjPobbzj_7TVYlWD#t{h#b^{4zEF0Eyl?@Mpoh z?O}XHo9zg(W4r0Pzl?sMx)Mxz*x};cdOay?a<5eQF(Nz&d`D zb*yVZA-B`)*G<$Uj@I6N7S$5+SnJ$0uiL-&b-J8e#rs?S%sQGtmk_mu-^5=ASTbF; z?AD%L{npP1*<45V!Xvn`OGhf!KV`POkh8&M{6%=P_OkIm#?KW+d#!k9!5;uTC!pE* zde%P(d;z`Jd>N&~X=gq38m_CL>Ha9S*R5^5U2y@mvhh{^hpqT^HH&>WLuZIZ9I@)Y zS#|K%4~m+Hiac4T=zc%d?{q2j=_a_-Gz}YG@ipa!pQYQ`+_le!wQYX)#hRDeZFK8H zbE@eYuD_*CXyzE#!>@5=6=6#w%wfyTj;NDb+MhCy!^)*EXt|nO%G=$fm67Pn#!3{V zqOw|8mY=;<;#DO$`>IlfIbrHJtG{+JYF4t8p6~q+^l#cfQq)X?!#@&#W?vA_X17$b z@c#gfwE5mRSVARhqo&JsB04R|njv9jwnODY>jZL{U(jtnEc|7>o#s!6z5&;5A()F9 z^xqxcEX@Rr(oXZkFN5c|DB}^vmiJT5HVl$H3QEWRZQcgeEp%Useh2Zyo*1+Eli^Q= zdY_5zekS-o#a|DsH5<88R?@tLxbeN0hO`Z7uXKA2N>(-+mx=VJxzTk9r?1zXrAe{eg5Z$d_&1I z`6^YiIv9G6N-573CpQ+Uu4u*zm%90!Ehd|Bc5OC)Uv~aD@!awQb?~RdNjXw~wpYdQ zLvsSU47zEn;R}eGR7iv}L2)v|V~s}e#nrTJJ~K^id^C^ktri`2HCb0oy|9@to-i}M zIH9@HJpIVPG`9AW!x$)%vawKq7d{;R&;J0jhQ5~fdOo-D&-QH>(U;TY)VxFSCtmPX z@ro00_ZHqPw$^ofN3^s^Zh^eiwLc8nwVab(s-LsQZ2s-=AMC#bnljI(d{6KyFavN`17vH z6kK> z=cwSDTl+h<+-{#VFQUDg>2|NV{C3C1zbSH!TANf{&qq3r~KyGYLB2|R(D>+!xK06q?8#~^>gM{9s{jQ;@0C=9j- z-7HVwE6U>dBk{fC z@Js$7-Az_ugi7hFW9F^4kN4U?Up|T7)RW^#*2@nIYbsAo zT9qkTS#(#n>ziF&t>=Tn_4an3_Xu|m>JAhGhGW)K@kdI)FX0_~Ipi*}rQt{fWkHfWrdJu-JqS20UMAiP@!FOR z@W01om#^K$XYS{U^>mT}w)2-gU&rsIBBKSAO zdNuEcZ}ja-+TQjVV3}_&p+KoA4&|qanNmQ1)w&|EV7mtVG4aIsYw+AFLlwkC5}bs!R4 z?HL$9cQxmCx(lO!qo}3?;%~S}OoaF@}~_ zToc9+GKn{ELns994hbb|pV?Mzxm0|&($lwPb#>)yH|KNTr;o+dlJ;5JO39~XRXg(S z%Ux+}b-!M$^*H_wczWU3jY94wErvc^TMGe(3Z^*QCvOLK-f$QwT+-6M0l=EvH!*9n zh@rZ-xeVHAn1c+F%CVPQhyg6hRYt%UZ~>PMzsIN39vSl50;&}1w^E000LvA(jDf(x zX21-{4%T36K9!}-Ad$48Y|0-JZeqZ%Q@!AfkXQY7COA8ks8(e+96e^zQg-X_wvu+W zmn&cJ+h})Jc-oZao_gY?O+_hCp(L+vp4~Rx+Oto6JpTYgH7gTyeP^g6N{n>r?U_8b z+6a(H9Jd%?WGEDX7zQIbApSmo!F#NN{{X=rKWz?j?Q{DyJEW0>c~|}#ui%_UILovs z@48{Tc~-)>a*7d$(SPuaTS?@wyVZYqS@uJ5c@%&KGsQtgtMHz%b7o{)4H;kGv|fxtW;L_ZA#a*p2y-`ca~2F!&#c8iKkze3tm>` zblQrHq}Rn$R<4)4l4{50fBYNq4f_88!B4&n+gjOPS;KSSkJ z#l@tt%!uzTjg9x3FIdkcmhr2VNhg#0+`iN15*Va+kOCC5z?m3u$~JBYpf1}B9Ad*}6 zk>iH;JNY--iC_B#6YAEmn^}1``yUXn zDd!k?TFKz)t@}x>Qd;|}>s@;*pDW?MMN=@q&a1{kl$5E{_HL4syjy(y-qIGoJ-K;4 z%hlfT{TzEavx4$22*_)91b{|xxx(b`az^6BoxtTljM_?yes%$VZ}kib1mK4Oh++Ud zoF77=us=B=n*G2BQNP=f*6!zEGASfy%-e)eNx&Edj#~!}xR(7s?fvc!LT2jWi6a9f zEV%?RKR3(2oM$C#^Bh)7Hq(twC2MZo-!7K5{&&&$KU$9o){9H)u$GJdTxk9u`gx<( z>AsiP`mgqcveYg<5_qvK;|6s;9cb1@j@mq@i!>Q|o_&#`qAPBYsAUSwp_m45%!#Zu zNtaED?KIfgZf>4*i^RH3svr<*Y{eZK19BwuBVB-o2H~C5nAw-tyioTO=sLB8{$8Eb)?^M3?hd6!V>A2Oz(x~N8%{am| z?G+knt2&PNY2DpjJ1thW?PS%guXKBd(_NCn^Tcm(>*DPt_Aak!6mdw&_Oe_SvrUT1 zHZ+o*jLU(_K?b7?ULQ$x%jJ_x(eLz`0(hfDapv3!SI*pTm5go@DKe^s30<&eCEHqk zHZ}9qC?#b?If)tkvZ%oqnSxEHM3Su^1JQi`|Z7v^-n3oLB;z@a%#%SNnIy*d(>;IT5qST#=nB%RE)m& za-cCYBjj#O1|Do{mQaTbLX2TI0=qCm7f`|}n*ddelSjeac!aYON`Q9;Ir9L{cBbO0YmL=xT3NM83b&O?9-Mtq33DGV2J z-5y<61Z^9LK%n~BPBRXwzG=ZVqrWeB_18@`)91a+%P+xIr0nT8Wh-f}i+;O&)~O@P zWwwm8ay%%$U<^>lB9i|AC}0yFU;`mgp+OjC^8V4}gpW(Yx^9I2E6^j=gbAfdujz@Y zG?6pG4U%44q`rFwQesP4Wb@FxsRsESVt~W~YF%5;9keX*GZx4|bGSOn8E_*{Ik$X; zS7}1Z&mWwkO64^r**fMmT!t)V*kg4nkuLqH@qkJ4gB_r&1V=8CMPFIYdtcEtaoN*YdJIo_~tk9o#-T_=6{jAh6+F=pX18h6$^C2ioBJpDm&KnFJ|%oZ(*7mtOQZOo z#Mj;;w6nYLY-x9EFNo*UrMc5$iXDC9)GjpbcH>gEhV4uj`i-L7>oQrxX!oY~$7TJQ zJa6IUk#!#zJ2)1bEX8PJW zo&v2H^H+qVqXgrBhEh;&KLWQV-n-ePe+O|l4&(CN!xrk$ZW6@TaHy9x*S37KZtY%6 zRQFf2O#GnMJU!v>w|%2f@cpXX$966D-AjK2p;ZzIBxSQUH*(1wEOx5hEUmG8#Sls5 zFPC`BN$|{m3-PtSi=k+`ThDK#-)c`|d#I}_Xk@Z&Ygd+YH~+;a~_`~{{Uq8g6mW{OPh;$ z;`>VJ8ilK3bk=3HTZfy>{{U|}d@XPL7JkusZmHl1Y(SWd`WqHx(&Xubkf5L%YSjB>agjS*B)e2%WrfJ z-zG$twtYT%9@Va7Wb+>h7@pc7Bb}m+o(LmkA&l}m$~>XAFz8vVt!5E>zwFU=mj3{= zC+(T0OK;}tTKB{s*sDv@=aFx2T_u9w_Kxu-*V*kLvypFB;?qaDRDtB$;WGp`SB5wu z@~f+Or4cRWtEZ~P43fkzEiY}SX1k0(oeXUha!Sl?3|?K_F+4)uV_ik9n20msxl*l% zlay2(YE3mKqfwosB^#?dCG$^n!dP0)o0qbv+rFwYly4qX)MaTcuYHrV-D+f8SxOpI zwUT=SDf=@;ZZ0lm-Ep)*8N){G@=DA%1%^Meuoof=WtKR;^!tNAH?k$Rsj1x)5V=k#(b#razSX)c>O*Z2B z%o1I{w0t1=m1FRK$3F~pZ7;=*;r{>w_VLvHW2fCgVmv)%sp&u1X?+E>3*r#V^%UoXqgoU8uu3*^aayfn^xZVAE4z7HV=OHU zOffX1u=P}vNl8Rd<8Z(wRak|PD=|~Ib#I^>`E4}s82EEonmMP5 zKEoo2?_L&Q{{UrWhUz=GT~y0&d2cgWUBL0(+FaaQ%>%aOhk`s?sevw$;n_7%!9Z(S zV;h0<4&@9YECgugK4StjW<%v9n?A1(#2IWUM);aeDP2pREBO|j*Y4kSYv`|kuUHIB zl5U+&ZJv_V-7d=Os=rOP*U!nb<7=D|oISk2<#JdZ%A}KwAYjCS^9(U2GA)4OenG$n zIY10RErGU1I6z6`sW{^+Ubw#tz9qgqzX;x;13RX@(Bf4D;X^d?keLGvs!m-98DS`n zqIjvbF7A8fvt+ zGyJu_*U;>x!`X#POX}5{cD1Osmp3iizt3l~JV}MA18m`nki%|H6a#`m3VMvQDLBao z7%W?|Ea7ESj!7H`7+u-RWZ;(C4i8iFVL=MBT-cj096P`B;({Hl^k^V$A{%5 z7no3sR=W1kz0;1pdM$b_msVW(dmBk7EHy=S7Smj<-<9m-{Wa64r-!&I5xlev9wz`0 z3bHz|JD7d!fI|=q3}DHf#WfUfF?S~5OviTC237emb`r%@6xgoeLEIf#jCrqZf7$;4 z;;)w&e+TIiI!F{izCQ4Am<0!WDVI}<)T>HF@0v}@yx*8 zNYmS#f*MPEd7>BAt#NW%-*YvfirwWA;@s(88u2cb;y(fWLylA6pNMc8D=F4I zDdPSlB@g`%ew6?X;R2TrCHOyeDIqWwX(&tYq9q z^`6U3f)@rb+uW_qnwMCLM$`Evq_QeyZKpVeX%_Xry#`4q2%qI%;WR$nl zR-3ZrvUj>tT-JK(x>)9?N0lcv6w-0gy|n4A(oHpfjxn~Ee~7kk@TKMK zUMcu<;-$XQ^|P)n<8$+dqA_?Jy&M1nWc^&1<>C!R>HEKR@P z+P0J7n@_iC_7`bk;EgLtvDg0765UUy>Aw%IEG_l_01etS_XX}X4O3LN`ybn`WW73+ zrdx-&SGB%S{t^3QX!2>3cn9Jn7Phx#q1L_`c(TeF0z-QRymM;W6mqT15z7~uYkA@* zEaaZr(Z0iDp*)sQT$_l;nqB-szCRAU3-G{ixwlK*M^*73i4DW5>i!b&-KCWN7t$h{ zIDGqYX{F1c&8$Zu62@$FDfcuNF-m?rF3hEsVk^ciK|WNrio0>Nl(oE?YBJgTm)ggP zjHIDaq>@Rub#1N9cH7m*RF>9uO3c0C?+9vtv_Hii1H=AXL!#`|Z_?4OVAG@U_rqTc zlX>DjcTl@65{vy`W9S+j5u)9#(|I;rrAKLRX%&^M z0_NYt_ZONCpNF-bGT!)F=tIHQV%JL1ZFGw*GTTS7j?!H@bxWzD*6zMw{h2h4DZUI} zYcfTD_MeF!BR3v4ywOeVzNMph1H*UgYvCUcJ^q_Eoi>pjuB!}QEwqQjw>nmHDre0aYrt4a5v&;64F5|;--&tMhTGSR%YNx{& z`bLv!pz8DKzuH?-g{^bV*xF@2l0depe;tl@+C&uXC&Ex;~ktThD8(-)eK(*;#mdPqc<BamW%Npz`hlIYs0<h{{l!(9VV z)$XIRyU`)En$J(vn*Q$RO>t>+@{hx%_;=zzhn^hp27~s04tRs&W$oSP#H;@R?Y&1_ zy70G#G&h3dMAG7kbXZ}x(zRPe*E}!b?Ha<%TZ-yUV@qv+QI_V`=Em>vzZCP#eJXIk zP?dUcsFIyXMow0goMzl^n~x-4D_qx?6|asGX4n%1G?O-+15<2`y`5?-0_CW`Lx&pnl_ zvPjGJT^CMOE2rto(JMm*wVkAEgbkZ8^SwpAAEyV9U z7BH>8of=DUf@^&u&f47uooL1pD#s<|;p&zUSX<@~W1 zl^+b=ZtPmBEPh-^kjxi){H8&X$1TfaR&s8&SjMc>)Op~g%Pv_;*KId`U2fZLB+`$Y z#`*3eIn5^pQGHtvQPYGe%2A_uNiJ_^7iZNuSzAREo!k8t{fVw5@UMV8f8)y-@AYpM z>Yh8X@YaTxZF4cZ)Gf4IDYPWNYloHZEVP!@ujieojtGQT&XZhQ{ifRC{*KXXZlaS^ z)$b;NYge*GscO#(+n3bYqO-Qtt~|t#&67@RNIaVjE<%=;ajPY&z_${(`B&k0#4icy ze+>Q_Y5ok-B=E+mrFc)o5cq;A_4n~L?~1%ft9a)A)5KmfTRV#_HajS_YfUf1`aE73 zv4ZLiGfwdIO>=#5AR5KhUx^muXfW- zpRe%NZUeDa4olWs1zwVdSbXvyf4T^GfkKJZqwo;mT&^!l87 z&8618t=+7aJ|KebDRkfMDIV5GyGzJKu?u-bQQ5?I!22XIK@<)S1)6=1+8Fe)9BmQ9 zBF-Jy2QCxK19N3d6Z1$83KA3sJjC|`#%7KiJC|uyL%qZX37n$3w2?y+$nePN=Ay|H zFOj-LQj!i7NoJ)>KtKpr%V(9Hk(x!u@~f5d)mCTU8%W@*G^RK5{{VTwVX0xL(1aJg z3RL6F*0)M4naM@-Ej+Dm?(g}dGsaWI;_($dMyHwnqKl&UG+OO-ymb-UX}b<1@; zsz9A0OuO!J3b)K8V3JC*kT?XgO0G(jV<1(HmWAG@V{egr8{GwFB<=GKS%E05u`nnP zS0*PA&NN6q2q0Yun0~!9H<2CT(p}Vomoq5W*o#Gv!|L^#@j{nF_Kn!S}mnY z=MfcQCeVWo4_~=x<3`a`QH{Now8It$VpQZ7r{ziLS29 zuB=G}r~_{xs)Z$+jDo}g$PLuxi6DYfSFjl55sjp=JOV~>xPWoo6&wsyxrI@ba8%ILIycLBJ!a1YiP6 z@q>y}+k~p1|ON&JR*D2*}1r#z7>EbQu*C6q{N#w|#YA z*1Fxbs5gD><)({dw%1MW+d54?8wk)c$GCtP8CQGY;IRZ}%LJSan=-_<2mz}4-oq0e zs6zq{Krw<3U=)%^LC6H>Cj?@!EE@A`A1IJUSMCr78$7n$FUkQq0Z%*(=HPk30#XIKb`49B1Yk1a!bV zalq&>YnGi=D$>1|PTiNE>3yEzPAV;HXKw4Iwtqcu>Ar=vyX)H-BLHNQ!;(7n$Q%wn zU`;>mV*qEN&ke~PKJutgasA~4V;qu6&I{WcM=Eeh=b+C6B!=Yi!2>>{EFx%VP%}U)(-mk9S-U(KD8&lLKxwhH> zS9^IRl)BBgONQ7rnZvqGcwO4kf;hovP>tD zqB15CSh+&Mkzp*%V;3Uj7tRs3F^!v0klRCVIRx;lor+J`DhL`2*&#JOU?oR;L(N0#b53u}_w za&akUBx8~Ti2xWSe((iA3PW&fY=MbGJb)ap0p2_hn|9*BC?^?G0RA9&B9=>7Z80Qs ziCC3gvC6U*Y%bPiLPjx?P5=XN$-xKG=WCWNTH0ME-$ty~+Uvhlm09Y&<)=5ilfIhT z&##idnP>Z2?2sl*kC%W5I43y65&R^P$j=!kB9Pw2Aj1LZgu*1Lfn6 z+++@LGB63|lmWpR$rv24=mv3)#1ouk5_vq}q0UY)GDbR{NzXjDCf2Y)!f_Nm3cWwZX0p|b`3k;ScgOG9Bl&h1t0zfCG01Tr% z_8Guz^Nb#&AS7wD;N*-I;~Wg1?y$i03^TwW^Tw=qaUwD@hBzT|0SedwM<;TDyKrDZ z>64W$RJF2A-Tdvf?b`Qmee~YecJklLfAcYA8NuoX4{ka1$nHl27(5cd;-g+O+XEvU z9O1s45yw&P2Lh*;2aNH%w@d&z=cvydsRJVe)+Ju}73-_BN?H-y{!A+ zX0>T_Z_R4mz;PS^Fi7c)cgZ~D{c=D&ahwWeKd%Ql$87qXWPdH#<0mBaF_JN#Y;Z?h zfIuYm86&PejY@9%-Tdy|tz^IL?$^_9pfeq__~d^+lppeaex3gS&N_oiLFYYso;w`< z268%Q+o|Be<2+!1ah!c}c<0=4o;W8Io$az-Z?lVbzsk$hNvF5WnN=f5{9=wCV9AhB#IM3cEjDij+xd)v0z))~_1&G078yGzQ01kIxgMe-WuOBu@ z`=h>iEXsNgGCuHO(=?u%a_iGiB&~GS-+w)~D$ld~hwcL>EI1!^HX|mV3QH#G-(@*R2PU9J)CBw?Gz`9F%g7~S!^p`adys(aP^>^MSW6~AWsx@R+r6b} zH@fB2vD#Zg1aX-pd9@2mSkT6yw>{1LwwB?%zzlJX%uJzKi-?TgpW&!9j}O~jL9A$+ zP28LAp@+@XY$Uvrenq@$$t;+K2n{rWOOq%k3Cu7LY$NGlCJ$!F(fT|4~jf)+UAXA;q>sY zhxAv|XO3Ho%`K%%o1+3Q){qrdS=|c>uF_*9(1@W$Na9o+5s@w>j%K);6K@K^h@e}w zk}z6j`CdrFDSRtOGe~x(S==te-+`v(7b!#8zGk^@pENX4cDE{TeKy;7WxhKCuyRqO zijFD^k+!MIl$5O%DoIsWe$ClmXL5Idk;#6!7&sf5juAluG~1joW>gzkb|hAK%7Oxt zdB$Twxa}D`fX7qLa(E>{JkBfXrAnNH{x(OtD>#a7N`BHB8(o9%DZ_ zI3<*X7~^W}<(ZQiY$yX50G#&JirZeQ%c}IUTWkI6dNa(wE47npwwu-2wPmE5clFZR zi!^v2F^KW&w=15(vBK~<8@LCqRWrQ62mp`>$6cX@4+A43J$NLZq>x1k^vth0HCsr0%{a($2>N0PUEz*9D|M*C$>QcJx)$fJl?9>UE8Nye|7I} znkU^A&lhH{?$(X?C;O!epBOC+N@x=(lZpKN$TpZ*c zSoX-=PH>|G5;_<+gd zj4m=sH8Nj3U>(PHRO2UT#@uA6Ba(RB2=+KFRpUGQ^U+S=-7rWwZKMVV00YPblZ+a1 zizTswTXNw_?fGyx%Mb_yW_cJO@!du)_t&G_PLIFN+PC>iPj$bNO?hi~uX$^}yE9fh z_mGg>f*X=~UQXl2MuX1J@u94?r`8tZ>NK+8aAT z7*eF*?qV5&=YmM!9s$pKUm`>E0taH)QJm*!B<{fZP8fhWImSh6&f=DurPt+qUiMn* z-nU+%%_OwL)RF_ z4;`rwKDowuIp-NZxX%ai&qGe<9r4tIxknh!-UJ<^9lPT^Qd7Fx??(0Or>}SEZEbTV z?YnCB@8xfn-d}kC0A8Hr;PuW)18#CSJ(s5hWRMRm9^m!PNIVb#B<%`w(~v%9=m^P? za!y80I2i<>7$oz^=NGfq>s>pozaP5) z047q6`&&nUH*0L2{{Ti+;~lyjVB?Su?!5HtwEKEdj^AEeJG%Af3Qt`00|7=(O$3fI z200|2Is!&9jx+9hWQ=Bv^*L|5$5IyqCm${{2=9!Mj(SoNDgq8i9FR%CJ;yiza8DgM z7zBo^D8yqK$9^y{IPP$9oO*+dWSodd#&gdA1K4Gh^vO6Q1$pH68TnA2pz;YNy*bAu z4Ces!&q2m>vbiNuCue1=TC}@cqF;{t*jsFp*S)^$b^Eq00D2C2!TJC(_p#fYk=%35 z9OomFNI2=+A%N#R9PysOkXX}4BiND2>JCqQ;~n|q139JaPbUPB2;k!w;DEhwPDckA z=|Z12$v^vf1^X>Jf5FjP^YSqM#WH>Q1BDd?-QR6&*YfMCv)g-ZqTKUU1N)l?QI)fK!Z& zobqK~ihdfjI88q8=;NefGOe797iUnsU;tK71~8$35%}ynKOp6#CmmHv`tn?7ARLl5 zl0d=681Gx@?zjtYYNv4LbC+JE94^Ep0CTx8z?_qkYF2NKdMauQODj9%bv??9k>MZ z_ln3*u6BX^KoRnp1Tc(d)_L>%GU`tlCz1CdjSB;kG67x)W16Lm#@3H4s#IF($tOvz zV%lz-T^*hJ8!AyrzEyqgZe`P3d)I4yZDzU}7ZUiRS_L(~8Ee{vFV@|)8KZ@Ua>L4& z;i5U%HvtIbBOS!99c7_-a>aq0MLLX`$opQWI}U_y5!wh*$R$fF4x?@|#}w6|QcN0k zt+ob3G}GNb1muw*5wRI#f}{-Kkhuo*clR)T+sA;Z#vqE)F1Z}MXtDv^Cnzfxq=dPNz`I^0xTKaFMi6pF&zL(|E`ZU@}Y1;a|wL4uZVG&l+ZEY+{uLjRY zK*4sf1*JCZ+m0PenHiYmmd+S<5o-h$ZD-EAU^1fO}R9(4GwE=CFc?VL8tk<_z3_ijkb z;IIUot#(4BQcFa%($33gb!{K6zj*Y$qjb8vTen87)4TjGzK_$qU!{fsED@3p7|8Pu zr9loMY`8qR%8YOr1B2b#YxY+~JgdG}rL;k-?=Fz(Y34JUzNAnK9=b3x7^Ul3ETFSLb+Lo!}4N0@}5auW@?JZe>1OP3S0}+*C6rJ0D6!@IvABaangn_=_!}=t4?i6Hz zF28ejd2B07b1BJO02C0uy9ctp-piHSYw0H+JK5=Et=mZ1JK49gZD{RnxtHY~_dfZ3 zNn(u6eRpN1+NMifUtBCPs)C@L%Oog1`BRyY{Dg@xs>hDi{xEzr(IY2N_=RIBCkEF< zwwG9y&T>(f!EX{iFrdja034hns|EP#+AjfKOqV_?)qGp8$r|ng_Ui8N62s;rEpEt! zggZpMkW{ulb@m+t;wOT9G7xxMz}7p4Khov1)3p1z!m|=h!HWLr!VIxKZ1WyYNBD zSkYJozzy?Ni+_$fSpNW9W2j8{V8yi*bz(OL45HU-Mi0zE0!_(}IZGC)mL7AzHCgM+ zbqP2nXB||Pq_3^pmuqW#zi5+O(!Wb<<+@hWdo`}lvDeyu&Hn%nCzWq}O?~l4;_j}6 z_g;91UA6F@is(A-wuW7ITZ%Hkv#R)x5EVdYgvq`?VA4D_;XejN9DW%1Z}9KHhTcYG zySK56#MwfQyec^Ih+9JcapSzjSbCe-=t{8`iQnWUQ3xFG%KiPZ5P&>(Xh zakm*P62IUwGB^P z)Rax-vL(@ta;+QrY4(@5o;bl&0K`Vs1n%;~HF@ufyi20!8cpt}AB8RN?jyIFMLLGJ zWXwWF>aMPTv?No58mq)3D9oNw3Z@$K2l1`V#7SuKPi~|umY(9~>wZ`&zuBOU(jgq6 z2@GsU&dg7kM&>nN5owy9l|GrM_?@kydwHS#$AxCNiv~TReA6<3t}>1TgN5?kws1OU zMi8dudo>wa{o3mG^y>E5Us_E`C)0bY-6*D#dfR2C^-oPt&HHHa89&}rj&Yy76zstS z4CezRgP)ff8Za?d`=fH5;E(|Ua921`6lanYfY=$s0BS2`A|(WW2m}$ihXmv0$-yHT z#zxQp01$6O7|GxPz$Jm_AZI5eWA5ch1OQ0JSdY)tq~?;*sdU?_w!e+^+4}I--s_`Q zeO`%lv$KD$?HcAwaEiAQLXzL<%*bNuXSJUBQ_Y;`3O9(AcWzyyV{Ta0e?$KOWGgGB z_&qbg@(8ayWvpBxtSEN{w$iK%2Q0;0{hCEG81|tjdorD^`O~T0O3>){PpVpOv`K9i zD753|MvPUW5~9NtGhtp-3UTtsxS0gok7K3$TlkOR?HbF%9uDzlucm3X(q3Flnlw>q zuJ;$0O?NxZcNBkXZIZW_3HwYC!jY(0!f&=f+!AVcN|FM? zB+~6xbX@(h5=h$L^X^-1XI8jt%h7kL-pb7KU+UNGD>?-%tW1*2aVZ4u#`h&g3OCHd zPTNG8fcti_4U8dvXe=!@Oi(A7;LOPe(5HrZ8PsI+v>m&wB}u1sWZJW{y0xB{aaZ2n z^tMM`eAUS~LJBr|Nwno{5^1Y1lTO>+qq_K&@$bif7v|8@#OF@1)4V3y#-U@S=r*sW zY4El6m6e)FBvRbnHO<;bWp8fE#!)zWU zK*+5kqfFu45)hP$nKKA0*-vAkSiyfXODvB(Hj1BUc&AA|%uu?BwpZX~;pK(Ix((;hfP=?pf|Expo4!CGfAz>$)d^#-*l_8C z-CE4@++2msqjWZ|4#Lm3cGS~^_e>RO zqXjapOAeELdwXxEwe{Y$sa&y0bZ-q?&#G!OGZNot^Wu!|ZdqH(Tc5fJ$SlL(ydV2B z{6^Jcj_Xjf&^{Y!@`aW=pA|^j$B1Nz5)8KbHMCcf!8i{4p}L1ln{g#nF4rECf`UF_!uVhs^H74&KcdBmJYS&lvy7TR|j}*6;Te*bK9hIh)r!gd63%K-s zGDSRQDP}==cFLy-9`OUKhXdIk%jx-mht3_MRQFl$9)R z{8QpN?R4u>2KEUwX*|)O!p_a+uibtL{g?h5X%pM(`ql2S@jG3%P~v|P**snyMhx*r z(P-&3pu!j?*!3%$%TO2QjUw1v=_p}_C@nPW%i*PIc1n_DT?66usAhe_LPY)|)oq}(w~!JdG23Z(YU+b>h zBf-7|jtf7A{s+?hGj(d?&G9|Mjcdi%M=s?h)wOF2_p@1)=0gJ8+ij5Uw1yz7TT$5Q zqC;^unwNJal$*_R_WjVr26wHkyuMtqyO{O@>gqR=%^4Cd%Dsf>A=Ugz50({~bn6W& z`gl+%V$0>ko@8V`11rv9eWhpEp=22A9=5klThXVzuDe<3ewKQAbTD-3=%Z$>tMa#2 z^h^z$bbcAkl z3+dO;#ICWDBvEauSu)AB2`=p;gDA{dW4mq$JcG9X0K^76nK9(r$E8|d>LsK;T1Rhd zYPy}{D*UL1X14_7?<{v!PNg=J(oys3^uC<0Wn}EMvc1meQ;Ln`qN8nHqs!A&JWUufUXIS zPPa272J$TQ`CRjP6o&SB&gBla)}V&BW(OzCQ5tk-myFY%()}%`ywolA*fiM0rd@Bw zJ|@z<8K7IDaK=j;Mw?OC2-ro+*~X5hCi29Y6?C0c>IpmeZcCpPK@?9t&F_Qkf8iSN zeVwv{=QgY3{{R$Cc>`I(GH1NfgtA8xy2_~jP&~D3!9^saYiX)`TWzkE%~|x*L!yOF zMQhzAv~Nvq>&vgo`*${cnS{d5!%e%p)Y%N8(_`P>lq3UrBspm9QCYb29Tjp*C@SG; z2a@jb^vk^_`@}kg4U4-C7gmPC+eeNyW|g&lPSVR!ip{NIVLMr=yw!eX^0d~R1Rpni zLH(Mn&o9fG?MAB zqb$!Om$pRm)p;XUGIFwVZtLCAU0TbU`YZHG@6j1!Gg>sPxzcIf#tA!G%G$=;-tE0@ zeYIb!elGD(gMJ<9{{Y(`5WHvL?}zrL6rJz+y3VhCt!kHU(p=o$z3tS}$lI|c=B0Kr&L1r) z-!n1Fd7;^vH0*pk0>7Dd%c@**1(L|tHnESq#qJdvNqn+Pc~;Sl+~Pvbfzd+?jI7g~ zeVi_}(_K^6SGrAU%9l0tlSuizPJ21t6s5@>HFt7*Yk4arYig}+Z2B7C5xyn-Rrs^3 zCGW&f75IJ`_h}FMO7y|wuh9s1;*7Yw01Vyc9brfWwsIAlEq9=%Q`MgavZ#i zlB@yV!c2c2?4@gqdF7C$&8uBQjv8B*w*dwV6k+Gc3XSSc#d6s=UB)x?_#B%A?NYr) z+P5|3YsGTeT{ziUB+_erZjYU(9Buc+T}DmuXzBK418A9+G}xKk zcQMHT9mQD58;2+7WF|N5#pc;ITLl^lpR|sO5civE-7enO)!(iB^QQ{cT5?TZ{_|U= zmhG!+y`8i@QcFD(M2)U|S*(kA&>=c~nMb*hj1msPg$k?`6S&CI0Sg8js{-@mOj=UC zpTpe`Ptx#=tE*}@5Nlep?ie#gHl(vbYU{axkXtgNJINZt!XmyKb$31Vo^JfE6G}cxExr8F+fN5YS3CO66_stt6J=m3Bu8OK~9!8sG@w5@QkJkH|LdIod(5RPgu1 z6u4xY#9D~8j4=NIM2RMAreaumY*HpjH!$1tuw@{Eia^d-T#tye>XDS`)lqU>)hfxw zExDaXQ{H-A`>}Vr*Se{Qp+zMYuWch0%=%hN%_Z||OLX7Mt?eYcm2K@J-7Ao*6|^#4 zTsw6bE&<*MIWPo5H)A5bOG5ZdtKTYJYKod|xn0FBB@$lYOAne50!CP_0v|S11Qv?` zHG6HE_%p#)h0t5sCe$8U?MumkC1f((PDIm>n`?d2(xCE_$pT9A`_GA28okuEz8r!r zJ{46hcPLrzSqhJp3xrsRV&!)OmvU8sAh+J-{5g?iv4u?Htt$A7CmK@sl%-{ESV^~b z){ZI*%fFdZ7hbnCXsIaP&QW)3Rq;z}KR##Mq0_^rcu&F5Y=0~53m7E26LQ4-q^d#; ztN>tJlt(-&k0`|4-lOB2$1IvuA~?nwWHH7iQ_0BYQvU!k!j)Aa@;re|bsirR?6_?61D%DbnWlR=A#7 zWh#1{x(qMe%!Szj3ISE#S7F_p;8u>{8Fv2ckCjRt{dQ!qEVuwn8Xd$6CuR)U2zD@5RvioQtc8I9ova5vd9MQ> zQxjflrQDsQIJ)a3Z+3UxNPZn-kxa3Z_H+!)vTa3C7>(a_r-Bh2#=mwgppoNO z#5#IOCu>`M60&w$yK3#PPbPZ!Y7nm&wAVbQmAY%oX4=zDbXIz6Z7)K~>KQKWE#scn z-h11GwG-VL7TyBPggwDkX<}5}zl8G`C}j*EC%Uole}^s$&8}+FYcjzhRI;{mH1wW8 zN<#5jnXVE>0yf<{qLm}fR6+}VF*JHbzr&qnWbmJct&fGQA5ao%7MfhGa<`JAJXYFv zs79@SCEW5vtv#Kkl$Pc|CyHf5G#?e)>xrhyX3=1tN4-XCfLiL_X#9_nm4(Qj&gm35 zeU8GD*&wSNWlw)b!5c@GI*QnIwu-E%8z%hLMCR@-|eqrQ*7)uz7F ztYdgZw3k|~%$6`C-0inl@`RIaW_cq+6lGAVw#0c6nldDeHlKlY>AXqcyIXtvas8*^ z-9qC}k)GvCwUpvJ*qP(FGE7w^m5g#3q*EIK5|Bx50d+qHVNCyQ;Tk4s0MD|XW_ zp6cRPhDgk^K^xplJ0r{_5-Z6KyrEK3>SbXcfn`lP=Kla+wA9$?+V9#Xz0>EkjV_`Q zUO8KIg|3oVE>;(kR31&qdv=7zFv!!qR%t@5T6U=gO*=Tn-8AiaJ0*X5(Mdag1yaM* zO{WzX%9?MQ>PfWHv*focO*O6byFH>v5zrQvJSkK6iwuSvn1&z%RZx}bmEJI_{ThBJ+Hw zk_LxUmfW+(StKfqGa}&wGd}Mvmb+gNyfgS)Q?=DL$@a9oh$QPQxou z9IEl4h^%bOA~rM4=<2qZH?G zTI`kXt@s>{q@v{~CuPg8R@`aI?KgDYt-X@;)8lkhZ3^OSCRndu^@J_j#(}$>7hHjj zppr5hHSLUq44R}jm(m}b7^TYaO#ms0LQXYF{c^JSRP%>GGBWe<=+joXh;;{uj z9BXyvSvDMCl5u_J5;(vCQF3=SPDT`f57^!olYfIe8Dn&!Xr%DfnNngw5~Q~mF*>^q z`3h7o$iRn2l!bP1e9Vsyr&>-?x^!UqlDfNe2;Mb_PS56Vw1e&luq39P&@8#vR;eqJZ3!lgZ}=x#_zqz>FM>@kqV7=Q-z* zfV+V^c^Mfzj-vyN*Be?bwpZ8AJGHjYU35m*z2AL%_Ih>u^&=yA@0K_uFLB5{GBOVw zw*ZrYjAzYhxtQfoKQTDK2N)xak^lp19&?e@iqlXR1e4A=!6&#GDhIA`*uV#pXlXW+ z!8r|rGnN31^y32r9COYwfn1YWrgheHD|ly_Kx*wU?6VZ8vP9JheX{IRrMroRUU4=Q#V^gWH8u#Y-I04iFQO zkC>9cFwP4W#~C1SI2}L)Q!=fPpo{_0O70*60Vf9}e7FYzvU-71CA@>~WM}5i(sDZ< z#9*Jj^%%!Yu(6z4)u#KV{(Ecb+g{>sEk0XoZLPkJ&fToFcX!cfTa-sB3aq~{Cki&I zZv%JTVlX+#1)LsO;EH4JjA43`eRhKU0x`IehRDFc$;NV6P?9NOm24vNX=MxgB_S89Sv;HVsxEL@(4CmbAPoCE4f-D<4tyYx%b%T0Ce)rd_y z>uWt*dZnVbYjn{*tq?K?;DNXu`8gOQ76csN?PJbE1C>?;6I7+K-@SogKx`5LXCUMb z19ayEV1c_T6cRMhU~o5JXKoI0fI%Py0Cg%zErP?ar7{tcPeK8~ZUGq?Jdu%tKmd+- z9Y#$jzmsWcbnV&s+wRkQ32pA*Tj-UR$!ga9lUwPw*dzo$XSqPKXK*i>6}JrK2r8q@ zatOg3u|fet8*HHE*Vdmd1eVjdWCc_W(N27+<1GWRRsbxqK`NJ( zRIxh)ftf%bC{Hkhl^9hj;DRt2Ol%gjWrd*(@)+if$E2Gn%N^4})*+BIn)mN3r3V20h1Lz5af-4elXs9VW-qF?>K&v%(~qF%6$@*Jz3 zuwBfJGZ&2kYpa7Ck;a?;(>KbanX$aO(XK`IiGMbocDqAbkjZZ}XB!oyEMk@!5bg;# z%BtH#h9bB8{TIX&M|82l;ZG741YAa0G%Lnu+@OUIEwt0f!9>hnHTh(^mPpH(x}i~Q z)tl3Gt(jJh9zd$g-);y3Y4e$K{=^wH6pIl?;AJXqHjqW3tsQYP21s-#g`Y*Gt`7ch#i3 zZK>?#wc}2$HCA5IlCt(wZNaAEnzPY2yJ@>>wP)#1#ShqP#kv@a#b2|&xIQmOOw49Tci+<3cJ@Z>X3ZE>jlG}YEUKTG)4;h3jPv>qSR?R;mVTwFGVdEq#94L0{y zo8r40n;Y-6M8Wj?`x$O6Z{gHZdrPf4@+l^U<_qXtFbH;`>Q&ydkb!OKz5u-N9uY%sQWf{8bIOFLB`3)y^p=j=JM>Xkll=9T6BPbS7h8-h zi*Uda(KGz4-~xeCQ=gczX(Y=WESawi&uef5KPBJHzGE)vW%v^~S z{_R2SJ|X-!@t?u@tgXCfYX+m?jdXeb9Px&Sa&=z~>oGZ=)=Rw`Q;B}erKN^Qt~C2= z!1`S9&tO237_Ot^9&3Goqb&AKmRrPf`3lb$&W@3|kyIgY$gdFw4f#?>-sO4aJkFFQ zrm;=h&1uW%^tIm3?X%%?T!OX+a)g({?A4r_*-5Tj#ou((Y3Z^$ojU&jPt;B%-5ta& zmW&n%(f~I|8AvRnEAldcpf*|1qgA~fpug2FwE(z=!V?@0!a*UJfdoJ?2*(k5#~xTK z<_BdZMmP(I5*XI@2_;5sqhoYqcp@e{i~jL|F@hsxE4zRZch_m4YFczUbXss_j^=4z z<%4bt?8vCGL}dYFWe6C8<+m|l0)P+HQE51S`1oOUY1(Bvq_SOU1i013jE0Y}VERQ1N- zGm4NYz#x(i^$d&(^}y$I00RM*Uc`~W7(%BU5w|UcZD3t!Ji*Y}NEzyDuyBF{cO3w(nc?+oqPaytUcBl^F)`Nqz%vF^~ZPc9zL>byWwP zVTKOTf=v^MOk}^3`B0@eQcGs=-Jf< zqwz-Rb#B&IO6h2x+NbMxa~e;wIT6J#*~cXsOI3V1Ql}+~j3>$gG7tb8i7d-i<&teP zn|(k`o5Hjah-PJpODSlfc!>FTw(x)e;3-!QsJAXIXH(_t8Z^@`)y36{%c(#}11&N} ziqMn9fRq>nu_1}gIa=O5kEYnkcC18BkwYYMDJ%=g97M=`#9}~+!ASxLIX?los6S7Fv`=(m4!<6O=(4 zdCF9S7D6@)1s`+}tfZ83c8@Z)7Hz3gQBPZ@wU&{-+NWmUZkFgc)LgB%b)so%maA2L zRr;&ACxjZwd8@pR2mfmY?xTmwajzWl&T78aHw!4DnGcS_%tL3D#MH^U4 zGpsj{>D~yrvDEE#t6Qu4#kro&NbXkSFA5}A7t@XJaUr;tSfq?3Z6&-!$ZkYWE#d&4 zMQBQ-6lx}$y5{9kPRc6Ll79Nq&u7xjXm#N$x^<&CMM>So#p$D3-s;ZD_2#{|O`qQ9 zz-xW3WB3P!e)MAcOw-cn6<>FAX7eu%bFpLi~3cJzT1}u@E-5A&T z)cuS6E3ax_1^ym*j@R~>`2IBAf5Ez4#)YQdd@i`Q(KK6q6|MXwd7=1gQU2D|&atFu zy55bdXc6kIE;TE=S*}`5IiwLc+d5UJiS8BShvMJG{aM__4$G@w5ozly**Ka|(S3qr z9FvXlv{6|!*@+Bh)x5~h#o~Bl4PLCJ_3vlRE@Zu%l8-c_)mb*Yv|Tknr?`KQmLCIz zqOxlBTxmm^qNvnl`D1$}89l6{cXw;FuFurdYS!hJ*H62UGBW}e@+DE_21YEF(!7DO zEJ4oUw6Q=5%Giq1Vn7;Y$#)@fI!JdeBpd*dm-5sYh>|ue#DGZMUz#g(;wwY;Gw}z< zb26`&#;xK9QqaXCx;sT2QpU>(E)#P~%N&J5OB|>#G(QooV@WMOBK%Z_8-+vuiK+OM zL78JAWZi9H=Bbu4@)i=xu>uuUV*S|5{ZOX}sVv@{BGR;{MtrjPbZ?*TO(d_P>V2jk zjumAO_&~&2*){DiD7VV?beFrPy{xyrkJ9Ul3!?bA(X|V4AZXYnoL87Tg0t<4&`BDD zgixqNODC3O&P13O7G4^P?3?XIdpWli{{TtRHJA}w5)2QrSi>IG+bCsn@wVchx=g}8 z0Mn1fc$_pJ75*|>0rRO%OX3B|Rm+X73|bL|iiBkglxHROY+wwXWxlEVM6THMua93A zV{qycE1wJL+MTXRWmK5>r{TrJv_$O;^53)}BX!!L&6x13(ur?kDnX-C-57=TCT0) zKZzPY!`};dkL>;(yZEPZpO0R zYThmI<==^P@3w!!$M8pv^nU{QxAthi)x0mKYI;Vu;oVEZ8pVf>)5I2f&xAY`KZOpd z;tvygm;4k1{t6lK%fLPb)W2m8t!fwZFT* zxbXd?UKP?VZtkR;Rl1q)d}FWAb3BiAd8+H4Rpz02s9sAfkEk}Bsiwy)tr@mJ5<~O< z0PznnoJUe0+q0A@QmVa@=UlZZ!KKf5^2#xl{vT-LC98_GS@~ZWc&mxQ&aDitojA%# ztGaTGsnonk*) z`1|68ov4a?H5WSXj5PVQ`zzR#LYDgcUJ9}C4YZcF*OBVx?lFCD@o$ShIQY}ztjEUx z01>_@YabW9MLaRtnLK^s{YzExKA8*;G?9Id+fdX{MQ3F+_cu1$cApbQg6iq4Aw_wl zljkP!MxMxHx7IFg%HfoqGUj41HkC8Jr3qoPaNXrGZMh({MccdA1+=AOpGR);wf zI~z;I8OG@DEz%kH6UkW`a0uK{K?ME2SHU?~4O&?uprfLbNltDWd$OqIQlpKpyqjxX zUC+WZZYj<)+O6Yi*QtJAb9-$Kx2S8LgnXw}B)q%(lto z6DBss!YE=f?#nQBC5~9g9atGFRzDhQF}ybR`t9Tj!67q!z9>>PVk3E284S-HYFH7s z<_Osgb}e`%$kA@}`E@nBjychqC$f1aT|uYa4#il$(;$)=1cbHPD#og(&WK3aGffYK zzpD7-bP088cRcqQ_^{;DLS!{h5cRlQp0Vj(Ds#pReHj!l*Y*pB^qApR3 zZDe!|qC+c|SBk7MTcgBf*JXBwK+z928Jw8+251!|R*i5&6jyQ>ZJ2i>dVUNs~GD$r_GBlfr$O1Nv z2?|25%!|P}#-}&KccMxi^jnL4 zT9)odk_NF_^o`su~+}X9Xfi&Amu5~>XblqMpQscPrU&bw4;bXVOzlTfXkA#=E_pPL_ z#E*qqzOUhZ66;us-Y2>6Kg2%;!5z(>xpkq(aK_?TbnQb#yStq=3%F&oo_H>PNz=S{ ztoRp7T@OXpwFxxIbr-sm;p{JP`gO(A#Maa55_p44dkt36W@HN5HH%x>T|>SZrM$Cy zsIE2aemeYKlf4z1(QH>fyMOz6;sZqf&6K2N_0cG@z8# zns9XC8FHs*p58YnN@k{n}{ht2-YMnmqq#B;L;oI#W!5%q% zCc^5mbZE>dSHj~)fubhje+uhtl;xFuEV{sMC zdhEKMoIL$Kw7F!z(_p)?%kfW$tu?O{_*YTzr;RTB524@qUrf<&Znce9#5&!)mtG!4 z(eEz&L7>5P;;YLP)~2(ERDB2RS2{hb>OW<$Ta6;p9b)f+aO#`1Wj3^KE-71BttDk8 zqIR~H*Hh{6UM%q{lxbq>s0cE-724|m z004hxFWRqG@n4U%%fE-8vuDKp2ge@?JWs87GvZX%(c72Od?R7;2KQC?i!F>dS~c#u z@QcO14WGk0{MK4NnXN%@rppEVAJZ@FxvYNBcfYge!9n|5!QibQ_Nct@Ev^3m#cvLH zOZzeO>t7H}b9X8%arl0FoeXLaXy4g!__BWt&2ix8@nl-`J{P^Z@a%eR)c*kGh5HwO z!9qSgf5A3?XkQTgUj3b>_G!X56X?Dq(r@6K zOz|e0Z{iIK_TR(^ma-(ebdlU?Hy2twztIoCANV^9P|>~~{8PLAq<>)#2T$VJS3tS& zz4z?z@iHF*Tln_&>%>}po#v6^xI9@ej=WcAABH?DbK-4tPVo+nf8t?xtl8;47QNHF zIVQgTD39cGt{B9o=T0tAjk#1~_FGR>@69XSDNAU(B$G(=D{+2Xm`W9E)RjC(Gg6FK zJ^7Sk`DELKDL-~jlv?JUq~AM~rTxp?2uwEfT&?yc^kj9y#C9rOLN`sc=ZV~TJ1R9+c3L3cD#{9(8XrJM$hribBUD+P?? zNF&_LqAYD;C42@i1zH+7%iVVPT36Fwmv_I-v!UV?`CMu@7P?f0<98b-lyZb;?}mhs022IC@dz7u$R$1wWb`;-7duyl-I~sl`}U1u z3Vc2IN6Eq8@lVBvcqi6ac3=9UoVy?C&dYZgjeLPW^kYy=%?Qs=ZaZ z-k2*x$Ey03<7I8SlyRHopC)_Wtj|-vyKt{{SsKb>lg5pmoH553RspNjzj_M_lB@ zZ@+3Vr+0;Z2!VnEuZ%oy?gMe0H-jTXjGO?(w^DF$%}}cwd(+Xarz`DiKYHF<{+7`= zJ1%%9qD{D@wpZ19Z>O4jdknUs?VCEC+YmOC`yQL+3~f2Z#jDHnV0DutJBu*EJ~{Cl z;BSXKeH2T7tZVj-45DbCN4$eaB2l$fowWEZ?%hCAL``&I<%7n`#ZG*>$L&)RVjl(k z7k^cc#vUzVF`Qsa;X8A~6Y`v6j--}uFT@`aziFQi#pdeX3;0D0MOc&n011DIEyIOS z#H^Bdc2y?(h*$ z+B-Jxx-C`j-5kU}vbKwDnCAGC;|sPwF6*Y!8dBK}kn3W(lp#&WX*dAqb2V*4`zH87 z)X4rR@l4IMvol=j+Z}o2s#qy56rHRX4oP^)B%T7}_Ja7Oa7UNnkB3mZ1zpYJ%~X#t zle=jD0EBcN5lPw+i3GB-QM$U%3VcHN^Wujl&rA4w1*CGS%`LvYtIkf~tWjrw4b5n- z<8rc;nefWuJdl!7sV-|NNm|X`O8Q&-&v$ON?0xoO{)NLdVHn@#W!c6QX^HX78#BcaG zr{O1pd;$Le1f=-)t>{`b_F9ZSG5wrmmip^c*RDa1FOQxBwn(j#?^wCC*$BVAVF|O4 zgL5qEeCWeP`_*&ePl&e>*qv*^+D4ank_n7jPsEGaU@VvfEyc&fSmu%@COL4{R_@G9 zM39RsehmKr!O1=@@m8__00fx$_oV9{3>G$v@e}rX5o%C)*H6`LBnajUaoA2T>cD-L4g*mF6g$r6h{}0>9vl`p=BCkN7Fy>{+S& zFTe1dUL)50OYz#y%6}SZx~KdjcL09MpBrwDoqIN&aTcQ!Y8KF&D=Uj@sZ}*IWvV)A zb_Q7P{{Yag+W!FdoV=Ok@g2{>NMOFU7aDZB7M0^7(a8{rW`_7`nx4Xi-I^AGw?-oh z{%-uAx$!ourJZ40bJGV+D<@{|to3{8t*@r3bv(`%;vCZpI+4TU<%d#@D7dPw5L1Qf zDRSM$@7grmdh(^v;g9T*@brP^c&o$_uI6+qzb1#&ZPKV&b4 z5@lP)eku)}rA_sk4cK6#E2RPm48v|z5Wo;XQ(lX9emu&BA@N^;A>67Mu8XLsLRe%e zovv`e5=aPC0Hoj_my@5vKeQ$5mY2tV5_MwPiqaV@#?}m^hHWgew;*AgYhW_QqyoW<0gi{J0Ipld{{XXR$6p;t3u_u8jiWn!TX5)k1QP|uj8#w9T**U9Vkcudl^DiDoMJ)H`+Ugxrn)3kooI*{MJxwQ4S(h`2eUj+*pCGjtb*&^Nx;D)V>j;9DN;$NQ~PB*#=O*eC(mm>Uh-P`^y}yA(|GEsC&xIptgPV+CcWEf zDc`2ASNeS~{{Rd}`#7;4Y`!CvLWIkB>iGeT0;<2bXi5R|Z3#}2p{{V}D;{0>GHhhh0A{#X4*D^Um;z7#UB%fTkRek02UyPa&nj_l`1qe$T`8pV4R$m$#&*$KVmk5L74arBkg@zn_>==3xX#q^J1%j7xR6+V z=4=3X_x*+c0A|K@&xHI_I4q#6{6qMRVlk^{04IuKJA$YiLhJ)74l$pT59}%NJy&q} zbEC=E<*@jgA~?w;g3G5986P-N8aXb?Mo*ae7r(KO#VaNuei8Vla+`^LKjNCaeuSSd zTrITcBzb2W*a8mnJsNZ{iN-PFNk&#$xwRgfH(eyI_UpfqZk7_xFN`Hsr)y4>n|o;7 z@ej(|J<`)}s_#Ewuh~~rE_EM)t_bC1{{V%f@rBzvN|MGu7+NzUDU7aFiiBV?BZ=Q6 z{{X=~{{Uu7a}0Vv!OOVdjW$CKzs3Imj5hvDER4}h2b<#gcFPX;WC~-BB4k*aMPm|t zb9?(Id`wLJv*F*xn1(ju&&Qr2xMP&SII`4A1IPwKxZv#slH-Hae`W88V==?<>*FTJ zTpvGD@x8~+S&FoqH4AOg{LH|KRQ$(ik9dWB>=sjAqg=d7`5ms6SzD!^n6Fm$c{7D*DyBPe<`}(^Kr7WBv)L`!_uLr~F$VANVF1;nSpsdvA(5 z{{V`jx^xpQ%Q|?7>Vno+j~4Mpt#ccRB$!QN@6Y02{1%7yJopjt8~zEu@!!V&5bnrnC_Y0ygqOY}F0 zzhT}j^G%aSAIeLwarqkzQJpAp_Mp;BJXT&+}bj90UF#7d$~YPn-8_Om`C zj%Z+T{1KYYE;6X7N;KRs$`+Naq~Elcy(g{Ymc6ceAN(7&;hXOiXdm!Uof^}@$>SSy ztp3Q?cbb2cq-p66jr&hRmyPDkikQ?9h)C-to#w4H^1`A3i0<~#hD&(X(ifI5hBeQCnxt>x@7jOF{{XXBi2NlS_WuAJV4qXcuJju#n7nSfua_J%XxfFE$)_|> zOJR2s-CSE<{^?u%27^FFQSjUL@%Vjlx+VVriC68qpAanIWH6Q@9~au(&hpLVl$iag zR@;1xk_3ruhk-1SSFI|PvwCoIt2H>Pi``V}&MHn4#6nW$NlNM}_xt`Y!%W_q$f!}P zkk1gKQnZzNkam|nX-&tTG$y^yWf>S^_+^sbA@Enjd$AfrvTqmsBG$BZ zic(@#m32)&!qZs|n@ni#$pnb$D&2W)<-SIR{{RZNPrH)e!M+Ii2)9OU&12w?7ifAO zwKT9XC}y^s><(s$q(wygJ+z2jq>?Q@HxNhj-M)jaX)F@g;*b0kPRnd@`C|V7#6A|( z0;iQ44YzRUddzaf(Z=CaS{zy#6Pu%?I)o?HiU~RY;&KhGDl@$VWl%_iDwYL($#LRU*+$LUN+Y}3#s0( zh<*_Ke(^+_b?x7Vej_i#y(7k2kHjAcd_=c8S-0@kmGI-mo*A>f*X=Z=p2J$yyiM@W zQSpa@^!sZ)7V}&CB^<8pjEtCZKNnbmyGrWwklDYxw4;Ncm`SBrA@X4AJ=({3vM z1~VO!R;f;=HiOIK8A3kYsL$EnYno4yxJodJT(rHEo1010jCqf?ZT|popV@Xl5$Qe> zz4*i8uYuk))imX}()=^~O?(jXCxP^RLf+B!GPzB_)-Kk!j60o?d&!Ww>!ty71-K#{Cmfztg9WSMe{vFN(MJ`XrwaTH4hmOTA^^O8A&`{T|BCT))#`xzn`4 z`C0Lo_96YJ{sr53s^|6___Ogx#@`3uU9s1EQSdg(^IXt=D|j1L@a*?`t(Eq*@Sjji zSv+e7iGORTT-o@G!rB%6+D4aln%TELo&hc?-$B^D7x+yuY>+zCW}6 z8GK#5jqr+K_;s$q5IH2eCZQFpouDyBjoRWc8I{6sR{mPG58E5|#JYC#ziKaxvhy@| z5vIL;qem3UB%z_Xg2H7;t_#NMe8`=|t>uzlDG+ma-?V@2M{q~le`qg?vKfMKej)gZ z)xdw4myIv2+_ny6jH2MFQeD`U{dWhIV5z7nRF!G8oMkqWzq@NHZL2-(-m3bamR92I zZD#(vMxGu}{{WYC>B{Y^U3>F->#MfDNA+%hX@3#kulf(czl<}J%85KC_PH&Mq01GD zG8JTO34+D}VJ1t>S<-w)_`R)xC8xlzAFaEyC!KS1;d>IX?QNUlyVatYd3b-Bp@o+t z%#B8C`8Bxs$?@}5J8wQd{8zm)C?YfCZxu?TASW7sRg+Ts7Ut!%q;|#v=hu#r}~V z5kt)$?U%Db5l3d0P|dU#GM6hRJJ}T{DAyRyE;*Eiv@&W$P!FCQe=V1Yp4kLjH`0w#m22}zd8F-U(Gczt7n^6bL4I^&^NSJ@#EN{1eq`0#aZeL?Gw0g}Zno)YC ztI_JZbxT8*Ij#|}_iEhD=-pU7G`efqr1ZO5Uh3CBp&{Uj^*FUp4(e8S_Zkn0G`p<} zP_$MrB)V^iES}Ey%7l||B%&vhbEpX=0$7*+J)|Vp%f1Aj;>WhZ|t9aIC($4n(3v(sq^4(lsW(QC%CzZmfb&g*tW2>XYIGVi8Q`NY&8A{r6tG1%0 zbltisU(;SXnCe`OMvSe^cNWrV*(GPos%rPP%~?ld^k4Rq@n^!X75p~wZ-*lIi{RU> zY2dTgv@3lw?n&G5)&BT%4+%PaqpPTS_mr>L0 zZ*-aM?JrhK3G}G01;5$FtQT>4QeIj~WpM+g{Ps;9mCWw5&vgZ*jkM1?>F_wbd_Sho zFnP51isnHirG~I2XV|-N43I|~<}(;Wl2{`zm$_0hlX!B(x193aB<#m4){j>ut9QCe`&{xW)>S0=lva&fPVrZ} zinB>5>t%0|@4pX!X!-mn;QbTB7vBqX`^`7Qx@YzjUNi7tiM4MDc={Vgn(|>Lp?~&0 za?bwTU27LJK8-e=9*KMQo11B4R=K^nA6V&sv@gRy7|e8U2z*q68_yKQap7yNC-#Hz zj-{aLdVhx+-%}QvZO@PVC9TciqYTj8!J62g1(}=$2k3_;KQ0b6wIj zPYq9{>H3$BbT~d8Yb)ZNRdo0~OM9p2dKZp-S81wgo*&XQ^LwISys+GBy4B^ajpeqa z+GWq$dKYZ5-`e7~YwKZo zZ85*Qy=zEb5vW(Xc*@(sqr+D^UcY6aYB%#+-bwwn2D7fjo(;N9I?_!$Lh!AxhxH5J z2l%Sj&$hpgA$6qL-dQ``J?z%kH&!hNbR!u%Hx;AS_fhv+ zS6-T}A7yp%6>9$WQcm*bl#_bh-FfpnwRI+X4VVO5H_g;$*o-L7edEaw!c+`v4P?mquNGFqFWgulGH~V!yH!;qatuxR;PQS zUA^v$s^4gL<|$#0?@p2J_rW|yE0`xSs|Su`nU$iLVWBc6)i_a?cO}lCvtQnzn&wAO zGWC3zTlcK7fhC%2yKm)87uCaDYC-ROD+)%@{7 z>8qG6;JLR8EONHfVFjJDw2=mkq@rkHx0h^6@*+GQVfJ$Dr6G+rM<yS!k7(-T7B%t@^v7!M3>=XLXPkIbSo(9FLd-7%B({ z9N~db6t~`}@fiOASW29>;1~oYM<;?w2aG5Rj4dB2I2V*m_{uH1k)8OZ>z-8|r& z9%;qnVs`<&50@iw2L~V!dF(+ybYmdo1I<#al2)=?J$av0(o56iujFe^DPMPY&1*f| zj)`cRNjIjwpKz+kMsb{gK_vAV&&t_m0QKPWka^-3ks?!q-B=8k%LB#++yTx3$l!K4 z%_)G6Ly`tE1CVjwg*ne0fCCP3)Dt3U&p63$03;Vsyl0#iEw}hdVB8P~C5>^qZcjwD zx5?>k?(|(2j`k_L*}XJf8r4}^%kuB7w>KfOw@4AB)7X}eA)fkDp!Ld#(j^C+6ln+q zk&wYyTq4)W0W_!pAZ~dky>=U$EJF*VMgt^cW(iy->;fQ-r$`5xc4REOM%9R5DGU?k zMJPVzcsXDW&~VFI;#-uqCK)DCuyP1(>d&095du-jEDDC)s&ZR$f!R(GT(6aAlS5=qVr4up;iUYcZY zkSlOV7~DuKpfuA6l;Y1!TSUtX(5@4l~FFE?ut zA3_E&I)4vdIpFd@`LTik&o~Bi)aSRSxZ|)KaBxj=*)n2e`&?IRH_C*QY$=1mpN} zPDdxcF@jG3gHY3x=1r}wZkjE%zx*|qOPq~;r>9Fl%HT*HKm>EopvXDn1E)+5bMDl` z#&A#9jAc}ibHM{AzDDja7dVjQkPjU2Ivk#J)Z;hD{dzoU}SIz8?ljqGsr%}BakVj zf!Z)L&f|ar=aG^F5rBBW`?v!+;&`GAq>u;TITWlY_w=kTH;Q04Ml{R1Td0(c!`>-lSMotk>%r~}hHVB}zq-o1TCIi)M~;Dg6NKqHJ}8B!0S0OTB;C<7o7-x%rJ zk5B8zH~?m(1GwAIUI`x9`MAO9^sZ@1^nQMJc6RUgUwv?BDr+UZg~Rna3lZ zy!P#kXM@25lS$JU13AY|y>N4mI6cP$AB4ajKs=7T9FNTZ0QISaf=19g_UrY)KZgg` zoird;ZpzxdZii*t@AG&3_56h3{zUw}IV?s%;2z&}9OpR3DSLPK$OEY-93NZ` z*vAC?*fYuJw@^sVIqQ?0`eYse&o~bRX8`ob1E0s(`*Fu==u&FR&FHs(JrezI)3t=4 zmreWi{;mC4S~dU!h6g$N^(VGRex!4O)QSlmu%P5|&l%`J%hhV1ob^e zI&~oX4u@Ry^v_{}K>i`ysLwdT^`{(l>A@qp<0GC9G3rSA^Z^IAQ<27d7CFE<1HU7= zIPFO{+V*;V>rM4ney>i2){0S9R?^yO{I}csUPD6m$iO(~7$cAYAPzTo>T)m$rsIYf zB$2?t>&^xN1mFX~BRI&%1UZkU;ebw8j02n;5PSg={GtFr+xQET zcw_Sbjf`U|Ukk<*WP-wzWJ3@v`?IwN&5}V;$s=dXqZuIq$pA5?{_;#<68tt7d&qW@ z$8r_MM9 z0AmmUxBBH*RXDoIK36q)OO`7}?`7qF+WIth#|Mbz=k`@C2*y&VqW#!5t!C|gI@?9l zQ;3!sk+$Ko02nGZ#(wZnTY<2UPBWdPhhRqNW=V!y2aVV$$~ed+isX6%0UNQL?FSVT z-pwOrPH^2YS(iL0Du93i4Zs8(cPE(~&nO#<;0$AC-JAe=fB zruVkVz3pV}ey{!=D5`Gm&8<1U9Tk>~e%8_1Uvsx#ALrrzo$%uN3&^cB&k*Z6`FIw^ zQEqixSnP$&q}ryS^1~1YNG>iWwvsq47S$}6TuF0N#CMurv3F^x==bwPu~{XP#d4Oy z^C>j%8J;qti7@^6gJSgi}Qlspp%G6HPnW>vexC>h$hhZB}z3*??Fwj4mWogOjlU2vqbLz}wer5LPKn@)IdJI4ien zF)f7~vw$}YDC@gv%8ZcJM9UKp725zYVU{=mWyuOl1Htmyl^7G2QV3Ygrs7s$rVu#! zP^kGv-<;r#xyUMb&fqqj2XdrOMJv} z{45xU9 zFH@XlXC%)%%!E4UmlEt7-Ln{wRX z_Ix)(ORcoWpPjE1BSbW5e zx$K*;PFVCfr!Cpb0&%+w*Me7YCn^pI+8C9|Bw!3-PIX;Mp6pWS^hsZ4^;+$s*IRws zQuZ*DlWFR=wwJZizKwO)s@F@3Q1BECA5b_vbN~a-J#rNC7mg-G9SA2Jj+iH)^!uYN z_j?_{vm87Dk_Z5eppn4A2OI)&MnM@J4`Kll#sC=@IPBjk&vB5)sTdd~xahTwHC~ff zPR~y*<8`WgF2AkL=~1Cob6qVitpIA!4ToZym2EDssa00IaL z3(U$1z&-kaaB@Hyz`$$)oD-5Zf_4zT?g=;qk&(LucI(DMmIYXj`1wd^nlQsBx{QKJ zDjPW&2a+;-W97#g=ewOGyXk%U+ohfR_O|b9^GU@mEvHMnEtf0k+t$j?*6dbiCpiS1 z=aI=FLEK0g>=Xb<<2lB1?t1kd$-o3-xo$8I0FjZ`=EoLV-DBuS19(ltAd;t*-U|Sv zoP)PG3!LCqauaY`wqVeAv!1P7ZUQL)A$qo_NS00n}nG$2iFV z5O6|_kCY#jjAM)yAPn~ejJa`wPBMC)a6lOAobiA%csK_mrE%4ys%vz$+gn+3t^2p7 zu5-?#R!J-AeKuBCT5Bf$@5r1UMHH}Rd>|4q!Y*xHUiQ~!wbIV}y=|vn$r@37F|>~@b9X!K8QQW#5k9~e zq|QzV!OjRI4r@X`0(fQ?0!VIWJvq5@rH*!t#~KWPRFxz3ARfsrtkjPxM|K%ve$N^f z!95w330|y8ETcHW=OV*S>4iwi$QWk;5IPbPF(WVo0FIdl<>Xi2MD zh+qPmaqz~3L0{}>MtI8K-3A!llby$doDrPoXzj;H(#UYFc%YCRqFTP=o!z=;kC+pI zjPuYK-@7;W7#YflK2ocZ*yTdt05%blMg~IA@{AOJ<QqA0^k=q2G7!!sBbDxov4hBdJXied%BjVkWy5JcdSP}+Q zWl9$3INX3^Ad+jdCJ;VWn7)h(UvZrv?0uQt}HTU#xAZrXO<`}f+`JksMz z)S(|VF}MT*0s`Cvf}vGdox~rN7?X|)@-bz(lG%Wk(*$w=g@MRFFyj~m<%tB7o^S>$ z*=`TnWAiVJYKxPbr-mWP$iuRtoaE&685rnEbXy?g0TCAK z+vJe0c?7BJ=2xYMryE%$(zDU@R{1?YD|KBI>&r#FmuD;KYiaK*Z>!wlmsGTn0BwAs z(3qu=5CAwNfQ0QMfsE&qyBt5wiH7LfH3X0Ktedb$MKaul0E5-hml$Gu8`qldp{s(h zXyV=$P!*-Loumq&07F8Njlop&mpKEHaLtU`d!uf+Tf)a_C@kl22nPV=7=j04$L|n6 z=oRG3jI@+tE>^UBuH8Dm{+q6yI%71_yNY{V+A_YEy_&tW(WSkv_Zud&V51SFvbX>e zs<_>p5(2zyf;Sa7!2ohV1Wz!p3PXqnp}k;25qhf)CC*#w?OYguDRjzyix z0D?)fVb`t>(cEJ^U=B&nD&p$N8trR4jy_TvIg|_%bF?8CJpj+jK<7MH6ysIDb~0A# zqkF5XUiZJ=_U=AtXxoL`TECagev00PUyj}QRuW%*H90B{>Dt&?d-{2m&lj^++jV}AeJ|DB zTSsk4Bh&7q!kOdcMi(dM!OLKPqyPqT2xHeHrB0UfsZwQ&Bkqg_IR_q`?Hk zG}ly!ae#5qG;NHWoC3*^NWmP2KPWvpPwhx@2G!~UkdMI0U`NV8DyIOGk&NK(%~bnV zmM{Zb^alat;DdrNACb;7FnB#j6sG4&0G-hugpKYGIsO)W9A`a%J$m3*)}tGH%gb0d z_I0(J{{V+t>cY}`Uw|a~B5C)A%VeKVG(kHlJ( z7+4tKg1KoK_$z~g9OQwKh6HEsg2aK!%c)q!_Y7wPqLd??5r78sw8)(->Wxq?m$=c~H%w-pQ{5RJ6>)PLkU2oRM zp+AasWC4xN+{VvLd@4W;iM31$bPozJ^{{?ef4QKPUkFxns8g zdiNxapbRlNB0sQSO^+#C3^DU5&JF0U+caa%-oG(j_@nz#{~O1%^*j+_pzT zpaMW(2vb*98A!n;bDZUg;F3w&2h`t$Thm=SZ}YI~OHEsC zS>JnYXRh6zuUqs?!h^%oq2GOS?Z(}R(ZmNh0kR0&wTD$gtBe&qjd;^fwon$`rz&yt z6Eg+@hgk^C8%KJ-XM7zJbIAhRc9F{z8%9FU(gce$qq$P|2 z-G~dgTg2>Kl~e@CH(<9%B{*S$oDW`(1`v-mmWubgds*$O^Veq4H0xQ}CwBTJDQzB> zx1(Bp_bbCS<=6`pa$2v-q$)^UWRsn)B0w{YxR8Y^NC0eVu3>QFdR^VSVN`vtIKvPL zP^ki$cZVdPGM7?*Q^{)ee-3;vzt-6#@ipSwLdOCdS=xEu7+hi@Z*Bt>P+U&nZW&c_ z3HR>}cqhYN9w2Gf)|1Qg0X^h$MRAhMFw$E^aVRXTFh0^0u*MXErnFAUUfMZrb)$B( zcJk8SGqMyXR?=z3Y4JT%c24n2N6~8EOP?|LYvCu4JWC{NqWDq^NS#Q35O|JgY%NpF zb0L;HdzWjuP=p~}AfFD8oI8-8Nccl z?j5M7b)*)PZEh7=w(OW4mQWtH-TrdWxLdDwRu^wwWSu#8pt<*?`aF%J>(Fx7g*%C z4LhSmvTbHo@pilM9HFD1Sko+cU?a0lPU0W{&H_H62qTpM6(Fg`Hh@y)t=Ebz0+@VK zvkYWKezYgjuZle*byqSZI|ce_gV=!BxJ70RNz zrjk$2I=w8k?zKmw&7}B(S3hI%{{V+&+}lJNmxiu1a+`?<%NEkYipUER!Uc^Ha#^w+ zE?Vgy6xC4L>fQvsB@V@1YVO_HuvoEM$*m(Y62u~wc*@4AK-gklCLa@c@l-9wqv3r@ zB_A|5HUK*SGItmyvs^O;1eHAyu|G2`7k)Onv^c)-e}r%3VS>X{)GYMpypu!le}FWuS@peRUcN}i z=?EWZj^*^LY=gNI&4T1PZOIE2ET1!Y*Y=b6OQJh@39Ecx@eC3pz^*4oj zT~J6itcj@VcXrAGrMvZ!3G+Me=vV-`WG? z2gXpz<8K*ix`vKkH@EP`h)o;9)}|wyb&pB2`#zs50QW!$zd}(S8Lnfyx?Bug0;G=& z;vz&#=a8V6WD&-ssL$SCF_dEpcScE4LY>r`z&oc#xN(*d?r5T1{{VYt#sjMWyAFQ# zd9OCDY(%c7&nVv9v5lkAHrn``^G$j-VzIR(wQGAcuV;IAZL4WzYi*;@vm0-nZQm)m z$}tYSZsR22DHzJ1oCX9oMl#*J9v`-bIOQ34Bmsm+%aS(aoQxsB-I54mc8#h}5WZy6 ziPaf4gxkPXK!X4&B!vI~6y)O{F=9zQoxZ(pAXsGJs^Efz?Z!aC!V`ep4WlOj0fAor zQ)neRv9eZcoms6T_#~~To!4(88D4XCjGJk@^6O=%#ckVKCvLj8v+3Z0m?^s@S1G$| zu^g5o?);&P46xb>89D4~UFy0WfnmNf;laWunI>=vCoi;|oaLEv2EqpdxIIh6H+R`s z%b@6X?p>e|N6Mt8NQ@S82SNY?B;cy<1)ZFg0Ap)#GQ$Ok3I;&W%(*PUkaBC&#Bnwm z{_772xmw)Pc3N_;buDG*v)yW8PYCpKZELod>1%6bpIfJ^>2tTZ@vZUV&LFC)pc4o< z*`2Jcn@B1N8QYLaA&3Ch1b-m`2 zj9(;mwUV>5Uq968g(^_pMXRQpSAS*gwf@Pv5y1?n z74;cs0_Qbit7B=Z6s(^$R~38O?I^aYbo)`)OW4M)I)Z$#_oS7t8`)cz;*+;4ORlME zc#eb>abm=Mt29lyNWBT_AXR2i6&DNWr~(N zW0U4=phgHQ>0_7h?o8o4Wa!kb1fL|5cTrK=mD6|VsL=n^3r(?s85f zxRvGFF_Hiz1yDfaJ8*l{TZY0LmEeUdwRbBKz)-j#bT}i^IUw-oJbN0{=-+bc)e^|DS+P3&t&D{#E3w<$`^tLVNIuV-mruQFThbXmKWTbWCihjT6!FQT!n^yZV5tHxgfE?Vbz8K1og?{u@@l}=Ld|CP6@~@ zjxaEJ;AHX$Jl9F3{{X23Z3OX?jH@tUcww~d;GPBvIpmu8JT4}-GPDa-x~A2v?{00cdpqlXy*Ezdm5BpjxL-zZW`FjgcGNCct)K+X z%8RpmE9-r}%JW@xz1n-L-JLSX>u{)AG)CIY#1NrKRzEfwc^@eoNh|>4Co??1VwAnC zit=nI62h70W6lK8)wXu*79xv`%VGID7*}hR0_QA&BT;%i_`^0tKkib_* zp~Zb=c^%cnGF>cXB#jaSC=w}CmMX}r$UadUhH~3-0BeS48T*l?DLFn@D`^JQTG3tG zTWP0NYuL@vlUL?~N=e1Nx-`6%@4k-Te@mnIS6}f?rMlM6+dxD`nWw#ZA+`lb*y@)- z~HFw~xe^{JYXHT}eQHyw{o^3+*SqkH9d!x6GZOPI|RshI$#7k{M z=3XMw^?wcAwU)DKZbF82cd@v(ign(>+9@PKys5)xHp;4nW&p}yiMVuoO55LzT_b0RrN1a2c9Tx~S29p>rg@%Eu5tWfEi+}8g9 zyNJmTh&25_QMFkFs!NMWt!2xgW@XHaD(pUBx!Q`H>jM`SnsAbS>utR>O|^KXYdhUL zUiY)GeQs$vSxu+$Y@O2bymk0mO8u>?`7`ZNfF%*$Sy~xFG*<3z<5405BS$+jwY$oy zkFbVkP>AQt2*Sm+&zgtq+Kr{aEJ(7uwGd3%&Li_oQY$b}PUe}yD8jcVAAabTmRg6y zDLgG{@T=fojW4bsypZ_53yoV&@$Hk}PMU&h4K3qOqj}bDXNCw8&O1M|$utsLB80eH zeJ|io!MVIGx5wTD_@ChIVg){TihLz=r1+;qYlRXP1_OEKEwF^eBdclb>2Vy&_c5Vq zBjT$H)Z0;QMk+cxw=EL9TyCuO_gcE_@20fsE?CL7+}AdrWxFQ}%_iD+cUMoNJ|A1V z*q>t!Gf!Z+NyP6W6Uq5r8O(0#rFJ7JjEo>6O@Q8mSvHrJ_d1rZaeZ$c#6M_)$|bX! zXd<0H(+WtDBS+_3G_e*E$Fw^MK+8v4{x9$akA`(uwea4#f8yOZ2;9naTdgML1FE@= z;(6|rv|*KGm3AwUB8ZBW^EjC&5O0iV@Wjd)3fu>5I|cyxb0mZmP)9N@91tP_e6i-$ zt5HVIbA+tol5&lcvrVYmSJRr!Z>`Sya#Dh6rjt_DJyYd&OW}TQ{MYH*^k2cB13nvg z-@$t4jjinUCDCoP+k42hxNmiU_K{C{4XC@GT}7H0^+_%yOEj{xT|z`2eAC&*Z{})H zeCwz9hU3DQdi;}VFMr`(1H=~kC-%DP6HR$+x{E77(_6?Uj_ko4aWf(%xwleT8fB4@ zyaPt@r-`&18?7Hq@fNdZrQA-p5?k5a%$Cwl&&nUGS`{)SJ$iT_PO&lDK$~KrljQ+X*9mfBA%+xU03`$ z@+GTD_DB>0K1PpnfC&=2hRDGT4p(au2-pb0SpoY4!E&3A0{AHpnV7U&m=reQ96}v$ zRVr6%wh7)tmILO0nUwKgB3ejZ#?^OWgoA4qAe_kL?I4ESLbgF=T;K&R6rZpD8rV;H z;9m)}e`sj_#i|I}JebIjUDY9DxlfkHH-**7EAwt*%3d%!czc!BmoL7hO-k2R(p2@@ z{cXL|ZvC3Z`?U44_pP&we-pCT%TF&eu8GV`_FLyijzj}2rJrksV7OhS##vY^1y@xn zpl-qQZx?tbXv1n+2?P*X;rSVaWU}Q5+=|iy6ebn&2#A*5UWIdUq-co8Ues)3k~sNE zZ>`MxkOoj9NjIDlRg~igXa^|d<6C%=!u^l-R63;A?eewEdVIp&w`~oH8PF)ozwm;o zjP43|eLgacDZGRX~AB(8;7apl_YG9;F0oz4p@wC`GCM9r>Ohc#|3NAJX7J3c21>a zq9;Z39wLZ^$_>SYV6v&)rC2E{q?ZY}u&+Bw1mMC02_qyEBC<9?!BMz@kVXJ2g23m} zzGkH-2IBTjc6uvz($A)+r3tAdlk-V6ef3WN0PrujP{&O67&tifP)Q`5XM@4^zyOw! zkOm0j7{+%I$N(H;XwK{tmdQK}Pzn0sMmn)LBc=`%k_JF5PfU)0;E+JiJBh=340C~# z)L@VfPBKWYIax_^^<9#05EnU6a-%htz`>$cCH_d0Wv$soH*Lt_V zuc?xNNKYBh9e5|FIl#t81Fm`z+TtNl2`UNCJe6PJ8R_!ij41%)zd03CF_H*lgP!;e zj&J}u&T>ZL0OvU5-He$R90Ed&01j|62;2j4hU^c^)1W+bDOp{o_;s`Md!?5F zjDeC!A#;rI4E4t&7{*xS9+>;tKF7J_jA4HR$5YoG@(u?hCmjG8=Yxq?X4(yC5C)2JE%)Ng1J+YgTOKUwA zo$qTc?{)X-s4cbY=HE?w>DyZwliOv918EH3e2uG-{0D$klZIY7U_lrlRoYZzBN=Su z7auUmI3NypWMFbWQVM~cuf8x(816{g4hYCR9l!<{!8jxl#Z{6P-VOj_a5IsDxFB)P z3C2ECjs|de1DgM$P&cCWx8ex5Jw^X!xB`h7iiJa z9imLQ6HCU+7|Rk>W)0irh>`};xB!`KlY#=Cta%Dzw!6ErxD#7QVxK6bA3r*fteY5M zO1(<_(iRy!peb5W#X1f#s~0G@8@Fy`w6(6U*Hvw`O>SD}i@iCh%1vE8w6?2Hb!htQ z_`bh&zR_@1qe7^qTx|guzST)&d8Q6RfK`?mStSbc5e{mi#BJt+{{Tn1lFI7V<~yr< zn>(AB@1VYdZ#oNzWw(|oEhdIYt)+(I8Ix?0$8ijZ5E_=#R?{_5wzuIl`>&KRWCAIe zZjnOBl4e23XyB39p)AqJclk=Q!XPFW-x3TJmJ~Y)3mO>k@x>V^pg1zfz-G*x;4AII%(z@sxpr>+!B86w7XoormT{(wvN~8`hB(V zqxQ6#2PhAAU>TlDfaecH3Irv%7(!*aS1hJS?%Ytm@HaNp(n_ zQ*xHh(v!ei21k)qgwbpkqw;RSw~obRD8@k1u!=<}0dSj!H=_tZ-d&kM`8NU&qj;C# zFUNlY=<)c+S@<{c9lRHD6W%Y1^iK-h_?O}A_B#QVTW=ZoHeV9>TISOcu##(U5l;*y zWr?K>idW0+HO~fWL1eb^ANED@R925rwz-ZqbtG(CgXYB8MO0RvNLhrKkuw~UC%=Tv zXjY0*txdOeWi@*%U27+zyS=RJx>))8m@2xtQj}Hw?H;S$X~jFqX=it$yEkFgZuIUq zvnFsw!!t;C5?L8I-Ph(L<^T*h1&wreI_90I5fqMzGmpCD5X|IbVcneJFn26vLl~U`kc!M`CD+lwrN>OJvDC1`dj>u zNf5XIsYVVPJ9aZ14WOuu{NoNjUIyL?$qZfPsa!~>le7%0ASymnw2(*1z+jD%qadDZ zin7$TJv(YnvrPdR45g&W7%JPh4hYI{X+(IAA{V z7QhH{rIn7s)khHtNhKwDS*_jeXVvMgyS-MsBaXEh#_r9fr&QL>xhAgkw%7Dp3mvtTyeJCF;IxeFyHyc`nFt|yWnHWc zY!pn1F2qsBz_2nB0bU<#5~;f_9txnqZ}nsljVGD3VXFO|q%uu20;H6QFhhV?tjCok zg?=})phA4q+*CYa{Tfa)aZX9Q-pOC2dg_zuWv2JF&IcK#%^qjg?n&DAzVc0aY3ZXf zWVTC)%r}t0(UT^8$W+7#EJ$6}=$YKxiCE4?2O*m^W6%>%FD{tHTMB%sWhGSQgk~a9 z)MIYOjXa`3^j1~tgaRx_cBWSe%dmN)-V`eWODe{8fa<`722qUv02Ijqw{P6MY`e(< zTrgtT;gLheKsa?O6AOSacdd53H94f*Qj$^CE6GLL?k?8pvtF0c7{aWhCwV(s*G)Hf zYddW8*G*DN&%c>oXm=|!c!Ni_HyZt|rZsIIMOfR!dPD+3<}$L%f3|Gn%$jxOx;(ST z2a@bmz!n`o(@mA5@ivfj>zz90-D1^cZ6ym{T22IrWz)=!yIIigEo~>fh60usR+e)J zizIT%Y3b2FlW>;^?-kmSEVmE^4{Vr3SuJiJ1$iJ~S!4u9FUz^f85QTAHPOz2slSV~ zF>$77dW5Vs{XW!70nqh1!&@%DrmIOT>1{pCrb~oEzhS?STdPL1g|qpr%K;u)s&RKs zw5_vgH6?o_-`aaUG`nYB7ZExWr76W!j9N=pwYsvEwb^NPb@1=Xe^cM^OJ9oKBk_Oi zY4E?{&F_u1PY~UFCGi)Td_k&s%fQ+c8m;b^6uRz_tN3@~1RgcE z@deB}fYS8)nWB?f@cQWvCH)uDCAa%rHgO_a3yGr9;QoC70N|H@9N_RarSUJ}4}*2RW5b$%#EmaT z_`~6?2fznJ*8FGLjhR1O21y2h@5mJU3Q=FioIIm^P2)9ydGL-JQ+U4hb$;K_d zQDpJD zb8l;HZ)+8u!@}ut9G7#Zb8(}?Exv=|XnxJ2+)E^h6m6xO zi6+paxSrQcv^QQ_+WA55W=U<`qiL?9nf=#B3opez9HWP*+I-JmNT=?(Ug_%FifOxP zsq~lyQh59{ohofQkxt4mSGrF~#jCZWvTsfLA5>lHH}VcIWHQ_wsE%8OWp-gSY^sy* zNh1WRtY_s$SvKQ4d0X2H{{Rt1H-$g6WP|<^7@x!bf7*)25Y?1vhEgsjSeQU=W1SjF zRP7#Pn1V|&NJJnsOvMeeWW)lJn+Znq7BGQcN8VU26tFlulx)kB#Bpd7KZu?gZvOzW zLu(&pHuB2%Z>FPMrL=J+yH9yEuLN+%1+~1gTu#O@6vU`+%Bk0q$3aE4YLL=5v(_nf zwvF`icRx$S(Sm&DXqp=M zqvB<@tD^X?#1UV3*5_F8m7UD`zQ6qK_?p4=&0^zEltboPJoYz{Tixk8g``(DH#1uK zR+^uO?r!vp`(m)I%vYLxvT64ZGs|fu-J8LAas4p=0Kr}6?_Hb z?}tASd^;%~Ht;vW{{Vu10n~g$;SFZ{Q-V7$9o)y^r15{lPZn!iV(|X}iLG=Cp9olM zdMLEgZndw8SN8ga){XqhU0lg;bv285HY;Iqbe7sjQgd1+s-U~x6ERH^$%7)CLK7sYpF9otIpO}-SHwfcVn@vqftW>wx1D8<&P%_SK| zDY+{~DKCX<%OwaVt?pSF+#!#xksPfJqo0|2P zqiS!RG}BM)tE)DxyH4w?cTZhUm&1Kt5NfnkoxRT6#j88pe(PUbq%p`n$r$8dagZ5) zQH~A(Bawl~=+W#(Fmu7c=Kyx(9DJmVV;N$2Oq}#?%nL4XPt0+S7bNGlc_%cvCp?_w zDcnIA2PCj;kPZe2gvUbwiy_-*T_qx|x z`i5H}h+O0jSQZDaN!kxN$s}XuUW084?UT?99AU5y>?>q0GoI_5GLg7*ikN^7;1zOq zhFp!fV%!|EuT7vF5T!|M9F~H+w(UWJ8*c|Kova5{87q;rlB!1K8TmS;S@(8!T0I-n zYkplVZJ91MzPoF)(O;#s?*9NJZCZGi>dt8HBDJv|PnIJB#vrTZ?QE%ZbwX7ZGRlg> zaFo9C&U(4NBSWl5uuV?RFt1J<#&6vDP3*y*3WzQR%d#AUu_8qVP|a!4B=n@iurMla*4tN}K{nQb_@1B)F0p1hJ2_M<|g-7k+YGnZODLU53yc@vt`luJzqn zwQX5dT1bMg1hU&Au=%mQOlShLFaQ<6BWM5sg=Ujn`%DQNNAvlcvgSg8mmI_lt`V>o za}^?%%s)n_gY6-nUlJs+Unwap;!L_FTFxcGFEXYogTGv$?sqVUqh< z!6rA#kh^|h6q0$!899$E03G#Ct#5`8hGQUX7GkamED}Ii!z)HXAzn9NNsUU3BJ&Az zJcpJJ8*m^noRiBlpDtzo5V#;QC*?xSYT_-i8yy)>AfK8q-4z)tzvam(yL;_Bm~aRM zGsIP=QCdlAwZ8XuU2f8Q>g?@p7-8sAl$500ZPj(Pn)p?cS|_7#(EftI;NQR7YvDia zWBX*EiXXH`#!n9X1O1+Sckuhhz6kiyeEtmhf#d1CV_~ECdg}AQJ{!_}JK${>#JZ1$ z^`H1oS4{CO-;cD-8t+%rwEHbn!cbgjBgV4d&;Fsl5Z2em9uUwxWu|G`*N3e&O%F@e z&w>0;rY4)>jT+Ngu(Z{zZ9GG#TwPq>_(5%-XMpr>z|fHC=Y`9eam zTDL}#Osf+|G(<$ftc#{e(HItne>TF+hdcTVq3cJjZPJ*A18jhnWX^w}$| ztnKsYmC--UF_Lq}NMn+7j&jY$NjMoeBa@OuhbJQ>WM{7m2_zn^_lIT&JoGgmIRF(o zVlm%8hu5IaP6-FJz~p0t+d1esB!WTCIOibr~L(t*y4&{&wwc zordJ(oUqS4oa`rzkPd!)kU=CKPf{u%TLkm#$;k(d%wCsgTXn*Na;npJ#78kb-K2`m*`THY2HgqceS*# z_0s)y^BAjc6=fjC*vJJ~bCy$-1BEM+ODW@$G6SERKWPmiHE#`R=1}rS2B{6&A|lJa zXd;}%8a5?L6?cu*mBEaVaAX91ES9p!p^pjHGl<6l7|d8Wcj3pU!lGmd@a-d9cYv3)_2m%^H27vocW|Qg#>J& zesQyC1cgKQj_$jwIN_SnuX&`dp1)@6OD4Y$y6g2$GUJXP$K^1gfW>=kM5l`D&@>iGeQ&Q~g3sq*}_$ zESK^OV1f)$0stpD@|Dis3a;YE0a&t@1NrFx0E3_O9XcQQBcH~5&$dqH4~xIEgX~0E z&B2%BABOEDjk3uY%r`Smpv0*1K^pBMQuXwlD^0BXFN;g~n#$_>B=%0q`r7aCKOe_t z_u8ADEFl-yEQ(#c)<`fPtAAMi;lSnWUHs9&%Z!g=xk0LAC=j+}heltN>> z{hfX<+Qw8%B&xxZFoFEonbaM-lrPzT(tYB2VYWskzRfkvM6nyTNhIu7AmoNth~RBM zC*QrPn5ou|s!x?#&sg$BCY!gTeb%~Iptc~8NzW%aBWT<+ju!+G z&py7H!mWxPz@6CVoM3Q3B=h-z2P2*}))oMgao+%E2N>y`5?GF;_QyD-@=ga*cx(Zl zMoA!(_p_0K#(5{#@ytZrXK1+ey{`7NTG{Q_t+dek>J?OJNy_>w->sFdti0^E^w8$+ zG&>nA;b{>!fiF8#aUq$B?Sp}a0ILu)wTatbogcJ}(`jBkfWr5}C(&Waw7Hrh5KVEH zWQtWJZNSJJs0qrm1Nvh;2g!gqV0X*ukDCK50_1fdV6HjI&&obF_}}nbSonwID>u@v ztnF4SC=unoc@QH9mD)sA`6Nh{xA}X+7Hls(9{dI^Q@W`>NWNR^rL?=%-&d~MX{MTf zi{X}WmeS4N_Ld=0p$b!*l}I-mCkB@_p1M62x+a%Z@GJO+0rxL;IG-bilJuON#dEnv z)3+q}RHB#$x{h(FE( z=2avp$s4wheug(Dn@U)!SGrP8Qb}6fmy+wQ+iHJM<@{ga)-^_yv9u#4%A2i9tTyGl zys*h7e?2X}$ALG*9cIhrgI2#_-F9T)oSs36x&|d%BdI&sjDh|rc%Kw4ha#N|6%trYB#22X!76@9eMb%;v~UVQcoMqtcRR~lNQa{ z$ruU<$Qf=)ll~U(iO3_*kaow~rf|6%hYctjPBDYY0CIO4^NDmX66faAuA|Ey8p+u9 zBxNDmNCfo8!Hkv%jOlcZdN51d$^axWFoefa2hA4*gM|lgJ)3oI_-lovxtfHWnr*6$ zue0Z~Y3RFXw!hHP;hqhtWfz5;(WM%S*3qq3Red&E9-QA8ejry0ECWdFhJWSwVUT0o>nz%XQAEc_j%8hNoRZkGFVN{ zbD23gkWsSwe2X=m-4-zT^HSS`kva~w3oz~fX&9ACvaXHjGjhv z1<)7-U|UaY z@3aH6la0Xc#s)!Reqoa;=ONhS<#JI}gVBlFFu57dHv&}muB;|egoFLvR-&w;y}R4p z{`W&xE#P5oK@K4X$SK*h8biWHnq8lHA+TE?* zkrnD{16#NF_wetD?k+DRj!RFmB&v5S%`CGcD2X84{{VAc!NVkEZaYIWe1~rsIoMM? zw7XYIC!zmD7 zb~q|=pwxM$lqCNEir+~4$u`^TzMVSQ{Da008R48ahkQ#sHdTbBUY1vkt4^glT(gX+ z(VXKX<8+#mPgM5U_*ec2jqy+5Z^Azp{??us`1#@=7WhUV7U>@b^(_|X!v6pdeky!M zNvH7j&%|pjUMuN75qN*Zmzo`#$Ku;TZGWyUu9Z6nuoKO4W4C|kZqwr5>_LAQ+B84f zkK(4Bg&{{r_+9%?T1F%D6s&B%CHQfBrQ0Dk@47X$Sd@_zkrteU{%JqphSF>C{?Z?` z2A`mKhh5MXU)k;NCLSNSOJ6=qPl)~if+V|PBB2qv}{A$zLp zlH5RbFB5p4@_!-ZS30H5yu`;eOES*(a4cZ%#^WH%h{hLUgD<(0WiYEcjn=57+io#& zR=Z9%ZY^8gcWth%EpGn+i?|~;tw$?ZdQgmL(yd)VN;k8eUUs>oI!UCbrJ}sjJq`XS z{>;+hG|$?<$8%-bRc`zxsakAs9b7u=zXPUy@(4b0Dw~Ckm@ZvOhTXr#KZ2HNh`(v= zP0`Co!jLxDri2NDT+_bDpG+t6Hr_V${_}S%A>zcYI%WoC<-V`bvDr%RJ zL{khLm7OGIcLw9km6MYwh_?13t4*zIqDOY|?}?#*oQI!PM!MRSo}@!=An1uTQ3pV zc!tVLtwI~fye*^XT6c%^ZEoYldPuj@JRx&E#qP1ESZR%`+iL!s4fl_ydt3b%#-1JV z%vV!O3rBbH3H&>W;BZPqbE5b&#_4Z$8)MEA*g+!^9H{C}T0atKf3+kZ5By=_-v;=v zPVjZNi1cq6F1u}I@h?E}ri1p65NTS4w3m8^hx~uw4~ACv5@-u@bv-`w!yY5>FNhyf z)2txA)U_QP>N;Ml=3sF1z~U)OFs~dvILUHJOPi4E15Bwzj(aY>(q_huZ#^qU&(@>qfSU=18@xTg@v_*YE7%y^mAB)8lPQ zzK{4P{{RI7@wSg;CW-rJ_(#QlAkusm_S#Hew8z5uC2xs;54DNohfdP%{x4|8T|9WE z##L)gF2hvT)5G2_w%HZcjn9nlBCxWD^Oxg4z~2%6%%2yRz_Iw5JXx&SY4%rE9w5+c zyl3$L08a4?_g0p6*II9bwLcK(`b5`y&WUgzO4YUh01nHmcvDc+pudAk)b)mr(&tdn zi{dwj{9`q|9}%u~F9~b93S8(~Z^a!qKuER!0171TV4K6=6|@Totn~i?7ic##TE3YJ z2#%*6yfd3*)a8!vO@CuQ$#6Nn7*(Z8mo%dpM-@pbb9d!w&M7PT?DVs0$*;sRZ1X+g ztZhm(t5l}>+O0-%RcT65e6qTCTPr?S7ur`x?LWq^fxol=0PRuW!|_f0S>fCHwWjj) zU)tZ`&WUk*re0p&+DCU5kMaA$HjAQL!Qv2}Oc$_tw?p`S%FGG`lGDNdEvK zJ~@8NKNo*y>F2!h=Y%XZ?}xgK@JFJ2ZTM?_FNwY%+)XTU%QQOPpLJmlyWve{YlmA~ zuMc>_$HBfN(&V;l%|FB1=9x8v-$UUq5PWz2mi%2m#Giq_Fh33T>!pI$`&aOl?whUr z5BR5}J4bUBhP|Zg5nlL0OFPSxD_(d%#`-M26NdTz&1A4d{-OeTyPnz zlv0{WQ>`~;uBtl8Hr15918dZxCG;p^L$wY0d<9&PnORYHhR{JsB6|zLpav$qOuZAbEW)au1BH#Hq~`KC*rTb8xMo` zQYeS}Q^UR(UmpBD*Y0AHYuD6tt!6Ds*IMvw^4Oz8YYn`fAeP;vlTh&$x_yPTs{Ip( zvy3%ZCpzBJvRc!elxCW7cU;Z$D{aen(ddtm%=kk!!Z|!tB(Seqc#05pX*FeONyA8O zw5`44u7|-BY8KEv!IN6kkUrO6HtybXrZr4Og^^0h32!b%jH#8P+|ot3JH*=FgtA8* z`qrG}i8mxRcMTa0wO@4Bv&hzDY%k0`wVGs8eGi9_~rX7>Gv0FcjB*zI$|p< zaog%&2(7M4F@>Ke?DtxDSsaGh8VgiWGMLshwkG4!#N#lHw*A}6%IYt6yGs39?QZAI ze`U&^j~B|Ethu7%m70F{GmGEK{{V^k_HXn03ymGLcjo_kPNHj zkQHZ2ji~6#f8;8Qx68m$496vK;n^nK+lYAxTmWQP#`C!s^cnvEXz$r()npL(>&ADI z5jhDT!OIBF9L%U*Tg`8HE0V#NYUR$s3k=)l$@@?I1M@%8r16dXJF;2+9e8ro;Fofw zNY}ACe)XeZ!VrQoa_H)Vf;gNjlYHFPdRqPBp3dt|y;n`mp_jtRylp8v-K3)0c2?C@ z*8LT<>Uj&Vo?8Mp#L2 zK2Vdfmtz4Kz+94g5XfCr;bpjj5D-Tr1_Tvw2H@wGQY2PymxGKb3J%u7py<3o<4=Uz zlOOCag4aG8IDAb9#ZMC6$TwqdV3$aS%PI2!6#yizK_n`1Gi$nXllD=qSfepMUDl>` zC~!$7S;eGx02L#y{)Yn`*Q52SGy5%U?$WZ=TYEKaxB0El9&=7jMp138dbMjMt6J!- zrQX+OoQS}wFv__RfDzFHDcTSK3oK{u1?#jhCPJzR&zdsIc0s=cGM0=VoG>^nlP}H* zI6HDkKvg&ukM{c{7;g_55r*L;dgiDUvj$M*V}PQojHwI84{f)(y&P)DAxt$k{DP#X2$M#ED{U* z*{vd5tBZ+b^eH?~;GIjux>QzH`elaO3)Q&Of3vRRm}~cUP(=mRymH*^lJ*NYZ4z0M z{#z*uT+1bzBdLEReRD;IHf=5|$+bP}62X5di%m%6mokYOTaePQ+%`Li+BtKHesW~Q zzJmJF;%kea?B%(F=%ki*ced9`Bu&mdxU}Yy-J|)LQsNm*LPgq0b`0MWnBk~mE2*wz z*GS6AZQd^K_HN$uZrAPY;W72_(48c`r8z}M-ji}k#w$-GmXWotthBkUEv3DVt9fI6 zYPW_M)-~T8%mYgVGe>lgsF9#cnA`0O3Ac%0l2?hyY+}0T?W)?{>e@ZHg4W4To-Sro zw`kM|frv;$+dQb@rABo?WJQQ4n5s)%UU6@8tdwbFpuch{o5+BqMzgeuOB89NsapD;jxf`pCA z*dve&^=TLoB}*$axdJC#a!M!;Tjj%KXK&0@mcs5Nr!&KQZpKJ$6qh4(?HN0U z;#-oYL4w;EfB+F5K>_Oq3tb#diDkHqFdKF;^2-zo7nk3#fs*D&I~|G10bjD3akiG- z%FXHU?Q1XY>hI?FIUOnAM;4^CZCTsgz0+2E?%#WMRpp*2!r)2VZeUoFtV=fpovuz* zSd1Kv+z^!(_AWs3^SI=7#y(J7Zekn&8)3?>N`+kH+|=z-Be!t1T@3PY2)MS(Z5Mv-<1`ZD!KsXr5`@;o5%PtN{s`7b<=FcYuj@{>x#(5-z zfs&;2$ut*;i~=*pcN2_r*C&-EgNy(V_eUWK&l^W02PAR9&OzrLc_a+53PO%N+O?a$ zt){oPn)CGEZjR+z={LK#pKiTv*=we|06D?qj1l*jB=hNk^8yIm2I2DXF+k+-SJw*M zo->@}V1w>6zyOS8aCkZ0#xh7FkPkpc4hiG{LHg#CAoIb&$phxj2N?u{4;Te~un#7% zg-&*_ZmsT?w*LT!y|1p;-Co^o)p>2zE8DI0v3AzguAE6J3mT3|$t+YNvX*V7RE*_- z&+wv>NgHoHz9U3!#ScXR(lr4J##G}N00$r*304OHo_X(?lVl@dDuXJ4K{)|VN`@mU zLasqvwh27dTV<9OX$+YqO8)QfWQ=1ccSZnb8-U=F3D2QMH0Fwac!$J?*WpZ$JBYUAi5pXhsUiiWNgJQMU_|xk&ksCp;+yaoAvoHNcIAMhPVD z3_{`8SRPe?Ax=;6j-u3;%B(Uu1(kx9 z+5(91co+u+G30^Vft9YS$CY-~S*x_P-umd(y?5M~Nvm5=H@3@7?(UN5=C##qd8`8s zuEZBy1_g75eDE{V1)Bx1G7d-rgBb%7211e)vrW6(TXa|Jd*8_COSbYrKkSi!2`UG;?a;OX9l@uo?T|Am9YGv% z!CZ5Z(Saa+(0;Yh!>1{Sc1}1dO90J)NFx{^ADC^)=Q#wiVOs9SIO5!Z4nr_J5(xkj z4piZ}0}JiAfDOW@ziZ!TvTN-6dF=lHI|?-Y7SB|lMD%)Smsf9i$s7VR^9+Jca5%`$ zaCc|9Cz02TmHac12TTrqbM)#u_0Do=KBv%Qc1h$0ZUYhqIpaCwAmCxS2Lxle;~ehK zAA9Bto`CV`&>vcpO)I{dzna&Zb$;ERg*YYJ*1p@@WcK^IY1N_SdCwT+@-u^y2_13A z2ZPvvGD&W6*S0bV1b4|i2Im3{~{dE{e*&PFnE&!F5e zGQ18r9dI~3DJ6YZ<^A0?e<#)7U2kqyt)l=&LC15~)b++NMgizC!Q(1$Bw2zCoRR@N zjo9G!;9!H3_dvlI$jv}l403VUFf1}j#xQa+I42+z$OHf?7jekWae#8%PzM_i-UA$v2*wTw#(6nBXZVy;OlC}#IRtQ6fOs5W z6V7mY9+(*!04{6m%)FJClU;AGeV2Wix~7%1>2;<1YtvuXZOKM(dUhT0o}~MZxa-pc z0|t!eIKktvJQ1At$5Ghv+yTKo2*yST2fv}m7~tnU@Bv|-4u=_0fKLR0jz?Vf9CLtr z`%-r6wwl|fmg|1YtFub!wqLVd{{Rn9JFcFV>7efCpa&$3c00M`fyq5c&vD7f4p{W- z)1H{?{{ZSZ^&RruoE|U_9Z&TbJ$ev*Gv1W@=O>S$9nL|=Zl@d`ow@C2e!6tKy5(DF z_g1~_+jV#hA4B;XF^p%pJQ4mq{Rh+5mm>uA89ejXo~Ld{PUHL89383b0bFs_ zzoG6aeL2qramIPipw2QqPCNPo{{S7%NFDkUk<+hCW1(Z7z~jGCeF*G2aC!{<-S9dJ zEz_#M%WWT@Pd87;C#fh zR=0(%uWvj>WeuZR+m(_@T5HS8T|Ox7lHKHyKG}5X6m!VnMFz$)yv-DGB!#@Qb7@k0 zUdv4$i7WiB{QiA=vgH?F4yN0KsY%I4N!dwVC#u zcGFFNYctrvZ+~@V5x9zR1*QCx+v(Q%&Ze5FD;2Cg4002S%zH08E;`pQOT5hX6F1P zfH=t{vD=UbEuGuB3d@t~QmYlqD>n4zTP5(Ve7#odbMyL-nn}i2P3g^Ly}bTUZBl!h zGB}qzRBp*(kQGSC0ho+qECP_kjP2xt357)PDyf`+rGfJJ!OId$7GJy0!@$Wo403LD2RTFl0OtZS%n@=ihZ!Sj%VcnR0#}N4 zYEn^6=_@sFN2QY5-g@h2Z7%s78*4=Qb&qGue_LN$E!O>@mf?r)(U^t>{o<-JNFbBCpJMUC#LBASh5?lWpi)6B zFsE@0018VD!*hJf1!@^0f0;a>4$yYwY#BlsnKH_(Lk+kgRf6^kIb$U!89VE`PfxSb z>FI5C{4Z^xdtJ7)UhcQj+g&EDe%jvJ>Q#+SJZbC^8Lt(b5Ba(lI zp#ox&#y|%uHsq)qfa8ITDFhZL7{&-z&Nj;%j&gH@w71N2l`I2D7+{uM071h6h6+?3 zh|rCay0_@<>(@>9R_I(LwNBdF+wSeAul)M-)aLFio1qQ})6ctdd@`8GWQZtMw z1HNg`65Ou%wndN`)tO`5Se0N^n;V&c030tPEKe1USaK%fliRO*J+xbEw`aQ4v|Htb zuHBz4+evAo+q&Dm?YUmse=Z^lWS6-f%*Xoq5PAS9V|4oByd~9 z585U&IM}GMD`r+6V0W@ylJdT|-RxbK*ygsUBvhrbDB^0wX(4WY=WV zV^v7;BT7_2xE$q@RP;S3_B{CAeT$ucNz*h8%q-OFekjmHz$*DdH2Xc};)sFUZm%4m z+Yke!aN3vnYA3H1(xiTb)%M}U=0NFXmFS$SiIdFpnfyX8ALnM;oLc?i2MMBz2Mzi7xLOUG!GSN`n!Nti|x0B$0=le$i_I^ z9$xl}67lWvlXSu$-@V9Srw3?XySE2(9Bp87KqR&RAcB5_EYEQHg(X%Nl{U1JyT8J< z*}eAl-1Bn`p0-<8+18AyO3H36-AQPZi%!?N>XW^^@2M@;)ljR@Z5jLd9F^O&l2~Kr zLLpgTMoKyJP@KrsF4! zbUjC=03ZW_kC!<(1b-Ge3EDDw`9T1HRFD8uv~C4XcMJ@Cq-@)o=BYR4+jq9N>E)%g z+fTsdmb=?VueHApw)9%-aq*|x4%m=ja?E~ZQI4!g`9K8VumdZAH*5uFlHT8eGQ7AT z1qIMJP|8>;voRpHP+)!Iy8!KtVbyiJ=&Woa+VYSUAXYLF`=ORd)NWEp*cn2u@VqF^ zeM#XDf!Z#GZEbnu0X4<-#oRV_`dV7gdvQFn?3l@Gr@=f1_`s?po*8CXWPPzS!xxu! zJREj!93Q%*+j=CHvXi!nEp~gfyV;}N$#QAtRc#t+#x`!GuBr5UM_F%cuCCn=o%9b3 zc%#OuEPOMhUFuWlB73{dUe?T{R(5x{5NsOd`;@YV*4pJ|HZxwbI{DJuyEI7@aO`-i z!P?J+^*cDPHH{wP{{URDn*3@SJdo;^Nb#9%r-CO-Xl-q-eC3WOxYLE_lb5ZEiKaLRqh%eHui&(<8UjJS(N%i7)OM<%$hD?r5#9 zoC|qwt?r|WS$<~mCyaE6cetDbh5}QhTjB`%|>I(BO{l`U^#peK${rf9)ub zn_&c!&v$ba_c052E}^xFCAYfrX=hb&5^#2mW4h(%lZ?{$l~0AfZQ!-g_iO|59w;D^^O+<~~PX&Z7uBX=MMJGcyZ7%bQ)W<;Jf($tu( zPNRJJ8&cL0AS8pp*(MYYi@_wE;GBUR8g7XLW*rgbYy-aIF5L;p^I5n6fKJn#7Ws3L zw-wlj32&k4u#Mk+?v^G*C4oLfYEib6>R#l#(Ig23XmWBU>R09LV~``KjL$0ryDOfe%lBaWXb z1akIe{{Uc)217GvI0qQXB=S9p>(;wz;UKMOq}Hig?`7A^=X>q0ldZSA(`{{kTj_mz zcezxdKf*hn7_ZCFX9pP01_{W(?pTG`<2c9*lf!d^oxNCNj0_bS$mDVbu&d7m4CAg& z(s(%C$6`0*I2a&~9kFxM?wsS1oB|I8jzA1BFhR&1V~TN#Nph>(RQ~|&-Itf>*F=tI z7T%59eQ)?_rLUsDf0kQ)q>hc~PUFrwCnS~`&PGFH+yhml`$^=IMgbdG5y?Hl+)pil ztOrBSO5A1xIA1}H%mE>R&kd2D*Z>{a&H-w!T|odUkWV17UI|cgKq}Y+oZzV70!{>~ zahJQJzV6(XZ2eUfp_IuR{V=oRYseIUoVaAd)gvh9Gm2NIB;j z!KyMP!6z$`$@!yV4hRGsXVi5#!96(@*eQ*&0tFlZcm!mS04mtP8`mL-z#qlcSr>w! z{HJzE!($l6OBLvHcHs2rdLP+XY4YAnrPcL%$8^6-+oq3RwB*v&t-8A{tz~qrr+>Rt zaSqww>2N+c%Wem7B#h=EoZw(|1EFudR3t@V#*J)7G0F^rGn33io|qT_WE|(Gcub^! z$HR2N03aX`PfRHQo=4tOgPe0pQP^`lqm>*WAU7c36Q7qk1TS84G0eQD45Ib7O`~hR zU3GWqs`DC?i@I-Q_2u0))jQj(@21-xXl)^LgP=sY=L@tj9OUIxZeG1nc2K*k3jH(X$a#df%GGJ6*Xe%k_BhqEf-&;L2|ORTah3l7fRZu@$pn%{00dOQQFsxK zgd7%bg|mRDK~N4cjHnsNJvviieuE+sK{y*kECT>>x61&WV>t(?&UWoJ2}{WMdwF|c zlxz&~+B3L<-zf|;#&}={6U(I+ZB?DMTD`wD+iRx0_Kj6-tz@0{-?rUT)mvXCV=bxg zka)m8oDsnzI3G94G6qghCZ}6`cFqRuw$s(@(e0S`Ym2TTEs;E;VoVX?SlfxyQU?W!}8oP{{S1Nd=_0oNEfz`)?+6mZ#6+0HY_ zAcAl*Mgcr}c07aCO8Rxl?%2q{AOH#Nk}z^dU`Apzd2E`qySBb-)2#mSq8Pjoxfiby1DY$sjRo*I5U} z-xm$5BU`v$cKx2%pJ@(h*HT*~YFGJI%T>k(FxK=sFbBATxaKi@x=OnNgu9Dy5w}w;X)I2XE z5>L+!+@LG-gR|^s7yuu=)O@9K1b-`~={XCiO62lFT9Qu=K+2~K1_=abo(RTi^4-j; zTkWz&fpYCCrMyFvklt=o631vNg@-^0%2R&M5q7g{Tl8r)_vrq8Y;O!@M`W72dfi30 zq#Yk zD=qqN?4#P>gF0bVwRvf(ZqKh*fA|``Eur_0z46<@S~3;6oeays(sa1ap{W-oSP2`; zwXn5NSdeZm1dO{(XzU3dC9eL{el!ATd?lu7-Vd~t?Oj6Z*3Vq=42m)bmo4p^*xJ0r z9%9q~0CwkcT!%z)^5@zlT&Vrhl1Y#dvhq5!MiGhZdV`#hSneWk{(?*(ZO6yKkx@gedX*8_)S9mL3>1|f4Ro>fa zroAS=u6T>Y_djm&9<``yml31+a_ZOf-rOW?;1vyZGZ@i`z>XcELa6eQ0+G%ZL-MF@ zzcvU8c^wYWHs>HSi~z$R?a7Em2<4@aj1RjWIU%qCVgU=sJas$(GF+q$q9z&0B$5|_ z$3u*sPXoCFb?+6F#B^JI^iN`wI5Zpk7;;%yL)H3^-78&*9z&q78+$YWuE17NUL z`=_rTUkdpJC@*DK4=L&Hr%FvbMcYfsUHLADp6OSVuPDte-PEmrb>7Wd+iQOMSsL%A zX@nE@H4FxFA>#y)PWRft^VezGLgOO@@w(^Pt<{n^z#C2!1sPyD%zrT$19pB;NWkW$ zyYYiEm9w{ykO=+pMc8*K`>_n1o-zt#=R5O(m1m>)lf=^h0HWDkTnvUH+S*A~OA-d= zRdA&2I5J48a7jH)csS)Obd@Xx8j_U#)$HK9@~gJ_W9fIlPKME;8ho>$ru zkLHk)ennnMzyN|&`<9LHf>+x&h;JjcQS-@f=NYHLB|$M;VmQflDYdSHF)X7Dxvy2x z^gRbeSBpZ^Qsz`rt#RcD8I%GY8S(r-oP^CrwR4^eX3B@d_=>yYur&X{W{w zt)hVH=v`WEfD>@Vlp31Xk327=F(^yJb)x7DlEoZ{YOHr!u^vJqg6a|`y`DJa z+vUS9^Iku%{6+B=rbISz!{N&?FqZZcGT#&hcAL#cLf5Y#Do)#VwNe{shh`Oio}M=# z;l!OjO7-b0q`7L;i@a5@tYFi#yZ6%7-Pss8)WmghQfli+##?Bvxul+*98+3a?Dg*x zc(TgCzxLLlB=Zbn4>mZ?K1Ky?5ro?ma=1bOU}MQr&Ey)FkM(P?W6==lcI2JcFhsH4 z5Jugi`TlszV|Hzp2{Lwpv|#z*$#TJr?!>#u;|uEFG>Bx7<%ulYNh2eIb1ubv8KjX& z+ybhZ6?r3oPs$EM3=F8qz&$==IPn)T$Ei`LNnxoy7b9+aq@T4`(#zpd?%T1`M=pe9 zr8~{5Xximhw(;A&o&Nw7ND#9#xi2G@FC(#i#mUKH+_5dxu^X9-9>l-c;2t=}eR^jj z-?#%K1FZmL4Zw_dI5-84LFHooOA>X4h?JCX=ZhE{cloyx z2LyqZ`FX(T*~U&m#aGH_LMm~3Z|=QY_jT#2yKi6e4rkT2y?rj9U3=}nb2Ps=0lCK= zy8-|i;|J5PLJwY>Pjw19o>@-e@_^ano(4xe{{R+7K{>8#%G-gAazM^H9-IPCPUH?b z;AXAGbjgsQoytHbBN+@q;DgR{&Uh5C)txDFxi@~AruJ6*?7F?$M6R0O%G;~yXRE)S zoqL-%lSLyOF+3Ci5O4<^?E`Tjjyeo*K;YDa$|NhW0fLSR3{;JyI4jR501$FV%2X0) zM+B0bmS4Tj;s$fMPs$q{@sreG9G*$OwsH&*RPYDN+2}x31e^}5!RwGmrF#@5DwB-2 z*?iTLviWbT*G2yXQJwr(oe0w%;2jj zbbW8HlIpd(-|uN&)_v)iGVNkl<<9WfbpeQ64WNz>E0Umaco`U%8XdLkZ)F>R4hcoh zae_!P&%x3a3gDb-9iv z*6l7DNF>AVX=5tyZ7-PE%OfmgCz#5>tI9mEp+u?^aoC5)J}$Sl@?TWEHu(c!zGVa> zsbmQq#A)V*`9mamF_Q}>&RoNksT^ur|Bp{uk3aa&TTX8JKoQW|n zw3NSuy2*S_a#Sf`T@^?&rrpaP1E_B;lonLYnIyUt4Xxp``KSg ze7$e0)k#{>O80DYoeCG4jiiA6krE~-8N?oBDI|ohSi)B27>%V}od6{6Y>czy z-pi^=8GhXmQ5%%r_JUIioUYH32VzLsm5F3!1ym}0i52dQ_VSfokzjC=102A!kCzG} zkurA$XN)A77~HDNa_52}@=GMlc*4r7C#?g(SeAYh#)0Z@4ox7x! z+FPXh-q&~E=i5eZDMl|xZmDT#=+nEpw%aTBXHD@I^WjbP)t~$;9XrPQd=Xe_ji}4x zJMAKQB)|J6-Bm51(vhQEZ?+=cTF)fnXNuxT4YGL=Je&^fA|a9%CPY6orc^OpbsN>N zc{x@i3Q?PpZS8H9u<;~nqdP#5%oN~^uJFZja*nFF-NRrES6C#Tb%#%e=2>KQi6W6D zRdw=7L1irs?UR!b}ShgRx~GY-r3vIH4D2dJJAj7 zh^Yz%g>G5~bzyRZA}rzn(hv~uiIk&xOu)#iFRj{s%KregCZ!Z|!|=~mQzRoWwxi*D zYq*Ov%%bMT>sW^R+F6z&V2<|QDP&ZX+s7sqjXNLNv*UP*?lbV`Sl(_dwAkb~S`1MO z%ZsnG+rpPp>d6}!CuO!K2^<+DXyut106EdlC{dbfycaLJ?NT>awbhfg`n#J`ADb+@hT|?v235}?I>OvX;5DcaCUjGSGQZ))^smY{TaFT7>(~9M7HL8-c(c4CJ_8Lcq zG-OrM{2`}8N6q$&@^uTMLmaW5@9h#~ZrX)iKyR6FpoQ3dLR*B`*HK%kQTwPOR8Wi@ zg~>)}fgpf_G6MXoj1YM^b?qAA0fWR5%_8BN8Lbi-utP`!CfI-ksB?fzsR2ueR!QGb zwM+(6J76oaEU|O65T#2Gm=Zqm%A9};F%|k;F*sS$i-lN5>h^*R9dv z)WXgWnZ{hwTDQEC<480kw&D+?=a!Nv&E=O|q#Qi6P@S1py2Jkc<`t zgM!VTL*@4htNpQR18Mh2%@JLTl`M*`<5U=VYG$jf6L0T^Nl9Jd@EIHyjVkOQ7h zNEjdzz~r2qbI%8Y2*}CCo~3HAxn(4yFd&8uyq4G)cP_kU1YOAmnqNaNbPgAF}-PU9D!mPhOr)U7b+c&1&AOrTyFWz1Mz=(3rm9c)>hm zk&sD0d!Yd1Xg#^fz{OW+)$xIjGBVgFJg_8@l6e4NF>hROvQHWSzz>uHGFvKo0l^?) zxgcb8JdBfzHmMrz91=3?xR6*39ysI@2R(M+0p7SOVj{G5y1x3gqHm&4ZEbbwc4-)< z+iymKpRJSj^v9S=$p2)R49kGgZ;7&vZo#t+>i z0A!wkLb`%E#{{45;IZIfkf62~2aTjJTmVjF5=AIEkptX~_(#p--ubOvuc3L;5qXeOk3!VUC;g}48h24X+wn$%G zF(ix{3IoaYCzc(0f-(s`GI%6`f;)!n+tGkIJqmzV7#PXv*alKE*vZe#(>BwL09yf6 zgVY`m%6AOl42%Pj)L>G>^2&E^)@k1T{I|W@*6FAC)oV>%X|?RH+iTj-y1U)ztnY7l z9S$Tr85zeo!2qZ{Q8E$yKpvSpdC1_L01rcf zgMrB7IaZUC*k`Z+k&+H@Fmc;}+D$p_P^z~Inaae#7gxX3+tQZji5 zJ6PZnM<*F0CkGywIl$*6GhiIB8NkmN8#(z21dM@#HuIi`t#d(8-`cCaZ129E{cm>e zZs$29)LovsMq2E;S!s1;t9n_rWMA`klA{BtU~oXm8TC0CPzDFF!8l=(R^(t3N{kco zk$?d>I0b%OleZYa-~m`nm~GCaVVQ$8U|^Gi0VTGs6dlS75Wta=T2Jjecyb+?Ko}sl z8BW%49e6vG5IImnkO}+MQ=Sr#x@2&2)zPGxHt9>IrSG%*@-M0O2 z-r9L4D=taOfDSTW0N|2-_R=wh9AhC$fI(bU8DNNp34t{V!$rw(9 zLM=+#ZOgVyVVDL5NmVQW4dtM9$pkhsK@2c*YDr^;M95`7F9s$huooqO40D5nxF{Td z3gnI|?PDalTve5=z15bzY@UnPTdfUw(|nGnOC*0|?q-RPeJ>a^;oMYg;|GyJ~v$y7JYPTIxKv-KNskD%-aub?12b z-*eF-(zLx*C7(pOiXj|K&to|AW+F8WATdp{WEd>S@kut#s<3&IXB35|p=Eb8c8fi| z&zB@KgebQ1+X$vvq7dJ@&n$v9+R!pf49O!1k{K7vPGa6SwPm^U?rkp7%#pMUENqeh zU07T~On^A~eoO*Bc^CpkcN!OnFSS;h$5sxO$zwdxU)zhB8abi2eRDsl z6gq8lAcXsMYf`Tms*zEY?xSs2!kyZBLhsY@M;e<>@Rj*_Q)xRrRnl)+JMXTky$?h9 zP4U;`kHM>^yZ9yhK>SbmO{mBO*E(*2;yrIn@cy9WJdV@p)^|%|JZwpKOZ^^r!Dn@h zs;M7S$NPW$QSlwCX`i&8?C1L_{?<0Khl*bic=zD{0Ec`j8D%CxyA8FR?XQ)ulwqn)Qm4&L$=&-oN)Bz>_lzZO zkGA^ue?fxHYSWJ`XsP@vJnPy;MO#naMYukR#V6BUPr8%FpYTnu9{r+yclKKSrT+kC zo7o9yyiNN$e1FouG5CJYL{cYb@E^v13h6rJwq`{yf9hy3CdyFz_eFABWnc zEZ=C+d}r|H{{Ta|iB=&X4)^~6VU|LE8ZtYnG0M@1=abd^CHq8v(SHwM8c%^gXwQv457OIX7)zHPyLNc21i0 zvwQU2amsY-%F>Kf8&_$?J7}K1<&4ONjM1nwYJM2kC4pq% zlC7qHY|Miy%NUa0KsKQ>!-*cfbHWyyMzcSNuWWo%;U5ugT{mNCx|%?eB13Q^*%jEb zmfcl=QzhgOY?Z=4?-)llix1m7p-CPTE7Yu~V=FxSdopYE@@;txJ|=;)8#91w|^Bs zW?e$@-98(9Ztz8;F)~A={8rFBSsJSdRLL9~_rtp>e8vJ-x%2f|yxC+&dxm%;YV7n~ zTlQ<#3~Qx+)BgY$J|E6P{{W!)*Wq;9mAgpIItDtAg?vSQ6w3^28%Si*V#l0Hs<4qF z_Gxh?UR%_|N*7O?o!K{Nw7HekdbO&*WO1yWUGmk8?5><-r7yFqk1sU3?XBL6R5IgC zyG_>fSk}+jw(Tm;Mm_8vf`|)~L^G?(!ytjra-oi^; zk9pC)9DGUeo|6u%ZQ$F#75H-M=xU$Z-wq|c@qF?<%mxT#k57&}O@2%JS#8=&dz*bJ z1iNMXJl2tjXS<5I?JPo3T&hhgw$xSq+dp|pH+_<`ch=oGW0utR(vypHDOxg^vt z7MpFmd(ugAr}ngW@W0v9;$Efj7vkT8{C}&qz2VtD2K-I%?yKTyG#9hD@$ZK`6?1hz zhW;ej=(=Z!AbmGjn^f>_r>%HS`%1kQaL;9{=y&qn#QIcmxAw!UCYgG&Y1WP5?PE9FY$_^wSaQi{(}(Y#mi z^7%ACaUTEV6KAMsmVYEO0Hy+cjYEN+*zeiEx8gk_TO02Yo4KvLccy9fjjm0p>6(V4b$zMn z)*c+Oicb`2_A7a!*jTQO;UlNq_&$5dC)L{C<+NW~_-CxzUijkH(#CxNvGB)=H7z>Z zPtv50cr+nChh+r!*U~{0v3Q2&D@k8i(Ou@&ENl!P+O}F-MPX@k)@q&s*XFpt)wJ8q zb4j=s14z~NS#G>>dVC+NJL$T9m*PDF+g;WzG(CDvCsLBvQq=U@i>*^alTp#M9b-c9 z=8LaFo+iKC@V9_3wB%{@Zxw2`dV|{PHnUu7S7%?)HHa^C(`lezY91i9y^VCsEh_fU z#9E!NhP1m~FG_XQwJ0y<)mK7`#dkj=9w4Jn3hC9HVyA~xrnGa_C1#-r^2KtbtmN*~ zX-8A~YMu)XMzm{2l#-0&DB8^?<9#5K()znKZ7ic3-_*dii5}zZ*BZQ{(kq*LeKm0` zHos<=2_|`!V`P*=vKb|qJdJK)RB7Hw6UKjPFN%M&7s5~3v-XMc@5PM+Sl4`Gb*B6| z_($-Y!}_MB;%yS!#=jGMfA*)-q44##fvD+sntrqJw(ZY|{AjXV$8UY2?9;!tZf4b2 zP0~Jwx6pnqL3JFOW{==qPgj;}YnUT%9@%N09n^Gq?-FVDOLHW8_Mxd?>892z^p8rk z(yh$$Hjk*z@TKe@K73~VlfDc7(i+4X_l-)>Q$>Ng2$HW?PNYLu`=ECO2*?b%hJBMgu<6jl+Cm2*y<%c&k zrK3sSaZ1*|Gj>kNCV6~IDwzDg5rd(OsX}t1;~7z$VA8xFER#-3GfBoy+}w_FP8A$v zzn1UX1NN5IuDlK6-wt@&#=5tOb=%wf^}Dw5PPwU15ZB=t9x&!Y40_~36!)})bbz7Tv`u)K9?B#XkIweNy82_rGCU3Pf0z&BM+@Ms%BcN9?Qa+IG8dSLFWyk*j!Vp31#O zvl=zio}B7ycALAi*S9pSYqqpMgOHL=GO)!t+UIJR?Lv$zHc-j|z(8}cNnT$nRfysLf7pJ)?FO&muiEdzaZ9~Kw|^48 z9C)tB%@Rb2rTi7}j{fp1Z=F@O0}H~wZuvlDir#0h{2QVB5{XRS9>4Loimd~fj5j~D z_M73IMPxE2-#<-@_Ehm?@ib{J*=;1au#~E9X`)vWN8`_oa(bzL`cQ8~r5Dqd?a!4( zzb7yF3LY161hiD?O(`baD!o(Xvr$n?Tf5oq(cJzg{2k!$8+<_VMxWqMhkg_BPmg?O zuRN=zct62f7O&#J66;T4VRfq9E}5Zd7Mg~ssXdmPZ+od+t(B$2+t}M(+)87H8JRHS zx428lVALVI3hwP9+oGGMNEOV&-Caug(fLwFQdHQoDOM<|&Y$SD@W=iM#qs;#=Y&2S z{51WVzi3~IKeMlZJ`HPrEAf}Y8()R<{>xtyd|TmP8vH`g{6*p48|v3z5xh;{&x1b^ zyhWz?qfYTRh#OYXd}ZRjf5R}nzJi)=o20|wuMI<@{zCr%!Ek@zpFgx-r||6l+nyl! zE8$%a;~&Cswx6{JkNzG@@b|*kAG8;N^}R<-u+zV3&lY?d_-o?t8);q@_?_Xu9BTL4 z2gkn>_*2C9x@U{*{C(h`8qMMF3+dWtjO^_*%lMlCh{P&ts!mc$EjHWcX<4pbTkCFJ z(zE7g24ldu{Hm1d)=o+q&PlJ`=$lPST+)isIY!O7SwSUp@OSnj{hxjmd_vOy0Bi4w z-y5_)8~j4>=j^5M9Q;PH_)YM$TZ2OJAH?4o_?O~ufqoQtTwnOMJr~6iczfZGg)h8p zd|mMaU(&Rzy;dC`PqDGFxzf{9xz@D5BKYn5Hu#6(H-^3({6@dg?{pst{9XS5gu?g3 zz8Tf7t|##}hhgC@QpU^e6W!eCejBy%Cx$hc^-DXC3i#VX)6R>k%MP*O`3<*>{3+u7 z2Swt31AfsT8b4+)in=GpzuEK0y6?gti9Q=^v7vaI!xt9cY_hS|blaUfQ_=3B)U5Bc zuMl{1SJLjTG>t<<@fD`8q-q*{+SqDVmx6nNKcx8Q_NDQ6#orS6U&ntLb>9&DWbuE7 zZT0;-Mex^+H63Da3_{*0)-~T1>w2v7rn@cFGwR+o@g}9>O;1Vi?T>^lbsbV)KKkbN z)Aw`z_6`)W7L;m5+m$|N_Fn2OE}rg}ce{Gn_4dz+0D!q%6~H`wLZbx1ASPP6-e z+2n%D?RPOX)x=U;*{#jQY^%a6GDxA`1bBu7j-q4_j&?&3cw`5tW{uU!1)Ye=`;WkX zw59Kbe`oDq_H()Le}T2DEniddbdz|>_ea)mJXNCUo-l{Q-|&)Y+FZJKi8Q|sU*9&P z;J*y(T5h@Gp9y%2SkWiYt#t1S>UJuOXZdGO@CLc9YS3u68vNz?7`^-V_dc{afYo2S~{>T^t|%d?ROnOS2YLWH9E`C5zTZNl3}mB!vp zYTK3Wl1W(SqN`2XH2JRW2DzGPDBbfktoq3%Yd%}b+|Pklh1e@WE$e{eEb_$T82}`q$zjJt>r%9ghiNx0|VvBfKUyH-d%aHuZN$(Q9Uno{FCHF&DPI`)#0gEDEeMqXGx-Et%wzV`eH8t2z=l zI<7cs$rQ3YklaS1Kp4k%j0W<9AQEI&B1KWSmB?Y$7b0e{ylbzp+v)e#*V4-kygF(} zEYn=cG@BxcPz0K3rIn*wcv1fv18ESOQLUA0a!m70rc?lHSoP1&xuz4S}XpPlyh z@ku1e&X!j&bZDhf6GZfaSQE`?pksz+ zNmN9I8*&oM98Sz#H(`x`b3Xt-;NRc)CF}el@$6nI@aOGW@x#V?ZK7B~@k3ehhlsuc zI{1RZePd3%x%hG5tB-@Xz8RBD)HO{mON}=B#(KZR9WpH*>%+IcAwCt0Sb^_8eDVJP z{2H@m;tvSvo;>}Re{1WV4%YHi7e5UD0BV1R)_PsWg*sbEH9bCGieCu4L*l(VSiD>K z%+^+Vcf)&YY4qtW^(gf#wb<7RmV1^?@u^kD)=9N1H+bmPv};@5%SW!Kt4}1%VHG7# z$tA0jYgD?n)wf!-?)186@&TsU>YDDkq3B){ifvn4)HNuqyg#Hu(8qamf2homLu|fm zi?&;dgi%{ZG`NxToq|B4`;h+tf+BoIxA;}?w?*)W!Y>_or}i@V)!|rT)IVu2*)!wM z!fjJn@Ylw>=q+!2C8vB=_oYHT|-^)$A`RQrs!T3*R*K#iF7Ls z8vfhI9wYoH_;>#R1QGuLf|vYd(LOUr7wpeH?7jupuKX#WS;gZI27EZ4eQMH6O-?@) zd^NWCjj8xMLHMEIKM?5qEo?Qd6I;2rx|03?Ce!tZV6|`b1^)noOngr9#+&;c{3ZA| z`$xg?SHb@P7=LHK2>5T|maV9KboepjUxQlayQS$`Ja*bm_M57Bqr^Te@b8R2v+Zpz zG)+%g@OO)~yG=nf%|BSXk475Zt%RN~d5ncXw|9R- zD#N-pC+(pY+G#0Srqfy_XJ>Ss)TI{|?zy7T_Xq5;;B5xO!MdKcqkK)5;|1QY;yrg) zywz;HPpfM_9n$Z$tERfV()7za&1YAOO^P|5=5u5xme$Jh>hW}&FArJG{gofou<62d zWN=>Y5*B-OhD0$Ca-f$4g>W*A8wE}n0uDSYRq&6(j}_}fT-Ll3;eQ=?fo;+w;!B$i z0^3_#NYCyf{@cH|vADRhL}Fp`H7PC8cLXSL8R%`iIq=m=LfRIY6zPJtVd9!tw!U1GjGdl9=BL6`1W0@~~}vo2%<5C#!bTNbb42w4X$D;^ECwQudDbi{<23R#DSQ zCeqf|jBR+{_GhhsW?Ly3Sxb5_lY%yfC}V*N`aRyn7GI?V>r$qBxG_yByilW zMlqb=n)7(PKjC6Z!=ubp@S-SnGN35q0TDRRTW}U>4@{93GC1l^?!26p z$?uBfzu_3r)MdOn4*=n#n;l3ek%QM6InUwChKHaGD|lWaGtO=I4w*Rx8z2HtCnuf> zCps!qYilm4w!1fbL({ICD1W%nj^B;1w^7fT zSy|fMbhEbhT6*1Gt!>w+7WXVrymGPv&UY(6%tDNT<`&8401~H@fC(r0{r>=iptRYp z{{Y~NAGF!9gJ{!ycl$QqU6BEg%8&jU8{wv$8dRN^dZosvW_FUnQdDLlGrWHDFNM4~ zRyd~c&9R5)ZLOgh6CjoV#f{5=kdaU09~Py8jcxoD(Y3okNBVZ4?ZRTsQsKf+IT9G;AjWoYXpauZa3>=mGl1A6CSUH?Idc$nX6+WSnH@k47hkuGsM+oQs-nZ_$ zL*^r~EJo9m&+v?cfyo4%cQ_*;gPh}?)U>;K!&X>Y^n6JCb zJS^N~lw|yp(XAJs%Jz4=J8+n~H2vt+N!@K^+xKmEXXNd@y7V}i(&={)`2ca218D>t zo#Y&_JdiL>Pf`fXk>^Z;z>IF#&a4+IbCojVlhc3(e}t7a+|S_6Sd5urT;SwfCNHxd^F6Ot4m3_#tCf!G7I*Os#Cv6Fm~TCcSA+1}l? zX{YCX?t64|dQov|vW@Mp{sYqL>ualb)%EhNV@lBVg$b*8cTT-dgYCAq*C1qJjxHiN zEyz0#qX%d^-XZjTs@_dB!BRkxouX1%SxNQ-HvI2{(Wox67(T z$EgC&Vh=b!GqNdeI%kd!7-6cr_!*-Zmr#q2Hw!T*at=`3<&PayZX^!8XQni(Qdd)& zNobWzHSq1POLY0}?esWqE3Jo&V^1)zO5Gtk(R;^DE!lOl^*&3~J_`ICloVeE>6XAK z2-frK7Rmr5swlU;f;3Qbu|lE-VpDO!KRNtW_;cY815e@G-wx@f%4?J22qymkOw_Lg zk+Nw=4fgBnrYRc|V&h~&Nm?+1MlbqBsQ3#`nOkPQjVL669*pZCAb`ucZo>vSB;XtX zGm+QgPufpLn@&CxSf&%GxYvOz8HtAV(g?!460Af{0s!tn5x<@>yOOyl)yeTy9Y+^h zt4pM$-tAfM%c9ci-F|O zIbp=xNy6n1&5~T6M|3A?WIf2-GQf=e55hV=rGMn=4{-`g$r`*yAQVX38f~(2L@L|F zXs*u7<@~#|TJj?^h9e+zfHTP|7y!d8I0Mykyqr{QfG#3z9^-Qjpyz4Mat1gAHtdF0 z#zQaA;xAT{aZ4X^H06S-YV#1UI6`#@CZd2^HVjSuY$?Yl;^ zeyM;8eWvDB0}KNdEaN2Pl?S6TvW$#;{4g2a897HYn~S`!X0*J0-5r&+w)~ zI)t2~oYtusHti~Lf_qsfN0mM8vb~aRD;<5u?BC!O#FF^3{@O$i98NUe7~>_2TEt5( z)5tOHIR%+cPvTen7boEFg!~=<00imyx#PVP#z$4um&IQTG{w`F-p!Tcx%i#oJ?-bg zs0T+=YA%*G)5`%FRg^^|?fr4MyM`I#zLM4%eAQvR+M`Y|i5Vi`ptz5YfDRFg1}I2B ziy!b?%|X}x3G?w5&0&r!Yp;o)3GG6tSQ#O25uqajrTLfaoSS~YzvG)BgL0>k8 zBAqJPgzBkIDaK1hb$P)`O|`R1%KGnXGvRzpd7QW>i78dg>eP?+Rw=kjG?XPDVKpe- zUQXAu(R}qkAO8U0f;v~jzY~7j-w=E`@l)bD_yfb*kL=CkX(aI^8bo@S7uH@i_*bn( zW^FCuv^NQHWd+{o9Nf(E#Lz;L-Aa*3{b)<@KlVmK{$K4~cCa`_kL;faJVSP_t{zwz zNo}Uiu7SkTMiq+3B!xpGh28vo{{X=kucLqXC|`s$3A{h2#=a)_7xDi9K)HemuCAWy zJ1>O(CGjdqQTD-fW^WEhZWP==V~SR5i=RHrGyecpt)*D5=*65-%DXWnQEZ5;WRMbA z_oiAUXvmRB5~x-R>ZZQq6Pe~XOlPyh<15jnI#8R8Ty=4lt*OIXrQKh*Z|0v3@=PWp zEU!9}s^+m$id6X%_$l7r)}5l=)|{<7Ca&(^Y(5lz%aOk8586w_lf=M?g8t6`02VEl zK!JBDQJ_S3Mj~bi95_3-kOuX&AHyHnjhk%Wv?i&Ph!ZW>z^{mwrBDXy*Ou|JN4XuO zQwZ6!%lT26BjA$M!iRO_$gBdNB^pG+oJ#SCQZ-SNzjR?)i%4?7y9zRSg|`hx>2rd? z5<*O5ylxwKAcSz(=MskmFHDln^NR3so@r4*EkAV!J#4-uQYm!Vbh-L$xNicYr4@*B zc254z-89mQTG`)gZl1?wt$ZK-kaY-Ui(mbzbnRtAjkX>l_-kvYc`>F4jv23fG}ndy@@vF5b&7e*XYO@m0-@pMkz8T0e$7L3N?&AI{h9 zmHQX?+xBR^(!4=;twZr+_IB}RwW)Y-;g9WCKZkXF7gO-Rh&1$>Z~hJb(tZhBZDUaI z=fs~2wX~v516;Mc)vqG9U2Ea@iF`}pjV|Ly(SM@v8qkwn(&O=0hvu=DQoQ(c;uV`vvc1u+k!4R4 zXd}uxcB^fv!)*G#kFNMqT~-KIDD^1p*);f}vGn7jd@1B`tm*LGT-oUt8jNxoZmmB;{{U+b*cvZ~+AoQI zApXw!SBriwe#$--iuc9;01&@ttG!;sQ2nKUW34(>hVNAPf#81=$7;jkhrz2$x#zpS z_>19vI&Tg`XCi4|9=s#qe;#Q*9{7Q2`4{3Z1>IPkJH{Um_4u{;b-iHd-VN3?i#E{i z{6}(amK&=#(k-QuF9~aQ_9iGb{{RN-^2exLwd^{sgR1zu!uQttv&69r5eY&`JFQdI zO6gg~Ofe&2c_gl^<7e*P&qr&kU1_$7HGj8$3x3l-7{6x=TR(>W zBGGR?I{Xjvqhigh_j_p@bywL6;ycaHQ^gB&|!P>KK)jUJ+ z=H^(ewM#$L9|ZWb;WzCm;VoWof_@@{;`W=T#Me64fqYw{*?4E;pTg@%u2SKp@sEHk zVUter)`6$pNY@trIrwolx1;!K=1Xgxer+!1%G*z~{2uUE#m^61>5^za5;O?xY#>Xq zt@wf%wI-79#5Pf{*{vSV1v zrCQTYEhx1YC8d>;O-Uru$}- z;>42U!=69U@2{b|HrGBc(eGrnFwUpO{v5PbxYGXsJ^ms7%lcZR%6c;De-%c-S?pLg+l;e3}j+Wvu}UfkVj_WEy+te3=p3zt;Yth5_n9LwTS zCx&hQ-S|EGdFd?HJ{SG0^ocaiXL1%>XwA2s6w3GUD%)N`KHS=(gt)dDk`)Hu&ll|R zthywKLf%BgxV^Hy5bd^U0e59~kqW!R>H|;d^Yi{%>(Mz z`ZkXahwyL4PD4i`-*{RRHK)TL5y>*jB)rfdi@`TnZt{%>!RamLq<=QGy&GHbt?k~6 zuILxO9@K1ZQr7QH)Mi(>(ynIREE_JvAGb%T#hLWGlzD~4nk3c+?%qgl7wxchu(8ZktK2s_9wT+WqZqZ&W;G zN8CBiHy1fSbjAxVcPnRc1e}qA4q4!0G4kVgA27%x?%?zUV4Ps&0gMGEp-Dj>Ho?(~ z&(!O0+jf=+oD;Hem|Mii<=C1&34%hRW? z-2PYax%rjm^>%W*X`5Xc5y&UGAeP|c z0|W0X5Hs^|M@3*VL6^+~7-AWR02STG&GLe~v78(LPf|Dl)NL>sEbEQ|C6Hi~(DuU; z+=Iq&I0CS&>&4kZ+IHUdTj|$rR*wBFRAEKOnm4Z&>PYYPeJ~ZYxs)bz<(GCvEtSsG!nxkVT8MtKApjhh(+gMtr5 zAO#o%GW7XC$Qa23?y}bfOg<&aHwnpF_i5XBzbiHKSMp<3V|4kg*7mim*PZ_WU97Y; z^(%{$;doTwsnlc5+jp;yPo4#(2$Ir-|zcThX?cyQP=>4LvkHvcC3jUtP7=rpfKE zRdZg}Z|zG-H2KaajX;m*Yz>=s@K067?oT1G#8)=LXk~jj5TS*S-d4c~cY;3i5JHR$ zdgPoMvnA1j<}2%dJiV&PlEu^jq=0^G9=mps6pg@uL3X34L3|SG7@9kUREVw!2cnUj zhT6Eu!8=Jki&s5L71DpZm7c3~)wyo1XQS({O>Ae+7kj;VwB071o%>yHZr9c8YDVHb z5F*+SJ;JCtC#w=p4i`A}JnkYdHBKALZgL0A+!X|59iV`D+yi&)I@pQ}_Q_~YcJR&= z;~D2CX$nc;f=8iVwPh@?4<%C=2bKy!?VK(N=mE|$csvj|<%h&c`_!hBcfYf`OGK{P z(c90yi(B6^e>-m4(Io8BTIs8^?dDK-R>;~%L7b3zAm9}slfgUy4}5{k(Nv6rMoDaE zb}&d*Q-vx)IXM7wK*7naM6rx0$Q%svyLyeFZTU|m^Sc4b0B-7PTq34aC{eUzD!E<) z5=r^MDmQ$%`EYt*0dT`gJgxlIy6LNJt-kMGiuzqRyV}di>3>(Uzm}a!+&(y9aq|P; z8DL8h!QFwt8;>XD8Km4}3&1%62HnJ{1QV7}*<-k51vhNOYhTdS6#>*h6n+$PI5pe?_@50&Ph^81ail%G`<*uPD1ijVh} zIRqRGa!ABkX2|SvKvKCUA%MxjbWBX!{5e8ij;$OL4u$p-}Eh8&)Ham_ln zle@P~HPLqa{GQ&gMFnd$bo=RLr%iVA>!!u)d#AR!5)76D1e^va$%1k+2>FjVI3V@T zMd7MQ_hs_L05AaqcGSX+qY6m?F+K2d7O>2v-=P@_0UP%o01K8NbIu7J3FFjP^4vNO zj9qcYLgOUl;Ea+sgN)=A0FV->n@aXq?61+ilDDms^|BL!*2!sZuS;_4w?waHrrLM! zY_(*#9$nKa0y?oVu_tLzGsz@|$O9*X)B{uBO96>e7c2{&1cmb-MkUy7;06G&C5bs4 z;PRGmKCN-(KvF%b8NB1P00tXx1mt0uC|;u(JQLEL9&0u$I|d~bbi5^1$ zcPEHV$vj)Vcg+%h)w)2U{)z23>)=$5^H{r*~^LRxmwYrXcrr*`dS+|E#a zc^rTOfx#mO7H9{&JqA8Qo4^7MLbds}N=ecJ3!Az5vH zipy1NU2S!C?4FL^X`bofkA=P;@g|$1Nq?(qFxuWhHlZ!Wt*jR8u4TBlxwkhGto~#$ zPh~7{NXvJ~QdFp}LDZMm8)#s`oUTbW{v z5pvSQD>6mqzo6=W5^QX~8tA%4ou}QVr5rkrnLM9sZ?mX-%jvE!1dznD!6cJj{_fqT zUn~+KZG&_8L3M^bN$xCQlJLoFV|Tl0%u94ch;76&80C17jqN0o6)cG&hFKN6^D6YA zLX(BLoMPRtt&(c`c27_EHp2}WHr(%LbeEqpy}jqFc23K!u5`qV0uDz!D8iA?Bm4FXb10?2?b~=JUQhW3`1OPHY8P0geeDVf$z0)`u+zG)MU8RmoWD-VjGmtU22ZD2( z+!9F`&j*lm&?v~ua7ROf$;J>Ic=4~Ief4_Zs`6f1UtKkOol=X|%S{(n?eo{}@7Bz+ zta1;_!3VDy#&eE%z~d*d=QyVi!;B8Rft(B+9zh&uJwQ0m5rTQ-1AuY~CnV<}1BNBK zj-V5q512cJ;Aa`@js`|Ddh$Z&E&v(A@-Q`3Zq?qmS~QyJZpzEe^w?aI?f9?j{uq$@ zagq-hInP|2=LDXd5D58wles>i06FA$80n1X-1_92LV7m?p&j`E^#tx2#yB7jr;d%t z89C1x2abmToMaAzp#bD|BoTEh!Yb;`+sfC{-8Oo6eG(2ycKlcQkM}s;)ZpObAOZ+H zoRT>l1FdOCrp<#oCB!Pgy4B!k9d8=TDLB@Chj2?0`g!!3p z!`u1*3fY}0P{O3#1D9YHk{Fw4`Fi6QHj=YZi3=9BA zOp}g-BM46e1-|J#WD(pDz=AMXk-L+$fB`##Zt0ws&mD3I@14Pq1oCnloRR>h5)V?i z!5Lt3Kp?PeHbGzk2OlWtZ~-+eO_r@`ZEts_w^sSTmAA1A+SQtkwRYJ)%KE)+ccal+ z>2a*d5!*8o*enKE9mIj1ils_zaqc&U3|oT>UAl2+5s-#q8xT$h7&tMpDnm9D43+d! zKyuvK!yfB|l2+Ub#=t5zHvGc^HVUUZkh79hf~Z(CZfIT`@qdflN8#Nq#j>(PCELqw zVQP%{jaEzR=eD*&&ZM8;1HTI8Mhf#*$HFj|y~|~E-IBJCRMSe=Tl89XJxneO5k6Sc zr*|!*AKpzpH+?nRX05kwapnXP40G`h9y7U-P5)K+(Ugm=aSq(x|`szUAGk_OP( zO3S(!Wl22MNdP2;Dy+XIa;FY}ZacDZ(5VEUcf0s01YQ{M<;2>ZynZCqyiwvk68Fx( zw}(%&x6xkE?7Fy@5L;bI<~X%OD}QK9b#ChB7LDJ^d|Tm-Yr-BTyV9<$!`$0MT?{X8 zcpB8k$kP*QW`;0hB+8sTJT%K2f(Mwf)ap*rm%QApo}AH(ijaw%(Yiq>T`ZsTwnlkw{rk6Ffe-Xc_*%Mg2#-BR%0K{@&!@~ zjt)v^7$gDQFgZK8+yEmj5(28bSZ>0W%wX+p%)Ev<s6KPtN& zpaQLfkfBc_usPS;x2n?JcD9M?)xXJF+t}gcPgxL@W`kh^5df&c`OjlctdRI%tmP%5yFX9R!VKm;0(&Wb=x**_>H zm5$IrJ2s$oz$!8ok&ag?G6*R0O5cBhw2T53PZ`TA6)l_}n`q;=Kp}g(OLkqs0NT0S zt{C8CkVbxQyf%@v4E)C|4=l4NLROUQtgm-J;fju+24*`-l2j3pFjyAq#i)p*CJAPouu&3_%*5e#2+%4><+%A( z&f)>X3-3*U*cDad?n$#ooiU|eEQ|x&Ez_@<<6Vq{#<5aRQBz zqlE>(HKByYaYiap%_}J2DY!X94EPf3X*%NHs1dLZ0TRNq0tVb9p}SsN5p?=)qk{LmgmM% z=<-9hDN99&ye)rn5oJj3n8m31_KOfATWN&1lIm!GwbzDq9b(Gr`{C{8g0b95EQ=40 zM!OXIl!OM?#9BAlBxxmSUU}zOV~$r%kWN#|f6k$D=_37>+Rn`#7=oz{Cd_%xE;JnVkg9CsT(b^y(@EDE3q(8LlbkSGhY$b1$D_iK=Th8!W1 z)0235H7T}~d7XSkos?DFIk|3{-vQ^!)<8S2uYObu~1}G3v0A07UL-bi$Ek2<>dH?ygqd8t?4MZpL=< z$^IMsPqP|??ciS)>CJ6rX2{>zm)e1GG>HV)F_gAtSfoLBDw}cT+pMb}ow_(AZ>xM2 z;SUMhcwbGM;h%_;#}J(sYfVnyT+;Qe2gDj)qkSY-*E1VW4tR%GZ8FjeiJm)atD9M* zxzkePF|eLFq~edq?-Te!ZAUo`#SxO@-)8FE~k<N+xdo-KX-_os-Wlk`uIaI+$ zq!UV=SBs_0;I&m%IZsvAHEh~VB)0i{*y|c?$hMLj%ULu6?>W>oIpZWeh1dwm_v zv!>x3lFx1S#YIvgOLmo&c1@$&O{mMFX!bh9M^@DD^$j^QVD}Mb22rQ}@sLX2ZaDJ8 zAo7*cNqnIn&-D(A`$%Y)UK_pBJZLq@b*qg+87*2XEjIT^wbNp;O)|>e+3csjc{J!l z&Sxrq^2hen#l39q!xI%oTFlH$=k zl(KlDy19nMbogg2YjA>fc;fV7p5o-(YSZ>QSx=d`w$vI=_et`(J@0+&_HW6n!}up2 zd^RFDsYNF`Nk%i|yk3!2+fz`Dtk%7|dGCOAPZxLtPKRFbmxHw}Ys9zOrRIU+%gfz9 z=JG3fBbs-#@cx?}yc4~h6ju<(ByeWxUNvcT$#m}q>OLp%r-koq zR_n!Z+v@jMv)$`5+sS)%V{xe2XgXcv8MPHnD$*GtHa1cfcx3WC$yT%vO;zo_^uk?G{X+V-Yh~XV?%PeCQF#(H%=1Gc z&e5YkoQ`IeR$b1)<;zH9lmJ4aQ8fWJ!WH zkdBJV!TN>8_MvpM-a9nEyIuD;4LNd)g~XCGJb^ZW8j?aG2*-BnrEn5g!@GqU<7qMP z3IQmflu-LQZn$8emB^}8-IdZ>>7r@vzq@7Ir%U;Gc*>WYnv|Pz=5F?H;l1^ z;U$Si=xoWyVG(TQv5m2*;|I1#IUPkwCabT+FxD{0NB0xuIp=^A89B}g=O;U`G5X@f zQ;NT`pG$u2y&H?t+TE_V{MEcT!)BURvcI~vwXC&myIrq0&{Ly%byYI(GlkOd^R$0tU&|- z3Hf3m<+&Jb+2o!{s|(|JV;H#5FO>85ZVK>DNIRn$7~>>v;EmWM1o8A@l2Dp@Eny|6 zyWMK9>a_E?oi(Gn?328urLV6x*XtX;=<3C~9AXUP9F}wkIp+me87Bi6$j%t>YQo#Y z-USDcf6_oW8@dN$j=c!ooZxfM9sd9cZiI2ZTja<#70-umxtmY3SbGK*R`zMU`H z+9mVW`~1$G;lKn)yn+wS5W(aDk)EfZCmi6CMk=#H*+0EtaB_G9I2Z(>2LKFZv4C*6 ztkv-jg!umeNrxvm%#N7L1Cjf&!C{TZ0|$(@2(Y@Qg82UcOSZryfNm5Mk^?IO`$*3r zN6nm*^AV2tW24J%WVF8V(P);vEZ^s`Eo)|%O&V)^b$V&9PbT`8#l6zw7X)JghV;$> zETwqomEd3iG4l{|UIpr88-*kg2+AChox!p~kU_~G#7`^_T8pS@(tX>zR>9yUz;FVB z*%%`L;N_Hq)E=apA*~Jy%8!x89Zv9fe7W2*c;_SdeoSKp`$+4mZu&dhqTkiKUH<@^ zDMl}?+P6i1iv2!z+s!3+d77R-)+u4f-a-Qohb*c=$Y4m|_UVFonx9r6t}t>V85tn@ zf_Dz5IK~)usQjt@Tc8B42;;aLM*xzifzv&SqzN!M-Hvc@SJ$b|c*x-3bJss~ORK6% zQBCQ;lx=N$=(=s>!;@{Tdv25IrMf>YovqVZ#P=uodlE4bToIffxxhSgf(~=eaue+n zD`#Wp8~H#7QXCwhIR60kV;lqmLU{HgJBAK?WWrXs@8n{6<12@M>RM~(>KeBD0pBxANRKttrIJ1|J+h}}IhG6*9FJf06E zf-p>?;^bjc+be;`nURu7JP^!r&InMsILOW^r(2}eyExyhUs-x9Y1-GhGFMA&dZo6t=kDIbppI5k6JTUu;1I((1d@3Jl5$NsZeu*H-kRX!)E)#m9trEla0wj_6)c~-<#%iCWpz#Z-E_Z3 zEnd3$Ek0{lr|GZVb8yAa{DWm<-1*44&j5V8SLMhU86(#`lgX6-0L(g72S4)oz~JN% zK<+rm2a<=>kqkpDyT@oBLgH19CbL&FW7DI^6U4CM+3~XN5SVk z*CYT39_4Zu6@za2#V69!ih5aXD|7T*repvv1z50qhhDKsBo&#q&8Ej|g$m~D^0mf^Jzt-=y0&qeO zfDoeq0&+2cN!iXvOaaOHup|d0$nNY$GD$h(@jT>kPkfH}@atz*c7>gtlfIU+YTaG+ zvbFW!w@fhp>gKv>wDh(0SH8OGzP~1Rx1K2}#7fy^2LY8w1pLH}<0%EuitPdoxJdT>F=$m5LC`G}+h9S%v! z!OvcRoPu(3gO8NtX1uz&#d)ThZW30q**!IG_ioDeRf4oD|x&VQ%Yo;_QhPInB9<8NG!27XXU z!5z<6fC$MXbOVw|JZAxc#&O5wcpx4+b$z6lG?H2?J3Bk2`P)Ul&Gj^vn=7Q!wYKzyhEiIZ!a5W1hTrdM2G| zacW$cw+Ce?q$di;fs;9fE_+j#^geo)K- z_o(I2sZC8dxk+l%R?^xh`7YY(#d~g@wbAbOYWi)q-b-6+z_v$Ik_gESj1EBSjye2@ z;~1!c0GtKRash0fhjtX?1MWFI{leT%;~?WF93BP$8NkkS#sL`GeL%n!2qUS-d}EL? z>{#O#;fyg~6;4+i6HaHmtff+u>lhkp~%aQ=dFHl2lKyWx29N>k(;c@H8A&JS) zKz$d(zYaV>uZZR_NoQt$V{>&A!waZlUu2G-yeDY`$&P1SDcQ8T<8qagXM_Mel` zqMqhxO}2=l8z}PaZ>87^TUCqaE{`nHL2MBNJ3F*R8C8o3Sz>hZ?Pua|hqU=x9TLt@ z66z}=s@~lTn{6$2Dt_@G!d~2+>e(mkg>WQE-12<0#9lD*KZv}<)vwwsVgX$$$wj4< zVOTPcvcZLuYpR^wG?K0k8A|N0qn3A&z*O_gW>%V#5S)Uv#BUj#7@_?(8!`QvE_)Q z5|(hoWDUL~EgX*JfUhF)4~@0o5C%)hr;5plRIq`KorqT2R6V7(9$+>h2I^_b;Z+%9 z0c(*6h`Y9i$j0N5l1T?{+;V!HoNdEnxJ!7aB>5R*w7bT|K=S*7u0SILaUkv=!=Jo= zKFxTuG|c(o391w&bg5Iav^27n+vj%H_l?`p9+eynW6JE@v|Q46yH?gMKX=u)ri$+5 zypV82OU@QBSAsbt46|Sy@>r3bCq9QH>m5*PEG(M zfyX3c9Al^-g^9LQEcjC||mLMtL5%=QudQz|RL1ymbeXHxIkpJf3;ZPI`fpz!(8XQVAF! z4}Mz*0|b-CFgZPUdOJDfo`iAGV3XG%aCjgF;{#mGce=BG=J#&b(KNjJY@4@DwbkF$o!H25xC8-! z2PE)7C!OA#hC1_;R%5i>K|Z)3p2V>^2PdZ(8%R0%j&n`7gFP{j*ykW)9k}O^Z~!E9 z2f5cm5OOoOI4|;*3Jx*r$5V{-JwXDn_;*(FwVsczuFChiNq6sc-om>1ZN1-39j&Fd z+oD|>&W_$WpMZpNFbTlvlaNjh0Kv)Rat2fmrqSZIk7AX<7{LUB%r=5o0Bs!ZB(6Gw z2|4FP@I@z8Bak-a?Ih!lykrcJMh*@z7k11~4Z;nr68xm#NP&qUl2n$!`?$fu$OHyl zu=FsB3RdQg?{1dg&vo7O^Se(Pm(efBrq5Q|($@30dzx158Rp@;AG;w@z#tKkjD{e9 zxIOqe!{xb}9lv1*m-)9ZoAR;2VS~FPJ@M1{_c{&;)vvw2OYph9YUxXz!)biP66a$v!04QN+Gm)ha4+zF0H^h zDii|UPXGl28@FR~aC;mRhU2#?a1POqP5~ffSHXrPKmRz$+f?fIuLX z&NK54rM+w}Ijd^y?AKjgwSJoZy1RsFX|1i%CHUy>(tF$d(dnyjt^}(%ErZrXDS}x^ zAinZI$YOSoFbOIEs#D&*!Bkme#9%OADKJ4GHgJFfK>!iK$zrVAN%I@6MhjIjr1IsL zIf+~V2GVdrImTEM_em_vxQrU{UP%xVB(kAkFn6*BA20-f70Al34S+^SARczBnZ_+f z>Q?5vPvMrHZC(Ctt*&VrQhF=d=5s<&-zlN8~cRWTBG}8iwFAHX28aV00|0g2i^B3UOoCufyg?jhM3X z&M~=E6#0iIie0ncl+nr3++T)99Bta~%FIb3dRla1jSROGQZ$*v07t8s*3 zc*)CK#kSMsy^^wPb-LSUt?D$lZC_hAv$fY-y*lsAw!Mz1+@m-*TW?gh7C7Dsq>MP; zB-sP+UzG636t~JH8;EwRsOhVyZEGCb?apF$k~JW@;x}mn$b@brsuw~S6T9x#HKp{n zxNBBYhk}hO|_gFn2Kw1k&Zk&AC|A zDNr8)n5oKjVO|!RP02gSYL=1i?SD0=rsmMH=8A1w?6kSIR({bY-if<472M^d)2||z zojd>l+|N8t#gycd+rzMI9j9Y5?#akfro7eyPyx1(ox>!{ZRKr0DP@;yNOpn9L{P1r z@vZ`%;@?oUx`gKT>NW$*5ze;g!;%%zW|B28mQY_P6o$wS6^?YzXoR1)Ou&T!XBP70 z9EQOXxQr4GBTyMeS(UIFyqfq}P1-FrC#I0sZ#TQsck?t-j*Y9Pu9|V_%XMqr?Pk(i z?PqpoSZbQrhOWNbp=!QtuPiP;)nOI%ra(c3Rh=hfo;Lui!!&XRMR@k9P2DnlRPj3a ze&yc`=uk zSm!I{#*CoJB+yyJu!Uk4GVA4%K=T9q%~`FiWrGQECa|D$TgM=h3eqvI+SAJCi$gl$)_)MG?z55b$h7W z<*OBZ)#4)+ImTR;Nhs5TalB;XQZb75n(C!1wDs8c`yYzl1@XwW(Y#gg!^7Hj)0T=I zTf@T7O1DV%yp8siOIo>Qg({nOgqtcN6~_@h}%FBv%?uSR7A z1d=#ITu-`t+qan>OPiSs`HXiPiB?A2B&^O?EiiUN^5uZu-u*AG(~44*?H6mgEtQ(( zP;z&Ar+s(q&PtUj*4Iyal{Xb+(ou@$gH~NNwXd$bzQPX?NU{Lo#|I>TtH1?73c#xn z#48d($ziy$BDxc(LwOk8l^_OTAJl=>Kp4o|$m7*m*O?;+W#NJ2sl;Hg&ln(#k=%w* zNd%QqT8%WYDwSeaEK0=8P^e+ll2f4_j&gY?aUJyY3emqaa@lI_(QW5$>3VN$B~Bcz zrG2$YTFEV1+3%v$Rlh^Kis8&=KbUS;8?bl>EON{_`@|I>p&7;p%yXJH-y?Igk_crj zf(nhwFz17u3^B(z02by(x+8EhdlIe~f)s+Fe6Ngr#N>boDhVSMdR=V-D*+yGNmX*Y zj&RxF9i(jl0Hv{=$9FwTA5F!%HKMb=otIAEF0R&AT+R=gD_6Cwl5cM9J@ngaYjSyH zxbp_}P(dm|3b`5J?E^U+?-&d=fygvmEG-!mG+>q8f==FZxzz9m?BQ{S1(*PHh2l;-Y+#Uk*Ph~611=Sd1$>{7fEBU0HwdYplm=tS$qQZ$ zY-D2O`I}E}X)Cp(ZL96F?%s^+qe@TRv%0p4H+x%4+o#>DzhZlc>}}>%M+lj+4EW-yjbbAd;#hS!=ZkkdVr658kW{q6s5GX}gW|Bh1f{=5O7%{Ub zK4omqjBoqcr`w%;D%Wn$ZEUtldRX)+;Hye-f}=S~a!L`5Ta&%5Z8yH!Hmv&YLvaD+ zA(3za1>`aiK5lT}uuNp&fsvf4AXU$_FyJ}?$;(LRB%EM^K->rz1ObwA3CJD4jeZh* zK=2}&HLW&Cp-9qiwZm@h14O`WcyHj2O9oBSMIK_hcHHQMw1Z@RSq;fnzf^M%CRS+WA25CsdW;e=w{1{svh)FBl+v+=2BZeD9@)(VRHScClVFUr=b@vM0qIU%}c>jWvn1-6KZVFRXOU9z9E2(PzK9zrM6v>l;}# z%_jF%)%5A6vzFAyZ+~ZJaDw{IX<&}lX1rW6ne93@l}d^bT6|5--pbs%>FI0rdTFK) zCB@^XDBH3ZmV-mp zwI3CHYtTF?uUO8oSa@nr4(ocHm)C0}Lvd?&s)?*DZLXDsQP~SW?NL1MBscA&eV$oc ze?k3;wJEH${eQ(@6Ex2Y=x-(5qg8kX(`we1B(3CL6goA=wQ;CwtuL8sminA_5J=L; z9M>>BVj29$#d!rK`|M=lH6|Z^qJ8g8IE7Iv`d`)w2ePeeuo~>lsRIw5zhV(s)!pprFNe#>*MQ~MqL}hSO zF*I@wwUn0%K!bE#%oi*Omm%^MToOPo2?|t}+_HIUtXzJL$@>te#3sM-G=4gh!ceZC z7NIKmqT5#2wb?AAhF$uV%Fkh;B>HXD#0Bkj5qUI`>8NjJwzaj0K@X;QfBp&0;2U2K z+}&$Gw8p<2!R+TTcuU~b#L?VF={>}j@@jYfEYr0%m_Q+Wc%-zAV=X<)T0OO$&E$R- zJB~6cQkqz*@|0ww?Bj*R$+pyYaKp8x&GRc=qu;{#Va2tQzF$k(s5$#juVA3klaIS4 zJXB?C?)hJmN96pdw$7`00n>}9mNH|wo!B-)g9BmTc+S$^QjBGeRbvi@>J*I1XD0AG zWnx(4Xv|p!o=I9yF-FW7)sVcT?JB5u*X)mmzhd8j8VV%Z#*^c}8KgF|+-UOnmh$2) z3ssr$mUCNL_%wb)sn3Hr6^n_M@(|2Ay?t7NlX*E$?objBDh7 z#8SgyYC@eF7@E*>w5sw!IJe56;YxE;n!b~6+?%zr>tTE&%<4+@aX47ba;VYgsVMCi zQZ;JRgQreVdeXNvYDK%Hy8Ip&?tuAG$lUPK45(9p#bg9LXJI(Un!v`SWr-^?Ue9rL z1)ajj742>4IJ#yD>V zpLF+r9k6boT?v*-CZ2-2kw|VSin$FJQE$*C4h=i8&O9Yba_A>7h z9&3xCg!;8gP^&c+R#Jj#=+kgYS~q0co{L+zc5R&aS6eO1>f-*pLUO{v)SVbYql}VK zx{TzMn`!9zRodFkHTg^SSwIYAP1#SFZD!u21=z(msO6gjj2)nHxO5&L)h;wPx@D3# zOUpU*>x@Me!22!gymw_pjs$MeJ`#9g^Ft^`V-rl59R0qbqp}9`k~ar&46cA2;GK&2 z+*llDQV3#Oji$DA*fhOQ5s9I409~R&`QVX_%(4=tNErcCWNvJzuh4Lq$6ioTt9d;l zoUeCeo8{BByJ@0(pOV(W#)^Nt09Zk%zPww!uNLEE_isdX0B z8w{2?I{-j{w08=ifx-DmQ}?#yy-qANIg~H<>wtO(h^Z_<8v%QU*a^Yh=&BdyAOTt< z!NNdZJvD*?0e!cM7bA9C%lQY&e}t~(!!Ue&HHpIQNhiASj=843LZQGg{g2DQWf2{l0<%8GQdRu@d=({>i!x}su7PosXzpz< zXGR3EC|JC3v{@~=7%{?-s!qViztXjjjoLyl{39P0JXvoPXi+V$JV!0W3V}>z7S`@r zqbi}9HtaE}PzDaguR<}Bib|D|+m>F_O**#(o7>C1mER>wkaKsI$!jjUC9HH-TIpwf zZp>>B7HRr%0vqWfVY#+Wy5*@r%F%#}4a|F6C3lBKP^AOMv7EO^-ZIiPl}Ii%9}Tms zWF13Klrx7|!>Knpnr+5BoJ7t8V3bgzw#UVv+CxikFI>6s=Zm7oUJnxZ7s2}K$O)8T z2v5a%r-QBYzbw2kXzh3 ze7oVbRbVn;f8dDEk;P6Eit85(=(%m8l<&Lgd+FZS3C>WpI*FxaX1P_>mYu!5Quso75~J((b%Fe>aDe!9Kh! z9viJrOPH@BnL<2%QMoLL*aAlhZN18FmR;GcdtVs*5RUHYJVo%Y;-|voEV4&);13+d zt=c06XJK=v_=`h;x;qF~Et;V*DVHs`?@FC3?G}=o);6+mrz^c3 z`DD9aaY|L(qT%f{c5-%V{_f36%WEa4ovzNJdkqx2hVWwB1(BmFV3p%2%vT06ESOXz zI6iWcBLGP1PRjG?-V}3*JUOSrNMOuuH8{$#W(9(&c>zFF3@Sbl7FCi%1-}bxfAG=> zx1ji!rENkBY5IPsm>f)PQhzC!Mv_V737ESNEaF)D%MTNLIx;B#0ELtB3r)c$ zIJHj#rQkm#oEa>&xkC~JMCR2)0?ffTGDLl63gM*bxTR*L80&Wy-!oCZlIpkE>x-!Q zuNca0Xw;*l_g1>wTVF-yw?~Wkrryfe#Qy-4TB$@vJN*Bnn zuz%gMLJP$dQaNQZwB7H6PsE=AT{ffOuZVsk@JF6RjW&tmS*?4 zL2+T?ix+<=EbR8eOM3dp;1~Q9KjJ6s{o{x}Fj)S>KL&Ka65MEa{vFiy&xF1v_^d zw9{UA8^zi;#RY-yn0P-eAn zjqN&hDkQG#Z*B_)FDXfvfq+AZ2NZY>)A+Q(DU zzCHf{f@tW!ve)e!`vLyVo)-9%`ze0P-y8f>rl-U&g`OeR_5EYR{ucPZZLKH8J%0Ye z{{UN_+rzegCVNdU!&>KpAinWUkBM%zhthS6E0`k^Np>Raej|Uu6+dKqjZEtLPk??c zd?V4C?%sPybYByAZ{r_?<+GWPTWRuX{xI;Sui_0p&RHW_t$x9*3k#cfwUbft2AeFm z(CPmG&bi)g!;!{S!z{K~X;P^=ZojsiqdrM;d$j4)Qd<82akkUwwf?Bd@jPLQz|q94 z)-`F@!_uu7a^cjZrlBZQgsRi8Cghw`i&2fFoK$3fxBM-!)qW)D33Kqq>-I$W^Wo`l z;GWyWKLh^&Y3pwp&3plACzi*pbRJuJvmhg*VUim-ZKp z^c_FT)&BrxZy)&MQ-U?NmqLfdpAR+b3tMEC?ioJG;)~61TGJq!^2=rAtT*PshMWEo z()K%UF5CHN_=*1j1cLpG{1@R*8hEh7g;U5ophsFt`-gtk;-V?v^OnN=DTw7WA zS6%QI#BUP#f5UzwdyP8fG^wZfYc82*=H6Utz8(e`lGEm2fjVD}zBPW%z83iF@Mrd* z{i}arWU!OQPadUj`&w(?6h0CK(Y#BhX%A_vXudP}h492{j>o9$o1*M2hd=ak@am~~$VnMV$sp&xz~8}^cGl}p+v==FEzwhDf_eL`#7R}tM?`EUHlcx&RX{1(6VSJrJ4TK%(sX-@)0Z)I<&9~OSlAF`K;zB>FJ zzS5-AZMB#$?7Us@+CSR6!@50=qoYj?>DH&x{2^;=rN=&@KC7i%!>G!>i>?0v!A`$z z4;jFkkH$aQU;YVS{{RIgZ7*fL&%|GYzB}*^lksBK*2YA)wYZy4hs1h+jkGBsw{(ie z=EvdG14W7(hIq8rww4IEXyiGCNXwHkrHO)ee$G-#Vlc9ux!RkQpxV2&8WHB@j+UIOM$J1ZXy5doXZt_?$`_Yf<%N&J4~U-$^?e%a zO>Y%nMdBYC>QmTHdu)^GQZALFd_eKd#&7Ht+gn|a4_?~ZS{XFQHj+a2&}8a=voGw; zr#ww%@nga|H17?`b@-3}00^&$j-wXncUdNt;@d3?P|;sVkz}@mGDRehdo+5AT^N!f z{Mq<_{tFl2i%*W<0yKZxhxT>-slQ;K*_TPuzA)&%FTTC_{qb|-J;koK;x7SM-}rjZ z!G8|CQ{ej@Pf*Zb#J7GM)O=f~_>W2Whon7@wc$J44Hv@NYhTCWkFkCb{{X>GzhFl3 zoO+Li{{Y~x8ZFLWyel+pRh4Ma!AlHrsHtl8cp`m+W1??1$jb8AS`}S|`CD66rD_j^9|(ZRJTN4-r_x zTxcI<(}X4&B%STyDKu*7H`>cv$8hs6{1d-lwb!jaAb1N%(d;~Fq-nQ0Mb(rm<4+j) zPsiR6)in0f{8jMd$Nm`c@5k>B{5tV(!;gr*AC~XKUMujXqv2Wf`^zhs^?Rx8{7IpB zdsET8U*SyO2LAwPO;+yX!}_2668`}9#eG?>=hJk50_xunZM<^xSxTR0`#!(n?FYqo z7Y51+BNKmUcurZQzM4%-O1#tUKF_5OrFBo(i{L+qAi0yqAF=PmKZN?^mV#+@ABP(E z#NAUvmRmP=2Tk!$!#^GPFIrh|BDymVH$m{N+>Z*a8Q^zhf4gsLibFudMhRTkwyIHGN|5Ue`5kF3<8uz@ar8O+wRJ)URx; z^r>y8I(C_6XSmiiE5)8TEk((-xLY-qk&<6MQqo10)}uz$hb8~zF3 z;y;bQ4SYNCgG%wA?2qwRz&;>@#2*v9aq%z4cPZfyi{2v9J{b7J!@3>Uj=nH_M)2C5 zLtgP0!+#O#cK#dCG>uBlJTq$svaso*-rhgrXTk?axwG*d!PDI!z7{KSr&!-!Pqy4i zJ*~)|CQ@1iy?bo085Bw2-_QC%Ef{Xp1 z;&+Fu{{ z!8!i`Wsiyf01rHA`&oX?dj9~8{5|5U-xK^p{hR*)XrGCeIwz03ZJ_)^@qdK%y<_4R z!hJ_s@ejjI7Vk{fbP4phUflF_TWX#$ zzqS^z#SiTh@L#~5A=P4v9nmB)c(>rpe*jcmY8Hq>>bj4IJYRH?#~UaYK5qX2isGEt zAMI;X_L8R>a;Y9pXK5urai-Ozxoq5I?w*ltyPti-Syow6G-^tkb!Qm2%}q*CYS6SL z4{H?_s&Y;~>t59{XbHUVXXL5#nQv$e+}zS^E9SCXTyFh zYmF~gfudDuBGe+xkc*3JIlyS|ZND_WJpTZ}EWhBGKOLVlLrF=v1hr%5_PM`p zztZFLJX7KC+AF}Y+q_O@9tH6S#N9sa;W5i3)7yM0)xI)X+QjV}K$BcYV?5UAiez{i z3wXabr=4ars@|Pi)Sc|TjYm#R+B&64sY)q5QfXhVj^CiXk0_}KM->`1V+N-xb4qEp zqO9WEZ97|)-kCUC{3HG>YeRbttez#%d_$yK>Y6U2_pkgD+xAlUG5aa_-pBTJ z_%q{A+GpZ7gYJg8;y)DpEb(5M@XN+O1w0|9_`6KFvC}+hu6UcnpACF1r)iqxIM5@-E~US` z`aHI#ahgp+z9zh=#xQT&Ny#LnwO-L`*E6-7maF+sk>Vx8*+v`NVQ{o#h@AOp`xuBJfceaXaxyg)qhHHo{e210V zAjRX2V+|BZ3dG2gtQx<-?*{6+dui9cJMm?{S|<-}s%qAfA%}7^#{ykj!Z$>Q2_k~t zD2yy(k~z{qhv?Y|-R87pg1J(u8|P^1u0sW87!2RKVUH~215ZekiF}Z|i3%B(ESCxZ zECV(P7}&%r63ZNFIj^^&lhTA#run3-*7t34-swrMmP>6u@64+41}?0eX}(yeqDnUV zD^GIoPWScIo(lD^pTlxW?f#I4DJ6yt zBF&v*m13EV#k8y%BXPJgw1aa?&{I$Geea267k1L?niij+MHI5bEwZkYcdKeqs;qYL z$hR`4p?Fy)xw?lIxx%N5hLwPv|%2AAve7(Iv;#Z7046E0MwL$4))7(-kVbeF*7{;aKsWoexZL z_vMova~AZAb^Bak|DAo}`qj{F~f^!}>|>Z0`YcY161b^I2F zYIS40l3n_1%D(F@I`?+7Bl8A2jB&>PeOLH6>Bp}asNO(E3YQ+lHh%_QGwa)@Jx!gX z85_SMc<0c2WO|QIw8k8DBkH5`<%dsG!0+0RV;-M7tNq=LRY|U|$=&||p1VJv+-AGN zysn<$`l{Oka(d*1ZV2tyB%D@k^32>NmCoE8DW1Uq>-U70h(I_vI|#wY_j9ozg%3BN z9x@olJL3TH$6<_+J#cC@!5<~cxFdiQeSIEid++_8TJS-C5c(_Ls7Et7zD+{jPeR@}-qmM4M@ehz=Z%9im% z{{RG0{kK_s8)s^ZH|*5XTt}){iDN7KRQwHC<}umfXaqSVFAM-k%M^D?H1a_iu@!uH|Hts|96d^|p(da^A{m z#j|>nlcO&Dx>@zpSF+yPw)b|s+xT$(jN+e2{{Vu9e#V-E_-ITtpW8R~X;+Rf7+J|3 zox^-Z(QK`fD~YuD+16uoB$G&9c#;V%kuH3=q<8-SQw!~9Q-b1n*Wu2$CRqWIb&m|} zWkow21=gl2pb$bbqsNyF6rHvHRQ~|89mEy{Rpdd;H#)qk_jrkI5^_DhRT zh&~ItYiGU*s7Y@qx>gszX|tcnd1RPHBoRdr{{UAlUi0D{HZt`~l_I@eB{{U&=W|iUW8s=ANw4mC$O53E;^GWKj-GZ#8 z1eYs&{9La0iq&mxHN1X$>w_M>uB@LggSCyF7j~uL@Ol0(l6QWr6sSXy-SfJ&%VlNRrnbJFHNRe}s&3j{ zD=&%~TH0#2yS}ftQs>(>_8ET$u+9z#h;)|EQN}QN13Yp=0D20cCGNC8=1-J?o>yMd z4*+l*e8_p@oSwYmp=;fH8>R44z6N(k;&^!^^MLkIcN}F-a!%gu1K;ZTIq)sn!sHe4 z4xGan=R5YC0tP|j89C<_&nVMc>87sg*V_8HrtfFHt?6>G?xpoheUnS@O?>vX`@5B; z)wN~~yTI2>atHi}bPc2ooPWqbWpJSU!AQ?Ro-?J?H9r0TzhRzPby1U!EcBLk-sGgq< z^;|AMVXb&jZs70(>&P-lU%i4s$vDUv_ZrryGF#!6u)_x%b>9bqz!C;`c$5$h21h^+ zIOGe`c)!G;H~df+O@cB9iFAy1&ny@31q6@-0g_jhErWOCuM)@q05scCe!-W-dH~LH zN!-$sF|?9M#xhR?XM$?(%1JJ|B>G<0UG37^?%C?np;A#+qZfUfsG*Rv&9W>`UJlZOD>};lF}v1ARH$#34-Dz3#R&%p=uY9z z2;a!ud~Nu#3zqY~9oa^^S(a@-#1}EdgeC-+D`+8tR`X&JrOdI3H>q3(+%=wW8gG&E zC*3CB*-J-Nt1Ic>?mt?i;*S)%QBc8Po{1;VEp5uZ=Bi0A$F8?W$O-Tt;{NO(hkC?e zM&Qz1>A^!B_1kn9DzQ(SV!0$TsbynRf5L$Hq6f|43$?=qbxELiD5XwWk-{EAg)zGp z?Zj*=>gj$j{?S)#@I~QY4#M%kZV9o`^&M&@MJf!1p|pTB1mH&_Va{2Ibcv*XCtCQ= z@%|aSiS>_$))OKt{hw3#OYuVPFl0d@7QNHww1Hit2}sx~{pY3K+g&f{b>X~B;@XuX7lXmw*-MsHUYc38&2@f?>dwzw9uF_TUx{)>G=K1n z>Q?c{${Z|kOq)Z3RS7dPkje>dp-Ps?K%@`CU-&pT;rEJs2mb&B?Yz`=I}80jEkon) z!d)T>FD)U7CYi0gWvL_y=E*CPgH97M5t80PGLJ4ppXhH?{i8lQ=<-{m_(R~&jILUL zC7_n~;&;Q@8H=FIChNi;G?E1*P2{!5?&tCqQKxxVAI@j|9C`a;c*Ek4>^tz^;XjIg z3+n#>4^saC_MPy4wHJx(wabqccpFuZLil^}HB(H}^-H}E!@8u`*AnWmT|$uQDq$8^ zYk6yJI$EXQufuLNvrH{Dilr$^vXZCG6*=;_$=VI4&1>4%R_f0$j<~~!v0N#f!xe<3 z96ekd>DH@Fs5(%pqXyG+oaHOaZdl&$T@UBS{s{eWY`@^9pR?LuFuk>x!=JP+mhnKg z(Zw;;KV_ecFAQQ^8A8eCUpRJ>S(aHixOohzBMKfYq=QA)EDVRvBI3y)btprw z?={ibw%Ei>(II~{g?4ECb=M%YAk6*GuqljSa4wES4V- z_xv{2V!3@@)@?q`CewUhdjh?}s>a2xW0EM$S22Hk`o)KcB4lgZSuKLHg!@LXr%M$s-8u(;emGHNoT4og|vme;#cweKaXZM}9{pC#bc zYPh@xIyEaUSmKu?XFqxKQKZ$9vwJ(}+UtJ47@7slvoSh8r;!qqgQvoXV+tKitErr; z0%HgWQUL?YXu{St*N1f*dy|be{mEE?Rn#=X5Hhaa!0K%(NT|pe7)B5?C{jK~^)!1Z zW+gSqV%j{-vL(Zi1VU8@&WR96cDwCGK^|o&5tnJA&t)~kV_dMARb5K0i@fibVCbYn zx#9#iA9>sf0WIBv51fu~IP1!sTS;uTweI62+Iw2hbiF^IDB&r!3(gl$RNc36vRu*G zX=k&s|l^Rx|l6^ex-<4=-5k=PRJ9rTj3g7JV#0->95QGniQ<8-%eBTS0) z>Ne`SuZe?My`#<%;nF-bw%cP{yFIMmZo5pv?Cz32@T{>kzedYGlw@{$=DGt2S}zRh zF(y#3Bux}n>|~4(AE-hBbTP3Kd7s5=J#)lb7ly37G4S8SUMpBNKM~0HR`%C6#@T0s z!&c=A-)a`pMI)PWwI!IBL*`mR9BBFao)*mGJl_i%u;qjH(Wy5j7{xj=ig&8qZk?^I z{{R;LTf}SyI=m&BP=bu-Y&_!_+NU=qdQxi8yxo%3rKa-O_~*rvLucW=cKxBad33!x z$6QBC+tg~+($qW{;TV2aBCU-=E?c*0N%_`d$c-}SjO>Wo5P}+EFQn>g5@m-h1J{8oi zrfnkDeOd&)OUp|Mmr%7YV{_r#n4-LnMTYw3#%*3EzLQLjNv*~0@8~(+VTV+3wCS}Z zlQ zEdDKtBk-QQzC5LP$zqn5d{08{Na}B%dci##%J!eVKb*)a~KNNg8)jTPxX*%Yk7wRst zt=cp`B-8az1bFVk%UQg?i^N_6*ZdFh4qH8WY^^nWWjd$CYkv&tah(=BT}Inhx70L; zzPyn%d9+yU(^2~s?}%$lb!m5Df1v6*Zm;4kGVg@9jiiRqjp*k+)tS)gBAYkJ<9;$08KJ`C|+faOgG z#5Nu%u$mthd^EYy^%?B%EWRLU!$`8$b!ebwa4te;BVTd4I@|Aw4V}q2jd5ZbcEA<7yDWGb)fM_i>+=n+Y3uLJ{SCb@GM%L zhNtmIz*=sFa5T#wi~bOOd&N2)nVVaUAH;eNmw%*dAI`_dZ-So^zh>_jTYNM4!{Mt> z58pI%UHD7HS|+6~t?;knb&{kKOX8o0o-l;TrrVuDD~natGKkG{5oB`CCc8H zveR{I*jaTS1bj<|X}-q=hN&Vsk|mYn!QPTuw6WXBAdzHH#W%@u5{aX@d`4u7!=La@ zzwt}LURAe^ z9R$|%G%z%*qIXz*tVRzn%_;KZDMy=?T1x4;K2)_y>!)u`bY4ye5t-#RRZJEpapiG# zaXiX zY1dk2uXCs9x9FEq>3`U|<;~xQJ}CS()h*g9`~LtBH;9S|R?w(C_Z1iNi^L&|5Ccj+@~J z?I-bD;4{IX_;&Kk#oi5qYlOb|N%0aJsr)@FO)Road7#L*c9*^v)UGb4y1iNaH>%j% z-rqC6qiw1~9QKv*c-)f{fSgNp0-PNew~%^mJbt$`o4co zHRU++`$*fKEy^DAaEsZ>_l>0+CuvIUdsoCyfIb+~wX07Id{p>Fr+gInfv(SRo)`Fu z;GZ4J{{XXp#a6d3B=Kq1dX=8Bd+__k7m&+t4w)B-wCyWQxVW*k)w~Vi2>G><5aLDYF-r8FD$fuUrGlXZYH@~IU>}w=XoPGnuUselTkn((r3$}efjXi z<2UTn`$}5e_!)GKAHq7;y8_s1-vRzH>MVRcs$Z?UM{1uB{v+5~X^Ca2+ew&oiSF(6 zEl%D^borGdeKyBZ)BM}wU+nSmFX3(4Md0}L?;iMG!Umg5_;cgidn*r%eg)Gba@P@f zC&ejn+DF7q0@irv4W-!XOLch^Q4j1JgA3|*{;p5Na85LFP-<~XEzTUbmC|lp+G%Sm zH__br%;$z-i;J(8HBy|li>J#eC3MoX6dQJSvs~@3c{g@^bbn`m2t=dIxYiV$WHzS~ z0#5}>Bmj(O2P_5|c8A}&ll~MJfj^1$nSf#l8noLAfsLd`7+`X600RK!g79nBEPP#} z>k+vM@W~vrT3lPqvO{}mdmNI&`gQCQ!5r3iaZL=d&24a^WOa1|_cCJp&8HAtPa=Xt za`z+w&KnL$RbYp1I0FZ7Id8k8Qw4~EnvExPwMs79B%9T}JNoab`Q|GHi@{WItfrmy zO-(DO9d7NWm%6^n`W`C(00llA!Z5xbx^(~?%i;}h8?a6oCEO$~Hh@0&2XQzCqCX0L z9m9}3F9{2RKjLq$ToM$pYzEa8e~ba0ryn;2;=O)L%^|WA#5U+aI95@FIbsheqj%jT z5H^BxbIM~)K9E}r;yWS%Cq7RG z_)&gT@XnS;Kw0nPW6KlwuAK51spoM6rzX7`dy5dP%dOaea=X09R1iTU<|PXNqiT%x zKQBUSB75sVNIK4+pI^0GgMbLm(;|WZC+6A+InPYjWGLYpylK;KeH0&OZlC1)qLl2u z1=o0{p3Q4(wcgg(YaVwufV?^ZWbpo$4oejaA`Uy?OqlD8g#!bo31g8bfV3`l=vrw5 zuQMpX$pb!P0y{Qyw;1Y4uRxbj(jz%OA=CKI0J?zSE^(Jx4jBBvf(G1!kle0po*?l2 zLv)#SUDo+IHU>s;#a`t1HRAlZTg3^z=2pp4uM?Eo_H-j`x6a9;7i=1U;l?cx7 z`f9lt$MF&{F~MLvi9Ac;^UCX%&N}|>q>yJAIXvVz+}Ih(I2b(D2iLTw&dbY*f!Z?` zn|Uxioy2X0j!ScamTVkjvUKoj@7dB?e|K+prLCr$>vr$0?3GzND<`#{i%l%HOQ&Ui zw>W8h8K7e;W)-jr*ku6nK+8zYf^)`G8NdYNEu8)h(ZR|=I+5ReL}#eu$rW?cN5efoe{kt7htgb~Nzok;-m zowyx3jkUv47*F~08)>gBS8H^&t!MY&snVqEnv&@BN%re)I_S4rCArEsg>69?y1mC4 z2g=|AFhN+8wogPSfC~|mQeO^0yo;NR44!S{VbFjvN`Gx6~kH> zR!Rzomb?|#l`z$!|T#fquH`VK(@ zalttkmU61&1Av6E!l?s|;1I!pIXsmhVMuJ@dfThlc{cEwE(j+i6=nHG01Q-y=(spI zCpAvsJ0grBBm@KiR4zv#friHiBP0MimL|L!w5jt;l_svOz4lhR*G+X#*3WaQ2{`F1 zx7piA-Cb;*_Seyz5Jg4ua(Ur!0q1sdNf`j1067Pqnc~bKY0=3eU^IyFs6sG7U7#l5 zK+8TDF4h1N3*>{O_N(@gLaOv|xISLsFw2aS?!j<65tGw9RgqekiRp^t;nn*?Kjm#wwDw+h(dv`GrS!j((;y51+kt`r z>Ch354gmvjJn_yb;GEzSf;j9wd16To z!5s2%xaYS}c>e%o^}}N%93DAt2LqyvW4=yF0B0X~XN+g)3BegXGe!#;7wrTBaE}C@yk#64VOL;_qbk88*_5(&XQvB3Zw zmg#OhN9IJ4r~s&3V1i3VRBk&|g}_{%NjW1p#yJrnakytV;E=!{m=Xv$VUVW;W2R1V zlIYtfX&3-!(*T2>4h{|h7y~2?xHZ#GqtR>H&Gou^^jq0$rS;a=o>bl5uJ%u-P1;Fs zrnbM_bXtbLaXP480sz<;!8rkm=nfAckC+}oBbudYc{x1o05HiTa6c=62OQuGPxqz;p)~ z>yk2kNg3}>yp|#ww$-n1M78VJTXemZ(a(sAYfqNjZ*-Qu74?2gYx@5HfZ2zDykd&P zi7sXYa8$^aS8j~J@JTKEzCkQWQTLfXe}$A=!g4_`E(ryI9%EzMImSvHo=F@E_s@sK zp8@!|1H1hy;j@9|?OO*qVicSm<%d9i`Od}-^W;o?i*bT}X>q_Ib1M=@93BT=F`n5K z+nH9q8Y@+3wygBg)9JI_>)S+-u+g_Sn)6!ge$Q=f^ETtUG4%zToaB-)5BIi(0FqR2 zTjd0toYmC54S+~IZ7dk|+s6b9pO>K=U;&<$ljVlbCm0|GpU3IqaRb_8KTX)^FW$t5K zZ6sroK^Y;AIT+i=TyRe$?l`7@X)xptIqFC`>_{p(8SG91@;Sw0m|q~4ILXEcW;w!) z;~hvG5Tp#8;H^J9dB%E@4(^AaUZ=ir!>)2T-Zh=m{{Sw@U+;gN?a?@;_p9!@tKa;z zOIvJoHxAGyI$#5w+D1SsNy!)-;N$`UAbOHHy7QE|Wft1# zw|lKtzP;_+Rwkm7eS0;nte2X)^s-$YiwSh>;BYzvhUh}{$pnmj<^%6%01gFetGH2+ zOK!;AK*-7TQa)jk&rV6fQU*o7&Hn&*<|lSCpmZRDqX6TMaz;1`I@ZM30yvpSCvv)B zn_(FwsRwR%6O670pcw&Zp*co3leN~3zcjSg&eziRzS`d6Nj~11{t55ZuH94Eio;M_ zXk-n8lH|F;Wjy71``J5kI8a9H0x?vP+G$Ijqa?oGdSjte%V1z0Hn0Q$Gm5HLBptSe1g_$v=G?@n zB;$|+@s5FTxa1C%P^|Q_zKiWWz1_Ccchz=cj9#hRZBt2WrP1F6Da*Q6SJ&=(Y3HHd>7ELQLH_`Wp0%gj z>i2O8B#s%b(k&$!6rwE68o%1)5^V^IUIr@0byOvjKgQlQ@ehe~`1G0dT`x=0?L4{Q zx6{OX0>vAuk3Ia>VB$t$3{MnJBZa(y_H^68YIEr(FfBB=;h zq~sM)Nny8k1~S#IJg_b_#kq)-b(GIMOjIkUmNC9PjUf!cp&^ivMsmDT!c>%#lD^hS zNhR>!_PXoZ{rvs4oKT|~QKL(iGKx-cYFyT`zci?GCv~qY>h9Ktt;VIPE|Y&_6{@Q0 zGHL4DEkioVV<(;_f^4(HF4v0P{Jns}3YRDeJ+$8yyjs2=)hv=v-D`12r%dxeZtlOb z8J#Yzt#t{+v)Wr-Gf3B8V|Ya6o*BfEgP$~8nT+;Ofgl0rk(bVM8kK`^Lm0}LHo$V= zF>%2-A*z&jx33+91<#hY7plSKR1Bh9vw~PJ&YT5|FmkvGGSr?GT`5IM+N-Omx5(2^ zMBUO>=$Dm`GQMKn+$A*^7~e>{+Sa|**6!}fy)DxHTzZ#-7e=v*Rq*}m-7UDA?HYXV zYSJ^!Bs;EdCG*3sSYJ`)*joq_U)}0v6#kwv$?D_SV{_r24nI?yQe1 z+WSdp)zVH+T@vMA0(!0P^w*$_j5iRY?_d%@Bj)*V=an5sGFgGiI4(k}5Ws@04`Rn9 zzEj5lt_vP9&Tx3($g7nFh8TqmUw%P9H{Mcub<1r4jAsB7GUFe2E6L$W$SS;?mh|8Q zkO|HJz^YJcNu_sv62C;6y45W@>FJ}siYYB@_TQ&hZCXpZ^WBXxulJJQ8wA z9FRab3J0!6M*_(zpnQh_fqgzX{{X>A z6HeAj-8S;p{{W9|uG6^S&inwmJT}wWgJFRx2mmfIkf4B0atV<`;YxxV1Sw=BZs(8` z?mQfWkWU!NA1%n^L|l!a0i3f8s2h#}$tudghb*LIk+c(4E^bmJBYOPU`4NgUm&P0b z7_efa3JA^)4gsjlCG6=-U6zg6Ejd?~o=VAH+TP^T!ntDUE&cj?F0HR!FWXl9?{4Se z-+`p@{{Vq>2#?Kwo?6MQSFFNgHGrku~BSzE<@1*W3VM6z1j!6bfa$!tF>%(DuUttxPGc9fK32_~h= zqVA;z-QQHTO7=@ezj4EG-70t*5|m->YAQ|Cr)~Rmzk(thtir<#%>k`qzrS z5gQ+b`ZdSIZw`1nM)3vh)80+s?FUi{(b%QMyLs?MVW`U;_3oDph`ODeTD{H9n-{Z| zHkJ#B@ zI;3;SI-;0>iAPQ1{{W4i0`Sj>wSN|PG5l5WR@(Z~(#K7-_>h7t9Wr0AM*5Y#wwE;8 zg!*JncrF^p?2`zih|2NF97s2OA+72YYqz?eif^u#9eV!&SeEQ)_PTrhg3{h|B+|&Y zGDsn}hTWMh?JVOU|wfelOdsj`VwKpc4gkdT3K}FdqJ!F;k z4kFI-+?t&_8GSlcGmm8&e^{jqG^IwA6nSb?tMzHqs|uEPp$8Wicg-CR=f^%f)jV0L zT;BM2_=eNMjXbQHb^f#crKysjOFL>ZLa{vTM7Rs&No@$+Vpar-^XIvmb~8J%LaqCx zbu6JlDmM%sj8wBL47-v>>{JuUEyRyItQMpIrq%@V-~eDgOPO9m&P$&)q$*s6A~hRn z$1AkXjT^Fj1A#b4^{_msMr*cK-k~je9#U z+{I4!a^}|hTTLwYdRtA<@y}jy)RI-cYz&Mk1du`dy$2aQRD=Qv;DQMOdEB7nf(SiS zjIIdARe%SG@Gu4x^MY~CHjaDb`s3yR40fp-uHte)>To_><$dsX4p<(*05~3Vr&?1| zjcFxx?Ax`p`L@-x)%?j(zP#;rvTF9)%{{D_s#^87?vLV~bHg`6>q5V{vzRI-Qstw_ zToNQzkqn^;02U-hav}(gx#POmwVg(G)HOS=wOmNy3rI^$z;4KPjnp_|4(~Jfgy%R; z4g)3&OwYrfLEOwq!k$44aMn$nnncNYTm}B##lguvbTD z-*cakm1JN|WhrI^N~%sc;5O6GELE31ve`KpIU}m$?ugC?GlHNg=amY09S%BhMtb6_ z{hHqGB?o1vDs8rs-&L)amh)P)X7MZi%mb!nG zoA)MUSe7*2Hjkb}aHj(}P!8edfxqS*ES?V3Z6hek7)5(Ggf2LvjBUEoGi8BAw| z&Nk)C0msF0b8Jgm%3@+Mx;Yt63CS4w@Z76S4aLOQ*!yke+@N46nWUKjz~M8H zFcok%jl-Ye1YEI8Iwxf$H_B2i&Uh=H2{;)f?yu6mwFSG1OVZl)+jV5^b<+M`X0}fK zwM{UMU*q#IbEa5ws!|4WU>-C$UGi-1Ajb1H6Ik*oLgE)YKQpl zOfWKmlai|J&CYoVyf7pIk^*>|QcFcH%`3euqtW%X@1~v79 z*PyzF*4<2+oY6FR%B{k}fO5PAiZDpqj!#^d%VD$5Tz^;0d=C`$D0>7$c9D zB}hErkg5kA0a9=P3_vAkStgKxHv{)U5s*RoP6=ReN#U3RxC{X*26qmZ^i}-J18e{2PZt>0uB#QInNYF;oDRs10v_TT)65F z0DwWp;tn>PVCRx6W;k6s`Gk;3R@!<7#sD}Rl0%)PPDXNf9LwEO3uCpUjOQSY`;6f59 z@13)N1@wqZ9u%F0UsLZFfTxrQh|(QW(%mH@Eg&te0>T($)aVifrDX^xsnRi!*hV8Q zAfPlON7rCOfeC}}Z@+(FpL_4#d+vG9d(QKutkV5>-a-YS|BzR-sy~-6JZIP0l;)?@ zIhQAAA}z7vLTL>2;}xn4m{G^1>?C^rri@WL6{_?uK$Z+eu)F|^SCsTP#ZCHpo!4xmY;_fEIB{k>CAcOhyPep$5`5e5c@a|I0A zFG8VbmLQwDV~=g@0*`kavRQ42dgF6*W&k~Btm_9iZE*lKIjo^o;RM=mihCaK#82IygmSud6QU~Kl4LDIH!7G^$Onqy$K%pb} z_XCdPn+2&9d^w{eVHF@SOW#y&F77O|fWG5*{M?O4SOIpY9QGe%tHF(_L5JsC#j<TO9Jbi!{wPHbt`21TufhQA>d^%rsLXaJ!7?As*w8`ID7zwTR~e_r+kAJ9u8|O z9lj9@W$z`RY3;du^tfY#J~6e$1z>rD+#TsBT8zH;AK;fvI+f$@pY|#-+nXxd ze20MLtgK?Kmg$Cb=`~CLeioQqDo=OkE9d^pzk{5VjjK;vH)Fh((#>zD$E#>&CaS7% zK}ooA-0b>o|EW(#brln4!lx7Ta z`(ydVIOG-y5;6?(ohEXLBtak`apPkf-e!Y=Um|5t3FZ{E*+i)UbBv)G8j%UHV;Ohf z`N{rV&OL-2Dw6Y5RnyFnZP1+j+b6fnI@uopqaQ;~0FuISWNk+vej?LR8|v6}9@91j z0xvFu;Pn+hchl4bVJ2M%&JvT|n1hI%qk7@CfPUKN?{5~Y#f2^Qxv@(;+;mUfQQUa- zu85KiOkVwMhmR+~PPK`mA(9gRAJ_P`74d z_)WFIj0x3s1|#p;&N?h;(d6$z{pO==v`O^Y-x%?Q>ziCqb}lZ@FKauhY&#^mqoC)~ zXAx5Sc0_vM_a5%Xut7@y_*Ke>Ljru800WJ{@tYSs%T$_uX4~vN8b!hQ?;1C6QHd;_ zvyqcMn=DD{H_1s*9cvfYKVQ~bT$zY!?tZkGYO{%rs>A*cLY!Zo|7N5~>dT?E`387k zys319w_S8F7s5RNN@Tqepsl# zmPO@jx{+Y;W`cE6K)={~z)p>)S zq<;548kR*@P-nYk4>HHwb$MN|CPb+_$I*qAXw807ve5r`}(c#)~Z*8v(z@AP2c~o4+$6TM=Bd zZ`bOnL%kI~qK871?s7X?x;Aqk4wyJB7+h8|x!;q{^}k;?2YYtVzbhSP0 zo~7cyd%ft~b!ZzW1i>u*GLB$VD^|a)gF`y=5UZ-=jr%Q0fkvG{9fiwR zt9eM&e}GAzow@^UW=YA?9Ld|GKf$G(`KA2ljg>%wJ7xpy;L2~$B zEycT}gOR4Dn}8ds9_SU-+4#37im_4!Y-~r0)2=DW56Ty5dBAkyQ(<@H z{sV}jRSwci-5FG=j@^!?ZsK&-U^fQu$jHeB#!-gy(Za$8RHTj^xo9_oehjM9!h$!` zi#7y_frE3^SdpKLGhLoBiI+%Hx^_J0cyTW|&Iqyvf?FExcSTt(&p(pQDmYi+%g9gt zwzsRw7x0Y1kWV0$>-pve`;g?1@n;(vn;x&pzKp4pLJ4=eihzh9jGmo+hxUQ&UsENpm-oc1FW$!Xi!b`yx5yQbO+GTPTyPv5DCCKkn$>WP4g`lo95ib}Jx*{MW+1(9UC zW}%zsLn>=U(JkCMJKJPzDmSpH4Dzu?Kgdse1k+3El>H}+lYvTqyJn|cbI#_?lvn23 zLQKZAP;;h(|Dq`U!pVBb$7MYz4cMOD~2hR zJFEDmsHAkrKB{xo6PZ!BCFia}&Lb0?xfmi+Bp;tu05cb<&VTy&P1?^->PFn@ekFjv z>;kI8n*M)mT2p;m(5nx6hBe-Q_LFZ}^Hl9wBlf31U|Vuejinb!s}SJ2*-_YcTXx=) z{HBm1cle?;wsWpNsu%(rTP33Az)*+asjq5!clA~Ld*cju_`=g$UQ%w>Wb(WT^x(4Fyq{=^c&0e%~wkX|mU_KEBO0o=_Jv)$xbqzmn$m z{ya~0_aq&5Yf@4P-nm1~yj^{={kzL{CAVqL232$&975lIfr^ST#g+|wGTg1Lj0oyc z-2l+%Yxv2{3;rp3*zQ^DvOw1!AY)x6`MRZWgFn~H&+p-PRX!v&nVfQVn7|jZZ2|5( zI^?OIUw-`U*~<=_ciW=kBF!U_ste!rsmOzOiU1QH8jm-`+m{t*v=bK>N4J9N>rOUU zL8Z%C4ld_SbLH(9f3Z_B;003J#WTsXA>mj+8%xGRX(kgOTck6lefg>%C%HA`+R^t# z!(C+qMnA&IP5r`YQsb?5+wP6t#(P&&1rzy^f`_ zT8$HLEC)U)&AB#-KJN~`+=G^X8D%cZ4RO!4Y3wcmbzP0oBjtax)qr)|$$SCaa!LsY ztFRkBo12C9AII1-0RsHU!L4UEnZNb%8;Jbc=!yv3E7&2=iYu*K*YdUF<0(-kB`Xjp zyi>_S>O~+&R&!;haoW)9Sl(DFm(sg(w|>C=TB@eKrA(_7^1yr0l7lEKQ|GW6D(U`` z@}vsr*U5|B74*TjjDlyi3N3&NP!#QZ=Xb1}Y-T%G9J@Y~k8fm-(>YfTU@h(PgP$Qg zZAUz;BKenE)c)oW8@tNS7$r`x&G)wkDYc$kOaCnCv{O3Yw+>^71wdL-4Q*}sq`3XM zVr2zHr1a5eB?}{2(dTL9@IHtj=25RQcPwjC>8K}P^zoPF-dMxl9SIeAN8PAx%*MEyte35v zvhS0-eGuy&v|TFKUF$ui62+QZD+*6d?!FSfYb3@VBJ2LVTV{}5hrO39`LN=xttqm$ zb|(7>zCF2cdRfbb)yFE7Eht8j#`x;mG>@Y@=iWxDdR9}2TZ>xQ? z_^m%5l(c;4mxd)iVsvS5a*BNUA@{8%8agKAKKm#86!phw;IO&L;X?z@_`Ou7m-S`S z*0tD}a4~sTrL)<^%++T=bi#0$4+b-AMVDRbpGeN)&(T{dr62tD-Jq5Y0PFP%ca+(z zyxN-gHl3Wu4=D z;FWlb?^W<~dX)!E;d~Q@gf#eG=Vcy#%#}1|ol8kM}(!sFs1yJM4xyGKcWwZtQ}f{_11e%=XY@i!xEe{m1YU!IAwKK3kM z%x6IxB%osm`FnCpuOvzw9=(8iavFS+O#3MhxUpsVsG2!0_L=xA?=Ff->5r(l70xPg z?E=%j!@30m5-+{@qk4v4t@?eJ5};}ExA&L{0>z8_y*1@;?8jdaHV;<|AIo@OCBbLmu6`oD^nh?0QvJDGPx@;2=jd z_AJD?x1d_*qynVS>W&6_&7xp-;r4srV6c{C2idxUghr>P6GSKxQU2gjt6)C0N|a+syu+Wj{rm_~b|F3rLrbj}Kp;EFi5vLGw*+uxSC%-@VR! z0`Xb^D5mix`?8dki}@gy%_947%hvVq-E=!RZB$E{nct}2J6J_qMcwaDAM%V%%bUCMz!kW|<7=0i38*WL_XW^yM(XeU_r>02JyFhS zCTYRj_bJY$mTQ><Tg zvvuw;MR0>`z!|A7HMI5BU}~$kd@cF}ryNKJAx-vLpD=$H{A}>FmYU6%My{aByyN@5 zCOIR&B20vmxM(zg8MD4s1a<8 ze|?DlA==jEWY*3XjlH;sgXj{JFJ+d1*UGcas}zx@bCQROnl91|kw!=k*EgSs<{MUpIi8#l?aaO&kJoDrZs;~5np(h?Ov?{<53_)DRfkE$Xn<^}O9qe26S;w+3%l+=6=6GY+O0El&)xx5%y(~Js1 zv91WuuY!TsO%E!?swjVg{QY=hGuBMMex^@;{ zXqXJHJ&@31yz!=Dl*Z~qrCO7fg^_jOhZ4?;_Nv=(6ud2J;>D#0f%g%P{xwk?H;0Ky zHTFWHur=j1fu-|9LbGMH&IfsgIoY+qGG9jn*4zO}g+;jF{KC8eMb*^t^R(2Cili9e zae|9X4uNofCXZW9g-9taX*EFcffm0M!(O=$UD%Kyu94Cuxy_b2*sDTLhgvy3`A5Gr z7N7sKkYuVhk~buG<$LC0V|!b-i>x?%3HFnTL2lqvoIluSy{AasON0lgp2P#>x4Fsk zq47BxdoS`K)ytt)7D*Ur&GHQa_U<<_Dg+GcvRiBLT0S`#>WqgCd`e4wfm~iurvBEZ)fn^>fXwH zDlf*HFPr^C@4*1uSK_*e(8uXf9@jBpzY%wXrzzAu)Z#{bsyB@FU%#`axJ$|BOSbFf z7wl*xqAZps#EPvRsqt?!Ro3#Xw~J5*x=-A$xa$d(`r@JxR;(<=NN+$lDI1Q#7}b=$ zsy+X!PRF^Pe)XVvDJAO(V(Q)ec9$eq>V7Ghc1w)rkt?>TOv7XR|8aZ=&t z_zckqPRMX=!rQ$g>P5g0(9aM>gC|Gh!*ga)d;@_XFxV$<&I~~!G*^~nOJbWbAc=I1 zACV1W%B;{TV1u&>(veT$*Rs*^uV-84 zwnr#6;11D1@6mkn^|+Lr^_FEx`OY2vYGb;VKU#HYL{MP{iXPj9ryL|vBGs;6W2Biz zE5ecjg-ThjZ_RdCPnrPvInK&3oVRF?X=C4{Vb`a&|9kI6U^D44&w z=J~z$=ZG_Eu3ysftk1Ny6}Z#UIc;TuLZN0{w#Xh;aRuAvOp=bjN-bIu_ablK@sK`y z0gQde?UAnIK`nFq;U8wztwAF8-6uEC)VoU`(%ugU?V#7Pb4)@9YKM`|5AzdJ%aRQs z3jSAl%#KMM*BAybVjr!1v83R?4uiK&0xs2+y8-rp(9B|$Xna~{_H(5DWCgCRQra(o>}L1P&-6+b9roLrjl!;KAhdHv z(Y{^jyp0*Jq4aNEIOaNZNv<;x=4}M&lmo4f3CTFs=8BYS%8Rm!&L|~h=}tC7?t!`h zuX*-Y^_oc2jjT-_jt6C|9BipwO)>v6-KqzC-DUDqOj_4|O1*J0?*>jiYEQY^& zMI+vy)V2^k)@W}ztG9~FNF_SsCUJxz3{{GTD{gfVW)7lNt9Y#lH|fh2fBA)BUzGPr z7pkQ#X~zo6#qjCt2lf8h*-9d5A>^KE&59ZAc`j^GKEFh8m*war;-4B&8$_Rk_Kg36B6zU0;-&_Bw@2(xP00ow zrmwjSOT4bH@0%7Vnc#A8xg2ZnXX8&*Hc$t#` zGRJb0)R`Q0PGZU`uZJWkf+RJbg^Fg`;ikuG_PUty6Y;0d6c!KW5j5hw?7Ym2r1PUt zd9z;%=ctyMNZl`EP|2&JPm@*53f4b^oBUFk(LGJp^<$OAxj z;*ehxA5WEbX7q1Z=3mQSF%S8-M?WCVU_=|-ww;Bczjs4?d3UT9D30L{*n0(|_H~%E_;r8EM{(37 zCszNrvy)SGJGH{4i2$hxl^W@S`}Q#n^8H!>SKya~>B==OT6Ah=81uiEGHS9YDF)V3 z2e}FQ528XstePvQ3~y_I|0cZsew-LBfIF(MB!mpC$PhR;Xf&0Ep5i^@PPv86-?>mA zoGsUn4c^)%uA8(Lfp4B$v`=9VPt)#$u)4a5CtHxe?_MC|E!+M`a}(L|xjls@Jz%_B zUlFZ2Rir7hbGnNu(jNCF$3=jkyK&&i+L(@S2D|n3u56g+^nw;C@XBwXmmqp}g3YOk z5MDds@5eeY_SN}GkxZ`}#~YDRi{VEyIgKAmOC&iuJlcW1wh^vw<3qR{c}k4L6Coa8 z4D%p9*yyNiEELXBV1sOG7+oN&V)QT;9{3xd3mP$sX?OmZKdph$7l5ySylM8josyup zS~ySpViDDeOPhV-A~LDStoPx_h_C&9LF0W1|At_X+jj(j&L8CCN+K0A!%8Cgnm;&% zzQu^SJ}!-~4Ar%tmE4qa4_%ls{RicIVxrl%2CRvM5Iln~ z9~NEoP7FAh);1d31Ryycvtn;b4YQX`XD%>*azeg%yYC{x{h+$2$LyZ*{_U^8h&Jql zGLQD0Tn+PTi!u>jka?kY$azXOQBA$&9O4*kXIiL^N)#4Le~F;Tlk;T&*Cv0}7uJho zTb3_SS~G6RVt4~&6|u+VCQ5-V*XQ(cUG@BEqhbr>ROb7U>g|OizCs==7LA-sYm1Iz zakUaa8>wxqDf=4blgmp>A}QR^K(bF~gpyI@~>#CdIPU<6h@}$%MF3g8@ON2x-&z!yke0(^{_?`jW z&PF9$+orKfc9_>MLTxXqZ`%fhqZd7Vi|m5AzJ;Z(3aQEG2RFS5D-jP^sPfKh3Jw?d z`JJKN%S*j)TOZ<9x!=W@yuJBu`A=ZQmshFHKoCf9tK4#D?A|_u#DmyA0bP!crEU17 z7NKrjJ`lVv$!RrNng+Swjzp$;7R@AMVY4FvjZO^scQ8(N-y>fa8C#{7yT}d-9ONvX zkhCu8+IP*2qk5;I8}+p`mjj+T9}&VsNpk zfv=OEVEcM@il>i`(8NIw0ykkbIkC`Tcd1GgAdF(%$X{Y3 zTVmq0nJcD)()4%p|J7Q~^{ACM0fmaHs`NC{b1%Sy^_qj3{-DamrPV%-8|65^qWkWI zy!UBp$uyrHm<|=m`p%{XREV8;sjJXrPt6jkjjvzB($Pp@fGK!55Gb%X%rrT&sN?va zU&Xbei`PSjv-R ztiYf^Aw>+R`;IN!T27+@f-T5AjU!mmD^BkQU9p_j zb#V|Ku3#O!8|qcj6P5P7cL_CmzZ6@J_?p|NbIow({qFdk9_QdO;}tJ7cm;M*Hl9`L z*ukNh5igZxhDgGK%+3Em0`6F+FZD8A!w z!2JTJViz~&FZCvWv&@Rl;2tZ7rNvgjhp6&ujp{RJfhZ0V)BqDhWZt=^Uc?Vs{L-M_ za772Y5bQ9;49@w^dRh{ZLinprMDhefRnr{N5u<76F!_1%Xhab)SQWBPWBAuP`Pbf@ zt?kfLWiC77U1jq;>4i~DI${kThzUv40C{3EQb`$1hufuwJuwQ2JMS-kcTIz@A1G$_ z&eLxq0gk7v=C*zXO>l&Y{V|?-f%|(cj+^PqU)KgiKJAz~I#Phn{T(xRCgKQ5n0mCp zfUUA}G3kuv`6@x^7^@Dd^A>cC>21h0A(-N&`?E^J6SKFy+Rl5Wc_Y~fnV{-L_iedWMYW>?@xj$+#F*vA&_S7ZTWyh8o+SM`q}N&Z`rg>{O8i8>G=sO63@#C| z4k;qVl}1!TmF|t?G==T*e@-=m>xC-l3%!%!<{Wr?4Wgnf53haK=I6K2f>r5@(K2I% zSb()RrV?GdYhAe*!&Kam+~_UoGuafgz*6%ydi0tc1)}cua78zry=c#we4ydHu6-*~ zlJFWcM%JtC=6J9yK8l-*Q zfu895MBb~9(UPlsA;Itek1*Eux(xd|Edke1yfh~yPhgG*96`AqNp8qV5%k^(b-|OSW(KFlM z&1KV43JQeb+I{V2*Tdlm?*??r;wmlCfDi^=UrlV=&X-1inVOv@inbu8eR=wwoPkrT z6BT>iCPW$1yNitJG3sEZY%ID@+LXqTApSj%YNf6E@``FGn<}m+kS2PAKW2l@%0Aw?BN06xs=a=ve(f|Tif7{bo;WDYh6l^Ivh;PAl~taUuR?|CgPO`Z7w-m(4$I*59Iyfc`yT)z zy--goh}|Ty(Z6=%jJp%M?q4MlsV`-Ts)SE?`TjGtjKj+?{7@e+cNZO@_z9tK-TbW! z-CUP|*9u?WqPZ)@!odz{NR!$-(-Ej9T!rCQcm7?ppcqk;a2Y|Gjv(H(I#b7)zb381 zbgkQ0CD$6E0+`jer!h>C25oo~f;eUfOONw>Ot5n+-_Ppo=cSWq=4BdN&z~SO1xCDx z0EKw27eX;9)>DdJ&0{8g7ubpTZZ6V7HYYrw>YZ3*JWIRE(BdZ=U!^Fl5=3%|vK6Tv zP&{b8?EL$|8)wKm(RPYJGoWUd7%8$g=GNx|Xu`RsO*s*q;a+XFt>KYirtsoa_>qQ% zTNLn%QekZrIFJO9AdODPg%Sf@)4Sl;4c$XlsIkJ^ExHpC1_L5Ay0nWY7;8?(8EQStn>1Mc}~j4Hwm&i56j9bJa4(^MV>cyn}?=FPN<#H>4>y(T@g zcQHK%L=PNlP`ieY8^pG1+k#wfrjTkVbG}e|x;MaczE}72n^ps+RUqH=+syG+y3I-RW?_Hal03XV zi&pMB?R^{c8xGDU7FayMbeL}oF2{-s*5)}&ccO{)+OU$Osz(z`g}LG%vWo>wRgvpU zPLQAHZEc=^4M^O@I?@e{M2~7WLJl`7uSbiUWBOLn%6&OSbolNh4GUb&S@u#LKbAibM~LE)iZ%Sx)lJ5{<4@ zBH2hk|C1DcrK5#I&3m-if5ohok?K~oksgrJKEISp(@3sq$@%L*ff+rr*&jaXe!F8v>yY4S7?*{IsVbUTDo2T#3b}*lrYCF%oXq-xf zuPaTSwjS1l>Bf$+z9hjHIq)hm5=epA=`%+cpCu4<{44j6=sBWzMp_JcV2v!mZMdY zFp9zVa4XNEb&~;YASfd=Ft4;FglrxrydXVCVSH}yvhl^ineSEGwJ4Ee76O+%QlxQx zvr01jtbIBHzX8*Api^yKcyZXd1=P~Afp=Tk)}-K^a`3MunN(8#!ERPhW1SjRBvmTb zE(QFZmyD9y8#i|pA3-}S6}`I{enBXgE{d^(n;9Q*5fPTbvwN0rn5;}6OofD`&GmPq z7JMxk*QE?;NXAtVW3%cf;9(Qe>5L{3Og8pj*19^z(oX1f({|=|(x9X(-8M8wwUw4>DUN`zl#xG#M#_97LCEb~BR4i|&67I>78u@0PLK zmIx`dGGi2N19F9?;YxXq%jGd&I7s{5zPl!8pp=wR$MVdV_Aw361CW)#@q5E>F7~%@ zKi;Urekx2Rx4Qr9DtRwqQjz36U^T()t*RJVnTNa0A4}vpZ-=@0cB0429Q8T0ZGveCp5}=#7GJGSzLCCeiW1POepVNUncp|CV=&PsN_ z-1(u=nWWN=HDdaC=CMR1R%%^R>S)tpAVRRGc`r|u)yfd>lD%H&IM{Y4Bk%!<#aO$C zW+C-rq)Pjjxp?z%;Qj-oC~UVjAR}Ji>YCKhc@aomMD60WwUS0dm9D+MVMAJ6n3$d* zE!I8Mh4i2~DH6WDzVCH5>^+x4%JzzzUuE(XXS=&2izR~qAVe0HP0gllo*tdDUi53GE(?Giy zb{-P~aesQd$Ovw084N@bd~|$00f9Yjf6!sNp3loo$UE+{EuP7G zo12UUalz&;o%GEreC?$L0p0=PACGdrG)BVNY zgz(lg&8rz*93fj>tGFrC876ngQVJ%9160qqWpuAMIQM71{SxZ27R$e^gYNS4kj2p- zI|)kJA6y;xeg`AY7lP)@M$au=ELj<;hJx>r#TRT)^3UI7-Tpo}siS~<_a!Ny^hOKa ze(ARjingMTF9J=TY`icI5hAPOHFZ*LHGBsv9)kfPo${qwh@6Ds3gfi6;9|u>q7f->>rFAH8hB?K@YT=`vbp>hT3OWl6t$-+x#;g*~Pslko3| zrLqJJN%<##+PWnx&Za-9Yj{*jLFWH-F@<8}NZ@s5JKQ9(%OPskg>=-_r&Kgo35QJK zJ7-rn5p(T!BicYx#n=vXKfcJ_Hu~1McHrw+&9;roQrKLyat|44psBCrY6|v*6l(>a z|9O8ya9ROgmRLb05PYnN%#2%%_oX>W7-!|WW9?3sdXbZNB1h*iHZRM`vThT6&0RLI zShchD?^0u^cL3x~?}ksJ(hiqXqFe5}!u>Dv~Ul0(dO zW$WEc`_a57U$1JeDHi^LzPN(g65sIXwH7RyaKFu)e9~wtZp7XE{`xpH4*d+y^UMc2 zf6nr_r2(H_$oM?zcH2C(TNuYu0E@1^Y~Z^(=cLua(WkopgDu9ZVR^!|V6mr#Z*I8B6L_|1Cua zhns2qUcrvqfKc$GT98_uO4udZUWoH(sl)^7o^?=m>bnOa3ho|(wM14x0V^*1GDCP} z40bZA)PSOfM)GBE=n6zirTlJ~5^QL@$^a%FAF?gKV%T>DKGozk&bNeWF&1xy2tHf`Y}5#?JeP8Gfa<@uBiaX+XS5KpwwoC`_(+mg{Eh?!A-uZGg(g}qG zK%7Y?csODiTa7ZgU_1WoxZg(#geJ)6sfSQGEdUbIS5R=TaUaO4Zb}=Mwa!a-C~%1jp0tNvg<=B(wb=jyYz|PrsmnLRPW%@nU@*sUwKi7;W4v~jPJPV+VUYy{*vk-T-FQ1ho zaJdXZ|4^1Ulo>1dC-xntZ$vh_quQGQAe-J%WVdmlh3#-ZhRhKXX%m7^zyF|Wm~hed zAdz929Ht^_;7UfP|CYTkyXM`*b)BtjR~`3wk`#Z31RqrGoa`!D1pOY?mSt<7b{po_ zr9}C4#{Lj9JMgqU(?#u+w1>a z{&f!elQ(^uEAJoz9Ft1wl!Ui;KaJ#t$ZdLXoc;DQPOs4{Uw@Qd9~%&0 zuh03Z2z>izTsN)6(SkLXr# z-?nSFlxmBl8tqgOB>Ai%@P1(bG9cSaMaEN|?m)$C;RDPgP!;G8k zpl$H$IxzDNgT`%!XIYzn_Ot|a-9kbn9F$X=BNmP%F~uRVh~<#;@W{LLVw96U2%2De zAe203%u^fv$b@Xvmqpb@v_tn&@A~I8E8Z@V$iEIr)236u4e!fx{1(Fc2>e@^taEYUi<|d$72Gv_A8wlLa=d1ABMt6KWCYC@_%FksNBhTaCn^5H|? z7Fe$=2>YsV85Vr@?PD#9UMtM@ZKqeA&*S^8t+`@GgQ6sBQq8DKhHfQZq`#QznE?xF zUY0tiq12}viB$6=WiANHRwwbLMRTe8(*3jZ*+HSOm+mmEb%%d5+2|kEe=q+7#KXG8 zV|ooPC9j9HZp1JwC~(wcsqlRRY98f<80QevhI|8DaK@ca;0O?@PT=5N_#@7oM}ooe z`%jZ4enetu?PhDs^+$#JMY}U6^S8=f$|+}q1fyyKLtlTcn)6UUO+9y{<~Jk?won25 zo1~}<24mh%Gwb#vX*?w-`#8dK_9}-3XNc9Ly!8i3k*h(E4_rGYGDWc$pFQ|~7fYFnWwwWCi}Bqz%hW9ce|m%j4=1Sp}NAC%+TSOocc{f+LqY7AuIqBL%0i9gG{=0752IJW6S!$CV|TJ+yqz z>DTn~L7pihHw6r#J5M|m)JL|rOwr0L>2VXKDaNM#9u9curypFVOm+!{{^>jWqenkv zPCDtiTiiGM2W`I)TCq0Q<4S+P7?rmzsbvItH5E;_U=TW6MO|#sBFTOF^L^5BPH3Gw z9gz>1%K_>vOYaQfd0Sx$4-MDUbxAQZ@(ps9<7E_NRV!dYTFx(e)0Lyk&?!MVN?nej zw}-({@+_0oMeI+dKd$?2 zuIWTWUmy1(bl`S*k`LWaeI@;u%rQ^aA)ZIm2qjoF)=)oOgd7{%W!Kf_byysei7QE# zbE;cSI(2zE~h0~-s6x!P<{nyOUq^d_Pb zj`FP_ER6CcefAnClRS0N^V95@TZS(`>VE+HKm@-;M3~)Ah+h?NRQ;F78kN*+=$W_D zJP?kg2a(BpUk7OtZ`%H3jsR@0oEBwqzw4#{0D^t~(pIW%TgN}M%=?lk{JV>P8EH|; zBJLXyY5o+vk~Db|DT=h94Wyuv$C{Pyf8d?}0JLY48Fc>u+3!^OP?_z#SK|vvn4c~z zDVM>bSkZ{ykIaEW{2Qt^55BH{t6i48od{ z4@9}0IdGW@Ydr<76y z5Hh^^wKwy%+w05gfJqN`Hl=$uI0_k_-qZn(cJRzg62Rq~>vkI zJ2AdUV`VY4r4jAof@tL}IyjV=gZVKVsb3-`$kO!9&$qbmJ$jx;~P!-8Xe^ z$4_D6{bN|y^!+!+UlD#P=pGQ3&TBine*#$eOIwy(xutn78^rPJeg*NDh%WR~3gMf> zHt_2fso<+Dok;dZM8JXpGyJ;atxV4h^*ud0>!!2AImDG}Ht&?$$?5@(hpHG+0XE{X) zsq#>Qbz{ij>Cj`A=9p8wbrx?+ktA=H#Qe*I+nM*Hc+Mhl^~N%)LIzgzO|Ms zYiMBn(fz9b0N|W{7WlWQYJNHR65bW~FY(7(A@#opLb2%o00X`_-4&W&v)S2ABk2DC z3_N3Zf2TEJYQ{>aT0@t3X+uW<7V}<(Oaw2OW$X7v`GA8 zh)n9Y4i#eY#&V z+$N*s-B{{N9m2paqSW5tNfDArH34OL3^uxY=Y~92;BOo2zYhF$;GJv3zYr|vz0-By z3u{&~TI-hcwYy;x>{R9@|;Ezt`bfaQ(EmL(^j|hH+!X}mG5s;j@P^)zE3L7{WUp0SGT<| zTf+M=#jl0)KD69DFB+!{NWjy&m`D z55o_&0wcP;8gIl;4I`=~*Io+ojoddX8p=So2TIfo)|!(*mR9UZ{fV%%z8Iq=n#RzDQ{8xwhU(dhpG9DWtF&@QK_wTMrX_HN3IX{w{c9PVmC&)4V<#_@m(MKx+R03w&`TTubH7>m2?N*3ncw)|0Cn zDHTgebE9~E-ZYZ;;_V85AN)7*MTd<(9P83(o-5KOd365(5NKCY=(@Bj?Xuzvn<<{_ zOun_egtfKplSpkZp)YNBX*31klk~&kH|>Y;%i_hg=YYOB*m!f{SB*8H9hR>8#+vs( z1b!j1>^8^5S~T|efAE28LSHmPty;+shl|fG)&1p~N2fz! zOJ}-GujTvNN6@@&4kb~JF-C=FqMUgm+@;HBX)Tj_b4kmk-p9_GgXpl!<=jVetv8qE z#|TL@_<($EcD#oXO$Y^kWJ$M{0y4yAxE~W}x<0WKacfc7{{Uu2;^Hk5-aDw`n&L2a z$vxZ>{{U#;x&rKwLnXbda>}emYwX{NpR%Wjd=qRnZ-aBgtLTy`x<3cJXLl6ZJHv7f z&ArdVpC3(mBv4!5MLNr2X?t-do{cx1d#Jm8f-3nAS>V(!ZZvI59cx4JWtxxeAA;T| zw6XBEux=y?J*Cx$jwaJ!kHoO7doQi5FJRK{@9koWJtZ#WmMiD_JexOp+>~fkh8~=3 zs#2bklTTE+wUyqAG3eHsYx3F7RYxJ0@9EUURFl0bwE3Jq&nt3|yB?a!>8jCK;RU^i zm9k$BXy^j$20L_2M!Q0;S~*LwzyY$vu`Rkr0(OQwJp?Du;k`EjM5eR`b=3N+yaq?MePE&6WKv%S`f^JwsCRjFC3lWC-vBwJ3} zMI@8-)$1)aUFw@{1zR!b8c@kN-Dpl190uU@JdL0ez|R?3mOVJ~x(<$~s=C=mu0HSt zks9RnIXNWbBhn;WX%`V{hdE%Q$@0l9xC{rHE;2B3FahL(GB~||P`uNpRD)G;k`%(` z7=b^<%E>wCenwIcVwuM7YSok?uG8OVo1nc&4&WRRbMlz?9uLzv&Ibd= ztC_|!x4hN$PFAwfXtn9Ct=q^YLT=JhX<0oNOW9jq*694+_Vt;rAu4w|vtXS3%yZu$ zs3(9Eb)b7IE2qCp zTTM05{FV39<>(S$KsfT;fIuag^S7xz2*)^3Kx~ZX9M*H{5DcFvoN=AR;9%`1?vw|B zNh3JHIpFfId#QnvB0ON^#s*0^EE#!bB-#m#PCA& z1SSd2ID2Z-q+kpw04TuR6lWk6BN<%qTZ58%jIBr~`$R>VKp}|3FhEHp;AaeXbJHA= z&Ur1)TW;0?hXewd$8ose_s%+cX1;z{nvL%D-&Xpjv`foN_R#NAR#v{Y+f8h~PraX2 zu8kM$ZyI!EAvcVb3{C+YD;4zzDlj@8y-CKswv`>59Bw2wFh^EU0RWN5-XXJ*?VDm$ zwU8)W=L~U@2>=3k+(#HB_aGJ-UUry6aT4SyEH<1mWX3_{fJg-AXd@%|M?hPtDaOrR zr1f^z_P+b;eZN*zB&}YBffAlJN5%)j@_^i z4S}5G>>!cY5P3ZHt?QjVV*!J4)D9j(ZYDG1P<4 z-FDH_9OImf5(pyxuS+~J1hlORAwtIdqMJn3^s01<@1ay zZt54VDlRVEv68b%t6e)QyZOC#UF~K|lwO>!_tokAsjY9Ox<1$LRRrUp;0{6W%X5s7 zNgcZN#yVI7pTj+|?~&Ujv5|~%$mvza3FACtp#&Bf@53DD*QZgC2(SlCo^V0Q_Vpa# zanuZwxaPe6d3$vB_n@|SdL_2o``agLX!^s|zsB}^+tT;xZ8z+C=fiX(z#cN>1Lt0x z0C?M{yI{7`4tlDb45{I_V!nN|8=!<9n3Mo>kM+_V4!uV`x^vW;`a|LDNS>cY|>@gdSfrSN{~Twk+qJ}K5w%bw}}4$*HNCJlOu704{yEGzf+3#G3~rP7jLoF z-_1(zRid`G>vE#i*G+Zxcizu^ZTR}i2OMV{5J@|T$3xB!T<00&}QZi~5YNQRo6n8)CM%{p8P2MW&ZC396_xs)KmZveM#?ngjXXI5U<=SKn za1VZiCAVPo`4&Q?TR5giQvWn$!rn0 zslZ^WN#}!(Fxjj%`95KfnDRg^oaJzHyBzK4Ksh0^kyD6n2}Px4tFlS`ovo|y*7~l5 z(v+;Pz53eAZLigA(p%}LR0FF33CCOxpqDx0Cj&UoKso77`=IfisyY51gn&*l!5vTW z0uFZI1L!@+3I=x(&!$P>wgBz`0+(>e?bjG29Pyly(>#C(;1&Q72(K;8-u7)Jdwtf@ z-*;!TwT*6?zTNh}O*KugSMuw5S3X|Qq1%u)mJgCiUNq9W&nC3`|OZjmk2m zijCdF00s*<00W$E#?hQrIG5+Z#~=&=!6zfJ?#Bmc01Ok6fNfik-zXW_KnuU-Qdetj zR@`|c7RETO2D80EBLEa1IGP7797(fB+!sIA16teQ71|2rlp(<+HUf>n^duaN z0&qtkJyDX{@PDbpWlEj05bQo&01p@)N`amZa-<5_2^SkdQ-BA_fKFR(dyMTokiR!Z zCjd;oW&i{LTjm`Ps({!n^5B9%><1uMN}Km&f4Dg^fQ;eW}j^%EA4Bo zUeEBqO;OHCrp~}S6$CB@N-jtXu$5n#30&?y7?4Q-8q7o&JL5YJ$lcC))ka#N;khgm$s?db-mKk>G^gZ@ms3=u|zNi zL5MHRqmBUF!>%$iPH-{-1Wu|O2^b_XAgd}aMh@Y(33Ac7O$|!*v`?Ep184yGj)!7*zq~$N?i8P>+yhOEAHC3aRC-6+t;G zD5kFaU8Sapzdo03d7ix}TKl-Pz11IT_2qh}dq0=rnT-YHNhQ9L&}mke zV^o&zVf;M=gDJ)Q>$!5oyv@={nK}q32 z$t#=Si~CQD_dtV zq&`ij%Z^#qk}c9m@+58|`oBz$Uxgk8*7VyQ9$iNA_6Y4SxA>Pz(=G2B@vV*j0NO1E zn)mvRh19WaT^ic)r!g#7d59!_SAm{qb@5S!3_Rf(H_14=sYx{y{pi$-gVjAbu9dB0 z=(uwvqe68txTwjhQH@G%CCM6&)?BiT)qN9b-VQR7vXI}2UlZ>KZ-X zp#{FBB=X!orm>w){^DUGskCYBVoB_c%CT8p?MFvj442gXCyQrba)KgB3Q)#rFszT3Qbb7w`;pU5=cyet|SJz#&Um>0tW4K7kc{aQ; ztYu`8#DZO}szbV@(jT*sh$!T}Y=GKbt*3(_3uD^BPEk|901LX~j zZ|r$|F*xKL4gmxV8iA8>;YKh)EsjPy0lPe8oL~;bo-qR46O8UWbF>qXGtgtNJu(0p z$>TLT%ahXww*#h086z3se50=&KZdmSiYuyCYRjeEe*4?}*5{cv+?BO@``X=J%Ufj$!YrZ`^JoR z1B{WlgPfm#OyqloCmfYhxBz`XC)20|jB=-fa53yUIG%XuexM&tr$5LHPzN8Er#$56 zryP3YgWEVs+3&iyroMW9UcH99H`A}0zu>1^z*&HApq=ij<_8GJKA>*awaY2R!w`9P$+L zjDwF%VDL({1>bk~vN8`sMsh|t zILPPS60hCaE+$~^{n%8b;Y1K*rufPMOMKV0N;PXq&Qdx4LyJ$n)} zkC=?(9>+L8ulR52_4yZmzlEPhy!N~6sSmC(lk_}il1ESo!N4ayk5C35Q`8bVah#kU zoE`@5xd4JHTyP2JK83px>4V=L4?%&NYw$SZIrQfRuzvUT^}*^u8oMp}FYEeCrH%B_ zFD}k?JNcwiz_e*|k=ABV?|Ll`O;Wm6^0$)Hbhfp+CB3dwXk#ER3J4=;ESLn4GB6Zy zcK`yZQaL2#Q)^ph=@hS=pb3dtiRiq(7d(Fuz&!yQYh6SUjnc^o3b`Zg5P`IusQ_eT z91s|ipyit%H8u4uCLxJsvt9spk&J`@TPI+XbKqluyz&&BX0O@9`O`|zR9?cRXzjcBe>Of>vC{tl64fp!UFHU5pXjz?(EXOEitP=g&y3(8dWTI|I9LSStwJh8*LZc2mMi zc1||B)i-|4Ei`Ykv)0yRx`|(1wn;RX!@PIwuA5!f=bgpjy?;<3-_Ee1z}O{Zz&(CQ zQ1TQJ_qPs&Zpl3+pWxjN(`!!{o=^dAIZUw@#w7G>!tPVF8oJp1OEV`?`I?BDYqMjI9!d#<|H@DG5`SNfmxIIn^~9yg%wnS zyV+D620tmHWpULEJ?==b*$-@Y*ey5fkF8LJC-{@13QQ~Ey)T3<&cxNICp+5 zxNNPcDx?ss@O}ZoEFq>*@gkwW!ebiXaRQ-lYpS99D)=TIp^**?JnFEhCeyM zI4U=*6W4LdmIQDCVSu~^I5oyx-`(A?Y36x4kh`2<5}<%GK;b~k4uEy&VgwA48Ey_+ zvvtoTbAU#9;0@Rf$oafhXIe^Jk$Z10XDfMGuAQ{kU0K&ogd*(qZ(SPlzQ2Bo?XK2F zjn1`ua99uBF5Cr;jCcXKB*(DuaxiiUAm_VfvP&V{#F9>TG0Di|l30NKS(O}%&4*Vk)4 zWoutcefQ~6N$9QG&E4zwdaZZq)yFvN>CZrOoQ?;lQ-Tj9jg>7Q~q>7Gt$an$+@^O2tX@ComppkOHKE0S@PwdQv1we*U=e>?8`A*gn1 zb-znm*Zgm7ep|HkA6y=I9C5f2k%QQeT=H{9GBMX9j(`mH0~zBTf!lyU&u0#E$jSEv z4D|Vc2aIs1J%<^=GmZu`f%L~fefkW6$tR4O#x!T6z4hJM>!$wlT@{n-ve!n|+FPx( z?6p>USwFv3uIw4zk%7S;2{mjO?7{QLP=Xirpxr*_p|Q) zLTA1JB=sbE4tX6&IOuRaGHLla`u_mC&s=vW-<)xhI*?j2TOgCq7$jqijsWM={7yhs zQgMI@IOCJ+)02U~Bn)JLbHS^lf~$#=jX26yvUXRycGAlI_tExS8O_^GzFKtK$yq9YW3S>(e1x=rCY{~M$;rPO2nW9kY$`X zAS{oNZ~<1qU{zZiT=6c2q6Tel;z@1+P&DM0Ij?1HgJ}B?m=+C+TL$f+gC}B=_*VTR z0m4~kPYBnn>C|zwpFEO;ZOdyxzFqFqS9ey{?DKxVUcC8KTvhb4)unE>=Fsmil^%Yq=*;R&g;>Pa$Tu^lz^RJbyq4M$8^0A?CYI!^ zi4LcBFEzQ*i20$?phmoi$k`0@{goqRTuB%bhw=Su;>Njht!tz-UKp|@Vm&oY#uSF?YMXl;2%S{PQHU0)^P21;k~+ z0A%G$bmDmb04mC$=wYZrtw=?vxTP2=B^15RS0}BMl>L)w-tVtOaC55prtKEfcURii zw#nUf_m%Fq)%vEf@nZFr?EEikH27HL-rPq6-!a;X7+`&x-3OQVm`=>+%-*sAURixT z&E3(v)h=!|E2&Nlvs}E&00)Pe%#uFb0I0iEDcr17R00*0lQEH5Lm!x#2>_MO;@dU@ zj*7Sg9PP_b7$^vj5)2i?;0*3#@`4JUazOP52M0Czj(NnHj&&yM*OI2);YtgV5RKKZ zO)F_-t8MwaT=Zz+VNI@8%9?52UhCcJozmO2_4E)NjFXOfXJ}Q)`=ETI894xBhRMmM z5ywsd4f6mA$UI{sj1jcwfsT5UC#T&wAPf>uQ@|vWF^m$}&jb_38STN(Q-VftqoK&? z0l{DZ^fmKP#8jZ#_@ehuTWr5AtlQU3wC|?rjoRTt5+5()BgOW(}!5o~PoOC(P26_zPNyn)@0o#lblgPE9Upy>XsCq@30@aS)UE7tY)1uBp8jPnDg}rj(n}eDC<|{#q`cVS$hd$9!}-U%rp=eRv`MtuP%gN$_P&me<=Nz{z=$-yLb!5HKacq5zEc2N|IIlTUB>Z(r+PgI#>y-5u=qewXrh-rBBDt}&huCp`P$=jbu)Pa*5U&NJ>f z`mgc`2R-wVoCB4?z&vrl<0HOLPFznTrg+YMvNQ7MzftTu;}sdnJ@cNp`HAo7IrklU zcBgmA1Exvo!8s!t$GPZE0s2Kgx~`o+;D1(q^&h4Bbla}~0FfXg7#%{7ybl>X5PgBc z2OtyB0xD%-F_VmL?|^vs^xfM7l34M@Ai(f)aeCs)c^>gXVE?B;E`@l??1e~0Yn1P;0ToZ$h#;e6T9i)w<1wSx3BmzzgV4MNL z7|M~H_p)S@s*phh6P#d-9_KkcZ~?#`gbLPBjh^4-r~Dr`y|+d-`|atboqrp3YWv)S z$uW*I&d>k@0N@S?Je(iLmgB8dpP#x9AQ6BECmodaE1VqlCvGqWUYcg%PXmBS$6^5o zk^p0qjB+^S)b_9}zcY=X=dTBX#~D2HjB)~u=OB`6l2}zIy_(ZTo3^@Hw`+8LK0~wF zb+=XhF1~u(*DYpN+q@k5bsL9%m_Fwqa(T$+K(@`#BW`hkNe!N$Zd`R3IqWh4(}0D=xPkO!tQl21H_oi;K-QU*Z&ECHNt#!gj=f)4G=f(acfx}IL0tgoWA z_UUEaw|#vqC-T0E{{S`Vqub|pXGd=}(BN@^GC|;}&I6NygN@%V-1j-=L#NLeCur-@ zisyC?;=t`2PVA1LbR9_>v0IyNgbW;o4ji1El2j5(u^@t@ob=}cQ@TKV=aLHT>4!T& zV&D)9amE18P%Eir@r+gUf7O@W{#_V;4_>--?4G;zv+i;dTam^GBLIK8agct5w;9g^ z7{CsO7AJ)#9WX`#Jpjvro(2Ya+7Eoz&D_~RE5`(Ipd$gajFYeupdLxv$;*7C9P2=`sldTF z+w(Xbfn0EyJb{DAz`+?Jw9;7@0|*E?alpvNSq3)n4nQE}a8Bmpy?hP^5oygm8r|Es z=Jk7N^Ci2clWBKd9-8l>x02b8wSn#8+RVplgPq^JIVwQFCmG=V;l@G6b5|jjWc$I_ zc3UlipfZkRda&dTY%V)aQhn!c7=HM{w{q(?rFG)U7# zuZ77zWMPJI*bH}o$0`WI^T`}2YQs0zGB}8o1UAq~3PH$WhZ}h$k_aT=Z3J|#gZ>g^ z3*{7Ir8bf>$_8?HR%FHqW0Q>JfN*OPSAthEFYfm#!YLys?vfCKH((Mip49D$O0MkjSSkg;45^56mhKQ=<* zFc^>&l0gKHFGx!+XtkwE1&%VmJ@%g#%r6VhzLO}Ffcih zOA(#Sx!S)gF&H@nlY^0*tD7w5Wo2S_aUSi(4n{~DK;(b`bz$N@JV=tGt%s%J4T0 z!zxELsCaxLwE8onp$rNcKhh2l%n-=@s8hI~lrpFTETpxQ6jw}Me~^FyB*?A682O3H zt_D?z$ieJIBi!EZFjzYxsmd00Rs~T;<#JR+LV!USH~^El=De&!_Sfc0?WG%CO4eH6 zrTXpO`(H@OU2fCUqr1}0ruES~U0(LGdmPj@Zg$8B!V!?=c9J@=UCbFs+`TtvJHZ52 z#l525Fh?;ITr&j?8x#zi&Q~Efeqab3X1p-Zm5oWkI|D|f5D!G(mQXk61%0u_ zbT;;rSr0TAfaJFA+Zbf7N_^iw+yz2Ioa8Cz99VizGP_!Rt<};>(cfJyd#?R#TX6SQ zsVyGA6tufrExI<-X|1fzvq-nm?4o72w?va-vl(N-X57l5q?KN26nw>0%8JAin|AH4 zirCKEo;#tz!mI!`;-G~^c_J;H$CXkVOzkL%f;`UmSGl(;3=l(*3hh!^JAKvVL-v$p z5J4^XMPkc;aW+Z0o;D<45XvKM-df-uK-#ATL0l$6;0?b+OC1_fP>Q~)=`AjtZQDiV zWZ%fjP>igSmDl~ct!1s9_qO}Dvg*CeyT&m+z;|Nk!!RQJ%3EtH?b--kWsX!`W0xN-kD!OX=BJFL}P572DYK8TG4s7>trl3J{>|kwUZMZy`#g+gEZh zEWkU3L=4Aua5}GyZ?D5eZnDK5NCdlXD9VHPikQlchiWLoG0qBwLxCl(r6P$Zl(@km zB#=vjnNhhEs-Z3NfE1$SbIUbSRGLOqiZ=vpYqsruyEXn&$kRFV2_%3@=U`HW+^`Bp z4g)d3UBr@Hk&-oZ%|lUne5lLia8B$;m2yby<*J;O1+WPu{OITBhTBfLlQF5|JBolL z8%_@_tUxLXvkqBKO8`xF+AfaTf6l>O&eMivW&n&S+C~+_i~`4yL1IC!%&!4Xbz><~ zmaE^Ba_qV_YhPV|;FCJ|n8|+jYejUD+eGiJ-(8oTwkYZPezmDhAKIdlIF-itmM@S5 zRV4vCT0^s+yMeTwrAE`+FNXZJj|I24-rcY-&Q~WZxPVT0Sco6OSO98hrIoPphCmeK zabj5R1%i>lkLDn3C_<7lRB^9wEaga%gW$RS&|;-nhFvg&YMYxg%>?Cf52zcGK5R z+o8gxH*RaauWM<3Ub?%z8@J4i+bHCKJ$~@cP8a|;WDF7x0U#WXn70k2L+=J00uM!O z@r-A01a%}FWbPOutJ>e&UKSCwZs6cy$t%b&LEs|xHb&CLkWOC}*QM;K{gGQ~46A|+QH|~Qt2;Bli z`<6mR2~x-k^YYhbqNnY!wW-RQn@Vw#Yns-)bZgI7qFdifozH_W zyi08z_POBi4{M$|k5{!iZKRs2of|`v(@eSZ9bmlHS*`Bl({Cn{rdqUx|ie|>AEn55IC zlSbn5xYBO|7+)Nbw+&4NB>xx@`U~w$ybCO-sZQ>C(e-c(CfWmdON{^4e-v z>@IB{Yk?EId!<J|-UF)J~+wXzY5-1>7NMv zCuQN;;?eEytb8}|Is6x`o6AOzQSi@=G_MpLJ5;vuKlWA9TRonw@eftiEl@!6UuiSi z#@n?p0`;8mMUJmgTP}()UrKOFeA1M4<_)}}})5Lxh3*ik)!@}M) z(DfOt^nVxXHx~NFi>_&qTAfH(#iwiUbq1Rn>sm&qr5#$ytgh}R)Gh7e)E`a0g5R9B zX0x}pw|!3f;!9W|jtiTq%9KYZF?d zl{$4jrz3Jtowz&S+RvHUZmneRZ5lD+ZxNO*gz$7Qk%d`PVXfn7ZaMAf~z1wRNcN|Ru=F`Df z4SnEkW5ga7kjWIq{5#@3XGU{z0dAUut@CR{t`YdB;I8*bp=yads>)r5`=tu3%1uGik%i9D!{*cQr#Y>ok8w3S?r z3~nQb@rp^(gz7Zo??UM}Wc9OJ-=+7vUAl1fb1XcgIM+~=Y~wX0De23+o!*bCX=$de z%k3YBU$$4oJp*6A)V?6Lqwyz5ys^@>`=1f$y6%PGkBeGpF**E|2jWNnZiYYh!ga#J7?7 zhU?F}vDCC^&y_s)9vTH2Hj#S~Xxn^!a2T{5ex+!&KM^5bAZQNpt$W1J&6 z1UDg=Hzo_D)9#3SiRO)Aj4nj!Cze!z2t^Gnh!IR?Hgy3=S!8tuN99@1hZ!DkURauP zmKn-W=Tv!Y;};u6MW@Nj)0M_u&(ZQf5qOI#qNpmAu~d_ikGEEu=XR8pNVKM|(`u@y zp10i}UU=hO@HMrTm*JQAwcxKCe`o4fji>xV_;ummh&ptivxKs1O?MxJG>QB{9*L~{ zYWOv&Jb(A`Pi+m69SHoIvx8jcoO?wubqupCuz}nA+Zgj&x_Kux$(?FKL0_}=3 z4bGk6*!7#Z7WE*IB#qR*j`;b8C9` zuXSM?%cEK9mM{o(`7bXt^tsct+sU)YZass?xozpw&fd zb308&>M24Gl}DHK+v5f7U$wT6@a`Xpem%a_u09`lTUN60FU3C(X}%iq55x;SH&xU$ zd+j$y__nsz9vs*FL!)?oZLgb2xUj!_og4dGSJht2QPs6=R5!{Op8`K<-wM6fui+mK zr^cNRPqn&|FBSYPo^4xRw9?prrAy)u0X2oE#4irpF;6d5xAC8Wbjv%_16oNX#k>h5 zUov=K$6pY<5HsOV9(a#R)GZ~7CxvcWeI8h#BnTw1)Yjuqx$L2;jSdFDl*(l(8!e zaNDqkON)3epz`QsTv3yAe`ew%Qw)@3s7j=lyL-+mGH~~u_x6n@w1es1_@{-lr3IMb zD&XtMUR9~VNjWtX?IfzZUA}T{{RI%bFElK zp?HSNQt;J{^^U!wGsSmxqWFu$`u&H9v|V#ZH!(wX{hzJrE|5LLJ+>qBW`DdikN7Ni zkNim_@qW<1vmd}ujq%?#!)toq!y5}Pfqp2~Q(_G2^7vcBdiQ~@WBX(lnv`PW;oEsP z5X<&Yu+JsOm%!S7*j^O)kYdq(Ab3y0x07pDkXuP_@#^Bo$Nn9*duc7>3#WWh(kv}} zW1-4yB)dp&HEY`oRF(@nORLGPkz|XUzxZMM9Qeb>+Gl|Le{b<`_CWC`h;AprJsUiA`T5c6{in0$64{ulC^ z>k|~_>d>h-B^Yw4P0E|6QKX;PQ)^zDp3VW!2}Ux=GiqvzsTBxRjW(3(G}J9s)Tb9Y zJE+xE?(b!HWAsbm_xuzy{t2<-oBb|t72kf)-vsWg?{xikD_@BI4vXSh_C)=mCAaYQlks2nN%*Y{ zR+s6e>;C`>zBBlP_IUX9tH7cQoiYti!Jo8uhQ1j155-<0-S(xvyj>$oxW4;ZrQPlB zr46j(;9nMe8t{F?&!zkk{jvNL@lRB;ySCD0@L$BQhyFMCP2wAisr5IpF#q_yf4di&t68_D_R>D-4u~pSsJFdL7Td5^| zv{vlX*Uis(mp6FI3o^rDa|}H-%B2|5lv|fCGIc18Oh#wksi!DCZ&NDT=@5N8q2gK9q9w3hLW9Qjf zU3hHU!D}>dc#P>65j1mrv*ND<{@K0})HNu6D|p}b5%|X(8jQNV-KXtC`zOJ1;`@fy zqO-nzb@iLC*^5Z=#=8C^w7i6B8f1Pi@fGidOtMWU*e|>}cj65*@;l*o#(#}pv#zaq zH^IM*-?T^U?XNS5?rc6B{6+B>fiACHh}IOHhd*2I7l5Ob+O@Z+Q8jDtS+#2ywQCEF zJz}P)y?1N2wW?O_Er_k9#HdYBn?#A2-(PR71e*uS%Db)BU zJVf+>$l^RS7yN~qi%xi>p4d_V=z$8l@e|cZtoTof+Pm)!*|RlO{5~;XSF8g-QkOH9 z`-qoet>786lvC{}-+5gWC=#C--(T8HE7+m)Hl;B!Ewz{wzi&&L8%4q_rIof4 zJ`wjP_mtEyban>hUmxtje*mY`C>UG7D$!u?lU68U#IN<{k`KMCVPUud?AH5}r}IMH zRA1My^fPRPY_7(L<0o^+VGNZi=C%a}7Lo>!E!Hip{s5=zNpPH6V6#G2N)WQ`XcI*= z6d~A4V|xgEd{1Rl!89)Wj$c$`29Iwt65+g1vBXS9d>gw zMQ*#dlrn{B4mZR-VHyrbBGW5&KW*0pOH~rOCBkl^^7^0@_fKxMvDN4YHo||ES*$(m z9^aa5{9;f;)pZ1iZ?4nq=g(L8r_t^+u#2IA@#o~q@O!16+(Z4=XtUW9|2Lc+`>(}W z1qzBy%&9_rZD%C8jHDU;%15uPx@U~KKvL6-2?IMhRVG!j!^7e}6)U{@`B}!gpZtbJ zjJty~eGR5^7VAgW*&$wfSo<$v?Bxv$WMN~zlcTAJeoYvMF%E(=DNCU~gG)GUC3RivohG^E+bF`eTeHW&=xhxZqMtvYRl$(1^U-|WodnZ}Geq5c$ zJ?oq>4y?O)c~62yiR)m=x7di_b|@n#6LtcVd{-I(W7(6VkG#>*+v34t3}pk#JQnDc z@X_-yw8_XC!(14RJ+%H-sspi!hQ-x3gBjqxB50|+hp7qn(BMkaQ|ha{RG16pA6HBc zN+a@Hm2rI)Y-Xa&ksG0d43cE5yH5QFRExxkz%Wocg=70BNwRhP_~a*+BJLzUCOSr)hTA(no!c;Z zFDuQLAl3pVX8l@0J>rVF4r^;W31eTAXx}uUD-(ATV{?6@OxJ&=mC*hdP;lA<&5fII zc}y$1WKdDMztag5!JdSaj%!v#X-Go&X2bX4(Y*|20WaJ^5fJo zbplVna8*64@27 zMq4Eh?6j*iL+c?Wo4fI0c=ZREyo7HnLdPdxNmWP*<5cn0=XxF#S9th&0UbCuDfg3q%X$ zFUWF~@4J_!iN%x|Lp-uoI@BNys=vPA^-nxbd4gcK_KGRZxb{k!zVUKq$&SK;X1g91 z>B(bYteD=U`A+jr0QX$R-2he|6NQzp+m~j4f?`Nga7KG!s=L}}o5yoIC4n->sf_)X9o?9dJ1e$I~3Q-P@p67q)I zV~W&&MhR$Q$lnqq4kfRv*4~W}%$>w6v|)j``@`IIN)$}d z?R7GYltclW$y*D`RlluUMyxTL=Jl5(Dv77E$jiTJemSQgSq};7>l{g_DNq8o_4Hyt zdH5i~gltlm#xoKH*wc$guqT7wwr1s1FQ^OR1oLx3{A;pOmfefoR^@HR4gWTJRHrSg zrTF!#6Q7-p3rRDZ6m&IR(&WfXWHtKaJ=d+4zQeo4G0LOL?+2j-7X}muK-Mrl6cCe& zRj>7EYP@}Wm#JV{9j1kl(Cr{y`+$Yt$Y>%-VN5tY2zn#u3%W9{0)3JN{RRbn2Zd-< zzLUV2@OHT{WOsED3ilKL0od-Pa2~=RX-DG7{{YLO!!VlL0Nm%E9j$`B^n0jV36nbN zaMLv*Lg0X131tx7ychv=&yS1s|7DI$i#!gKtXs9k;((%Zu*7D6RPo1Lso#5-?3_*L zpo6sj60Gd=O<;5ji=Hbc?k+|Fe8UE5v&ov6zgLVHlZ)$LPgs)bat;T9p&rV~-Ar|R z5s#sCAWW>)qvLZ$tD#=0j)qJohF2*UTz;jgrT33?Z=50~))?+8p&L!tW+^u&x72qz zz4W)Q?!MnM-rC>c=;fR4hcMD+MVg^rdUR{gji$|tB?PKItKhe}D&<$X*O>=T5N^gL zzu5B6sNZ?75VqVFdfhPfJZBH$m?|FiF?p-pZdc}vl$wq&+{N`)+Eo%o%|TbUEpR+l^0vy@e>^Vx)1krMMjK}Ef7D< ztwq6+<|$t19)xid0r~I&Tv8y5QtNL$t74)DqEg&jag=s#KZz)$a$_$c?m|O$s8^@J z1F24-xZ?@5<0hswSR%2Q<*rxR2 z-^-`>>V^$*uBX^!OOwckhl(C%AsAYCurfjP}8*9gyW9x_}}5Nt^bvF~t6?cR5^f6-E& zJEuLOJ?u{9+wD1Hm~9ng9+Vak{))3)qSm&kU`Ao)+htNxkWV(}arw$@$YOyd15Ou$ zB0^rqwU8P_t)mR5{!|ZHE~c)n5f>W}crYNX7B80^)f=%>PeD0wY#- zW=Y|F^#k=~*2{SwyatT373l1l@0RzdcPnPD<O$`N8n$${?heK8WrbI1 zOVk+(wt+S_zY$wY=&~rZE>O65@!85G4ec;r-cpU+6Bi-FPkE0jzwG^eus~vFZZ7Zt&Xb~5O_wI@u5eu6*i2UIO z^cc9&C4#bqh~JY)-#kBDCq1c$bKPYwZ6Q5#Dj_$+YaFmMhc0#}JNhq_7=fgcrj$G? zwe!G|8zbEN^S`H52M3|E?umJCl<#MmUo4+=<2a0r5li=MDC(8vV{OYr4QwcSfCWYm zi5#yv$#=#YeGusiIv*PUPv|8_l6)*4Ek?BEZ_*YKRAN)9ciH32PJ6~WlBpE zUBicCY35%mnaxgwkX%WF-I99}oDqhg?=BrDXG&XQz^Gz%E3qR;;Ltk3{lY!ZLN7C< z2_ACa@fi|2@*m*Qpwbhp&lgMVjmE;Q{3e_7t9fXPkV3$>*1XMADy*WeyAoAbF1f2= zQ||S|tGj!2-Yo-SllSP7d@Ew%Kfn)MnIQ|K{bR<0qZ92qn6_BFJXk{U)py=|^vA6R z7P_@g@75+Y>RHPLakC*|J;whpETfZyvj1 ztnR+vvTgkbNRHsZwrtuZLP@&qDf{od%w`aFT`2OngfKiuA7Ef zy>}6)xknNGAAqnXVzihx@y#vXjdjFq@8ix^7d0Q=I3-rQ0p9n&h?X!Qb~4ntF&q*psq^z5i9?HdB^erjyTL#!OiRYDP_609$deJYpu;q{dw_zXit#I=z>x*yg_5VXvyO8ex^2FOkX$oc{V=_-n6u zprBZtANRPHpv7;7M?um>SvKA=neM`Ob^`|)E5~2 zRG~HhGS!RIIW_R%097-SP^nwFp!YPGfAH;t&%0L&xG+cTmR1|FypFO>qdW-Fg+$&e z-+27_6k=K5C0 zrTPa`3$_!+@0JdVn%$*5))E^LR(?wV0m5q!G0Jq%jV(J$%QbZ*j4fh-SJQsAVcfBrBEc2r z$2LeS@bbqekV2=a5-ti3%16qHhPNsR`*{B3iUM%OHx&}3*l2eSE==K!B9%$!dO@Z$ z_cXUg4M~QG33ql*tOaQElx1n`;kGf)O7XL4$#4Vpo@~B1^o-qfUteZ)ofca03<~4A z1lb`xF01F(-+xKEAk6d>SC=}PIgd{@_zl#ZJ?3_8&haM_q}+;NC+_TMA@~SW{WQF zm=vexjK_vD#0%osRnVAX@tN~eW*e*%7C3k<5i*4#uShDj1+fFsHY1pm7FUWNosvDx z3wh8lb|^LIT77P~>7V&6YuuLdQa%v-6nHG_ zg*Ms52?XMBOFDuRa*26`s*e-u7C=`UVN2`ukOq`trb&a>&3TsLQ+;VMm}|Y_a_|?o z#rCAZkUNBOTrK_D@~bG_JL_A)8J_7?(tgb;(35>ycAgF0UFylsZ9}M?ilZ%mK4#Hg5bZ+> zNy1&3@IAj$h{3rSnG|vf4A&X_%ei&SAsNB_%8OAdO14&)(lp-RwOtH9Z=_VlC@UL) zICKBiRdD?s1JMZliymDqbd`M=m6iEuWFn8F;nnFZ!8?ja((h`@DZNww82aQaCcl^A z^|^N$+{KPoLZeRY7QFz__Hnkx{gI`Ak_p zyz`gXIx2JEz0+p#Y>cwhqaed^U)k|p#h^^RmrE(dV!eEAuNk?knnq=w#EIlEDxd#8 z;T0_91~OZ#r+B@29a6m{=YQH;uijF-9iSO2Vrhv(1Qyrf&ga#(?feaY93ch4la?7;K}em}ahpRb+lUk353J$Uin zD0U_0ttzMaV`QhvcT8Is+ugdNO=rmEoMsFv(?@Rz?4ez4m$9r4X0Nq#>V@J+^8>e7 z|Hxu521^b@#;c{kAMM7JGWTO?9A^gBWWLf-=J(7jn_{uSVIHO5tWQ=wYH|Ud9EJP4 znN-=D4WG_PJXdIMixf|OjQ2wuiJjj)s^@+evr9$|=+bf(Xu;zRT;RQ|Bt(LJ78CBL zWXBfSc8=DcEzd{?Xf1jJ9!MIh@|QAx4^vOvxu-L4Tg)^IE4s1p*gl`xRTn1dn+M5_ z^DT{wmv`=THkCicoc8Yixdb)`4csu*=^o}sR9Ej;^&%(qsWra^`@PKU%WZ9=HzNf-KY7z84Rvbq6_7C z=BqYuMkNoE_-?g&+1uJ?>$>IdO4xhqQv?Qm_9K9eGkNB-l6ss^O=rX727N*K5ph+v z9_y50vd}Le!!?74MPG3Nc-7`(#-iaj>wSy| z9kZY>F`pY2@|Tfm$I3Ux?)QwpC0Vp2Ph+8v6qry%Du@dy`};^7^&{3SSiVvy!Sg8&g*+viWzTRf&4O z)1~WDDak;;98MWTG_c4^X7;7Pv{ddSdy~7A*);sbZA?e^lkYR-VEtrAQyBp}lXFYu zBp|^yYBHq~OYa2;Q^$fg6rm>Qzy{RB#_7N*HMYXwA!)+y?5!@ct4B?LLE<>T7D zpnMFZvN@0|U2^Mmsdg=2QH-~Go}vT{Gej?>MG)UIW4TZ_xP;%#*(zR^SXY(CNB%bELFxj4`C7Lg{`~+13XA6CKPwrcca3V3)L2L zPlKh=LA7R~*X#^vmDy5|{ttArVW`H=Z}slVlKBv^w2E zGLV~0lv`F1Do)T2}0tA&4%j-B1iB`@m*|nxLd>2W`jFB|EvNCS>!r&FCB+mPrB7amUY2! zNMlKI6I1llmYSa*iY)IB4MCCuJ$7%JAV2@vjRb@~uwZo5e$4H+)|0+i*1)Fo*CWGE zg#K{nIF`dDZnU$o#-~g0$2iI}(O2j*=Nn^(iuD_Dj{dhkS7D~sQgr;;TqNnQzXb8U z;A?N)-U|BVR%IhJw+0&wUh_%FmFnI%9ehzJF#ZOjS!scliqW8=a zSXqqAN23OBeb906JFm?g+;hjw-;*sg6L$;MK{WMB2B-HfmDp#q#uvJkgUf4je;iy( z!kf4;d7?Pq=XCdMPjWxUnKC!jjSbq*F4Bzkkd9Ph#2K2Owp18w6@=SP3^3U8+z-wA zk1-5Xs*^h-$$c?!gPsJgdFLKE_JT_7Z`$9Q4k^RA>8VvFdS0wg3MxcOWDXa*rMk_^ zON~(>-GqgSUum+N#^v@4Thlrh-JXv4TDk`Y5{)Hlv~`wTws~&H*9)#_vjl&!uDc-! zR@G+l_i2u|_>=6TAdt85gYIBcq}lsK$RLwgeQZs-0OTiY(Q~>}_0MSXpF)IKwoiL! z%Up+K!Q$3ykTtU#vzpiQ~$u!C}%kV~dx829z*&v}qa@l^j^w_5A zH|rC~=cE>^kT{i&S+5B4153hE`Ya?qPjh}=tfahuf$eXe#QAHjTCaB%{{fz{$;p^q z&oKiAPSjKV4W~#>KUqpqjRsZbJxf&&wp8H?CexvFRJ(f%?Pu$iJBSdx`>5cE+BLd) z-3Dt?9+dZ@9Q&pj{-~)9B|ZG6TXU=a;gVH?GpNi7?HboBT-t2ND0H5LqfEn}xQNsv zSDa&O4akoj3Oh_pnx-}Me8*R6xmW9sg91)@{Udt%EL@1Bf4SL<(v|Bjhc@IF(*4c0 z&iWe-8kehcc9~z|x<2|35c?YoSbU8huJwB#SYD4?P05+k<1BAq11UMo7;QQX>3%}& z1b>8Vwfx^(3oXjQp}47qonqfS9WFsBBX?Gu!HXSZ(rFu+-}@|^0-_T zU*gWJNjssuUpB*X$N**RGgyp6Pbv^Ej0l_UnN%?Wqxs{(te5%F*-=al1g@IkdKrH( zzmKshDR^gV2y*nAOraUU^m458eo*3rK!-A34D)@#;o8|(mM5}UV~zZrD-G~p+9YRo ziwwN4{*+@wE~n=`6(V?HHFZpy5Yy7B{yeprpe^$+N}W8W8Kn)CFl-r2V{0}tpzEIb zB`EsBsN!|k#gC7cIpOWgJ=b%=mfEtm z?Bk?)8aKkV;tso(v(HaF>%7*7^8U%M=qhCGnZ-X|86D8D-?8ZTJkzo$;vlB>^b(>s z5HV@K`W$Tba{9uNTU?`WWyBstEZQ*s>1)@gQbR@#=c`D;OjRZ^4POP_uh;_kn9ybX zt$cXdlIjPmW8F7J{yU;8Z~_CiLr{rBN7^qp0)*Atl{?g*QLKwMl`N2?{y`@>xz4S$s}slF?_Raw~#czA4a z)xy6`*K%ZP;g@2xcKfi9BU$WabDTlrOxavTH{u=3rW?SypH^zK7M{OsM6X1>AW`Hlpi5dlD>PhlP5Sb>d{8=&UPSPObEXbxlpo$2 z6dAD~&9^m`R6+pTWSJu@$0Y@^5wfViwH4&jL+ms&f&pIiHV65NwcGbx4XG0YorD=k z_?DjOt#j#KDLg;KO7Cd`(!SiIv##{(o>@rk#;p>XWev-+lO+zzd zGl34LT+OqLule#`8NmUs9)>g@$jj(>n+54&nbdE7orZNK{Q+tS(D~;wPyFaSMHgkzAQ4sfg4^#?%d{?g6U&k{Av& z)sgOVeD*2%m`)=+iymBO${6J|srs5?*;?s!x`;VQ^g~Md*>BMoBK`+Y3p$(5E#lLb~2 z6Nd^c%#Ry+9+?kH5CVfG!4H1b5*-tx(q4%%NqSMZXIS4_%$)DcNrtlwuJIP1aO0B3 zlG7!5oS3%sMhx4efvOw~S5rp=V{XB&yzvp#Vee4tm&?76Bc_$uQg%#gL2@gG-x_AY zC5EX}gO+RuAnE*o!%mODR&(;kfeCDxasRannrJzn znb@tmqNMen1kz0@DD)I*{_L>L#!1Qw2B30r;tyj6KNwC=TF{!o4GnVe;;mJQi zt0!*<)P?aL>@cfSM6}#hKpoRq?x*gVyRfCG;We*>lBUr0{{XJ*xFfMq*u%}1;c^Kx zBgpeD%9sWj)UR{7@}ctFl&us2eMFczayMEdRscqM*jBq4F1_V3aV%?JVEFr_Y|h_E zwD3T5zm~Anm1~UEXry*O@NDgAi8rFgp2_P%UNQ%1C9qsHPIH9nSfg(_HYQ(xz1$gb ze3jK~T5w?&q|8-p5vP14VG1hYqQulN$4bh5bL!tr6YEB;>jM* z@zO+}6mbvCAl-Ol{tWW!ritRqbrOD>QBS)};s#}Ii>8?A9i1&$ggaG=FUy!Nk$fy) zXP=Q4*54(uE)iiZf|I?DI36k2e-q}=ZOxrihp^QXdJeu0I1Zdt&<)@Uq4D1-&l{L+ zo)_`}3*DP_>_Y)icdsNn{2HPU6352yEw6!3Wm>07bl6W`g14$=ecWCOkf%t<$#egL z$iF&cjuqN9Zl_$o{G{WC7NtcaB83xfBqQe6=u3>ScJCB?pzhA?Xd<{WwN^1Pb{)0& z+1s-|Odi5w*f!hT+EGlJ5HS+|4FWoSX||M{F#!@Pv&)i8{Zx7I$YmBhqdR^1D&C<( z9zZolcf|W_G@enS^6xXU#6?qD&Vtv77CmLVwt2}Sal7fA8;yjmQxbPd*R2#1A7Eyt z;#|>jS?ABk17Ydxf2WMJ-oU-8td_eo^fq0>Bo4K`^mcq$lFi4j>5CZh7fP@Bp&ra?gx$S;k`LbI1WA%6 zExP~;lC??Wdvcb`RIEy#y^ctai`rO4xlqRN&XT^yObtNtK(`tq7FyBDE;bAP^eTR$24pVPG(3J%A)9w; zSd*UZL@I&Kd%H>6`LT4qXXYH@pj+TYs~$|2EG1MQS5r5e+4cV4r*g6(Z;RXYuFjXE zS5K}H3E5wJW*_;p#8tt97iTG#Vn8_9`?dd=^R24e!&S60?o z@huNpm!#Lz-7mjDQnr|1Z}a~APSDV8ag`mmpd%*B;jNHohG>D2O|%&|hXaHEi26PJ z)ph$5V89ugsf{lySYX0^1lT=!*w}2X3-ZkeaisjiMogaYu9SUx;NS|E+A(4E;2`o2 zJ4rX1lPCaN5SWWVf(8k0%iQVnu9c?GG940*y%@Zol~OTk;&ZSQXBOS7ySDo#K;B8;TNsY15x7soP%oR_TaIi1cCqqzHxgI5lpQAcN(6_1tl%arI2MoV^An{{t{Mz1?0gUDk#Df)<@O z9)xYrPh=FSD<{NqIs|WV_=+Y|6;f1k?6Sy(eWioDixxfr-07i){bf~Y+?->sWA8N9|fvJXW13L}%F zI`A__*K!T$T#iaZmvhT&PipIzdyh|In5yNq{h=N&YeU!W{1E|r-p0Z2C~x&l@c%M3 zKk150TaC3%8pYx23b)vI^;2EO57I>^y@m8o-t4?*%|dV_OEcQ%5=}cdCWt^A-{mRx z{`Ou;4*|1j+bVSxJWPS|5a~(%-cDxxd-X%RpM#5#txZW~M|A~2lr9G0QQ11B@B^?W)1>7!@Unbw@ZUaC=YF87j$hQ@ zh}XYgRO*Jo2eIpO#euXBR+kUOAP&0fzGGTi7p$t+ZEAvB$29Po z3%JSbd2ITMOT?0sQBpbF)NhJK=E;I@1pn;DXmY==*z4R5eX~+L6>fo!&)W;?|T3aN3G)0>f z3>K43^k=EvAFOX*e_sH z@^KyRxsvL`^_g+|Kfr{ThAIFDSY+BCOti`4Tni-FKK@udSk%A8DAT|4XU}_)m(_2a zi=@HJf;Y6RcDlz5(`8WAZJT)MRhO^Wb-7S#6?O;gduFmJoirgB^UCt(y@;u_MGVjT zy*J?}p9p?D?5NK_8Wu7NVAho5 zs{BdQ6>?Bg-h3Bihk~mb;*BsdPEh@Gs;_(knz@BjdF(4S)izxP38?;%XAQG+xmpDDU2;v$`EtJ|B8 z=e)k|Uj+yDq||#Z1-Ch0DplJwH@c7v7m~TMT{fp}C(n0%UJScvH9D zi-cq>^b!g{melTsj%1WYw!;bi-m56eauK|}VdeI%WPMBl7?It0Ec#wspr79_9Z&^% zRFTzYS5g`3w(g;XA=a5F{nz9bE~V!W(}aDAT2`c>Al~AL0&rzaDXPjUdYEhH82;ei zI5sLQY;XW<{UrkWpKtO0s2;1pm2Y-rW$+4=2Eh*vc&j#5@${$1idh&9qdIKO8PoC3 zzO2wvi-|_R*GXB{_h^hIe_9?IFtcXURX>cGW^8+U>N=-ru5TxGZa4qe_FEDQnN#$o z%DW9#Y2HipeGxIA)^EKz9zd1P4+!Zdlnq(rEu!gm=whc2h<`CAQ|DG+Ae@Sm%&rei^A|0b z_L>d!Q`U7?PyAS7HGk4zBgY6RVeM3--2Mj?A!Oc>*<|d5YP&K7MW1(kqSSnbAB`xW zZSWAa2%^hRR|Y=^S*fK;R0|1ZuPmg=q*TpVSWK2)0aza9G!o(wNQoEKm}laV{UPFP z-^%3;^5|jj6u7Bx&1`92Xzik-ztFYqy0%yad0vL>R+CY1e^hegiHg?S zNNX)^nLmv0mtQ&(0O08m!3oYnq_jqI$C5rG&p{i{yPb{J_mbGp5)U~)&p5wlWIt7caQGFPOc9dEsPXCTOcjE7Bte6= zPOR$iNnlaOMpSoWj6gEsl9*gHUD0%-9WV6+)st*5>SXG6Ax4fU>tqr2xBc(s_4yZ# zxPq&4n7r}=hx-o-yw#|2nvBqMWRI5c8;yfAZNGOV2Iiqs$91vdAw%5j8Z|R}bu^AyQuC`cP!|* ze7?9ML$9vu(COG2oTXj;T;APPo8mUC@-I)rc)jdZDqs|cYr^NaTba{rP>gU)*OcLZ zQMG5lLDou4P{_(!g%2`k-6dj0k)*+*FMawv3AGee$Nm-#-oLTWop|tI7|%=0Ajj13 z!O`~JtWn>??8oHJ@wjFLYh6tyxVLT^;iYKS_U`q@u2~`7x_Gj&<>`d0OJ`-cP;W|4 z)gy%-VJ8 zY|vIRw|_Ut;#x2DC@L<|A>Cwknz*KcwX!%Arjb z2N+SQTy=heoiay(rNI(Cg*Iymk}%W2d)KA;(TMt}N;B|4*-}B}quFn>%;tI>@@M;X zo%^*lzIKa2n69t0&aH`f%vH{3xvz583M@?9DrVki>(#u$d#Z}>+Sh5@g-r3@Z#Ak0 z8OjKcFDEZQ;(O3o^=2lR^V#-`!Qq)~mRyx!dp{(b?>z$ErZeyt3E6Z=%oJym0`dWW zW@~rgQ`3GNa*8#?sbe|0)Kr2^}!Zr?N1AHE*j0f z)I%Hdh75q%PDPD%O*VvLeK%i}DO6f&D zBQ*GUh2HAz`JJm4%JER_5I1`^cl-9bH?AD}6?CEJaTIvQf$;w&R3V-I3215|*(EUJ zNp?)oU~RR3lzTSBv$`G!@k1&nc1u@b>rOTWFLc*wm!yi28Vg{h6;B}^L4+0SV-6aP ze${wQPC>2oF;+LUQrZv?O8^gS(^ljCDtX$T6?sIBq!(#e1i()w+ zq+*w%UZvLnMQQJVCC8lq?Q)0_k+!hx@O-kEQTTB6=Wz_zyLV1XW_sq_55Bx^a2B{( z2-sjJI++ae*4as58WUtZz7V-GB@uO>C~Dq$x>C{0Qn6E4lo_Iw1f^ja{8;m9f1G@v zNYP${??s-|iX$(dL@Ri2Zhnj%A)V$tC&7|b&v3|VF}s~M=AVnC5+2N;wfqHo(DzTP z^zy4_UJe}3Gadkb zqlWJ|1LJGsUBTM-fAFxwI?{qvceTlRd3!0tUEEjLF7~~^a(Q;@yF@A+CJYe`li)lIa<7o8@j&F~gWf;fcG^2_^ zPG=O4M&9}r&Jt|lbA9IW)K@)>!Xv<&H22yXnC8DZtFEQbhYHt24{b*XVTsEcT_-zj zKdnnth!$pdZ&suz{9-l$kH#LZq;@FEWkn`G7LP7|v>j!@`ZgcHw9ClWYll?28eTbP zoRmA~z_0i8RyoW#U5MNZp@?RzS=AJ>@H#)#qj>qi9w6Y zlMjy3I&w5qR}OM_J}c*YqPR2uxVqaGO3-KFI`ld-fZ#bVzU;717p@De--nkf)5rU7 z6?}LVbjEH#TD+y$d92hOw5y!4ug^%ti1SXRVd7YeqkmJr!ce&$PBHGbLO5KBibW`V zH96kuX0@Xc^*E|`fY>4#bgZ5*i#Iwc}-sZBNb8)3>^^-yRJqHTQd{s7FJBYp<7H=)j zZn5ZzG}!=GMyQJ8>h+6yWEDk3vHpEah;(Hd1R8UkrizG0xDg*1bUChb1mU;6bF7rv z9L$stm%Y3^98rG0t?~NtT40*~O3;em?TFV%Aw7Eu4h6b9o3@KZ52jpdw&6xc^oxk} z7yFaXZz(UXp~{1S00cAlAKCG@H2rTOeMbo^g<*gC9Zz*6_@Z|#{La8);u}s>$pU-| zMeQ5Zgkr?s(h>^VBMP*szVvfvYK}jW9b+>f`rKEg89%V&^9-Ly<&VC;%0pd%Cc!qf z-$Inn1#R_?K#)-9zuGJC%#>4B`HBa~YY0>;zLI}ur0YmYf=vt%VmAm-P zkf6_xd)Dt|Vg5j=pA9E|S-#7!W@;0A2F<0#C=0}^R|ensbNTY0sqD;UOp-pFe8{~Z zG0ee|wftl&lSf&!pN!K!89#X=dQ?zJ zR+=tl;<&@ihmNwA%W}Tzo7Rx^+m_z4iq*OKYp$pA4?okWG13J~1%? zmeAFl=&}^J4h%UTetmVB+ZJkJWg1S?)!X?zFHPBTGfEqUteQ0a<8{n9s~Pgj@CRu5;EEiU&?>n`PFTWli|f0Duc^C-{f5RWc6+3gMEZ1nYYVQKRW*tE-#uTi&<`<6M67W#+e9z zXUOMQon`EUmEcBdEh?)~-{8KVb(I_qvViju?(NBREX)`Ov3bMY6z}Vtt?BZ;%=_m* zplGZZ)SuFua7{q2Jz4!tucp*dezNE4-Lin~YD=h_B&lRL_0q}yB5&=<(J@#EHo8`f zn>n7s=?u67Sbk)@n3!i1=+A9yeFvb%1!cl@HocokXbduiEP9o#Mn|4Q?ZUtEJi6EERi z#@K1H=%nw%5SMb7Je5Jmmt-Q$oKvYLTpUs)Q7Qu`4w}D)318WgwJq2uuF#$*sn50(Xj9|d#CTfbI_2+q|0-ElaR|@Q7XCB8=b62rw*tlnX))d0Ky}FjW z$`g9*bPN@LwU@77{CRElR*W_#gBpBOLw@?L8SNbh18>dmXGR55_)J%U%K~ z?C54*jrENJ09t?__{8J#^!Xqjzq!~q>3*}lxSd&cN=Bex@-YdqXmaw~yy0M?2FE|_ zehZ%o{=pRj-mDeLm?T>^b-&)7xqcoX?ccU`vu7FIvQoBIY_t!y>Rq;6y|(TO{%&KF zEViuiAZCyr{nDGkZ3n=_0r&}U!T-yf4ubEH59%}Y4$>&^ATKidrK!SvrD$dYW&Zgc-f52uMeufuhA23El1EkOs$bNqSSl!DKDe~wq~-f2>y21 z6ngmSXyjolPfkR)Ovq}eGW+7yp+ytiqcp0Yw1E0O-l)+#mkOUeDE~p>fcC@OHC%Od z5RLAZ;BGe8+cz=kzV54kRAX2QQh1g(PXs@UcuBr%S0mCGCux8{n4L08KHlrPrxs~9 zhZEa|Q&x+VeOq7W|H=F&u|Lq+bV3{&s8o*eo_qe#Zk;=a?~hW+d!N4vJPk<}Zk|(q zD+?jRhn#Uju87Q=X+GNgxzaWJ;AzdejGk;gRLd<*%e6`Yht36FZie zD}+@&yo&SBh(43)>-!fL`^HqUI@>=f$GdwX1FV8c6whlouxNF7aw2!#xLs=hN0d4oKKDC;QeOnpAcT;cGGd zk}jqOMo;etfqud}U=6d-y16Pk|oJ3jl}6gNAswleFew ztoy*>H&cqQ^xC-z{Hp^r>Lzp^1}KESkF8qz!6(Fg!^kf#dNL!;KAv+0C{sKS-gn}t zLQEY;Y#|xFoc{AHZFjK*o&L~imrlE{%i08j9Sa?LlUYv+o0pC?L;s z#@2kdgj8gSxOOTs_8(YkpDxe@?t1EQRlT5jh=lOPtQ9y!eb)0~BH1ly!`I7_+uHU? ziBqETwwA-Y^T<88#CTr7OiVT&PHvm&R+g2T99@H?7XDOi+v{3M=$Dmz3)EX%4cxem zA9v3vibN{vE9_;yueJ7l?@b5C%NgHG`oThE^NHAp*k^3u0NnrES4)V3yeR z2c8`D0r=q851%%Uc0zB%8T_5MLr0(%sFwVX-S-dVkHi`A?)jv>cMSURqoaV{~8=NK^$YQF*ct^DO| z%mCGz=u?aH*EGINY!VTAyWDtqc-7;39|Mbs9wLV_MxSLl5zDW?4@rsYd|KP%Ov<4~ zSjk0u9!K_!7E1Jt;$gpoucqf$*D|M2&}vZQQS;xL+Y`D^g?Wq0;j4;=Ev>gAE05JE z@eX+2*lQW_5$m?S=YEjQdJ>Qrcv3r+=#4_3rC; zBKV>h#V1$ez$-6rLj$DXMI~}PWd2;#nFSQVwPl9aXD%hj-^|QIFT-(vMAyAaLR5J@ z#JW3ruEX^{<6UwS`oteXA%ELYqf8vl9&ETFpWFE{Vj$V(94gir zk6UuAseFoJz8tTX%TF_n&Zo)I`SfwKk8(3}D}^4MaXK2VX*(bOj<}+H$1&u%%&K-6 zlR2`)^B-Q2AB}E5-hJ+vnE6&ia!&I?)Y2+Q(Jj++?(gO7;bK|%yPLmWWrcN{+pG0E zds~-#DO>5b3XX>bdwWnVNl?KajT%o>O3>Du!uEc=0H)(2IYpwGUE;#Qv|_{W5B7)% zgdcKzu7-o7Lnyv{6jz`)GV<28@4tLfZJ|5zmvLOkW)S zbXk-x~MZNUNIUvg_8rHgd|h+B4UC{$p|n{|Xda z{6=({cR6l*dc}OA6--=+mF4=5g7Mhi?ERyjR$U)eYuKV)3nEqujg}ns88PCyMCche zU+Jx$g$8wod$Qh9nzn4t0cfPJvRr8jcp-6IZ=+J);Ah^>NG#)_bCohKnRj^#XrtBS zkK;ypd?k`3i?)4@<_R-1#!gt<2$s1jU;Uu8Jva**Q=*Ng!0(&3RWvt{uPp62LV29t zSeBJ-uFoizMdm;c=l^Ve$DjVXhgR#81H`&-41>2QAadiR85e$0V+U;`#Kxn9DP$bM zrv%=H66w#@Xh+058R!Bm+{)Z=YCwqP?)jlJ#SP=W6FzQj_#X|xz#`lsb1zYy&gemnqU!Y6D6xh#= zRl@h|KM>s4kH(j0WB>XA8G7!+IBEEjN=?=OKKbEw(|H<&HrLj9a0P2;nJQ13xWrIh ztva{-qk0|IPj6@xTr!{gU}js2l3S9El;5@X{D)T*@#9R_ce5`45C)wG=qhD1+F_N% ziW6_&Yi%+6KDCHRp$YO0*@`9>&9r=p_ZNcaqO7iz_KNry&pn;h^K?zNW~YvLr>%@; zsEDL0UJ}B7=_Q5A9P8QeA?=#d79qXzvuSm`ZO)qC&y+Qy3}3Z%zz(Q=fgMF zMV4BzK%>sQ`d+dC|A&%;%!K4y4#|SIC_;+8lq;@K(@#Ygu0MB4+L#{s;`hIr{!X+; z(7)w3V;brD!=Ppy6{=|cHhH#}&M+?#KhJ@HzzriAZ(a{6iw6 zQ{n5%CLra-z&wxBLPTqZX5fH4{<$uz{G_;`8elM>3G!woBqPzZD0k@m?84`2U(k3v zP!esyB{KiZ=JI%Ev|?4SOx+mqjH(oRuizb%JTZainj;g>`=^BU(G(gTaeHsbOZjbN zzv~jxMo*n?iuydSzi#SDlOZNY~){?jQ9THcvJgujKtj0`+@z1qdd2|txRA~o*k?Z6?oP%d1}T9 zHM2U|==1=C;ZVIZhx#@q9-0a~aUc$Q*3P7qro#v3=Hcujx1NV<=+>W;d;u;Hr47GH zO|-5`b!bL^5j#_3126uF+M_-~+GR2djcB5|*K9Oe4<+hy_j|T~Eb&I5-^H@$yJfbW zGOs-l`Y4fiQt|Lvjy2-%y3ldmnN#SWjbCEcfBxVWd$&R?HsY34KR5JE+J6?p^R4bz zXD08Ab7pPG#v?GuLuaP8kK3n6a0aXK2r?+8(Y?oa&^lprG>~WdYgzBBG~K03z_lv| zRV-5L8&Ml_eUZzPxyqaS;fGHF3RMu#BT9kCV^*|;3<&3_g3&C$h6gN98a&iH`v2N? z)Dqf!9dhh0dc!iSK#;vAQ?Ta=1P&x}>SK>Stak})dG^;3?Z18_H-?A%uJzi{lc}-# zT(^IW@NEiOJgkE4{^2b;g*C&4BrEukCo6|c&Eq|;wCFQoz$Kvx&FrOpxHnK@;-qme% zXNH21*AaP&9)22|<}Ix$!ZNifDh}R5Y*8Ir#Gbz5#NWSswA6q;s6~!cwS6vk-H{iB zu~C!=Qn7gqjE_#NQR)6|O41KiY%kL+l3?i+eQ|!Tltz6ovz2Tri|c6v9}|U<+6Kp* znKT&wXoIOHu1#1W%iPprMEoIvpzK?=k560H3e36PD>`cPJ6fv$!%NM(>GwRr)&6~l z(Ct()4+K2&4Z!g*;04ksF zt}2>3eSNLOXMDt42N1J`SXWQdeXlHaWTdWKlek{cv393l^A2Jk6vkIK`%lpv? z?R~XC(K=n?Ut-?0ylEj+YrDZuTE4pX>vpqrpXRUD{kXI0bp09V!3PHw)wsawieXnT zs`K7vkMF^z$Jfxj_tvNTH1y@|*ztQ7^uo|bdUv!=Zj{z-!8hlt;Luv%RF zzH3?9tIkp_B0!YV^ih5Sp*-G5b*#^9l!GoGUi5J>mDP9s=e05gVPp6vlw(1jJnUbx z@pZ;VnFPTL10#&T$~V%cV8Y)nL03Vih@T#M#>sjrSBD_!>K<5)vO@T(WMiTk*(kMf z0hHpQ&ECNtYtVf@#n0@0QRDZTUkBTRt|XZIjZ?Pb2GSs5f_p?v@@yA2_sh$Isv^DzgwNSwaA-6e@-mLHcRVIn9p@SUo) zdJr~w7}qnS{z%X8Rm^!~uI5nGzgT}|aXR|Cm)JTV36L~d!`8>;M=$AxCWAvEV_ebV z6Y5NF376j2R_=b?CeUMyCb5ko+gDS#SKe(%$Rqh=JNddv= zCmXl<7qExE4|#P=NEia}8)GFaohG7*)I6tRENQjg+|%e+Jabz%rl-;+d#pJbU4OUz zRyZ=a@XNg;(7FDpCncN6ZV^vl`)knm+PYPeIvsra$v2eU@q(jma_d&xB3|(ABmsw% z9f$M8$BFko2Q{>Pnn==GNG`kiVnrW%-J<SaA+vc>8CgS-_7K@Cq4_@p(-_K;d8IQ~ z(I<0Vgdf+wb35|8>z?r-rn9&2<$wN~O}EjW%IEYH*W)srtHPKkQGH;lZ((c7D`MWU z9b753U*aZm{B3E|C==}&nQ!>COrsPGlC^?;z29V%XLew>{j2dbj4pebfpF5V65Ih= z3*||E3$_)XR=RPYf0EO*NDIW7ks_kfZj(h1Wa+T7CP^oIi0QUwdy~wpRZ_b zNU~o2WKlTW6_k^G)r5TJE#i>zqT!3K#fQy5UOHIT8$}D!b-uyP`vK`p?k#Sq;i9cO zlypbS9Uc|XCebQjjQGN<49wv7ch(`?mO&*fp|U2K19JCEgX}L5EtTM!Lb%e zFCjKYO}-|-_6>O2olx`&eueth&liGvrY!ymnI`+YD$`8}F5|q$w@3)qXoL zHc5C22Aw0qna|B?${=DUi>&7JfByOltlHb1$iZP;ye}EE-W2VckZ^wg3sp?SqnYGp z(0ZJAb^Wrs5!O<|@$2pRZhJ!~(X$M0so5^t_UX(g&hfhJZv$Qv#$BCJMNHmFqfx^{ zDi89+Sbu8Bh9@~nXCr!qYn!y4DwTV3eCzsZ`3#msJ$b1bteIcmQ*yZ59I|CtjR;}2#dG*O*0Ys8S;bYKW z!C0er`gG|EaoS>=aPae#eOf#-bJX5N)O_M-I8@IA!Om?Wmc8yDe)-#ReKORYbULzZ zQ!XKfD{9A1r0Julv2$V|J=sZhzqm%>rn1evl*lu?me%g37WZHTeLK|k*M;*(q{aHE z3&Ha~AuX4zI>K6v*09I6u#XR3IEr#OBrr9SqlPC?;SwsxRn18p99OBtX2`19FzRI%B!)573_ zc+81ahxy@Fx96|DmBVvzj;~ZFq4!bVyKBt>7gr(Qx920vWM8_}Kajm{q}>(i;K%)H z`S=L3>^oAj|EW47S6gTdZ>0PUk=|eXpT;*HdnBSet+~c_Po6&(@1(1kd>qsCl_Hm* z;EUkX2&*2SxKv9`y_~06&CtN4eRt=&^{bBTq*W>NMYkL1m2?SRrhD#%UU6sR6}Ytd zx)yhu{&KlFc4nVybCRr<)d7+7Pp>depPE0BJEeLoc7RE*^V6B@Rp-UKC0KSVN#K~8 zC1G+Fs8?VhPE_YnMr^xCmPxrtR~|MWbz*0cceLG7P3)*VDE`ty<}Z(+j-p!Zj*<+7 zGi1O`-0(;CJx!9@?H8F}UcVl50+omi(!71p#!Xs?@R$594HsBB0}CCOw{(I7aU$OT zV4*jkcy=z$3?`jiLV1s!-2WV1N49XKswLsG()T%;B{oc(`%1>a;Nt)(>7$ZGSZbvSaJ*{~3T z1DC>_CZO*6oxCnB)05>jmSQ}8BTF}B5I#PvcPYV`5+42tz5_myyk}WtciX-16z4#? zWJA^8il@e__6C;1&rDx5JEqVAw1RYup+1?NT$g|2XDC>~d_?e7wR5}|8Sm9i*iuib z4N-s@hAiwSf#;0Qqw$(yjpnKmx>sFUS!Xa*b;xyRH*~$Hr2G&DDmJY);PrrRmLtm| zCE@5GK)hmKbvS1SGTKfjny$6}{qG>{^pA(1?c5*jTwv@-G;4cRamwuyaVJ!7uIbD*pVjn(v&y_!!@?M2gY1@;x_Nz&p8(S()5GL0QW0vK8MQ&!^>El_bQ{$TT zM`bzz8euWaE3t6JfkdTD<+QJot2~ljz$pUZWty$y-k3d=(FC%(-SHi9{a^+ob`=sm>o7@ zyQ)iI7slCV%hlMH`qJ=@BbxL#ujO{eDXg@qEt)hmCvAhDeK(3*oIxYudq(NrggBdf z&JU^m6CvYYdWO=a4n*dxQ%N;jP07D4RnZFh-*4iPiq*x9+1&A@brGpsDHyH(#{jMEHVFo(ax&Rj=wN~G>C<>^bTEAkeRA&w`ggjjF; z*l7&vh@^zX4?dG6=nL6Q!ikF!qHWc;&)D5M=yHI+lv5WGQ(ZwzPsefsUm18POz>Fe z>*vBiwgOh%QwDMwub+Xbd9oDu&dq&z^Idfoh`1V%4;=6ne-@7C@>a9uB1s?P`zmFB zY{7r2H0nojF!5EWP4b>a5dLQ^Xpiuq6?$bj%aKO!WRE~rsnFq6LVtC46buC+M%T-;UR862_Y!rPm;4w$W zey-=WXil2ux?`{@4Jew{w_*1GYe(QmiCBMbQIHW!(@71j-ip2Bb!fk@SdYClWc##B zR}0letXTREuUI~Td2BlSE(|)nfqkf9fx4kC{M^f{s(8;muB=c?M!Tu6o}s6crO0Vt zzl|BSQsUrP7I92})dB@kOoHa651(Y1S=2TJSN^`r#?;myHI2HEV-lPHv}bwtpwMC? zoKZb23tj&QHIm@~h(!7}fC7G?j_%w&02T}~$g`0=;vo6dyxDLHDGt?s=J}JUxw#~f>)|ABkYq_)T6C*{JS5; z_i(H?DmX9}=)zi~`>+7ck`%7deEY597TA!$mSL8WyUFY>Thqx(lG~g~|IYfo;_a9{ z{d-9s;3RfHEUP=4NlFU-o%%v=+hRr|sIdV%dv~clj{tfRDMo19XfTo!P(%|>F!7Z2MTf#-Ym^dg6(~#&Gy49l z&ZWI$$-g(Tm=dn!w-v5;#~&t8?Z!d9_zS%m1>CI%07K&G-Fjq;(U2-Y!)#ne31K3p z2a7~*6Yki5&qho{GIrVDD7o=%kD?52RE}7ZA%+moNY_H5O|4~y>%NM?V)ABHJc#?K zY$R2fd8x&5j|3V~)}035CU=`R!|kGFarD=_gIco@GsR8XCy#F4S(jd&$$n6IbTFai<8N?^67sFFy;<3KaY~G%(!bii&Az<9)WZqhWKp3y z`Zu|T{2d{N<-B=^bzMdTuV3?0tF8K= zXI2S-C*s2<+S~jj)B{{)88O3&HaWWw(bETUpID`jL`JKU{fFnp86QMz^VrCTp={Ug z9t6G{`9TUsGP3yi#;{`Bj=)`EbcL@u&zf8U?%|NL(L)OmG3|PtZxv0OFtP()STQ)t zWs6;7V(y%rbz2oRbwfRf5z<*W3(yyk`YQ|+MZNE@LLxHx>mSnp%CEKCd=}sm=~2-y z`vKMr4tT2?0st0DFonybVkBXPSV@3%X?+{r3y!39|0mP1-5s=b5be->3w^Titwn(t z$DQ-fbUO7;e2vH*Ab{ z*d<4hhM5@2?V+V>S*S+N1}~O#8^&i&HCgQ{c@$z(e-xxF+Xu%AN1p6%O(Q3F{=>sD zFpm7=OF8lA_2}dzh?u0k8;c;qW)S{|M;q}_w$F|zj18DLPP_=SN*KDM$=tDv7v-Au zzv&d=9=4@Nn|(oJmo}C*{vAyYGSov7u4;A}M|zPpfF~)L3p;*e5i#G3w~Jwn-D>Yq zMX2IvJf{J>M{zSqMks&sMjj`Nskzd%yrZ-D56=OdS86r~Peavdl?0WqOa}*TpV4eu z!HN%XMGUujcR=62f546*(g~=~f#G4GP^SE#3QR!suBdJwqyoAJ)u;^;r6qCa0y5uX}pg<|ert}PkO&AQidlHw{v;$)ua#u|iLD-R4hsp^X zYFa-y5?0ze&^G1&K@*~W(WXb0BiOX`Lr_mwZ_6|ZZ>OkSBKSkA-VyI12Lq0d{o+nbZlFYc%+ zBLuL!gLee_%>I8Eau{tNVRg3}DxWE;J37gXoo-{jMtjkos{Ow`r6(!lfbb**C+9H# zPPhv&Ltfq9roZdqat-+dOdYEvmk(oBpDjjELV`5Ybs9SINcGd>Lb7317S=#!_vp4-cZ8dy=MtamR49)_{3`{|aJ zg?l;Pu%g#k_Pf)O50<;61FFhKuZU_p(AeA(w?K*DAdSCg!d`Fgz9;!0-nMiuc|cKS z8|;#1*}p7HjP|teD9q->imJD(>a-!yMw8Q8;tk?x?h1d-*)UfH*SW@la zlez%Xn&VKI`Ht<^GNjGM8n{A>O8tI{9R)6UCUUFtx=0l5asn`b?;Bw&FweHLmIsgF zOkqy9pH*1yW-&-y1iB(6;xX2GYjjxIaBxV4_Vz0dn9s>O7!L6Qgi4fydGu%TxL3QJ zi7bR2IYWwy!HY$u)l|h1PNGOKWg5`^ z(Rq8%nzc}NkQ&lqlz?6N-Z$$WVy;0wZuG9JToa$C=297pPr1$NAcv${) z96jZgE21g>Ir=KM;%;Vx0lSWdYxwMoRBwjyV1i3e%f zz8%JsbpTAQ6)|T=$F~qbnHq^U*d)E1tJ&(Tai^pM^bc8GK>(8x2~SXMy}vL!?&lRy z5~gtuS5lK&{oB0GvARPU^L5E~&_p3%eb91^@HP$|gkw{`A%#R>!lW_h$9E+6Z}8pC zF;+Gjk#4Hd95R@+e7;o{OAki99tFxCl?7b?3l19z_j!q@ zBf(*T(A}3!t)a&?2@9u77F4o$T%c>IsSZ+jL-aN!Z}Q7P1P?qRv@ z+A#4I+neNWEaPYu7##RK<4B6gt#7^cs-r8-*2QtX=$B$Ey+bNu`Qr*sr^!IEn;o;8 zYKDCH!tXHeEGD4P+$aGw_sg8Bkk%TlTzf^%wIIa`Bd}#)nQA@%3p|s*Zoj%=MlN5@XXwUI|$J3*F|!u>l(tVH(C0 z?pSuT*_!^LOR}n8akSc%lcU!~?1L@Q0#_a{)KUtiKN7))1)$yuR`++B8L0ujkosw5!GUIfqW&Ri_n6T|Y1Mqg6CS0z;PKpzhjN#EuG zq#s&H%vH?o*ECi@^qqpKkS7J3x%Y*FMkN ziE!?Lus=!~y|FX@J9C5d4O!d2^)|8Tak*KfIjHh9DeG&=pYm zL=S`!G~c#&1>ML)My~`heCaA85wqqUyvrvg7-!_FCLmZ%R!uJAZJtrm_u2CB8bof! z-m$7iQDg<9XMwwf5bO865ySo?t_pHtE7M|ClmjN70ComD?Bn9T>7S%mJ{Vb)Dq0n= zBaCA#Ae=)*#AsVMT6VV_u?_SUkCv=lh6}B3`WaOC8!=ijPFtNf4{8w*PP4{2X)yw~ z?2!7VkGhrCk#8rxR7*ZSBmVG1{Li-o!_o%o#jP`ySu0t%ZL( z3f|2sdFVSo>{8D2{fbf6q>Ce9&zEl{0%g% zip4tJs9~S&5}#b6|DA1jpAD-f6iK7cK6Ekeh*6C1bekP(b}UA)LExhtWQaUDsdatL z=Hck_wtxFST1za}Ko-xu*ss?huGnoX!W#NOGrt4 z^(^F5^+J_)?&$SLLz8H?mmZ-LZn$yZ%7x6H#AC0s^X0(^(zX;Mmr_?KgJ!1NVRnYj zvwL)^xug@djNU^rA@ojfWHQV>x)i^zLebbrog@v$CyJ!ffqlUF19w(jrFc8RK3iA? z-``HGKzSI|ZAqcSZSI{o?h*Dd$jd|e&wqH7tX5rshgL|)V)6OhCQcl4+nW%kSuyM( z80S7OQ&v&hz-DXnWTt1g3Mbh$!*ll?BlbQ_6a9DVk^T`Qt&QvXyp*qng1gHi*e*9KNZ2@y|WzJL4*gxr_z0XP1PVs2TfpjCipje^Urq`^~+Hp zT1o1#-Ph5bkZl!$Ue$wD(vTG$st~2Z$6PXpGHYb^B0IK{Q4<>8M3UD&Q3c|}^l#hh zP1NST^$Ch=RN7qr5TR7lWm+HW7s^Z@)J6-$J)i$Q*JUEua-PGebMWi2y5Pf%WH#!C zTq7fi`b+a0#zBVv@Pz-7*T@k@{F~EwUBwfB@t6nBCC;xNw#U|TR%H9wzCmDB?CPo6 zwa1i4R^4IEad&occy}HL=TgmCr2D!|?E=q@YtE8crwDCih^h}yJG$#@Yzs1ky^mV@ z+Z*6$;S>qko~OJL8(U_9BOqpb?3gR8B=JZ&Y?565v$tgPB!?CrTRqbi*DgjAU|z|f zfDsyT?Wf?eK{-5vn}QU$35E52t%!GkW%i>u_niMPGA$Ad>ng5zt||!Ap8rb?*$u)| z!sS9$Dv6+L-z1Zy5dB>Eep6&;W4Qn9VdzR3Y976tlT~~4Ekve_5?zPj^r+j+y^#PA zq->zV>1|5lv7wj_WkubLaRBV}&OR(E=6o;aqfc{YrtH93JR_4CT03qvn$bDaGnRIN z`W-r&LPwC6H}R%c(k^w1=u_{77&umjXdjWdl5YELg_S_{$=bb@L8{X1@RH|oi#gi! ztwd{`@9ek}xJG_M?|<~fi_>@=j-$4jPIuQW6V8U3>DiulH+MFD$qa`(2aXP&yx?{V zzSL>X;WjS(2man5uyWLCJ+%_igiYAu8&su5PCD+0B}C9+DDo9*UxAT`!r|N43@&{2 z#?H3vnfIL^>;$6NoU&Hz4##S9>+_6|C(nzxO_|>A( zp2_pHZc+5Ousuvaof?v47AaYw!jTxee1`Tuw9S5#DXC!A)e{Vt+5Uw>S zn546A@%Osco7#)yR|qL071m!RA4hbYAyOUtRu;{flva`IRzKWIQsL~q$TAPH)v3Co zT#V7(19f2OtH&(GxR)LEHrOTn`MclQ0RkkFp*u#bSQo1q=WZx7V0rTr0YJ4&GComc zZw72Z*w+p7o^J&i_l#0{(O&SAZf_bfX`I3w7Zk>t)a4e-ulFL=V>Di<|d)dqSnDk+x=UG9U znzE@~_JZmxXXi!CbzvIcxV~Qq4mxjmr1(uNQxZt&^2vtRK~kG1QvogM&L#sykojBo zu5l+8&XGwU_s=Gt8ie&4xqi9+9c>$)0juMh_xjq^7SP_(k|y`9TauHG-?&E4C!V|L zQ^{D_t3qD?y*zKQUu)nTSb5$BBu09XRG(LsJL{bX^;)^vwAZ{aY%)-n`6PA*@|}>m z?v3$6S_3k<=I)Sr0CkBFNgtZN7xog}lLgrEMmTA)`nI!go)%MYx|vKnhVN?Mtzjq= zNBsN5AVEa zmjwF89MRU}ZXq|B$~f3UZj#?E+_-=!!l{ z8Zaa_##U_=M(VdWEUG#JBCEXGH#Sq`<+*4a#FM?fU}e;|0ita-cLsZz87w`{IJ0gy zRljmrdo2dOkumraJ2KxtS7IczzYheYH7A+fnSpy=S?dAjO+n@j=bz7r1Qy})T?T^g zh59SQdd&s2ad3f&6nj3G0Hz7SLs54iAyP!PzK>vwn6)GC0hE_Of!ce5LVugoUu;%Q z4k5}w!$(w!nnO29jySl`-5Z_XZ2Na7LEOV;d7@KhXL>WZXWQC6y%^hG;B~7f`xt~t zt15FFv@#ksS}g|3kz^ccI67g7L*zEEi}Xg85AdO5JMHG1;qi7fqFs?&y}V=WR-)5JL4toZiTY5B)rGBFw(#;526&Hj{?C`RjI^tB-OG1H=k`TMfU>jldYP_dX6tYR&Hc^(aR%1l*gN!`#S7+Co;KJ z@`=NT;KmOY)!S_NH^|Ex`Ccb-)5jp8t3046e;uZ4Gnx~LTnJO{^;Ifg^Zzy9Wh{}Q z*Qre~O)FHYX!#az99Qh#i`MkQ@;@G#1FPak0?9(6@tD#~FGYj`B=Y&V_`nX++fHoM zR;B5VotP_4m&ADE%fD#?^FQ{1|DXlbwQ6As`R?0>yw$pz)?zZ%N zjBU<0xb3-Qedc9PYt!8oC~1Mc_isn_@sh=appm=Vq*vEehju5MEDHaI4JSF@>$JJb z5-xe=hNa)?wmrTw#a4YgWGT!+1#hJ%=8>0IP)1*_PE$@fmP1yb0bcfzUY{CW*B0AH za}5lFrU+Zho~@26f0cFo1+WG0#y1(8NiFN(k&eYkvBB!ArV?v+TT*PU z)4r5<#{Cm`C06wN(9Sy}?;NPE=XdCB9;+)Me>`ix76vK#+OM zKg(6H=)3v!i+3P_{(-`3_2CPBrax{E^&}vP#wpDPcZZtmJ(ePz^L9Z-~~v10!tac6wCD!APp-#jE(kQ-9aJ`01fMEg1ce7P4_aT6dZ?@P)-x zC~p&DxVvoh*f0YShYHNVq+qQ5#b}ewBs;1uQ4yHuV~i3fL4X)OENl2An)#2e6r2es zgBe?35by+O@{~y;KJQ?aOsQiZRwEv`H$eO}(5+Fl+dB}y0S?gw-L8ezkq)W6@|vA? zO?U#T!t%Ru+4sEH$g<99u=|rj|BpwE$V_Svk7S{*L+U}58%W7xWJ?Xq?PPAl0DkNX zLZq%qMAr*}JK{dgOHWjfvx)F`Ib{CzS@}6pBfMGd;3~`-C;ubgknUide>P~=%D_P2 zB&)V?sdZ^|AFDJk=@Vej(rNU^}^=--A(h<*K7)@6uxow~mu1HNC-!bLiU>2k*~ zZW#@GQ9>$ov9~vlVPx0}m%2u9ujg{4i_rfe)^yD`HPiuatr5f+RiNK_c*i$~(=G*8 zwYd0ViqtK65wE<1m-Eta5-fD?KRoj}(cb(-&#)&gGSDLx#@62E8?pwKGB3v`nbja* z17WCA+z3_>F4GWM&OY|ukz0oiHIyQg^`#tv)sw^_%6{&wOSg1V&?Y`DlGd=n8lJjKif7>tPLn8aEsqK z8|YzP6a{up|7j%mm1|f162e35Dgi4}dq`e;TVTb>?23HSRAplW0`!L zioa2g@7LFquZkVAjrFC!lLx(<g>tw!OUIfyB^6fzU~gMMw~V_K&r^Z<)r8- zdcDtL+_mdVG1A#M_LDHQ?)N~Y#r|Iw`Br;u+}5}!4+GG0T}yZ>b{eK$@*;>h`(bib zyGZ-z98G(KF<)%*V`yLT$ftwtS>Fn6i>o+c!dA?4x{h`swruYS%511Mx9}LV)_%c+ zDSb;iI!R!>y+ND$$BJdoyksz>NPK#KAW4R*NlJ`10qHPY1J9z&zl|;UROGH+K6hQk z$6q7DUM=GB7IAc?G7{#Om_q0HzPuO+R&y>HC9gwn1S;yXy%6a~v{&t&2|KcVy&q&% z2(X1^kjNoBiqhFjl+5xAOjw9YMWq3Fhg?i=5r*6teKn5=Y;Hpr!C|&Sq@m5SGG>8G zSLQE4x9!1R)%k;HO!NN`&^brcey+G@ikc2MdHf0SUHQt$3U)fgv7AZ+`|t93;Z1hv*jO} zrZxFC&^|sOw9?V^$+Tj6YNDz}Cg1#}m8ER8YMFuTZf}efW1bcuJdo}W|Dp@PhgqgS z;AEY)*Fy)*soef~mTbeRE!>;f73~_`dE1g+Lsw0sPv@uX%hsDk>=_S;Kd8R#{kds+ zTNcLoe_2B$?cKfMZJ-xnWuAyLzv0C>VVm61$9*i9IKNa&+(WSu58D3$)Icl0#J5&H z7w{IXa};Z?L95+qv*_AMyU;ux;*EdAx`vtI?K|?i?@jQto2Vp%!*aeuw1VtQ4aTg|J-iZJ+nGzRm0@EETO#?s9K%!Qm)54;oNlcM$+*R?XsO9t zs^zo0?)2cs@dbQcCkmJd6T+Vk z;_$P0Hq%j_YmW|V9wzav;z#bUbNMUAHf<{j+Xqs01W_OFkei_nbo=ITv{{Vpe8>Z;9ygz3!X!7Wh>$did zX>FTmBUyE6=Yj0widj*Xd$qpQrMtVhweaWSFNVAqrTDK)@o&LD0sLW)#MfRNyt4lQ zgwtO5mEp_J3D2NDve)16j^F$=@uz~XBmV$|p5Mea<5+`Ln^3g4{>sy)hTUYfm`~|s zQK^NKrAfKR-)Ti?+vR$x$w?;kwcA%+FMo^1$yKi>Cr%e>>XT7XQA=3H_e)o3r7o#7 zXfs36k`o>YZQ~@5mBU4RlB1f5KT@nTlOZcU}jvy}nM7GqF1kA4-% zS;y>G;cz)1!|{9LxCpqHZXSOe%ffGr<=FoKs!=D((u4KCS;fZ;e8E;;bT3Rhm>t|xz{wlFlFf1Lh!%7Bw9$e;p)Yb>Ht3X%wY z`>;Sp02a*BrklXp7dZmf4xWhVSCv$0?$1@yQTFC7+J$E*+JMyGQ4T zb&PICw=x4Vd}#P(X5wl80AX*0H&B6qm){dVYFT5KXet@j-{Zx&W4Pus8b^$6k7|Y$ z;AS|CU1e!doUMH&88nsB+EI>=t4-TOdJ&;P^Txa(C1#};H2Q0zURT=ww?5qXmHSla zz9IdNejaGrM~6Hy@q_l0__=N49~t~+{igNL32E=~Kj3$Sz8HK;xzc<;@RrY5k4dq8 zZ{k+J;lB^~PsW}%__g9Y-A7fs@E4CXKMzCY>Kez1wRHG9!apDWDnWZ^X{UJ7_r;oX z-a?wbk>W1`=(?tt4wZd!k(ngc?k%L%Z3&j~mP>$i*kNUkSuY((h8*9CzZHBp@kd_K zyhosZ&tD7v4_s*aSN1aaXW_li#6-~iWR|c&8fqRUZxH-N)t^tf@co=O6I)zpV@Vp_ z<=iW-!>fp=X*^cK;^G)4lG9h!8$)>Ehf%P%Nc3}aZ!Rk7}@t?eD6l1?qYXK3pCxwUrW z-u-UT`jLI%yHvP%6U09XwQ(GcAD?03-wmS8nEOGf8Ft00i{# zm6f!UO)NI2_LBXeu4IM@BzB4yo?jD0@(XojjU{N&q*#MXx<+?v$KrSF!6YXi@J}xZ z#!lv0TlSItphIAX0090ZD0c2v1g>An028^v`r0(JPDIrxNi?;MO0m+`*7$vIzL#1% zE~h`WrKFnWcD3Z7@3yzRy!L*pbLqeMMJ~xKEUifj6to)Vk1}9xc139Q6ivz^eB%X? zNe<`()Q#ZnKz;2v6&r!hsiBR#Oou9D)Lfw+ODTQ18)Q3klV2!*!p8laV`g#t2lzY& zX#%9bv}eanhzFiP3m=KC=GwdBRWBb`BzlniRsEbJ$Um?*!{^MNU^4#DU$j$| zLFSPNF!=s0$@53Jm1)0o@{lEcxjOljCCc!c-*qW!)wI@(TlKf;YgMrB*RK_)Dp%^c zQ%_rYyK1a`JuicU0F3zC{1hC)drHRq1}9jL|@CU9CPthK*6kP^VCjU+5XG-$+U&+q&feI&o=v1uCo zgzYBB#F|B`1GjMqCAqv3Dr|6ABt?ulE~-lp8`eB;@Mpp|mX;cy>}T-9Sh>B?w2fvX z7sY?t5n;BARRRA60vQn-z_z9-u#A)U4n5< z(xE7)8j(+1t$CG{bmirYQfpnC(ObFgcRm;~ER8lI3dfJ_4LmMGFes*Ls3RjdECYok z76p*+uP5;h&8D9ss_GU%vH4Kk>Gv{%`5-b`USDi%f(}q^1fD+WUEG&yj1ST4+%=LAKJoB{jvc zQ@~aJ)@zv#aBzI{frE|8S-N4GVl8Jyr=owmlI^o4oa;ehnc1gbNT02taZ zbF?0L5ABZ@&7GQU_#EUVmzFVtbA_}cU@e?85!Wr85RHH1LVjI4QqENd>p_f+;BJ(} zs1E>;tB!HBjia)THnWbjq^;g6$?2lMU%#TZ#4bdVz4lkK*6A%%eVVoH^E#IiXMA={ zfDiyCLjK6RLrBW8TD)NbF>EubVB9cPEL(N}1hUo= z&*T1*!xRaEOHFa7!oviUksEKxVUd+3fg3?2W=qxa4x4Qa_ zc|KbRi|v$$B^{kvv$uCXCmUW(B}Sr4cgW(er&VjWtFzMHTAQSry`+_u(n)Kls=D3n zds*EyYI$+|pg#Y+V0_aKj+F$NF2)`z#!)Us01Cr zf!71EAk#P7o|bMHkGdw1e|rOm;4sd3&OydWz_0%R6>$CyId=`8>!Smy0FuhMQ-h8G zVVoVLP=DbtKl0B_BoMsZ$DF3)fHG9!MmQW`6~G_~l}tlTs&ZfU<+ruETdM7=^%Qs8 z@K1Ysb?bh+?v$$$`HR~*B~Erpf;l@!0eHy`l1@Ru1ZAmAcEFh{c;HDTe5W|hC#YPT5$u(MU5WuoLmbS$rj!ETx z@Ulk~XwphqqLGzbYOqk-cRQ*L#PghB-MN>|q?-Ky01wdUrzEs|%Vn%n?QK@pZu+mk zL)tty9^Zl9JDiV};>TN&31B!Hr0}2_ITJn&e`o&9n!U%}H$ES;naBMf0|d5IDX*2I zK`qvm3l_)NZe<~IN!w*2!{|rOgka#X7zdj2an)2RXwz{}w`I*QJ7~Fly6>@cRHZv~ z=hE6eqt~Xg^lzr7(*3=^<-9Bj+w!aj_;4F?Fe(Ad1A&s9G3qQL-t7(MN8A2cjAsO3 zFk&(o<0FCwNbYm~#_9-ZE)_s0bkGRP1CYC0a|81)_qOwrdXYL>yC0TP9D~tOPT`F0 zQowW>##iRaBlt%=a~hQrgyR&GNxe3-Rn?bucGI?=r$t&)NqZ?dJul5C7kxHOt*r0p zt$Q-Y*+&b0YiXCIlu=6hd(JKoD2+%R&fkibe)u3UH8{rd2iEgbo?4y^i{!P==;*c zR*HJ2;Vo8{`>vM1%DQiOvycx2oNff4mANW;UD(b^V5Ad+^A3?Q01~4)-Oo{x#&W@W z9OHrxG4+-^sO~Z4vK){G70RI{n;F^1-N7w{2ZC6Js~=>NOq@!}dJwD>w=0$8Zpq{x zfOY_6X%$Xdxi2fU_Gw?ET5IIHX>J+Dz1oZ>$8I-#!0rShI-S6;%((?X%CeH;_4G?` z856XQ?AsC|BWHKqK2aL^ZWM0$*aL!o?3iaA{{V%45`0bZj+(dr7VsU-=AOwUi>Y5; z>H2lKiZVf#AGBTAdC^C;i!n(@@RIrS8CI`CgdpW8-N$}zmsZlwDeY&?)6DG4@R*9# zCmBUD4%E^(2NKV&&^`{{Urwih6#PHSV4?%k_-0MEh0Uj29&vXiI|0yzBzf`{*t``pYBb`SoMO~kZOfTE^4%_%)!FkduXK76$#IRj)1g|lR8+mx zn@w8xgl_Dus^ybws?nc0M)2=1y#WB_l|*2t3(FxSWzc7GsQIwj>erG%B%ixbMnPSu z2?qsLBr-?2bDU+owPLJTV1Rv#;lIG29DG6Bt4XK9qv#0bB-Af=S;2ATv`IWxuIsw+ zva>6BFFQvlSmkJzNX(x{UH;8J3X;kTX|FXqeNh<2E9s(Evv~m$ZI&Cj=5i50Pmv&Y z^Ed94u2aLQ#B^a>l1f!tX}1V`H?w!&YjkbDGw8CO0nW3W6D>Uw-9Xne801XM17tRGy`*Y!;DD z0^}|T1Z`Xp4hariklyTm2v}NtR`C~sd{?PMV{fAPddpwae8yJR=rMYEqhlQF?!zCy3=QSJ$@>h=-b+xgtDIMS)MCv1yqp3E!>hX zn5+^!+z8?Yj8^U>GR+Fe$}p$Uz87ekR;}XkHmI^`G5A)>3!s{eptI{!yUQ!h=Ku;p zGf5q;^)f{gM(gHEiU+BDLc31@+UVCl8`5F9w(ynh-S(p*yp0@QHt}2@PMc64fF(x3+%f<-IO?PECxfn|-*fQ# zGa|&KDAup7ZG(`9a1tAfgpClm4K2})iwAh3{{UF8x%ic#%K_6guZJEP+_G;IeWzEu znL-WC=1B5eKP%&}?Rumz~)77`5eS2M{uSD8P&1-X$8JMb)pFMRw5{x41 zE?Zf0w{23ovPo;y;w^6^TerH7W{n|>Kf9R6Axsrij0WDtN|t79l1Lpr;uorEQ(>qi*rjU3RvYw%&)4JVbdKa+`#&c(kmi?(DAb(caoyO$_;D zS-}7X!N}To2HH4gCk#md0!b%~lY$62o9Zm`C2TXuY zK{&zePH~U{?e}_<&}908Mi0ahfI8&f;!35+J(BNhkU0QjgN_L~BRC}RL8a$*diG^wr5Ow^&nfD*l>*&3PeZBtxz2EDO!#;zpP};S1FvV{%9K*!0prX$Kj4gL5yRLg@?D(`k!I_e!YW_Bk&*k5&r-^2jTZiSYZ2e{Lg>? z0AJUz1ETeRluh6GM>ODaOAtsIh^PKsW~k9GruW z0Ote_2KMNOQI4N`AQc3c1&2K2j2y0bVS;IZMsdfOPI6SSObmtNf&m8~FnonLAn-p+ zo?DZ}UNkAYEiRwJlDAH}F4y!puP#+~?(JpF`^9&&``4D%STEtrL?16K4^70J6M+8! zDlr9#9N;Mcb~zP?ha;4bs#Fp{`^rhj&G&+az#TFUasBG*QZ|tE1;M}x&I;j&-bEug zBRiNKxFGSllHc3djk3I1>gw~No)9p|0ode^x~uXKPbINjHE_8+AlzXXS!j}a-rX&_ zzRz73VRK44-Mw_X+ScpktF@EX*Sgb?J{-5SVlIT!mRzVtSiv6QH=M8WWr4>5SF1iR z4#{xgtWC|53i61g3P!oj@vOIuBOQ;8fg(MF$o)OKZPMn&)jw?$x zot(7OZoBDcv2L=8_okD+&9v{QOJ3h5t@vbKX?C!TTx%^M!ji1p&phE*dzLuC8~|~_ zCxMob0N`0%+%sot`EfG*$A$TngOWWIoaY(NPh)H0s~FFjc(O`($ooOV9N?dpIL=wW zhj$?7CmB1je`VSLwwh(JJGS|!doWy*a>siy0FnXPKvG8;1K7i59O*e)DfPUiE}oaZ znp@SJ)5gUoX*TbtyA>VPn@LJddGDuViC+uqw>UG*R1Qy`<(O{9c8%l=t^p*0z|WxC zwD5co9rrgZ`+BMf!js4uGAjTx+y)rPBQ?>aipQBGLP#SKx`1$YjBQ^+6lWX}$r-5R zjuKUjvXTfpM$&Si1GqPvf;i65dXcemYuKZd;pw$5S9@CWZP}}BcV*|=?(E6pruNZk zrkd!k)zf`#f5V{2jkTy$)1ZtoAP4eCm`MXaylt<8k%D%NfN{4KFpcNt=0lKoZQYPQ z_6E>)sbaWRIRgVAg{Pt!K@dfR+nfY)NM*|wI8%%gI)w)r1Lb3zd#Y*n1N}1L43Y4$ zBP_D3C{U_nizNz-1LhHtfPQ4!Jyi@Y7CzRb>A^uMNy)`V%az@?d!)Oy*``XAs!Nq! z-K`R9YiqlA^tSiV(}Qfo9K20(m(uE+=Bw zQ_AO-`PrQG#~I46K)reZI{{t>KaR54MpS50b)0U!t&}P0WUSt=Z5ocpTyS#UZ7pol z^-lI$r>3ntT=XqN#jrz|>=a4V2W1!-01~WlSds_?MgU+4&Oojv^8S0~-*W8TcJ3@y zMidaKxlu9{5iz!2^q@_laP4>oF1TL5y9h-OBvrhvClap2PYt@Ja-&) zz|V1!U!UfDOJ5q~pwwd1v?A=2(QC7A>qoWjj;eTgMa879p8ZydyCrn5v%U3Q?$gcz zSr zj1!!7&I!jE&Orwl?TmV4;=CA2t7*!2+pd>ZwUg2P+gjV5N(-;t+xfjdT{d0ag&dz; zXC!vdxC5^}dLH1ORF%QtbUga!(1ppyPV8f+ZnWP(F_3Z&Mmyt!fz)K2ka#?bO!o(` zAP#xYai6H{y0qw?je4tXr*_)i>%Ylp*4Wqx806#v zRB%1cFg^MG0V<)F0L79=1d;{`CnN6f8Z^UKs$LNx*a3JTGxn3I$e$arlE?HZEm*qQMPfmOWDj;@Qh`fc*p>5 z7$uYF?GNFPg|srWT}Iv}yiR=SnPAd4VVIPF`Ik2eNXTiCQ;p#^@I48piBv-m*=-Uv zAt8kwEv;9cWQ{SoA#Kta5;YPWs6eAB`c7NneCozEaZ*r9&ywxQTbFmFHCw61d+lWH z<6<+o!s?oBrnPD7v~Ogclk${qucEo*x*x%PGR_s$JbSIfr`oOzS~i9fOPPoxa$IVY zsSH6;yFF>FV1Za@RqG@Dy}KFmeoO)B5P+CyxM?c&*|*R=(2lgp0cMVjf&#^Ano z?5^c0AXGZC#3jvhm+&xd) zR`wC)NpsYceWP|-DM>eXeJRt?+eD5i;_G6aq^9qxj8v?zWwcXCF0z)kZQn$7Huhd@ z;@$`@Zlo*^*OWs7e2wzX^0fm$i&v|_?PAn_-}j}mx-7t_N-qG+szA4Jg@TK%Fh z012vUExzvaWb^}Bbz*1K9J-u_))=VV-CqKa0s zwU+v7?cVnMdR&TTcHNTM3|o%<2qX>$PC($W10y-jQg~RLZ8!jdl1FlI2*DuaIIz;MK#2=l7Y_nofo zZC7We+pG0<)3dPouI`^*`t-iKH`}%L(|Xa{J3q{)XgjvAU;xR;$Xp&z)2Cyl9kQqy zIcx$6#z6q~$YGVvPFNmz8R9g$Nj_Cq9u6Xs6_|3M5}|Tb?ohZ3$;rpaG00pD7U&OJk21E4qSMK1-=kVLe?1A)Pv+6~ zy|?mrdo|=#jl{qVfCpS>pyvae95VoV@N(Q5yn|^Zo-hZ^l1cgo_Bh7?236Stvb6~ z`t5LxmGxHDUv}Q9cfZTmQu2eIPC5CHCyl&vI336Yb{@G3K3=7{9Dq&+IOxrc1C|)z zeApc19GruLkVoP^go1E7U;)R?*guZA0Q1mvBRIjpBO?PiBLDzKb6pCYU998hqU&pG zeLC)n(e+P7besI|->t9rjp^!00G>zy^PVsYj&exHAd|?X$@eFooO6T09F7lA0NOLj z+r!2P$pZjqsLwgw$4;PwhUXsq1a&>n7|A%sPoN__^V1=ZKydw*&g-W{v`uNgpVR0y zrnheXO|F|Z-+g{vnA~?9XK}zJU=Bg&up@UI^U0;bC*QVmPb8kiWF8Mau%n?RP7fR& z*}(T7jymu`&l%`IKsn?bXM#pE(4Ki55&Zg!xl`s_Y?E4FM(no#0DunKf585`F0WlJ za=Y7Z1OPr`?URsxVnNC2oG=F*4y4sbvupwh04Y3$`@Hd=xyo+8PyxmP2j)EpUUSJibCbeGPVz~;9o??{n!et? zV!H3z_wDyI?z%1YXy(eacrH8O4Wt~5c07-~q?}`^40)y*4nADxso_b%AbMki><>}T z2D+K_^|@XEQ-DF?MnUHQF~=PS?V~&rK*l82O=Y_~_KYbda-0$YB}-tg^Zo9Pk_H&# zR)nITy4qS_ZrW{bpO0-pJ3ZdIbys>@OKAGp+Wjx3sTuM%`()q(IU@rAXQ}*fat9)z zCp~z;J-U3kB!Il+;C397$jECeZBDD?9OstE z&PH>9dCA;Oc`{N{v(f3j?)K5Y%hugQq`Gguy?nb}^h)c=Y*qwdXSRL%?&FjA91+p6 zz!+2da(^u2BM02zXN|z%j4Y%OMhkStNWce-@Nhsl#{`0Njs`)WVU4-u@^iQ55zHrli#;e0X~b+5;~rT1Pt@vjCAY{MsbQU z+audK80(OE$9@O5BpTu6z27&Un(L;ETl#q;7Oi`=(dxU~%SEdEt*FpPwsLSd86!CA zaqHI|PI1m0KORZwM{YTymO>(`7AKzYv$I2gtlwPua-fvGk>7wq^IsgCzf;wkCdvHfNRy<1KWlj zIuJPH2ZBKybFa<;JdV74xbA!Klqx-wZrdk) z9hJ0yqUg6Y- z-*vA0Y15^aqH**80LfDAeRN)*b@wY5--Q77!*Fl`=aZ1V@=3wS85}XO9lJ@My$%j} z?l>7xLHUWxagLqJEPGoco^#1K&N#pWCkyM}>MK&!lw*O^XBhd3<*||h>P7}IG0x$~ zbqY6X`t8$aqD$7+`T4YEr%QiLbA0>sxteWfUzh>7ADgxd05V1a1m`#)bO4@eSl)O> z2z+3v8Rux}lYlVWNDN0ACpadzS99b5M+I`A_T+Q8H#j&0B%B^I#d%ty@)`|j2C)4XwBSug=I zFh)QdO9B8OZ6|Qa0k+|Wa&hvJWW3T0$AT0N4qU(Rjt|R>5J~xa_fuGpX%YfqSwjr3 zWl@8{$>(;^eo#R;>PQ5&8u2iy%rSwrrDeef10kCPGEw~t6q(5r_TCo>h?N&fo#@AK2StpZdS=JyI<^-=KTYh4sk%lT%dX`o>I8pMkTn?wG$sA;-%2e$c0h`d0 zR3-sCMh*r+$jKa`B4F zeYqGQousJas}a!T9m9o!KzYXfpb|+8a1K6FRk~#IdUVds9snwR9(0y<-|~V zYl2B#%tEtr2VS_qB&$}%u8ra;kzf81yU>k-lFu2njEphDz0kK)oDIcXXADUgEmt7$ zzlbg*#9Bp=C66~3kpQ_2p-D*#BQRf_Hr#E=R8qih@bxMy@-=&J8F_jxy7u(Yj%de6 zZFSMU%JS9sTJNVrnTi!;%SUosuLp+7U1~mRSXD> z<7$w0?{UefWblTd?psRLtt3DW5@u_Af&pTSmoFYqJg(i}af!$yc;H-N&CAU6O71RC zZEwDVyLM}p#WdEDa_HWRR<8Ru-JJ6!zXB*^%V#4hcsYH$as~!ikWdgaj+?3QrLj4d zBuuCvv`CMU@~B*}T=UN00UM4<7^^2h)@>USJ)DP(0W^6au?2D(Hto1%sT=}%EmAIp ztz8_e+nu1P3o;Ca4BJ*I3rZIekj@aQfC1VG6-tbjjx$Q+ zmbi2LB;|<9WDrLSomwrYYu?FdwO48BuammprSxSh->vU`KKotYr}Eyrs4+!MggX~}bWa@(bu+~I!dU@!+zq?H{o02u>6TGg9Jgnjv> zVgSK7V!*K(#z|b{W1cwqh#0EFNQ4$EJftQM$^cRZRA-VD7RghRPdNjvd9`TbRqZ(_ ztreuwzq_i9?w+efqt{(*Zy2j9tL>w+)upOmFTHu|o~nAD$8g|a9A`Y>4CAIq`VwjQ z>feK&IVKAno-haUDrL zyB>!mjCxm-Tk8?pZpzv>d$g9Hg5O_DjYTG{Yw6K-eQdX~viqM=M3P2#DFB=TMj!6QzgLpnRz(L7{M7hIL=QX z@-d8Ymdzn`BL!b>0pOf}004ym0!IVp`9V1yt4uZ~qDeW)C2Maln(KYExh-97-rt_d zb+)=*`YjmSi6)iIk3X551HG0^ZaD<<&$!`87z1|)f&s22QpCI@oI7ra1v$sxFR+o0 z08^D!I2b0kZR~WZ;wCBONrDjRJF2*43|L19k0S?=cK~?~$Qw0KSYI&<8o*Rw;bdiY z+DHV(?n}PXSOka`QTKN3W7Od~?)3Sm&8ksSa=Ws6JNasr`q&doS7fxk?73am_D=gZ z(%p6`l#q?_62y(5mW-%5Qcuy~+MFi=h~aM>jTg^{zk zsszJvz{$WGQ^_k;NxGc8*5-<{v(ndX@2&4`^jmASELA#kNyW8)d1%wOE~zbin%&!8 zr?dD=;lIGSRV`$-_?huzP%P$a-wv!k3lOV9fg!Z;mEM!DYZr-Z@;%I&mFBgj!*g#K zjVx_sCPQw2gntXQ9YWyfGW<)_V1e!>Zw%acTf_blxU-Jk!D|^cO+&>xgX+>E?;_?K zMY_0EFbE;IL{{_5Yuj-CWz4#Uks`;GywhfNmfk=%haOl-9KO}sBW2nGw&i>vzTPPD zgqJ8Z?;YRxiWu4^OMeih-H3^EyJAWRG6Y}%W>rvA=eP38sp?!MDwa}|oMjs~%fOywMm{CCVTCYNe!li`lZe7>6S~YtxHmp8@st~Wxcd9J6y|d4~el_ zYc?9}e+l&u9r$+LucrGS#h(>kd@1nSUtL?x3>OplOTd05gTz|xzMXI*z1t?UyHOU# z&Rs4`Dc;^soaOOni|%AI-fEhpcaml@mX{{w9yU}!vEAF=*+$V#9^zt{ODPBlSczAD za`VP9Y1mJ;LwA0Y38ZCvrjFJ`U`t#y%`9_C8CcAaz$a3{)C?q{N1nWdo+0KI>SLn3tlwh;|Rs5Q;S@RHjJsYDrs3QBN({7Z=v+x zi1i=%Pjs{Y00}R|`KPpNTUT8V!X60KbngbFvBd;JD}5VNe+Ot#NoI&dES47_#||!C zqgA-@P4NZP zKplE^Qi_b4c8#a$A=h&_&GeAH+elm~W3wt1UDI$$V5z6;R~qEY1e$&3tuA7BeNOgU z@eq}yEh{9-(Ro3NmSF%WPnuRhOoPDYtZ|%+k7z`CL@p?A_a1KK9e+ zvo0j!Jj%DXt&49)nv1)#X{RMQD9e|;bx(EF`uoDa9Q--qTUjjhomasZg?9O>gCuKL}Yu#Un`XBfeM_MZKJV zWYhFJDIp8zeW@-{TTy6S0!fU*<#6&kI@eI|9-(ms*N8Rii<|U{+8cdZ+W6m#C?w?D zY5HVVYHiUIYQ%=?PPByySlEEJ^^R@A8FGZGW%S)Dv(`G!N*v8y#tKT#*H`qkS@oGW z80IjAI(W}#S}{=Ojj2gLX%|u4{4nrlhjA8NNv?Qudr5;kHNdj92S=IGJ*^F$?Va+s%ENR?<=cFDtp3LyDYMch)x0I+ts}&? z#i4s^4O3440EB+%+RY?pON}>EI<4i6!MC@6w7WFc5?sR*`AV-MLj5g|i`olIi!0mD z5^8qQ#M#qz9}r(1K5KFnOGj^}-CF&Y(tb?QywXBgkKdxP-F8oj9t}?qNugNyI@iJF zt_!W?J|Wj7cfo0v6^{1qds51VNMb>!#wRz@O510KD~SFb@ZT0ws-uOkQPSs!H#?^) zPMxCUj^|9Hv3S%Sfv6Lv&uk7aG3Ua9$&Z@HIa-l`hlh;RD(Y4vV$R;%z`~kSGdT)+pqAgp=(BQfFUm z_+6)bHTZ7^uVvvs3R?|EX>6>g)UP9+`&VL;ODUb@)bw3e^2<(GWP%%(((iPL?q#@Q zAcPU;e7E9H8tHLO5?)6=waB!Nc2$R0iff32A2eJ~6~uOu+FUCJI~lJg#LTi!BCA)O zLE>)}{{W_lb(XW!=ajL6#l^e*lr~uw;u|)+wu)A7CRp+!lgtSu5Q!dB=~Lj`eN`{4 zV$`JhTZES-G}W6;LD}hcxvZ9!Zp`u{#kqYNl-?IFjib#4HseyaEMk(4rxhr@`I3`u zY<`mIpBcOhf1%#!*Ec>M)%4f7RytLehiybJ9g|Og678Qxj#ScNxRy()EiMc;Z!^eD z4yv-l$Z6gQ{hR(UU*GAvcf!jnJx}{Kd)f6b3u<>Z*IK07Wv1CA&>_=pS_ZtGP)#j_ z7I%=tGD_FR1-XcyiZuOX&v^v#9Xi74V-v+2o4x6JurnEBxxc(!H~lEQkPB(rSC&&U zn3e8QWz^N5QiDvi)HUxH!)0%J@ayxK6G#fdEw$aftP)$a zNS94+RKn_TZE9*#jd{h%CX^>Qq|%SXp=C7Hn^Kdtw%F>A8Ah^%YhW^` zTVL8H;UuKfwKn=U?=#lCS^FUPS6Kenli?S{i%YF;)$U_|0{GqrvwO>%7$keEO)tiB z+v$2@&l~Po&c3DLe~5l7@Wqs^qF%$MSz6v(%se|5m1%O~ zHS(<8qbaGE$*edhd_Hz z4JN;(Nb*MQYo}{RQ?%8sq_sgHg7q3pX~e9z`c=#mEu>y#Y2z}?OjMm&LNbM<)RT7P zwXGX%rCACH~Xylb)xdfKk z+_~DNw}ZEVv9d&fDNc;ZlLnRIIg1GN35m)O%&MqP$HwUyz`#|EDzO4X(Q%SySbSV{ zsaFvw+UhcmXB&IBTHY%9T`lypOLCmB?O8&SlUI||r!BQjIX2qUeQw_7admatWik~2 z8c8P679a~0LAlVeF{G-a8+jgOPY)+e&2yx$2N`pHomxuKUaw!7 zZw*qUBREs$gq@W{ugv|__q$f^ovr1!gqwnP2FNxOc!y1%PxQuB! zZnJH9;t9#Uip3(c(j$p)CT5!A-cPf{jWkv)FC|5`ONk@oEbDM%+3D{k__m4Uxw(=AMV?5~;rz&K#PWXV^4HEViZYU`P3rFBWy@?qs+L|f*_XXd1ChF zB-3Q`8XcinmT?hx+7oO)u3zwq{>{I$CYc9|yfxw73JK&}Ks-s~{VvzU`s|WKNqdbW z{t|l)dMjo(VjD>=d@JGYG)NMECVwfO6t%B^!Ag8JtZ5P0MXYMlUE35>dlKK>>319N zJo}`$(EL?%Y2o{Xa}vOob7@gY_EO6P#%xaql^!z1;$x(#vS4Yu#G^ z05zqLa$X(aaPgFLEZYl%s?(Hd#&L5>$tIkq2}vuY)M@K0wBG0AM0XHKOm_RV7>>r4 z%HfvBQHVM&WwW|~HNDJ1Lp)KJmPQ0d%O*^WEOxBTb7h1obM{bW!020nD}F9HvRav zq?)yqqP0ym*L1IRm6n-?BDp1)?F6^q`IKi4%;A_f&GRX422{6NXqG!k5v|?exsBAr zG$0{~%PT2IjG1FAAOUt@`Iv9@iZNB(H{IN%eCSd{jwWHtF5<+Jo4COZ&>opEG-|ls z!AT?&wTL0M@^i}|C6osQDai+J;69SRA_@s8r7f?0H;QXciS5%)t5d>M*EdCXd-Z<~ zp6&I%{X4Gyn+L}aiWUhKto}LHHTyVZNfO7ztezvV5=NUBZI_54)U4y&tjf-?0#qqY zn-S|$+s9r3@f`cSaq#0znT$at)O;4U`VIE&yG_IC_S5OwJgTl%R=0yrvx$pJk%&|% zUm7Ad12-OH9jUdU*tr?NZh6tO~QF?TFcCcM?WrTYvDOd{bx)z7+9&)~On8 zXq&^Dys^#^6?PVb?GQW#R3nG-Ttw-#qkuBm(i}SO9Xl z48vh!L2})mjpA)?&RE(TtC>V{Ker^4{-Q29u*2-VwJ({JW6s>oF{8X*BTNW{gr%p|$fh0L*EcpJi|;k=}{Z3A1^ z^b5I_Rn@{++-i54d~G8zN7%X@W+lK)MSP4yg{q!dW>Hrav7EjXow2M z;=H$ax{65v+U2LUI4bhULSXwFYIpZh$2Os?CFPo^@?`N3hP*f8>nnha?imwRvbpon zvl!T1qAA?sU>HR$rPtxS9wBm5!&8;^a^;g(A{{Xdb?BOSfqp_P^viN23S5>yq zuWvLsBec-hP||b{6!<&s@Y!jT-A8RMrE2nNkW6eWEiUY2X$Ri^4gUaw<$u9XydkZ4 zU&J0H{h)pi{CCuTAIIVwF9P5G(m%5&!%rJ{yTkUrH`9-XJY)TX<2b$+N#kD*r-(EX z`cH|4zmB4xTkz|xhNSmaF{Pcq%bK5t{vK+LaXrt%Zvf2=*b+VOg|B>1;Twx}0X&`5RD-q$Q5~VtoCx)kXuWEl1*{H1&wys|uo?R+jPl@Nh zJ*_3GPnJz6-L-cYb$cZjqm}IRKS+KNf5BvJJQ@zC;;;B6XY7}D%^Zg7#UHWn#&3(? zv2TbjAf9WB*HJIRpB-vTZNBBMbsLDL@aiCWr@6Vdk7GPvt3L|A;NmaY%FfEtE1Pfl zD<|xuuCn~i;a`e>2mb(Wj|f{9WqX90-}ao-FMLmRX&>3vWsghJtZsa#m|L5BbdEOu zR_}fQ#>CH~{7=(0>v1pIVX*N(fc#6~{Y+dJlQ11e!`B}W*4g-u;z`b;_Uh`&(-`4E zIZ3_@d|a?sI!1-zuNB!Y)oTqu$66!Zske#}I%n+2ZU;KqvrLb18{ z3|ECYJF6+Wc$iKu@wYUU(~Y%tDrlcte66eVUdO$L;@nMGC`!C%8>ac1l{W1Z*CgVh zDBDX(G@b1AcmC!48UFwUtoQ}-@V|j{pZF;c?31W!I-Q_vfB0=**+1il?6>h2-r^xV zmT4cwuZ2D&@K?hh3F?!*q zY9A3VJ{EY3;$Olajo%RbEg!}&fJaM@+CuPnoL;W4rvCsh+TVx#Q>VcVzmNVK>-u$!4rTjX`d#W-@0uvt zq>lZgo;!&llqZ>QHSCtkk$IcUfIY>Jhxb>W0M&otHuz1f>z)nqpOV({-{>AM);u?; zEG~*Jlg@j|Be=DBRx5&nJx1C~t;!;fIAdBc`~i)_#r;xx!YWVUS7~%x zq;%KMaMPx*7&%F+x@(a^r46H`66?yHwfAhSkMuFoyf^zOe0BYqzhqB|{{Xiqz)3zh z>Kfndt>JxJP59NO{3NmQ?y;lzaC|BFZK-(6N7jBT{1EuR;lGI5b^fnyuZ?d*v+-t= z7OASG>{?HUH2C~dEiQHbL&ZO_zx)zM!!T(+9{54=!}eM5?xo_(2rd2;d*0a$i{gjIy)(l4MxU(s-@|%dr6!4a;2Wjz=BeSki!TWHQtB%$Tf>)M z#!i+000kxg0D_$8TFhQ0vHiO~Hr(pw{w-mD;W5&@IpduQZF1hh?4!K6(lz^U5$N~V z)|M9+7FODw$A>O2V6?lqirpZ$y}c6smGJZa3w8T^Xnq2`_+R4>2LAxTIX`KyhuWg) z(Q7{rJ}Q37Ul0Br>H4%9W%PFv+um4sd&7SPJO_I=sU^H-d9PDcXl`v{n#ve%L#@xx z{{X05eNDsJHtEIlN))Qe-6piv#yTrC{L9_tOxl)pm&%-D9WMtKr4`Dq<9kJW)^c9* zZqHd=CuRCq`&|D3!56+8c;iIYuXK<2BrnHLg1;4fes$#dS@Bc$4E?CQ1@YJRX}|F@ zTR}gEJWb+13H(iy;fMSo-Vf9U+5Z5rJSX7Y4%<|+dzkz!ug`sNa@N0}pYW(Wefu{4 z(f%R>=IiTrZ47D!}{B8JQ zcHRb_-E{3k;xCEdo5T90=Y>2mf8#$9cw=4CFW|q{yfvKd|m>qFJ`HPbZ7^-V)i)~CL{z2wBJ(EMhaX~xTmt@Ldt z!(!eyA8D3xYj=5N_cn$900mY50D_h3{tMT<7klx?_B8#aJQuEbb5ih@tD|_&#J&LV zea5Nb?Qc)I(XTu`aet*>d>^^6{@b#XQPZw2q}B!1yLp1j`$nB(c)qsP?!RNN+Gkz+ zR;d2~@IznPkH#J&d7`lJWaq(u3jQYQlQbzX7GD#-7<^Osn|0z#>*MxEeNqn!cxpG6 zT|?|iA-vM#wBSB3{{X=#Kj58d@N>q09CZ)b2VDK1ulysSN3N~s?D6|?YJU*?H?3Pq zs9I>!L!iatdHNARb_-Y@W9$G;T# z`^Q=)z2JR6U+@mO;oku2n$DS~YMwsQG`n>1mydi4@iWI-HkaZ%S>caZw(#Y(#r~_M zLp$l(yc#&YxHmt2kkQC0=2%GK@SeuCT9l-d!{cKoDM}9Waj5A=Jlnas!ZO{bq4Rl; zFBd9RIjcfcVx<`J)uiKP%B>hD&g`^FC1jgXan*isc!poG7QT|vWP-+Kn#VhZwdKXb zKuX-K#^z|`k#24-+DMjfGC5*CYKCDq^h^6Z>c1QOasL1W;QfyLbMZUJf3v2o`!BD< z&x;yAfIK_#WA=FPx5SMX;kJk2AB>(o@PEcQWjaO2g}y1?{6)IcwCl}tP4Op$JXNRY z`eui(_)|&vm2;t9uBqeekLNw*x&k?DL{ZKd7%r_u7w*NA=sc(>wjj(jokPRruPm#p|#;x4!2{{R$f z{w>ne;~&5e8GJ3*d@-*_;S0S*t#qNGd`R$B{p?z9hkX{crr29}i^85V`acvnTR+Wm zyfiW>x|oR7Qi`W4QIsXhlxDuL`5Lz}S52uqrE`}f#Neq`e_E3EdR@0DsHbOm&BaMK zE?;#Lk?^D9MB2^wz@OSv_H+2teW?5^xA8xR zhLX|fH-0R%@M3t=;m?h&wB27reMiGyG*s5~eP2_y7ZO?Nx_62{vb{s$2mBRp{t83; zJiWc2fIn-W82m`^4ZWOmU3?e)vHT_Be~M8imwRbpEv?Ou#kKm(_Uk-o4LOv_#S6c3+@IUr{_#5yCUh%z$#0?kXuB+i+iXRhZ z{{V!u!@f1&9NJ1H--$FUeGqtc1(W!9Ui0;T8{6G!mil(3;|*KGQtBEl$I6;_f<7H7 zk#D{p{3FqH31>3to(IzP-x1q*Lr8`jD0IOEo&CSWd*6s7MN1iOOj>hzvhoc^{^sWP z`qF!w?M~|Z^DLu0@IsbW zwpw&{{{Rv!^nD`A+fPNaiqlNcg0-EcwS=u8k~^yoyTg7e@W+9!S5)|I;7uRHTGT0X z0M!>()pYGmEbi6qudVI;K$_j=vji7*PWJb3T1q9J8D_DTTgzFlQsbL9@Lz^Ao7BMJ z77nv~*HQLqO{nu-tz2(?9Bj7tPiFze@u6h%JVceEoLik(*(lqVGnXuFqtYq9&dERQ z^H2T0Kj4^(ut(w#k6#S*tClFL-Zc0>@jt=-YO;c^Z~R5z4Hr$G-NLMb?ic$Uk+7G3 z328l#!@snz{1YeQ60Nq2@!$49@e}V-A-4Fd@WRIQG>%wqu)XmGwxbI(MywJ`XqW&C zlmnmPe@pQU+BK+82|;Dy8$iST6T_ZBwMfwltV?Nq6!z;BNLLFDf^9f=MUV+nj=6vR zzX*%OmhkwQS%C?8r&@(2@N+Cyup+r2E>&QOaEPcdto7$dz`VAK<&|}^SN2ewx>43q zlCn>{WVPt}dLQe2?9nQ#3ttGX?u7X6^lsd6Nb@{E z7a*JfN6DUmj92---1tMlQ4;OpZ7+Ta4gHIz?mRXXLR$tvGXDTM&JGl0lE(^t55Swk zuZOh6C!mu@)5bw;fL42PmN~%%9a%;~=V~5V_#>5Fxnf~B-&p-h5xUb(WiM5GHTjw@ zE}Bc(=2+OhEWWW_+gPr(lS|3@KO_AkC-@cnHOu?Nw(#5JaAWv`sBI;H7|QsFAp{Nq z>(zl=k;iI(1;1w*0blIz3CPO(m89|ZrEqtZF6?(};DX}} zOW0`H zfLK_s$(I|pCY!VaxB$j6#^6+t&0Ou*g?t_Zd42)#=nR{N?J~(TlOY7i+HiDW7z44v zA&A2QRPa{tCx#}UB^p%QwVWs=YbdMfze~4!UsT!ZVZ2JusW|gyb*B{Lbty_srOR}e zHuin{HG3=n0HQO;@Sjb}+v?r`wAi>RnwN%c6_3afWO*csSdc*xyOo6^+K$T3M7G-B zfTUm{@mGWXX`_UTUl(XHF=did@~yS(G9!t6up}Tn%%p9S7|E~mho8V-52ViThMpRj zhmfg)#@<9wRj?JUwB(Oq3>$2HHss*t&J4Z)@GP=Qmfs6B314d}s_AUZBxiY3b1k%P zBb5#mWFd_UTaE%p#{3Du#tl-(@+OxoRvIss$}KDVMYXrL=+5=xt~OGSJRI8PPEM@V z@5;92^tStI-H-IAU30@p8(!)9)|oA(q_ITTE8>kV3qx@#w38t+$O24C$Ygc7noLAx zlgNrq?fhZ?0Kw9F&xbWX6n???I!3*uYL{?Ye$8%!iFhhxz!oTxP4tin)LZv=Z#k=t4l}A zcV?Zhr_b?68C1>k`qX`eHO}e3X)4omT(hSxRToYvwbc+2lx}=zll5}`$Tvz z#hxee{;Q>UW5L>V8vg+7^YKnC3O^9*dgaBYpJ8t=iz4vqq?cEA;(O<{w1MSomdECF z0hej=*`PaOL;JzG*r;93V=moQLK0P9E~Elhrn!PE+gWVxX7VIM9JV0GB%!WimKdar zc}njPyMkHbZ25>$*$Wb}qkhd=lxkpVQKxvyRAmUwCCr<)s{5z1T^*CVvH6Y;QiWAf z#Y)q?mE&i1)kUPcHlFv<>VJ2(zBv7jkv`91`$qo7`soWCO!_~K{u1e8Rt6*z$$JNh zqXtnFYVyqm!laUfc?ubBTDr{x#6JNge>cPaEd8A|9l)P6!@nFpAHvb@M|D5wI`a`4 zERuPP9Ei!}h|uf<&He%hhV=7+{{RTB?2-U7(CU|{8G~T5#4My`R|IT6V=2iS@};T2 z@Qv6Z%)SWKWIaF{-OyqI3xKVsG0!ST1QU^gf~on;@(jwQlbV!MZ<)fXviEo8f=yXo z%KClp?kMNjI#7=`8=b2~DOE}7%l4y2N%}Rax^JoeiTYl>V>$CYKjS?ZT`6`~@b~Q( zX>5rcYrQAgIftwj`E6bK5 zxYgnM$-z0e%2JKmg;v+XuG6HFOH{qb=QS2UBiYB7slbhm#e z`@{bL1V-@>#Zlv5i;?^n(ylFheX4vkvzJuy9k+`758>Cj@Xd#c?Z36{TIa^r(a2ib zd(Ah?ve73??MF}4Zrb7%w9|lZ=m%Gy;`Wi0wYY)r4#)l#OWpZVh(*b>o?BA)FzRyY$lg@UO!H~&aPm(r zx=P+uQ^pF1X`*#kSx(lAb^W9C#9!=R+B@S$jc5xd$i5`_(%i(Xq_*5@ z>PF!CD15S_N0LSI&i2!v`tE2^+{i~D*uS7b#{ zS>uuXmCL2OtVhkk@a85C5&Fz|QsqrjmDSW8lzEhGuVlSC>5R@WQ=5{dIX0}@RHVMj zO@+dE~&XCA0>C*>1cWMvrIH&C27Z+O{E%inq1twH&bP2qIT8WUH<^7O-^X-*XBZX9A-BE-pR#O_o0_H)jX;YHl*8CaajXU^Jqp8G)(z}m zX1KYz8pnb>5GJvmZ()i#rn$0H6xy>~`M>-V&*E$NYv6B;^le|`Pk}xf_;XSCv#a=) ze+FOpV@Wp)E{oy4CrQ*b-9KB_w2R67L8I!n%PettS4`AAIJy?AXJxEC+Su!t7V~~; z_`~+2{i*&Y_zPS3VdL-G9QfPe&x_%)eOJQTkB9sjq*+ZThde{4c!y4Q)or{xWvj#X zKM`pfUZD-9ovFn4?QaUp9QKk3n>9V!zbxXT6pkNoQy;np=ff%iKY4?o`S#F9{k@qdQ$*38c4+ z=HE*_Ud^|vNb+cA*jiY(T31m~cC;X*QtWC5=HEf_RnD7lWvN2)+J>9KxAt0JhxDl-yL+@22FBd2{E}K+UHN;W`4j#M z0pbsc{x|)WJ~P^De-S(l<9`ZS>0TG{9+#)+5Wj;h(n!82csgAv^i3PZB5hAtDW>Wd z7YTQvOqcr2os`#?_Y!D?M|t^Y7wyOUZrR&?jvw0#S&ljF6=C}?g}gbdUNm1Y7VD|a z;oJR8JnbxUOrP2^t?j^uUphy#i|pJd#BbVf_NMsB;rV< zks*hArM!<7h%&}X%7be(vMa|cZ1@Yu>)@pE6{VJop?HqpS$_-5ac`_N(L*2hZk2pY zaIR*IT+DT8nlYXLV}aZg3MJzM@24}oq-`#zz44nFBys~3!L2rDF|7#7@zE~7ug zow-K8z`Z1mwwm?Ysrgk|w7FRUBpj@Fv6fBDpt2@al#iIPCbVA}EQ*kR5BO0TRIeT- z)gVAZf~ukqApup5RTpmz3p0jo@wVgRUY!s=XTkpf3t$0-kHvb-%ES)4M3OR=V~iC@ z_YkC_uGRZ0xU4K;cTZ)yr#`%?YZ$nv>u<@N-p3Nsw7Hem^LnLiSGwC;zdoL|?mh`y zhAU~}$gU*>p-a6g^3@0dS81F_HuB121S*g)0hh0d)RmIct6OiS*Ub6y??abHxbc3OGh4KtA8~5Z+sKl_WS-Hkq%lmT zl4v~5!CoUEkOd)#Eh*&uFQ?ny&*7~)V)3rMs_8b&@$ObgEp;hFIs%FLyKKzKaRNsa(zI=ee9^I>_&1=&6VAWY%9aF%)Y?K6mC0hV zFnpYRfU9|I4(2Qjb&tVc0~CBw$?@w}EtU9kU5NmH#LH1Q+qiMJO;eDe0XfJD zae~Kh*3idcoiv>(G~$)rDO%p`+gz_iwtc$ljOs$7Pm#qomebQtT~{=dNv%4)dme~B z3;0PsX!OCsQcv6O2^epjwq{o#f^oDN2ns=D0o_Nz&kv?Z(uM)fMdjfHV3pgo$OMu` z8`A`-QC@Q28$3kJ1b+?OoNWW`8nc3=Fad(uC>wLZ029|FoP-}2ykjZ-$HR#U1$oA` zAqs`aQL+>x8-OP{7~BXXY_F`~8&;uqx3(U8=hsiNfwYuqPx@pW+w9 zDM<6QSz=*;0MK(ORno7-`wKgN7crGI}J`nrYfrzcan}>bBYKZ)N*MpgV@Ovjku)b1BA807j|-=Ol## zEu6O{UG~c{kh;X2WQI2P13BKO3geQbk;x2sKPe<1B|jB>NO(7Ta6ILQhxE`+cMP0c zs6TiT2GDkl5V#^i@k_*Vas8tR&tES<(}yR2Agn4t0N~&T;c!7vD{t)_8%oiWw@zE{ zZ||+OR@0-=wutr>)uh_8X{$XG(`_1R&0AHsdmf%{tmMvhc@9`FG0(;U+mBb}VA5=ueA=vs3`hpv<8D)SFfq6l01Nx9301`3BIbeUn$MGNp{iirNEhdd-+~bBDQ~*aOp&W8PRokT;T^5s2lU|!^9-RBF zZk5)S>S+fg+IMYrR(9EJo~qtg+hfsgEUeVK1hpYS!-9<|$zPbO82g%aahMOcpklI}MI41u_ZZQDWI6?i9U7!BjCT6m^uEv-nvCC-}?o?B}W z%7{(~D~tDjyla20?IFeMkBHE8kn%f?nJFuFnoW4N#1mew`k6Vs?80OKMlV<_^k z-A&moIbfEyTl03>$#lAHnN)AAptaGrEt^_hD>SbAJ$hL5UD5IkYB9Ay-uPS&qoD_e z$pOdlWT_Z$m=18Of(Zk;az11r6UiAWKzsnCDv%2K;C~sAKXZ6^1Qw16agfJ6LZm4G z?dK%1!Dhi(c6iKSl#_P+fW|iU+(}qmD!wps!;|uk1{|?e=cll!+g&NkuPSZ*{grg#dSG1ff2EH3rAPzyub++xx&uXN6!G5Zf@v16`UZ zv@LidNCDH~iCKZ$`^`etLWA=Ha9x;i!wg&HRZ)hvem9uIhPMG(kQZoFe(^EA{{VEk z;c>Vw++cvfWU_lrZr?%i3DlN13vFhq@XRJvChZu8V9gj}u@+Q}h9`5f010k-ke9QR z-8sc_%JOk)+9r~_*7wt{t#@jbSgS{wN>`1SI!{|JmsY#l{{WTGq5M|uZ~HcCib)Lm zAAqdE$P7d48eP`h0fMC=kPn%NUI-cIH9Q_i+M2XtcEihWSKr zGCN=r*ismsppCgW0CDkowB0K2nR2d3yR~nJ+DW^5G@5#)ZETMG685r>C%q|6Mmnu! zB?#H-(s#G#>#IA%3&@XkZQ=OgP++!#b=RezdxAqtY$b*=pqEo|Ex2XMsD5#D>K0KY zyIfrAFK;{Vp6WY0cenx~93{QF-mrycB@X#ziCjtMui7Jpqi@hJ3w%8Iec??8*y(== zb#EI*rOgetqvL;xcZ=X}46Xgk#WCG;r^BHrfRnkQm&J2kTU%^+ZzC=>Xf21fH^V9Q49jz42Y|F#bzAElLMzsElxxynz+1T3;_(E;3E^b!XHml<)Wz#Lz-sC*PQj*(DF+IF{4q>)kH_CXH zc_5Z~%0~ytUN`-&EPO$wwwt2(3jYAb_pFg4>RvYS9I<#>(n!!o^V#@6!PJr}$dALiT1c8Dyh|{+h99uoy_TCa zaY~S~%W*C3#El$nER8&B%@fPVUb=`U~iry~|8C}15t2BPDYJU)Z6nH)zQU~$x!>D{#Z7yS5 z>q+#h%WHeJxN~h38d4)a|V-!mXoPOK|btPx+>=1+z^Jy| z9H9&(Xw|@T(+r}$JttG%T(VBdJrs0lzlQg1U9OLF3|ER3v6G6HS%#xVF_r16m1Nv~ z+gfVLOG`QXD>Rjo-230g(rDf`j{95C?zH~^7HSsOqARC|!`=kY^pi9%1lJ1|?Oxu} z+T24tZiW~I+(=R|8abm%^LuZBS6a7+W$}Ke;?D&58JAX$*76C?p(WOvZ8EDZ#-SCh zwa%D=IF4elvstwnVU0zdr0X(CFU@`!@t=#lBKPxnQ(4qJHy)!DQBJx}qjsNYNcTOs zo;Q)>xM*c}c-rMW$XZg7$g3l)$*KH6@%FbIcKY{FKfSZj zoVv7p>nvcY<7Did^tnIY@87;K- zlVpJ)Nv^c$>=~t)$gk#4=Q~JRNz9U>wSA-T)8Y4rJUed&y>v8q^=aY~zN6xOzBchp zS23Wwmf%{(uxYlA$PbWWcHR`p1@+ug#O>u~c*>Nh{_->TuVj+H*tNM5@4qe6(LE1u zBf{Ww+LEW2!Qs^yuW41d(>?yi%`HteSe+)Ti=SM+5N5e`wzrG&;_u;+Fl!pDW+=qL<7+EOnl@8%(QbD3aiDlk!h4I$-x_$o;uf_M z#?ry0-CSwD6R@5wh9fY#xz%^t#L4G1w6_MzRWin!Y*yvtOWq^+xA5ysyqeF&J}F&e zP>s?yxz*qMX4c>B5yf#H&kJ~aM;0o;5hKT_>yIQLvp11CkoPptiJuNNE88fv?-{p@ z+F^4Ao`K=-4yT87tv#&U5nk$Ab%vK5_YgFtRhH;n!*r^`IcCIhkBg~_#Likmq+_bm z68EEMweK|U?w0mVJ-0tp%5touDyIq+tKsWaZC<7(y*W-YnowW6Q}UzhDyl3NEzYS?NcGmXK;vFkX(e&eSW{@l~*jm_FS=gO2+8AV&uF);x zVIjG>os7a6Jgdh403WoC9@6&Tz!x_9*0}`20X6QMFW4~?k#lg(dmXy!5#cikg_&MW zvUzgAHy?YSQyw7~GtCq-TUu>jj6w&kGFBmKv>BQc;xENYrtu zYdS76nuoJ)F6x~`*1W0NpA669-EYO3uCuCNX`U(Z{-t+qr@?P5`dlp>M$*V`w4E(r zy12Knj_yTEac6f8)9L78+{^mDz$GHLerHjzg0%zn=# zGU)gBCgS6AW)fzzc|4e(=kn54U$i`9@e4-K^sf(VTD{MO^!p7&*rb+=tqogPjwX&N z{Pxo>V8j(;e3ZJ z#8k{Haea8!a+OHRnw2`&sqcHsnyp!L>ZIIt*6!PIIuFI48~il4yzupgnQN!qJS{xJ z{^Hu^XP;8FwTDpE5qzt&dw+295j^QE(%VRaIGs|_Oj#Z%_{ZVRd%^SgTKB<`>K-MO zN{Mq4DVcRwouq?Qhg0$wRSj;EN#t3ov_vyOBBi*=*ptB;4~uk59~*d|$F>n(>MJGn z&8!->n`tZ!cQlhep9B+6E5u+d*69clyDV(-!DlDxYJNi?(00*_W1htsh#R(v$X*i;SNuYB6?Aa`Ro; z-E>;%zLq>}Zf5G!R4CV{R*b)Q7gbYIP?AgCg5^$W>#g5g-p9@wm7bxd$s=pJW~qMT zX-liAuPp4?5J()`Z=Do^OD)u03gBUlQHD#Ks90LqB18c#9iAj`6F3k4vB(GJ-7AG4 zDI)`QeI?>gjgcgGHd-Czn)#eu=3}qTr=KYQ$HJ#g<<-ae(tY)7h-$#4fT~b!&huOg*SO`4;X-ORL zNfElX3FQ3Q$3eiS=FI2Ii9z-K;OmU=WMi}gfE(r~oF0{}sOlp9Q6huO3W&LR9gf)5 zM#UypQ-X?j70FPFc}$$xH^QVcg17*3-zGYM2qCfT0q2He&2HzdttGS3$6Gabb)&yj z)$OJAvF9u7?3MhROG~@1{gdga@Oofyc+Xp`me`J3P2g)4B!l&q;>?H@^Q!{1L@GA#y^K0vOwwFxyb2)0UgJ3)5d*)Ip?9|jAVX?t_i^a43$YcB^%z?)!#)QCEERNMbiHOgRgJb z^RU5>!;YkKxFBSVjt@K%ez>6WI&i<3>)WZo8SlXD#?&}&gyTKBdTu9zF_GKm>ymJ3 zxIOsof=L4(hfI_60oOeMz!asXk5rcJS*vWk*50c7h1aIb@AZ56enZI51GqoJJ^A)0 z9XZECkTFjkxXu9sxX33xF^~Lo9Q8c|Ivjd(4tVF+9dVt!0CU%&6)#MZ4oE%DdYtj= z#yJCyFbNpkS6XYn!@o1Z10MPGA5+c=>@X?W;PvDlIu5Ph2fw#b>~P$S=j^c>+sW1f4Sp!CV*K+ie${{R3l zL;m--x%|7}(&yi(IplHousY(4>YUbyQ{JmZnj;OEzO;oNiBV4MyEPI1&8rw5Lw zAoSq(2ZPW8cQBzXt?0iEKQHNmcUKhkY-bqnlk4A}IQ;tzWGi(1PwSq%{$GxLDFN$_ zndy<(vFE;U3ElnfGEErh82)+I!lI)UtZtZT5 z?|&_KB^`SA9^KDu;C^G+`W)b#XQprmz6W3a$31by9r|?o3m;GoFoW`roDd_S|n(b*-)IcGmA@exc4W@1DNL+;-=o9{niCVtVt& z4?unU44(f0PeUg-8@lxG-#O!{#s>tR-7`i>{7!HWT>6al2e2UVjOU&mT+-^VdG(wtITh8vqVRPfopm&p6|*Fi2g)CzG5I06cdYCmp#w<1A05 zHHpVSI`j3%as09|#!8b$x__4bpFdEJ>(zc|c#e>vkuD>)jY_j0DP2`b+mj@_amdQP zFmPE&&icl<@inrzM22ln=O7>wqC#8@06c_}Nif@TszR{N3b7>8i^I(>B-ZsrhX+1S zocDJFa0T%k0LL2-m03%M>_FOay=iG}U@@gxJo|Sq*00-~!}>oNz`) z;f_hNeAHAKB!a;~U9Gehz|SP$mp^o{BWYvowlRQam8N_Fj5B=gk%AW>U=f|nRDwVN zsSD^~_B+#Hyeo1ps`3 zR4Kvfv=DmZa2O+@=OI{UBmtkiH!vLMZgG|*4tfF(KIk~4X4(eT3ZU>#G5{cPh3ddy zmCshlB9&XQV}rXpOALY=CzJr3DBysgfHF=A@2Nuthlea&Qi|=ikyqC5``dlS3KEk_ z?Y8W#r)B2W{*KF4VH#M8#tV1A8;;|Xj2-~OWGPXRk_9zOx4r>TVq`{7hL z81*@R4(0?DIbdYB1oORX(szoEP^vu@n3F}l^+S!ug> zTfMJ)T_ksn0JT8+ozPGha8{8b$T%ZxWQM^k0)TOs$p8XRF@55_Hq?}{fZRAZ4p;;L zfsh<-c2ao85szj;#d-bB-1D((o0px)-`;%$GE*t*xT%7rSdzchbUBicQ(KWShKiwe@RNqE<@n zcj>Wxuj-eXSCycQf*B!ZjaW7T-?fJ9^dYh_jO2{gFgv(r$vpJWCnR&|5Ih0AsEJCkH2~8Og7eubkrX6aDO}Nj)Dt zoUEO%WVDLkZp(JG>y0H9X!6HxQq`+1bzX|j{-vFRjP1jIgE_z;j-A2h->Im;BRMCa z$;s`H>&5^b$>fTcIQ2aU&rZ4bC$>&_KI@u`9{I@~G0t<>ft(SOj>PlFJou*+qbRi7 zzKeZaZ1i?leqH>pqKaDH_G_y3zkROX>!WCXgD0*zAnqsAjC4659>)}!$0w$GjCL6G z#t%`E#xgpbs6N~dnCwnR*BAf*2OgLM4%$Y3LOJh{$2iAw$LIz-@N-{msazQyeK_Flf0mg7h$>P0}LijIq z`zP0K64gTPduW{uzQzn@(tNse zwXLtTS4$>x*T+(e_oaC)(pPC+XwqpV(_Wn{weYB-X&F%?d03JZE=KH*IKgfXPvf3D z`k#h=6L^nbDJ#Ns%T~iQw=p(C0!HEHvLj@x4XEuV;<=0?DX*e5Ukvzn!^j4erXbc2Ov3I+?2`@hN9IVxBM|7pe8fA6c4LNc zr{#%JN>}RHH-|KE?h?#qu@Y8p5nQo`sp%zYzgE@t(DCs(oZ6D5?q5s%P2SgcYms>? zH+9pmBcgZ{!d@73X<$ubRsl-Oc*64DHXDN!wYP}C;9(yxGe{S9$q|4jvbvJu^-*;x zX1RkZwwiPyEv@5V+hP$~TP_*VxY*9PlLh3D?^L$-lQeGDw(~8FL1ehSxM+0fp;D;A zS*4sl)sYC=$~S_|BOR--dB2GMC3r`}W?OA8ajj|!r6heT_mQ#Mr(w#vPsz` z-KD3M1t04}t0QHZm|;|T{{V=-Bj_3f8)zlB z)i0qLI&PI9ySIUmARlkl+cxf33}lYf%Hx>ic$)-#{o)^p{v+4odl$R=4wWM9eJe{p zWQJq}5HIdB*E)tUr)}J`#TowqP>~KRiw<21WNjS%o-oJ@XM-f9myto_24^eCRzL-Q zU7dKBR=np&0U1Ug4?c;trl~7h)?IF%^zM4tY?djhRkM0~u}a@%+g;m#diz@=zVScA zjeEqZ*7MwXR$2LMt)5uy)Bt|%va&-VByTS~axgzAB@`OvEH0spzuGq}l4s@zoMDF5 zA&cPm!CZs1lAwmjk9r)w(7XZ;2t1X*7{Mph1J5TICZ5d;HzX=!xU1|y)z zCp{16n9TnG5sjObYV{>Ht?xZG-#6jW_%X?+#8T6yWMzGp}k z58Yw`J2w(kU|^5BI2iwpd`~jzD64Ne6B@0OVtgSW;8YS+Fny z{K?cDsV5@=1B9yiqvD3+-CZDQ@wuT{2+>Ae=a>DRsNK>lvy!vl;AWPk<$03J^qWQGJ`kOD!ZUpSC{exv46 z!~@v%MmeWm_;e3fS_CbKhBLnYe2Or%GGn||f2d**+ zsxn)$l5>mZNeq`u77IWqR-i4o4(ooOHlk_la2d9Z2Kb zu5;Xm>7I?dI2lsHNhbR*mF};u*Ijk6`JK}B+5P(2>AP*aZRBG$vQ9wB1Z^Y$0NPJM zjEo)zK^Q+=38K^EjO3Q;3E*Ikna1IaXM>T!Bo3mMXe737r)fOk0gRjs;kg9hgR~Kr z7zUjSJfw4vsm9O;sRxn)$T{a2#z3x4Sw>AXuHNs;&wF0o_1Dj(MQg5)ZPo7WqE~l% z+eNpomZ7vklEWXFUIqcj)DGvUBmt9G)e&>ora#t3(i!#E=V=a7dPJca5@6xNjSzp#&h#zazG^K+lB~mPdjtZ0N`_-+yjgpXM&`5A2mFG zAOOyKlb(KHK<?}y zZXHO*;s!=J856?D-eh?MWrD9DWP_3%k6fwU!NU$t+TH*jNc1Cif4oLBkUa?@vQ7aN z1d(K~QbQA*WH13cA94UJHx4%E10&b&xB3150G_Vldv(_OeDr^(p+eI4&2KK_V&DLz z{G^=cBxL90JxTe9T#e6$(P;wX%O!!x2PZplcpoX_8OZj=TY*{kb|JZp5I`Gt1Duus zZVWTuuv`q_62w#%v%R?x&Og~!Jm6tY0o{V2ka7TI&pcoeCl_X~w@Y@?)?S@-`3E!E z==IlKcIxzdc{Odcxwxze1Aqa}SdUVpA%@-nADPZcBmm>590Sh>JcGjkP7h#5V0!Zc zu;Xb2bCbc~fr1FgBXG#wj-cnTkR0^~9S9iez-Nwn@N=Au=e8?&)Jod=tA4ipwDKCe z@28V@*(=-gNo~}V^5phCLCHKGzQpsMgyxRtByb4Eeqpp=5J|}xJc4)tcH)yh;2)G^ z92{~-UYR2ckZ=IaKr+7v<3|TM7+f6W0!M5Ew09hnw1e+j#|ke2P!WKmBn*H-CnTOpIT#~u3XY#BCm8RJ2~*h`rmhbHna87 z+WIwPhP%-o(=Bhk)Q(iKa&p+@Dua#KBPsx1qy@>P6E^L#VOWp|?UF{)6aYW~dvVDC z;Mb)ciZLnA@bF0lfN}s)#s(PRjycH!uy1sQyKV4|ypy$#21!y|1ZQ>uBRn%?@Nv7# z#$;)>;|1SjwfA*NX|GLsCdpHhcKEeRTeiO|>8>4I_F#jS^uc1frI01bO|v)8YZEi~+})2r88TUV!6 zz;qn};0}O~L&qJyo}!nWf%W6AI+i%c9=s0coQ^=p9G*Jl@(2T-+3&{D+;j&aLH8b+ z1d-2tS)R9k`FxzCmnlZACW!AIuj?;zIo572d;8@ant|-_O&il z-s;{~eXsuj18_>(e@|;&{{TwbY=ghJ<37VUKDqYiA5MV4z#|;z0PV-!9WnvPC*}n3 zdCfGAbDVHGfDSs2fD^_ulgRw(LG{4F$j=<|4oDya$8Mzj*ucuAiTAbDZ1j3PA8*3W z{{VP2{I^@XcDMDm-iJcAwx9zU4ag@gxZnjPiBJgO@ImB)cmxpt0POo&R~Q-jh#>NE z2{}8t+kwktILSHrMkTe=BVqRtM?upg1TQ#j3}ha0l6!Nsl8Jay2RS1u7Y7Hn#hF%uDbP7T1)nLipDpR4omH1`HnMy#D5Sg&O!bV38~{xHJHc6Az}#z@29vT%N0K_ei5c*_zna0X8DJa=&{u(Fjrkr|I_m&j#oZowol z2N=NxiRoRG>nPbYlhdxZ(QBrbTRYpTzKA8W(^U4=Y?n)0rSy8c=qZd5fcVHOj<`I6 zKJYlscqbg;NUAeJK|d%XB;z~)peYJ)6ce|wIX`=h5vYTbahzZPPjR?^cnsta8A6JB&?g90*o4W}evh3FkfD!N+twd}nt*QVRO-L*6Jn*2YD^77Z$ zrpu|%fcRtNppTs7;NSvzAPf!Mf(8I=5J1S5-UYsNgG;iwmhFn|jxh4G$k|xJ!+=?v zmD{i!F6jvhG1O@u8rD2ZAZt|eH2BF`Zlo%ZNa?W1kVyL^cLxEL6{C!>SqSrE4eMHT z8b^k0JhhJ2IhWwXLgqqlnSI7hOIsykB!ItZInIM$?|wT|gg{BHdhuHdb4K zQdNY~5_T|#Op)l;wpwPB5<{VA7Cst|FvYcNnPR`x=0X@BGWE=^q^|bkYC*VuC5Zo=kkv->#uSv(-B(uHK^w_s3W;XV@Yw1Kz8xHo?g@k5CjPEO2kz7N0ADexx z-)d4w%EL?3ET2r%qT3<=09^CPF0M%>6q0S3TXScX$I@lEdQi2a89OV~<@?=7OSO%zrFq;(Br%hZVBEW-yz#!LXClm(&H_B19fDhX zv;@O>{hT65YMsWrsCarwAHyD1o$H{AUlh%6Z#JV~CzCVj-V?KxT5C(`Nm!=V+GuX% z3dY**&KV}2@6TglV25CJ#GYgtNRY`K40HaIs%mTd$?n*a%>}QP6D4DkFg&{G#`314 z8zpPIYOke|w)R(7S}!{=Q09`mR#&~Aj@Gr_n_uUv_igWW7j3L+%rAUJdXdDD7Pqls z1+~4bIaNrl?BfvIS|I@f#Ea&IRC%M?$tu@fM#wmd(m5q6s@s&P94>ODw(wZt6rM&m zHa=$N-R+A8zPovxft9vGBSW~p)jYP)&HxRw=4XBw6Horqf&dMKC^AOjGRN}(2xEdI zFE7oK1_Ll9M@pt?Vd7;N3K1|PI3NKaUqT78)MoqiDZ?8_*x@!LbcTGA8s9E`Im{@Jv3CywZt%3jpX~q~FFhD~PGC?Dr z^1*D)k<@&$0m_}Y1Q1BVf--R2@=aa7@d=dxgDI86F*|Y&Sb##2vvQGwJ;7s)bM2}O zgE%~OBQ1}V=No_kpOi2e2R?w4%Pd_zRpZ|JU2LrPyH4+Ydb0hTulH=#zDex7{Mn~6 zId$NGdXxc%2;d#w{1QOVCnWJsltz){oNWN*Nys2%f-*8ez}=I(kYu^f^{aB?yUBzVgu`6dref2?0f3x6`DU22S7s z<}yY;VSu2>Mo9#bmr^(x$Oej7M%t8Y-tPJ<-C5tKqfOrWUvb&pS#9>jZK_E;s|HobOet-LqJxe`X|iiKTmfkdWdY2fIXkeyfH(k*oDs-B!?fUf-qlk{ z^YY1B)?MxL?R{5uZEY%-MI^4HbmFD5j<7H7Y3AM0f_Y~R=3rrqM(#-^LuYU&D68dyPdxpNm8=dL@j+p> zP0%PYt1^OAh7BGA920^Hl1L+(>WqO<8!s&s5xHJ9To6Y5C>UT>fFl4X;a8KNZvlvt zg{Ld^zP#3at6kRm+V^Wty7Jb7vu!v{-E%GUX>RrCuDu%4?1Ck@5twInkzYIvx)yQ4 zWswyQ>|-)E*Ek_nk38k}oo{UA%Gxnv!Bp+@S(AYl!Gcat3mDwI24V(JLIuLRGrVLf zu?hfa_#_n(Wk6O#_lEV()*Dy=De8B2w>u(6fu!>RM8I-x2GW=acM=I1EEX`_Fm=UN zIZ~W0qiM&LJ2j^-PObE_z5JUdl%FcnPR;Vk>h$H&>iX^FYqK`nMVe?n&}W9u)cxRa zj_`s{mzhfPSw>?8*oEC~G4gUVch6+}RkQI{FWqATl`ghQ#T!whA1-NPT9 zY|@NBmvGRKLx8)(FxtcdGT8&pqM=S{xN_NPD{8N2YbEaW>90+9uX)Q^CarX&+IL*L zU!v8ut-9HrjJ_a9qRddU0NV?*DSWB@;|T*lm>Gu(0r^=-+;a5f*VW-wxP`!GA1f?C z0(mWljZuLt8H*PsRY48%vFD#wTPtAl#{&#yRc0w8#^4Bvh{qt1V+G0pcPYl)mpL-{ zklaF9BLxZo!W)k=J)q@-MYrZ=1YuZXY1&H$$mpIblou;%>1h{hUQHy{jqdO98&l_Y zvv;+fv|C$UEzxv(JM>4T$EjMhWTf${mNKAuLo;W77h<>Eja)kr3hoS<9agNqEZ1xw z%dx$&`O|2cLb4sws)c9!R0bA!*@}?h`D_%RUJCi>@eYZABQB=^zmsMnDob@)8f5{A z1Ym^*LaZ5B7ZERt>>P5h*p+OR5<5Ix9COuQlBO;S&YbSj>f62T*3GADZ+}#-N`s0`rsUqQS1poW_RS@2 z_gkKib03A^Y^BYdjj?N8ONuwfYQ7xZ(6==hhjeOx72HLX5bC%w_OYg6*DZ5QWm0dQQyH<+TFO$*q zdhTr&mD7S=aZdJpz5UxgI(ll4eMn|&R==CVx@MC;$7GSOV~RI;W7!?lR`OZiq`~)r z<%^Y+AeKjtC5>)sf@s&;G@tO1+3OZI7n2mXDWhB;GC_8#v)hl}3u!i^2D^$w93?>5 zSwUgMH^i-GN5uXlzPN`VnCH{1+7Rpkc1vSp0}t=Eu&?rndKR zl{jIi3wZ&`0>(QpvM~jVwoHvHF$KUvQSK4JPF&M)ZOJ&f+FIH>u2!u2URKiUsQt9p z!#c`Zr0%Kmw`<8bJGkt&www3$i_a5l^I6Afd#THF3}GYtH1XRk(Xb^#d2eP_bCS7; zGD--MCYev3Il1k$_km@)u!cpI4jx+zV=>*y4?94=cdjCQ2^bLM0#dT-ULCr&SuFKs zkgR)>CAnx_SUUx_Hggd?2&OlE@d+bvLpe~&=AhQ^$}&N2lKE;RVz&~RWd~{8%PgoF zPJUw;SmVY?a&um$9#~2|vWkP|NwpZqWy-tTMbTO5zUMt(ZBe&5N>XvUdelxawbN-P zwY%N?`pG4wl0u1Z07XK(j@aRN_x$PQ$faWWOSmef(QsKy95AUg7d8;@j_&F;V0^{< zWPdOO0z!e83hAs_+0V%k%1GKmZI3P>_n z3nkohubVB|49?6KIXk%+Wg#%Y-~buU4oZc?DT&N*@=lF6%_NeQrsK+;uC;e|{8pFP z#Zjq#X+^att2pSBveV&vD`}7A(#foCAN?C zbHy(BE+CELirxurS_o&ixP{=JIh7vTMVbX<`S#yckRpR|BgoB#F+}Hc0>mA-a-ha| z!zerqZzaw2)pZgGlKuR)+6L8)NI@B5dD>O}WDcWnBnEY0%E49Oj3y;sQcm`3na$bz zs>^$=@6r05(Bd3U9!aak@}&fffZ7+QFfSB}$7 z)_yN|dsZ=c=GM_!EiW~16nHu8Q%&)W^cH0<5wBj;&hiA8l1Dqe!+je+inX8kMq$-- zsdNvIx((cNO{{p!;Lfpg{{RV=fo9hXo_4qJ(^Iv*vD0r%g<8cet}NkM5v6D@W&&CN z05%2v@SIB>_`GeT#cgz+K#Y{~<12Fj+{?N)eB7+)`IC5b0Y+3zwwlCR?X>!jg*;CT zl1Xo`=o_G8<|38zMZC~jO}vm~Bgku*rNqwX%eJqC&Ac#+lb#-YlT&We=jCrlA7wuj#2o+wwtLDR%@PBP_$nvE)M5R79PKXx3I9OAF?gN z#I~pSx8ki%#Uk;S_8z|+YX~~tiyCR(C}AGdR=T^k5#3x#y;T@n!4m>i@*s{eA0Pd_ zeRSs0`ZOL?2aWe&4cat zDa1%qn6lIC?;^T7HnFX1I=+=|+JshGe}}IjWYa9tOTAL)-mUD@+rg*X$M&x|>|=?* ze=K|!H3Ph&v2`uzYU6JFC?%e8* znw9e_TEP{=N>Tod_*wfvYab8%C-C#(&F_fpbzOVG7oIt>y1KmZRi}pZN#pSy<7%2@ z{vz@ApJDyGyw zUCBmUwY{Te+dO(WZXU%-4tRwa)Nl8WQk~`QMI{euOW965&)wy!np>vN%xSfaHQ9x` zT;0!lAa#mZ8KsW#ozhokTbX1pE4Q5-YL_y$NekQj`BN>M^XK| zJ{xJbQCav0;icz+>~xXh$aOtiMbrF0E~^HQePd{z6G*Qk@VvJ7?PYr<)~%|4!a%x= z*A1!7X+7*>#>q#3v)(JjNk+CyTAes4Db$TxYL1+(N}TUs-I5)JYZX>`$gfE+B?+_6YS`hj6Uc;$aZCeg{vqj_z>;7k6u@IVJS@ zZ5jzsC@wsuLmX1?k7I<4nHUEiQ6%pDME?MVvEcszivAhaym^1|gX0y8>sKw|MuSb0 z!gtdx{;Xq)c_#23uBE4IlI3orx6y5UJuBU5cCevKh;;T_XuM-k{g%$XZD@WPd};9K zj_#ug92z%`d?TxTF7X;Z>!r7kPM2JQ>ehJLOLR^4+Qqe^ODaV?h0Ce;GR`8xQIdvb zHA%U}H#JeJe5x*7)j1Ruosw;(qfetaF}y7aQgtvDDp#MfZl5Zr4rMDiI4*g)Ue>=| zZGGRz7TR=*Lc@6QGcU?KgShX)fU9%n?>H<%q=>4lasw_aPCHlJR_6L^hET%{h$Pwp z8+^E}3K-OI>SRR<40w#TE3?-86Y&Saw@+>3F9vwKPgJ;TQ+XwY)yAE1JR&7=Wvbb; z>AHq|!p?0ax>-%Ykrc1XFHPZphaV9AacN2(#%bP7JrtswPgQ&CZO=ckwnl$3wRKidL!??@ot0PRY%(DSW2g+rV96ky zF$2|nF{|ENTtyw6dc1I{NoKgyu9`-gB|Dv($8kjw#*e-`i#vpq0R%gi6t8FSZ|uL~ ze-KR*{6LPwO4j6??Do1&nXg}KT8u0NP{gh+z@2B4+VjgP74F7U?sB-rB#i zr^9PIq_p^j@f3I_-dLq*7TQk@L8vXnD(eN=(DbI(wJEkAB7d?^;+uU!=(JvSwS~mu zH07(}XANcb6eI2A;c35TP0yJn4Phwrb1Uf7S2EwaJ zx5qyT{8_npqLn}4IQVPhUxzxhQtg2u5_q=f!&2Bqa!tfh$8oCos?s8%?lA;0tJZDy zkK?Zl3zJP3v3r-&1;mU&) zA5oR~o5T6Cg(`JDol2hys}~3Mc8y6!U3*(imtUXE_%k}od8JqY>3UbFX1SN9HKqJepe#>6b<%{hS+}cYFzzFAwt|y7y2HAQ9zJ2clTi%*wz zYb)(^($nwxhiVPNr8d)&zUo)H-L#_bt9I*j?Dy8Q4`AhV_P^6f7}=-Aw$ld^VrXHG zNSQ+IC7EJn$SJ+mgF0Jl3&xOYo(b?5iag)-ml}nI#+Q8{W+0ibw8-A#;HvzK<};LJ zkz@Ve$rVD-TSjgToR`i6v_d2i-#V#rvM45kNMsPm>QzzK&37tS5gf&B@eji5Gg|9f z{-xm;U8{{_!a9}8ld+r-@Y+sLxG|z`Sla{5F{xiQd!vROF2ZN~Puy8g;~-|ySA zP1IKRZx-73Y?hZ^>vCMLZ#UZADqeUK!M8i1i{bwOhiq<6LPKNY9Zye)mphj-U&fZ9 zz)(>!BxiER8;K)TUUN|RPo%C^Z6<#WiFZdE+W61G{v?^4u?ia4zKMEW0w~y*YWoH^ zpjU}~UM*Wh`#;(rRkgL#T}usf#QL-%PW-buPwaR#dD0 z6!Er`e{pfA{3-Bni2gVDf;k1TmqfDFJQwhbPq|!9^Z291`i;`v-CNniiC!CHq+L#k z77Nu`*@iR3Lj&(hqJ(w#WR=`iz8L&cvwb6Neq}20(Q|ffskD{s^b$E^9XQ&jWlv_>=ob>rdd%gc^*W7$xw@g4f5N6h0t$cTK+dE8q(+Dm8-A+r(cI zw9gY?>DEc5!7LhPpQY$}XNz^evs<>6;al5POFLh(o-M)z= zSDqF9n7?Mv3wWQy9|Jr(*K)!3>(3Z`MAfZ4IW_(8vkfk_b>S@&T=8A|+pUCNE|wXr z*5A;4MdE!*_dwJ93uo}NSny|ov;jO?4}yFrt$1%h@D`bDT_l!K;W#`+phUO#*DRM8 z_qxQF{vp(_77LA6SGK!BEPpSW<~Te}`EYS>;&PIVxu3g#cFjiiZ8>!NI$Y|dS;aJ} zPEG4(+K$P)sVhHq+fG#4Pn)CA_;cW2+0*u5@GY;y?+1Jt_+#-0$0grY*L-o~D5upe zul2Wr1-zR}(>2c$YEK4*a*)9v_GX`H4xKz!+hWq~0tP#g)5s);tOF4@AO%kksW_Zf_ z8_PW(MevV<^g^y1QiH@Tf2kR!D3O1}lFruSMw7{wDH7=>@lAtBAoJL?#6cXZ;h#56 zo@qWYTVBd8$}GATkKz3`Up8fw+gkqsY3thb)^9w@(Xoo+c_O%-c|#a|!zFGsn%wif{}j;CarhNERAp}CqXGp2zag%#7L zm?I5&1((cU7ycvadf$ZnOQC8100F)kd>!zd*Pa-EqLGXR*8YGN@Ch zh@mLbid^xESDb03%^j2^sYXle-YKVK+qI5aMx@+jC+iue+HFSK$v4a2P4BusEP3IK zN9W99BHlo`JAv~AQVgnjuDlVvuvKW~8&roi=>7`vcA05lwnjVo+8sjjBuh;`{31Kg zES_5C7;UnO+ocHLlIDGNXsW%B^?HN}5hiDappxT+K#F+V;EG(JP%)<2cDiJgL4| zq}!FQqhykep7%?2Yo~n=PO{dlrH^>OlTKw&0h~^(xCL`45weY_q@XjR;Ik~MyIpnB zX1kLMs@dL#+@($Bnz&S80SP3FI)KM!5;b*Y2+F^7b?4zX#CRMhh5jV|&ptTv!^mUT zG_M_eD3~lNl1R&KsrYYOyhKkeftBIk9L6PgSqa-0i2McdYr$6bvv|M3AG1go@8sD- z5A6YWrQK?CqydekrLE_Lw9CVL z?}dU`zwCA44L4G`ir!0gv;C!P{6{J@>*pg+rTBI$x$ITqk}!i)Yh_g}`{K&x9#Ycx z_N>*|L0eR5k^Uhe6vG&>ZJ zd)(e?0U{AD!mV*7$CDgN!GR8CXuxc4+4Db^~8*p z5z8d4rN?y>`FP7hW_d(tSz}{`K5?t~Bjf(73)x@(&7KYWG{xPZ*ZwYegT=8Hlo7nx z%kdM#HgVgKPS^xeT6vG=Lkvz8(~yt$ZT+N}tojGRUxB(_;vHJ@fD|c;q7QbZcnC>ht>~#BO8&XKN+{bYgxG3tvMzfkU#zWfh&F&e#;9>M^F`91>)A9csy51^zNf%CUaa5&4cz)zLl!=;}filge~AUL}Nw z8&j2K3$b=95K8m+zXLux7G+P`cgA*Wzheo$1^7}ixECc}Hu0=-$Rm#|8Z~kiGaPQd zTGc7R+R$$Q0QK#!v)*2I-uhbl>8gaZe9LvJ(#uV^cGK`%XiImh>5$>Cbx1V5s0taD z;_NU1nO!`)U_!Vc;U+i)fiBbx+0$wf&RA)B-kp85!2#jEjYNf???RfaEEomKIRJo$ zMuGB?wM6(k@q*FGgZ7*8*0sDc8KU?X;XOJvV6TNxe02BI;WH~LLaIt4gOA>v{Zrt_ z#hI85OZKApfuqV1m69)l5o*aCc##}kt)GjoOad~i6Qjiv#?R%Qfl47K8);5bvPs%8 z=3fil&d*i++i3I%(~?eiyXh-QYS))-HjBT{U7@FIx|O@zX||2y6)Pl+WWT=9w(zp0 zyFJE_EV4xwBrG06yM$q6R%W=D7gp1?9Xd3(*8DqZWMh0J7hWfp>&jq}$RcF7iYY>| zYkAoo-IhsbXuOq_6_3I^dGJ@`#k9%xpB*=hV4aL{_=e*2d^KxdHLyO}plEVk>-Vt~ z^4UJgXCfT^onn}XrIV=e{{ZZ#u8kt!R`Dn8Pz3U&tXCREr-C)4xv`e+)!KKHQ1MOY zh3?qd+dtYJ1&mj>C<8?cmMGlyD#G@JWRrTQXti!t?>=i^Rq%6Zr=wLIY_*e$io05A zX8qn(Kb-k`G~ZsLdmH=7T4>_Ypo}W3J(c@v1<*|Krr8b7oj7TVlFjBBWgc{~M(GUZ zPnCaZv}jwvfv+XLJN#XNBdoB)$ApUudx-UYPH`3zAQj35A=}Gn!vXYEKePA3+lMjh zf3>f~3;ZYAKFt@w{ZCNy)W*T1ONH^H*!j}O6f!f*8e1cx#V8V?Yj2ppXsr{&J`cX| zeud!A82G2fwx-|2chg;XpTk!E8oY+);$0TheU1rrEmHD$WQxTUNqKM-O>Xj9TPn>f z-SbMSUhgfJ^Lp*OPrI^vJKFncIX6u7=Z;Y$w?+1g%d_ptb?#p1qSwcBqV6W12npl0%skOm#A!S*5&j|Rg z_rd-k(mYqCC7jp#4Ab4&M|m5|81wC}H1>B$S&J}B_H2n`K>H?;NQAo98lsIzw$+nQ zvXV|Mu3PPGUH5&?SvHeu>dN;|RMXunblq?>{mC@V48RbHMC_<43p*nAG~p#|MUkVulS`Q+d&&X!KYxq)>krxIZrP>VX@I*)GzW3ZW<>7WC+GZ5yrBw zO)cN;0_`QXzp6o`TtLQ2qL1NMj_N%Tj(iNq|&rj z%a+e{)NQ1frP}VdGmD#dQJuNBbe6vkicQ|uzShychOEC0{vSx?+w_Or$g zQOI4fTHBKNWDZrj;X^qn?GyYo_+!!j6!>xEAcgYe*7q@D=m+jCF2W-Q3Qj>71hSQL zSp&ph7A%MSj`rl>g3){q@iG?ASq}R>H}{!R<)2~OvD=L7lz8*v!5b#={-Pmbcf)J& zn@qDnM3W7!bzO4q;RykNRj}Lw?7=D&>nLI8ckJWR@0OB(WqG}}`_i)tlbTDKI;W+f z7W7tk_rE3OVfQ};yc0Ld{{RQ{l^7fg+sT|J7z}xa+E51KqC*(ugUD84jVHh_hY}EF z_*-or2-;(9P-Ah<*9(1vxR6+g(bR1Kk}%S*jy!G=g~hLqY*_(QduM&8-`g?cGef3H z@cPjqfRea{?p{EwerG3rGA|zZ`^?)9#Eo-LjIlul{{X@7?Q9R3SUmb>oixe;=_!g5 z!A|5t7}phiE*eQMWeKP6U)=2*+i%kS3@KEz=1$49lb5@$meNgmEicl{Mfd~o-ao(K z%N58aw?(RN2*+y=-Rc(Ia$L6Ho3?;h;!4=I_%ZOtA+-1xOO?1E=@y#fWUzGuXZEey zec3R|!AWSz4Y>m}vG}*+8C~|?FwlTIcK-lqct86+#!^C`B-($Pi}MCRRhaEuGyIbq z(fG^b=G16>Pw@I^$PA`U3Djlx>}6%r-MQa@4i}ZkBmlg$@VI2x?v=ctul9PWbX|7! zJs)VfQog(VF_%@UyI*ymM6Nje8}K*QP}`ZfaGx@TVEb1l zLGWkcgOk7EPlaST!)>+I-9ci+=WNAQPT{-eTor5+&gch>{{UzRKzNtoOoS5IxUjl` zxyq73wT~;8W*lx~hi5Ici;M9C_L3kE?Ee6SQWZOf*`!C#?5HJ~Hk`2tyavfp#=ySK z3V2kKaEt&f5}6-^*5xlf5=wv~VkNO3LvEJhCHI|(dFb|sXqs_GxMi!zH(gblN`2FhHt*ZsQ-rnz;~<>%Rv&sE<>)%13{ z`!;szvc0zXG+1we-v~Kj@I%1>sU)gPtSIup#z9H)i-#B?aQOhBELx$H;Ag@a1{>g? zf>nZ%mAdgnM1oiXJe#xxfY>Az3R@1}CesAEpY5#}CH@ZhPCyO=MXBjzg#q!8Csd4v z1e25?F42w@xUK&H2|w+J8x^?tL!cy?Vo@)x^5Kh;HjPq5+(;!=hSK;2NKzLEPYZ3L z)zh;{_IfR!O?CT-YE7rglWxyQwWXJB`=&j91AHvpS5Npw;R|twB^da!X@Lsl61O^> z8^{~LD;$R{8j=ZJ(P|$CyaQmRruakQNrEdr*lj#QshzBGaAVgMpow>&knM$}P+*19 zK*=2qN5;Rk93S!+{hxHpMIn+mUm93jmOIANpX{bUn}UqGlA)Ni?nAXrV|n{lYgm&* z_#fcbj7gI%&&6#nF$gSnJh8*6+K{f{lt|H`Optz0G(c7Qs-*1Fx=C3{y>0d%m9|=H z)6o@9D($ryE%dT)Rjur;WS!mnBz}1Q)7JVg{4U=VMd3{wM(}@ybX_07P($I(7Sj6H zNz-mF{vCKfRMqXQtaYPtdmPeh+LottbsUW<{{U&+-N|n)%yRv%eXoSS3_K^}4~E~` zcit4!b(g;J7ON<|xz)98D_4Tv*~N;yM^1wBIc+T(2~3bYC|+qxf&*que~mxezYsn( zYBpMwULMxGbK?uY4d|y!@E!b~BhxK)FAaEGLGXEkEkxhk5^aC5RvljQYnRjIWV_Wg z`-am+oy+}I;7^7B02{s>_;X3{b-#@M1o&|@_((Rh_@>`pzn1E2x4XHLd#x)@)F3mo z_iR_}*TUapMQ;}7DI}gIQ$r0LZAny7l|O#z>fEmmTPb_7_a3%dx2D8RUCBlAr#mSm z_Kvn!O7d;nnf1F%MQCVoYqQyXotFFXLQ53$NM} z;TML{PD@y6clXGo3@9rulAvH5e9E8(EX)~xUV_`hekZ;Gb&uLp!d@Z61!mIx9pV`L zv@MPJ)2$U`RX|)Qhz3Ha3vwj;7gL6;l;KaACC$wWc2?!CyXW3L@~(&2%9tW4B%JW5&S*Sr9Zy?qdYTbfL)HI;cpaa=%f}3 z8Lyy-2^@}BDn4Zamp>;#Y4D@MmoFSc_MiB3ER6g?ZQ-ZBa!ib*1Y7y1W(-EsVu%pH z6~ZeFr7jrz5W~4>()Lh&p7y)!pI)|OZg&18RrgVqueIIo^}6bxt&=}Gym#<_!1`~4 zJX?RG{4((Fmp+x@%}(|U`8;>5U)|ftu(US!V%u2OExzT%$oA2+6UB3O(7h!o{@xM@x!nji{4rMRF}=iQQU5E8DW~V6OiF zqJOoQz}r6vd<^)H<0<@op=!?tm*IO`OHCI~wTer*Zv1=UNR}BRlf?2}K&CmSx-6O) zXycAVGD#Cm$K$Vp`bCF|{x$et;ckK9&-h9s)OXBvXZ5jBn805diD40?O~@#@n85GU$RgcRc>^D6u@0E z8!JRo3qv9lWjoPj0bN=rA%x3^H^EPa(K9XXji|*g@T`vyj5cn|g052I5VPgB`HHw4 zAC(v%s-;g1=_Hc6OGMR``EO^gm$vCX-ApS~Nu@biy{wY6cGE>2ZEftew`6d`#B$UWHz^^E98QH>!$6X0muNc zJ414F)lKj};nj-|GvT$%HUTC4RpL8xR4X>+N$ulciWxu&yln*JpPro;!T$h)8A!({)wdpnM6`HDoe~)wGf0&20lYd@4_Ct69XdG6!I; zVpd(!WGEnBB90lynmoNXl2*EnlI4C~uKsG-Q^n0mt4~{LcAHC;YTVY>-6yI(M)8!h zc#2;LNgs@$y}R>#Woks4CFS^uVYtvsTZtCQBAtF%n4+q@C0FHm=JRTA3Fz@Pl>Y$m zl4Oczi{78mcKR(`~CRSjP8lYxrAR zG}7p-)jK#i%2tc`RnvBqld`%=yIH$7lUo_;&w{_tpz3r5}2wD9!D8 zL0S8&OEuEkJuQ2*+eZ{JIH}K*l3cCo)Lq(qxBI%g>GC-shZv3{86zY2WMetx?vInV zAZ`F)L1V zxFHfeoa5#83$05?^1@o&#c?)#sH3*DxtB6A3>8ck(g_`vi!5r4WDEd}_ZK`)r>A(6 zP@luoTWI>bK@<3%N1jb4_9&JqtgKR3LnWwZF$9U^AO=9Owiq>hmOB@dNwrfm!p2vM zZ#@po&*^L&hHfU@-}R0|h&aV{RL%B#|ww z^h0rTCdG~z-dl@?lXpdi6=st^bOnr(GR#yGSEjJ|d+{#t8;HC$9-A221im1i-%MEJ z-LnlGvn}C?U!YV*TonYoo2$&l@eW%?NvhQ2u9u&@z8w<1`faY7Y_4fXBgRf{7-(0- zG}3Z~8QLEWuXwd@H2q%4;3l_;Y+}@PJKrxy674WN4yy8Q1(x1ef=tETyvGUmlY0ZP zNEn*bwu#|gUhhrR^x>p5657673j8>wy*IOUq|S>E8tWq7>V2zb?GWkQAC7WV%D z_*N5GvR?R?;x35y>AeNKI!qJC1H@S;j@tKGg2Ku+iXt;Ty^P5l6;xLT%&r^a7LDM| z55oGb>UjF@`@|O(lf`dmW8oFOh0=c_HL||fCN>s!@ybeKO*+k>vu5)xW}4${4dhqi zd^RG~>A0;qZD-BRWobTUmoH5;zuMI8t&w7I(2Yv4oFx>cE@?&H$`?v0J3GC%T@yBb zFkwCbcohcV#`{S|2OtkF&sTQJmg|>A1cy=+gOE0St*1)qtIidYITb^~_};P06f?9^ z6fw5(6G|l7K;5tg4U!Mk-x_590E-*oM8MqFnryCmlfK7LBpiI8LJgm_w&JtGloNnZ_w4&cenpR#{zmXVOOAh18 z?&B+~J1eJ7&hOUu{8opiYg(oM0Ew=J&yKu%ulS2EA*!r;w2$up@z8!6bRk*M3l%t!AMLXLK=b1k;o zKeffC>G7bEMkl^WE=g6{^4h(_NK+1{F+{Jo4WBJ{2u=TW-Zm77FaQYtR~d<}<*Ji zmu;T?1KxS60*%2}dVonxedEAl6L(%S$W_Q7R3B<7pYLTs$rw|yn;0S3mKj_qP%@)- zat1%!f`#RQ922{Mqd6xyEtAdw0~}=aF`LmL85tyS9YJLvj1ox)kOw0?1N=D$RhU9D zQPDf?d+yWM@AB5p+uxs>Nv7XbeHPbB$!zqpch!0;8t-?w081PdBj@?H422oWg$IF! z`LV-e<*Lna&76iDHb!uFDfyTZ3$|47GC>FBD}}0Gd$Ga5C*|ZGK`o7{3o~s5G0y;; zW~AAWHtho|g>9vHEsyVm$oYGooD-3xu?ef~eRpctwfD8#{My)8Yp-sdlD6yo^bKCRhvtIKyOaAcK(Hka5iF zt=sLRdUW|acI=<1lS!oA_G_;FUb^*mT@|d2OG~%0x{B?T$!!@6g!0ssBMPppj-%!o z8_?zOSxSXg^c_Ru=Z*CZIdqGCPU_1?Sp1P|X>s;=q>Qe{`$|GoOCba)a#h%~F(pV< z^CdDkVv1hafCzo0oS`JRjH`khI1E9IkaD0CS7OubUk!P6EEcD3)lf3>F;Rre7Gycx zk{o~(ga(!imJUyY#j(i?Ny^iQDPIjMyu6^ z8b7pFTYH5XNf5J$J!2;Jti88--~0vnnTFH(@2cDNqKjgze1(!Z0= zDq@yT_w_Wf&^Rr_GnO=KMn(v;qBTK?8+-1sommzMhAuR2Zro>& z^{g;9Pc?>zad||AILFhz7H+S8IvgVsMIrjQ`Zi?@;P-4jIUAdomGsW(tP{@zmQP^N z01}Z^R!8&?IFMcM`-(EY;mw|rBRwe&VjAnQ96=51@};l6A3gG#G%_+`ynY-6*rQ|`y!`n@}wg-?RN zuRicLtFW9~G!^a_QVZD5cSB>+l^%|NbVg|uOwY)s%A~&G4^8U5wH$v#+|e~){yRtJ zo_6cY55$}m47zB&Qg~`6h|c7x)wohfzi-wzc8RSD zJ|zsy3_c93M>{UB$dbnJ`lRysUXS>l8NKg3%4w4&!7M+8@IKxVJ{0gtsB)5TubJay zG9V&&UIAQ5g9Q20@MrQsLB@UWf27qyTe}CvkkM&$nhIVN-Ga&FofuGr;)?HtU>%;8 zjP(GXbkT6mdWgBP&JwTE;1X`70pU-D`r$&>CAbOGYuH_>}iJE zYjml2>1p8o#@FuYVS$MNaVfH_u5eV8>d@R$w`biMHN9lG7;)46bCI3 zPW~tjzT}t<0N-I`7a((~T=^n#e4l6wbInJ+QyIIo*0n4?!eKIwNUIr}2y9r!$549* zn$->H0If>U;AIQ)KuVht!tqysDS`{CEV;QJ1pwZVN;K$H3AcNd>3Ew=hY;lK>Q>Q* z-AM2s(BAA~P+C)FfhZqnLR*bQ7*EIl2bc(Z*S%##27r^{KiIVL<{(Z=$_j7%bmk3> z^B67A5*P#JyO#`HX7r-nOhnE{#&mVP_Dvkk%vN^>tPMpIlDDXb$@qQ)hj_FgCub*^ z;Z9W8O~`y?{C9Wn1Wn5KLFqOla|1Ku*m`c_l=~RY@4BK2lj~69%Hfz$7_Y!04Z}03 z1VVtw;usg6zpv^Nt}vjANX=z0__sk0Xu5gKId+GIks z*{UI2*j$RWx>dm4x5LwR&{y!1zg*QD!P$+}Odc{5*jJNA`^f|~qu|SB%H1T@#%QJG z4_#}(=mAyg@8%9)fijntaH6Sa`}i@h4>=n1~H_~o^td552>(>%AteS#Cb zqyv{7xM}e++0cz(X8qd;D@=B(Zok`vX+F+%8FcANu=aOFUD`aXsjm!pms#90Q{%ky zl7S+k5RjNU@1@?d{Q9Rl#Rj96kE9n9utGU1NRSUnF)01yaM_u^KnqBbn1}-~pZ|7< z%w~uOw17g}IMxTI9eDuL-bobQ^UNIqC5Y-UOt7ch<~xy~x7(v>D=Rrub8i0IVLTJ= zFCrXV28~<0&I5@)VR#F#fMbF9$*DXbMJs<&NK{*bPC~$PITJWu1H`$YX{*uN`FN^T z85E&qn+4!oQ`y*PcnWu-0YqrOrsWl9>PIe}?O9|xCP%%M9ouRyJ>6ZsRPftUTKAM| zB8g+I!p$%jCAL6#)EORY-B%=@J@ho*are$RVQisMrnhQ*^s4Tqxz8`~TZCUM$6m`vy@iv5KPosHZ~h+*6guzK#;C}^s11D7vcm|0 zv_iXfyE?ge%=wVs@lr!96iX1k8?+Em1l?L5oOkrNMR^I}yz6*CeJyFwKN?pP!aftO z2%j51o$Gpw7}!fpi z?Ll(XBrV-?DuqQtUrAp;RPA4F(Pl&pZa-x-50z5pB`(SH*s{gwCXuzwMT^g?-2(y@ ziGRI%va|ig#zuR|`Q-RlWT?K#XJ19azv)~}Zm7z-O8QuNznk0KNT<7`tRLLgdghc6c5lYB zU>Db{rSSPUXfj3esZ>_12l6HIr!YQ z1ULp$oqI<{e&XZuZB9vLT4iWS#!)2?rMP9Adqf*@2_bDW#=LengT7IgN@b6 zi=qFVZFAS&u8)O{ja6W>Fdq1x_k24!sRPrPrk;NiSdZ-7&L?>9LBWa&Lqbx}@nEnw z2$anjh}Zb5P4*pSX8)6lZhdAvYM%t{f)1*776f1OAqsEn!zm?+zGN8SE)Ttcs zS6^FNl2$M?U;xSwyoPpjGcw7FuiCSMj@5){3Nf%w!9ov3$IW|h%MZ^6zsAPNH~}G$A4D6IE{?;Z^HtmV#2;3D8n?9_V_U z3E*;5*sMcPu1q<)>esxo@-jpeyJ}w8fOk^n&fNzeU|h{|-?GEDa?gGD%n0>YKw+ zx;#_TurG1ov~P_Du@TQC66)Wl28-ovSdIU>m5;;Q+&i!k9bYgU23f@-^?a-OnTegE z@0n7#b?+>vui+cz`vt!Kxj>KvUTW6I=Onecae!I&NM)5TbtLIZU?)Chx~VRsnqhqb zA;~Kya9i{}o`G9`GFg1y3ah;qBIyOdTmuqQgiSYV(VSB?<>TqQh@8fm<6x5BphME+ zlRMMXdfZtJ_j%lKbq``5>9R67Cc%_bGzIDT6_aCGGoy@qkI9apCa&SD-Y{v`P_6K| z8rThbz5AS|8e+a^4-YSO4r~nAJI(s%K>O8p`5D$`9~^n?wuw?N^>`Y&`&AKdiKjRt zM5f%ca=ATr*^Mqqe!)jRwWT_F70%@(`T8lG?TMaaT@XlNUI;hZq)P4@ApL^ATZ)+L005c=w z)uGCt4_!^-lnUz5Zs=XO_-XLmU_M&blvQAyD2DYIH#e}sHYeZD=Bu^uth{VU&;qS- z834VzyOxpEPwrK21Ok4~U)U$&6}^~3ox#W{Y-9!K>QW2n0onZepO*sp)}xlD4xWRH zEwpy?N68~2N0)X%$S|2vM?(gsV!219k53Il^7AXIhv80P{zAQ%6*;63>j`*hO@I?l zXejjKP6B|=n(O0}L4FsNV9+r&dZ1g?X+Yn?1A=E|$fi~VWlaqj02%BBY7#;7EBd~F zE^kbN#dn~5Yl562R;eV+d{QALw2Lo3cujC0U@uvb*GgFatf!QRUdNy;Nf_K!d)7?- z2^oBMTCKmW!qcmthSBI=iCN?YeQ_5C7BErPqI}r{S}9|-(?-!iC>1lfrs;|$YOAA z?!1uYQs z@#aXva%2lPlpIfxJn4OIzZ8iVQmjlur{Z?5Lqtdi);F*=D8e<}9AOvTQ!SV+mE8Hf zB#8s`^+^}Uh6ZIO!@a(whwtZ|$t1!AO&Wi2f;wI?N(l~h|1opK5Aa1^C{H~D*N*;0##}wA%NR{lT{ z_i;sz{`jzJ`c#mJ<=dLM>N$h>OowQ~FUX+nySq!}!TS*Cxi3lim>bs8auvR#%@58N z@$bCsA3FZ4$gun>u+vVz_D53qtFz3?C5VbXwK_Mo7cJi!_wavKIvX3kAxGC~sPO{3 zkzt#SW|YK4pSPMubc8P+0G+A5gQSRJ49@nEeD4+Lku?Zfqf}A*gd|^lkWP{02p>%! z8ZycjAl1FhSjf-w?fh}x65z0VkRRks$>Gi;$*Ae$6{OfoOw&QV}qv-#0f&Am#LWy;8v(+^|Svjjq$$UkQY6 zsfeXW&Ba^v@YI|Q!8HK-w;)My>Y+xLy~QylgtC}iYeluj+U6~9YvMJ?ywPr6@o9_? z#d&P2@}0<0$0z_+Jn8^hKGedf;OLksMP)4zX`Ir+$rq*F)gQR}JFI-Fg~;LaZGggu z{w|;7asb3#oYH$V--vF9+~V}LA`y2B18S_de^)p*R5Ybo`30|6?N0c)2$89QJP?j0 zD3HutEN7G&r21l%oav7@xRvQl2{n>I`jCH+;5*%-vC-ltCG(D3B6zKrJ1UT)dCJJq z#%RY|Wr0g)bzrZ@N%~5f(%<%LoLoiDYX49VuEAy-A(7U8Rs;Q%raYJxt;z?J0ekr7+adqQ^Kx>hshd4@s_@xs| zJB6y#+>#M75g`$+W?QoVlHJ1CNcWk)gujvky9ZGq#HxRG0{to1NRf>2mEig>igr*~ znws$@AEOVf^gbgsRQ3J*5#+Blqi^z|FVcI=6tL#n4RWrJ55yCYce-c*p#AhLa|rN; z0b~%$kKo`-#_|hBBPG{uMg?3gOWh`x|5=|)bnpw=;Oul~Cq`!A6Lo@uDgpEM zzAXbcTix#r&UOh_sC+Xo_hQtZUqU*A64aM|t^Mp;%-hVgKO`xyL6&`(z>E;iHEwoJ z!6?NDEs)=a_YZx8!r!R3WAXhqC)Omb((S+C8O&yRwi_XgM4T8Jl&YlR=ZZ8F8Fl99 z1kE46^y7)ib%~`4K*G5Y4#4eKJ!_och?{~m6lqAa)UkPoh@kn?E|pH~=<*ume!k{( zg4XOY2cL6-K8+v<tvt- zFn!~ZpGQh?sEKRR^j}%Fl*~C|KixfO71gG3qDvjrJNn3LRkpYFQBOPdiG>_(7|l<~B^b3!2}*d72~%Kpin7oAfUF$Ts`?dLuHO}tac~Zczh^uowcH!cP9Ri^Ex@*6`0clZ= zCS43M%KY_V5){w|MCC1cghT`{?|+tta)S24-6aR1=lc2p&oq@_=X?-l@&Kbgtsq2A zqW4d7WNK^o`6rK^cuqmY&erL+o61qugquo3YxAFh8QVrB>%p*(vHT7gKHs>>Za{Wk zgvNY!usvvh;O)_aZPp+M`pC!xj=eC``a78s*u*UEZD+(UOe)n-WcD{IOniy1 zLkz!wCI!lKR+A=Wc|M^t1z60-UB<`=rKF+cyVXgjGA(wqCOx>+_0R@eKSBy6m!6km zsGQ(`S!Ktt-Q}8UW-Fgy&Ab8)0Zm%GkF@*_ReZqjKT$WqcUc2%L zAF4_W=p(dg8egNc`jG`;@^*=lOgt-KAz)%i`vwBo1UnUtOtU8g+v zVt^#2E8XKIUnS2js!pzg;UjMIb|WBxwd3vQTOFhOpSIyknzSM?8GgXsSR-S<4=K6Y znUW&WZQb3LZ;5WDI-7fADidM;4Wmh)o4!WR^tBq7~y*55_(KkG-gYT8{;wvU~iTxA0t-=XcgIuJ8&*$@73n{>5{ zKD)~1>P5-&FH^l4I08-y|8PceyKeo=kgT`{FmTIP~|%hj9` zfUo-w0|g#L(M+(nH~yy#VGr z&2Gh;lv(@Ca*`|9Bx+o~ZMW8xC2Q6qfmNyUSUa~WZE#%h_6!4usMdwvUz>C>f zlw3~vG#ZWY1{8Bwent~V*2T@;wom75QRgJ%(qtpT5+}=jC!nLGzuGK+NaP`P_rfXf zx3#pgZaER7Igwk1$>^a3#(90t>rft=-oaTK0QFMp*nd%W9yAu;IU_w^u7NTcmg3Dh z`=3{7egjr2HQA6jm|Hjn)Rp6dm+e73P5OfJ#Uh1He&r-YGj77R*~in(wJgY(q*qtr zS2of-xO<>${043{&G7AWlGhWp-pS;MqITqbh<${5NwjJ8U_a~IpEpbx>wuEnfn+i4 z$pJbvEo_u7GK~yo!u{t8yr8&BClz(yio9=NDdg-2(f_8pRtO0wk-0)IY`vc?Bc=1ci zOIorOPrLYwow-MYA$Nsn0TIpf`UrO55J{rx0kkMJe5WYUIPor=wMZveR`+k~wO_$|N<0~{$aA{anP zT1K#2lRoO8WvL&)#8#2$ngn&O@I8D`Cuj-MA_#cQOSyu-vArA-2&C-Z&{W3ZCBmo!(>qKweehy4v)`;_%>vQhD0>Q>_%emvk{D15iKA6pPtkaHAf+TEVP zxG=1*>67QcKSU8<2TUfc-l{L_D3Iz*0^Lt0y*CHgXh`#$E0+1eWl zj*Ji$)du6IfUjvtADM1J?iMhkZ@d=A8votC&C&XLSF%aR?_v`*zH6eB=8Tz(K0lfm z_G3o??Y%5OncVGn27z}bits*xlzjYxQ52K_YCr_VtxisECJsS>{b980QaMd%auQU~ zbJ5^Mh>uVqiGxO&(JMI9F%io#UoMrM|0&<>qL3V~-t_OHQQ}>Dse)tLVE4hvdWb6K z{0@}?)EbFYsJ5rrkiQcT+#~aidt!<3z{NNa;lGdjZBdrctq7kGSyI3|c2cxm@ldZIY-SD(}_Ud3u0eFD5h)a3> z1?J1C;&he0GYz=_Odik=&r9W?jE)GFGqkR=7Jz{=f27nS9W#C7*J!vkY5Sc;#i4`t ztSi1pe2HJvQU=K388nH)xJQ7c6tbq^=j0FsGc4Q3|J+uls*t$z&E$)&IfhtKC!%6S zK;hB}g?%$yIG3z#c+C;wO8+zYyU>X6Nd7_q*rVz;2kDr6V3hpe-<9mKI}QUw(lS`@ zb1gtz{!mmKw2PD6-KAT3N{W$GS6bzBRn;q#G*%|H= zeh}|#`o7%Mw2gzhL2GFD*gk6Z3u%Q$t+xfA_Hb0nOw{^Q+@^ zxSgD^a&ge?b{?5MDNuq&4L>|~nv(FyNxRrW7 z-abJiiW0~)lnhHB#)S{06j2!PKpSe-bq?V~-Rj$Oq;{7Arm;}*yl=GIKww|h?XSt3Ed+zO!}17gwDWVfM(;js6*0oRYUUPx1-3NgYrf1 z=mg&haP((RP|hmwHT6*Uop{Q36MQc!TjyU@MqgRqIKj|U{*$70vKBbMETc^Z z9Xz`Igw^5aA*NNKoIa>T-)9m}Ill&YM6+kjV-j=Ud*1{PAM14)kZ{$Y&K}_-kA45=rmcT4hSShCCa)xGDjJU^HG4K`^-2 z*>nVSvUcp*&V?LK^rX=_*n2l;!d2?91KNq8e&n+suare0R6bKLjCS4 zbj%z6w0g|5(8Pg}Kbm*|@p%ahJTC=Q+uDc&C*$mTl01edQU`kbHwmSVbsNb^WIIc# zHJqzhUoz-6ELY2Io)>(bBjr_ayK_=Pp-V7D?S_WpVyEWKK4g zU@>JWlE3foS&!Jd%&h*R2`FRC1DM2Te2bFimWfh*d7DX-s0D}X@p_#&6pg#KdR)gr?9guY zpyhOk0fPLM*scY}`RIy%*HUJUv=6p{Saf3qp~9UUP_B5$$==H+90&M9X}6S+Slx3| z68dP!NQca zUp;2T7U7)NTlAIRmr8TsNz(1TIev-LNgs<^`#=Fr1v7!pPp_ly+%WA!bY{%L48{-S1f&|3E24UT7=HXZqXV>Q9xqcB^X zEOyf&r(xd^2M&5D75}-TN|)Mwt;Yz3^)kYF)pquBzMPcXe#~D#yYlPLdukyzIj$$- z>=Fn55YB@^v-9}XV*1`-B&Yi#|Ej2|;iqZ!B?c`%NuWK*o-*0=O(iBWqc5S-A@k|` zBH)MlV*H3y@Xu4wuHp;u-ub}VK9`!yN_Ymn?m9nLxaR3qk1f>7-yvwZ)xAXORSmvR{R4JF#jS(` zRO2n_?w-Jw=K86aMg7UgzGrC+x_9k$%2_i#A9liE-G3ivkIqONfEZFJjY~K*mk&Cz;O5)2gru2>UI)PC}a*keLH zu-I~gXIe2EhmcLsTjZKi?22XW=EJ2!StY4u?p9U0@_JvAZmi@oPzqzee%l*2{jQsy zFL3YcGe~`+muCu!A0m`Ltbp15wYd_i`?c5VMVgApp`uydf)XUJ@o42)^G-p=->-!A zcPh*r*AG*7`EU~TT#yWoSBNolpSar}*;;MSLs&QEMIQ`g(UE0n~F*~tnv%Y5hlt+i7 z%r6dn&aAw6vAC*16&}29^ipj4^Xs|{omfkD>+uJ*)ipINA~LhxIYce#m*VDrY+D}X z`A#rXvnMN2GWpXpdLgdhG;{Bpqi0_&BY(Oi+sD2d@uSx+kCKWreT8fZ?}?BWsOY`F z+Ax%Hn*y|RYEc>;`+rIlLn~v~v-!^i;qJx+ntBg_Q z9Yd2EX`UuM+7)-Ib^9NHK2Tzzp#EB*dBXEy%*rbIEP4?|qh3919VJKGethVZ zJ44EQH?_LT<;a-WEnOqwEA!`R{0Ub2`D6lj$BtOGypg={W45~)=A&|9&s)VdI$Xy0 zIvC{ZZGYso(zVj_=af#7T7Fmh+YH{SAaeKg;9c#Ba=1Z%ft_z6B=h=2C6_eI_EO_S5sb8ZN zInvf8=N~kpT-Fk658*ve8JnX12bdg`JN;<%?v~x0b!VZA8-WW&@^1%*7NJh=)5XBi9s1GM$K z;eXsdZWIW;wTGWGsM*^oUR0y|J1aDF9QH&TT{%48h^rfNcNndi^xI|Ze+4g^dl{HM zuB$b+b47yL50wj!z8-E?RhHU2A+?XoH#1$iE?E!noorfEjy1LVF1)*`i}stkK`(V=$AO=@R{WMCAJ z?5NxzbD(qQy{2D#4sG@LH13l1`nv~#_SQqPpf`XFX4p{SyGkrR#ehG<#&68h0aMohea|4 zP2y9-s~{z}V9iqM;2CO+i0e$>0a-G zg0i&wm=DTnO?-p~*xqTYjHvJ5^t^;K&qew8im-f*Qp1_sN4#wdI&x1W= za1+Ku^vZbQmJXMQuH4?6V#Ke&ckK#@VB^FxQfu+s6E#h83Bs%_RAkw8%`NWkk9d~yH-%ql+|>X z%0+LKFk>Ey)zeMGeqP_*GiW;c|@i2I~uWgrZ2XF)q8J#P^}STlGdKq z4A=DYx66+Rv!P8!^M{WeczWp{f&>fR+SLr=RUQ*>$vofNjkw}k2vG`jh+bHWR;HZ4 zw4+`>`TbphO*k!^yLRllYXnR3xc5JRMc=7ZgV~<-l#HejwoUEhwLtBN=urj7=DV8` zXlv(t;kmixKPp0%#|0bNb|IA`evSHgmDeNIdg48&mbJs%Wqx9sBLlP*S3<=CsHS3G zq?;|*{=1K9&ujMuKlshOd)5$d4BwYoz@z>Z=k=V7la2Ylf7nh^73$gY@5jg#@zw0j zWE$U*%Z^m`co8;t>+EA|-Na6{f~dUEC8k}oYBkyI&GLH9b`6+hg>&;v9c)nTtLoNi zRP;b|G?^Gx#F1B)Rnv8 zOPrnAsM9B?nVFt4u?s=L@q+pFUXdKIkqp^*Y}8DR<>T+B?FE)%0yz2y|9*nIIvV~iTl`^vs3DlZOB47R^85>&RetdSF2h3p z)4;cb(NdUlxNp4xO=~>H`$ivHv~j~BMk^LVk{GkYaY%2_wWe$-#&|#&s4~WtC+&n=E&MpVH0>M zUR+psJZ_9=J}gMcB|XDrC0~!dWBr*R@Z;+K3A@w>ss8-4H;XK9mTQ?wvvPTdUA^C* zcdKB@z{s1Ev?AT1zLy%Iug_xhHh7r#zs8E~UP-)@kGntOeneJR7k*gGz5MJNtOU)+ zBe>X(pmqPl5gS6clvZ^Aw5?mRV7}g7+w<%{+}C_#h7TbWeoIqD3izm^q`@GIbft8N3oYld|6puR>R=g^J}o} z^p9IEL%l0DHn-%CaQ`K=2{agXd&`b{ov}sln=hj0BJIy?=0oh*Lv2Px)3->Z4Pr<0 zpTVdmw$DJ5W`f*|fmWKvc(@GrL%G}KSwZElMAMoz!}Ni+_BHDi`y)G=K!nCPdIPk`~x*-fyUPaU5M^TlWqaLUpIS zyOXW=!Qbiv_f>RTwqR5&u;%9|UmZd()Vnc7|N2U}_TchDQ_2;G`GKowIDyS*b}QM~ z;5ZcKu$?jPDfX3THf3k&8#kUC{@^68r|TOFhYu1+1=-DzPoPrrA*G#auB)v3 zKLDw>Blx|ZtLI*)-d?7y!;|H=!Pw6YkMXh`PN~{8HaxQ+DevVjd-vMeHhYn+lVE}T zhO!eY`LA#D{%rfsH}bdLWBDThd*c@9iMEm7St#d`W)o2o5h2TG@Z<5<#HS6Pds5MR z*p_#96Gg9{?4`fEYq>7fFtUmLAK+dn+%?B_JfPPboMsjCtJwA{qf0s*UEkP}M4Y|3 zP?H)`ivq{r$|bZd2MPxigH)E2&Pu!U{>>1Qb*^EJa?-_iHYA+R^cU;AiabBqTtG$s zk^6b^{{Zf4y#3N`&N)-odu6XMXms7jKBpFoZ)d-3_`gu4Yhu(1Qt@V*5)Z~}|5Y{# zk)YNUv}bMx(E|t9q>{j$@dXMBl4~^qzCDb%Yk1Dy!WNOUhRXjoRetscTazKfJrkhs;vih*L`Gl&17`# z>lRVv!)(zXq5Gs`Eed=XB)+B*t%5AFqpvHrN}CXn+=wzyV~4T2rBaj$n#2Pzt@h@x^T=wFelb+v~EL zs-m>v2@Jh^_GA^wzsXyTox5$Jr(Nt*#-iLj!5&%(oM z3@#C2j!gmMG-SPfCh`_1_+c(HTXR#xvLiM&M7Lb)|27V$P~1D`e#ANU`rSEQg%Iqo z^J2B_)BPkHjDo5p;TRW9+3H`^ySLkR1HVt4rH!Z_lD)K{TUGiJGMd^$9t%uFUEGbo zSkkJNrnh!ux(p6QVA8hOZFz_1Yv__6ruZ*>dNy5`uq_f)F!}eu>Q6Gct1XB2_8Ah3 zbb)u9{8O%}8$)fa#h)4zjJ%SGWASrt$dpuz-+f@-?UVB5zR@ zf6D4*N$bV?TXvZL0Xl7THsXR?|J@xduFQRtx#meP3jn+d;)HXOfG>6UNP+F&(@13HC$Or7YvNu~} zxmE9C1(Cjk*o+MQQvqMd5;6bU#>0kvx~L>Z)0WMHA(WXxUI$WK5B!eT0OqXPSAMTB z=&q0J{3xfJ@nwdo?E(?)7g+EVoAeMjdVIMS84o8B7;af=&^L?tCX6^e4~YWI7f(Cm896)R+7fE} z*H^c%{Fqn=5PplMgC;(>wrRjI^-#YaJKnWYK* z_S+4To*gT5xcy#J^nx1w%Z)UyB)4M0x-gN}IA;e>katJeJ3!WM&!ebodY2^E zEfvB%%~ok%V44=;S~AqHD&vnGgFuw^j~k(KmCX&6`<@*^nt%MiWWCYw3|pA{*c~w3 zRJ!=+-YrB2R%e!X&nYFU7eT(2LpnR=KAYDweGtErng4g^PdH%cn9Ef*PC|2!C!-+H zTlOEgs_YL$w&v394dD07x5WIN{Ia(bqT+J6e%%*uYQJ>Hh@*9ymVBypc5N$tTrJ8l=MJrmTB>N->+xRw;Q8q+!;xuMp)9(GQn#&y0w;f)v|L@Em=z)=T!MOC&i~JW* zS&coksMQ-p=Vl6~esYLsX>wRJ_+%@w|GJa05jDH9D8%qbceJ{;*38M&D=lYKKkBLW z_zK(W3Ex;Qac+Dnd$zwiKQ<`2}7%E2i^Mg1KN6nd35iX{z2cimDtq?;` z@Mm!R=$4xJVMIhy{}9fZ-=~Nwb~@;$lx>;G+AV96wZh0uS+be6d&P!Qu?<$iKOn;z zoI2q#7hYjL8koJHuYA(81eA`-mu_SFElJ4-vae>Smd4!pzQ$MN%?F*u-HrmWw8WU% zOxi0xB(IY1rdGy6dK0_an7+llmjC&L;M%nVxvzWsy+!(NbbPY)YsSK%FYriZR>Yt4nnua*3x{@87cJgxnWdtVf@rdQWc zoe2|i`2@S4C|~+)wfciFw`syJ&Y5iBCh8W5w!!%u*aRF67X~aS$%*tRH@nukRX3%Xg>j!A%oU*b)3#O1dR_OiixS@ul;?gN(d2rsjanOJ3QRX?Gs}bOD6}F?Xd0LNkbDTE?vtfv3$&^)=Os@-&c?wiwcG9 zpX7|Q-MhMgCo#;;@RQc9oKn71Sh;=w_4y8iHhV-B?l+H#6u{89p5xvjwrTrakRsZ6 zq+iXyXiCiARmrNKS-1+J0|zIc8Q1ICPER0$^Nt&@j!xiii)!2E3!0kyYMtEr@Av+loBo^Dvt$*Fag)I+4ua52n}L6T8n!6zPK0rcAwP= ze!skj28dBQrHWOTD-m#uhRM%h|nk0SOajw zxwR9!M-%Z%fz~cbX4#famMk1Re_K8d6{eVGzRtIT5l2RR30epRIq^4`mA5D3f75-_ zU_C-7BjcELE3v;7jTdgsT?pQqwC!h(UH;t8Ci}EmdOa?i^W5~B@`iU|EISt$bFByD z_Bf7HRPJ%ZP=Ts+}GQU^%oP=#CQozylM6hDw&aV(q&?>)|p_}_29nx zR_+i3`#(iz9oFRAhT*|zkQ5y{5M?;&k{BhR#6X6kbV>+wF|?+uyhE|Lr)ocYEr7?&~~DP34b*IDUi67>g-j>@1GMZ?c=H*6F)Dv2Qo? z@#*?I7!!Bz;O|5y>B)(;2Js;`<<-d+=?<05Sa9Nmg=7p_o>QA80-E$Z8fo*S+03)kb8D|fhg z+Re;obfV&U)tC%5ni!gs$K^{H8&MBpI!~+ngXld|#L5kTJzUpr@8dW2o3w!3K)?o- z4uHB5-Bz|1cTLK#%*cs<5nG^)Sd0XB&KZ5AZTYD*Hk(Kk6{q+Qp3SGW&v31=#9-Wp z3vPSWEk60J_3V!~WOF&r;LpaQ5dc?xt!tLGi zMpmUw8<@j)XTO>2cDLKVw$V*c1fAqaZQVn=@I6Xcs@LpO%Ke$6s$DS8xlM}=!&}-K zc#t+b5EZ@$_f-%se!62|x?AnAa3KGWGnVVObc5JPx(7{YYZoQpu6>(>p{vt0CL0)6 z+~iQut)Iq>Z;>VYa{WmnxYQCi}0abm8JT+6EskG+K@u_=k<)kWZD2 zltz&(F)o@21X@c{r|+)OsFU)f-$!F2k!I57I*+LC;t-|rST2PsY(ni>hsxt3Zq&J% zk`KlLv7TS=J<_eWS|l#v$Y(()vOa!A+)61Lb_+p1Jhuq4u0=Oo+oN<>8t>nF)W22t zQ1y`uPYVid)p8T3L?;!6Nvxz65lxnTfSKV8(kc$pD-LqoHH-gjJ}}zq8v^bxFn-Ds z56|=Sf@?mz^CdzbW6?#YQWl$f$iBX-5hK`JBKNgg36XsiM+0LiaH(2lxAROCpUp!v zoPHdQoPX?7{D|*%<)9p$+LsYKy3sky-#_3{=*P(ODx^Fe(fqxm?BtDPv--ruk9a+6 zA)@uDg@w_}Xxv1(>v*1DK|SuZae~2O6=Cw?&yIV$`^T9p73VQBb0%RXO#v5T{ zGSR%5$ba{P6N64WndM7{MZjVU`SR3%*Y`=aqi2a$)~WFCf)g>i4H)1)F=rKlmo?8}}oHFd$yXyL}s zes4Bv#P*|3%c>T!^F^O`n2Uny;>9;`n@Z^`g7LO#2t)Y9@vGd-?xHg8ya}IJtNW5T zat0|SUHs)ht@+-1|LW>mP#(11;5yZR04@p418zyG&Z?bUpVAr?mI35Xsh5DaN;-~) zxnSIK&n`k~Qt&@Oo54qu=$@3=XXSMX*Z5rp9P0~7y=tB}+2N*dg9=H%qkE^y%VBq-Etqx3W9%Bw}iK{`DQ51wA;A zDclY7ap{d6fv4$7(GezfqFEGCS$NUax-rDNpMaLM5M`a^)(GkVNQsX3C7@P)8D&e% zAI4c-Z4t&40hb=_6nz%KIJ<~{4BhM z9{hZNRC6?isHf*#`}#Zq|Cs8O0Rgd{_mM=a`2Hm;3QAZTp{qiWIqh zRq-vi5&+BG96qT%dp5z4(KT!Nw(h%FH#O0zk8ZAzfyL(oy#@Y|(oXKuO_%)8B)aDo zA0WvZ?uN|*iQO9eM4lK>tb}B%aZ~@&QLm7A@(n_rdqpKmU-AA%!qB0IA5-N;$!5YQHO4jjG0VzCe&k#RP@m3V>a*z9;U`g9 zx7S_^ph_n?tn&*#3scly-NotgtfVXb*GFXgWId;4|0=;ojP37U77O%aY(=4> zhvoOKkiE2HhZ)&LqWDf4rq;T5d(P+b8)feisPwsHBSdlrY1s9}n)l|ze#6D)n0Oyz zo*(k+l&cS>&cwJaS9I>HcT-MbkmF_HAwj;n?xbLsU{cBQ^V*H=4;8NWXMeV zVhm5^OYd944}qe-@LBVv!uduX=Twt4_vTP+2yCE|9`3rWY*RGl7us^&L-|c!PciD{ zh{?4-5kl8Md=|DP_namoUM<)yEh5X94~;KTCR{ zXe7Kx)JSGR<1UApy|ms{W;VpTZX{Qp+8E+@-SXroE{sY$zO6~K+dSEoh)y)Gw~h2^ z3;a-8I@TVgrYS9?)*Icm)-rTIG&)3VXE8}m=A^LFuQ|H?cZXL0{S4hbc&@PVO=$Jt z$Uifd5bHa485XrQqvuQ`>V4uV3q|zEPD!y1O#{z~o}TAt_sUCq{hBm|hueR891Hco zxxI6a6F_dmJ}3`f{c}z8cpE73rVd(=GUWXqfNkv6HsAUC`^-1>Ro;E-6EfILjj2Sw z*fVW;g}*yBZF2rd7*zjf_v6A@#cVPZiAVkZ>UyDiP@nD-Furz5nC{?vI5*|ubGx?p zd0{TDzLF^^v+Kwx2`UIBm>65&VxvSGk$qRqrYPuULOz9MzQJdia8lOsPV=2*niL2l zmpsROJ9eV>5E)}Q89YpHkcM=QK!f9Qx}e~nc#5wsx}?aKMb zBqS?4`pMp_eYHhAud19#9JLSZQ7c<$*_!$0W>gZ#I@?_E-QDS}y@_Crn}r(# z_xLSLCpE+ebj%t4VNXK8I`aVs&0Dl~WGg3c6z_-~V?+2qjkYp+^A5sac%rgNk7V`5 zrvv>TSNXWSKDqlc;)GEg2MKY0fJEsPR$gHuH3v+3oP=~)(Cn~Gy!|j+J^v2z{xbD3 zYW?W?S#U=2NaJeCjYr0KsSiQ#(|c<(EwZxe9CrujvtmkK4%~V&_z&#o-4Dg@;G?dI z1fC~z7OzOieg@f08hA_Y-vt`RJRVDM6}%?_aU3;vJ$rvLX&O9kU zOY77+?e3QM+|Nnw->$|vQEw%JE@Idlb(Ms(8Wpk;T_F|Cx{|hPOnsfDKS)#zqRZR9I{WNgMwm$~L^nIq%}?AkE18&=k9>x|Zh~?8Oojh&ckg54 z$56&Pr5ox+Ya{qnAI_8T7jk=73>V7|pRk^)wm2$eP+{q6BewJcKQM{NXbLAAU@OLR z2LV?aRw-ah!|90Ku37fEEztlG4Q7;A%QZefN$H$3k^?rg6S*|ZJKdc<- zNr0&iaZ zu}Ikawr=cwi#o`UH8I_7D^dI}mFFRU%l+Q|2cVSy-?-0(zE>5r)OYLGcJj}Sz2f{# zlbM#nf*!OT`ZsuOPFmk*!1*gf35W6W<()Mpv-}fp|Er^v8(?gZ&|C>eCF7>y1Ev%A z)=bBej9y!~<}h(cV!MpD>NCZ1!8ieb6Mq>FVfoQB=k>2YZbi{CHL3xOG(;Nv9DV(5 z!|j)x*D$>JM#^1PMYtK8Ma}pq^&?PlRl1X^=XamK_wtjAfRnNpo<({EC+jBlC=#sV zRD8?zfMgQgb(k#Pp5-c7x2&7u@#vQG!1TnSSej{q>7D8{fl&kI*!+PnhR^5Axcdy< z3?qM7E*`Mkmy&W{kenO z$exIqe0zXF^xWV){Pw`+hPMVOZ})0SN~T~fr(##R-nG;ciLn%<9!7u3|1WPUyAECl z57>pq1gXy>bFz$gL*HLm1;lB)b1z5drkII+eWGDLp|bR|@crgI6^(8_=*cysa5U+3 zIdx(AX`pUGlGR|)o`D7GYE8;rKbCB9S002zlTdunU1&74rheBaj{^P6HCENHGdcd%Oj{SnkL@3rmJ;qj zIi)&O;3F8u93TGXAuf*Seb~DD);Q%_<-A&kyN4aGH zp^ndyn2Xknj;+z|kL@}4s5}=Vf1q>yZ5Q$t<3|M^yw1E5%(aVsNf}A>%^rza)0*KF z*;hsNbFL<``)t@4V6mq8bm9ru^CW7Jzq7(3V#N*$aSAg{@NeefkBmOMXg*gk{7CSL zFh4dxWCl7DGOymcUsKg6*Zr@)EM){=lJ@s*vR-_YfDiSzj-FUtc!U~#)Wlft%-nn` z1p5WvNx|LefPwAwM(xvK$B<0+k`!J9TuB}1JR#4U4Wp#Hxf{?`KwmqB^9G{^{HM<9SSQ5Mk0OWBnxm9 z!}>0>8<+LOpi!lL-h-8uO#oL;=IHWlzxhjQ)(f*A77E6O#RVhP!4&EPfM#LLo_Eg+ zYXJOK>Z^a`9(YhSYEa;~QrDX9xfie*Y*gj5I(~R+-8K2ba}SHlq<TF}7IeqrIoPmtww+n!$=&Qv<7chtDflrYg24ro>98g7343oYvZ6g1W2Y z!^RdOLfpn%=x#}ZWQFlb)CV^^?V8KE!%m+scF?9P+)T=7rE6lnZF@VM{!0_kpN5j_ zuNDPGuqt9$f7kH6AYTq3D35gV8-P=biU!9Q0A}fG)k_;K53IVB4OAL`?bDyjBt#g$ zNIpk4E*F%HhcJH<^Vbw_Q|IUWRs(ys4**ILUxI9<73k@Bw!|esxa<|Jo^Np5?4J;7 z)fG}=IQBVssevEJRN(O}hF}s&*mhga@ql-BWd=OsdAZO{!nn2IoU&oSAv&;=LbJ<` zc?tCEDA9@%o|`&`uQwWXo>ul>X4Y3!W}F?*xPA8{SC9F@po@^OMyb;e5NbFth%D#V z@lvpLLD|-pWfshquAuA&TaW$ZJ?CX8fKN>!9RM;7f=jj#0D53%*x)lydty5kAWWKx z;wb4TRK8Rbp!u9^hAc97{T?hEJV9pN8jg7_84aQW;Br@%Lb*(OL)Kp>x<5Jefc%%*U!4$&Wca z^XfZpR5uOOni>pN+H@Qkx#S+)2p=#A4my8T>rJSl+#*M8Bp|fttqm-fDPw~l$EvNy zR-#Nb1I$*&9WE<-tq)?yVck-FV7B>YUN&%q)EHk&X70CwJ+`U!K8*lx2p_#$06XCD z>M1$hgp#@myqih7JZo&tW5{zTsam@vgeV?2q(Dz=z;WpUZ|fKp$#mld8qR&uo=8Ol9| zKBJ8#n{HL7DBtBDF`PeX>~94E_~7kx%?qIAo7%w0kz&$Redf+j^}CDSQ=%LQu0OvM z8r*4rVmKm-f#SN!_lMwogOm0OUR)KEY-vdxfS>OAWW*+_9{v!iR2Ie_)TEU5#I1J5d-n?lzN+!Qpt$f*pL=^Y2KteCo9=pM-ou;O9N|PTEyN*= z&6;5XEe&5mDB&oRLST5xn(i`~BU2`^o9|7WR=@*g`|6uNYXakxaDiCZnm_qA0C*h0 z%J>9bvxc7JV^rXaj6ju^-pG&9z2r?BISRhnkQD&;{>kSvi0F318@RU}P7-Uct)M?o zMW`8SgqiTb4xowQ)nR_H-q(f7Vg4?#4$AjrqgN(#5J-!nAulXa<#uYGg6y|rVbbcz^Wsvv8)W3#PNJ9p7n7C)w&5pBScR>)??1kGO`=0DXp^EuR=5J}sY^F3>CQsI9=9Xz<4F z+pEVmu6TmQ7*~DWKkGnm>r|>HdU^$3^(GfI94Y`=R!*cOXRoV9u3m1{@X|@Mb@|WQ z-)F_~)nO&!JjxsqiVozk=L`7^mLC4(2sFHx3bG#tAd_Ra;+qs;dtzn2r{ZZ=4?0v?W6@l0EX3b6jG?7dK7rkLZ4PW;M;Hp{f>02Y-ki;IN$s_TG9|ex#aQg zhW-)u(C&_-e{2thHMx+J+od8D1d?OB5|tCW2whejp%i zgC$SW0Z^w?_c;9q(mrPh%{q-2Kz7nH#fRK4oTnc0b9 z40o&|^F2H~{5NM7?PT^SD*?bOQ|9@XkWU~Ug)8Ba5r3KzK(k(xPCsczik;asC~;DL zA+RkgMq1m>zYmH_I}kv~S?^6;%KJ201uL!p?SZdsmF4*81%EWF+2DcYo{0}!uj!{rY)>l0uEo4GS_ zdo%)#K(m1kwAtOREA(D)#kC zjto!*DEEBq)J6bThl4mGz9ScyUZi-t;2FR6B))e2=R=gB$R|-}YO?#y}>v4it_yl3+B*;hT-awvQM#8HHT*oen zRYfIbGtZ&M>;$yQTDrS|&oRm^eKVhQMLg%9*(S6McHz%+2zp?Mrd7O`=EHdPiii}| zbB7dY81*;eDuz0MQ)=IStit_GZBI93qA%5*Z|IN4nh{LP>9jJuq}b@@&~LkkAvo(anoyL z4A#wUTUCboAbKoHrfb*Y7v_IOKXsF=NOKi27uw7lAe0YR)UJQkj_`AubANxK#`%nM zj3jk4Hv=pOfW&9S1K*Q7)BKu5QiT~_9bIzGEx)~x?oU6N9dhgF{+GHqrM|?z;b3tS z<^S<2l_z&=Li-6zC*wqY?!e~-W>0Ce(y2_-6ep@D+`qNnGK|u=0{1Z8*LC|wViasRLVu{x>Fc7;VtwME zUy0mSEUsq=@Fo6^cC0;p6C-|?kmwa!_^!JGLrvFSM}R2Aq2_4DJiy=L%9_Swy-FG-O5LapGP;D@4L>{+7mxu9_cOq^hm79Le z=10q(dKMMQ?^_(bzgMax238E0xNa8(qIj*!zN>7TjofErZCgI+HvMpyi3#Z=wlt+c zE%$`T`2l^E7IM?`1ArCtCX0KQtwSV*)BHqUH&P2vL-lQ{jrXXqg8Ov1l;+4o2AnWI zt!3!N6O$ry>#ddLY8K`-(g^9T(`Z`|RP=j=O%ffRok*!7JTpknt<_E&X-KU(_+(j5 zxzyD)G*0c4+%hT7x$X;f0(!fjT(fOCWnglayal{a< zeN4zBBTXh5z5CV1b{fYT%`)deO>X2Ek%g9R*Aj z*`0`luf6~(w0S>RcE|$|*$Mp7)Q;9^9|5q#p->tJ>Ht~*3p>LGTB;qeyhtA&Cn`#9tXxOV?&+|e9sV)%P4Uz37pX% zKDekn;G%4ZOOHk?D-A9_Vefj|9BC;s*2*tEMY7+@i9hB_BfYypAvk`i;z_;IacF-qYYpHZ zh?I!cRDR9Z>b($2R5?4d^%_gb5AOg$L8sLRFd}S4DZ&7#OeREVTL(8UD6>k9#W4cF ztQqwI#!vCD4+E#HXA(}w%%@&o4DMH+2T|nZ_WW2F@0suF;4b-fyOzHPu(1KHXs;TR z={d>v%8kuKwGK-s*`m-3Kd5DKf& zY(JXG%g{_Z3LqB57YTHuTEa>zdN=cZh6yC-l35vei1r&?L%_sH3}%_e8vq>qA^-zm zKXKnkr9>v&Vw7xB2laV;Ar zXoLv>ll3f2wj}qh(Xwz;P@^O-vjYYvZ%yYFCW)4;SlY`2F;{pfVK`Nqh@@jRQoD!Q zPuyNYD_W*`s)_hJPJJ1BA|R?xAEp2vD0s#?e3}+~OJ8n#?QFYRMAkhyCDmMI*v^&tIjHLeFvZgigytrztQ0 zmFJ&k#NQU4X&u`ptUnLf@$DqbE^&R(qt!MJZR)7~ECNpN3<1!;r1d0%%5u8zb+9M; z92@s29rTx$nUI!Qmzz^T4g9Bv)XABajj~@pa_lHOL zHTNP0q;-Hm%Tp|}86jU6iG2!swK?2&G~R){9RLFj>GlY+GlJ+zF< z^Dj8!ivN9dD$jn!W?pgyo={a3>>ZjCc~oMBe7P}oI5HE3Z*(1r%6o#?{PZ*&2c{hH zVcTJf_SmL*Z!j3!>Vbvt8Hgt@to)}-o5#Flqz`){g%=nkFTQB8^anh(#S< zQnjP4vbXKlL>&-Ep-A$Eb*ePy;DZ7%abDGB%4~mMtDN4G*&aGO{}1r^+`EJOYx!O! z!TYIxy}Z@TY4&39bf$G$Lkvmp%v)o#*R#XYp$xFc0J~_0egktv16HwUHW~n%C7H8n zPiFfp4wx7gnra!l+h=_`pBkr%!^D%YM{{aO51(d0{C8yVtY6pkQ z`s>eUe%RWtH!rWRXz{pi++Tb=X}^-17P> z^0V*Z7-m0mrZEV6>4meaaXW9Uk18!W{fEB{ad2A4UTPe!AP}q!5L;Fyug4;zSUL+J z4^)|qyQcE)L6{Nj6Yj`8XyMBi8g0PS>mjw-%}8cF?N#)|qI1ct>b-s!RjCazuYZxc zwf_Uqt?$zmlQ!`w-J^QqwMTz@{b|BWmJ}xCBJl-4COC7PAC3IZ4g;v;X3@&tgj5>M zWWkbcZk5RwH*}7tNG3fE0OV!$=Ld6RhF3BOLUuT`zDWbD*vB~Rzy)42FxrS~c7->) zsRPS;60-N?T@{WNuq;~4q}8s<@#?DDS7)eS!KJ7hDY{})HgNeyH|*uWR-e$z4?jvV zZ)UO8)}NOn)Z1mStms^pj~p6XRFPLO*Z_wF28GG*bd1Cf#3a|`l(UaXAVzPIBHSQc zouy163st@VHhLysprP4nJaYX0s4ru`NlSd9O&w{@63j1OlXVv4Z1tXW7+AIIPxQD@m2v(JO|q z@S=(87ygeO1zGG=I12{0edrc`^2Koy}V0pC2z;0M)CEaAD%1V}Gqm);5H1su3 zeT6beHfgHndi4Md^a`g~)qPv=NPWrgubX$YXjmx=^a6le80I4V*1mTD(B>rk$X~!& z*mSdZfI|HZQ)q_?jfIUlDY5h0%=#1m>HB-vYi5%_A^y$+c9RiTU5l!2&=nTaq`*z|`QeS6UbJ=8Oqs2JiU1R|FyHZt3=Ey1J1lHPfLC(~`t;&lD8p z`ts1qP`XZbR;M6Y{6ZZvV0mx4mMWy5dDarp)2ie?JOyP zx6b(3X55F+% zr^ZOp`}vAl?|ENPg;m$bbYfr9v+i0ob()^0yu8nmQ&REZ%Br*g(%2*wpUQPtR^Q6n z)o}00Ls6d?0X9Xmb{aj~LLrZ~8?!DCH(z}F%^3J0&pklTct!*c`jcUeDU`{x{eAQC4VF|HhMnT3@;C=9 z4HIAK!`%M>PINU96Z)WEt@|fgrrPzR5)fNZs1s5el3;Pazkwgu+DK4+r9|<_BV_|W zI0fG_7$lF1PtZ>}(gx5c zL-V7Dl6iJJS?_Y>Cd4qM%~Rg4jz*;ty_Y?Lb%v?Jc`s|iI(G|PcAq;pQKrh8HqS0I%S z)LAUQjt*m;mgITMYMS)Yk}bXcrD4(5GlbNhd4p3`6?w0oG=27~{C<+vbm_!aLS=>T z)Wq@XSKW~sx`E-VCF+;LJ_HK!?u5}poS=*J zP-eVu_l&YtRaMLjBpD#=5V3KU)#r^N5Brudqs!t4z>c0V+L{;)dn@?*qXH)l#q24B z?#iah`a~`5iAw?8x>2IjODv(Z^!WrI?af%+$luO6Pn%fZUdO+zwJZu{YF)dXp7Gt| zPY$wak~+NGl{Vei`W?;pv@cdebV&hmlJs-?p7CLUeD4%wYv|rNGAGKm4#=@FW%Kj! zdYD#C7f?~rlqzuh1dAYq3B1GjDn|PVUs~cVc|f66lfyC%E=+mi6Y_atg7MO5G9EQ0 zAwux?opE}as86X*RhA>&9ct1qB~H-I>UbONKY(063u++6X zr~u6e{M%`JO|Kv3Q2=3wLpEqBJMF2&t;WDIwJZ0LI|*vO0KO8+QS){*?iQixLSZA5 z34XW6IL&w5HCV~ty)4*Xq~y>_bu%PX?2-pdcLBIb52R`QQ|Gir=B>lUdBw59+Z5EZ zjy}x3C|3tl;TIqH@*)&E$-A~{0D6H^1(-U9UEYDCNg1=8vf|u{2m=GuZhq*d_8bbc z0N5sCTX4@6Eel@cB zQJv=|HUrqNroaGY$HA8;|NaCsZbmQ%Z=~`J^-}tK_LwY#)w9N(|0ZUJaAzAS220>ELp zIPfxUjf&|{nkXYnS4#|)p?}nVB!=}m`fVr7&a;AGj8bniqfZ8tW$g^m)u?pY6>D4nrJeObT-h>aq;a`z;86{(l;hhKF!a< zk3S{kEh0pdoXGQ;_Ym{;*6N2F>bkB?FZyBU`n|UnG6eo3r;gboNlfVfiX*y9hz4E|vUSC=siu!k=3ClJs1r`@Z!(Y}yK( zyq-je>fj$!Fz^TXbng_tj zN)77`V5bnSn>PGGD+ct~+z8sc0SA3FoCrz9TXlhyC#v!z^OHiKrG2KsgFqbE^Itzt z@nUp>FTuRX?Ddpe#&o8+1?oeQ7&pORyhx8w@2$7TX92{jZFpgJy#4}$-;?`?u=Mm< z=|5JqXG2~zldsf0gU==~@G8YgBm54C>!<8U7}>s%hkqZ#_gO`~mvJ5A`N$JtTX3Ul#o5 z+rjQ#%I&u=3mR@e!~!HPK+1sI-sV+lEUZ)lnAZfP=$ypbGO1*c1yyE?1I$dHp=$;rAIw zawchVF)3rC(s$d<%5c=kJEyXa^s{dYS@k5Qori&W=$HQi2+1>NjV9DaUS#K!wAGvj~GIm(p3AUJIczpzV?QeVgG8^NT1ep`m~ta zc7D%ThXv}rn&Pw8tKVxxuZ!JeADiMAxTOlG;baA{cv{in@X~B2pJ}7@vzKJm)M1tj z5b%Q16RJM2E!h8XCEKtz=(f5*s#UasU9?6c6CKsyDWheA!ICitg!{fwR*8VT4%~FwxW15UvEg1ZBKS zQKSDuBhGO1M~HQH1RIaYinzA125(tMV* zHKForF!yK<3Gtpd=xPNOGcFxL%9f_fR&|Z~%F;-4J_xFAm)uig)ge3JGO}IB6#tqE za>gN}VWU50{P8!Yhh#9Ad;}AWu;nbyo&VNRg5-1%-Njs4)EWOb2%;3tS}z zt47xEDWrK9ocNs9^Nt+g!CHTVC5~NQie7+! z0SO=%62Wl2ZudN@DmGCSl^MEmGxCfZK5CjMlbO&Z9Dav`Kg7i~u0!XB2;Gv+~#Y z1TE$lI#3|+&YP-Qm-j*IM#kREDQ4Usy;>+2h`mxteaE2EweGC8#Poi)RF3yo-~9A> z$!Fo}Z?4JYF$u4TsF`(#ij~L}FyEWHanYib14K?w#+^$=_1*l1oAb)_U;gmLNTF*0 zsW9>M<3>fJeksYl(J(tVOJ2sfGNX8N4?lCVf|k$Z3zfY38QpY|9be&S!TdjGaoyta79RzdRFNU*j5I{fcVRe z^_k85%n$H9R4P&!rD};Y&0(n;Y;-d%>_r2f{mQBZzAmHZPMH%ElJGerea4q$_DuIE zZKc$DYd>~Jkowbait8sl8&)2Ao5*a%~T$0 z?F@Z9%}vAwURK7_wJ}9WA5596Yy#4`c%#gB^z|{Ewf9_>hGpqz9?U**l+3&r$8cM_a84URcN17h|1vjA+O=L{&`Q;98{fO( zV-r1NJ&H0u7#-~=ScHm#OZy`e!>E5KsnZ5ftMQ0n79ei3(lB$GV?Rp|$#1!FXdRnR z>>6h*yWwf20&Z{?&%~ITP6g{o1?4TiqRfD_A6PZv&JG%Trly2!`;-@vM2h!TO+neN zlv}vSN^d`~?4usZO6lK|QF%gMnX5(rl!ev=LHBszpOt%Cz|NNs9!AX|ho)|Jd3N2n zE-AbljNX|D$u*QE_ z0a3gFXu_!KpFMzNxCxH-_g+)R`RDQz5bY26gqc^`R*qqD#?+*7TrEmpcK=nk^@p># z8R7o?g|ENL1Ff7(+(xI4MDvTps`(!B`8q`8`Bbk~{0Hz?BPUi!&~VN3pBub7fAHf35i&7oQks71zxqPg1THsWzIU0CKxwHdD07&ez(yZE zqTjNQ__8t8~f$6UZ4_+I+x>M-q4F+!26LnnOqjy>ZCQcrUm_K^+R=rjw@L-dXJxqST1|}zs#B*FfWnlFH*%<6$Yex|nrCk)1g7SRk#P%hIhv@c{gk5G$AtTBgs)SQ+BntHY7%lXRmsK>ti z>ll;(!06=5TVhH(yUMjV{<%=yjv04=u%{boXZCzEB_(sbjXH{&a(f(0;K#Fq9c$49 zbw|KY+L+KyxPxf_`dP68KPa=E@d-w%ebM1XW%ybS5D*>($S{90-K&p62_A(Qk+USQ zT=K0!z_gwFnm|^A{S_gN&G@9KH{Eqo?MstCBk`eKtwH1YRyJ!7L^&pPXM?^@Ir&(+ zx^zCx3XcqLrg}f=@2?an!TKsOu6&|l33%*#<>Omzg`1D6jfloDTa9HON*?*Dutssf z-Qnbya|f*}Cu7TKE*wYenSN2N|S{|7uZ;pk8j`s(S2P$}6UA0HvVCX7B#RNvXDHiGv3lz=!bdQB3p81CV2Kkb!B;l$jM zaZ|iU)Dly&FbmK*!xY_bd-5$=@mCH=cNq3+sNiX-(a4pGO_X`s$6;5WfYuPD9l69g zUisz+*DJH$hhC8tQ4k!GsMvfqHxQ(?<2@l)$Xa@ql2L3rNkaWtsa+~z?)F3m7Qm5g z6U&1n13e_)(sISlXq!!x)T7@!eVCE;z9;G+x5#GW{T&YTL1h~0{EIyA5-p!amcCBlcc8sbj zx6aKM4z)Zjqjf}To+I1Sq7k{|MdpgiS7{$BH_{*IZt_!F$Vc02@zFW4E#{F^tE)(| zmAU1_SF4WvF;n=xAN`sbfhUp{gejD~FaDqFytQRRcI2jUUkP9I{ZDQe-K0%%DX+b@ zZ=|~fD$zoBmTP;f9_`ccICxY|Wrb7`53^=UJjMFza-lwN!>|#2y?tUUi;o<;@xxj* zKm7f~*x;dpH^b8|+~V!ZL}zM|58%6f_B$P$Z1W#ExU=5ZLG%0?rm|GMamNkZLoK3F zxtU1Wdxt%DoH`9xZyYN`~+R_wkXy9?xGN}UAmx8)hw_yV_71wNLOrSaO6LL)y#_Ft6yW9qSwl= z)mS($5UMpHUAxW8W)Fos6aC|VTyA&;e-{*E_&m=lg0f5z62GwCSv@hRGBbO$OT6kz zTb1|%>0sj-yKEyZ?+87PcT9iFd}F79>ZEdKxh+%W=fHgm4>Q)lrb;{Lr{6~dLVxj6 zpw5@-gqh74Z?UKedamEVJ_RMy;-^Y2SL?Z><|ip+gm~)?<$xlCBGEj*YJFWekNJ2n zTrVnA1?05o;8FTTKO{Br<)Mso;A5?8`P5%4R5G-MykKTis*eWB1C++sf9_QONxZIW zIri${=l%Mbfa@R4^S5e>kM!>koNfl^r`-G>Mdu#R)c?oviQJPYkHyTlQ__h2{YR_}}$_||8)r*44Ogdg1-DjIsD3wth5^lMx+VjZ| zD3vrlDkM>;_G+V1C4_sOn9^57NYDBfOHfK#o+V2s8#{4PSjt zgx=1Qe3Q|Q7%01{C$`hAn5A4-=}^4f+3>vfqE458Y+K~ z@HKw+^Sj{5_8+B;^IcXvj{~vllJC}m$rVw0d>hf{+&X3oq^`~;6<{{3kyr(tCb*abZ zaa*nhHEoTp6S-5WW+#z<9xmv31!rHb*YT?tx0(sK&vpL9NENsnl5jBGf_6aXo?trt zssrzypbJf->o!H$TznJECcDxQ%`Bp8N_vC3?^~8*njJ(Uw-j-j$UIvc>VucOh3>g?9S&8+R7sT;)Tq1wM}FmM`wCyy$FhKSGYrF@|NE zo{a1&KSGq>7Vuubmhgh0BKdPIP~$A1Z8W8HEYE_*DD4;s;rb_Wvat9XH=`;)Ev5pe z#Q423JPDx;&Ub(PKFClC7ShMg``Hl=U&7m32hQTAC)6?Tk5Ku;>@Pafw1O^Wg`1iS z*EghweRVQNH8#|~<6a5rAs}qzD>=2f8yL9A*FMw~<|9mFyyMy6T>k;Ak|d7VkiMVv z#f>#z2|l2@%^twz^18SOd8QCW>Z~FaYejdf2}U=#1FPGU{wUPcr;Qwu#f_3;mxq14 zNi}Wfi`yZ~(@xty?O(FH)4@3TnYs>E$DP4KN4!aD>K@|V9b~cgC);;&?U-)m5z%Tp zJS(1nl{5aXu{(H_^4IvgoVZY@zhD++o5k1hgiX6<0p62dzL{G8c|-96Owsv9+7WWt zNqlq1%ns`YcNNdYE@(!v$o)Y+&&DbE>!#(;l44jY4n`i#4Qb>e;fu}~J%y8kbSJ8B z@5JC6efPYDD)gZTOq4UlD z1E4m{brYORn@6~IbR>z_f8({#9!??c5H={$7$ITLvp7TY#6R(AZhxyN+hS5@S&owT zZkyhk&mb@8$*w_{v5Q2O;xxmCNlDkDsIU5ICjX>&g^z@|%zw>D{oWH_nPqNms@)U3 z!o2^pVNX@}`XW>BWu`#!mKzT7H8wMT90u85VoC*l8fB3na zHG?Bhsc>5F#v%Ou`X$*xGQLZ1GkfD<#$e_h{m@i?j1Cy|Q< zjRD$aBqx31;$q**z5#ZIBHuQ>5Vacf2iBB*?c_heqaERxlaQwq2jw0;R~~z?ng2@L zBl&8p;n~aOJZ?#8%ZgbA9*Zh}ozN1)A}cekd+?DJZ_Ct-nrKR-~&qa31-ozUe zIj5y>zdzi)F%ahJRsIn54K1rB_oCOHBLl@C3vW3s*;D)Hcf=fa=`Z#u>FLmSCzcZU zN@M<##JOuuUo?qx3D;%4-k)c$AIOxS+t=tlAR z4B6~XlgU>s!H}Fmqw!ejxYpJGbuir(?_Qt3HzQ$1Tv-;XpV;ISpZQV_`tYPEuWtkO z8rY|(#g9s%rV>YgiPfkdxpi8H`&*@4DozL%MIgr9;QzAFKkr9eZ`jlNN!lovFKDis zZol1H314YK+D!0oSkpzIC5q7jTqmC`?>}x%{!080Ffz|JZNKyP;P^;YU{an2WWL=g zPCQ#=mb-LYqtPsh2%~;FG{d4|8wdt^Mg3BL9`_cKwm-GS^knmTk&;7feq zMBcwr9}|5kDh6mD)AiHTH6M?Uy^f`hOnXVzSy{~KN{UnJo8w1U2pLx*Vi!c4bxD?r z^;?HET2@5w>d&7S%daLIxA;GnA4WQ+Yz84v3y;5_1yCJ&$$DDph!MndrT+ji_V`eB z_B4egg-<9q6lYb!^Lp*R2(5|o-)}?<)*2d)kQY1BoRC-Dzf5-RtVXvYysl1cm=}!C zA&)ui5E>${qNH!}XYpx9&GJe`$>C-0r-5G*VGP|I3l>x7stH~NmKM%uZ?LBm>*;xq zQuoGITKm?Av`^RxTl`KY9OKm&V>I7C@H@));kVE!ovYh(mYs{f!w-;=erzpYWF$S% z1u!-0yz*`WUJ|B2Yj}|7DHH``opne7*4j`~jShLC^r;b;(7K7-Xti!Bv%t?BnG?ql z${!Bfyf@67Wu4cLT}`hUd2#kPUS#C8jeXa5?LoyzKidk-Ez>A`UYT}0{eumN}<4 zkZ00Kn)~Hq+nyx6iQPH*U}ALJE_J-$&HhH2!#4;3_S&VP*QSYC(Wd0JZDZCfIEt|% zw_aH7F#~;KNjI(ZDfWXHOyp`#=W}`vo~9r28!T+8`k8|E5Bx;h%pQI0d=XFUho`uW z>lo-I-Vu&Wuot5nN>tS$=~^#Cmf5{`c+pm#=qZ6r2%ECY*8GT>TrZ84#a$qy&8dhG5R7(PUz5s(-o8%F>YLGl>OoRXc$zQ$w={f7Tc~K7 zSkNt^{ItZQhS4xK9Ag(ZmF>Y|raNALRAW7y*KA_qW9(Bq4QD||Zf&jno|qQCK3q1t zy-Yxe%C1+kuBC0b67nn+HLDwvtf;2b^Vh1PpM{0JRC;%1@JWh&YEWqRQnYwYtybaZ zbLSnsw*$4cO-(0-pGhA~Df*t0bWVHuD&dRkTSVfXbQYfIUGl(ib7CEg{`lfYjh zmUJ|bn@+iDJ?WAE0ip{cYh9ZQm#WuN3*vH!jz>}ah>(=$0M??Z=LU{MLA)ZmPbmE5 zQYm{w)kCB$yB$}z&3nQMQ7g&pSX#xcU(aYC{3UI+wH`xAsYj)xAqKY&xJ&Xr7{@6u zR5TcCnTh}2CV2*B6`xdg|C4Ep=<%>#`#)iLL~Q>9!$9j~$)BCIr;GvQ;&m2O^^y(*U{ z))#w2Y)c;9+Es`s_N``|F`ANelY47q(VREusK4f>pa&j({Yp={wMw*dQoi!7cT#yx zAh>2yL6$LDcgEVF5wPV_N;udUPZ49~Nj1{A)nn!Q%^YP$JgR9%;R75G(h%FCq`cP# z{8AWn#7)KkJ#18 z_3xDL-S55s7Vt(;DN2jYM!ncc3HOCV8=%nZ=8+0QnGV480YlZKMeSYguc2F!f!1~= z&OcoOrEiBef`X~Kai5~BCARE5>SHeST-wl!@mA2j(Gy!QYVauywr_HSEW{2QlC+V|zlkliqySGiTovS` zcoUwQM!occj^BK^^Q`&7Q-^HTMK;r~P2i|~)3`8?!P^77g_CGEO2`#eQ_kZtWMNqB z)*aa4z06QXvq#oa9M?kLoKD@pb}(Gj+uyVKdhH|j@oJP^81K*O;WaRahUq83pW#pz zCd@*g(zQP3nSVc6I#Z$L^x+5}XlR4X9&&Ml4tA=N3M_up!i|gO=m%CMrcR33#C$d*qSc!fwjDG6eoI=?< zzH;r;8=w?8&7syP*sxkA^1*;2`)OF>$*P_imZUen+SV$}fDG{yIbsj{rVpqLmw8Y&6 z3d;9mkU{BF#D?+8$_qmi7G3NChIMI@Vn3+cmg|=!KWMQVLO#6LbT8wb^ZMe+3kgKL zizs5ruxrj7_1S5+?fcbqWmio94ZEtnF>%CuA|NAr=p@Rwy#AuYqw(7x)_u(4=(U&E zn#D68K&(HUy51HM)}P3~BDd$8-D`Dq$1 zE)6wP!+iVF(z#YAYEydi-ZdIGV`_mTTrp*5p|8A4L_)=^aF)AE#O&7himx3*yb02S z-Qk$wyQ{AEokLht-D(0wJCe?u9wAG77Z-gayV$wR^6PgFbL=0pKGj%TxhTfE`~dSG zpyGK#8;8@=Egeau>w1F&Rf3gzMm|I40E4ee=CAbKBj)lck_GPWwqd( z*EXL9|91cFN7jR%?|hr%vrO(g+%-rOw$jKK9(*zR85e(ES4>=$6jPeYVc1!SDK@ew zTHvtgzLMY|BbMg9`)Jm1eu7Iev1HjSMn+B$0tQ>L&0yHF2<8n5g#*kIxfkY~kJkFe z`L9K0Hk^yPn7-WaxEW}_lMr^urp?l-Ld>%u5y`rq9nngcqbtO3H||H6S^NjEC9U&# z`?$Y(8&p0`aV+p=FWAy-e0{P;3G%;)Bl3BEn$jF|D`{IP2O_z}&;?NorV~q1PEUC_ z(u4Lc7?u^5gwrQeTRon-C-mky!>16fdBlanv;cDc`$|UlO%~mhK$oC4WyPmPL7CWN z%PEJ)PmgL%0@hmK|14#Dxj!zZY4~lKnNhiXv%8OS&0cX-fAJw89iW8!}^vM@@0Iq!ZC8$$V4kr3wFnwtwjmH{M$5PODElkEq;fsCFN_io=9 zF76NdxhXLO7jdtOiGe?u)Su4DVyF}-97a6A&rC#eJ>C6?b9gXOH^$7-lHOOj^B+KW z=VC`pa({EyLbO}?rbEJ0{LWUGmkkd5bIUVGf7oz3%{YDPt|RWmDdc5n&sNN51X-gS zi@&kL8+k+5;619Vq@<*+e5X(U&>yktHKGUp>Ca(MRBSLy#AFsiB@htb&zaTP2s6=! z@_+(=%Fft3HHGGB~ z?pLGq=uTom%6}=H4ekK?9c~?Rw zETS-?a|ZJU7*zH={KJGr`9l-o3Dl6J4mZ5-KL8cq8}!2bN~tCBt|@-d7L#g_gMZ=} zF~-2m$tW=*yLk!x)`KgF_k8hBkMzRuQ399MJkkWj&L0=>d`g)8OQ*=22Ge7EqrFWa zGAUw({mIarvzG4{!enz4D6j7|PWa|s%c}fGA9>YeZkW(%<1dZ~H%DqApnHs~;%#D@ z123cIdhLw_?)&gzG(~tL;ifL~_a1v-7M|4B|0UGawwPO;{hl7D<$P{^tH#upA+To} z7-K@3Z?6VRnVHolsbZ{VqSe76ZzJ6sk1WzF-nbFeTYr?bc)9*tn!>Tdmjsk|!#>fu z!G!Tnyvir>mDs+#d$}p5g+Vvn{#c!BMVP&(5g2i|lNXB;ccT=P`f}v_HgOvJeBza! ze0ojoD9?puQR2(D6i3R|T32x9+9{BlaGOm6fY?##d%l;%mTN>P@Z zKj)kB>(>IDMusNzO+I+FrHABBrlJLv>GL!5QXb3S?Nb@m682$C5y?I}bDgRE74%ba zQ#J=V`D5+*?ESaFq|#RN(_Mj$IogBKFpqf|={@OU!&Q^p*oaDZiO++U=S*(7-jIK* za6dBS(z)8PQo|>75%I+8=-z7cZtrqh%)dUuK3i&x&LnDkxltC0cVX;li6ZD7Ob^d7I9vVTf3}|bM@})cI;G90Xk#BE>Jlnb7 z^H=Zdb*>m?sMiA1>4wke6Q-W)gzQ$4m+xvcyo(V}jys)0 zq#PNmc76}O5~x(20{Lz?Bj0pqBK-iNkmTdTF#n(j+v`zQiX-VDV`4TgseWH0C|Ugp`GNx22CSaSGW=Q&!#b6oajT8S2ju2R2`F! zq)xd?v`@DDo{(d0NO$P6x_9z(G0S_AMNS(T!azb0|Gpueyxuo9llZyEz!~@SKfsHQ z_O=e+e6DVkSn^gl>=TUtv7bQi$np}cf}$f8*|frSy{Wk=AUgZC?fmvFtg&>a`y3Q- z!Eh@NXC_h;o2g%q8*8p)_XJ z=k;XPz>Rjzr|VP(xzRH@EmSl~TziOKrPtwU{X?`@Ce>Q7&LwMM>*=rnBCc8KZ}AElK01WA^) zW!smXkj!T|AB$l>evm0m_jC9NeiN8G`?aL=Yhp$UCfxYpm`H4S5Z=>#boEbkI-Zs!SrkshbVJ32m@u0Ny&?H_JT^jn3Ie#A=Zbyr>^@QDTt zZ5JghkCUvvJjl_JhJ$m<+?KlOKeLFSo2WDIp!s3aKe1{(c3%#$s7u_VECb|*zFC%0 z+We}!SrC@8%0Rc@dT)8I$0M;f4NSqoR?%Y+K7Cmnlk@RH?AzCI6ubVLKlYU|x?1t$ z4^l-(=NZW(wJLO(*-VW;7a^Id?l1*7xN_}UK3 zKjvf;{o76Y+T~l@NCcv#L%5@21v@ME(+tnf5t^o70tMkM*uydpARxe_YQ#g9)32#Q zHe7%n!B%>lj{}aG)&uP2b5!u6^m!wI@zf~F)K;jPm0s{Vf79S;lljvGsZpsjx1buuTI%ambme;0e}MKHHPC*h4UVOc4jz9Q(07@MVRe$8US+rcxeNw6Aav)0Z7~o9 z26}BoOzSDPX}znvVJ@_WVdBv;u}SWYcj!E0F`e)7@(h$4JL@R#N|Ip zOUbIK{2=qE8^*ueM~B8z#C*B)zHZzpZvkEEjYPIA zASFeEjpqrR4u`)0DtmfXjl5tQ6Q`?J0=6A7g;C8}h5M@5RH|zyZA2su^7Z*b086_# zO`!_)!Tbb+{v6;w0ekr;DS6a)#2_VE8)5aQB8|Kjq%7U?A0X}L3XN=6-ZggIBuHlT z+sO1Bt5UIJ&;Hma1y|lvJBLU2`4;v=$CyCWj+^?Ia|QaOGba)+t7LaB+3a==Kv%Js zVXNuaV31&%8fcQSpnVoec+yt+y5*42aZU#vTo7Dgz`TLG#T%^=GQJ4#^7uU|=J3 zK;>|N38w)#d#(=ulWE6(7K;)IZe^#&dOyp|w2RGFgNlbTLr3WjSAq1M?$iY)A->fd zip{YAU~LdymR0WWNftlY2+r_xJ*p{JXm4mZqct`}XIph=+6tIbfDRC>zfA=PTGJi6 z#Z(HwvM>o@F`D$rnem^x6KJqAoD$yEqaWZvui7Eu+Y8#vyt&Bh68~wG>V8O!IZCA3ydF5(m7WoTy9KW==U}8T(^0z3vSTR8d0XXo@ zanOmeF!3^d_lQmEq_N;_gv2y_1QqR)W0x^{^L&F#TU5w3jeCYWtUDOM{TGQW-8Org z5Ea{S9R!dPM;;BfVE+%mA^YzbuB+#M(f`OM>+cOhsrSbKc|D>q*MDeA;PsM6Fn9KfV%_8S)K0ccQPje8>yi(i~yL( zW%W69?0&pQpYv+D0 zN?vT6!IMd7l3^8>U!mv_rL30=G92o9Cz_e44&$%#>jGRrhr0vTVyW-P7?$Yzp{oP| z1**561+^HsDlZkh8VdK@*of#9iq9ADUox)B&YB_XuPxAY{^#;Dd#_ki*RKM9hW1He zespy)WQI+JD~UrIGkhK!;6f$*)MVotsqyy(3wTmR{oX+^T(WaeQaBxj3R9sE%fypG ziRRCAwYmTaA20R~vDvOb>A{&mZrUflWNI9lzj5lfUD&34!5Z#OIKW%O-H?b7nREF4 z{==iL{@^AzdI8x^KM|QJB*U((dn3!c+rRtp1}lB&0+!XM)WblHfB!(x&*l1%ry-9IuiD6xcd#wVv;^G2-kMCB$V!ls<*7KA z`Cp=^rS;9Ka34FMgMh9t^iO#NE?5&khusP-|J#(HKv&ux=! zD9lNdi2+->SDQQx1gc*Z_0;_eGBi#qz-pOhyDzHt`*-3sOc)-mt8`QTNuFevZP;&qG5Djb%RX=6 z)NqeADeha2n#eATCWt?^b5CS1F4edD_=?yrZ&%9yL)y7a-3N)U{iIpc#`Tc>51 zjgRKXEX$j&>){vHkQMR&0d~Zzr7lV-QIhH+>0>E>4!67Dy93_GZp~2OJ$j~GI2(-x zAta#Q1;?nhd(&+ukLm*Ybt#$Xxp>yyeK*99yF$h8YOGg*f>PScJ~mu*OgK|P<|E?Go zM8|;PV5KaD{iaiM!S`&L7_@^$w{450L7Im_nR8; zpF9;T@D6(Bb3eh(sc>8|k95|yuu&L^s+{~&zE+e`zfTx`eP=wr)s`R>t~CIM4pO-M z*5a?n_Z+SkxyydH3x@U|>tZh6b48P?1`k~Xi-8={p-h5#@$NDnIRDijb~{Y^3+el@ z)6H6D^`@=UfTJ=n43<+d^S(7MY%NA#dsNeAM%x#xEI8bzk!8XXf=jpKgbMI?iuy zJV6$36eDA2W3lMiy$1(O^plOyIXad7u3IYKIGJHXv9x>72aG-Hg12yLT)cY1Ea5Ara4 z+73&~1ST~e(1soL_^c-ux&7aKAwUN(Rv~sb)0W24p?Lms>g$K(VL2$iV?(A6yh}D- z0`5uQm+k;Z8Oo_4>xydh~gxJLZWHfmOyA zNSEA6id==D;n&^!A-uHQRD~K-2Qa{vsY36XX^YK%O9?P6^X9|;4)EVCW~->YGHx`q=|gdy!2HxoaS5ll&^UfgUZg6K5f7M z>6riXF=^4lo=^Wdax!x{KrDe(R6`g z!^!f8^f(Kl?nl>Lb&IuPC4oJ6fGyQ%l>x^Z|7j@7HhD;Hyjp6MSDX7v8c50>Os!CV z5f;~D>&>zr>^=X9rusPs(BssY8$6NtnF5a>eA78tvrR1fvQZV!hH6mn|-4#WV**XD)HdFuhV^g5Wd|@lna4&|hku6uL?Hs4pKSEMCb5 zfKE<@RG4Ni9sjIdNWACXekSmel=v^H054b#=35$HaZ`p42|CY+vx1tB5wi z2jizn4h>`%^47Nf54#9hSD(Mb_bap%tfqaVx$^fLpfp8`+w8;ww}PH z<1seJe7|I%wo_El8EVYpg5UbxYm=6W+E0SZLfS074~6UjVf~1 z%B~LRW|2pHc{sESLJ!7zL?nE$%}HFcrT2y%GGzK6@=mL@9+G6Gjrtu-hFX-e zzBA@z^E|aR$jS-rdIy22&~}E8D1m40Uu#4~#o}({CnaHjBoE(y#89>e%m+h85agbiyw)YYhVUciUc~9A51#70?EwVEf zYhn6WqZIY}(dh?gtMzpI`sU#ZvZZO6K&cmF#?kjQ4*tP=Xor_*(MO@KnvyDoAKsd= z|BAUW$}Jg3*2w!^$@@F^b9)6r&-lz+)(f11O>St=J#M3&&rNS49XCs9Msa4vFx#fM z!#L+v>#6Tr%L3-wEq|nJjoFsfZ5AB%2A^|Xk9TCfWq8qmzA%0G*|>OyqK^WP#`P;S zO45nH0M~fK+c-lD>p>*2w{?QXax2SZG!_{OZ)BPZ^t)8k@wOf8bUbsBPCMqVrw-#k zc{PQyVIPO$1@NaN?fNf!eUJ2nnx)<-(tG5uE2R)Vm24=bww1shKSY7?ggDuIf_lUi zzXB(7g+EndZ*qqkWcW)PClgv2Gstzx^{K7%v>pty@{g1kU~I>2%|PWWtqo|dh*aY4?W8Tim9OL*JoTZsvLviLIr~v!n^Jg5 zzBqACNBmh|esI2S1Se8ecFOpkOYnpld%EPCx`7Yo*5ncHlvFm;dZ(1v+QW@5Uvm8} z{;}llwq~zmOWAe)TWQg3Ms44DorbyH7>dvpsLOtLAdv}dptA4S!Iy;BR@)g{&-jWz`(nmeZ9`A+;s4+Q4k4D2BnA)|}0f0`1t0u12j(;)|~AAaiq#8`({# z&RiJTvOO#Qr9sIsh@^3hXaZ+Ho;i*?bKDFrg!azlg8VS=SR3XxWAD;w@JA|N4XX~` zqLfFBxHL1r5Mu2z1Ta(313%-hCaTi|lly*lHs6VSzWEGr-O+`S&cxk_mzP&GbFY&< zp5E9eYemy1xelPF9Ey3!rDbmW3>ikvXLCbc$Nq{*iXdVIo=G8_F!VQY^ zq|3Lo)3{2J5?47NCYnmSNUAs5Y+13n(nFu4C*wsL>^9NX9gFZI7~a&PX-ZRV4VK(S7ey2HEf!1BZy1C0$UtRAh6fnSk;~TQuKdvY)Zg* zKBAtS`TnuqjZJSRZ}LbcU1HC*0eZew@$a4^azg~ks#ME?2pRftwE>2oS`3s>g;nUQ z3(HlX;_69dGB{IqV8t9j0q4$W0!aQIvCk3MOtUoQ$Hbj_T3*9?YrAEWQHt-EUzq!Q zO%Tm#FDr#+@k`7SDX$!t2V6Nc=GAFkFzy$lLAI<~Ozt)wX5#3Y*N*PmJkRL{KnFlh z@<;CP32D#)8JYHc_h@F)xci()+-%>~z?SBNPAEMuH7`a}`>FyBY``i!k{;?nU&gkLQoUFXNrrf*%o$OygxCVgK8bM_~4 zNX=2Uz!x;K3V+qp-MDu_l|}iT2<<&=cM*I~C^qu~qijTbnuOYIVWK+=IlLGgF1^ph z1i%le0Tsclcv|ZR^AzL2t6t61Pypo)N2f1j^+07)aOFDF4dbjdjf{roI~nZ_1ULB2 zz}4D~hB!0%t%Vkvi6VG}M<_@Z)U%{IO*>qz0L19)F4&9`^n_Q$I~(2Oh5lDUfpgkI=j}Y*%pk z@KJYwzLsF5ACSr?MAtFF4=LrN2WPixJBYcfUs`9>?CiY#@?J9&=mN_|A3)!)k9M*O zl!p5GY++lht}Co_^=6N|M=Y*86u`$zZP2?)qVZWlR2mryAXJ1N=z{?>Z5i_H@E+F*-tee2JK=Jg6|-)Z>FvNytd2nlR?StI7{6haHUgZ zK-uY9v8A%32AUky28DqlLg|>`Ci~{WGywv3eC7Z=0OPu%MJGeQ0ry8QTjj@k_k+>d z287tD#@8ygll&f;)KC^$4TUG~DifbUcqXyA{;;k2Y||~}pE2tEuh-u1?Z2uSO&_cN za%lq}vi@c1mpYTp%TPZN z)nFDtc*II4FufiUuA=$y3UX8zgYo0z190UUvZp;S`%9UnpNzLE))_JTm2sTxJkt;} zvQRl!|5WdMIy(T-QE^;r4jg`RJCt{cBVPytwguP(&hqi=(L+>{z-Wz57R9|MC0+dl zZ`kUsT2kS4f2-1>ROB1*h3;i7URRp&vg-aDuTf?Q!~XkHFBXuhY-hKS7d00GW4NF- zNGr18tyD;1n_BkPfpZgFTaG3lyOP;6P%Ul57L!?dl(HuQrCjGyp4ip@Frj74icK&g z76?pycqKFQ-Dvvk7>E+dexZa&C+0Ws)6iyX4&yN@;^-D(6GmXmr1;yVJU^j zd}STZt60N5_eKDfE=sl~9?D?16!!gcZhnOBb#1$&E$l*3YV&&P@f?oWa^5g`USFTu zb||wF9^igk^|=I{@B`^SbqfV%2+nT+YCOo8P1jh*|Idiwn*B>GYtj@K9hk~sOCLI) z`WhLNIpCd@b8k+Ab}bQ#v=D;>0F8Z$(`R;-P<^J6Yv3-!73R(t#y4ot*}04e!- z8$yE8od?NIg}*b#*H-EX8V=B3Gi@&9^h5u)!yw7kiILRY)}IvGN@3Y~0rR8VVUi&k zr>gfMeNH3l*~&c_*h?r;N+BYgkx>S7)&2|vLk7fDF`KG0u!n0NuCt6WO}6Jx=pJ|;8U zTkSCc&hcSOHFOPqCqq@k(hTA13~$FY7-H$V0N3cR3a8UIiUBV81a{U+Y(YC;#=kAO z`Rt0>0D;P%_iQyG1v*Om9yHg)80=5eX`F@DmLcaj8cWBK4+xieC_NUK3Mc{D8Kg=R z)(8z{JIIR40})Z3)YNHkc|m|Dq3G;Xh{y4~MpFoqvyn1z+VmneIgwUjf_bbUnZc(& zyOBuS9sxhm@t->R7$OoypFLTnY+kW-B6?Te($dczO1#Vm_u;^x)2{;%?M$Br=%NSU z>Hu4Bn%#XroYrFVez*Fn%iN@n)tL|4WNks02FllOn@Q`iBBPLgNUsjv2vdQkK|Z0x zPVO=K8~{%jAA}EP<=n!Zx(Z6_R&-aR#3pJoIK(>SjEZz)n8@@(Ab{^HItD>a3O6C% zkN%oj6RdMoy_2`k8^`E7#sKgIphGXBHS~4BN6u$$2OB|YxMnjyEG=T;ON^(mt8 z`A><~I>&^f{1^V#BMZ}oE#t~tf5ndZP$8w}HU-$vkxa;;Z%Wtx3i;k1w%+ah%p`q0S?!0!9B17FOiBgPrT&=NcZ1JX%fS*l7=-_|~K#6Httoh{1YgkhaO zW|nJso!+aJMY!~h_KxM%7KQ5uO`d%gSOEW^P5I~q|1H`b>mRsWHS#*T0vyy?>xITL zYU&pQ0Md=_ntZ%)ExGFJM)%jxs!!iB{pnn?t5l&}K;z?!@}u;5<1@oe^00J5Dt4S4 zz7$GwBnVh&)w(R`G(7QV(}#SzQEYuDrLI0L8$sIH58C`pQkPaiN!@Ft@7id+(wIDL z$dRAa4_czi4GAaZ!)|G)Z(yH%^FM|&8fglCx-jQ@J1$>fPlK7QPiu8`U2}BNT?25Z z_MfRm)qr>-(C!NM>MAJVBbC0`f}{S;wDDxyVIXniv$<2iLitQa*@8Oqe+`|BKhysg z$H!!pTvJ zm*iW&-#&lA=ka+w-k)>c=e%C8r_cHa$GZBuFDgC1y+@icqO}iW(u@LZC5d2oSo{lTi=R z!Gk#^=4KEik^m4?oAotAWS61`1XV-NJO`ZP@dSqOPxwJsT@Q;0Ap+u}=MOGwDxxOr6C0{pe-}`8t(F;U4}YZ7dY%g8ewK<80v}1Sg31Li z$o>{F5x5p|sndUIF5VLqXLLNi&SilZ6KE^mlu*MV#1l5R2v8P3U{Hofed2}Zbl@S; z25JM*E@~Yvfn-)phYnvCfN(gv`Pk0kJ9THGu)gI>)tl~_s)}rD^ZL)Z&0&8v8F~zW z26YlHB3g=-4{LsVV|1%7;gq}vKH8y5S3L|=(y7rQcyw~%Y*|hN4JL;XwE3@44@OYY zhXoSB3&DEdklFp|Bz1NEEkXS@fII6PYr#+c9Dj2@;lmEWa=0eg&RcGLic-4cXL+Aj zI~c~ZCd#-V+|Sv?$9AF8HSag$WWWFlz-2o|P=7$99VQ-HIv%*|APs?$-6c}>1-J;_ z)W))DVCH;v`I6pjjQ=%H$H@VG8OtVQ0IawxlKo?z*?dlCCTLo6!+8j+kGZS0r%`uio_ zKNqj)YX(=v^P84H` z5vB_tgu#HZo!I`~Q>C@F!9GrVTM>I^mO)VxqUp?{!q4e7ll<8r)=WI$C# zyMWaOz#6CEogXklc}^H^lZOocnD2q`9V2?cAgsF0#pl75;|Aliy+mKcfzT1-)JbL| zRz@SW5#HO5IgGiw8hpQ+6cF&LfMnlca(Onwjww65r7$A4wS+X}tTL%y5f(Go zHmjbmDhvgkdB1YE7cQ(^wZ^@4={pp|g~lCgoT`{UuOv9`#eQr;>|6Kgm_6O9^vj&l zz46E{sLuQGzT~965B>e8v`;1Ho4@}UKa#TE0N4Uso#%fs8dj{}Cs=p?kpTCBY_En$ z{6(xx$=o~%*^u!jYc4Cl1Qgp-?T9{G(@b!1urYpUp;fdO#WwJI;cEHyF2=*9I!5{? z=FwAJ9L(W1^M89+K8XCbrsIG9{pK+kCbxpm1Xv@Rde{|nemo` zFekcVl$+1t{a-7?^YY?9qeVvR)}`!=>nJT7vxLZ7bG<-ZwWMXbDQ0Z-pOA;e`$8Ky z>g0zfYPV@(!t-wvpU)!`pUhp}OkiNkqlm_+i>uc^RdO@zq-{R5G&K;9_0}H$N-CRq z$iHV9Vzbb;4S#a{(4**t+O_m~+aLkJJCoaVdvB2!6*cEFk%#(t8E@it57r)p zuopXX-df z>Bu$@th8F%*5zAaG&-NFSwBHELK1_wS@u3Tt8tg0ib!~%{s~$69ZIy|LQtLl07P-u z@cm7jM`B-6>IFt|kF!G-eT+5h8QbAM-4X{gFHMeQSmzt(q?gt-+m-nhX6&p*34LE_ zMqCIget1Wx{bt&Y(*_D5mXc>X-4w4kU-NKZF_31aJMFSAC6(`a`^;M~eSA}Ii7X2` z7>X{+kkn3J&lHI;SA`fnJ2TmNVO~h3BJaA^!reSuTia;&Hw6#c9jODHBQXc$JcGA; zSwX?ScfWnh{w99+=u?!!t2tXpbtWKT(stGt;evL#nXz`aPc^H%#KpeM#}2C$T+e%a zj0>7|!%;R4odvl@W0|5#!~TRKOH|Q``Qc#dm}43B+Vjcl(vg9_ZqB0K+eY8}Hkr)o zA08gDcBsC0jpiqw{tw__P$VRb0k$nROJMHb%|xZeS^~~it!?Ez4anC9z7f3Xs+oF8 zJ1o6YhT2g)^LeWuetvpZyZUHJ_01fL_K>R;Py z`sUqOTl=W=V8q{SXAi90=}TxmqgidPQJHv(!1zq_=8r; z-Z2}~H&DA5FRx?{pR0J>c&Wm*zNuDqie69!;UDKA1y6ddoro&y+2xw7Jxx^@deLno zb#$|vPe{i8=&{mI)({Z@-#i@+c0I{OBw-6>@29#T8a=b5ZX-*~4BH1$ON*Ofg<>iF+xx2*4JMid~BdLWHJ@p2`v{o?)0CXcBszCU!)sqT&%&| zB=7aigZCi=)oVVE)621!fBefO zUhx_QGy;l=s(c2?;I!9(;;4b15G8`RepO)L$-J^3?sZu&RM=^1n${UhP3sYP0_lI&NDS>cf@a2$Ru;{aV(<&Y^ra^kvp!2Ms2;N%DVPnGc&EW zg#R)9R$V8rDqbMXcLNjf8slo#=kC(s<*F0B?)0Vk&CK+?=0)j(DX5pI(NQCpB5=^7 z+Vc-&#rlaFlCLZ*(tYX3Qajzsore8kI`Q%}37_P>lADp;T>sYCY0u9&kMvV3vHm)B zTS5DF>eU0EA1cz;+Kb&XP1=r=AcXjZT<^7Acw9kQu*};48eqdzwe0Dg@(wS=CkLx% zxqf>?P9D)Ru}!hMrr(seV)}q@qRj&-?*@w|N_CCrwbrF6gzQZy;KH9miOXa5{)w*T+WPnN{TD7gq3P%bi-E5}JdSviw zR$IA-UBBxW7y6;NKPdtQ`j0j~U^t*2@BBO6wPgh6q2&*^KnseC;bN$(EN^-fhTyB&X~{c`h6o8+U5N0Yhj zcNluwKJ4v_{ei^>R@f;NB?PhHG4ndPd6gbs?^ctnNPm?dToLVCLgy+=X1>P$9Lu%% ztK5=bMhV#G}2L!`HVeGWcfc4&Kz+S=>; zdJOk{U)$nrd6T(M{cBvdF=fz1*fLH;f@DEZV|EV!#d3ggrr{jW&^HyKe`B{jy?Jr^ zYH@tWhf@8~P+(eSdY+(`Csf2uz=gfXO^>H7fAs{$O`;Y+t$`EQ$iZDGH1L{n#fzMf z62&_EW#1OZ^@)h6{fBDw-poIB%Msq&e@P1J?2fPBi~83%^NPBKQPq63tnAolaE+54&uHrpx!dOnQOqIIzcCIhXIAK5InL>dcTKK%R^*MZj%U`_x74*XQ**JKxXoAg z^dkxkzrGkr8<_i1$f!F9oVuX1tE5deViOTznu2K(Z~U#Jx#g1(#Py5(mDlv+Mxf6LZ0@I{j||z73*L$6le<=hG_P43g_Hh@)M)mZnB709XIEfRP_g zMt-f`YLeyCMF>VfKubox*Prz=9?Ly!HzRk{E?^~hn3qtDs5A52ihA4*xr0Zs^T=C( z6>9;KK0xeENXXH0ROj5Ji$wP>5J`Lk$_rSkAK_`NWNQTRrU9wZ_u@yzvGP~dAKt-s zg40vQU~$0&7Iy&9)+u(k9a2@DGkg_WrugUbcWuYkOed-z$D-sMCAt->tIVll7C8nX zLFC_T7dI3;a8y$4E)l@F~5hOYnx(DIa z3ZMKNVULmTf99D%f!*C42X!>toeju{N+CppWS zSzkG^L}3F9Zs#f+SofPGh!Gy_H$NbW-BsWXg||4rC_rlu%)waa`0!n#EZ&SH9=JWVdePhOxQg5(4?n1jhzrs`(7Wx7W@ z$48kow3cP&RFSh%>Jt9uETYE)f?YatkOF^Jv>E^ z+;48_qg>Vlq)GIdWuMzYlyx0 zVSe`Z@FmGh;&rZH+o8XowFF4Fe(aowA)b6nhMTE7oP0Uj`RS~Gp4hL%OBp3yK>@fq z?hW&Ve$ERHc5SU5oVD(wo%9B`Ug?r)G@|M#RJaX(XH99maB;@D?BOZ9^2Cr5>6S*z zMsHs@B{nH6M@81T_ol+v5#fFCE6_H=D$L2XX0|8W@>{t-wrE92S;C&SJ(q}COq29J zOB~1g!VheEZWac2iRTV$@Knng=juUa@wd56z6<%yrgmkT6BRi+I@XdLRC7&PVwYuw zF!nGRqxv%U%X6Vy5egNgg4MB%!4Ks+J{x(sGxqik({0+vRc1{oTEk2UIgck2*dyO6 zm@iWf@`KjF%-;M6M%3jkCAX5^nY@!4 z6*%Pi{)qA9f`y<{AwJ)h3n$zrgPfC`)W@y_lq?&F2^JQd+zV*P5u#=>yo=)oW)968 z8ybD4;6x$i|7fmp%!JQAXEB5}uD5*M>#xb`JcGIk=66Sz_`}n ze9P5pZ*%YO2MG?xB9dNIKA?o2@v%raY2&fct zMx4l_qM8hcwdXYZ2VoV3neA-rM3Qh}Cd5ildO=A)3mzZeNbBms-{6aHW6cng(c1PF zmAgs5@=M2pqW(s`3e1Cbw43H#KLx&3fX2jf44?*@PxHXN1F+l#AXq03B>O4@Md=4`m0g&+ zQdrL1r#MQlH?bzloazm&f)rOAsXZpzlv6c~`DW~Y$;lU-#_M#=8DCE;_nmA`C@;*v zw*1-!w5d5y% z8-{w=BZ&uzz!H{wB{-1GZ&jN3O0Jv_2o)t0$x`hscPSb&#`tM>D5Q;U1Qq*-Zvy7_ z1J2tu4?KKu4*4OH=F>{|Yuz8_a;Ks5+@PrX<`7;kqI1=)QmeJm#V-9JNt+!wTt^(l z4qeY|znstxK0e8>H((@J5Kmju!sD5MN_S*>ch~XJ-!U4*qW1!Oa3qPE2+xFyxW{%y z{)rIv*Ny0hn$?D1P^jFq4z>4%KvWNE&>1S36vr#e`w*?vTv9DJq{y@?WHD-g^=%vL36H4>V5PNl0Av<{ zFFw!v+wXV^RIUpl)s5tFR7CL80Fbnd)BpgY3k)Ddn};HGwO!aj{2vhMB&~o!UoAOp z7df=9s86YY*Q0(H)mpcfHGCmW*nZE|wq=H0SuEr(HGixdaRGABZR<2p zoLXLt$d+1X7|#xL>ODZNU;(|u-r=Q3b@F#WE_^x??mJ?Ic+lP|VN@Sku_Zb9JE95GipD0t8GO250i6H0CVxyk1dB52F zW^e(35xmY(k9Da}D`iktBeq*-lVHI#vx2dsf$$=?ya*S6jTohqs0Dze+9*DN_flw` zfFXi4Fy|h{o<2SjIu*oNTr6!W%pQpd{=V9*?KMITUs=yru(%i;|0|6sri4)!Wlq69 z4TNtz^sAXB-wzkrI>8qwERSku5#J1g!HVzeU%LBu0VMepUXhGY91sePLc!AF+Xu0J zY9@uxSXbGB-%ZD4Fl+d5eDK<|P=A!KQYv59+@5{wqwLga*Dcnk1qkz1BWb%476bE`c#T)?J+#pc zy^GdR4#1@tg4SiElk^bh2p*&2=gXA@wG>=G%8EB&t(z%MPYwrJ^EtXNt!M!~NX7=R$~N zSm{oSzU>$zZ+;H}=$NFePex7`coJBY%%?FJUhc*AXkJ&!gI`k_jT`fB3Bz!MfbI*j zH3`Vf1#jL$f}jViN_I%55Kxblf|eW4@`%z4Lvcn6sCMZ!&t$Dh<0pfS%9oic)X2Zy zq&h}LZbS1(FQ=5kvdy~5xc!OGfA+jWh`97?FfbJpyig5QEnd)5%S0=oIPeuC8hTY< zfCJ{Q!_~b(v?~)xLVT#643z5u4*+sI)gR>8xxS}=3s5Uji^6@GIb$)8X;)(K*w6s+ zK;o6>!9R>Y&?lDbzw{Swopv5J**l!+S>GP&0Pwz{FwKFmdtD8tq7h4QgFU8+*}Hx{ z&NK}ti=q!|@YXtO5F||QVIc2j@d>UZY%YeJC13CIS zQ@hXrcG^%tBPlRDo%a0KskE5F7$j04YBilKX+eA$?GS5f8R>7pdJ^iHaPcdP%L`cn z00;b){3nH)oUjiw(w%Pa89U|pawqODC0@-O2y~_T|H#e?;-%_D*JCghU(EiH4(8%({;-YU=-TMe8`sDwET`kLecte}7|YpN8ms!{JovF+`_s+ZQAt_g)A-6vER6Efah>aGqFWz~p){nuCUN z*QvyKxB$P|$S?dqQiA~5E~s0Pj%1W}G^9$m3|pC$Kl}S2EMYf7fw^2&`Fi-bO0U!R zYj}<2$v8AzXG{AMY5@T>ks+Gm)s5N*|6!9F+kO(eN&xIPLWs=?ATNNYQWwxAkUj`P zY#jp}GDFb|&jxe@DKTNP0D(Cp#e|98zaXa+%FhV?kfn8>|FRv!BdMB=<%^r`G(OB) z*O|obCA_Zo&fvvg^T^5}p+R6%w-NxxA^%6!2R58Pn{?PUxg}`kY778CfTV!*ZdRfl z1`G&?iat$^Sq$gtbl7eToY%YZoRH>W#^Z>YKOyydjzfFak@N$5lPlH_d!K0HxWzi! zA@`ejP|$L|0Vz07br+ifV3C3S`lKcnUZ30EP5%}PkXq&rq7*$}eL=~F-oY+~c7`qm zc4EOG1-y&A8ZWEEjVvN(Bp@}k;V&vWXJRn0zxF$5XZL@AXSGrjKKsk1R^he`-{z@Z zE2u|$aT}N}1JD$Jx^L59irV*Yhya1u+B1AuvY0WzOC>XCT z#|mt=!vz0AMTpNEMLdgPcuO9jHH?)$#2>bhUMIq5SAOHARm26qD9efw+~wsT&5OA3 zoh@#|{_F>;RdiZ?bz|05P8&cCu{LcG!#8m4fk3M8fTl|}y-6Rc^e&;}h=MWyJ7|If zCm0QZLtwig$WIu7KR8ZbcKa9EvvOKoiz6SLQ5pH)B_>clLg5v_|CG#85?~OFg3D@p zUc_SyA2XSMxw=-%2Z*N`ZwKvH-|kedk1yCJiI+9v14tpMLcT56?ugpB2}s0+Gbvdm zz5HslW4T5C@XCOMB|Q`?4%Pi$LO`PZ!URl2L=t_EK;r2_HHZP}vK_DB2q?h~UdB`L zazX&?h4*b-n{tbsF=h~xVcOF_+rn%8tZr=o$1{uB+3G&&eP5{a*C%K$77l{N&&Jr` z-w{DhVm*N5F$Z^d9!T)<$`n#IU@M`WmDl*~R=Yzjo~QK7S02#)jn{WFL7rYX~D0OGA5#eCd!z&3WnWkU1NE(${)r^RYgnqYPpXoFPd0F za^YbbHR91M(Ldms6Mx2ia-88q;)UwRV%d_aeD|rq9}pduCn5&qA+KVDD*sXkm4J)t z3#<*^C+D?^^8wNZ07t@-83BqKJW)yvmgReY+ii^#qqZ$6)|(Uh^ZHGaqgGHox4uPr zTKNm@&)%O)zI)3Rb&Fa4_R33Y>C;D!M&Jev%|ZVVDz0lIJO$Ed)B5mAQvHM?*M z`5}CUi3?o&@?mRgeWapc`{F4G63vzxKyhTR6>Nb5288qdWre#BsBCvG+Y_4N&*u=t zvYHN)No+qV1V_FXaETw?(N!Cb?cH25+WG6K^%&u=y;I&&WksP_SJIG0MQ@q!|2%OX zZ!tW4%mJ_O`(sgDVo_cJ)aCmq=elVaG^iW85w@VCx^i6A-~R;E6Uab9<7Z`2v)18P*YZp?TG1c8 z#}gH$3hG}`C-d$FZ3DuHREy({$Vxsya@#i9_4${;i63{gIjvy}BOqN=$xSj_#D#cF z^i6v=Ql|>~-pE=D_fN=`v!6-RsTw4;_(otG&;G=R z9zX-!h!2OpknZj$xum#;FBJ1V(?iC90`g2yY~lkLi^W$@;TK}3s*7rEr?s~um5k*= nx!VJ4LTono`gwsWJ$n(}H(caMk3qB@y`PxAo#+$$-_-vB5X%le literal 0 HcmV?d00001 diff --git a/frontend/projects/shared/styles/taiga.scss b/frontend/projects/shared/styles/taiga.scss index 8bd35d622..3fbc0b9bc 100644 --- a/frontend/projects/shared/styles/taiga.scss +++ b/frontend/projects/shared/styles/taiga.scss @@ -27,6 +27,18 @@ } } +[tuiWrapper][data-appearance='success'] { + color: var(--tui-success-fill); +} + +[tuiWrapper][data-appearance='warning'] { + color: var(--tui-warning-fill); +} + +[tuiWrapper][data-appearance='error'] { + color: var(--tui-error-fill); +} + tui-dialog { transform: translate3d(0, 0, 0); } diff --git a/frontend/projects/ui/src/app/app.component.html b/frontend/projects/ui/src/app/app.component.html index dcc65b8c6..78ac210ca 100644 --- a/frontend/projects/ui/src/app/app.component.html +++ b/frontend/projects/ui/src/app/app.component.html @@ -67,7 +67,11 @@

    diff --git a/frontend/projects/ui/src/app/app.component.ts b/frontend/projects/ui/src/app/app.component.ts index 68e77ffee..c8b2fcb5f 100644 --- a/frontend/projects/ui/src/app/app.component.ts +++ b/frontend/projects/ui/src/app/app.component.ts @@ -17,7 +17,11 @@ import { PatchDB } from 'patch-db-client' import { DataModel } from './services/patch-db/data-model' function hasNavigation(url: string): boolean { - return !url.startsWith('/loading') && !url.startsWith('/diagnostic') + return ( + !url.startsWith('/loading') && + !url.startsWith('/diagnostic') && + !url.startsWith('/portal') + ) } @Component({ diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header.component.html b/frontend/projects/ui/src/app/apps/portal/components/header/header.component.html new file mode 100644 index 000000000..54abed9a7 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/components/header/header.component.html @@ -0,0 +1,11 @@ + +
    + + + + +
    diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header.component.scss b/frontend/projects/ui/src/app/apps/portal/components/header/header.component.scss new file mode 100644 index 000000000..85ded7f11 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/components/header/header.component.scss @@ -0,0 +1,12 @@ +:host { + display: flex; + align-items: center; + height: 4.5rem; + background: rgb(51 51 51 / 74%); + padding: 0 1rem 0 2rem; + font-size: 1.5rem; +} + +.toolbar { + margin-left: auto; +} diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header.component.ts b/frontend/projects/ui/src/app/apps/portal/components/header/header.component.ts new file mode 100644 index 000000000..8e84d8f47 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/components/header/header.component.ts @@ -0,0 +1,13 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core' +import { TuiBadgedContentModule } from '@taiga-ui/kit' +import { TuiButtonModule } from '@taiga-ui/core' + +@Component({ + selector: 'header[appHeader]', + templateUrl: 'header.component.html', + styleUrls: ['header.component.scss'], + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [TuiBadgedContentModule, TuiButtonModule], +}) +export class HeaderComponent {} diff --git a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html new file mode 100644 index 000000000..baa36ccd1 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html @@ -0,0 +1,28 @@ +
    + Home + + + + + diff --git a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.scss b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.scss new file mode 100644 index 000000000..2e2834f3a --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.scss @@ -0,0 +1,29 @@ +:host { + height: 3rem; + display: flex; + background: rgb(97 95 95 / 75%); +} + +.tab { + position: relative; + display: flex; + align-items: center; + justify-content: center; + width: 7.5rem; + + &_active { + background: #373a3f; + } +} + +.icon { + width: 2rem; + height: 2rem; + border-radius: 100%; +} + +.close { + position: absolute; + top: 0; + right: 0; +} diff --git a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.ts b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.ts new file mode 100644 index 000000000..7c9655020 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.ts @@ -0,0 +1,26 @@ +import { CommonModule, Location } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { RouterModule } from '@angular/router' +import { TuiButtonModule } from '@taiga-ui/core' +import { NavigationItem, NavigationService } from './navigation.service' + +@Component({ + selector: 'nav[appNavigation]', + templateUrl: 'navigation.component.html', + styleUrls: ['navigation.component.scss'], + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [CommonModule, RouterModule, TuiButtonModule], +}) +export class NavigationComponent { + private readonly location = inject(Location) + private readonly navigation = inject(NavigationService) + + readonly tabs$ = this.navigation.getTabs() + + removeTab(tab: NavigationItem, active: boolean) { + this.navigation.removeTab(tab) + + if (active) this.location.back() + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.service.ts b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.service.ts new file mode 100644 index 000000000..232634697 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.service.ts @@ -0,0 +1,29 @@ +import { Injectable } from '@angular/core' +import { BehaviorSubject, Observable } from 'rxjs' + +export interface NavigationItem { + readonly routerLink: string + readonly icon: string + readonly title: string +} + +@Injectable({ + providedIn: 'root', +}) +export class NavigationService { + readonly tabs = new BehaviorSubject([]) + + getTabs(): Observable { + return this.tabs + } + + removeTab(tab: NavigationItem) { + this.tabs.next(this.tabs.value.filter(t => t !== tab)) + } + + addTab(tab: NavigationItem) { + if (this.tabs.value.every(t => t.routerLink !== tab.routerLink)) { + this.tabs.next([...this.tabs.value, tab]) + } + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/portal.component.html b/frontend/projects/ui/src/app/apps/portal/portal.component.html new file mode 100644 index 000000000..5eb48eb41 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/portal.component.html @@ -0,0 +1,5 @@ +
    My server
    + +
    + +
    diff --git a/frontend/projects/ui/src/app/apps/portal/portal.component.scss b/frontend/projects/ui/src/app/apps/portal/portal.component.scss new file mode 100644 index 000000000..128c72f8a --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/portal.component.scss @@ -0,0 +1,8 @@ +:host { + background: url(/assets/img/background_dark.jpeg); + background-size: cover; +} + +main { + flex: 1; +} diff --git a/frontend/projects/ui/src/app/apps/portal/portal.component.ts b/frontend/projects/ui/src/app/apps/portal/portal.component.ts new file mode 100644 index 000000000..57d53a6fe --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/portal.component.ts @@ -0,0 +1,8 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core' + +@Component({ + templateUrl: 'portal.component.html', + styleUrls: ['portal.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class PortalComponent {} diff --git a/frontend/projects/ui/src/app/apps/portal/portal.module.ts b/frontend/projects/ui/src/app/apps/portal/portal.module.ts new file mode 100644 index 000000000..5512c0854 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/portal.module.ts @@ -0,0 +1,37 @@ +import { NgModule } from '@angular/core' +import { RouterModule, Routes } from '@angular/router' +import { HeaderComponent } from './components/header/header.component' +import { PortalComponent } from './portal.component' +import { NavigationComponent } from './components/navigation/navigation.component' + +const ROUTES: Routes = [ + { + path: '', + component: PortalComponent, + children: [ + { + redirectTo: 'services', + pathMatch: 'full', + path: '', + }, + { + path: 'services', + loadChildren: () => + import('./routes/services/services.module').then( + m => m.ServicesModule, + ), + }, + ], + }, +] + +@NgModule({ + imports: [ + RouterModule.forChild(ROUTES), + HeaderComponent, + NavigationComponent, + ], + declarations: [PortalComponent], + exports: [PortalComponent], +}) +export class PortalModule {} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/service/service.component.html b/frontend/projects/ui/src/app/apps/portal/routes/services/service/service.component.html new file mode 100644 index 000000000..044b180cf --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/services/service/service.component.html @@ -0,0 +1 @@ +{{ (service$ | async)?.manifest?.title }} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/service/service.component.scss b/frontend/projects/ui/src/app/apps/portal/routes/services/service/service.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/service/service.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/services/service/service.component.ts new file mode 100644 index 000000000..380573d1a --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/services/service/service.component.ts @@ -0,0 +1,36 @@ +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { ActivatedRoute, Router } from '@angular/router' +import { getPkgId } from '@start9labs/shared' +import { PatchDB } from 'patch-db-client' +import { tap } from 'rxjs' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { NavigationService } from '../../../components/navigation/navigation.service' + +@Component({ + templateUrl: 'service.component.html', + styleUrls: ['service.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ServiceComponent { + private readonly route = inject(ActivatedRoute) + private readonly router = inject(Router) + private readonly navigation = inject(NavigationService) + private readonly patch = inject>(PatchDB) + + readonly service$ = this.patch + .watch$('package-data', getPkgId(this.route)) + .pipe( + tap(pkg => { + // if package disappears, navigate to list page + if (!pkg) { + this.router.navigate(['..'], { relativeTo: this.route }) + } else { + this.navigation.addTab({ + title: pkg.manifest.title, + routerLink: ['services', pkg.manifest.id].join('/'), + icon: pkg.icon, + }) + } + }), + ) +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/service/service.module.ts b/frontend/projects/ui/src/app/apps/portal/routes/services/service/service.module.ts new file mode 100644 index 000000000..4d187310b --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/services/service/service.module.ts @@ -0,0 +1,18 @@ +import { CommonModule } from '@angular/common' +import { NgModule } from '@angular/core' +import { RouterModule, Routes } from '@angular/router' +import { ServiceComponent } from './service.component' + +const ROUTES: Routes = [ + { + path: '', + component: ServiceComponent, + }, +] + +@NgModule({ + imports: [CommonModule, RouterModule.forChild(ROUTES)], + declarations: [ServiceComponent], + exports: [ServiceComponent], +}) +export class ServiceModule {} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/services.component.html b/frontend/projects/ui/src/app/apps/portal/routes/services/services.component.html new file mode 100644 index 000000000..51dcfae2a --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/services/services.component.html @@ -0,0 +1,7 @@ + + {{ service.manifest.title }} + diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/services.component.scss b/frontend/projects/ui/src/app/apps/portal/routes/services/services.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/services.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/services/services.component.ts new file mode 100644 index 000000000..bd9e8749b --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/services/services.component.ts @@ -0,0 +1,23 @@ +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { PackageDataEntry } from 'src/app/services/patch-db/data-model' +import { NavigationService } from '../../components/navigation/navigation.service' +import { ServicesService } from './services.service' + +@Component({ + templateUrl: 'services.component.html', + styleUrls: ['services.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ServicesComponent { + private readonly navigation = inject(NavigationService) + + readonly services$ = inject(ServicesService) + + onClick({ manifest, icon }: PackageDataEntry) { + this.navigation.addTab({ + title: manifest.title, + routerLink: ['services', manifest.id].join('/'), + icon, + }) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/services.module.ts b/frontend/projects/ui/src/app/apps/portal/routes/services/services.module.ts new file mode 100644 index 000000000..82488da4a --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/services/services.module.ts @@ -0,0 +1,23 @@ +import { CommonModule } from '@angular/common' +import { NgModule } from '@angular/core' +import { RouterModule, Routes } from '@angular/router' +import { ServicesComponent } from './services.component' + +const ROUTES: Routes = [ + { + path: '', + component: ServicesComponent, + }, + { + path: ':pkgId', + loadChildren: () => + import('./service/service.module').then(m => m.ServiceModule), + }, +] + +@NgModule({ + imports: [CommonModule, RouterModule.forChild(ROUTES)], + declarations: [ServicesComponent], + exports: [ServicesComponent], +}) +export class ServicesModule {} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/services.service.ts b/frontend/projects/ui/src/app/apps/portal/routes/services/services.service.ts new file mode 100644 index 000000000..0a0683fbc --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/services/services.service.ts @@ -0,0 +1,36 @@ +import { inject, Injectable } from '@angular/core' +import { PatchDB } from 'patch-db-client' +import { filter, map, Observable, pairwise, shareReplay, startWith } from 'rxjs' +import { + DataModel, + PackageDataEntry, +} from 'src/app/services/patch-db/data-model' + +@Injectable({ + providedIn: 'root', +}) +export class ServicesService extends Observable { + private readonly services$ = inject>(PatchDB) + .watch$('package-data') + .pipe( + map(pkgs => Object.values(pkgs)), + startWith([]), + pairwise(), + filter(([prev, next]) => { + const length = next.length + return !length || prev.length !== length + }), + map(([_, pkgs]) => + pkgs.sort((a, b) => + b.manifest.title.toLowerCase() > a.manifest.title.toLowerCase() + ? -1 + : 1, + ), + ), + shareReplay(1), + ) + + constructor() { + super(subscriber => this.services$.subscribe(subscriber)) + } +} diff --git a/frontend/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.html b/frontend/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.html index db2480687..cb412aae9 100644 --- a/frontend/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.html +++ b/frontend/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.html @@ -1,27 +1,27 @@ - - Your user interface is cached and out of date. Hard refresh the page to get - the latest UI. -
      -
    • - On Mac - : cmd + shift + R -
    • -
    • - On Linux/Windows - : ctrl + shift + R -
    • -
    - -
    + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/projects/ui/src/app/routing.module.ts b/frontend/projects/ui/src/app/routing.module.ts index f8b67c9f9..f713d6fa8 100644 --- a/frontend/projects/ui/src/app/routing.module.ts +++ b/frontend/projects/ui/src/app/routing.module.ts @@ -22,6 +22,13 @@ const routes: Routes = [ loadChildren: () => import('./apps/login/login.module').then(m => m.LoginPageModule), }, + { + path: 'portal', + canActivate: [AuthGuard], + canActivateChild: [AuthGuard], + loadChildren: () => + import('./apps/portal/portal.module').then(m => m.PortalModule), + }, { path: '', canActivate: [AuthGuard], From 4204b4af90f0da38cd6dbcd954db25473b70e78e Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Fri, 21 Jul 2023 08:17:32 +0800 Subject: [PATCH 009/169] feat(portal): basis for drawer and cards (#2370) --- frontend/projects/shared/styles/taiga.scss | 29 ++++++++ .../projects/ui/src/app/app.component.html | 1 + .../components/card/card.component.html | 39 +++++++++++ .../components/card/card.component.scss | 62 ++++++++++++++++ .../portal/components/card/card.component.ts | 46 ++++++++++++ .../components/drawer/drawer.component.html | 38 ++++++++++ .../components/drawer/drawer.component.scss | 70 +++++++++++++++++++ .../components/drawer/drawer.component.ts | 57 +++++++++++++++ .../portal/components/drawer/drawer.const.ts | 24 +++++++ .../components/header/header.component.scss | 3 +- .../navigation/navigation.component.html | 2 +- .../navigation/navigation.component.scss | 2 + .../apps/portal/pipes/to-navigation-item.ts | 14 ++++ .../src/app/apps/portal/portal.component.html | 1 + .../src/app/apps/portal/portal.component.scss | 1 + .../src/app/apps/portal/portal.component.ts | 7 ++ .../ui/src/app/apps/portal/portal.module.ts | 9 ++- .../routes/desktop/desktop.component.html | 5 ++ .../routes/desktop/desktop.component.scss | 11 +++ .../routes/desktop/desktop.component.ts | 12 ++++ .../portal/routes/desktop/desktop.module.ts | 25 +++++++ .../{service => }/service.component.html | 0 .../{service => }/service.component.scss | 0 .../{service => }/service.component.ts | 4 +- .../routes/services/service/service.module.ts | 18 ----- .../routes/services/services.component.html | 7 -- .../routes/services/services.component.scss | 0 .../routes/services/services.component.ts | 23 ------ .../portal/routes/services/services.module.ts | 13 ++-- .../{routes => }/services/services.service.ts | 0 .../apps/portal/utils/to-navigation-item.ts | 13 ++++ 31 files changed, 474 insertions(+), 62 deletions(-) create mode 100644 frontend/projects/ui/src/app/apps/portal/components/card/card.component.html create mode 100644 frontend/projects/ui/src/app/apps/portal/components/card/card.component.scss create mode 100644 frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html create mode 100644 frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.scss create mode 100644 frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.const.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/pipes/to-navigation-item.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.scss create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts rename frontend/projects/ui/src/app/apps/portal/routes/services/{service => }/service.component.html (100%) rename frontend/projects/ui/src/app/apps/portal/routes/services/{service => }/service.component.scss (100%) rename frontend/projects/ui/src/app/apps/portal/routes/services/{service => }/service.component.ts (88%) delete mode 100644 frontend/projects/ui/src/app/apps/portal/routes/services/service/service.module.ts delete mode 100644 frontend/projects/ui/src/app/apps/portal/routes/services/services.component.html delete mode 100644 frontend/projects/ui/src/app/apps/portal/routes/services/services.component.scss delete mode 100644 frontend/projects/ui/src/app/apps/portal/routes/services/services.component.ts rename frontend/projects/ui/src/app/apps/portal/{routes => }/services/services.service.ts (100%) create mode 100644 frontend/projects/ui/src/app/apps/portal/utils/to-navigation-item.ts diff --git a/frontend/projects/shared/styles/taiga.scss b/frontend/projects/shared/styles/taiga.scss index 3fbc0b9bc..3cafeedfd 100644 --- a/frontend/projects/shared/styles/taiga.scss +++ b/frontend/projects/shared/styles/taiga.scss @@ -59,3 +59,32 @@ tui-hint[data-appearance='onDark'] { color: var(--tui-link-hover) !important; } } + +[tuiWrapper][data-appearance='drawer'] { + // TODO: Theme + background: rgb(81 80 83 / 86%); + border-radius: 10rem; + + &._focused::after { + color: var(--tui-primary); + } +} + +tui-dropdown[data-appearance='start-os'][data-appearance='start-os'] { + border: 0; + box-shadow: 0 0.25rem 0.25rem rgb(0 0 0 / 25%); + // TODO: Replace --tui-elevation-02 when Taiga UI is updated + background: rgb(63 63 63 / 95%); + + tui-opt-group { + &::before { + background: var(--tui-clear); + box-shadow: 1rem 0 var(--tui-clear), -1rem 0 var(--tui-clear); + padding-top: 0.375rem; + } + + &::after { + display: none; + } + } +} diff --git a/frontend/projects/ui/src/app/app.component.html b/frontend/projects/ui/src/app/app.component.html index 78ac210ca..f92600d2e 100644 --- a/frontend/projects/ui/src/app/app.component.html +++ b/frontend/projects/ui/src/app/app.component.html @@ -11,6 +11,7 @@ (ionSplitPaneVisible)="splitPaneVisible($event)" > + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.scss b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.scss new file mode 100644 index 000000000..d47636ae5 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.scss @@ -0,0 +1,62 @@ +:host { + display: flex; + height: 5.5rem; + width: 12.5rem; + border-radius: var(--tui-radius-l); + overflow: hidden; + box-shadow: 0 0.25rem 0.25rem rgb(0 0 0 / 25%); + // TODO: Theme + background: rgb(111 109 109 / 90%); +} + +.link { + display: flex; + flex: 1; + flex-direction: column; + align-items: center; + justify-content: center; + color: white; + gap: 0.25rem; + padding: 0 0.5rem; + font: var(--tui-font-text-m); + white-space: nowrap; + overflow: hidden; +} + +.icon { + width: 2.5rem; + height: 2.5rem; + border-radius: 100%; + box-shadow: 0.25rem 0.25rem 0.25rem rgb(0 0 0 / 25%); +} + +.title { + max-width: 100%; +} + +.side { + width: 3rem; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 0.25rem 0.25rem rgb(0 0 0 / 25%); + // TODO: Theme + background: #4b4a4a; +} + +.menu-title { + margin: 0; + padding: 0 0.5rem 0.25rem; + white-space: nowrap; + font: var(--tui-font-text-l); + font-weight: bold; +} + +.menu-item { + justify-content: flex-start; + gap: 0.75rem; +} + +.menu-icon { + opacity: var(--tui-disabled-opacity); +} diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts new file mode 100644 index 000000000..5be666df3 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts @@ -0,0 +1,46 @@ +import { + ChangeDetectionStrategy, + Component, + HostListener, + inject, + Input, +} from '@angular/core' +import { RouterLink } from '@angular/router' +import { TickerModule } from '@start9labs/shared' +import { + TuiButtonModule, + TuiDataListModule, + TuiHostedDropdownModule, + TuiSvgModule, +} from '@taiga-ui/core' +import { + NavigationItem, + NavigationService, +} from '../navigation/navigation.service' + +@Component({ + selector: '[appCard]', + templateUrl: 'card.component.html', + styleUrls: ['card.component.scss'], + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + RouterLink, + TuiButtonModule, + TuiHostedDropdownModule, + TuiDataListModule, + TuiSvgModule, + TickerModule, + ], +}) +export class CardComponent { + private readonly navigation = inject(NavigationService) + + @Input({ required: true }) + appCard!: NavigationItem + + @HostListener('click') + onClick() { + this.navigation.addTab(this.appCard) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html new file mode 100644 index 000000000..309d5357b --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html @@ -0,0 +1,38 @@ +
    + + + Enter service name + +

    System Utilities

    +
    + +
    +

    Installed services

    +
    + +
    + Nothing found +
    diff --git a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.scss b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.scss new file mode 100644 index 000000000..9bbff7d91 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.scss @@ -0,0 +1,70 @@ +@import '@taiga-ui/core/styles/taiga-ui-local'; + +:host { + @include transition(top); + + position: absolute; + top: 100%; + left: 0; + width: 100%; + min-height: calc(100% - 10.25rem); + display: flex; + flex-direction: column; + // TODO: Theme + background: #2d2d2d; + color: #fff; + + &._open { + top: 10.25rem; + } +} + +.content { + flex: 1; + background: inherit; +} + +.toggle { + position: absolute; + top: -2.5rem; + height: 2.5rem; + width: 25rem; + max-width: 100vw; + left: 50%; + background: inherit; + color: inherit; + text-align: center; + font-size: 0; + transform: translateX(-50%); + border-top-left-radius: var(--tui-radius-xl); + border-top-right-radius: var(--tui-radius-xl); +} + +.icon { + @include transition(transform); + + :host._open & { + transform: rotate(180deg); + } +} + +.search { + max-width: 41rem; + margin: 6rem auto 0; +} + +.title { + margin: 5rem 0 1.25rem; + text-align: center; + text-transform: uppercase; + font: var(--tui-font-text-xl); +} + +.items { + display: flex; + gap: 2rem; + padding: 2rem; + align-items: center; + justify-content: center; + flex-wrap: wrap; +} diff --git a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts new file mode 100644 index 000000000..ed87b50a8 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts @@ -0,0 +1,57 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + HostBinding, + inject, +} from '@angular/core' +import { FormsModule } from '@angular/forms' +import { RouterLink } from '@angular/router' +import { + TUI_DEFAULT_MATCHER, + TuiActiveZoneModule, + TuiFilterPipeModule, + TuiForModule, +} from '@taiga-ui/cdk' +import { TuiSvgModule, TuiTextfieldControllerModule } from '@taiga-ui/core' +import { TuiInputModule } from '@taiga-ui/kit' +import { map } from 'rxjs' +import { CardComponent } from '../card/card.component' +import { NavigationItem } from '../navigation/navigation.service' +import { ServicesService } from '../../services/services.service' +import { SYSTEM_UTILITIES } from './drawer.const' +import { toNavigationItem } from '../../utils/to-navigation-item' + +@Component({ + selector: 'app-drawer', + templateUrl: 'drawer.component.html', + styleUrls: ['drawer.component.scss'], + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + CommonModule, + FormsModule, + TuiSvgModule, + TuiActiveZoneModule, + TuiInputModule, + TuiTextfieldControllerModule, + TuiForModule, + TuiFilterPipeModule, + CardComponent, + RouterLink, + ], +}) +export class DrawerComponent { + @HostBinding('class._open') + open = false + + search = '' + + readonly system = SYSTEM_UTILITIES + readonly services$ = inject(ServicesService).pipe( + map(services => services.map(toNavigationItem)), + ) + + readonly bySearch = (item: NavigationItem, search: string): boolean => + search.length < 2 || TUI_DEFAULT_MATCHER(item.title, search) +} diff --git a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.const.ts b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.const.ts new file mode 100644 index 000000000..f4859d436 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.const.ts @@ -0,0 +1,24 @@ +import { NavigationItem } from '../navigation/navigation.service' + +export const SYSTEM_UTILITIES: readonly NavigationItem[] = [ + { + title: 'Devices', + routerLink: 'devices', + icon: 'assets/img/icon_transparent.png', + }, + { + title: 'Metrics', + routerLink: 'metrics', + icon: 'assets/img/icon_transparent.png', + }, + { + title: 'User manual', + routerLink: 'manual', + icon: 'assets/img/icon_transparent.png', + }, + { + title: 'Snek', + routerLink: 'snek', + icon: 'assets/img/icon_transparent.png', + }, +] diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header.component.scss b/frontend/projects/ui/src/app/apps/portal/components/header/header.component.scss index 85ded7f11..e07f51a9c 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/header/header.component.scss +++ b/frontend/projects/ui/src/app/apps/portal/components/header/header.component.scss @@ -2,9 +2,10 @@ display: flex; align-items: center; height: 4.5rem; - background: rgb(51 51 51 / 74%); padding: 0 1rem 0 2rem; font-size: 1.5rem; + // TODO: Theme + background: rgb(51 51 51 / 74%); } .toolbar { diff --git a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html index baa36ccd1..0fcd71661 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html +++ b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html @@ -1,6 +1,6 @@ diff --git a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.scss b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.scss index 2e2834f3a..ebdb09244 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.scss +++ b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.scss @@ -1,6 +1,7 @@ :host { height: 3rem; display: flex; + // TODO: Theme background: rgb(97 95 95 / 75%); } @@ -12,6 +13,7 @@ width: 7.5rem; &_active { + // TODO: Theme background: #373a3f; } } diff --git a/frontend/projects/ui/src/app/apps/portal/pipes/to-navigation-item.ts b/frontend/projects/ui/src/app/apps/portal/pipes/to-navigation-item.ts new file mode 100644 index 000000000..dbf276474 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/pipes/to-navigation-item.ts @@ -0,0 +1,14 @@ +import { Pipe, PipeTransform } from '@angular/core' +import { PackageDataEntry } from 'src/app/services/patch-db/data-model' +import { NavigationItem } from '../components/navigation/navigation.service' +import { toNavigationItem } from '../utils/to-navigation-item' + +@Pipe({ + name: 'toNavigationItem', + standalone: true, +}) +export class ToNavigationItemPipe implements PipeTransform { + transform(service: PackageDataEntry): NavigationItem { + return toNavigationItem(service) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/portal.component.html b/frontend/projects/ui/src/app/apps/portal/portal.component.html index 5eb48eb41..56a6e5d25 100644 --- a/frontend/projects/ui/src/app/apps/portal/portal.component.html +++ b/frontend/projects/ui/src/app/apps/portal/portal.component.html @@ -3,3 +3,4 @@
    + diff --git a/frontend/projects/ui/src/app/apps/portal/portal.component.scss b/frontend/projects/ui/src/app/apps/portal/portal.component.scss index 128c72f8a..5c4079653 100644 --- a/frontend/projects/ui/src/app/apps/portal/portal.component.scss +++ b/frontend/projects/ui/src/app/apps/portal/portal.component.scss @@ -1,4 +1,5 @@ :host { + // TODO: Theme background: url(/assets/img/background_dark.jpeg); background-size: cover; } diff --git a/frontend/projects/ui/src/app/apps/portal/portal.component.ts b/frontend/projects/ui/src/app/apps/portal/portal.component.ts index 57d53a6fe..7c57f5662 100644 --- a/frontend/projects/ui/src/app/apps/portal/portal.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/portal.component.ts @@ -1,8 +1,15 @@ import { ChangeDetectionStrategy, Component } from '@angular/core' +import { tuiDropdownOptionsProvider } from '@taiga-ui/core' @Component({ templateUrl: 'portal.component.html', styleUrls: ['portal.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + // TODO: Move to global + tuiDropdownOptionsProvider({ + appearance: 'start-os', + }), + ], }) export class PortalComponent {} diff --git a/frontend/projects/ui/src/app/apps/portal/portal.module.ts b/frontend/projects/ui/src/app/apps/portal/portal.module.ts index 5512c0854..5da7dba6d 100644 --- a/frontend/projects/ui/src/app/apps/portal/portal.module.ts +++ b/frontend/projects/ui/src/app/apps/portal/portal.module.ts @@ -3,6 +3,7 @@ import { RouterModule, Routes } from '@angular/router' import { HeaderComponent } from './components/header/header.component' import { PortalComponent } from './portal.component' import { NavigationComponent } from './components/navigation/navigation.component' +import { DrawerComponent } from './components/drawer/drawer.component' const ROUTES: Routes = [ { @@ -10,10 +11,15 @@ const ROUTES: Routes = [ component: PortalComponent, children: [ { - redirectTo: 'services', + redirectTo: 'desktop', pathMatch: 'full', path: '', }, + { + path: 'desktop', + loadChildren: () => + import('./routes/desktop/desktop.module').then(m => m.DesktopModule), + }, { path: 'services', loadChildren: () => @@ -30,6 +36,7 @@ const ROUTES: Routes = [ RouterModule.forChild(ROUTES), HeaderComponent, NavigationComponent, + DrawerComponent, ], declarations: [PortalComponent], exports: [PortalComponent], diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html new file mode 100644 index 000000000..e607345e4 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html @@ -0,0 +1,5 @@ +
    diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.scss b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.scss new file mode 100644 index 000000000..079b6cb3f --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.scss @@ -0,0 +1,11 @@ +:host { + display: flex; + align-items: center; + align-content: center; + justify-content: center; + flex-wrap: wrap; + height: 100%; + max-width: 56rem; + margin: 0 auto; + gap: 2rem; +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts new file mode 100644 index 000000000..f8ed19998 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts @@ -0,0 +1,12 @@ +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { ServicesService } from '../../services/services.service' + +@Component({ + templateUrl: 'desktop.component.html', + styleUrls: ['desktop.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class DesktopComponent { + // TODO: Only show services added to desktop + readonly services$ = inject(ServicesService) +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts new file mode 100644 index 000000000..cf5d25409 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts @@ -0,0 +1,25 @@ +import { CommonModule } from '@angular/common' +import { NgModule } from '@angular/core' +import { RouterModule, Routes } from '@angular/router' +import { DesktopComponent } from './desktop.component' +import { CardComponent } from '../../components/card/card.component' +import { ToNavigationItemPipe } from '../../pipes/to-navigation-item' + +const ROUTES: Routes = [ + { + path: '', + component: DesktopComponent, + }, +] + +@NgModule({ + imports: [ + CommonModule, + CardComponent, + ToNavigationItemPipe, + RouterModule.forChild(ROUTES), + ], + declarations: [DesktopComponent], + exports: [DesktopComponent], +}) +export class DesktopModule {} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/service/service.component.html b/frontend/projects/ui/src/app/apps/portal/routes/services/service.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/services/service/service.component.html rename to frontend/projects/ui/src/app/apps/portal/routes/services/service.component.html diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/service/service.component.scss b/frontend/projects/ui/src/app/apps/portal/routes/services/service.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/services/service/service.component.scss rename to frontend/projects/ui/src/app/apps/portal/routes/services/service.component.scss diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/service/service.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/services/service.component.ts similarity index 88% rename from frontend/projects/ui/src/app/apps/portal/routes/services/service/service.component.ts rename to frontend/projects/ui/src/app/apps/portal/routes/services/service.component.ts index 380573d1a..9efc08caf 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/services/service/service.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/services/service.component.ts @@ -4,7 +4,7 @@ import { getPkgId } from '@start9labs/shared' import { PatchDB } from 'patch-db-client' import { tap } from 'rxjs' import { DataModel } from 'src/app/services/patch-db/data-model' -import { NavigationService } from '../../../components/navigation/navigation.service' +import { NavigationService } from '../../components/navigation/navigation.service' @Component({ templateUrl: 'service.component.html', @@ -27,7 +27,7 @@ export class ServiceComponent { } else { this.navigation.addTab({ title: pkg.manifest.title, - routerLink: ['services', pkg.manifest.id].join('/'), + routerLink: `/portal/services/${pkg.manifest.id}`, icon: pkg.icon, }) } diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/service/service.module.ts b/frontend/projects/ui/src/app/apps/portal/routes/services/service/service.module.ts deleted file mode 100644 index 4d187310b..000000000 --- a/frontend/projects/ui/src/app/apps/portal/routes/services/service/service.module.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { CommonModule } from '@angular/common' -import { NgModule } from '@angular/core' -import { RouterModule, Routes } from '@angular/router' -import { ServiceComponent } from './service.component' - -const ROUTES: Routes = [ - { - path: '', - component: ServiceComponent, - }, -] - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(ROUTES)], - declarations: [ServiceComponent], - exports: [ServiceComponent], -}) -export class ServiceModule {} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/services.component.html b/frontend/projects/ui/src/app/apps/portal/routes/services/services.component.html deleted file mode 100644 index 51dcfae2a..000000000 --- a/frontend/projects/ui/src/app/apps/portal/routes/services/services.component.html +++ /dev/null @@ -1,7 +0,0 @@ - - {{ service.manifest.title }} - diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/services.component.scss b/frontend/projects/ui/src/app/apps/portal/routes/services/services.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/services.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/services/services.component.ts deleted file mode 100644 index bd9e8749b..000000000 --- a/frontend/projects/ui/src/app/apps/portal/routes/services/services.component.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ChangeDetectionStrategy, Component, inject } from '@angular/core' -import { PackageDataEntry } from 'src/app/services/patch-db/data-model' -import { NavigationService } from '../../components/navigation/navigation.service' -import { ServicesService } from './services.service' - -@Component({ - templateUrl: 'services.component.html', - styleUrls: ['services.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class ServicesComponent { - private readonly navigation = inject(NavigationService) - - readonly services$ = inject(ServicesService) - - onClick({ manifest, icon }: PackageDataEntry) { - this.navigation.addTab({ - title: manifest.title, - routerLink: ['services', manifest.id].join('/'), - icon, - }) - } -} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/services.module.ts b/frontend/projects/ui/src/app/apps/portal/routes/services/services.module.ts index 82488da4a..3312e476f 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/services/services.module.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/services/services.module.ts @@ -1,23 +1,18 @@ import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' import { RouterModule, Routes } from '@angular/router' -import { ServicesComponent } from './services.component' +import { ServiceComponent } from './service.component' const ROUTES: Routes = [ - { - path: '', - component: ServicesComponent, - }, { path: ':pkgId', - loadChildren: () => - import('./service/service.module').then(m => m.ServiceModule), + component: ServiceComponent, }, ] @NgModule({ imports: [CommonModule, RouterModule.forChild(ROUTES)], - declarations: [ServicesComponent], - exports: [ServicesComponent], + declarations: [ServiceComponent], + exports: [ServiceComponent], }) export class ServicesModule {} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/services.service.ts b/frontend/projects/ui/src/app/apps/portal/services/services.service.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/services/services.service.ts rename to frontend/projects/ui/src/app/apps/portal/services/services.service.ts diff --git a/frontend/projects/ui/src/app/apps/portal/utils/to-navigation-item.ts b/frontend/projects/ui/src/app/apps/portal/utils/to-navigation-item.ts new file mode 100644 index 000000000..12749a399 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/utils/to-navigation-item.ts @@ -0,0 +1,13 @@ +import { PackageDataEntry } from 'src/app/services/patch-db/data-model' +import { NavigationItem } from '../components/navigation/navigation.service' + +export function toNavigationItem({ + manifest, + icon, +}: PackageDataEntry): NavigationItem { + return { + title: manifest.title, + routerLink: `/portal/services/${manifest.id}`, + icon, + } +} From 9f5a90ee9c9655436f6c1b9a3e19de839b90d1d8 Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Thu, 27 Jul 2023 22:51:15 +0400 Subject: [PATCH 010/169] feat(portal): implement adding/removing to desktop (#2374) * feat(portal): implement adding/removing to desktop, reordering desktop items, baseline for system utils * chore: fix comments --------- Co-authored-by: Matt Hill --- frontend/package-lock.json | 97 ++++++++++--------- frontend/package.json | 10 +- .../src/directives/alert/alert.directive.ts | 22 ----- .../src/directives/alert/alert.module.ts | 8 -- frontend/projects/shared/src/public-api.ts | 2 - .../components/actions/actions.component.html | 17 ++++ .../components/actions/actions.component.scss | 16 +++ .../components/actions/actions.component.ts | 26 +++++ .../components/card/card.component.html | 37 +++---- .../components/card/card.component.scss | 17 ---- .../portal/components/card/card.component.ts | 30 ++++-- .../components/drawer/drawer.component.html | 55 ++++++----- .../components/drawer/drawer.component.scss | 13 ++- .../components/drawer/drawer.component.ts | 24 +++-- .../portal/components/drawer/drawer.const.ts | 41 ++++---- .../apps/portal/pipes/to-desktop-actions.ts | 38 ++++++++ .../app/apps/portal/pipes/to-desktop-item.ts | 35 +++++++ .../apps/portal/pipes/to-navigation-item.ts | 14 --- .../src/app/apps/portal/portal.component.scss | 1 + .../ui/src/app/apps/portal/portal.module.ts | 5 + .../routes/desktop/desktop.component.html | 30 +++++- .../routes/desktop/desktop.component.scss | 9 +- .../routes/desktop/desktop.component.ts | 29 +++++- .../portal/routes/desktop/desktop.module.ts | 8 +- .../portal/routes/desktop/desktop.service.ts | 52 ++++++++++ .../routes/services/service.component.ts | 5 +- .../routes/system/snek/snek.component.ts | 8 ++ .../portal/routes/system/system.module.ts | 17 ++++ .../apps/portal/utils/to-navigation-item.ts | 13 --- .../app/apps/portal/utils/to-router-link.ts | 3 + .../toast-container/toast-container.module.ts | 9 +- .../ui/src/app/services/api/mock-patch.ts | 1 + .../src/app/services/patch-db/data-model.ts | 2 +- 33 files changed, 462 insertions(+), 232 deletions(-) delete mode 100644 frontend/projects/shared/src/directives/alert/alert.directive.ts delete mode 100644 frontend/projects/shared/src/directives/alert/alert.module.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/components/actions/actions.component.html create mode 100644 frontend/projects/ui/src/app/apps/portal/components/actions/actions.component.scss create mode 100644 frontend/projects/ui/src/app/apps/portal/components/actions/actions.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-actions.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-item.ts delete mode 100644 frontend/projects/ui/src/app/apps/portal/pipes/to-navigation-item.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.service.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/snek/snek.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts delete mode 100644 frontend/projects/ui/src/app/apps/portal/utils/to-navigation-item.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/utils/to-router-link.ts diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 6c7c2a25d..d0ea5b0e3 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -23,11 +23,11 @@ "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc5", - "@taiga-ui/addon-charts": "3.36.0", - "@taiga-ui/cdk": "3.36.0", - "@taiga-ui/core": "3.36.0", - "@taiga-ui/icons": "3.36.0", - "@taiga-ui/kit": "3.36.0", + "@taiga-ui/addon-charts": "3.38.0", + "@taiga-ui/cdk": "3.38.0", + "@taiga-ui/core": "3.38.0", + "@taiga-ui/icons": "3.38.0", + "@taiga-ui/kit": "3.38.0", "@tinkoff/ng-dompurify": "4.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", @@ -3553,9 +3553,9 @@ "dev": true }, "node_modules/@maskito/angular": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-1.2.0.tgz", - "integrity": "sha512-2YD/MWxESVn5/nckZj4F3GArzxjN3M4V8SHhtxI4c3wtg1m8ewoO8r7o3HYk/4aVLxxR0y2bz6cOWJtawt4KoQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-1.3.0.tgz", + "integrity": "sha512-SAuhTl3OkZ1Ff9TAksO+yLHgsv8N4LZTVOaFLyeYUQyLH/8nNcKTDMU/w1pRhoS0+7sXHH6/YzQ4CEHLgguHRA==", "dependencies": { "tslib": "^2.3.0" }, @@ -3563,21 +3563,21 @@ "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@angular/forms": ">=12.0.0", - "@maskito/core": "^1.2.0", + "@maskito/core": "^1.3.0", "rxjs": ">=6.0.0" } }, "node_modules/@maskito/core": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@maskito/core/-/core-1.2.0.tgz", - "integrity": "sha512-RFSydWYujxbVBbMzQVZ0zR77ROY3MbcuyKFWLomJWw3rDujl65M2ppz5KMeDSogAGkKnqzWudozjmBAQf2DgcA==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@maskito/core/-/core-1.3.0.tgz", + "integrity": "sha512-JFSUHJw+dB7yFzaX45S+t4ivPznOlsAqRorgGr4Gx3CR0DU8CZhZsSVCIeSNABsrIgtHPtlhiAv3Jw6EaqShTg==" }, "node_modules/@maskito/kit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-1.2.0.tgz", - "integrity": "sha512-sMUZ3vMp3RCAcw+H/TuxyrJDgz6J5TTUCc+2/inTCE1gr33FsmhzLqoi5PaYrD146VcOKdtAxd3NJ1RK/g1ZHw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-1.3.0.tgz", + "integrity": "sha512-DwYIEE7+fh/6q05KTzPEs+qnJp8jsXQa6h9UBk2Zlnp97PerPO56HGhvm2kAm/LSYtDzTCeurrvCAqncUSSOIg==", "peerDependencies": { - "@maskito/core": "^1.2.0" + "@maskito/core": "^1.3.0" } }, "node_modules/@materia-ui/ngx-monaco-editor": { @@ -3998,9 +3998,9 @@ } }, "node_modules/@taiga-ui/addon-charts": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.36.0.tgz", - "integrity": "sha512-GZqhXUNNBtjX0jqPuYtYLjALTP0boV3cORnYt9/pXZ1DSXje6AyjLAmYXY/u7vlgcWAggLPd6A1GXszSOBDdIA==", + "version": "3.38.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.38.0.tgz", + "integrity": "sha512-3/8M/FTKZ7OU1CdTInHrNSueQrHPqlas7+gvkj6jKCHuhqqe5MsBWYBIh8jywvbI6lbMGhXoNXYqrVzpvX2YNA==", "dependencies": { "tslib": ">=2.0.0" }, @@ -4008,15 +4008,15 @@ "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@ng-web-apis/common": ">=3.0.0", - "@taiga-ui/cdk": ">=3.36.0", - "@taiga-ui/core": ">=3.36.0", + "@taiga-ui/cdk": ">=3.38.0", + "@taiga-ui/core": ">=3.38.0", "@tinkoff/ng-polymorpheus": ">=4.0.0" } }, "node_modules/@taiga-ui/cdk": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.36.0.tgz", - "integrity": "sha512-ipoL6/P8OqsVXTcP1kXP5qeQ4Dtno6893xioHmke+SQpoOYO7u9JUZgj9exdL8Zyy4SdXF456EzB9qib79GN6g==", + "version": "3.38.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.38.0.tgz", + "integrity": "sha512-932i9DTnCJN4KlUDazVet+30C/iUnCX5ldrC5nJMglbn42/4/lW1Rlh8RNHhXlL61iz8+FqGkMSE+YAKhKKl0w==", "dependencies": { "@ng-web-apis/common": "3.0.1", "@ng-web-apis/mutation-observer": "3.0.1", @@ -4038,11 +4038,11 @@ } }, "node_modules/@taiga-ui/core": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.36.0.tgz", - "integrity": "sha512-X1l9kQLdVkN5oVNHgiFtKmCtPOneOtgI8SdPFgrhlTdNI9ve3cy4vhLWtVq441QYnTM/MIDPsTNXgRend/dDsg==", + "version": "3.38.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.38.0.tgz", + "integrity": "sha512-7j5u15d5J8iOEVQY/xUGSvmoHkgRbBrzner6kCj4ZSsgP7Mu+yamDQmSJdRzORqpG/oOBwtjuXZTr9ic8NWEXQ==", "dependencies": { - "@taiga-ui/i18n": "^3.36.0", + "@taiga-ui/i18n": "^3.38.0", "tslib": ">=2.0.0" }, "peerDependencies": { @@ -4054,41 +4054,44 @@ "@angular/router": ">=12.0.0", "@ng-web-apis/common": ">=3.0.0", "@ng-web-apis/mutation-observer": ">=3.0.0", - "@taiga-ui/cdk": ">=3.36.0", - "@taiga-ui/i18n": ">=3.36.0", + "@taiga-ui/cdk": ">=3.38.0", + "@taiga-ui/i18n": ">=3.38.0", "@tinkoff/ng-event-plugins": ">=3.1.0", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/i18n": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.36.0.tgz", - "integrity": "sha512-vl7rXDYR0LvDJrOimN+wR+7bZww7Cv1JxwsZpbrt5hxXhX5Ih36bMtBqJMEfziCL2XOuFbor2KjegllXreEHPA==", + "version": "3.38.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.38.0.tgz", + "integrity": "sha512-jejqnDjLHbm23sZ0ypRoy7bWrL9W57ISH74ArRNa1fV0Z+H0oHlkgz7JxDwEF8qmOOdZoYOAIkgZLRCEs3Cz+w==", "dependencies": { "tslib": ">=2.0.0" }, "peerDependencies": { "@angular/core": ">=12.0.0", - "rxjs": ">=6.0.0" + "@taiga-ui/cdk": ">=3.38.0" } }, "node_modules/@taiga-ui/icons": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.36.0.tgz", - "integrity": "sha512-naXB46KRDfxYFxKllrpexy/+zQ1ki3IkhBfHhoFhi0WuSW3pZ2GV8kDpFI6B49FDHMQTM2FcZ2oHAC5HEGKjKw==", + "version": "3.38.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.38.0.tgz", + "integrity": "sha512-SRhcQaNG08a+MbISCMXBvu79mHrl7H7MCUSoP3fMy8Y3yyJqE0cchnaYZosijrEFR9mRzn0JrQ75Hpo1FaJf5w==", "dependencies": { - "tslib": "^2.2.0" + "tslib": ">=2.0.0" + }, + "peerDependencies": { + "@taiga-ui/cdk": ">=3.38.0" } }, "node_modules/@taiga-ui/kit": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.36.0.tgz", - "integrity": "sha512-8aTKchdKmUfb6ud0iFsVnhQRg+d1zCla0coV+7n0GaHkfPd4Pp5DGiYaJMs6p9rixZM4sUyvRtYxO6p2bKaPQQ==", + "version": "3.38.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.38.0.tgz", + "integrity": "sha512-CdsYhxNhiQfQPfxbAtbZYEcKR1VbyVvtFG071Ry8/DwhjyaC6BkYyyARJqjjxT6cn2gNmb8njbcuuENqGf/ZXw==", "dependencies": { - "@maskito/angular": "1.2.0", - "@maskito/core": "1.2.0", - "@maskito/kit": "1.2.0", + "@maskito/angular": "1.3.0", + "@maskito/core": "1.3.0", + "@maskito/kit": "1.3.0", "@ng-web-apis/intersection-observer": "3.1.1", "text-mask-core": "5.1.2", "tslib": ">=2.0.0" @@ -4101,9 +4104,9 @@ "@ng-web-apis/common": ">=3.0.0", "@ng-web-apis/mutation-observer": ">=3.0.0", "@ng-web-apis/resize-observer": ">=3.0.0", - "@taiga-ui/cdk": ">=3.36.0", - "@taiga-ui/core": ">=3.36.0", - "@taiga-ui/i18n": ">=3.36.0", + "@taiga-ui/cdk": ">=3.38.0", + "@taiga-ui/core": ">=3.38.0", + "@taiga-ui/i18n": ">=3.38.0", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } diff --git a/frontend/package.json b/frontend/package.json index 816cd4c86..247cb2985 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -44,11 +44,11 @@ "@materia-ui/ngx-monaco-editor": "^6.0.0", "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", - "@taiga-ui/addon-charts": "3.36.0", - "@taiga-ui/cdk": "3.36.0", - "@taiga-ui/core": "3.36.0", - "@taiga-ui/icons": "3.36.0", - "@taiga-ui/kit": "3.36.0", + "@taiga-ui/addon-charts": "3.38.0", + "@taiga-ui/cdk": "3.38.0", + "@taiga-ui/core": "3.38.0", + "@taiga-ui/icons": "3.38.0", + "@taiga-ui/kit": "3.38.0", "@tinkoff/ng-dompurify": "4.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", diff --git a/frontend/projects/shared/src/directives/alert/alert.directive.ts b/frontend/projects/shared/src/directives/alert/alert.directive.ts deleted file mode 100644 index c9c7e3b4a..000000000 --- a/frontend/projects/shared/src/directives/alert/alert.directive.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Directive } from '@angular/core' -import { - AbstractTuiDialogDirective, - AbstractTuiDialogService, -} from '@taiga-ui/cdk' -import { TuiAlertOptions, TuiAlertService } from '@taiga-ui/core' - -// TODO: Move to Taiga UI -@Directive({ - selector: 'ng-template[tuiAlert]', - providers: [ - { - provide: AbstractTuiDialogService, - useExisting: TuiAlertService, - }, - ], - inputs: ['options: tuiAlertOptions', 'open: tuiAlert'], - outputs: ['openChange: tuiAlertChange'], -}) -export class TuiAlertDirective extends AbstractTuiDialogDirective< - TuiAlertOptions -> {} diff --git a/frontend/projects/shared/src/directives/alert/alert.module.ts b/frontend/projects/shared/src/directives/alert/alert.module.ts deleted file mode 100644 index 75791bd29..000000000 --- a/frontend/projects/shared/src/directives/alert/alert.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NgModule } from '@angular/core' -import { TuiAlertDirective } from './alert.directive' - -@NgModule({ - declarations: [TuiAlertDirective], - exports: [TuiAlertDirective], -}) -export class TuiAlertModule {} diff --git a/frontend/projects/shared/src/public-api.ts b/frontend/projects/shared/src/public-api.ts index 2f0dea166..dcf29257b 100644 --- a/frontend/projects/shared/src/public-api.ts +++ b/frontend/projects/shared/src/public-api.ts @@ -18,8 +18,6 @@ export * from './components/text-spinner/text-spinner.component.module' export * from './components/ticker/ticker.component' export * from './components/ticker/ticker.module' -export * from './directives/alert/alert.directive' -export * from './directives/alert/alert.module' export * from './directives/responsive-col/responsive-col.directive' export * from './directives/responsive-col/responsive-col.module' export * from './directives/responsive-col/responsive-col-viewport.directive' diff --git a/frontend/projects/ui/src/app/apps/portal/components/actions/actions.component.html b/frontend/projects/ui/src/app/apps/portal/components/actions/actions.component.html new file mode 100644 index 000000000..9be2e154e --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/components/actions/actions.component.html @@ -0,0 +1,17 @@ + +

    + + + +
    diff --git a/frontend/projects/ui/src/app/apps/portal/components/actions/actions.component.scss b/frontend/projects/ui/src/app/apps/portal/components/actions/actions.component.scss new file mode 100644 index 000000000..2cfd2d78a --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/components/actions/actions.component.scss @@ -0,0 +1,16 @@ +.title { + margin: 0; + padding: 0 0.5rem 0.25rem; + white-space: nowrap; + font: var(--tui-font-text-l); + font-weight: bold; +} + +.item { + justify-content: flex-start; + gap: 0.75rem; +} + +.icon { + opacity: var(--tui-disabled-opacity); +} diff --git a/frontend/projects/ui/src/app/apps/portal/components/actions/actions.component.ts b/frontend/projects/ui/src/app/apps/portal/components/actions/actions.component.ts new file mode 100644 index 000000000..d560545a7 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/components/actions/actions.component.ts @@ -0,0 +1,26 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core' +import { TuiDataListModule, TuiSvgModule } from '@taiga-ui/core' +import { CommonModule } from '@angular/common' + +export interface Action { + icon: string + label: string + action: () => void +} + +@Component({ + selector: 'app-actions', + templateUrl: './actions.component.html', + styleUrls: ['./actions.component.scss'], + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [TuiDataListModule, TuiSvgModule, CommonModule], +}) +export class ActionsComponent { + @Input() + actions: Record = {} + + asIsOrder(a: any, b: any) { + return 0 + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html index 66943d832..bc0afe0f5 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html +++ b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html @@ -1,9 +1,14 @@ - - + + - + - - - - - - + + {{ title }} + diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.scss b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.scss index d47636ae5..b171fcad5 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.scss +++ b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.scss @@ -43,20 +43,3 @@ // TODO: Theme background: #4b4a4a; } - -.menu-title { - margin: 0; - padding: 0 0.5rem 0.25rem; - white-space: nowrap; - font: var(--tui-font-text-l); - font-weight: bold; -} - -.menu-item { - justify-content: flex-start; - gap: 0.75rem; -} - -.menu-icon { - opacity: var(--tui-disabled-opacity); -} diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts index 5be666df3..3675f19e3 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts @@ -1,3 +1,4 @@ +import { CommonModule } from '@angular/common' import { ChangeDetectionStrategy, Component, @@ -13,10 +14,10 @@ import { TuiHostedDropdownModule, TuiSvgModule, } from '@taiga-ui/core' -import { - NavigationItem, - NavigationService, -} from '../navigation/navigation.service' +import { NavigationService } from '../navigation/navigation.service' +import { Action, ActionsComponent } from '../actions/actions.component' +import { ToDesktopActionsPipe } from '../../pipes/to-desktop-actions' +import { toRouterLink } from '../../utils/to-router-link' @Component({ selector: '[appCard]', @@ -25,22 +26,37 @@ import { standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [ + CommonModule, RouterLink, TuiButtonModule, TuiHostedDropdownModule, TuiDataListModule, TuiSvgModule, TickerModule, + ActionsComponent, + ToDesktopActionsPipe, ], }) export class CardComponent { private readonly navigation = inject(NavigationService) - @Input({ required: true }) - appCard!: NavigationItem + @Input() + id = '' + + @Input() + icon = '' + + @Input() + title = '' + + @Input() + actions: Record = {} @HostListener('click') onClick() { - this.navigation.addTab(this.appCard) + const { id, icon, title } = this + const routerLink = toRouterLink(id) + + this.navigation.addTab({ icon, title, routerLink }) } } diff --git a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html index 309d5357b..976e204e6 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html +++ b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html @@ -13,26 +13,37 @@ > Enter service name -

    System Utilities

    -
    - -
    -

    Installed services

    -
    - -
    - Nothing found + +

    System Utilities

    +
    + +
    +

    Installed services

    +
    + +
    + Nothing found +

    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 z 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

SJ%CeU{W6WphxH1XgP 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�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ü<0N&;?jdkU0~k0x25IA*bt44*)6XOx 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

diff --git a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.scss b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.scss index 9bbff7d91..49dd3e7ee 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.scss +++ b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.scss @@ -7,7 +7,7 @@ top: 100%; left: 0; width: 100%; - min-height: calc(100% - 10.25rem); + height: calc(100% - 10.25rem); display: flex; flex-direction: column; // TODO: Theme @@ -21,6 +21,9 @@ .content { flex: 1; + height: 100%; + display: flex; + flex-direction: column; background: inherit; } @@ -48,13 +51,17 @@ } } +.scrollbar { + margin-top: 1rem; +} + .search { - max-width: 41rem; + width: 25rem; margin: 6rem auto 0; } .title { - margin: 5rem 0 1.25rem; + margin: 4rem 0 1.25rem; text-align: center; text-transform: uppercase; font: var(--tui-font-text-xl); diff --git a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts index ed87b50a8..24ad8fd4e 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts @@ -13,14 +13,16 @@ import { TuiFilterPipeModule, TuiForModule, } from '@taiga-ui/cdk' -import { TuiSvgModule, TuiTextfieldControllerModule } from '@taiga-ui/core' +import { + TuiScrollbarModule, + TuiSvgModule, + TuiTextfieldControllerModule, +} from '@taiga-ui/core' import { TuiInputModule } from '@taiga-ui/kit' -import { map } from 'rxjs' import { CardComponent } from '../card/card.component' -import { NavigationItem } from '../navigation/navigation.service' import { ServicesService } from '../../services/services.service' import { SYSTEM_UTILITIES } from './drawer.const' -import { toNavigationItem } from '../../utils/to-navigation-item' +import { toRouterLink } from '../../utils/to-router-link' @Component({ selector: 'app-drawer', @@ -32,6 +34,7 @@ import { toNavigationItem } from '../../utils/to-navigation-item' CommonModule, FormsModule, TuiSvgModule, + TuiScrollbarModule, TuiActiveZoneModule, TuiInputModule, TuiTextfieldControllerModule, @@ -48,10 +51,13 @@ export class DrawerComponent { search = '' readonly system = SYSTEM_UTILITIES - readonly services$ = inject(ServicesService).pipe( - map(services => services.map(toNavigationItem)), - ) + readonly services$ = inject(ServicesService) + + readonly bySearch = (item: any, search: string): boolean => + search.length < 2 || + TUI_DEFAULT_MATCHER(item.manifest?.title || item.value?.title || '', search) - readonly bySearch = (item: NavigationItem, search: string): boolean => - search.length < 2 || TUI_DEFAULT_MATCHER(item.title, search) + getLink(id: string): string { + return toRouterLink(id) + } } diff --git a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.const.ts b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.const.ts index f4859d436..c7e04060c 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.const.ts +++ b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.const.ts @@ -1,24 +1,19 @@ -import { NavigationItem } from '../navigation/navigation.service' - -export const SYSTEM_UTILITIES: readonly NavigationItem[] = [ +export const SYSTEM_UTILITIES: Record = { - title: 'Devices', - routerLink: 'devices', - icon: 'assets/img/icon_transparent.png', - }, - { - title: 'Metrics', - routerLink: 'metrics', - icon: 'assets/img/icon_transparent.png', - }, - { - title: 'User manual', - routerLink: 'manual', - icon: 'assets/img/icon_transparent.png', - }, - { - title: 'Snek', - routerLink: 'snek', - icon: 'assets/img/icon_transparent.png', - }, -] + '/portal/system/devices': { + icon: 'assets/img/icon_transparent.png', + title: 'Devices', + }, + '/portal/system/metrics': { + icon: 'assets/img/icon_transparent.png', + title: 'Metrics', + }, + '/portal/system/manual': { + icon: 'assets/img/icon_transparent.png', + title: 'Manual', + }, + '/portal/system/snek': { + icon: 'assets/img/icon_transparent.png', + title: 'Snek', + }, + } diff --git a/frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-actions.ts b/frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-actions.ts new file mode 100644 index 000000000..00cba35e9 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-actions.ts @@ -0,0 +1,38 @@ +import { inject, Pipe, PipeTransform } from '@angular/core' +import { Action } from '../components/actions/actions.component' +import { filter, map, Observable } from 'rxjs' +import { DesktopService } from '../routes/desktop/desktop.service' + +@Pipe({ + name: 'toDesktopActions', + standalone: true, +}) +export class ToDesktopActionsPipe implements PipeTransform { + private readonly desktop = inject(DesktopService) + + transform( + value: Record, + id: string, + ): Observable> { + return this.desktop.desktop$.pipe( + filter(Boolean), + map(desktop => { + const action = desktop.includes(id) + ? { + icon: 'tuiIconMinus', + label: 'Remove from Desktop', + action: () => this.desktop.remove(id), + } + : { + icon: 'tuiIconPlus', + label: 'Add to Desktop', + action: () => this.desktop.add(id), + } + + return { + manage: [action], + } + }), + ) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-item.ts b/frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-item.ts new file mode 100644 index 000000000..edc182208 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-item.ts @@ -0,0 +1,35 @@ +import { Pipe, PipeTransform } from '@angular/core' +import { PackageDataEntry } from 'src/app/services/patch-db/data-model' +import { SYSTEM_UTILITIES } from '../components/drawer/drawer.const' +import { NavigationItem } from '../components/navigation/navigation.service' +import { toRouterLink } from '../utils/to-router-link' + +@Pipe({ + name: 'toDesktopItem', + standalone: true, +}) +export class ToDesktopItemPipe implements PipeTransform { + private readonly system = SYSTEM_UTILITIES + + transform( + packages: Record, + id: string, + ): NavigationItem { + const item = SYSTEM_UTILITIES[id] + const routerLink = toRouterLink(id) + + if (SYSTEM_UTILITIES[id]) { + return { + icon: item.icon, + title: item.title, + routerLink, + } + } + + return { + icon: packages[id].icon, + title: packages[id].manifest.title, + routerLink, + } + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/pipes/to-navigation-item.ts b/frontend/projects/ui/src/app/apps/portal/pipes/to-navigation-item.ts deleted file mode 100644 index dbf276474..000000000 --- a/frontend/projects/ui/src/app/apps/portal/pipes/to-navigation-item.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core' -import { PackageDataEntry } from 'src/app/services/patch-db/data-model' -import { NavigationItem } from '../components/navigation/navigation.service' -import { toNavigationItem } from '../utils/to-navigation-item' - -@Pipe({ - name: 'toNavigationItem', - standalone: true, -}) -export class ToNavigationItemPipe implements PipeTransform { - transform(service: PackageDataEntry): NavigationItem { - return toNavigationItem(service) - } -} diff --git a/frontend/projects/ui/src/app/apps/portal/portal.component.scss b/frontend/projects/ui/src/app/apps/portal/portal.component.scss index 5c4079653..821a6ccf5 100644 --- a/frontend/projects/ui/src/app/apps/portal/portal.component.scss +++ b/frontend/projects/ui/src/app/apps/portal/portal.component.scss @@ -6,4 +6,5 @@ main { flex: 1; + overflow: hidden; } diff --git a/frontend/projects/ui/src/app/apps/portal/portal.module.ts b/frontend/projects/ui/src/app/apps/portal/portal.module.ts index 5da7dba6d..85e49a6fd 100644 --- a/frontend/projects/ui/src/app/apps/portal/portal.module.ts +++ b/frontend/projects/ui/src/app/apps/portal/portal.module.ts @@ -27,6 +27,11 @@ const ROUTES: Routes = [ m => m.ServicesModule, ), }, + { + path: 'system', + loadChildren: () => + import('./routes/system/system.module').then(m => m.SystemModule), + }, ], }, ] diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html index e607345e4..0b1c1f05b 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html @@ -1,5 +1,25 @@ - + + + + + + + diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.scss b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.scss index 079b6cb3f..8272b8ebc 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.scss +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.scss @@ -3,9 +3,16 @@ align-items: center; align-content: center; justify-content: center; - flex-wrap: wrap; height: 100%; max-width: 56rem; margin: 0 auto; + padding: 1rem 0; +} + +.tiles { + width: 100%; + justify-content: center; + grid-template-columns: repeat(auto-fit, 12.5rem); + grid-auto-rows: 5.5rem; gap: 2rem; } diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts index f8ed19998..6a638db01 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts @@ -1,5 +1,8 @@ import { ChangeDetectionStrategy, Component, inject } from '@angular/core' -import { ServicesService } from '../../services/services.service' +import { PatchDB } from 'patch-db-client' +import { tap } from 'rxjs' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { DesktopService } from './desktop.service' @Component({ templateUrl: 'desktop.component.html', @@ -7,6 +10,26 @@ import { ServicesService } from '../../services/services.service' changeDetection: ChangeDetectionStrategy.OnPush, }) export class DesktopComponent { - // TODO: Only show services added to desktop - readonly services$ = inject(ServicesService) + private readonly desktop = inject(DesktopService) + + readonly desktop$ = this.desktop.desktop$.pipe( + tap(() => (this.order = new Map())), + ) + + readonly packages$ = + inject>(PatchDB).watch$('package-data') + + order = new Map() + + onReorder(order: Map, desktop: readonly string[]) { + this.order = order + + const items: string[] = [] + + Array.from(this.order.entries()).forEach(([index, order]) => { + items[order] = desktop[index] + }) + + this.desktop.save(items) + } } diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts index cf5d25409..71adc1ed7 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts @@ -1,9 +1,11 @@ import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' import { RouterModule, Routes } from '@angular/router' +import { TuiTilesModule } from '@taiga-ui/kit' import { DesktopComponent } from './desktop.component' import { CardComponent } from '../../components/card/card.component' -import { ToNavigationItemPipe } from '../../pipes/to-navigation-item' +import { ToDesktopActionsPipe } from '../../pipes/to-desktop-actions' +import { ToDesktopItemPipe } from '../../pipes/to-desktop-item' const ROUTES: Routes = [ { @@ -16,7 +18,9 @@ const ROUTES: Routes = [ imports: [ CommonModule, CardComponent, - ToNavigationItemPipe, + TuiTilesModule, + ToDesktopActionsPipe, + ToDesktopItemPipe, RouterModule.forChild(ROUTES), ], declarations: [DesktopComponent], diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.service.ts b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.service.ts new file mode 100644 index 000000000..00c77e070 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.service.ts @@ -0,0 +1,52 @@ +import { inject, Injectable } from '@angular/core' +import { TuiAlertService } from '@taiga-ui/core' +import { PatchDB } from 'patch-db-client' +import { BehaviorSubject, first } from 'rxjs' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { ApiService } from 'src/app/services/api/embassy-api.service' + +@Injectable({ + providedIn: 'root', +}) +export class DesktopService { + private readonly alerts = inject(TuiAlertService) + private readonly api = inject(ApiService) + + readonly desktop$ = new BehaviorSubject( + undefined, + ) + + constructor() { + inject>(PatchDB) + .watch$('ui', 'desktop') + .pipe(first()) + .subscribe(desktop => { + if (!this.desktop$.value) { + this.desktop$.next(desktop) + } + }) + } + + add(id: string) { + this.desktop$.next(this.desktop$.value?.concat(id)) + this.save(this.desktop$.value) + } + + remove(id: string) { + this.desktop$.next(this.desktop$.value?.filter(x => x !== id)) + this.save(this.desktop$.value) + } + + save(ids: readonly string[] = []) { + this.api + .setDbValue(['desktop'], ids) + .catch(() => + this.alerts + .open( + 'Desktop might be out of sync. Please refresh the page to fix it.', + { status: 'warning' }, + ) + .subscribe(), + ) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/service.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/services/service.component.ts index 9efc08caf..ab64abb9a 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/services/service.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/services/service.component.ts @@ -5,6 +5,7 @@ import { PatchDB } from 'patch-db-client' import { tap } from 'rxjs' import { DataModel } from 'src/app/services/patch-db/data-model' import { NavigationService } from '../../components/navigation/navigation.service' +import { toRouterLink } from '../../utils/to-router-link' @Component({ templateUrl: 'service.component.html', @@ -26,9 +27,9 @@ export class ServiceComponent { this.router.navigate(['..'], { relativeTo: this.route }) } else { this.navigation.addTab({ - title: pkg.manifest.title, - routerLink: `/portal/services/${pkg.manifest.id}`, icon: pkg.icon, + title: pkg.manifest.title, + routerLink: toRouterLink(pkg.manifest.id), }) } }), diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/snek/snek.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/snek/snek.component.ts new file mode 100644 index 000000000..57f7c2653 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/snek/snek.component.ts @@ -0,0 +1,8 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core' + +@Component({ + template: 'Here be snek', + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class SnekComponent {} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts new file mode 100644 index 000000000..6732156a7 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core' +import { RouterModule, Routes } from '@angular/router' + +const ROUTES: Routes = [ + { + path: 'snek', + loadComponent: () => + import('./snek/snek.component').then(m => m.SnekComponent), + }, +] + +@NgModule({ + imports: [RouterModule.forChild(ROUTES)], + declarations: [], + exports: [], +}) +export class SystemModule {} diff --git a/frontend/projects/ui/src/app/apps/portal/utils/to-navigation-item.ts b/frontend/projects/ui/src/app/apps/portal/utils/to-navigation-item.ts deleted file mode 100644 index 12749a399..000000000 --- a/frontend/projects/ui/src/app/apps/portal/utils/to-navigation-item.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { PackageDataEntry } from 'src/app/services/patch-db/data-model' -import { NavigationItem } from '../components/navigation/navigation.service' - -export function toNavigationItem({ - manifest, - icon, -}: PackageDataEntry): NavigationItem { - return { - title: manifest.title, - routerLink: `/portal/services/${manifest.id}`, - icon, - } -} diff --git a/frontend/projects/ui/src/app/apps/portal/utils/to-router-link.ts b/frontend/projects/ui/src/app/apps/portal/utils/to-router-link.ts new file mode 100644 index 000000000..40a9ce418 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/utils/to-router-link.ts @@ -0,0 +1,3 @@ +export function toRouterLink(id: string): string { + return id.includes('/') ? id : `/portal/services/${id}` +} diff --git a/frontend/projects/ui/src/app/common/toast-container/toast-container.module.ts b/frontend/projects/ui/src/app/common/toast-container/toast-container.module.ts index 86294542a..0029ddada 100644 --- a/frontend/projects/ui/src/app/common/toast-container/toast-container.module.ts +++ b/frontend/projects/ui/src/app/common/toast-container/toast-container.module.ts @@ -1,14 +1,17 @@ import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' import { RouterModule } from '@angular/router' -import { TuiAlertModule } from '@start9labs/shared' +import { TuiAutoFocusModule } from '@taiga-ui/cdk' +import { + TuiAlertModule, + TuiButtonModule, + TuiDialogModule, +} from '@taiga-ui/core' import { ToastContainerComponent } from './toast-container.component' import { NotificationsToastComponent } from './notifications-toast/notifications-toast.component' import { RefreshAlertComponent } from './refresh-alert/refresh-alert.component' import { UpdateToastComponent } from './update-toast/update-toast.component' -import { TuiButtonModule, TuiDialogModule } from '@taiga-ui/core' -import { TuiAutoFocusModule } from '@taiga-ui/cdk' @NgModule({ imports: [ diff --git a/frontend/projects/ui/src/app/services/api/mock-patch.ts b/frontend/projects/ui/src/app/services/api/mock-patch.ts index 3ea441ed2..240cf6ec9 100644 --- a/frontend/projects/ui/src/app/services/api/mock-patch.ts +++ b/frontend/projects/ui/src/app/services/api/mock-patch.ts @@ -7,6 +7,7 @@ export const mockPatchData: DataModel = { name: `Matt's Server`, 'ack-welcome': '1.0.0', theme: 'Dark', + desktop: ['lnd'], widgets: BUILT_IN_WIDGETS.filter( ({ id }) => id === 'favorites' || diff --git a/frontend/projects/ui/src/app/services/patch-db/data-model.ts b/frontend/projects/ui/src/app/services/patch-db/data-model.ts index 00467fdf6..71618f4bb 100644 --- a/frontend/projects/ui/src/app/services/patch-db/data-model.ts +++ b/frontend/projects/ui/src/app/services/patch-db/data-model.ts @@ -3,7 +3,6 @@ import { Url } from '@start9labs/shared' import { Manifest } from '@start9labs/marketplace' import { BackupJob } from '../api/api.types' import { customSmtp } from '@start9labs/start-sdk/lib/config/configConstants' -import { CustomSpec } from 'src/app/apps/ui/pages/system/domains/domain.const' export interface DataModel { 'server-info': ServerInfo @@ -23,6 +22,7 @@ export interface UIData { 'ack-instructions': Record theme: string widgets: readonly Widget[] + desktop: readonly string[] } export interface Widget { From 0d079f0d8961ddd5f27c62ea61e0c1e9da1ee13f Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Sun, 6 Aug 2023 23:30:53 +0400 Subject: [PATCH 011/169] feat(portal): implement drag and drop add/remove (#2383) --- .../components/card/card.component.html | 2 +- .../components/card/card.component.scss | 1 - .../portal/components/card/card.component.ts | 2 - .../drawer/drawer-item.directive.ts | 87 +++++++++++++++++++ .../components/drawer/drawer.component.html | 2 + .../components/drawer/drawer.component.ts | 2 + .../apps/portal/pipes/to-desktop-actions.ts | 38 -------- .../app/apps/portal/pipes/to-desktop-item.ts | 4 +- .../routes/desktop/dektop-loading.service.ts | 37 ++++++++ .../routes/desktop/desktop-item.directive.ts | 40 +++++++++ .../routes/desktop/desktop.component.html | 38 +++++--- .../routes/desktop/desktop.component.scss | 30 +++++++ .../routes/desktop/desktop.component.ts | 56 +++++++----- .../portal/routes/desktop/desktop.module.ts | 7 +- .../portal/routes/desktop/desktop.service.ts | 52 ----------- .../apps/portal/services/desktop.service.ts | 53 +++++++++++ 16 files changed, 323 insertions(+), 128 deletions(-) create mode 100644 frontend/projects/ui/src/app/apps/portal/components/drawer/drawer-item.directive.ts delete mode 100644 frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-actions.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/desktop/dektop-loading.service.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop-item.directive.ts delete mode 100644 frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.service.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/services/desktop.service.ts diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html index bc0afe0f5..899d83144 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html +++ b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html @@ -20,7 +20,7 @@ {{ title }} diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.scss b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.scss index b171fcad5..95d16a0fb 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.scss +++ b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.scss @@ -27,7 +27,6 @@ width: 2.5rem; height: 2.5rem; border-radius: 100%; - box-shadow: 0.25rem 0.25rem 0.25rem rgb(0 0 0 / 25%); } .title { diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts index 3675f19e3..6cf02c8a7 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts @@ -16,7 +16,6 @@ import { } from '@taiga-ui/core' import { NavigationService } from '../navigation/navigation.service' import { Action, ActionsComponent } from '../actions/actions.component' -import { ToDesktopActionsPipe } from '../../pipes/to-desktop-actions' import { toRouterLink } from '../../utils/to-router-link' @Component({ @@ -34,7 +33,6 @@ import { toRouterLink } from '../../utils/to-router-link' TuiSvgModule, TickerModule, ActionsComponent, - ToDesktopActionsPipe, ], }) export class CardComponent { diff --git a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer-item.directive.ts b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer-item.directive.ts new file mode 100644 index 000000000..4921d580b --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer-item.directive.ts @@ -0,0 +1,87 @@ +import { + Directive, + ElementRef, + HostListener, + inject, + Input, +} from '@angular/core' +import { tuiGetActualTarget, tuiIsElement, tuiPx } from '@taiga-ui/cdk' +import { DrawerComponent } from './drawer.component' +import { DesktopService } from '../../services/desktop.service' + +/** + * This directive is responsible for drag and drop of the drawer item. + * It saves item to desktop when dropped. + */ +@Directive({ + selector: '[drawerItem]', + standalone: true, + host: { + '[style.touchAction]': '"none"', + }, +}) +export class DrawerItemDirective { + private readonly desktop = inject(DesktopService) + private readonly drawer = inject(DrawerComponent) + private readonly element: HTMLElement = inject(ElementRef).nativeElement + + private x = NaN + private y = NaN + + @Input() + drawerItem = '' + + @HostListener('pointerdown.prevent.silent', ['$event']) + onStart(event: PointerEvent): void { + // This element is already on the desktop + if (this.desktop.items.includes(this.drawerItem)) return + + const target = tuiGetActualTarget(event) + const { x, y, pointerId } = event + const { left, top } = this.element.getBoundingClientRect() + + if (tuiIsElement(target)) { + target.releasePointerCapture(pointerId) + } + + this.drawer.open = false + this.onPointer(x - left, y - top) + } + + @HostListener('document:pointerup.silent') + onPointer(x = NaN, y = NaN): void { + // Some other element is dragged + if (Number.isNaN(this.x) && Number.isNaN(x)) return + + this.x = x + this.y = y + this.process(NaN, NaN) + } + + @HostListener('document:pointermove.silent', ['$event.x', '$event.y']) + onMove(x: number, y: number): void { + // This element is not dragged + if (Number.isNaN(this.x)) return + + this.process(x, y) + this.desktop.add('') + } + + private process(x: number, y: number) { + const { style } = this.element + const { items } = this.desktop + const dragged = !Number.isNaN(this.x + x) + + style.pointerEvents = dragged ? 'none' : '' + style.position = dragged ? 'fixed' : '' + style.top = dragged ? tuiPx(y - this.y) : '' + style.left = dragged ? tuiPx(x - this.x) : '' + + if (dragged || !items.includes('')) { + return + } + + this.desktop.items = items.map(item => item || this.drawerItem) + this.desktop.reorder(this.desktop.order) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html index 976e204e6..5fc199810 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html +++ b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html @@ -22,6 +22,7 @@

System Utilities

empty: empty " appCard + [drawerItem]="item.key" [id]="item.key" [title]="item.value.title" [icon]="item.value.icon" @@ -37,6 +38,7 @@

Installed services

empty: empty " appCard + [drawerItem]="item.manifest.id" [id]="item.manifest.id" [icon]="item.icon" [title]="item.manifest.title" diff --git a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts index 24ad8fd4e..d516a0887 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts @@ -23,6 +23,7 @@ import { CardComponent } from '../card/card.component' import { ServicesService } from '../../services/services.service' import { SYSTEM_UTILITIES } from './drawer.const' import { toRouterLink } from '../../utils/to-router-link' +import { DrawerItemDirective } from './drawer-item.directive' @Component({ selector: 'app-drawer', @@ -41,6 +42,7 @@ import { toRouterLink } from '../../utils/to-router-link' TuiForModule, TuiFilterPipeModule, CardComponent, + DrawerItemDirective, RouterLink, ], }) diff --git a/frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-actions.ts b/frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-actions.ts deleted file mode 100644 index 00cba35e9..000000000 --- a/frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-actions.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { inject, Pipe, PipeTransform } from '@angular/core' -import { Action } from '../components/actions/actions.component' -import { filter, map, Observable } from 'rxjs' -import { DesktopService } from '../routes/desktop/desktop.service' - -@Pipe({ - name: 'toDesktopActions', - standalone: true, -}) -export class ToDesktopActionsPipe implements PipeTransform { - private readonly desktop = inject(DesktopService) - - transform( - value: Record, - id: string, - ): Observable> { - return this.desktop.desktop$.pipe( - filter(Boolean), - map(desktop => { - const action = desktop.includes(id) - ? { - icon: 'tuiIconMinus', - label: 'Remove from Desktop', - action: () => this.desktop.remove(id), - } - : { - icon: 'tuiIconPlus', - label: 'Add to Desktop', - action: () => this.desktop.add(id), - } - - return { - manage: [action], - } - }), - ) - } -} diff --git a/frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-item.ts b/frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-item.ts index edc182208..1769165c1 100644 --- a/frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-item.ts +++ b/frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-item.ts @@ -14,7 +14,9 @@ export class ToDesktopItemPipe implements PipeTransform { transform( packages: Record, id: string, - ): NavigationItem { + ): NavigationItem | null { + if (!id) return null + const item = SYSTEM_UTILITIES[id] const routerLink = toRouterLink(id) diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/dektop-loading.service.ts b/frontend/projects/ui/src/app/apps/portal/routes/desktop/dektop-loading.service.ts new file mode 100644 index 000000000..2a4dc34c3 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/dektop-loading.service.ts @@ -0,0 +1,37 @@ +import { inject, Injectable } from '@angular/core' +import { PatchDB } from 'patch-db-client' +import { + endWith, + ignoreElements, + Observable, + shareReplay, + startWith, + take, + tap, +} from 'rxjs' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { DesktopService } from '../../services/desktop.service' + +/** + * This service loads initial values for desktop items + * and is used to show loading indicator. + */ +@Injectable({ + providedIn: 'root', +}) +export class DektopLoadingService extends Observable { + private readonly desktop = inject(DesktopService) + private readonly patch = inject>(PatchDB) + private readonly loading = this.patch.watch$('ui', 'desktop').pipe( + take(1), + tap(items => (this.desktop.items = items.filter(Boolean))), + ignoreElements(), + startWith(true), + endWith(false), + shareReplay(1), + ) + + constructor() { + super(subscriber => this.loading.subscribe(subscriber)) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop-item.directive.ts b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop-item.directive.ts new file mode 100644 index 000000000..4ebcc0edf --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop-item.directive.ts @@ -0,0 +1,40 @@ +import { + Directive, + ElementRef, + HostBinding, + inject, + Input, + OnDestroy, + OnInit, +} from '@angular/core' +import { TuiTilesComponent } from '@taiga-ui/kit' + +/** + * This directive is responsible for creating empty placeholder + * on the desktop when item is dragged from the drawer + */ +@Directive({ + selector: '[desktopItem]', + standalone: true, +}) +export class DesktopItemDirective implements OnInit, OnDestroy { + private readonly element: Element = inject(ElementRef).nativeElement + private readonly tiles = inject(TuiTilesComponent) + + @Input() + desktopItem = '' + + @HostBinding('class._empty') + get empty(): boolean { + return !this.desktopItem + } + + ngOnInit() { + if (this.empty) this.tiles.element = this.element + } + + // TODO: Remove after Taiga UI updated to 3.40.0 + ngOnDestroy() { + if (this.tiles.element === this.element) this.tiles.element = null + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html index 0b1c1f05b..54a4d54d4 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html @@ -1,25 +1,41 @@ - + + + - +
diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.scss b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.scss index 8272b8ebc..ee97235f8 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.scss +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.scss @@ -1,3 +1,5 @@ +@import '@taiga-ui/core/styles/taiga-ui-local'; + :host { display: flex; align-items: center; @@ -9,10 +11,38 @@ padding: 1rem 0; } +.loader { + height: 10rem; + width: 10rem; +} + .tiles { width: 100%; + min-height: 5.5rem; justify-content: center; grid-template-columns: repeat(auto-fit, 12.5rem); grid-auto-rows: 5.5rem; gap: 2rem; } + +.remove { + @include transition(background); + position: fixed; + bottom: 0; + left: calc(50% - 3rem); + width: 6rem; + height: 6rem; + border-radius: 100%; + background: var(--tui-base-02); + z-index: 10; + + &:hover { + background: var(--tui-base-01); + } +} + +.item._dragged, +.item._empty { + border-radius: var(--tui-radius-l); + box-shadow: inset 0 0 0 0.5rem var(--tui-clear-active); +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts index 6a638db01..d879372d3 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts @@ -1,35 +1,51 @@ -import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { + Component, + ElementRef, + inject, + QueryList, + ViewChild, + ViewChildren, +} from '@angular/core' +import { EMPTY_QUERY, TUI_PARENT_STOP } from '@taiga-ui/cdk' +import { tuiFadeIn, tuiScaleIn } from '@taiga-ui/core' +import { TuiTileComponent, TuiTilesComponent } from '@taiga-ui/kit' import { PatchDB } from 'patch-db-client' -import { tap } from 'rxjs' -import { DataModel } from 'src/app/services/patch-db/data-model' -import { DesktopService } from './desktop.service' +import { + DataModel, + PackageDataEntry, +} from 'src/app/services/patch-db/data-model' +import { DesktopService } from '../../services/desktop.service' +import { Observable } from 'rxjs' +import { DektopLoadingService } from './dektop-loading.service' @Component({ templateUrl: 'desktop.component.html', styleUrls: ['desktop.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, + animations: [TUI_PARENT_STOP, tuiScaleIn, tuiFadeIn], }) export class DesktopComponent { - private readonly desktop = inject(DesktopService) + @ViewChildren(TuiTileComponent, { read: ElementRef }) + private readonly tiles: QueryList = EMPTY_QUERY - readonly desktop$ = this.desktop.desktop$.pipe( - tap(() => (this.order = new Map())), - ) - - readonly packages$ = + readonly desktop = inject(DesktopService) + readonly loading$ = inject(DektopLoadingService) + readonly packages$: Observable> = inject>(PatchDB).watch$('package-data') - order = new Map() - - onReorder(order: Map, desktop: readonly string[]) { - this.order = order + @ViewChild(TuiTilesComponent) + readonly tile?: TuiTilesComponent - const items: string[] = [] + onRemove() { + const element = this.tile?.element + const index = this.tiles + .toArray() + .map(({ nativeElement }) => nativeElement) + .indexOf(element) - Array.from(this.order.entries()).forEach(([index, order]) => { - items[order] = desktop[index] - }) + this.desktop.remove(this.desktop.items[index]) + } - this.desktop.save(items) + onReorder(order: Map) { + this.desktop.reorder(order) } } diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts index 71adc1ed7..fa4e0e7f2 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts @@ -1,11 +1,12 @@ import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' import { RouterModule, Routes } from '@angular/router' +import { TuiLoaderModule, TuiSvgModule } from '@taiga-ui/core' import { TuiTilesModule } from '@taiga-ui/kit' import { DesktopComponent } from './desktop.component' import { CardComponent } from '../../components/card/card.component' -import { ToDesktopActionsPipe } from '../../pipes/to-desktop-actions' import { ToDesktopItemPipe } from '../../pipes/to-desktop-item' +import { DesktopItemDirective } from './desktop-item.directive' const ROUTES: Routes = [ { @@ -18,8 +19,10 @@ const ROUTES: Routes = [ imports: [ CommonModule, CardComponent, + DesktopItemDirective, + TuiSvgModule, + TuiLoaderModule, TuiTilesModule, - ToDesktopActionsPipe, ToDesktopItemPipe, RouterModule.forChild(ROUTES), ], diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.service.ts b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.service.ts deleted file mode 100644 index 00c77e070..000000000 --- a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.service.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { inject, Injectable } from '@angular/core' -import { TuiAlertService } from '@taiga-ui/core' -import { PatchDB } from 'patch-db-client' -import { BehaviorSubject, first } from 'rxjs' -import { DataModel } from 'src/app/services/patch-db/data-model' -import { ApiService } from 'src/app/services/api/embassy-api.service' - -@Injectable({ - providedIn: 'root', -}) -export class DesktopService { - private readonly alerts = inject(TuiAlertService) - private readonly api = inject(ApiService) - - readonly desktop$ = new BehaviorSubject( - undefined, - ) - - constructor() { - inject>(PatchDB) - .watch$('ui', 'desktop') - .pipe(first()) - .subscribe(desktop => { - if (!this.desktop$.value) { - this.desktop$.next(desktop) - } - }) - } - - add(id: string) { - this.desktop$.next(this.desktop$.value?.concat(id)) - this.save(this.desktop$.value) - } - - remove(id: string) { - this.desktop$.next(this.desktop$.value?.filter(x => x !== id)) - this.save(this.desktop$.value) - } - - save(ids: readonly string[] = []) { - this.api - .setDbValue(['desktop'], ids) - .catch(() => - this.alerts - .open( - 'Desktop might be out of sync. Please refresh the page to fix it.', - { status: 'warning' }, - ) - .subscribe(), - ) - } -} diff --git a/frontend/projects/ui/src/app/apps/portal/services/desktop.service.ts b/frontend/projects/ui/src/app/apps/portal/services/desktop.service.ts new file mode 100644 index 000000000..ac63cfbbd --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/services/desktop.service.ts @@ -0,0 +1,53 @@ +import { inject, Injectable } from '@angular/core' +import { TuiAlertService } from '@taiga-ui/core' +import { ApiService } from 'src/app/services/api/embassy-api.service' + +@Injectable({ + providedIn: 'root', +}) +export class DesktopService { + private readonly alerts = inject(TuiAlertService) + private readonly api = inject(ApiService) + + order = new Map() + items: readonly string[] = [] + + add(id: string) { + if (this.items.includes(id)) return + + this.items = this.items.concat(id) + this.save(this.items) + } + + remove(id: string) { + if (!this.items.includes(id)) return + + this.items = this.items.filter(x => x !== id) + this.save(this.items) + } + + save(ids: readonly string[] = []) { + this.api + .setDbValue(['desktop'], Array.from(new Set(ids))) + .catch(() => + this.alerts + .open( + 'Desktop might be out of sync. Please refresh the page to fix it.', + { status: 'warning' }, + ) + .subscribe(), + ) + } + + reorder(order: Map) { + this.order = order + + const items: string[] = [...this.items] + + Array.from(this.order.entries()).forEach(([index, order]) => { + items[order] = this.items[index] + }) + + this.save(items) + } +} From c3ae146580d4cafe5f108729379baf0f3e1313bc Mon Sep 17 00:00:00 2001 From: Matt Hill Date: Mon, 7 Aug 2023 15:14:03 -0600 Subject: [PATCH 012/169] proxies (#2376) * proxies * OS outbound proxy. ugly, needs work * abstract interface address management * clearnet and outbound proxies for services * clean up * router tab * smart launching of UIs * update sdk types * display outbound proxy on service show and rework menu --- frontend/package-lock.json | 63 ++++- frontend/package.json | 2 +- .../store-icon/store-icon.component.ts | 2 +- .../src/pages/list/item/item.component.ts | 2 +- .../src/pages/show/about/about.component.ts | 2 +- .../show/additional/additional.component.ts | 2 +- .../dependencies/dependencies.component.ts | 2 +- .../pages/show/package/package.component.ts | 2 +- .../src/app/pages/recover/recover.page.ts | 2 +- .../download-doc/download-doc.component.ts | 2 +- .../shared/src/types/workspace-config.ts | 2 +- frontend/projects/ui/src/app/app.module.ts | 2 + .../app/app/preloader/preloader.component.ts | 4 +- .../target-select/target-select.page.ts | 4 +- .../ui/pages/backups/types/target-types.ts | 2 +- .../marketplace-show-controls.component.ts | 2 +- .../marketplace-show-dependent.component.ts | 2 +- .../marketplace-status.component.ts | 3 +- .../services/app-actions/app-actions.page.ts | 2 +- .../app-interface/app-interface.module.ts | 24 ++ .../app-interface/app-interface.page.html | 20 ++ .../app-interface/app-interface.page.scss | 0 .../app-interface/app-interface.page.ts | 29 +++ .../app-interfaces-item.component.html | 34 --- .../app-interfaces/app-interfaces.module.ts | 32 --- .../app-interfaces/app-interfaces.page.html | 19 -- .../app-interfaces/app-interfaces.page.scss | 3 - .../app-interfaces/app-interfaces.page.ts | 59 ----- .../app-list-icon/app-list-icon.component.ts | 2 +- .../app-list-pkg/app-list-pkg.component.html | 34 ++- .../app-list-pkg/app-list-pkg.component.ts | 14 +- .../launch-menu/launch-menu.component.html | 25 ++ .../launch-menu/launch-menu.component.scss | 0 .../launch-menu/launch-menu.component.ts | 5 +- .../launch-menu/launch-menu.module.ts | 3 +- .../launchable-interfaces.pipe.ts | 26 ++ .../services/app-list/app-list.module.ts | 6 +- .../services/app-show/app-show.module.ts | 12 +- .../services/app-show/app-show.page.html | 4 +- .../app-show-additional.component.ts | 2 +- .../app-show-header.component.ts | 2 +- .../app-show-health-checks.component.ts | 2 +- .../app-show-interfaces.component.html | 25 ++ .../app-show-interfaces.component.scss | 0 .../app-show-interfaces.component.ts | 83 +++++++ .../app-show-menu.component.html | 95 +++++++- .../app-show-menu/app-show-menu.component.ts | 85 ++++++- .../app-show-progress.component.ts | 4 +- .../app-show-status.component.html | 13 - .../app-show-status.component.ts | 17 +- .../app-show/pipes/to-buttons.pipe.ts | 153 ------------ .../launch-menu/launch-menu.component.html | 28 --- .../apps/ui/pages/services/services.module.ts | 14 +- .../pages/services/status/status.component.ts | 2 +- .../ui/pages/services/ui-pipes/ui.module.ts | 8 - .../ui/pages/services/ui-pipes/ui.pipe.ts | 56 ----- .../ui/pages/system/domains/domain.const.ts | 206 ++++++++++------ .../ui/pages/system/domains/domains.page.html | 57 ++--- .../ui/pages/system/domains/domains.page.ts | 168 ++++++------- .../os-addresses/os-addresses.module.ts | 18 -- .../os-addresses/os-addresses.page.html | 228 ------------------ .../ui/pages/system/proxies/proxies.module.ts | 42 ++++ .../ui/pages/system/proxies/proxies.page.html | 144 +++++++++++ .../ui/pages/system/proxies/proxies.page.scss | 0 .../ui/pages/system/proxies/proxies.page.ts | 180 ++++++++++++++ .../router.module.ts} | 8 +- .../router.page.html} | 0 .../router.page.scss} | 0 .../router.page.ts} | 8 +- .../system/server-show/server-show.page.html | 10 + .../system/server-show/server-show.page.ts | 85 ++++--- .../app/apps/ui/pages/system/system.module.ts | 17 +- .../system/ui-details/ui-details.module.ts | 24 ++ .../system/ui-details/ui-details.page.html | 14 ++ .../system/ui-details/ui-details.page.scss | 0 .../system/ui-details/ui-details.page.ts | 15 ++ .../form/form-array/form-array.component.ts | 2 +- .../form-control/form-control.component.ts | 2 +- .../form/form-object/form-object.component.ts | 2 +- .../form/form-union/form-union.component.ts | 2 +- .../interface-addresses-item.component.html | 18 ++ .../interface-addresses.component.html | 125 ++++++++++ .../interface-addresses.component.scss} | 0 .../interface-addresses.component.ts} | 158 +++++++----- .../interface-addresses.module.ts | 19 ++ .../ui/src/app/common/logs/logs.component.ts | 12 +- .../qr}/qr.component.ts | 0 .../ui/src/app/common/qr/qr.module.ts | 12 + .../any-link/any-link.component.ts | 2 +- .../widget-card/widget-card.component.ts | 4 +- .../ui/src/app/services/api/api.fixures.ts | 104 +++++--- .../ui/src/app/services/api/api.types.ts | 56 ++++- .../app/services/api/embassy-api.service.ts | 32 ++- .../services/api/embassy-live-api.service.ts | 44 +++- .../services/api/embassy-mock-api.service.ts | 127 +++++++++- .../ui/src/app/services/api/mock-patch.ts | 14 +- .../ui/src/app/services/config.service.ts | 60 ++++- .../src/app/services/patch-db/data-model.ts | 64 +++-- .../ui/src/app/services/proxy.service.ts | 161 +++++++++++++ .../ui/src/app/util/configBuilderToSpec.ts | 4 +- frontend/projects/ui/src/styles.scss | 2 +- 101 files changed, 2134 insertions(+), 1160 deletions(-) create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.module.ts create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.html create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.scss create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.ts delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces-item.component.html delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces.module.ts delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces.page.html delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces.page.scss delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces.page.ts create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.html rename frontend/projects/ui/src/app/apps/ui/pages/services/{ => app-list/app-list-pkg}/launch-menu/launch-menu.component.scss (100%) rename frontend/projects/ui/src/app/apps/ui/pages/services/{ => app-list/app-list-pkg}/launch-menu/launch-menu.component.ts (85%) rename frontend/projects/ui/src/app/apps/ui/pages/services/{ => app-list/app-list-pkg}/launch-menu/launch-menu.module.ts (74%) create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launchable-interfaces.pipe.ts create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.html create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.scss create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.ts delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/to-buttons.pipe.ts delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/services/launch-menu/launch-menu.component.html delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/services/ui-pipes/ui.module.ts delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/services/ui-pipes/ui.pipe.ts delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.module.ts delete mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.page.html create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.module.ts create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.scss create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.ts rename frontend/projects/ui/src/app/apps/ui/pages/system/{port-forwards/port-forwards.module.ts => router/router.module.ts} (75%) rename frontend/projects/ui/src/app/apps/ui/pages/system/{port-forwards/port-forwards.page.html => router/router.page.html} (100%) rename frontend/projects/ui/src/app/apps/ui/pages/system/{port-forwards/port-forwards.page.scss => router/router.page.scss} (100%) rename frontend/projects/ui/src/app/apps/ui/pages/system/{port-forwards/port-forwards.page.ts => router/router.page.ts} (89%) create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.module.ts create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.html create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.scss create mode 100644 frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.ts create mode 100644 frontend/projects/ui/src/app/common/interface-addresses/interface-addresses-item.component.html create mode 100644 frontend/projects/ui/src/app/common/interface-addresses/interface-addresses.component.html rename frontend/projects/ui/src/app/{apps/ui/pages/system/os-addresses/os-addresses.page.scss => common/interface-addresses/interface-addresses.component.scss} (100%) rename frontend/projects/ui/src/app/{apps/ui/pages/system/os-addresses/os-addresses.page.ts => common/interface-addresses/interface-addresses.component.ts} (53%) create mode 100644 frontend/projects/ui/src/app/common/interface-addresses/interface-addresses.module.ts rename frontend/projects/ui/src/app/{apps/ui/pages/services/app-interfaces => common/qr}/qr.component.ts (100%) create mode 100644 frontend/projects/ui/src/app/common/qr/qr.module.ts create mode 100644 frontend/projects/ui/src/app/services/proxy.service.ts diff --git a/frontend/package-lock.json b/frontend/package-lock.json index d0ea5b0e3..5fff0f288 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -22,7 +22,7 @@ "@materia-ui/ngx-monaco-editor": "^6.0.0", "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", - "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc5", + "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc8.beta2", "@taiga-ui/addon-charts": "3.38.0", "@taiga-ui/cdk": "3.38.0", "@taiga-ui/core": "3.38.0", @@ -3976,11 +3976,12 @@ "integrity": "sha512-1dhiG03VkfEwSLx/JPKVms6srAbYFQgwfSGhwpUKMDliMXuAHGVaueStmqzVxn3JpH/HEVz0QW8w/PXHqjdiIg==" }, "node_modules/@start9labs/start-sdk": { - "version": "0.4.0-rev0.lib0.rc5", - "resolved": "https://registry.npmjs.org/@start9labs/start-sdk/-/start-sdk-0.4.0-rev0.lib0.rc5.tgz", - "integrity": "sha512-2hAJE1id0VgpU8DJt/I+m/IEePmnspzF8BxUoLO3C+ZgyOZU1tEri1f9QCsS6OLn3J11xPlpY1VuSjP5CyHC+Q==", + "version": "0.4.0-rev0.lib0.rc8.beta2", + "resolved": "https://registry.npmjs.org/@start9labs/start-sdk/-/start-sdk-0.4.0-rev0.lib0.rc8.beta2.tgz", + "integrity": "sha512-2jo8gF/lOvzuOKKntPuQyejwDAY6Uxaz4KKqm2awoYN6Ycn1TrYud0KAdSjKFYDCKmJI/guQNej0XGVJe0B1XQ==", "dependencies": { "@iarna/toml": "^2.2.5", + "isomorphic-fetch": "^3.0.0", "ts-matches": "^5.4.1", "yaml": "^2.2.2" } @@ -6793,7 +6794,6 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -6803,7 +6803,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -8836,6 +8835,15 @@ "node": ">=0.10.0" } }, + "node_modules/isomorphic-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", + "dependencies": { + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" + } + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -10431,6 +10439,25 @@ "dev": true, "optional": true }, + "node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -13848,6 +13875,11 @@ "node": ">=6" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -14436,6 +14468,11 @@ "defaults": "^1.0.3" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, "node_modules/webpack": { "version": "5.88.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz", @@ -14844,6 +14881,20 @@ "node": ">=0.8.0" } }, + "node_modules/whatwg-fetch": { + "version": "3.6.17", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.17.tgz", + "integrity": "sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index 247cb2985..c37ed294d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -70,7 +70,7 @@ "patch-db-client": "file: ../../../patch-db/client", "pbkdf2": "^3.1.2", "rxjs": "^7.5.6", - "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc5", + "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc8.beta2", "swiper": "^8.2.4", "ts-matches": "^5.2.1", "tslib": "^2.3.0", diff --git a/frontend/projects/marketplace/src/components/store-icon/store-icon.component.ts b/frontend/projects/marketplace/src/components/store-icon/store-icon.component.ts index ff4a1aeae..b8e13c7ad 100644 --- a/frontend/projects/marketplace/src/components/store-icon/store-icon.component.ts +++ b/frontend/projects/marketplace/src/components/store-icon/store-icon.component.ts @@ -12,7 +12,7 @@ export class StoreIconComponent { url = '' @Input() size?: string - @Input() + @Input({ required: true }) marketplace!: MarketplaceConfig get icon() { diff --git a/frontend/projects/marketplace/src/pages/list/item/item.component.ts b/frontend/projects/marketplace/src/pages/list/item/item.component.ts index 36398efe6..d6d924acb 100644 --- a/frontend/projects/marketplace/src/pages/list/item/item.component.ts +++ b/frontend/projects/marketplace/src/pages/list/item/item.component.ts @@ -7,6 +7,6 @@ import { MarketplacePkg } from '../../../types' changeDetection: ChangeDetectionStrategy.OnPush, }) export class ItemComponent { - @Input() + @Input({ required: true }) pkg!: MarketplacePkg } diff --git a/frontend/projects/marketplace/src/pages/show/about/about.component.ts b/frontend/projects/marketplace/src/pages/show/about/about.component.ts index 6626d4fbe..55d95bbfc 100644 --- a/frontend/projects/marketplace/src/pages/show/about/about.component.ts +++ b/frontend/projects/marketplace/src/pages/show/about/about.component.ts @@ -8,6 +8,6 @@ import { MarketplacePkg } from '../../../types' changeDetection: ChangeDetectionStrategy.OnPush, }) export class AboutComponent { - @Input() + @Input({ required: true }) pkg!: MarketplacePkg } diff --git a/frontend/projects/marketplace/src/pages/show/additional/additional.component.ts b/frontend/projects/marketplace/src/pages/show/additional/additional.component.ts index 6814aad6c..4a19abb2c 100644 --- a/frontend/projects/marketplace/src/pages/show/additional/additional.component.ts +++ b/frontend/projects/marketplace/src/pages/show/additional/additional.component.ts @@ -31,7 +31,7 @@ import { AbstractMarketplaceService } from '../../../services/marketplace.servic changeDetection: ChangeDetectionStrategy.OnPush, }) export class AdditionalComponent { - @Input() + @Input({ required: true }) pkg!: MarketplacePkg @Output() diff --git a/frontend/projects/marketplace/src/pages/show/dependencies/dependencies.component.ts b/frontend/projects/marketplace/src/pages/show/dependencies/dependencies.component.ts index a6ecb103f..40e7c3ff0 100644 --- a/frontend/projects/marketplace/src/pages/show/dependencies/dependencies.component.ts +++ b/frontend/projects/marketplace/src/pages/show/dependencies/dependencies.component.ts @@ -7,7 +7,7 @@ import { MarketplacePkg } from '../../../types' changeDetection: ChangeDetectionStrategy.OnPush, }) export class DependenciesComponent { - @Input() + @Input({ required: true }) pkg!: MarketplacePkg getImg(key: string): string { diff --git a/frontend/projects/marketplace/src/pages/show/package/package.component.ts b/frontend/projects/marketplace/src/pages/show/package/package.component.ts index 08da8aa51..8b8ebc591 100644 --- a/frontend/projects/marketplace/src/pages/show/package/package.component.ts +++ b/frontend/projects/marketplace/src/pages/show/package/package.component.ts @@ -8,6 +8,6 @@ import { MarketplacePkg } from '../../../types' changeDetection: ChangeDetectionStrategy.OnPush, }) export class PackageComponent { - @Input() + @Input({ required: true }) pkg!: MarketplacePkg } diff --git a/frontend/projects/setup-wizard/src/app/pages/recover/recover.page.ts b/frontend/projects/setup-wizard/src/app/pages/recover/recover.page.ts index 66cab3eff..c0042cd95 100644 --- a/frontend/projects/setup-wizard/src/app/pages/recover/recover.page.ts +++ b/frontend/projects/setup-wizard/src/app/pages/recover/recover.page.ts @@ -128,7 +128,7 @@ export class RecoverPage { styleUrls: ['./recover.page.scss'], }) export class DriveStatusComponent { - @Input() hasValidBackup!: boolean + @Input({ required: true }) hasValidBackup!: boolean } interface MappedDisk { diff --git a/frontend/projects/setup-wizard/src/app/pages/success/download-doc/download-doc.component.ts b/frontend/projects/setup-wizard/src/app/pages/success/download-doc/download-doc.component.ts index 124afbfea..6d8fb54d1 100644 --- a/frontend/projects/setup-wizard/src/app/pages/success/download-doc/download-doc.component.ts +++ b/frontend/projects/setup-wizard/src/app/pages/success/download-doc/download-doc.component.ts @@ -5,7 +5,7 @@ import { Component, Input } from '@angular/core' templateUrl: 'download-doc.component.html', }) export class DownloadDocComponent { - @Input() lanAddress!: string + @Input({ required: true }) lanAddress!: string get crtName(): string { const hostname = new URL(this.lanAddress).hostname diff --git a/frontend/projects/shared/src/types/workspace-config.ts b/frontend/projects/shared/src/types/workspace-config.ts index 2da7d3f8d..6a7669b98 100644 --- a/frontend/projects/shared/src/types/workspace-config.ts +++ b/frontend/projects/shared/src/types/workspace-config.ts @@ -12,7 +12,7 @@ export type WorkspaceConfig = { } marketplace: MarketplaceConfig mocks: { - maskAs: 'tor' | 'lan' + maskAs: 'tor' | 'local' | 'localhost' | 'ipv4' | 'ipv6' | 'clearnet' skipStartupAlerts: boolean } } diff --git a/frontend/projects/ui/src/app/app.module.ts b/frontend/projects/ui/src/app/app.module.ts index c3f9c6fb1..9db493975 100644 --- a/frontend/projects/ui/src/app/app.module.ts +++ b/frontend/projects/ui/src/app/app.module.ts @@ -22,6 +22,7 @@ import { import { AppComponent } from './app.component' import { RoutingModule } from './routing.module' import { OSWelcomePageModule } from './common/os-welcome/os-welcome.module' +import { QRComponentModule } from './common/qr/qr.module' import { PreloaderModule } from './app/preloader/preloader.module' import { FooterModule } from './app/footer/footer.module' import { MenuModule } from './app/menu/menu.module' @@ -70,6 +71,7 @@ import { environment } from '../environments/environment' registrationStrategy: 'registerWhenStable:30000', }), LoadingModule, + QRComponentModule, ], providers: APP_PROVIDERS, bootstrap: [AppComponent], diff --git a/frontend/projects/ui/src/app/app/preloader/preloader.component.ts b/frontend/projects/ui/src/app/app/preloader/preloader.component.ts index cfa9e0321..de77bb500 100644 --- a/frontend/projects/ui/src/app/app/preloader/preloader.component.ts +++ b/frontend/projects/ui/src/app/app/preloader/preloader.component.ts @@ -69,6 +69,7 @@ const ICONS = [ 'pulse', 'push-outline', 'qr-code-outline', + 'radio-outline', 'receipt-outline', 'refresh', 'reload', @@ -81,7 +82,8 @@ const ICONS = [ 'save-outline', 'server-outline', 'settings-outline', - 'shield-checkmark-outline', + 'shield-outline', + 'shuffle-outline', 'stop-outline', 'stopwatch-outline', 'storefront-outline', diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.ts index 353fcdc14..8a2ca1733 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.ts @@ -74,6 +74,6 @@ export class TargetSelectPage { styleUrls: ['./target-select.page.scss'], }) export class TargetStatusComponent { - @Input() type!: BackupType - @Input() target!: BackupTarget + @Input({ required: true }) type!: BackupType + @Input({ required: true }) target!: BackupTarget } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/types/target-types.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/types/target-types.ts index 4e38f7570..fa129fdef 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/types/target-types.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/types/target-types.ts @@ -40,7 +40,7 @@ export const googleDriveSpec = Config.of({ name: 'Private Key File', description: 'Your Google Drive service account private key file (.json file)', - required: true, + required: { default: null }, extensions: ['json'], }), }) diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.ts index 9dc921ea8..4c9465ad9 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.ts @@ -41,7 +41,7 @@ export class MarketplaceShowControlsComponent { @Input() url?: string - @Input() + @Input({ required: true }) pkg!: MarketplacePkg @Input() diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.ts index 76c648867..3e28b783b 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.ts @@ -15,7 +15,7 @@ import { DependentInfo } from 'src/app/types/dependent-info' changeDetection: ChangeDetectionStrategy.OnPush, }) export class MarketplaceShowDependentComponent { - @Input() + @Input({ required: true }) pkg!: MarketplacePkg readonly dependentInfo?: DependentInfo = diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.ts index 05e36471b..3c4ad7c8a 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.ts @@ -10,8 +10,7 @@ import { styleUrls: ['marketplace-status.component.scss'], }) export class MarketplaceStatusComponent { - @Input() version!: string - + @Input({ required: true }) version!: string @Input() localPkg?: PackageDataEntry PackageState = PackageState diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.ts index 42e354d06..4e9f90475 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.ts @@ -188,7 +188,7 @@ interface LocalAction { changeDetection: ChangeDetectionStrategy.OnPush, }) export class AppActionsItemComponent { - @Input() action!: LocalAction + @Input({ required: true }) action!: LocalAction } @Pipe({ diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.module.ts new file mode 100644 index 000000000..7d418114b --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.module.ts @@ -0,0 +1,24 @@ +import { NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' +import { Routes, RouterModule } from '@angular/router' +import { IonicModule } from '@ionic/angular' +import { AppInterfacePage } from './app-interface.page' +import { InterfaceAddressesComponentModule } from 'src/app/common/interface-addresses/interface-addresses.module' + +const routes: Routes = [ + { + path: '', + component: AppInterfacePage, + }, +] + +@NgModule({ + imports: [ + CommonModule, + IonicModule, + RouterModule.forChild(routes), + InterfaceAddressesComponentModule, + ], + declarations: [AppInterfacePage], +}) +export class AppInterfacePageModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.html b/frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.html new file mode 100644 index 000000000..21f4b6c18 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.html @@ -0,0 +1,20 @@ + + + + + + + {{ interfaceInfo.name }} + + + + +
+ +
+
+
diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.scss b/frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.scss new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.ts new file mode 100644 index 000000000..a9d57952a --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.ts @@ -0,0 +1,29 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core' +import { ActivatedRoute } from '@angular/router' +import { PatchDB } from 'patch-db-client' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { getPkgId } from '@start9labs/shared' + +@Component({ + selector: 'app-interface', + templateUrl: './app-interface.page.html', + styleUrls: ['./app-interface.page.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AppInterfacePage { + readonly pkgId = getPkgId(this.route) + readonly interfaceId = this.route.snapshot.paramMap.get('interfaceId')! + + readonly interfaceInfo$ = this.patch.watch$( + 'package-data', + this.pkgId, + 'installed', + 'interfaceInfo', + this.interfaceId, + ) + + constructor( + private readonly route: ActivatedRoute, + private readonly patch: PatchDB, + ) {} +} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces-item.component.html b/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces-item.component.html deleted file mode 100644 index c04293e09..000000000 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces-item.component.html +++ /dev/null @@ -1,34 +0,0 @@ - - - -

{{ addressInfo.name }}

-

{{ addressInfo.description }}

-
-
-
- - -

{{ address | addressType }}

-

{{ address }}

-
- - - - - - - - - - - -
-
diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces.module.ts deleted file mode 100644 index 966905eae..000000000 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces.module.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { Routes, RouterModule } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { SharedPipesModule } from '@start9labs/shared' -import { QrCodeModule } from 'ng-qrcode' -import { - AppInterfacesItemComponent, - AppInterfacesPage, -} from './app-interfaces.page' -import { UiPipesModule } from '../ui-pipes/ui.module' -import { QRComponent } from './qr.component' - -const routes: Routes = [ - { - path: '', - component: AppInterfacesPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - SharedPipesModule, - UiPipesModule, - QrCodeModule, - ], - declarations: [AppInterfacesPage, AppInterfacesItemComponent, QRComponent], -}) -export class AppInterfacesPageModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces.page.html b/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces.page.html deleted file mode 100644 index 3178172a8..000000000 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces.page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - Interfaces - - - - - -
- -
-
-
diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces.page.scss b/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces.page.scss deleted file mode 100644 index 79823db59..000000000 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces.page.scss +++ /dev/null @@ -1,3 +0,0 @@ -p { - font-family: 'Courier New'; -} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces.page.ts deleted file mode 100644 index 52537ac0e..000000000 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/app-interfaces.page.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { ChangeDetectionStrategy, Component, Input } from '@angular/core' -import { ActivatedRoute } from '@angular/router' -import { getPkgId, CopyService } from '@start9labs/shared' -import { AddressInfo, DataModel } from 'src/app/services/patch-db/data-model' -import { PatchDB } from 'patch-db-client' -import { map } from 'rxjs' -import { QRComponent } from './qr.component' -import { TuiDialogService } from '@taiga-ui/core' -import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' - -@Component({ - selector: 'app-interfaces', - templateUrl: './app-interfaces.page.html', - styleUrls: ['./app-interfaces.page.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AppInterfacesPage { - readonly pkgId = getPkgId(this.route) - readonly addressInfo$ = this.patch - .watch$('package-data', this.pkgId, 'installed', 'address-info') - .pipe( - map(addressInfo => - Object.values(addressInfo).sort((a, b) => a.name.localeCompare(b.name)), - ), - ) - - constructor( - private readonly route: ActivatedRoute, - private readonly patch: PatchDB, - ) {} -} - -@Component({ - selector: 'app-interfaces-item', - templateUrl: './app-interfaces-item.component.html', - styleUrls: ['./app-interfaces.page.scss'], -}) -export class AppInterfacesItemComponent { - @Input() - addressInfo!: AddressInfo - - constructor( - private readonly dialogs: TuiDialogService, - readonly copyService: CopyService, - ) {} - - launch(url: string): void { - window.open(url, '_blank', 'noreferrer') - } - - showQR(data: string) { - this.dialogs - .open(new PolymorpheusComponent(QRComponent), { - size: 'auto', - data, - }) - .subscribe() - } -} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.ts index ccc4cd0c8..2692a91fe 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.ts @@ -9,7 +9,7 @@ import { PkgInfo } from 'src/app/types/pkg-info' changeDetection: ChangeDetectionStrategy.OnPush, }) export class AppListIconComponent { - @Input() + @Input({ required: true }) pkg!: PkgInfo readonly connected$ = this.connectionService.connected$ diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.html b/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.html index 6cd49a9f8..52c2bf14a 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.html @@ -20,19 +20,27 @@

{{ manifest.title }}

> - - - - + + + + + diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.ts index 902391c28..dcb792718 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.ts @@ -1,12 +1,14 @@ import { ChangeDetectionStrategy, Component, + Inject, Input, ViewChild, } from '@angular/core' -import { LaunchMenuComponent } from '../../launch-menu/launch-menu.component' +import { LaunchMenuComponent } from './launch-menu/launch-menu.component' import { PackageMainStatus } from 'src/app/services/patch-db/data-model' import { PkgInfo } from 'src/app/types/pkg-info' +import { DOCUMENT } from '@angular/common' @Component({ selector: 'app-list-pkg', @@ -17,7 +19,7 @@ import { PkgInfo } from 'src/app/types/pkg-info' export class AppListPkgComponent { @ViewChild('launchMenu') launchMenu!: LaunchMenuComponent - @Input() + @Input({ required: true }) pkg!: PkgInfo get status(): PackageMainStatus { @@ -26,10 +28,18 @@ export class AppListPkgComponent { ) } + constructor(@Inject(DOCUMENT) private readonly document: Document) {} + openPopover(e: Event): void { e.stopPropagation() e.preventDefault() this.launchMenu.event = e this.launchMenu.isOpen = true } + + launchUI(address: string, e: Event) { + e.stopPropagation() + e.preventDefault() + this.document.defaultView?.open(address, '_blank', 'noreferrer') + } } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.html b/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.html new file mode 100644 index 000000000..c54aa4b25 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.html @@ -0,0 +1,25 @@ + + + + + + +

{{ iface.name }}

+

{{ iface.address }}

+
+ +
+
+
+
+
diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/launch-menu/launch-menu.component.scss b/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/launch-menu/launch-menu.component.scss rename to frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/launch-menu/launch-menu.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.ts similarity index 85% rename from frontend/projects/ui/src/app/apps/ui/pages/services/launch-menu/launch-menu.component.ts rename to frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.ts index 1c22bf891..b6f4bfd22 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/launch-menu/launch-menu.component.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.ts @@ -7,6 +7,7 @@ import { ViewChild, } from '@angular/core' import { InstalledPackageInfo } from 'src/app/services/patch-db/data-model' +import { LaunchableInterface } from '../launchable-interfaces.pipe' @Component({ selector: 'launch-menu', @@ -17,8 +18,8 @@ import { InstalledPackageInfo } from 'src/app/services/patch-db/data-model' export class LaunchMenuComponent { @ViewChild('popover') popover!: HTMLIonPopoverElement - @Input() - addressInfo!: InstalledPackageInfo['address-info'] + @Input({ required: true }) + launchableInterfaces!: LaunchableInterface[] set isOpen(open: boolean) { this.popover.isOpen = open diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/launch-menu/launch-menu.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.module.ts similarity index 74% rename from frontend/projects/ui/src/app/apps/ui/pages/services/launch-menu/launch-menu.module.ts rename to frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.module.ts index ccbe8fa7d..eba343572 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/launch-menu/launch-menu.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.module.ts @@ -1,12 +1,11 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { IonicModule } from '@ionic/angular' -import { UiPipesModule } from '../ui-pipes/ui.module' import { LaunchMenuComponent } from './launch-menu.component' @NgModule({ declarations: [LaunchMenuComponent], - imports: [CommonModule, IonicModule, UiPipesModule], + imports: [CommonModule, IonicModule], exports: [LaunchMenuComponent], }) export class LaunchMenuComponentModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launchable-interfaces.pipe.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launchable-interfaces.pipe.ts new file mode 100644 index 000000000..8da2a0319 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launchable-interfaces.pipe.ts @@ -0,0 +1,26 @@ +import { Pipe, PipeTransform } from '@angular/core' +import { ConfigService } from 'src/app/services/config.service' +import { InstalledPackageInfo } from 'src/app/services/patch-db/data-model' + +@Pipe({ + name: 'launchableInterfaces', +}) +export class LaunchableInterfacesPipe implements PipeTransform { + constructor(private readonly config: ConfigService) {} + + transform( + interfaceInfo: InstalledPackageInfo['interfaceInfo'], + ): LaunchableInterface[] { + return Object.values(interfaceInfo) + .filter(info => info.type === 'ui') + .map(info => ({ + name: info.name, + address: this.config.launchableAddress(info), + })) + } +} + +export type LaunchableInterface = { + name: string + address: string +} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.module.ts index b1c8b5ec8..b0dbbc7af 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.module.ts @@ -12,11 +12,11 @@ import { import { BadgeMenuComponentModule } from 'src/app/common/badge-menu-button/badge-menu.component.module' import { WidgetListComponentModule } from 'src/app/common/widget-list/widget-list.component.module' import { StatusComponentModule } from '../status/status.component.module' -import { UiPipesModule } from '../ui-pipes/ui.module' import { AppListIconComponent } from './app-list-icon/app-list-icon.component' import { AppListPkgComponent } from './app-list-pkg/app-list-pkg.component' import { PackageInfoPipe } from './package-info.pipe' -import { LaunchMenuComponentModule } from '../launch-menu/launch-menu.module' +import { LaunchMenuComponentModule } from './app-list-pkg/launch-menu/launch-menu.module' +import { LaunchableInterfacesPipe } from './app-list-pkg/launchable-interfaces.pipe' const routes: Routes = [ { @@ -31,7 +31,6 @@ const routes: Routes = [ StatusComponentModule, EmverPipesModule, TextSpinnerComponentModule, - UiPipesModule, IonicModule, RouterModule.forChild(routes), BadgeMenuComponentModule, @@ -45,6 +44,7 @@ const routes: Routes = [ AppListIconComponent, AppListPkgComponent, PackageInfoPipe, + LaunchableInterfacesPipe, ], }) export class AppListPageModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts index ee45f5f2b..60d7e114a 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts @@ -10,21 +10,23 @@ import { } from '@start9labs/shared' import { StatusComponentModule } from '../status/status.component.module' import { AppConfigPageModule } from './modals/app-config/app-config.module' -import { UiPipesModule } from '../ui-pipes/ui.module' import { AppShowHeaderComponent } from './components/app-show-header/app-show-header.component' import { AppShowProgressComponent } from './components/app-show-progress/app-show-progress.component' import { AppShowStatusComponent } from './components/app-show-status/app-show-status.component' import { AppShowDependenciesComponent } from './components/app-show-dependencies/app-show-dependencies.component' import { AppShowMenuComponent } from './components/app-show-menu/app-show-menu.component' +import { + AppShowInterfacesComponent, + InterfaceInfoPipe, +} from './components/app-show-interfaces/app-show-interfaces.component' import { AppShowHealthChecksComponent } from './components/app-show-health-checks/app-show-health-checks.component' import { AppShowAdditionalComponent } from './components/app-show-additional/app-show-additional.component' import { HealthColorPipe } from './pipes/health-color.pipe' -import { ToButtonsPipe } from './pipes/to-buttons.pipe' import { ToDependenciesPipe } from './pipes/to-dependencies.pipe' import { ToStatusPipe } from './pipes/to-status.pipe' import { ProgressDataPipe } from './pipes/progress-data.pipe' import { InsecureWarningComponentModule } from 'src/app/common/insecure-warning/insecure-warning.module' -import { LaunchMenuComponentModule } from '../launch-menu/launch-menu.module' +import { LaunchMenuComponentModule } from '../app-list/app-list-pkg/launch-menu/launch-menu.module' const routes: Routes = [ { @@ -38,7 +40,6 @@ const routes: Routes = [ AppShowPage, HealthColorPipe, ProgressDataPipe, - ToButtonsPipe, ToDependenciesPipe, ToStatusPipe, AppShowHeaderComponent, @@ -46,8 +47,10 @@ const routes: Routes = [ AppShowStatusComponent, AppShowDependenciesComponent, AppShowMenuComponent, + AppShowInterfacesComponent, AppShowHealthChecksComponent, AppShowAdditionalComponent, + InterfaceInfoPipe, ], imports: [ CommonModule, @@ -56,7 +59,6 @@ const routes: Routes = [ RouterModule.forChild(routes), AppConfigPageModule, EmverPipesModule, - UiPipesModule, ResponsiveColModule, SharedPipesModule, InsecureWarningComponentModule, diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.page.html b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.page.html index cbbaf402c..4629a85eb 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.page.html @@ -27,6 +27,8 @@ > + + - + diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.ts index a61101cd0..bd35ee3ae 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.ts @@ -12,7 +12,7 @@ import { PackageDataEntry } from 'src/app/services/patch-db/data-model' changeDetection: ChangeDetectionStrategy.OnPush, }) export class AppShowAdditionalComponent { - @Input() + @Input({ required: true }) pkg!: PackageDataEntry constructor( diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.ts index fd234a9e9..0d37b9af1 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.ts @@ -8,6 +8,6 @@ import { PackageDataEntry } from 'src/app/services/patch-db/data-model' changeDetection: ChangeDetectionStrategy.OnPush, }) export class AppShowHeaderComponent { - @Input() + @Input({ required: true }) pkg!: PackageDataEntry } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.ts index e6cb90951..f2b5e96ce 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.ts @@ -12,7 +12,7 @@ import { isEmptyObject } from '@start9labs/shared' changeDetection: ChangeDetectionStrategy.OnPush, }) export class AppShowHealthChecksComponent { - @Input() pkgId!: string + @Input({ required: true }) pkgId!: string readonly connected$ = this.connectionService.connected$ diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.html b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.html new file mode 100644 index 000000000..737b5bbc1 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.html @@ -0,0 +1,25 @@ +Interfaces + + + +

{{ info.name }}

+

{{ info.description }}

+

+ {{ info.typeDetail }} +

+
+ + + +
diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.scss b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.ts new file mode 100644 index 000000000..d248a0a3a --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.ts @@ -0,0 +1,83 @@ +import { DOCUMENT } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + Inject, + Input, +} from '@angular/core' +import { ConfigService } from 'src/app/services/config.service' +import { + InstalledPackageInfo, + InterfaceInfo, +} from 'src/app/services/patch-db/data-model' +import { Pipe, PipeTransform } from '@angular/core' + +@Component({ + selector: 'app-show-interfaces', + templateUrl: './app-show-interfaces.component.html', + styleUrls: ['./app-show-interfaces.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AppShowInterfacesComponent { + @Input({ required: true }) + pkg!: InstalledPackageInfo + + constructor( + private readonly config: ConfigService, + @Inject(DOCUMENT) private readonly document: Document, + ) {} + + launchUI(info: InterfaceInfo, e: Event) { + e.stopPropagation() + e.preventDefault() + this.document.defaultView?.open( + this.config.launchableAddress(info), + '_blank', + 'noreferrer', + ) + } +} + +@Pipe({ + name: 'interfaceInfo', +}) +export class InterfaceInfoPipe implements PipeTransform { + transform(info: InstalledPackageInfo['interfaceInfo']) { + return Object.entries(info).map(([id, val]) => { + let color: string + let icon: string + let typeDetail: string + + switch (val.type) { + case 'ui': + color = 'primary' + icon = 'desktop-outline' + typeDetail = 'User Interface (UI)' + break + case 'p2p': + color = 'secondary' + icon = 'people-outline' + typeDetail = 'Peer-To-Peer Interface (P2P)' + break + case 'api': + color = 'tertiary' + icon = 'terminal-outline' + typeDetail = 'Application Program Interface (API)' + break + case 'other': + color = 'dark' + icon = 'cube-outline' + typeDetail = 'Unknown Interface Type' + break + } + + return { + ...val, + id, + color, + icon, + typeDetail, + } + }) + } +} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.html b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.html index d872fdd52..161f0ecbf 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.html @@ -1,15 +1,96 @@ Menu + + - + -

{{ button.title }}

-

{{ button.description }}

+

Instructions

+

Understand how to use {{ pkg.manifest.title }}

+ + + + + +

Config

+

Customize {{ pkg.manifest.title }}

+
+
+ + + + + +

Credentials

+

Password, keys, or other credentials of interest

+
+
+ + + + + +

Actions

+

Uninstall and other commands specific to {{ pkg.manifest.title }}

+
+
+ + + + + +

Outbound Proxy

+

Proxy all outbound traffic from {{ pkg.manifest.title }}

+

+ + {{ + !proxy.value + ? 'None' + : proxy.value === 'primary' + ? 'System Primary' + : proxy.value === 'mirror' + ? 'Mirror P2P' + : proxy.value.proxyId + }} + +

+
+
+ + + + + +

Logs

+

Raw, unfiltered logs

+
+
+ + + + + +

Marketplace Listing

+

View service in the marketplace

+
+
+ + + + +

Marketplace Listing

+

This package was not installed from the marketplace

+
+
+
diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.ts index 866d3e01f..237429bd2 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.ts @@ -1,5 +1,22 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core' -import { Button } from '../../pipes/to-buttons.pipe' +import { + DataModel, + PackageDataEntry, +} from 'src/app/services/patch-db/data-model' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { TuiDialogService } from '@taiga-ui/core' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' +import { MarkdownComponent } from '@start9labs/shared' +import { from, map } from 'rxjs' +import { PatchDB } from 'patch-db-client' +import { NavController } from '@ionic/angular' +import { ActivatedRoute, Params } from '@angular/router' +import { FormDialogService } from 'src/app/services/form-dialog.service' +import { ProxyService } from 'src/app/services/proxy.service' +import { + AppConfigPage, + PackageConfigData, +} from '../../modals/app-config/app-config.page' @Component({ selector: 'app-show-menu', @@ -8,6 +25,68 @@ import { Button } from '../../pipes/to-buttons.pipe' changeDetection: ChangeDetectionStrategy.OnPush, }) export class AppShowMenuComponent { - @Input() - buttons: Button[] = [] + @Input({ required: true }) + pkg!: PackageDataEntry + + get highlighted$() { + return this.patch + .watch$('ui', 'ack-instructions', this.pkg.manifest.id) + .pipe(map(seen => !seen)) + } + + constructor( + private readonly route: ActivatedRoute, + private readonly navCtrl: NavController, + private readonly dialogs: TuiDialogService, + private readonly formDialog: FormDialogService, + private readonly api: ApiService, + readonly patch: PatchDB, + private readonly proxyService: ProxyService, + ) {} + + async presentModalInstructions() { + const { id, version } = this.pkg.manifest + + this.api + .setDbValue(['ack-instructions', id], true) + .catch(e => console.error('Failed to mark instructions as seen', e)) + + this.dialogs + .open(new PolymorpheusComponent(MarkdownComponent), { + label: 'Instructions', + size: 'l', + data: { + content: from( + this.api.getStatic( + `/public/package-data/${id}/${version}/INSTRUCTIONS.md`, + ), + ), + }, + }) + .subscribe() + } + + openConfig() { + this.formDialog.open(AppConfigPage, { + label: `${this.pkg.manifest.title} configuration`, + data: { pkgId: this.pkg.manifest.id }, + }) + } + + setOutboundProxy() { + this.proxyService.presentModalSetOutboundProxy({ + packageId: this.pkg.manifest.id, + outboundProxy: this.pkg.installed!.outboundProxy, + hasP2P: Object.values(this.pkg.installed!.interfaceInfo).some( + i => i.type === 'p2p', + ), + }) + } + + navigate(path: string, qp?: Params) { + return this.navCtrl.navigateForward([path], { + relativeTo: this.route, + queryParams: qp, + }) + } } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.ts index 8ee7b750a..f902d42f0 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.ts @@ -12,10 +12,10 @@ import { ProgressData } from 'src/app/types/progress-data' changeDetection: ChangeDetectionStrategy.OnPush, }) export class AppShowProgressComponent { - @Input() + @Input({ required: true }) pkg!: PackageDataEntry - @Input() + @Input({ required: true }) progressData!: ProgressData get unpackingBuffer(): number { diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.html b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.html index 5cace82aa..87cb77384 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.html @@ -48,19 +48,6 @@ Configure - - - - Open UI - - - diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.ts index 91eb1f7f0..938f1e398 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.ts @@ -16,8 +16,8 @@ import { StatusRendering, } from 'src/app/services/pkg-status-rendering.service' import { - AddressInfo, DataModel, + InterfaceInfo, PackageDataEntry, PackageState, } from 'src/app/services/patch-db/data-model' @@ -30,7 +30,7 @@ import { import { DependencyInfo } from '../../pipes/to-dependencies.pipe' import { hasCurrentDeps } from 'src/app/util/has-deps' import { ConnectionService } from 'src/app/services/connection.service' -import { LaunchMenuComponent } from '../../../launch-menu/launch-menu.component' +import { LaunchMenuComponent } from '../../../app-list/app-list-pkg/launch-menu/launch-menu.component' @Component({ selector: 'app-show-status', @@ -41,10 +41,10 @@ import { LaunchMenuComponent } from '../../../launch-menu/launch-menu.component' export class AppShowStatusComponent { @ViewChild('launchMenu') launchMenu!: LaunchMenuComponent - @Input() + @Input({ required: true }) pkg!: PackageDataEntry - @Input() + @Input({ required: true }) status!: PackageStatus @Input() @@ -66,8 +66,8 @@ export class AppShowStatusComponent { return this.pkg.manifest.id } - get addressInfo(): Record { - return this.pkg.installed!['address-info'] + get interfaceInfo(): Record { + return this.pkg.installed!['interfaceInfo'] } get isConfigured(): boolean { @@ -90,11 +90,6 @@ export class AppShowStatusComponent { return PrimaryRendering[this.status.primary] } - openPopover(e: Event): void { - this.launchMenu.event = e - this.launchMenu.isOpen = true - } - presentModalConfig(): void { this.formDialog.open(AppConfigPage, { label: `${this.pkg.manifest.title} configuration`, diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/to-buttons.pipe.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/to-buttons.pipe.ts deleted file mode 100644 index cf8252b75..000000000 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/to-buttons.pipe.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core' -import { ActivatedRoute } from '@angular/router' -import { NavController } from '@ionic/angular' -import { MarkdownComponent } from '@start9labs/shared' -import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' -import { - DataModel, - PackageDataEntry, -} from 'src/app/services/patch-db/data-model' -import { FormDialogService } from 'src/app/services/form-dialog.service' -import { - AppConfigPage, - PackageConfigData, -} from '../modals/app-config/app-config.page' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { from, map, Observable } from 'rxjs' -import { PatchDB } from 'patch-db-client' -import { TuiDialogService } from '@taiga-ui/core' - -export interface Button { - title: string - description: string - icon: string - action: Function - highlighted$?: Observable - disabled?: boolean -} - -@Pipe({ - name: 'toButtons', -}) -export class ToButtonsPipe implements PipeTransform { - constructor( - private readonly route: ActivatedRoute, - private readonly navCtrl: NavController, - private readonly dialogs: TuiDialogService, - private readonly formDialog: FormDialogService, - private readonly apiService: ApiService, - private readonly patch: PatchDB, - ) {} - - transform(pkg: PackageDataEntry): Button[] { - const pkgTitle = pkg.manifest.title - - return [ - // instructions - { - action: () => this.presentModalInstructions(pkg), - title: 'Instructions', - description: `Understand how to use ${pkgTitle}`, - icon: 'list-outline', - highlighted$: this.patch - .watch$('ui', 'ack-instructions', pkg.manifest.id) - .pipe(map(seen => !seen)), - }, - // config - { - action: () => - this.formDialog.open(AppConfigPage, { - label: `${pkg.manifest.title} configuration`, - data: { pkgId: pkg.manifest.id }, - }), - title: 'Config', - description: `Customize ${pkgTitle}`, - icon: 'options-outline', - }, - // credentials - { - action: () => - this.navCtrl.navigateForward(['credentials'], { - relativeTo: this.route, - }), - title: 'Credentials', - description: 'Password, keys, or other credentials of interest', - icon: 'key-outline', - }, - // actions - { - action: () => - this.navCtrl.navigateForward(['actions'], { relativeTo: this.route }), - title: 'Actions', - description: `Uninstall and other commands specific to ${pkgTitle}`, - icon: 'flash-outline', - }, - // interfaces - { - action: () => - this.navCtrl.navigateForward(['interfaces'], { - relativeTo: this.route, - }), - title: 'Interfaces', - description: 'User and machine access points', - icon: 'desktop-outline', - }, - // logs - { - action: () => - this.navCtrl.navigateForward(['logs'], { relativeTo: this.route }), - title: 'Logs', - description: 'Raw, unfiltered service logs', - icon: 'receipt-outline', - }, - // view in marketplace - this.viewInMarketplaceButton(pkg), - ] - } - - private async presentModalInstructions(pkg: PackageDataEntry) { - const { id, version } = pkg.manifest - - this.apiService - .setDbValue(['ack-instructions', id], true) - .catch(e => console.error('Failed to mark instructions as seen', e)) - - this.dialogs - .open(new PolymorpheusComponent(MarkdownComponent), { - label: 'Instructions', - size: 'l', - data: { - content: from( - this.apiService.getStatic( - `/public/package-data/${id}/${version}/INSTRUCTIONS.md`, - ), - ), - }, - }) - .subscribe() - } - - private viewInMarketplaceButton(pkg: PackageDataEntry): Button { - const url = pkg.installed?.['marketplace-url'] - const queryParams = url ? { url } : {} - - let button: Button = { - title: 'Marketplace Listing', - icon: 'storefront-outline', - action: () => - this.navCtrl.navigateForward([`marketplace/${pkg.manifest.id}`], { - queryParams, - }), - disabled: false, - description: 'View service in the marketplace', - } - - if (!url) { - button.disabled = true - button.description = 'This package was not installed from the marketplace' - button.action = () => {} - } - - return button - } -} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/launch-menu/launch-menu.component.html b/frontend/projects/ui/src/app/apps/ui/pages/services/launch-menu/launch-menu.component.html deleted file mode 100644 index 474a9e7e4..000000000 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/launch-menu/launch-menu.component.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - {{ address.name }} - - -

{{ address | addressType }}

-

{{ address }}

-
- -
-
-
-
-
-
diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/services.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/services.module.ts index 858d4d9a7..6f2b8c9ff 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/services.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/services.module.ts @@ -24,13 +24,6 @@ const routes: Routes = [ m => m.AppActionsPageModule, ), }, - { - path: ':pkgId/interfaces', - loadChildren: () => - import('./app-interfaces/app-interfaces.module').then( - m => m.AppInterfacesPageModule, - ), - }, { path: ':pkgId/logs', loadChildren: () => @@ -43,6 +36,13 @@ const routes: Routes = [ m => m.AppCredentialsPageModule, ), }, + { + path: ':pkgId/interfaces/:interfaceId', + loadChildren: () => + import('./app-interface/app-interface.module').then( + m => m.AppInterfacePageModule, + ), + }, ] @NgModule({ diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/status/status.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/status/status.component.ts index 28077098b..0535030b2 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/status/status.component.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/status/status.component.ts @@ -16,7 +16,7 @@ export class StatusComponent { PS = PrimaryStatus PR = PrimaryRendering - @Input() rendering!: StatusRendering + @Input({ required: true }) rendering!: StatusRendering @Input() size?: string @Input() style?: string = 'regular' @Input() weight?: string = 'normal' diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/ui-pipes/ui.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/ui-pipes/ui.module.ts deleted file mode 100644 index 24d4f0009..000000000 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/ui-pipes/ui.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NgModule } from '@angular/core' -import { UiPipe, UiAddressesPipe, AddressTypePipe } from './ui.pipe' - -@NgModule({ - declarations: [UiPipe, UiAddressesPipe, AddressTypePipe], - exports: [UiPipe, UiAddressesPipe, AddressTypePipe], -}) -export class UiPipesModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/ui-pipes/ui.pipe.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/ui-pipes/ui.pipe.ts deleted file mode 100644 index cce274115..000000000 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/ui-pipes/ui.pipe.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core' -import { InstalledPackageInfo } from 'src/app/services/patch-db/data-model' -import { hasUi } from 'src/app/services/config.service' - -@Pipe({ - name: 'hasUi', -}) -export class UiPipe implements PipeTransform { - transform(addressInfo: InstalledPackageInfo['address-info']): boolean { - return hasUi(addressInfo) - } -} - -@Pipe({ - name: 'uiAddresses', -}) -export class UiAddressesPipe implements PipeTransform { - transform( - addressInfo: InstalledPackageInfo['address-info'], - ): { name: string; addresses: string[] }[] { - return Object.values(addressInfo) - .filter(info => info.ui) - .map(info => ({ - name: info.name, - addresses: info.addresses, - })) - } -} - -@Pipe({ - name: 'addressType', -}) -export class AddressTypePipe implements PipeTransform { - transform(address: string): string { - if (isValidIpv4(address)) return 'IPv4' - if (isValidIpv6(address)) return 'IPv6' - - const hostname = new URL(address).hostname - if (hostname.endsWith('.onion')) return 'Tor' - if (hostname.endsWith('.local')) return 'Local' - - return 'Custom' - } -} - -function isValidIpv4(address: string): boolean { - const regexExp = - /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ - return regexExp.test(address) -} - -function isValidIpv6(address: string): boolean { - const regexExp = - /(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/gi - return regexExp.test(address) -} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts index 63ad3777e..2d93ab758 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts @@ -1,6 +1,8 @@ import { Config } from '@start9labs/start-sdk/lib/config/builder/config' import { Value } from '@start9labs/start-sdk/lib/config/builder/value' import { Variants } from '@start9labs/start-sdk/lib/config/builder/variants' +import { Proxy } from 'src/app/services/patch-db/data-model' +import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' const auth = Config.of({ username: Value.text({ @@ -14,89 +16,137 @@ const auth = Config.of({ }), }) -const strategyUnion = Value.union( - { - name: 'Networking Strategy', - required: { default: 'router' }, - }, - Variants.of({ - router: { - name: 'Router', - spec: Config.of({ - ip: Value.select({ - name: 'IP Strategy', - description: ` -
IPv6 Only
Pros: Ready for IPv6 Internet. Enhanced privacy, as IPv6 addresses are less correlated with geographic area -Cons: Your website is only accessible to people who's ISP supports IPv6 -
IPv6 and IPv4
Pros: Ready for IPv6 Internet. Anyone can access your website -Cons: IPv4 addresses are closely correlated with geographic areas -
IPv4 Only
Pros: Anyone can access your website -Cons: IPv4 addresses are closely correlated with geographic areas -`, - required: { default: 'ipv6' }, - values: { - ipv6: 'IPv6 Only', - both: 'IPv6 and IPv4', - ipv4: 'IPv4 Only', - }, - }), - }), - }, - reverseProxy: { - name: 'Reverse Proxy', - spec: Config.of({}), - }, - }), -) - -export const start9MeSpec = Config.of({ - strategy: strategyUnion, -}) +function getStrategyUnion(proxies: Proxy[]) { + const inboundProxies = proxies + .filter(p => p.type === 'inbound-outbound') + .reduce((prev, curr) => { + return { + [curr.id]: curr.name, + ...prev, + } + }, {}) -export const customSpec = Config.of({ - hostname: Value.text({ - name: 'Hostname', - required: { default: null }, - placeholder: 'yourdomain.com', - }), - provider: Value.union( + return Value.union( { - name: 'Dynamic DNS Provider', - required: { default: 'start9' }, + name: 'Networking Strategy', + required: { default: null }, + description: `
Local
Select this option if you do not mind exposing your home/business IP address to the Internet. This option requires configuring router settings, which StartOS can do automatically if you have an OpenWRT router +
Proxy
Select this option is you prefer to hide your home/business IP address from the Internet. This option requires running your own Virtual Private Server (VPS) or paying service provider such as Static Wire +`, }, Variants.of({ - start9: { - name: 'Start9', - spec: Config.of({}), - }, - duckdns: { - name: 'Duck DNS', - spec: auth, - }, - dyn: { - name: 'DynDNS', - spec: auth, - }, - easydns: { - name: 'easyDNS', - spec: auth, - }, - googledomains: { - name: 'Google Domains', - spec: auth, - }, - namecheap: { - name: 'Namecheap (IPv4 only)', - spec: auth, + local: { + name: 'Local', + spec: Config.of({ + ipStrategy: Value.select({ + name: 'IP Strategy', + description: `
IPv6 Only (recommended)
Requirements:
  1. ISP IPv6 support
  2. OpenWRT (recommended) or Linksys router
Pros: Ready for IPv6 Internet. Enhanced privacy. Run multiple clearnet servers from the same network +Cons: Interfaces using this domain will only be accessible to people whose ISP supports IPv6 +
IPv6 and IPv4
Pros: Ready for IPv6 Internet. Accessible by anyone +Cons: Less private, as IPv4 addresses are closely correlated with geographic areas. Cannot run multiple clearnet servers from the same network +
IPv4 Only
Pros: Accessible by anyone +Cons: Less private, as IPv4 addresses are closely correlated with geographic areas. Cannot run multiple clearnet servers from the same network +`, + required: { default: 'ipv6' }, + values: { + ipv6: 'IPv6 Only', + ipv4: 'IPv4 Only', + dualstack: 'IPv6 and IPv4', + }, + }), + }), }, - zoneedit: { - name: 'Zoneedit', - spec: auth, + proxy: { + name: 'Proxy', + spec: Config.of({ + proxyStrategy: Value.union( + { + name: 'Proxy Strategy', + required: { default: 'primary' }, + description: `
Primary
Use the Primary Inbound proxy from your proxy settings. If you do not have any inbound proxies, no proxy will be used +
Other
Use a specific proxy from your proxy settings +`, + }, + Variants.of({ + primary: { + name: 'Primary', + spec: Config.of({}), + }, + other: { + name: 'Specific', + spec: Config.of({ + proxyId: Value.select({ + name: 'Select Proxy', + required: { default: null }, + values: inboundProxies, + }), + }), + }, + }), + ), + }), }, }), - ), - strategy: strategyUnion, -}) + ) +} -export type Start9MeSpec = typeof start9MeSpec.validator._TYPE -export type CustomSpec = typeof customSpec.validator._TYPE +export async function getStart9ToSpec(proxies: Proxy[]) { + return configBuilderToSpec( + Config.of({ + strategy: getStrategyUnion(proxies), + }), + ) +} + +export async function getCustomSpec(proxies: Proxy[]) { + return configBuilderToSpec( + Config.of({ + hostname: Value.text({ + name: 'Hostname', + required: { default: null }, + placeholder: 'yourdomain.com', + }), + provider: Value.union( + { + name: 'Dynamic DNS Provider', + required: { default: 'start9' }, + }, + Variants.of({ + start9: { + name: 'Start9', + spec: Config.of({}), + }, + njalla: { + name: 'Njalla', + spec: auth, + }, + duckdns: { + name: 'Duck DNS', + spec: auth, + }, + dyn: { + name: 'DynDNS', + spec: auth, + }, + easydns: { + name: 'easyDNS', + spec: auth, + }, + zoneedit: { + name: 'Zoneedit', + spec: auth, + }, + googledomains: { + name: 'Google Domains (IPv4 or IPv6)', + spec: auth, + }, + namecheap: { + name: 'Namecheap (IPv4 only)', + spec: auth, + }, + }), + ), + strategy: getStrategyUnion(proxies), + }), + ) +} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html index 3bb2065bb..a14af00d1 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html @@ -10,21 +10,20 @@
- Adding domains to StartOS enables you to access your server and service - interfaces over clearnet. + Adding domains permits accessing your server and services over clearnet. View instructions
- Start9.me + Start9.to Claim @@ -35,26 +34,27 @@ Domain - Added + Added DDNS Provider - Network Strategy - IP Strategy - In Use - + Network Strategy + Used By + - {{ start9Me.value }} - {{ start9Me.createdAt| date: 'short' }} + {{ start9To.value }} + {{ start9To.createdAt| date: 'short' }} Start9 - {{ start9Me.networkStrategy }} - {{ start9Me.ipStrategy || 'N/A' }} - + + {{ $any(start9To.networkStrategy).ipStrategy || + $any(start9To.networkStrategy).proxyId || 'Primary Proxy' }} + + {{ qty }} Interfaces @@ -62,9 +62,9 @@ N/A - + - + @@ -90,22 +90,23 @@ Domain - Added + Added DDNS Provider - Network Strategy - IP Strategy - In Use - + Network Strategy + Used By + {{ domain.value }} - {{ domain.createdAt| date: 'short' }} + {{ domain.createdAt| date: 'short' }} {{ domain.provider }} - {{ domain.networkStrategy }} - {{ domain.ipStrategy || 'N/A' }} + + {{ $any(domain.networkStrategy).ipStrategy || + $any(domain.networkStrategy).proxyId || 'Primary Proxy' }} + N/A - + - combineLatest([this.server$, this.pkgs$]).pipe( - map(([{ ui, network }, packageData]) => { - const start9MeSubdomain = network.start9MeSubdomain - const start9Me = !start9MeSubdomain - ? null - : { - value: `${start9MeSubdomain.value}.start9.me`, - createdAt: start9MeSubdomain.createdAt, - provider: 'Start9', - networkStrategy: start9MeSubdomain.networkStrategy, - ipStrategy: start9MeSubdomain.ipStrategy, - usedBy: usedBy( - start9MeSubdomain.value, - getClearnetAddress('https', ui.domainInfo), - packageData, - ), - } - const custom = network.domains.map(domain => ({ - value: domain.value, - createdAt: domain.createdAt, - provider: domain.provider, - networkStrategy: domain.networkStrategy, - ipStrategy: domain.ipStrategy, - usedBy: usedBy( - domain.value, - getClearnetAddress('https', ui.domainInfo), - packageData, - ), - })) - - return { start9Me, custom } - }), - ), - ), + readonly domains$ = this.patch.watch$('server-info', 'network').pipe( + map(network => { + const start9ToSubdomain = network.start9ToSubdomain + const start9To = !start9ToSubdomain + ? null + : { + ...start9ToSubdomain, + value: `${start9ToSubdomain.value}.start9.to`, + provider: 'Start9', + } + + return { start9To, custom: network.domains } + }), ) constructor( @@ -73,16 +39,23 @@ export class DomainsPage { private readonly api: ApiService, private readonly loader: LoadingService, private readonly formDialog: FormDialogService, - private readonly connectionService: ConnectionService, private readonly patch: PatchDB, ) {} async presentModalAdd() { - const options: Partial>> = { + const proxies = await firstValueFrom( + this.patch.watch$('server-info', 'network', 'proxies'), + ) + + const options: Partial>> = { label: 'Custom Domain', data: { - spec: await customSpec.build({} as any), + spec: await getCustomSpec(proxies), buttons: [ + { + text: 'Manage proxies', + link: '/system/proxies', + }, { text: 'Save', handler: async value => this.save(value), @@ -93,15 +66,23 @@ export class DomainsPage { this.formDialog.open(FormPage, options) } - async presentModalClaimStart9Me() { - const options: Partial>> = { - label: 'start9.me', + async presentModalClaimStart9To() { + const proxies = await firstValueFrom( + this.patch.watch$('server-info', 'network', 'proxies'), + ) + + const options: Partial>> = { + label: 'start9.to', data: { - spec: await start9MeSpec.build({} as any), + spec: await getStart9ToSpec(proxies), buttons: [ + { + text: 'Manage proxies', + link: '/system/proxies', + }, { text: 'Save', - handler: async value => this.claimStart9MeDomain(value), + handler: async value => this.claimStart9ToDomain(value), }, ], }, @@ -124,26 +105,26 @@ export class DomainsPage { .subscribe(() => this.delete(hostname)) } - presentAlertDeleteStart9Me() { + presentAlertDeleteStart9To() { this.dialogs .open(TUI_PROMPT, { label: 'Confirm', size: 's', data: { - content: 'Delete start9.me domain?', + content: 'Delete start9.to domain?', yes: 'Delete', no: 'Cancel', }, }) .pipe(filter(Boolean)) - .subscribe(() => this.deleteStart9MeDomain()) + .subscribe(() => this.deleteStart9ToDomain()) } - presentAlertUsedBy(domain: string, usedBy: string[]) { + presentAlertUsedBy(domain: string, usedBy: Domain['usedBy']) { this.dialogs .open( - `${domain} is currently being used by:
    ${usedBy.map( - u => `
  • ${u}
  • `, + `${domain} is currently being used by:
      ${usedBy.map(u => + u.interfaces.map(i => `
    • ${u.service.title} - ${i.title}
    • `), )}
    `, { label: 'Used by', @@ -153,17 +134,23 @@ export class DomainsPage { .subscribe() } - private async claimStart9MeDomain(value: Start9MeSpec): Promise { + private async claimStart9ToDomain(value: any): Promise { const loader = this.loader.open('Saving...').subscribe() - const networkStrategy = value.strategy.unionSelectKey + const strategy = value.strategy.unionValueKey + + const networkStrategy = + value.strategy.unionSelectKey === 'local' + ? { ipStrategy: strategy.ipStrategy } + : { + proxyId: + strategy.proxyStrategy.unionSelectKey === 'primary' + ? null + : strategy.proxyStrategy.unionValueKey.proxyId, + } try { - await this.api.claimStart9MeDomain({ - networkStrategy, - ipStrategy: - networkStrategy === 'router' ? value.strategy.unionValueKey.ip : null, - }) + await this.api.claimStart9ToDomain({ networkStrategy }) return true } catch (e: any) { this.errorService.handleError(e) @@ -173,12 +160,23 @@ export class DomainsPage { } } - private async save(value: CustomSpec): Promise { + private async save(value: any): Promise { const loader = this.loader.open('Saving...').subscribe() - const networkStrategy = value.strategy.unionSelectKey const providerName = value.provider.unionSelectKey + const strategy = value.strategy.unionValueKey + + const networkStrategy = + value.strategy.unionSelectKey === 'local' + ? { ipStrategy: strategy.ipStrategy } + : { + proxyId: + strategy.proxyStrategy.unionSelectKey === 'primary' + ? null + : strategy.proxyStrategy.unionValueKey.proxyId, + } + try { await this.api.addDomain({ hostname: value.hostname, @@ -194,8 +192,6 @@ export class DomainsPage { : value.provider.unionValueKey.password, }, networkStrategy, - ipStrategy: - networkStrategy === 'router' ? value.strategy.unionValueKey.ip : null, }) return true } catch (e: any) { @@ -218,11 +214,11 @@ export class DomainsPage { } } - private async deleteStart9MeDomain(): Promise { + private async deleteStart9ToDomain(): Promise { const loader = this.loader.open('Deleting...').subscribe() try { - await this.api.deleteStart9MeDomain({}) + await this.api.deleteStart9ToDomain({}) } catch (e: any) { this.errorService.handleError(e) } finally { @@ -230,21 +226,3 @@ export class DomainsPage { } } } - -function usedBy( - domain: string, - serverUi: string | null, - pkgs: DataModel['package-data'], -): string[] { - const list = [] - if (serverUi && serverUi.includes(domain)) list.push('StartOS Web Interface') - return list.concat( - Object.values(pkgs) - .filter(pkg => - Object.values(pkg.installed?.['address-info'] || {}).some(ai => - ai.addresses.some(a => a.includes(domain)), - ), - ) - .map(pkg => pkg.manifest.title), - ) -} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.module.ts deleted file mode 100644 index 5eb444af1..000000000 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.module.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { Routes, RouterModule } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { OSAddressesPage, OsClearnetPipe } from './os-addresses.page' - -const routes: Routes = [ - { - path: '', - component: OSAddressesPage, - }, -] - -@NgModule({ - imports: [CommonModule, IonicModule, RouterModule.forChild(routes)], - declarations: [OSAddressesPage, OsClearnetPipe], -}) -export class OSAddressesPageModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.page.html b/frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.page.html deleted file mode 100644 index 1f24cbd57..000000000 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.page.html +++ /dev/null @@ -1,228 +0,0 @@ - - - - - - StartOS Web Interface - - - - -
    - - Clearnet - - - -

    - Clearnet provides a fast and convenient experience. It not not - provide anonymity, and the addresses can be discovered and accessed - by anyone. - - View instructions - -

    - - - - - -

    Clearnet

    -

    {{ clearnetAddress }}

    -
    - - Update - - - Remove - -
    -
    -
    - - - - - - -
    -
    -
    - -
    - - - Add Clearnet Address - -
    -
    - - - - Tor - - - -

    - Tor offers privacy and anonymity at the expense of speed and - reliability. A Tor-enabled browser is required to use a Tor address. - - View instructions - -

    -
    -
    - - -

    Tor

    -

    {{ torHostname }}

    -
    -
    - - - - - - -
    -
    -
    - - - LAN - - - -

    - LAN offers a fast and private experience. These addresses can only - be accessed from a device connected to the same LAN as your server, - either directly or using a VPN. - - View instructions - -

    -
    - - - Download Root CA - -
    -
    -
    - - -

    Local

    -

    {{ lanHostname }}

    -
    -
    - - - - - - -
    -
    - - - -

    {{ iface.key }} (IPv4)

    -

    {{ ipv4 }}

    -
    -
    - - - - - - -
    -
    - - -

    {{ iface.key }} (IPv6)

    -

    {{ ipv6 }}

    -
    -
    - - - - - - -
    -
    -
    -
    -
    - - - - diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.module.ts new file mode 100644 index 000000000..fe6410830 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.module.ts @@ -0,0 +1,42 @@ +import { CommonModule } from '@angular/common' +import { NgModule } from '@angular/core' +import { FormsModule } from '@angular/forms' +import { RouterModule, Routes } from '@angular/router' +import { IonicModule } from '@ionic/angular' +import { + TuiButtonModule, + TuiDataListModule, + TuiHostedDropdownModule, + TuiNotificationModule, + TuiSvgModule, + TuiWrapperModule, +} from '@taiga-ui/core' +import { TuiBadgeModule, TuiInputModule, TuiToggleModule } from '@taiga-ui/kit' +import { ProxiesPage } from './proxies.page' + +const routes: Routes = [ + { + path: '', + component: ProxiesPage, + }, +] + +@NgModule({ + imports: [ + CommonModule, + IonicModule, + RouterModule.forChild(routes), + FormsModule, + TuiNotificationModule, + TuiButtonModule, + TuiInputModule, + TuiToggleModule, + TuiWrapperModule, + TuiBadgeModule, + TuiSvgModule, + TuiHostedDropdownModule, + TuiDataListModule, + ], + declarations: [ProxiesPage], +}) +export class ProxiesPageModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html b/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html new file mode 100644 index 000000000..133765a87 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html @@ -0,0 +1,144 @@ + + + + + + Proxies + + + + +
    + + Currently, StartOS only supports Wireguard proxies, which can be used for: +
      +
    1. + Proxying + outbound + traffic to mask your home/business IP from other servers accessed by + your server/services +
    2. +
    3. + Proxying + inbound + traffic to mask your home/business IP from anyone accessing your + server/services over clearnet +
    4. +
    5. + Creating a Virtual Local Area Network (VLAN) to enable private, remote + VPN access to your server/services +
    6. +
    + View instructions +
    +
    + + + + Proxies + + + Add Proxy + + + +
    + + + Name + Created + Type + Primary + Used By + + + + {{ proxy.name }} + {{ proxy.createdAt| date: 'short' }} + {{ proxy.type }} + + + + + + + {{ usedBy.domains.length + usedBy.services.length }} Connections + + + N/A + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.scss b/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.scss new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.ts new file mode 100644 index 000000000..6ba862396 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.ts @@ -0,0 +1,180 @@ +import { Component, ViewChild } from '@angular/core' +import { + TuiDialogOptions, + TuiDialogService, + TuiHostedDropdownComponent, +} from '@taiga-ui/core' +import { TUI_PROMPT } from '@taiga-ui/kit' +import { filter } from 'rxjs' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { PatchDB } from 'patch-db-client' +import { DataModel, Proxy } from 'src/app/services/patch-db/data-model' +import { FormContext, FormPage } from '../../../modals/form/form.page' +import { FormDialogService } from 'src/app/services/form-dialog.service' +import { Config } from '@start9labs/start-sdk/lib/config/builder/config' +import { Value } from '@start9labs/start-sdk/lib/config/builder/value' + +@Component({ + selector: 'proxies', + templateUrl: './proxies.page.html', + styleUrls: ['./proxies.page.scss'], +}) +export class ProxiesPage { + @ViewChild(TuiHostedDropdownComponent) + menuComponent?: TuiHostedDropdownComponent + + menuOpen = false + + readonly docsUrl = 'https://docs.start9.com/latest/user-manual/vpns/' + + readonly proxies$ = this.patch.watch$('server-info', 'network', 'proxies') + + constructor( + private readonly dialogs: TuiDialogService, + private readonly loader: LoadingService, + private readonly errorService: ErrorService, + private readonly api: ApiService, + private readonly patch: PatchDB, + private readonly formDialog: FormDialogService, + ) {} + + async presentModalAdd() { + const options: Partial>> = { + label: 'Add Proxy', + data: { + spec: await wireguardSpec.build({} as any), + buttons: [ + { + text: 'Save', + handler: value => this.save(value).then(() => true), + }, + ], + }, + } + this.formDialog.open(FormPage, options) + } + + async presentModalRename(proxy: Proxy) { + const options: Partial>> = { + label: `Rename ${proxy.name}`, + data: { + spec: { + name: await Value.text({ + name: 'Name', + required: { default: proxy.name }, + }).build({} as any), + }, + buttons: [ + { + text: 'Save', + handler: value => this.update(value).then(() => true), + }, + ], + }, + } + this.formDialog.open(FormPage, options) + } + + presentAlertDelete(id: string) { + this.dialogs + .open(TUI_PROMPT, { + label: 'Confirm', + size: 's', + data: { + content: 'Delete proxy? This action cannot be undone.', + yes: 'Delete', + no: 'Cancel', + }, + }) + .pipe(filter(Boolean)) + .subscribe(() => { + this.delete(id) + }) + } + + presentAlertUsedBy(name: string, usedBy: Proxy['usedBy']) { + let message = `Proxy "${name}" is currently used by:` + if (usedBy.domains.length) { + message = `${message}

    Domains (inbound)

      ${usedBy.domains.map( + d => `
    • ${d}
    • `, + )}
    ` + } + if (usedBy.services.length) { + message = `${message}

    Services (outbound)

    ${usedBy.services.map( + s => `
  • ${s.title}
  • `, + )}` + } + + this.dialogs + .open(message, { + label: 'Used by', + size: 's', + }) + .subscribe() + } + + private async save(value: WireguardSpec): Promise { + const loader = this.loader.open('Saving...').subscribe() + + try { + await this.api.addProxy({ + name: value.name, + config: value.config?.filePath || '', + }) + return true + } catch (e: any) { + this.errorService.handleError(e) + return false + } finally { + loader.unsubscribe() + } + } + + async update( + value: Partial<{ + name: string + primaryInbound: true + primaryOutbound: true + }>, + ): Promise { + const loader = this.loader.open('Saving...').subscribe() + + try { + await this.api.updateProxy(value) + return true + } catch (e: any) { + this.errorService.handleError(e) + return false + } finally { + loader.unsubscribe() + } + } + + private async delete(id: string): Promise { + const loader = this.loader.open('Deleting...').subscribe() + + try { + await this.api.deleteProxy({ id }) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } +} + +const wireguardSpec = Config.of({ + name: Value.text({ + name: 'Name', + description: 'A friendly name to help you remember and identify this proxy', + required: { default: null }, + }), + config: Value.file({ + name: 'Wiregaurd Config', + required: { default: null }, + extensions: ['.conf'], + }), +}) + +type WireguardSpec = typeof wireguardSpec.validator._TYPE diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/router/router.module.ts similarity index 75% rename from frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.module.ts rename to frontend/projects/ui/src/app/apps/ui/pages/system/router/router.module.ts index b81c53fc3..1f745495b 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/router/router.module.ts @@ -2,14 +2,14 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { Routes, RouterModule } from '@angular/router' import { IonicModule } from '@ionic/angular' -import { PortForwardsPage } from './port-forwards.page' +import { RouterPage } from './router.page' import { PrimaryIpPipeModule } from 'src/app/common/primary-ip/primary-ip.module' import { FormsModule } from '@angular/forms' const routes: Routes = [ { path: '', - component: PortForwardsPage, + component: RouterPage, }, ] @@ -21,6 +21,6 @@ const routes: Routes = [ PrimaryIpPipeModule, FormsModule, ], - declarations: [PortForwardsPage], + declarations: [RouterPage], }) -export class PortForwardsPageModule {} +export class RouterPageModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.page.html b/frontend/projects/ui/src/app/apps/ui/pages/system/router/router.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.page.html rename to frontend/projects/ui/src/app/apps/ui/pages/system/router/router.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.page.scss b/frontend/projects/ui/src/app/apps/ui/pages/system/router/router.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.page.scss rename to frontend/projects/ui/src/app/apps/ui/pages/system/router/router.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/router/router.page.ts similarity index 89% rename from frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.page.ts rename to frontend/projects/ui/src/app/apps/ui/pages/system/router/router.page.ts index fcb977bba..c02027ab1 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/port-forwards/port-forwards.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/router/router.page.ts @@ -5,12 +5,12 @@ import { LoadingService, CopyService, ErrorService } from '@start9labs/shared' import { ApiService } from 'src/app/services/api/embassy-api.service' @Component({ - selector: 'port-forwards', - templateUrl: './port-forwards.page.html', - styleUrls: ['./port-forwards.page.scss'], + selector: 'router', + templateUrl: './router.page.html', + styleUrls: ['./router.page.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class PortForwardsPage { +export class RouterPage { readonly server$ = this.patch.watch$('server-info') editing: Record = {} overrides: Record = {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.html b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.html index 9c9dc22fb..9c8f86dd9 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.html @@ -66,6 +66,16 @@

    {{ button.title }}

    + +

    + + {{ !server.network.outboundProxy ? 'None' : + server.network.outboundProxy === 'primary' ? 'System Primary' : + server.network.outboundProxy.proxyId }} + +

    diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.ts index feeedb260..350078449 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.ts @@ -24,6 +24,7 @@ import { TUI_PROMPT } from '@taiga-ui/kit' import { DOCUMENT } from '@angular/common' import { getServerInfo } from 'src/app/util/get-server-info' import * as argon2 from '@start9labs/argon2' +import { ProxyService } from 'src/app/services/proxy.service' @Component({ selector: 'server-show', @@ -46,7 +47,7 @@ export class ServerShowPage { private readonly dialogs: TuiDialogService, private readonly loader: LoadingService, private readonly errorService: ErrorService, - private readonly embassyApi: ApiService, + private readonly api: ApiService, private readonly navCtrl: NavController, private readonly route: ActivatedRoute, private readonly patch: PatchDB, @@ -56,6 +57,7 @@ export class ServerShowPage { private readonly alerts: TuiAlertService, private readonly config: ConfigService, private readonly formDialog: FormDialogService, + private readonly proxyService: ProxyService, @Inject(DOCUMENT) private readonly document: Document, ) {} @@ -156,7 +158,7 @@ export class ServerShowPage { const loader = this.loader.open('Saving...').subscribe() try { - await this.embassyApi.resetPassword({ + await this.api.resetPassword({ 'old-password': value.currentPassword, 'new-password': value.newPassword1, }) @@ -256,7 +258,7 @@ export class ServerShowPage { const loader = this.loader.open('Saving...').subscribe() try { - await this.embassyApi.setDbValue(['name'], value) + await this.api.setDbValue(['name'], value) } finally { loader.unsubscribe() } @@ -264,7 +266,7 @@ export class ServerShowPage { // should wipe cache independent of actual BE logout private logout() { - this.embassyApi.logout({}).catch(e => console.error('Failed to log out', e)) + this.api.logout({}).catch(e => console.error('Failed to log out', e)) this.authService.setUnverified() } @@ -273,7 +275,7 @@ export class ServerShowPage { const loader = this.loader.open(`Beginning ${action}...`).subscribe() try { - await this.embassyApi.restartServer({}) + await this.api.restartServer({}) this.presentAlertInProgress(action, ` until ${action} completes.`) } catch (e: any) { this.errorService.handleError(e) @@ -287,7 +289,7 @@ export class ServerShowPage { const loader = this.loader.open(`Beginning ${action}...`).subscribe() try { - await this.embassyApi.shutdownServer({}) + await this.api.shutdownServer({}) this.presentAlertInProgress( action, '.

    You will need to physically power cycle the device to regain connectivity.', @@ -304,7 +306,7 @@ export class ServerShowPage { const loader = this.loader.open(`Beginning ${action}...`).subscribe() try { - await this.embassyApi.systemRebuild({}) + await this.api.systemRebuild({}) this.presentAlertInProgress(action, ` until ${action} completes.`) } catch (e: any) { this.errorService.handleError(e) @@ -375,14 +377,6 @@ export class ServerShowPage { detail: false, disabled$: this.eosService.updatingOrBackingUp$, }, - { - title: 'Browser Tab Title', - description: `Customize the display name of your browser tab`, - icon: 'pricetag-outline', - action: () => this.setBrowserTab(), - detail: false, - disabled$: of(false), - }, { title: 'Email', description: @@ -426,33 +420,29 @@ export class ServerShowPage { ], Network: [ { - title: 'StartOS Web Interface', - description: 'Addresses for accessing this StartOS web interface', - icon: 'desktop-outline', + title: 'Domains', + description: 'Manage domains for clearnet connectivity', + icon: 'globe-outline', action: () => - this.navCtrl.navigateForward(['addresses'], { - relativeTo: this.route, - }), + this.navCtrl.navigateForward(['domains'], { relativeTo: this.route }), detail: true, disabled$: of(false), }, { - title: 'Domains', - description: - 'Add domains to your server to enable clearnet connections', - icon: 'globe-outline', + title: 'Proxies', + description: 'Manage proxies for inbound and outbound connections', + icon: 'shuffle-outline', action: () => - this.navCtrl.navigateForward(['domains'], { relativeTo: this.route }), + this.navCtrl.navigateForward(['proxies'], { relativeTo: this.route }), detail: true, disabled$: of(false), }, { - title: 'Port Forwards', - description: - 'A list of ports that should be forwarded through your router', - icon: 'trail-sign-outline', + title: 'Router Config', + description: 'Connect or configure your router for clearnet', + icon: 'radio-outline', action: () => - this.navCtrl.navigateForward(['port-forwards'], { + this.navCtrl.navigateForward(['router-config'], { relativeTo: this.route, }), detail: true, @@ -468,7 +458,36 @@ export class ServerShowPage { disabled$: of(false), }, ], - Security: [ + 'User Interface': [ + { + title: 'Browser Tab Title', + description: `Customize the display name of your browser tab`, + icon: 'pricetag-outline', + action: () => this.setBrowserTab(), + detail: false, + disabled$: of(false), + }, + { + title: 'Web Addresses', + description: 'View and manage web addresses for accessing this UI', + icon: 'desktop-outline', + action: () => + this.navCtrl.navigateForward(['interfaces', 'ui'], { + relativeTo: this.route, + }), + detail: true, + disabled$: of(false), + }, + ], + 'Privacy and Security': [ + { + title: 'Outbound Proxy', + description: 'Proxy outbound traffic from the StartOS main process', + icon: 'shield-outline', + action: () => this.proxyService.presentModalSetOutboundProxy(), + detail: false, + disabled$: of(false), + }, { title: 'SSH', description: @@ -493,7 +512,7 @@ export class ServerShowPage { ], Logs: [ { - title: 'System Resources', + title: 'Activity Monitor', description: 'CPU, disk, memory, and other useful metrics', icon: 'pulse', action: () => diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/system.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/system.module.ts index 77bb24b69..b7096753f 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/system.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/system.module.ts @@ -10,18 +10,14 @@ const routes: Routes = [ ), }, { - path: 'addresses', + path: 'interfaces/ui', loadChildren: () => - import('./os-addresses/os-addresses.module').then( - m => m.OSAddressesPageModule, - ), + import('./ui-details/ui-details.module').then(m => m.UIDetailsPageModule), }, { - path: 'port-forwards', + path: 'router-config', loadChildren: () => - import('./port-forwards/port-forwards.module').then( - m => m.PortForwardsPageModule, - ), + import('./router/router.module').then(m => m.RouterPageModule), }, { path: 'logs', @@ -71,6 +67,11 @@ const routes: Routes = [ loadChildren: () => import('./domains/domains.module').then(m => m.DomainsPageModule), }, + { + path: 'proxies', + loadChildren: () => + import('./proxies/proxies.module').then(m => m.ProxiesPageModule), + }, { path: 'ssh', loadChildren: () => diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.module.ts new file mode 100644 index 000000000..c347dd42b --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.module.ts @@ -0,0 +1,24 @@ +import { NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' +import { Routes, RouterModule } from '@angular/router' +import { IonicModule } from '@ionic/angular' +import { UIDetailsPage } from './ui-details.page' +import { InterfaceAddressesComponentModule } from 'src/app/common/interface-addresses/interface-addresses.module' + +const routes: Routes = [ + { + path: '', + component: UIDetailsPage, + }, +] + +@NgModule({ + imports: [ + CommonModule, + IonicModule, + RouterModule.forChild(routes), + InterfaceAddressesComponentModule, + ], + declarations: [UIDetailsPage], +}) +export class UIDetailsPageModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.html b/frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.html new file mode 100644 index 000000000..0b7f18ccb --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.html @@ -0,0 +1,14 @@ + + + + + + StartOS UI + + + + +
    + +
    +
    diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.scss b/frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.scss new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.ts new file mode 100644 index 000000000..51c1297a6 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.ts @@ -0,0 +1,15 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core' +import { PatchDB } from 'patch-db-client' +import { DataModel } from 'src/app/services/patch-db/data-model' + +@Component({ + selector: 'ui-details', + templateUrl: './ui-details.page.html', + styleUrls: ['./ui-details.page.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class UIDetailsPage { + readonly ui$ = this.patch.watch$('server-info', 'ui') + + constructor(private readonly patch: PatchDB) {} +} diff --git a/frontend/projects/ui/src/app/common/form/form-array/form-array.component.ts b/frontend/projects/ui/src/app/common/form/form-array/form-array.component.ts index f65f55d24..40f441a63 100644 --- a/frontend/projects/ui/src/app/common/form/form-array/form-array.component.ts +++ b/frontend/projects/ui/src/app/common/form/form-array/form-array.component.ts @@ -21,7 +21,7 @@ import { ERRORS } from '../form-group/form-group.component' providers: [TuiDestroyService], }) export class FormArrayComponent { - @Input() + @Input({ required: true }) spec!: ValueSpecList @HostBinding('@tuiParentStop') diff --git a/frontend/projects/ui/src/app/common/form/form-control/form-control.component.ts b/frontend/projects/ui/src/app/common/form/form-control/form-control.component.ts index 413a52f2a..1396822f5 100644 --- a/frontend/projects/ui/src/app/common/form/form-control/form-control.component.ts +++ b/frontend/projects/ui/src/app/common/form/form-control/form-control.component.ts @@ -28,7 +28,7 @@ export class FormControlComponent< T extends ValueSpec, V, > extends AbstractTuiNullableControl { - @Input() + @Input({ required: true }) spec!: T @ViewChild('warning') diff --git a/frontend/projects/ui/src/app/common/form/form-object/form-object.component.ts b/frontend/projects/ui/src/app/common/form/form-object/form-object.component.ts index cb8a5c9e9..459fc01c5 100644 --- a/frontend/projects/ui/src/app/common/form/form-object/form-object.component.ts +++ b/frontend/projects/ui/src/app/common/form/form-object/form-object.component.ts @@ -16,7 +16,7 @@ import { ValueSpecObject } from '@start9labs/start-sdk/lib/config/configTypes' changeDetection: ChangeDetectionStrategy.OnPush, }) export class FormObjectComponent { - @Input() + @Input({ required: true }) spec!: ValueSpecObject @Input() diff --git a/frontend/projects/ui/src/app/common/form/form-union/form-union.component.ts b/frontend/projects/ui/src/app/common/form/form-union/form-union.component.ts index 6e8251df8..f438fab87 100644 --- a/frontend/projects/ui/src/app/common/form/form-union/form-union.component.ts +++ b/frontend/projects/ui/src/app/common/form/form-union/form-union.component.ts @@ -28,7 +28,7 @@ import { tuiPure } from '@taiga-ui/cdk' ], }) export class FormUnionComponent implements OnChanges { - @Input() + @Input({ required: true }) spec!: ValueSpecUnion selectSpec!: ValueSpecSelect diff --git a/frontend/projects/ui/src/app/common/interface-addresses/interface-addresses-item.component.html b/frontend/projects/ui/src/app/common/interface-addresses/interface-addresses-item.component.html new file mode 100644 index 000000000..3b5669a64 --- /dev/null +++ b/frontend/projects/ui/src/app/common/interface-addresses/interface-addresses-item.component.html @@ -0,0 +1,18 @@ + + +

    {{ label }}

    +

    {{ hostname }}

    + +
    +
    + + + + + + + + + +
    +
    diff --git a/frontend/projects/ui/src/app/common/interface-addresses/interface-addresses.component.html b/frontend/projects/ui/src/app/common/interface-addresses/interface-addresses.component.html new file mode 100644 index 000000000..74a32d577 --- /dev/null +++ b/frontend/projects/ui/src/app/common/interface-addresses/interface-addresses.component.html @@ -0,0 +1,125 @@ + + + Clearnet + + + +

    + Add clearnet to expose this interface to the public Internet. + + View instructions + +

    +
    +
    + + +
    + + Update + + + Remove + +
    +
    +
    + +
    + + + Add Clearnet + +
    +
    +
    + + + Tor + + + +

    + Use a Tor-enabled browser to access this address. Tor connections can + be slow and unreliable. + + View instructions + +

    +
    +
    + +
    + + + Local + + + +

    + Local addresses can only be accessed while connected to the same Local + Area Network (LAN) as your server, either directly or using a VPN. + + View instructions + +

    +
    + + + Download Root CA + +
    +
    +
    + + + + + +
    + + + +
    diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.page.scss b/frontend/projects/ui/src/app/common/interface-addresses/interface-addresses.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.page.scss rename to frontend/projects/ui/src/app/common/interface-addresses/interface-addresses.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.page.ts b/frontend/projects/ui/src/app/common/interface-addresses/interface-addresses.component.ts similarity index 53% rename from frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.page.ts rename to frontend/projects/ui/src/app/common/interface-addresses/interface-addresses.component.ts index 36c5c16b3..623bd1d50 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/os-addresses/os-addresses.page.ts +++ b/frontend/projects/ui/src/app/common/interface-addresses/interface-addresses.component.ts @@ -1,25 +1,32 @@ -import { ChangeDetectionStrategy, Component, Inject } from '@angular/core' +import { + ChangeDetectionStrategy, + Component, + Inject, + Input, +} from '@angular/core' import { LoadingService, CopyService, ErrorService } from '@start9labs/shared' import { Config } from '@start9labs/start-sdk/lib/config/builder/config' import { Value } from '@start9labs/start-sdk/lib/config/builder/value' import { InputSpec } from '@start9labs/start-sdk/lib/config/configTypes' import { TuiDialogOptions, TuiDialogService } from '@taiga-ui/core' -import { PatchDB } from 'patch-db-client' -import { filter, map } from 'rxjs' +import { filter } from 'rxjs' import { - DomainInfo, + AddressInfo, DataModel, + DomainInfo, NetworkInfo, - ServerInfo, } from 'src/app/services/patch-db/data-model' import { FormDialogService } from 'src/app/services/form-dialog.service' import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' import { ApiService } from 'src/app/services/api/embassy-api.service' -import { FormContext, FormPage } from '../../../modals/form/form.page' import { TUI_PROMPT } from '@taiga-ui/kit' -import { DOCUMENT } from '@angular/common' import { Pipe, PipeTransform } from '@angular/core' import { getClearnetAddress } from 'src/app/util/clearnetAddress' +import { DOCUMENT } from '@angular/common' +import { FormContext, FormPage } from 'src/app/apps/ui/modals/form/form.page' +import { PatchDB } from 'patch-db-client' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' +import { QRComponent } from 'src/app/common/qr/qr.component' export type ClearnetForm = { domain: string @@ -27,39 +34,37 @@ export type ClearnetForm = { } @Component({ - selector: 'os-addresses', - templateUrl: './os-addresses.page.html', - styleUrls: ['./os-addresses.page.scss'], + selector: 'interface-addresses', + templateUrl: './interface-addresses.component.html', + styleUrls: ['./interface-addresses.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class OSAddressesPage { - readonly server$ = this.patch.watch$('server-info') +export class InterfaceAddressesComponent { + @Input() packageContext?: { + packageId: string + interfaceId: string + } + @Input({ required: true }) addressInfo!: AddressInfo + @Input({ required: true }) isUi!: boolean - readonly crtName$ = this.server$.pipe( - map(server => `${server.ui.lanHostname}.crt`), - ) + readonly network$ = this.patch.watch$('server-info', 'network') constructor( - readonly copyService: CopyService, private readonly loader: LoadingService, private readonly formDialog: FormDialogService, - private readonly patch: PatchDB, private readonly errorService: ErrorService, private readonly api: ApiService, private readonly dialogs: TuiDialogService, + private readonly patch: PatchDB, @Inject(DOCUMENT) private readonly document: Document, ) {} - launch(url: string): void { - this.document.defaultView?.open(url, '_blank', 'noreferrer') - } - installCert(): void { this.document.getElementById('install-cert')?.click() } - async presentModalAddClearnet(server: ServerInfo) { - const domainInfo = server.ui.domainInfo + async presentModalAddClearnet(networkInfo: NetworkInfo) { + const domainInfo = this.addressInfo.domainInfo const options: Partial>> = { label: 'Select Domain/Subdomain', data: { @@ -67,7 +72,7 @@ export class OSAddressesPage { domain: domainInfo?.domain || '', subdomain: domainInfo?.subdomain || '', }, - spec: await this.getClearnetSpec(server.network), + spec: await getClearnetSpec(networkInfo), buttons: [ { text: 'Manage domains', @@ -102,7 +107,14 @@ export class OSAddressesPage { const loader = this.loader.open('Saving...').subscribe() try { - await this.api.setServerClearnetAddress({ domainInfo }) + if (this.packageContext) { + await this.api.setInterfaceClearnetAddress({ + ...this.packageContext, + domainInfo, + }) + } else { + await this.api.setServerClearnetAddress({ domainInfo }) + } return true } catch (e: any) { this.errorService.handleError(e) @@ -116,52 +128,86 @@ export class OSAddressesPage { const loader = this.loader.open('Removing...').subscribe() try { - await this.api.setServerClearnetAddress({ domainInfo: null }) + if (this.packageContext) { + await this.api.setInterfaceClearnetAddress({ + ...this.packageContext, + domainInfo: null, + }) + } else { + await this.api.setServerClearnetAddress({ domainInfo: null }) + } } catch (e: any) { this.errorService.handleError(e) } finally { loader.unsubscribe() } } +} - private async getClearnetSpec({ - domains, - start9MeSubdomain, - }: NetworkInfo): Promise { - const start9MeDomain = `${start9MeSubdomain?.value}.start9.me` - const base = start9MeSubdomain ? { [start9MeDomain]: start9MeDomain } : {} - - return configBuilderToSpec( - Config.of({ - domain: Value.dynamicSelect(() => { - return { - name: 'Domain', - required: { default: null }, - values: domains.reduce((prev, curr) => { - return { - [curr.value]: curr.value, - ...prev, - } - }, base), - } - }), - subdomain: Value.text({ - name: 'Subdomain', - required: false, - }), +function getClearnetSpec({ + domains, + start9ToSubdomain, +}: NetworkInfo): Promise { + const start9ToDomain = `${start9ToSubdomain?.value}.start9.to` + const base = start9ToSubdomain ? { [start9ToDomain]: start9ToDomain } : {} + + const values = domains.reduce((prev, curr) => { + return { + [curr.value]: curr.value, + ...prev, + } + }, base) + + return configBuilderToSpec( + Config.of({ + domain: Value.select({ + name: 'Domain', + required: { default: null }, + values, }), - ) + subdomain: Value.text({ + name: 'Subdomain', + required: false, + }), + }), + ) +} + +@Component({ + selector: 'interface-addresses-item', + templateUrl: './interface-addresses-item.component.html', + styleUrls: ['./interface-addresses.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class InterfaceAddressItemComponent { + @Input({ required: true }) label!: string + @Input({ required: true }) hostname!: string + @Input({ required: true }) isUi!: boolean + + constructor( + readonly copyService: CopyService, + private readonly dialogs: TuiDialogService, + @Inject(DOCUMENT) private readonly document: Document, + ) {} + + launch(url: string): void { + this.document.defaultView?.open(url, '_blank', 'noreferrer') } - asIsOrder(a: any, b: any) { - return 0 + showQR(data: string) { + this.dialogs + .open(new PolymorpheusComponent(QRComponent), { + size: 'auto', + data, + }) + .subscribe() } } @Pipe({ - name: 'osClearnetPipe', + name: 'interfaceClearnetPipe', }) -export class OsClearnetPipe implements PipeTransform { +export class InterfaceClearnetPipe implements PipeTransform { transform(clearnet: DomainInfo): string { return getClearnetAddress('https', clearnet) } diff --git a/frontend/projects/ui/src/app/common/interface-addresses/interface-addresses.module.ts b/frontend/projects/ui/src/app/common/interface-addresses/interface-addresses.module.ts new file mode 100644 index 000000000..5ca092095 --- /dev/null +++ b/frontend/projects/ui/src/app/common/interface-addresses/interface-addresses.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' +import { IonicModule } from '@ionic/angular' +import { + InterfaceAddressesComponent, + InterfaceAddressItemComponent, + InterfaceClearnetPipe, +} from './interface-addresses.component' + +@NgModule({ + imports: [CommonModule, IonicModule], + declarations: [ + InterfaceAddressesComponent, + InterfaceAddressItemComponent, + InterfaceClearnetPipe, + ], + exports: [InterfaceAddressesComponent], +}) +export class InterfaceAddressesComponentModule {} diff --git a/frontend/projects/ui/src/app/common/logs/logs.component.ts b/frontend/projects/ui/src/app/common/logs/logs.component.ts index 75aa90b48..195767962 100644 --- a/frontend/projects/ui/src/app/common/logs/logs.component.ts +++ b/frontend/projects/ui/src/app/common/logs/logs.component.ts @@ -46,13 +46,15 @@ export class LogsComponent { @ViewChild(IonContent) private content?: IonContent - @Input() followLogs!: ( + @Input({ required: true }) followLogs!: ( params: RR.FollowServerLogsReq, ) => Promise - @Input() fetchLogs!: (params: ServerLogsReq) => Promise - @Input() context!: string - @Input() defaultBack!: string - @Input() pageTitle!: string + @Input({ required: true }) fetchLogs!: ( + params: ServerLogsReq, + ) => Promise + @Input({ required: true }) context!: string + @Input({ required: true }) defaultBack!: string + @Input({ required: true }) pageTitle!: string loading = true infiniteStatus: 0 | 1 | 2 = 0 diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/qr.component.ts b/frontend/projects/ui/src/app/common/qr/qr.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-interfaces/qr.component.ts rename to frontend/projects/ui/src/app/common/qr/qr.component.ts diff --git a/frontend/projects/ui/src/app/common/qr/qr.module.ts b/frontend/projects/ui/src/app/common/qr/qr.module.ts new file mode 100644 index 000000000..aa5086b28 --- /dev/null +++ b/frontend/projects/ui/src/app/common/qr/qr.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' +import { QrCodeModule } from 'ng-qrcode' + +import { QRComponent } from './qr.component' + +@NgModule({ + declarations: [QRComponent], + imports: [CommonModule, QrCodeModule], + exports: [QRComponent], +}) +export class QRComponentModule {} diff --git a/frontend/projects/ui/src/app/common/widget-list/any-link/any-link.component.ts b/frontend/projects/ui/src/app/common/widget-list/any-link/any-link.component.ts index 40a602f17..0e8d6f67d 100644 --- a/frontend/projects/ui/src/app/common/widget-list/any-link/any-link.component.ts +++ b/frontend/projects/ui/src/app/common/widget-list/any-link/any-link.component.ts @@ -12,7 +12,7 @@ import { changeDetection: ChangeDetectionStrategy.OnPush, }) export class AnyLinkComponent implements OnInit { - @Input() link!: string + @Input({ required: true }) link!: string @Input() qp?: Record externalLink = false diff --git a/frontend/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.ts b/frontend/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.ts index 61626fcb2..5b1ba93e9 100644 --- a/frontend/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.ts +++ b/frontend/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.ts @@ -14,8 +14,8 @@ import { changeDetection: ChangeDetectionStrategy.OnPush, }) export class WidgetCardComponent { - @Input() cardDetails!: Card - @Input() containerDimensions!: Dimension + @Input({ required: true }) cardDetails!: Card + @Input({ required: true }) containerDimensions!: Dimension @ViewChild('outerWrapper') outerWrapper: ElementRef = {} as ElementRef @ViewChild('innerWrapper') innerWrapper: ElementRef = diff --git a/frontend/projects/ui/src/app/services/api/api.fixures.ts b/frontend/projects/ui/src/app/services/api/api.fixures.ts index 387b149b9..916a0ede4 100644 --- a/frontend/projects/ui/src/app/services/api/api.fixures.ts +++ b/frontend/projects/ui/src/app/services/api/api.fixures.ts @@ -1260,25 +1260,40 @@ export module Mock { }, 'dependency-errors': {}, }, - 'address-info': { + interfaceInfo: { rpc: { name: 'Bitcoin RPC', description: `Bitcoin's RPC interface`, - addresses: [ - 'http://bitcoind-rpc-address.onion', - 'https://bitcoind-rpc-address.local', - 'https://192.168.1.1:8332', - ], - ui: true, + addressInfo: { + ipInfo: { + eth0: { + wireless: false, + ipv4: '192.168.1.1:8333', + ipv6: 'FE80:CD00:0000:0CDE:1257:0000:211E:729CD:8333', + }, + }, + lanHostname: 'adjective-noun:8333', + torHostname: 'bitcoind-rpc-address.onion', + domainInfo: null, + }, + type: 'ui', }, p2p: { name: 'Bitcoin P2P', description: `Bitcoin's P2P interface`, - addresses: [ - 'bitcoin://bitcoind-rpc-address.onion', - 'bitcoin://192.168.1.1:8333', - ], - ui: true, + addressInfo: { + ipInfo: { + eth0: { + wireless: false, + ipv4: '192.168.1.1:8332', + ipv6: 'FE80:CD00:0000:0CDE:1257:0000:211E:729CD:8332', + }, + }, + lanHostname: 'adjective-noun:8332', + torHostname: 'bitcoind-p2p-address.onion', + domainInfo: null, + }, + type: 'ui', }, }, 'current-dependencies': {}, @@ -1286,6 +1301,7 @@ export module Mock { 'marketplace-url': 'https://registry.start9.com/', 'developer-key': 'developer-key', 'has-config': true, + outboundProxy: null, }, actions: { resync: { @@ -1336,15 +1352,23 @@ export module Mock { }, 'dependency-errors': {}, }, - 'address-info': { + interfaceInfo: { rpc: { name: 'Proxy RPC addresses', description: `Use these addresses to access Proxy's RPC interface`, - addresses: [ - 'http://bitcoinproxy-rpc-address.onion', - 'https://bitcoinproxy-rpc-address.local', - ], - ui: false, + addressInfo: { + ipInfo: { + eth0: { + wireless: false, + ipv4: '192.168.1.1:8459', + ipv6: 'FE80:CD00:0000:0CDE:1257:0000:211E:729CD:8459', + }, + }, + lanHostname: 'adjective-noun.local:8459', + torHostname: 'btcrpc-proxy-address.onion', + domainInfo: null, + }, + type: 'api', }, }, 'current-dependencies': { @@ -1361,6 +1385,7 @@ export module Mock { 'marketplace-url': 'https://registry.start9.com/', 'developer-key': 'developer-key', 'has-config': true, + outboundProxy: null, }, actions: {}, } @@ -1384,26 +1409,40 @@ export module Mock { }, }, }, - 'address-info': { + interfaceInfo: { ui: { name: 'Web UI', description: 'The browser web interface for LND', - addresses: [ - 'http://lnd-ui-address.onion', - 'https://lnd-ui-address.local', - 'https://192.168.1.1:3449', - ], - ui: true, + addressInfo: { + ipInfo: { + eth0: { + wireless: false, + ipv4: '192.168.1.1:7171', + ipv6: 'FE80:CD00:0000:0CDE:1257:0000:211E:729CD:7171', + }, + }, + lanHostname: 'adjective-noun.local:7171', + torHostname: 'lnd-ui-address.onion', + domainInfo: null, + }, + type: 'ui', }, grpc: { name: 'gRPC', description: 'For connecting to LND gRPC interface', - addresses: [ - 'http://lnd-grpc-address.onion', - 'https://lnd-grpc-address.local', - 'https://192.168.1.1:3449', - ], - ui: true, + addressInfo: { + ipInfo: { + eth0: { + wireless: false, + ipv4: '192.168.1.1:9191', + ipv6: 'FE80:CD00:0000:0CDE:1257:0000:211E:729CD:9191', + }, + }, + lanHostname: 'adjective-noun.local:9191', + torHostname: 'lnd-grpc-address.onion', + domainInfo: null, + }, + type: 'p2p', }, }, 'current-dependencies': { @@ -1417,7 +1456,7 @@ export module Mock { 'dependency-info': { bitcoind: { title: 'Bitcoin Core', - icon: 'assets/img/service-icons/bitcoind.png', + icon: 'assets/img/service-icons/bitcoind.svg', }, 'btc-rpc-proxy': { title: 'Bitcoin Proxy', @@ -1427,6 +1466,7 @@ export module Mock { 'marketplace-url': 'https://registry.start9.com/', 'developer-key': 'developer-key', 'has-config': true, + outboundProxy: null, }, actions: {}, } diff --git a/frontend/projects/ui/src/app/services/api/api.types.ts b/frontend/projects/ui/src/app/services/api/api.types.ts index 6542087b8..3397c0c33 100644 --- a/frontend/projects/ui/src/app/services/api/api.types.ts +++ b/frontend/projects/ui/src/app/services/api/api.types.ts @@ -5,13 +5,12 @@ import { DataModel, DependencyError, DomainInfo, + NetworkStrategy, + OsOutboundProxy, + ServiceOutboundProxy, } from 'src/app/services/patch-db/data-model' import { StartOSDiskInfo, LogsRes, ServerLogsReq } from '@start9labs/shared' import { customSmtp } from '@start9labs/start-sdk/lib/config/configConstants' -import { - CustomSpec, - Start9MeSpec, -} from 'src/app/apps/ui/pages/system/domains/domain.const' export module RR { // DB @@ -89,6 +88,11 @@ export module RR { } // server.experimental.zram export type ToggleZramRes = null + export type SetOsOutboundProxyReq = { + proxy: OsOutboundProxy + } // server.proxy.set-outbound + export type SetOsOutboundProxyRes = null + // sessions export type GetSessionsReq = {} // sessions.list @@ -114,16 +118,31 @@ export module RR { export type DeleteAllNotificationsReq = { before: number } // notification.delete-before export type DeleteAllNotificationsRes = null + // network + + export type AddProxyReq = { + name: string + config: string + } // net.proxy.add + export type AddProxyRes = null + + export type UpdateProxyReq = { + name?: string + primaryInbound?: true + primaryOutbound?: true + } // net.proxy.update + export type UpdateProxyRes = null + + export type DeleteProxyReq = { id: string } // net.proxy.delete + export type DeleteProxyRes = null + // domains - export type ClaimStart9MeReq = { - networkStrategy: string - ipStrategy: string | null - } // net.domain.me.claim - export type ClaimStart9MeRes = null + export type ClaimStart9ToReq = { networkStrategy: NetworkStrategy } // net.domain.me.claim + export type ClaimStart9ToRes = null - export type DeleteStart9MeReq = {} // net.domain.me.delete - export type DeleteStart9MeRes = null + export type DeleteStart9ToReq = {} // net.domain.me.delete + export type DeleteStart9ToRes = null export type AddDomainReq = { hostname: string @@ -132,8 +151,7 @@ export module RR { username: string | null password: string | null } - networkStrategy: string - ipStrategy: string | null + networkStrategy: NetworkStrategy } // net.domain.add export type AddDomainRes = null @@ -347,6 +365,18 @@ export module RR { } export type SideloadPacakgeRes = string //guid + export type SetInterfaceClearnetAddressReq = SetServerClearnetAddressReq & { + packageId: string + interfaceId: string + } // package.interface.set-clearnet + export type SetInterfaceClearnetAddressRes = null + + export type SetServiceOutboundProxyReq = { + packageId: string + proxy: ServiceOutboundProxy + } // package.proxy.set-outbound + export type SetServiceOutboundProxyRes = null + // marketplace export type EnvInfo = { diff --git a/frontend/projects/ui/src/app/services/api/embassy-api.service.ts b/frontend/projects/ui/src/app/services/api/embassy-api.service.ts index baf06e005..775f38b18 100644 --- a/frontend/projects/ui/src/app/services/api/embassy-api.service.ts +++ b/frontend/projects/ui/src/app/services/api/embassy-api.service.ts @@ -125,6 +125,10 @@ export abstract class ApiService { abstract toggleZram(params: RR.ToggleZramReq): Promise + abstract setOsOutboundProxy( + params: RR.SetOsOutboundProxyReq, + ): Promise + // marketplace URLs abstract marketplaceProxy( @@ -150,15 +154,23 @@ export abstract class ApiService { params: RR.DeleteAllNotificationsReq, ): Promise + // network + + abstract addProxy(params: RR.AddProxyReq): Promise + + abstract updateProxy(params: RR.UpdateProxyReq): Promise + + abstract deleteProxy(params: RR.DeleteProxyReq): Promise + // domains - abstract claimStart9MeDomain( - params: RR.ClaimStart9MeReq, - ): Promise + abstract claimStart9ToDomain( + params: RR.ClaimStart9ToReq, + ): Promise - abstract deleteStart9MeDomain( - params: RR.DeleteStart9MeReq, - ): Promise + abstract deleteStart9ToDomain( + params: RR.DeleteStart9ToReq, + ): Promise abstract addDomain(params: RR.AddDomainReq): Promise @@ -322,4 +334,12 @@ export abstract class ApiService { abstract getSetupStatus(): Promise abstract followLogs(): Promise + + abstract setInterfaceClearnetAddress( + params: RR.SetInterfaceClearnetAddressReq, + ): Promise + + abstract setServiceOutboundProxy( + params: RR.SetServiceOutboundProxyReq, + ): Promise } diff --git a/frontend/projects/ui/src/app/services/api/embassy-live-api.service.ts b/frontend/projects/ui/src/app/services/api/embassy-live-api.service.ts index 2a76dd1a6..3b1a91cfe 100644 --- a/frontend/projects/ui/src/app/services/api/embassy-live-api.service.ts +++ b/frontend/projects/ui/src/app/services/api/embassy-live-api.service.ts @@ -233,6 +233,12 @@ export class LiveApiService extends ApiService { return this.rpcRequest({ method: 'server.experimental.zram', params }) } + async setOsOutboundProxy( + params: RR.SetOsOutboundProxyReq, + ): Promise { + return this.rpcRequest({ method: 'server.proxy.set-outbound', params }) + } + // marketplace URLs async marketplaceProxy( @@ -288,17 +294,31 @@ export class LiveApiService extends ApiService { }) } + // network + + async addProxy(params: RR.AddProxyReq): Promise { + return this.rpcRequest({ method: 'net.proxy.add', params }) + } + + async updateProxy(params: RR.UpdateProxyReq): Promise { + return this.rpcRequest({ method: 'net.proxy.update', params }) + } + + async deleteProxy(params: RR.DeleteProxyReq): Promise { + return this.rpcRequest({ method: 'net.proxy.delete', params }) + } + // domains - async claimStart9MeDomain( - params: RR.ClaimStart9MeReq, - ): Promise { + async claimStart9ToDomain( + params: RR.ClaimStart9ToReq, + ): Promise { return this.rpcRequest({ method: 'net.domain.me.claim', params }) } - async deleteStart9MeDomain( - params: RR.DeleteStart9MeReq, - ): Promise { + async deleteStart9ToDomain( + params: RR.DeleteStart9ToReq, + ): Promise { return this.rpcRequest({ method: 'net.domain.me.delete', params }) } @@ -544,6 +564,18 @@ export class LiveApiService extends ApiService { }) } + async setInterfaceClearnetAddress( + params: RR.SetInterfaceClearnetAddressReq, + ): Promise { + return this.rpcRequest({ method: 'package.interface.set-clearnet', params }) + } + + async setServiceOutboundProxy( + params: RR.SetServiceOutboundProxyReq, + ): Promise { + return this.rpcRequest({ method: 'package.proxy.set-outbound', params }) + } + async getSetupStatus() { return this.rpcRequest({ method: 'setup.status', diff --git a/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts b/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts index 662d104f6..48684093a 100644 --- a/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts +++ b/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts @@ -15,6 +15,7 @@ import { PackageDataEntry, PackageMainStatus, PackageState, + Proxy, } from 'src/app/services/patch-db/data-model' import { BackupTargetType, Metrics, RR } from './api.types' import { Mock } from './api.fixures' @@ -371,6 +372,21 @@ export class MockApiService extends ApiService { return this.withRevision(patch, null) } + async setOsOutboundProxy( + params: RR.SetOsOutboundProxyReq, + ): Promise { + await pauseFor(2000) + + const patch = [ + { + op: PatchOp.REPLACE, + path: '/server-info/network/outboundProxy', + value: params.proxy, + }, + ] + return this.withRevision(patch, null) + } + // marketplace URLs async marketplaceProxy( @@ -439,36 +455,97 @@ export class MockApiService extends ApiService { return null } + // network + + async addProxy(params: RR.AddProxyReq): Promise { + await pauseFor(2000) + + const type: Proxy['type'] = 'inbound-outbound' + + const patch = [ + { + op: PatchOp.REPLACE, + path: '/server-info/network/proxies', + value: [ + { + id: 'abcd-efgh-ijkl-mnop', + name: params.name, + createdAt: new Date(), + type, + endpoint: '10.25.2.17', + usedBy: { + domains: [], + services: [], + }, + primaryInbound: type === 'inbound-outbound' ? true : false, + primaryOutbound: + type === 'inbound-outbound' || type === 'outbound' ? true : false, + // primaryInbound: false, + // primaryOutbound: false, + }, + ], + }, + ] + return this.withRevision(patch, null) + } + + async updateProxy(params: RR.UpdateProxyReq): Promise { + await pauseFor(2000) + + const value = params.name || params.primaryInbound || params.primaryOutbound + + const patch = [ + { + op: PatchOp.REPLACE, + path: `/server-info/network/proxies/0/${Object.keys(params)[0]}`, + value, + }, + ] + return this.withRevision(patch, null) + } + + async deleteProxy(params: RR.DeleteProxyReq): Promise { + await pauseFor(2000) + const patch = [ + { + op: PatchOp.REPLACE, + path: '/server-info/network/proxies', + value: [], + }, + ] + return this.withRevision(patch, null) + } + // domains - async claimStart9MeDomain( - params: RR.ClaimStart9MeReq, - ): Promise { + async claimStart9ToDomain( + params: RR.ClaimStart9ToReq, + ): Promise { await pauseFor(2000) const patch = [ { op: PatchOp.REPLACE, - path: '/server-info/network/start9MeSubdomain', + path: '/server-info/network/start9ToSubdomain', value: { value: 'xyz', createdAt: new Date(), networkStrategy: params.networkStrategy, - ipStrategy: params.ipStrategy, + usedBy: [], }, }, ] return this.withRevision(patch, null) } - async deleteStart9MeDomain( - params: RR.DeleteStart9MeReq, - ): Promise { + async deleteStart9ToDomain( + params: RR.DeleteStart9ToReq, + ): Promise { await pauseFor(2000) const patch = [ { op: PatchOp.REPLACE, - path: '/server-info/network/start9MeSubdomain', + path: '/server-info/network/start9ToSubdomain', value: null, }, ] @@ -485,10 +562,10 @@ export class MockApiService extends ApiService { value: [ { value: params.hostname, + createdAt: new Date(), provider: params.provider.name, networkStrategy: params.networkStrategy, - ipStrategy: params.ipStrategy, - createdAt: new Date(), + usedBy: [], }, ], }, @@ -1109,6 +1186,34 @@ export class MockApiService extends ApiService { return 'fake-guid' } + async setInterfaceClearnetAddress( + params: RR.SetInterfaceClearnetAddressReq, + ): Promise { + await pauseFor(2000) + const patch = [ + { + op: PatchOp.REPLACE, + path: `/package-data/${params.packageId}/installed/interfaceInfo/${params.interfaceId}/addressInfo/domainInfo`, + value: params.domainInfo, + }, + ] + return this.withRevision(patch, null) + } + + async setServiceOutboundProxy( + params: RR.SetServiceOutboundProxyReq, + ): Promise { + await pauseFor(2000) + const patch = [ + { + op: PatchOp.REPLACE, + path: `/package-data/${params.packageId}/installed/outboundProxy`, + value: params.proxy, + }, + ] + return this.withRevision(patch, null) + } + private async updateProgress(id: string): Promise { const progress = { ...PROGRESS } const phases = [ diff --git a/frontend/projects/ui/src/app/services/api/mock-patch.ts b/frontend/projects/ui/src/app/services/api/mock-patch.ts index 240cf6ec9..e15257242 100644 --- a/frontend/projects/ui/src/app/services/api/mock-patch.ts +++ b/frontend/projects/ui/src/app/services/api/mock-patch.ts @@ -45,11 +45,6 @@ export const mockPatchData: DataModel = { eth0: { wireless: false, ipv4: '10.0.0.1', - ipv6: null, - }, - wlan0: { - wireless: true, - ipv4: '10.0.90.12', ipv6: 'FE80:CD00:0000:0CDE:1257:0000:211E:729CD', }, }, @@ -57,7 +52,7 @@ export const mockPatchData: DataModel = { }, network: { domains: [], - start9MeSubdomain: null, + start9ToSubdomain: null, wifi: { enabled: false, lastRegion: null, @@ -85,6 +80,12 @@ export const mockPatchData: DataModel = { }, ], }, + proxies: [], + primaryProxies: { + inbound: null, + outbound: null, + }, + outboundProxy: null, }, 'last-backup': new Date(new Date().valueOf() - 604800001).toISOString(), 'unread-notification-count': 4, @@ -105,7 +106,6 @@ export const mockPatchData: DataModel = { from: '', login: '', password: '', - tls: true, }, 'password-hash': '$argon2d$v=19$m=1024,t=1,p=1$YXNkZmFzZGZhc2RmYXNkZg$Ceev1I901G6UwU+hY0sHrFZ56D+o+LNJ', diff --git a/frontend/projects/ui/src/app/services/config.service.ts b/frontend/projects/ui/src/app/services/config.service.ts index c6d25bf98..fb421da66 100644 --- a/frontend/projects/ui/src/app/services/config.service.ts +++ b/frontend/projects/ui/src/app/services/config.service.ts @@ -3,7 +3,7 @@ import { Inject, Injectable } from '@angular/core' import { WorkspaceConfig } from '@start9labs/shared' import { InstalledPackageInfo, - PackageMainStatus, + InterfaceInfo, } from 'src/app/services/patch-db/data-model' const { @@ -30,8 +30,6 @@ export class ConfigService { api = api marketplace = marketplace skipStartupAlerts = useMocks && mocks.skipStartupAlerts - isConsulate = (window as any)['platform'] === 'ios' - supportsWebSockets = !!window.WebSocket || this.isConsulate isTor(): boolean { return ( @@ -39,23 +37,65 @@ export class ConfigService { ) } - isLan(): boolean { + isLocal(): boolean { + return ( + this.hostname.endsWith('.local') || (useMocks && mocks.maskAs === 'local') + ) + } + + isLocalhost(): boolean { return ( this.hostname === 'localhost' || - this.hostname.endsWith('.local') || - (useMocks && mocks.maskAs === 'lan') + (useMocks && mocks.maskAs === 'localhost') + ) + } + + isIpv4(): boolean { + return isValidIpv4(this.hostname) || (useMocks && mocks.maskAs === 'ipv4') + } + + isIpv6(): boolean { + return isValidIpv6(this.hostname) || (useMocks && mocks.maskAs === 'ipv6') + } + + isClearnet(): boolean { + return ( + (useMocks && mocks.maskAs === 'clearnet') || + (!this.isTor() && + !this.isLocal() && + !this.isLocalhost() && + !this.isIpv4() && + !this.isIpv6()) ) } isSecure(): boolean { return window.isSecureContext || this.isTor() } + + launchableAddress(info: InterfaceInfo): string { + return this.isTor() + ? info.addressInfo.torHostname + : this.isLocalhost() + ? `https://${info.addressInfo.lanHostname}` + : this.isLocal() || this.isIpv4() || this.isIpv6() + ? `https://${this.hostname}` + : info.addressInfo.domainInfo?.subdomain + ? `https://${info.addressInfo.domainInfo.subdomain}${info.addressInfo.domainInfo.domain}` + : `https://${info.addressInfo.domainInfo?.domain}` + } +} + +export function isValidIpv4(address: string): boolean { + const regexExp = + /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ + return regexExp.test(address) } -export function hasUi( - addressInfo: InstalledPackageInfo['address-info'], -): boolean { - return !!Object.values(addressInfo).find(a => a.ui) +export function isValidIpv6(address: string): boolean { + const regexExp = + /(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/gi + return regexExp.test(address) } export function removeProtocol(str: string): string { diff --git a/frontend/projects/ui/src/app/services/patch-db/data-model.ts b/frontend/projects/ui/src/app/services/patch-db/data-model.ts index 71618f4bb..aeb60d79e 100644 --- a/frontend/projects/ui/src/app/services/patch-db/data-model.ts +++ b/frontend/projects/ui/src/app/services/patch-db/data-model.ts @@ -3,6 +3,7 @@ import { Url } from '@start9labs/shared' import { Manifest } from '@start9labs/marketplace' import { BackupJob } from '../api/api.types' import { customSmtp } from '@start9labs/start-sdk/lib/config/configConstants' +import { NetworkInterfaceType } from '@start9labs/start-sdk/lib/util/utils' export interface DataModel { 'server-info': ServerInfo @@ -55,7 +56,7 @@ export interface ServerInfo { id: string version: string country: string - ui: StartOsUiInfo + ui: AddressInfo network: NetworkInfo 'last-backup': string | null 'unread-notification-count': number @@ -69,21 +70,20 @@ export interface ServerInfo { 'password-hash': string } -export type StartOsUiInfo = { - ipInfo: IpInfo - lanHostname: string - torHostname: string - domainInfo: DomainInfo | null -} - export type NetworkInfo = { wifi: WiFiInfo - start9MeSubdomain: Omit | null + start9ToSubdomain: Omit | null domains: Domain[] wanConfig: { upnp: boolean forwards: PortForward[] } + proxies: Proxy[] + outboundProxy: OsOutboundProxy + primaryProxies: { + inbound: string | null + outbound: string | null + } } export type DomainInfo = { @@ -91,6 +91,10 @@ export type DomainInfo = { subdomain: string | null } +export type InboundProxy = { proxyId: string } | 'primary' | null +export type OsOutboundProxy = InboundProxy +export type ServiceOutboundProxy = OsOutboundProxy | 'mirror' + export type PortForward = { assigned: number override: number | null @@ -105,10 +109,32 @@ export type WiFiInfo = { export type Domain = { value: string + createdAt: string provider: string - networkStrategy: string - ipStrategy: string + networkStrategy: NetworkStrategy + usedBy: { + service: { id: string | null; title: string } // null means startos + interfaces: { id: string | null; title: string }[] // null means startos + }[] +} + +export type NetworkStrategy = + | { proxyId: string | null } // null means system primary + | { ipStrategy: 'ipv4' | 'ipv6' | 'dualstack' } + +export type Proxy = { + id: string + name: string createdAt: string + type: 'outbound' | 'inbound-outbound' | 'vlan' | { error: string } + endpoint: string + // below is overlay only + usedBy: { + services: { id: string | null; title: string }[] // implies outbound - null means startos + domains: string[] // implies inbound + } + primaryInbound: boolean + primaryOutbound: boolean } export interface IpInfo { @@ -199,21 +225,29 @@ export interface InstalledPackageInfo { 'installed-at': string 'current-dependencies': Record 'dependency-info': Record - 'address-info': Record + interfaceInfo: Record 'marketplace-url': string | null 'developer-key': string 'has-config': boolean + outboundProxy: ServiceOutboundProxy } export interface CurrentDependencyInfo { 'health-checks': string[] // array of health check IDs } -export interface AddressInfo { +export interface InterfaceInfo { name: string description: string - addresses: Url[] - ui: boolean + type: NetworkInterfaceType + addressInfo: AddressInfo +} + +export interface AddressInfo { + ipInfo: IpInfo + lanHostname: string + torHostname: string + domainInfo: DomainInfo | null } export interface Action { diff --git a/frontend/projects/ui/src/app/services/proxy.service.ts b/frontend/projects/ui/src/app/services/proxy.service.ts new file mode 100644 index 000000000..bffe20f82 --- /dev/null +++ b/frontend/projects/ui/src/app/services/proxy.service.ts @@ -0,0 +1,161 @@ +import { Injectable } from '@angular/core' +import { PatchDB } from 'patch-db-client' +import { + DataModel, + OsOutboundProxy, + ServiceOutboundProxy, +} from './patch-db/data-model' +import { firstValueFrom } from 'rxjs' +import { Config } from '@start9labs/start-sdk/lib/config/builder/config' +import { Value } from '@start9labs/start-sdk/lib/config/builder/value' +import { Variants } from '@start9labs/start-sdk/lib/config/builder/variants' +import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' +import { TuiDialogOptions } from '@taiga-ui/core' +import { FormDialogService } from 'src/app/services/form-dialog.service' +import { FormContext, FormPage } from '../apps/ui/modals/form/form.page' +import { ApiService } from './api/embassy-api.service' +import { ErrorService, LoadingService } from '@start9labs/shared' + +@Injectable({ + providedIn: 'root', +}) +export class ProxyService { + constructor( + private readonly patch: PatchDB, + private readonly formDialog: FormDialogService, + private readonly api: ApiService, + private readonly loader: LoadingService, + private readonly errorService: ErrorService, + ) {} + + async presentModalSetOutboundProxy(serviceContext?: { + packageId: string + outboundProxy: ServiceOutboundProxy + hasP2P: boolean + }) { + const network = await firstValueFrom( + this.patch.watch$('server-info', 'network'), + ) + + const outboundProxy = serviceContext?.outboundProxy + + const defaultValue = !outboundProxy + ? 'none' + : outboundProxy === 'primary' + ? 'primary' + : outboundProxy === 'mirror' + ? 'mirror' + : 'other' + + let variants: Record }> = {} + + if (serviceContext) { + variants['mirror'] = { + name: 'Mirror P2P Interface', + spec: Config.of({}), + } + } + + variants = { + ...variants, + primary: { + name: 'Use System Primary', + spec: Config.of({}), + }, + other: { + name: 'Other', + spec: Config.of({ + proxyId: Value.select({ + name: 'Select Specific Proxy', + required: { + default: + outboundProxy && typeof outboundProxy !== 'string' + ? outboundProxy.proxyId + : null, + }, + values: network.proxies + .filter( + p => p.type === 'outbound' || p.type === 'inbound-outbound', + ) + .reduce((prev, curr) => { + return { + [curr.id]: curr.name, + ...prev, + } + }, {}), + }), + }), + }, + none: { + name: 'None', + spec: Config.of({}), + }, + } + + const config = Config.of({ + proxy: Value.union( + { + name: 'Select Proxy', + required: { default: defaultValue }, + description: ` +
    Use System Primary
    The primary inbound proxy will be used. If you do not have a primary inbound proxy, no proxy will be used +
    Mirror Primary Interface
    If you have an inbound proxy enabled for the primary interface, outbound traffic will flow through the same proxy +
    Other
    The specific proxy you select will be used, overriding the default + `, + disabled: serviceContext?.hasP2P ? [] : ['mirror'], + }, + Variants.of(variants), + ), + }) + + const options: Partial< + TuiDialogOptions> + > = { + label: 'Outbound Proxy', + data: { + spec: await configBuilderToSpec(config), + buttons: [ + { + text: 'Manage proxies', + link: '/system/proxies', + }, + { + text: 'Save', + handler: async value => { + const proxy = + value.proxy.unionSelectKey === 'none' + ? null + : value.proxy.unionSelectKey === 'primary' + ? 'primary' + : value.proxy.unionSelectKey === 'mirror' + ? 'mirror' + : { proxyId: value.proxy.unionValueKey.proxyId } + await this.saveOutboundProxy(proxy, serviceContext?.packageId) + return true + }, + }, + ], + }, + } + this.formDialog.open(FormPage, options) + } + + private async saveOutboundProxy( + proxy: OsOutboundProxy | ServiceOutboundProxy, + packageId?: string, + ) { + const loader = this.loader.open(`Saving`).subscribe() + + try { + if (packageId) { + await this.api.setServiceOutboundProxy({ packageId, proxy }) + } else { + await this.api.setOsOutboundProxy({ proxy: proxy as OsOutboundProxy }) + } + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } +} diff --git a/frontend/projects/ui/src/app/util/configBuilderToSpec.ts b/frontend/projects/ui/src/app/util/configBuilderToSpec.ts index fd4573e99..0174c65e5 100644 --- a/frontend/projects/ui/src/app/util/configBuilderToSpec.ts +++ b/frontend/projects/ui/src/app/util/configBuilderToSpec.ts @@ -2,8 +2,8 @@ import { Config } from '@start9labs/start-sdk/lib/config/builder/config' export async function configBuilderToSpec( builder: - | Config, unknown, unknown> - | Config, never, never>, + | Config, unknown> + | Config, never>, ) { return builder.build({} as any) } diff --git a/frontend/projects/ui/src/styles.scss b/frontend/projects/ui/src/styles.scss index c98d52162..8180ca0cf 100644 --- a/frontend/projects/ui/src/styles.scss +++ b/frontend/projects/ui/src/styles.scss @@ -330,7 +330,7 @@ h2 { scrollbar-width: none; ion-grid { - min-width: 840px; + min-width: 900px; } } From 3b8fb70db1feb8678c8283fdd1e28c3de74fa9ea Mon Sep 17 00:00:00 2001 From: Lucy <12953208+elvece@users.noreply.github.com> Date: Tue, 8 Aug 2023 11:52:00 -0400 Subject: [PATCH 013/169] Fix/shared module build (#2385) * update shared version so latest can be pulled into brochure marketplace project * updated shared to work with new brochure marketplace --- frontend/package-lock.json | 765 ++++++++++-------- frontend/package.json | 10 +- frontend/projects/shared/package.json | 2 +- .../logs-window/logs-window.component.ts | 3 +- frontend/tsconfig.json | 1 + 5 files changed, 433 insertions(+), 348 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 5fff0f288..9420f3851 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -23,11 +23,11 @@ "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc8.beta2", - "@taiga-ui/addon-charts": "3.38.0", - "@taiga-ui/cdk": "3.38.0", - "@taiga-ui/core": "3.38.0", - "@taiga-ui/icons": "3.38.0", - "@taiga-ui/kit": "3.38.0", + "@taiga-ui/addon-charts": "3.39.1", + "@taiga-ui/cdk": "3.39.1", + "@taiga-ui/core": "3.39.1", + "@taiga-ui/icons": "3.39.1", + "@taiga-ui/kit": "3.39.1", "@tinkoff/ng-dompurify": "4.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", @@ -119,12 +119,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1601.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1601.4.tgz", - "integrity": "sha512-OOSbNlDy+Q3jY0oFHaq8kkna9HYI1zaS8IHeCIDP6T/ZIAVad4+HqXAL4SKQrKJikkoBQv1Z/eaDBL5XPFK9Bw==", + "version": "0.1601.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1601.8.tgz", + "integrity": "sha512-kOXVGwsQnZvtz2UZNefcEy64Jiwq0eSoQUeozvDXOaYRJABLjPKI2YaarvKC9/Z1SGLuje0o/eRJO4T8aRk9rQ==", "devOptional": true, "dependencies": { - "@angular-devkit/core": "16.1.4", + "@angular-devkit/core": "16.1.8", "rxjs": "7.8.1" }, "engines": { @@ -134,15 +134,15 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.1.4.tgz", - "integrity": "sha512-LiHM7R20fTHg/eM+Iabotj08edP5wVBQahRfVNLxERo8X6VJgSjVChnsh3AQJkRywlGuFe20AOQYpyLyN367Ug==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.1.8.tgz", + "integrity": "sha512-iyElPBQdcJq2plw5YqSz4mzNUfSRXI3ISFTEwPtimzPOorsj/OxB3Z6kJ8fDUsBAJ5OKR7xL7VnQJJ3S+05RhQ==", "dev": true, "dependencies": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1601.4", - "@angular-devkit/build-webpack": "0.1601.4", - "@angular-devkit/core": "16.1.4", + "@angular-devkit/architect": "0.1601.8", + "@angular-devkit/build-webpack": "0.1601.8", + "@angular-devkit/core": "16.1.8", "@babel/core": "7.22.5", "@babel/generator": "7.22.7", "@babel/helper-annotate-as-pure": "7.22.5", @@ -154,7 +154,7 @@ "@babel/runtime": "7.22.5", "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.1.4", + "@ngtools/webpack": "16.1.8", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", "autoprefixer": "10.4.14", @@ -164,7 +164,7 @@ "cacache": "17.1.3", "chokidar": "3.5.3", "copy-webpack-plugin": "11.0.0", - "critters": "0.0.19", + "critters": "0.0.20", "css-loader": "6.8.1", "esbuild-wasm": "0.17.19", "fast-glob": "3.2.12", @@ -364,12 +364,12 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1601.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1601.4.tgz", - "integrity": "sha512-GC1y//ScAYbYQ68Wri2QgTEekC4hRxBC+xEkYL9OFiAMQ4mcN+eYvbkQBX8enJwDMXpkYfLR6VV8cChjAVYIgg==", + "version": "0.1601.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1601.8.tgz", + "integrity": "sha512-LUMA3xNnN4IY/FPaqyF6rzba+QVxl3vA+v0l71CBIKNU+Qee6D9xe8KG0Bn7relqDhWZOSHY0nhhO2mBoz4iQg==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1601.4", + "@angular-devkit/architect": "0.1601.8", "rxjs": "7.8.1" }, "engines": { @@ -383,9 +383,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.4.tgz", - "integrity": "sha512-WCAzNi9LxpFIi2WVPaJQd2kHPqCnCexWzUZN05ltJuBGCQL1O+LgRHGwnQ4WZoqmrF5tcWt2a3GFtJ3DgMc1hw==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.8.tgz", + "integrity": "sha512-dSRD/+bGanArIXkj+kaU1kDFleZeQMzmBiOXX+pK0Ah9/0Yn1VmY3RZh1zcX9vgIQXV+t7UPrTpOjaERMUtVGw==", "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", @@ -408,11 +408,11 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.4.tgz", - "integrity": "sha512-yjRgwHAfFaeuimgbQtjwSUyXzEHpMSdTRb2zg+TOp6skoGvHOG8xXFJ7DjBkSMeAQdFF0fkxhPS9YmlxqNc+7A==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.8.tgz", + "integrity": "sha512-6LyzMdFJs337RTxxkI2U1Ndw0CW5mMX/aXWl8d7cW2odiSrAg8IdlMqpc+AM8+CPfsB0FtS1aWkEZqJLT0jHOg==", "dependencies": { - "@angular-devkit/core": "16.1.4", + "@angular-devkit/core": "16.1.8", "jsonc-parser": "3.2.0", "magic-string": "0.30.0", "ora": "5.4.1", @@ -425,9 +425,9 @@ } }, "node_modules/@angular/animations": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.1.4.tgz", - "integrity": "sha512-QdqmnMEYsrZK1BB+/TGteyoQVRwIpRdBP4Jg+hX/BDhVpt35dptSwvNZj7+9zoYLwNo5DuGlttljEaLOs1UcUw==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.1.8.tgz", + "integrity": "sha512-aIAf8EAZomgXMF6AP0wTPAc04Cvw+nL9nkEVwQNVxMByZpcbnnqHWHokLD8es8DzlwDT+EIZS4wZMBA4XUmPyA==", "dependencies": { "tslib": "^2.3.0" }, @@ -435,19 +435,19 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "16.1.4" + "@angular/core": "16.1.8" } }, "node_modules/@angular/cli": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.1.4.tgz", - "integrity": "sha512-coSOLVLpOCOD5q9K9EAFFMrTES+HtdJiLy/iI9kdKNCKWUJpm8/svZ3JZOej3vPxYEp0AokXNOwORQnX21/qZQ==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.1.8.tgz", + "integrity": "sha512-amOIHMq8EvixhnI+do5Bcy6IZSFAJx0njhhLM4ltDuNUczH8VH0hNegZKxhb8K87AMO8jITFM+NLrzccyghsDQ==", "devOptional": true, "dependencies": { - "@angular-devkit/architect": "0.1601.4", - "@angular-devkit/core": "16.1.4", - "@angular-devkit/schematics": "16.1.4", - "@schematics/angular": "16.1.4", + "@angular-devkit/architect": "0.1601.8", + "@angular-devkit/core": "16.1.8", + "@angular-devkit/schematics": "16.1.8", + "@schematics/angular": "16.1.8", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.1", @@ -473,9 +473,9 @@ } }, "node_modules/@angular/common": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.1.4.tgz", - "integrity": "sha512-SDA8GZVY0nXCJaNUy13L22jAKuk1LZgQ6QzqOpqQc50C25bfBQbYv68PKjHCjQ62VxGKnDSTT85xCMNx+y/U4g==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.1.8.tgz", + "integrity": "sha512-Zm+Ysxdf74VwG3mbAqs2v1QFUR+h9RyJBXF5VFABEpgFw7NUOBKrayjJmKjgZ0TBAmL2+nXehJgcPph3zNp3sg==", "dependencies": { "tslib": "^2.3.0" }, @@ -483,14 +483,14 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "16.1.4", + "@angular/core": "16.1.8", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.1.4.tgz", - "integrity": "sha512-5iKx8g+6/LtiRhbqMS2Jw1AshFUb4M8LO9WQKfRoE+5mZrDOYkAQYgOlAO7fk0mOCXeZcHJBbq2nuwDfwsZIiw==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.1.8.tgz", + "integrity": "sha512-jF2zk3LjrcI/xpjJG6yoLiL2t2l5227i8SjhRUawAL1sy0xtb/PiSLjCNhuSgyixbB/8az/YezZe11MSg48FDg==", "dependencies": { "tslib": "^2.3.0" }, @@ -498,7 +498,7 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "16.1.4" + "@angular/core": "16.1.8" }, "peerDependenciesMeta": { "@angular/core": { @@ -507,9 +507,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.1.4.tgz", - "integrity": "sha512-JerJOZeOLaHFHrfWMm4m9tEw+MdNNIMPj3TSauJ6uZPbFokGeqS2GsUBMjuQlwh5xY4duh1HtRsohvshpl306A==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.1.8.tgz", + "integrity": "sha512-Whk3RBnEYwN0c6Mo7hU6JDpHSyKONmIQEN8ViHJXwmyHK8w+/Z27iBw10QiyWUMtYb4tIM1xSLhRFAwH/3WnPQ==", "dev": true, "dependencies": { "@babel/core": "7.22.5", @@ -530,14 +530,14 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/compiler": "16.1.4", + "@angular/compiler": "16.1.8", "typescript": ">=4.9.3 <5.2" } }, "node_modules/@angular/core": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.1.4.tgz", - "integrity": "sha512-eWs++peAp+Lm2SHGfMsHAye2IOmlDKkVJ4dFf4TaZXW+AEev3FXKXLFp+dBUq8YkCKly7iAV26NXEUBOFFtplQ==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.1.8.tgz", + "integrity": "sha512-XtOpY9HA85hPGrPwe1rgE8NJ3bFWbuJFx4SUlzB66k9B5jo8bD2Dxl/0id55RFS5gmvCe/Qhh0zoGyMpkWjMHA==", "dependencies": { "tslib": "^2.3.0" }, @@ -550,9 +550,9 @@ } }, "node_modules/@angular/forms": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.1.4.tgz", - "integrity": "sha512-JLhO7gM0WyTfr6tEWZMiCGikWLgaC/a2+tuxWsSlXUjlrbE4DyLzSAA6JqyDCFTvm9B/QzRPDfgExLTTZJY4eQ==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.1.8.tgz", + "integrity": "sha512-V36q42ExvL93T7oYvRf4Z2z2V/kOm0wgaFgkNSiBHgIpuwvrAZ9nRZBui5Fqdnep3xKYd980vAaTtACA1blv3Q==", "dependencies": { "tslib": "^2.3.0" }, @@ -560,25 +560,25 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.1.4", - "@angular/core": "16.1.4", - "@angular/platform-browser": "16.1.4", + "@angular/common": "16.1.8", + "@angular/core": "16.1.8", + "@angular/platform-browser": "16.1.8", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-16.1.4.tgz", - "integrity": "sha512-FmasGUt77+GS2AFspVJR8Sg0NNlxCJJKHCHO4cch2fKXnwLZxd4aeHU0ttlVCA/hTFN50+03S3CBvru25L+74A==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-16.1.8.tgz", + "integrity": "sha512-aP0M8NXt1VoVoRoK4te922X7UIrI0Wsi3XMudySCeOZwkMwuTO/cI9Bq/jF4di4pweAAlTA0HfewdKgyDa6ebA==", "dev": true, "engines": { "node": "^16.14.0 || >=18.10.0" } }, "node_modules/@angular/platform-browser": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.1.4.tgz", - "integrity": "sha512-eQ1dBh/6ZwJVeiNGrcW6ePFmWeS+Oheu1RpuZSsvM/fI6qfsZE+or9IJ61SFvsMs65SbrO90Akc+ZXmpEidPdA==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.1.8.tgz", + "integrity": "sha512-wfUCVU7DLMHy5Rw7LY8KSTuLk0ff2bWElT6WSAKXXFEPjQiWuXbbIe+gglJX5HFQQHoyVwNbsSDIIgEp535Kvw==", "dependencies": { "tslib": "^2.3.0" }, @@ -586,9 +586,9 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/animations": "16.1.4", - "@angular/common": "16.1.4", - "@angular/core": "16.1.4" + "@angular/animations": "16.1.8", + "@angular/common": "16.1.8", + "@angular/core": "16.1.8" }, "peerDependenciesMeta": { "@angular/animations": { @@ -597,9 +597,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.1.4.tgz", - "integrity": "sha512-OIszPs3NLCZWL8BEvn458JotNMdXPGyEVToNa2cEVgtakVxkhrhmoFlwJTWJN4GRkHNL5h2Vb0JLEYICwr7sgg==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.1.8.tgz", + "integrity": "sha512-mhQH78Zn/oFe+U8DmVvPJ0/7neDlnKcgktQ7f1vFNibRLqkmHW/o1vZ0B7CAmO+yzGbB8mt+RBCFAfA7g3oRDg==", "dependencies": { "tslib": "^2.3.0" }, @@ -607,19 +607,19 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.1.4", - "@angular/compiler": "16.1.4", - "@angular/core": "16.1.4", - "@angular/platform-browser": "16.1.4" + "@angular/common": "16.1.8", + "@angular/compiler": "16.1.8", + "@angular/core": "16.1.8", + "@angular/platform-browser": "16.1.8" } }, "node_modules/@angular/pwa": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/@angular/pwa/-/pwa-16.1.4.tgz", - "integrity": "sha512-dBtTBiTZPhmHIcNHc5puCurAke2X2Z18MtqTI1JJqYl2vg+PBZqo0eZVRcEHv2+nqXx5JzPyk1frbaU11C8cVw==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular/pwa/-/pwa-16.1.8.tgz", + "integrity": "sha512-P88cR+GeGzrH4T6W0F3vamfko+iXfyrI3nMXR6Qcz/gZw5STQmZao5oVro4vpKgc2HxKarvxnF/N5VIwVFWIXQ==", "dependencies": { - "@angular-devkit/schematics": "16.1.4", - "@schematics/angular": "16.1.4", + "@angular-devkit/schematics": "16.1.8", + "@schematics/angular": "16.1.8", "parse5-html-rewriting-stream": "7.0.0" }, "engines": { @@ -637,9 +637,9 @@ } }, "node_modules/@angular/router": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.1.4.tgz", - "integrity": "sha512-ooAK7XsY7fLW80htej9jHmct37biK77aNApCdiY+KlLdd45x//ObGxRYXcSSyvs7mRS0AMTGuA/G7/5AMcqcZg==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.1.8.tgz", + "integrity": "sha512-p11Mz0qQbl26fcEEQ9LEUZhKrca9kqSwMWgxBRMWZl0AgtbWQadiVdjiQY0rvpohI7qSO8m3s7CFIQLKIOEvYQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -647,16 +647,16 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.1.4", - "@angular/core": "16.1.4", - "@angular/platform-browser": "16.1.4", + "@angular/common": "16.1.8", + "@angular/core": "16.1.8", + "@angular/platform-browser": "16.1.8", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/service-worker": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-16.1.4.tgz", - "integrity": "sha512-ShP3nD3UOER1gf6daYkQqwfKCz/2/NhzsJIRxL9AonBB4qLDU/MzYWC3nts43+AESZfdibnF1LCWkvUmceqvGA==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-16.1.8.tgz", + "integrity": "sha512-P7DW7K//3Jv8uptJ0wFzsJ+F/rs4A1DvBxvbcRwJIKlRCedzUQiTTFE6pCDh2YRS0915faSs8PO4SmvrA5HqGw==", "dependencies": { "tslib": "^2.3.0" }, @@ -667,8 +667,8 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.1.4", - "@angular/core": "16.1.4" + "@angular/common": "16.1.8", + "@angular/core": "16.1.8" } }, "node_modules/@assemblyscript/loader": { @@ -690,9 +690,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", - "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -729,9 +729,9 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -777,16 +777,16 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", - "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.6", + "@babel/compat-data": "^7.22.9", "@babel/helper-validator-option": "^7.22.5", - "@nicolo-ribaudo/semver-v6": "^6.3.3", "browserslist": "^4.21.9", - "lru-cache": "^5.1.1" + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -795,10 +795,19 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.6.tgz", - "integrity": "sha512-iwdzgtSiBxF6ni6mzVnZCF3xt5qE6cEA0J7nFt8QOAWZ0zjCFceEgpn3vtb2V7WFR6QzP2jmIFOHMTRo7eNJjQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", + "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -806,10 +815,10 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-member-expression-to-functions": "^7.22.5", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@nicolo-ribaudo/semver-v6": "^6.3.3" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -830,15 +839,24 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.6.tgz", - "integrity": "sha512-nBookhLKxAWo/TUCmhnaEJyLz2dekjQvv5SRpE9epWQBcpedWLKt8aZdsuT9XV5ovzR3fENLjRXVT0GsSlGGhA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", + "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@nicolo-ribaudo/semver-v6": "^6.3.3", - "regexpu-core": "^5.3.1" + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -847,10 +865,19 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz", - "integrity": "sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", + "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -860,7 +887,7 @@ "resolve": "^1.14.2" }, "peerDependencies": { - "@babel/core": "^7.4.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/helper-environment-visitor": { @@ -922,18 +949,30 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-module-imports": "^7.22.5", "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { "@babel/types": "^7.22.5" }, "engines": { @@ -962,15 +1001,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz", - "integrity": "sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-wrap-function": "^7.22.9" }, "engines": { "node": ">=6.9.0" @@ -980,20 +1018,20 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz", - "integrity": "sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { @@ -1060,14 +1098,13 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz", - "integrity": "sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz", + "integrity": "sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", "@babel/types": "^7.22.5" }, "engines": { @@ -2093,9 +2130,9 @@ } }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -2335,18 +2372,18 @@ } }, "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", + "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", @@ -2356,7 +2393,7 @@ "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/regjsgen": { @@ -3553,9 +3590,9 @@ "dev": true }, "node_modules/@maskito/angular": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-1.3.0.tgz", - "integrity": "sha512-SAuhTl3OkZ1Ff9TAksO+yLHgsv8N4LZTVOaFLyeYUQyLH/8nNcKTDMU/w1pRhoS0+7sXHH6/YzQ4CEHLgguHRA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-1.4.0.tgz", + "integrity": "sha512-JQqcqgHxF8pz8B6J69I7sbXGuM3DKfpmmaDO1MO0RPOWVDoH2tjuC/VBmSvjnR4sRlvJOsj1aHEQt6cVaSeTog==", "dependencies": { "tslib": "^2.3.0" }, @@ -3563,21 +3600,21 @@ "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@angular/forms": ">=12.0.0", - "@maskito/core": "^1.3.0", + "@maskito/core": "^1.4.0", "rxjs": ">=6.0.0" } }, "node_modules/@maskito/core": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@maskito/core/-/core-1.3.0.tgz", - "integrity": "sha512-JFSUHJw+dB7yFzaX45S+t4ivPznOlsAqRorgGr4Gx3CR0DU8CZhZsSVCIeSNABsrIgtHPtlhiAv3Jw6EaqShTg==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@maskito/core/-/core-1.4.0.tgz", + "integrity": "sha512-Q5o3vQ4c52VzJf6dvA1RgruMHM3uwPCjw2ghwJDNeU7W9xn/iuI61KN/kyuMeZDicRQwE+ddVokg2jEtYiPfJw==" }, "node_modules/@maskito/kit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-1.3.0.tgz", - "integrity": "sha512-DwYIEE7+fh/6q05KTzPEs+qnJp8jsXQa6h9UBk2Zlnp97PerPO56HGhvm2kAm/LSYtDzTCeurrvCAqncUSSOIg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-1.4.0.tgz", + "integrity": "sha512-1hILMNvXbX2GisdrvnFmqqWrjsD4jhUJUWAviIXUBXlxGuh++yqBxx07XEC6BwtYeMDxHD/dF0i5xQ9/oNdxcg==", "peerDependencies": { - "@maskito/core": "^1.3.0" + "@maskito/core": "^1.4.0" } }, "node_modules/@materia-ui/ngx-monaco-editor": { @@ -3593,9 +3630,10 @@ } }, "node_modules/@ng-web-apis/common": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@ng-web-apis/common/-/common-3.0.1.tgz", - "integrity": "sha512-pk0ibndaku/uip6MNST3/SA+sUcQZoajV2y4Mg6frfJzLq3wnKMQH25voL7wgG+XTaWvsS2OPDddPRFLn6qM7g==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@ng-web-apis/common/-/common-3.0.2.tgz", + "integrity": "sha512-PWMegIsuxfmya8AgSx4fQR5mt4ozaSflJARN6I4W6kGKxX/MnHGt86+djN3P6KVoWjI+bcQt2UlF1jlW9DgWiQ==", + "peer": true, "dependencies": { "tslib": "^2.2.0" }, @@ -3618,9 +3656,10 @@ } }, "node_modules/@ng-web-apis/mutation-observer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-3.0.1.tgz", - "integrity": "sha512-ChzNd/Q4R+wZEHBIqnffX9BsWlHgLxhA0BtJ5OLLnBeUQ/A1O+6v20qfrVmjMzgFqB8SpF+0c9j6SpWpsZHjWw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-3.0.2.tgz", + "integrity": "sha512-x1cq/Vznmz4aJ7STbZmA+4HCE+jxDiw2J359+iyiB+xyCVfZTECrJYP9g/hhzIRxyVPFznrPp61TDCRnLVyNWw==", + "peer": true, "dependencies": { "tslib": "^2.2.0" }, @@ -3630,9 +3669,10 @@ } }, "node_modules/@ng-web-apis/resize-observer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@ng-web-apis/resize-observer/-/resize-observer-3.0.1.tgz", - "integrity": "sha512-2rtkX3EeS0Qk6s1lzI5PaLYvDPuC4FT4WBS0yhmI6e8ipoJttNNB+sCLgd5aWarcMXMFWIcWqpmcJxzFFF73Fg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@ng-web-apis/resize-observer/-/resize-observer-3.0.2.tgz", + "integrity": "sha512-4aTZNHztwyJe4nJY/++0diUcd8jL7kQS+doPCREE6U4niM8Xvc98uK4qD340Faw9pmybkgsKD7EinyyPE5DIFQ==", + "peer": true, "dependencies": { "tslib": "^2.2.0" }, @@ -3642,9 +3682,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.1.4.tgz", - "integrity": "sha512-+8bfavDH8eWxjlJFYr6bkjcRHhy95j+f8oNn7/sGLNu4L96nuE2AZ011XIu2dJahCnNiBvwc1EpkKa92t9rkaA==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.1.8.tgz", + "integrity": "sha512-co2SC1a822655Ek2f6fkMFsswHeCm2obNceb0kftLSpqomCgPAC3T447pB3TE1Iw+BEMFdjrAgIrp3nyYWwHsQ==", "dev": true, "engines": { "node": "^16.14.0 || >=18.10.0", @@ -3657,15 +3697,6 @@ "webpack": "^5.54.0" } }, - "node_modules/@nicolo-ribaudo/semver-v6": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", - "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3929,12 +3960,12 @@ "dev": true }, "node_modules/@schematics/angular": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.1.4.tgz", - "integrity": "sha512-XfoeL+aBVIR/DzgVKGVhHW/TGQnqWvngyJVuCwXEVWzNfjxHYFkchXa78OItpAvTEr6/Y0Me9FQVAGVA4mMUyg==", + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.1.8.tgz", + "integrity": "sha512-gTHy1A/E9BCr0sj3VCr6eBYkgVkO96QWiZcFumedGnvstvp5wiCoIoJPLLfYaxVt1vt08xmnmS3OZ3r0qCLdpA==", "dependencies": { - "@angular-devkit/core": "16.1.4", - "@angular-devkit/schematics": "16.1.4", + "@angular-devkit/core": "16.1.8", + "@angular-devkit/schematics": "16.1.8", "jsonc-parser": "3.2.0" }, "engines": { @@ -3943,22 +3974,34 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@sigstore/bundle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.0.0.tgz", + "integrity": "sha512-yLvrWDOh6uMOUlFCTJIZEnwOT9Xte7NPXUqVexEKGSF5XtBAuSg5du0kn3dRR0p47a4ah10Y0mNt8+uyeQXrBQ==", + "devOptional": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz", - "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.0.tgz", + "integrity": "sha512-8ZhZKAVfXjIspDWwm3D3Kvj0ddbJ0HqDZ/pOs5cx88HpT8mVsotFrg7H1UMnXOuDHz6Zykwxn4mxG3QLuN+RUg==", "devOptional": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@sigstore/tuf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.2.tgz", - "integrity": "sha512-vjwcYePJzM01Ha6oWWZ9gNcdIgnzyFxfqfWzph483DPJTH8Tb7f7bQRRll3CYVkyH56j0AgcPAcl6Vg95DPF+Q==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", + "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", "devOptional": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.1.0", + "@sigstore/protobuf-specs": "^0.2.0", "tuf-js": "^1.1.7" }, "engines": { @@ -3999,9 +4042,9 @@ } }, "node_modules/@taiga-ui/addon-charts": { - "version": "3.38.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.38.0.tgz", - "integrity": "sha512-3/8M/FTKZ7OU1CdTInHrNSueQrHPqlas7+gvkj6jKCHuhqqe5MsBWYBIh8jywvbI6lbMGhXoNXYqrVzpvX2YNA==", + "version": "3.39.1", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.39.1.tgz", + "integrity": "sha512-gWae4F0d4Ya4bvKmS6T16SNNkMwCXnsw3LeJhV5lx3jvNr6T8BGGsFZz/+HUrzNsCz+EWhWnZw/zIdusw+wgqg==", "dependencies": { "tslib": ">=2.0.0" }, @@ -4009,22 +4052,22 @@ "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@ng-web-apis/common": ">=3.0.0", - "@taiga-ui/cdk": ">=3.38.0", - "@taiga-ui/core": ">=3.38.0", + "@taiga-ui/cdk": ">=3.39.1", + "@taiga-ui/core": ">=3.39.1", "@tinkoff/ng-polymorpheus": ">=4.0.0" } }, "node_modules/@taiga-ui/cdk": { - "version": "3.38.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.38.0.tgz", - "integrity": "sha512-932i9DTnCJN4KlUDazVet+30C/iUnCX5ldrC5nJMglbn42/4/lW1Rlh8RNHhXlL61iz8+FqGkMSE+YAKhKKl0w==", + "version": "3.39.1", + "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.39.1.tgz", + "integrity": "sha512-58DPLyB1bvFHcvn2f5TtXTML0acsXKzXRryyBwQcq3Y7m6DpzmLYWCtcqoYjKk2hN/MVn651GJ8oAqtMZxjmhQ==", "dependencies": { "@ng-web-apis/common": "3.0.1", "@ng-web-apis/mutation-observer": "3.0.1", "@ng-web-apis/resize-observer": "3.0.1", "@tinkoff/ng-event-plugins": "3.1.0", "@tinkoff/ng-polymorpheus": "4.1.0", - "tslib": "2.6.0" + "tslib": "2.6.1" }, "optionalDependencies": { "ng-morph": "2.2.5", @@ -4038,12 +4081,49 @@ "rxjs": ">=6.0.0" } }, + "node_modules/@taiga-ui/cdk/node_modules/@ng-web-apis/common": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@ng-web-apis/common/-/common-3.0.1.tgz", + "integrity": "sha512-pk0ibndaku/uip6MNST3/SA+sUcQZoajV2y4Mg6frfJzLq3wnKMQH25voL7wgG+XTaWvsS2OPDddPRFLn6qM7g==", + "dependencies": { + "tslib": "^2.2.0" + }, + "peerDependencies": { + "@angular/common": ">=12.0.0", + "@angular/core": ">=12.0.0", + "rxjs": ">=6.4.0" + } + }, + "node_modules/@taiga-ui/cdk/node_modules/@ng-web-apis/mutation-observer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-3.0.1.tgz", + "integrity": "sha512-ChzNd/Q4R+wZEHBIqnffX9BsWlHgLxhA0BtJ5OLLnBeUQ/A1O+6v20qfrVmjMzgFqB8SpF+0c9j6SpWpsZHjWw==", + "dependencies": { + "tslib": "^2.2.0" + }, + "peerDependencies": { + "@angular/core": ">=12.0.0", + "@ng-web-apis/common": ">=2.0.0" + } + }, + "node_modules/@taiga-ui/cdk/node_modules/@ng-web-apis/resize-observer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@ng-web-apis/resize-observer/-/resize-observer-3.0.1.tgz", + "integrity": "sha512-2rtkX3EeS0Qk6s1lzI5PaLYvDPuC4FT4WBS0yhmI6e8ipoJttNNB+sCLgd5aWarcMXMFWIcWqpmcJxzFFF73Fg==", + "dependencies": { + "tslib": "^2.2.0" + }, + "peerDependencies": { + "@angular/core": ">=12.0.0", + "@ng-web-apis/common": ">=2.0.0" + } + }, "node_modules/@taiga-ui/core": { - "version": "3.38.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.38.0.tgz", - "integrity": "sha512-7j5u15d5J8iOEVQY/xUGSvmoHkgRbBrzner6kCj4ZSsgP7Mu+yamDQmSJdRzORqpG/oOBwtjuXZTr9ic8NWEXQ==", + "version": "3.39.1", + "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.39.1.tgz", + "integrity": "sha512-ubFqZMpd6V/wo+i2RQ1nAs0QnnguNP08dHDu1Sdwgt+raTjJ6tIneBo8Ot9twQmomu5tGVm9id6JcF7NdCn3eQ==", "dependencies": { - "@taiga-ui/i18n": "^3.38.0", + "@taiga-ui/i18n": "^3.39.1", "tslib": ">=2.0.0" }, "peerDependencies": { @@ -4055,44 +4135,44 @@ "@angular/router": ">=12.0.0", "@ng-web-apis/common": ">=3.0.0", "@ng-web-apis/mutation-observer": ">=3.0.0", - "@taiga-ui/cdk": ">=3.38.0", - "@taiga-ui/i18n": ">=3.38.0", + "@taiga-ui/cdk": ">=3.39.1", + "@taiga-ui/i18n": ">=3.39.1", "@tinkoff/ng-event-plugins": ">=3.1.0", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/i18n": { - "version": "3.38.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.38.0.tgz", - "integrity": "sha512-jejqnDjLHbm23sZ0ypRoy7bWrL9W57ISH74ArRNa1fV0Z+H0oHlkgz7JxDwEF8qmOOdZoYOAIkgZLRCEs3Cz+w==", + "version": "3.39.1", + "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.39.1.tgz", + "integrity": "sha512-OoelgJCMZt5WdoT6ej+5ywip/7mBFU4AB2lQJTiO0hVCwhLvxQd6lEbQtKbt5uQzxZXGku+P4452DTP2zvW1mA==", "dependencies": { "tslib": ">=2.0.0" }, "peerDependencies": { "@angular/core": ">=12.0.0", - "@taiga-ui/cdk": ">=3.38.0" + "@taiga-ui/cdk": ">=3.39.1" } }, "node_modules/@taiga-ui/icons": { - "version": "3.38.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.38.0.tgz", - "integrity": "sha512-SRhcQaNG08a+MbISCMXBvu79mHrl7H7MCUSoP3fMy8Y3yyJqE0cchnaYZosijrEFR9mRzn0JrQ75Hpo1FaJf5w==", + "version": "3.39.1", + "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.39.1.tgz", + "integrity": "sha512-qlCeehk2EANlBNZY6/Ah2aXmmuWE/vveC44w85APIwWelxC+1JUFiGYu3mWqmUjpWy6UPNql8COmLpmldRICmw==", "dependencies": { "tslib": ">=2.0.0" }, "peerDependencies": { - "@taiga-ui/cdk": ">=3.38.0" + "@taiga-ui/cdk": ">=3.39.1" } }, "node_modules/@taiga-ui/kit": { - "version": "3.38.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.38.0.tgz", - "integrity": "sha512-CdsYhxNhiQfQPfxbAtbZYEcKR1VbyVvtFG071Ry8/DwhjyaC6BkYyyARJqjjxT6cn2gNmb8njbcuuENqGf/ZXw==", + "version": "3.39.1", + "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.39.1.tgz", + "integrity": "sha512-VuXx74QWmAw/HPyw/yIt5+3kLAGhMDqwTARIPteLCnnmEdqT52tB6eulamVKBmEtRbq8TPa21JxKCyaQuNa5VQ==", "dependencies": { - "@maskito/angular": "1.3.0", - "@maskito/core": "1.3.0", - "@maskito/kit": "1.3.0", + "@maskito/angular": "1.4.0", + "@maskito/core": "1.4.0", + "@maskito/kit": "1.4.0", "@ng-web-apis/intersection-observer": "3.1.1", "text-mask-core": "5.1.2", "tslib": ">=2.0.0" @@ -4105,9 +4185,9 @@ "@ng-web-apis/common": ">=3.0.0", "@ng-web-apis/mutation-observer": ">=3.0.0", "@ng-web-apis/resize-observer": ">=3.0.0", - "@taiga-ui/cdk": ">=3.38.0", - "@taiga-ui/core": ">=3.38.0", - "@taiga-ui/i18n": ">=3.38.0", + "@taiga-ui/cdk": ">=3.39.1", + "@taiga-ui/core": ">=3.39.1", + "@taiga-ui/i18n": ">=3.39.1", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } @@ -4279,13 +4359,13 @@ } }, "node_modules/@types/cron": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/cron/-/cron-2.0.1.tgz", - "integrity": "sha512-WHa/1rtNtD2Q/H0+YTTZoty+/5rcE66iAFX2IY+JuUoOACsevYyFkSYu/2vdw+G5LrmO7Lxowrqm0av4k3qWNQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/cron/-/cron-2.4.0.tgz", + "integrity": "sha512-5bBaAkqvSFBX8JMi/xCofNzG5E594TNsApMz68dLd/sQYz/HGQqgcxGHTRjOvD4G3Y+YF1Oo3S7QdCvKt1KAJQ==", + "deprecated": "This is a stub types definition. cron provides its own type definitions, so you do not need this installed.", "dev": true, "dependencies": { - "@types/luxon": "*", - "@types/node": "*" + "cron": "*" } }, "node_modules/@types/dompurify": { @@ -4297,9 +4377,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", + "version": "8.44.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", + "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", "dev": true, "dependencies": { "@types/estree": "*", @@ -4382,12 +4462,6 @@ "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, - "node_modules/@types/luxon": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.0.tgz", - "integrity": "sha512-uKRI5QORDnrGFYgcdAVnHvEIvEZ8noTpP/Bg+HeUzZghwinDlIS87DEenV5r1YoOF9G4x600YsUXLWZ19rmTmg==", - "dev": true - }, "node_modules/@types/marked": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.1.tgz", @@ -4413,9 +4487,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.16.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.19.tgz", - "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==", + "version": "18.17.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.3.tgz", + "integrity": "sha512-2x8HWtFk0S99zqVQABU9wTpr8wPoaDHZUcAkoTKH+nL7kPv3WUI9cRi/Kk5Mz4xdqXSqTkKP7IWNoQQYCnDsTA==", "dev": true }, "node_modules/@types/node-jose": { @@ -4802,9 +4876,9 @@ } }, "node_modules/agentkeepalive": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", - "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.4.0.tgz", + "integrity": "sha512-MysLRwkhsJTZKs+fsZIsTgBlr3IjQroonVJWMSqC9k3LS6f6ZifePl9fCqOtvc8p0CeYDSZVFvytdkwhOGaSZA==", "devOptional": true, "dependencies": { "debug": "^4.1.0", @@ -5120,42 +5194,51 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz", - "integrity": "sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA==", + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", + "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.1", - "@nicolo-ribaudo/semver-v6": "^6.3.3" + "@babel/helper-define-polyfill-provider": "^0.4.2", + "semver": "^6.3.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz", - "integrity": "sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ==", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", + "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.1", + "@babel/helper-define-polyfill-provider": "^0.4.2", "core-js-compat": "^3.31.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz", - "integrity": "sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", + "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.1" + "@babel/helper-define-polyfill-provider": "^0.4.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/balanced-match": { @@ -5357,9 +5440,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", "dev": true, "funding": [ { @@ -5376,9 +5459,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", "update-browserslist-db": "^1.0.11" }, "bin": { @@ -5510,9 +5593,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001514", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001514.tgz", - "integrity": "sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ==", + "version": "1.0.30001519", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz", + "integrity": "sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==", "dev": true, "funding": [ { @@ -6058,9 +6141,9 @@ } }, "node_modules/core-js": { - "version": "3.31.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.31.1.tgz", - "integrity": "sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==", + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.0.tgz", + "integrity": "sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -6068,9 +6151,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.31.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", - "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.0.tgz", + "integrity": "sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==", "dev": true, "dependencies": { "browserslist": "^4.21.9" @@ -6143,9 +6226,9 @@ "dev": true }, "node_modules/critters": { - "version": "0.0.19", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.19.tgz", - "integrity": "sha512-Fm4ZAXsG0VzWy1U30rP4qxbaWGSsqXDgSupJW1OUJGDAs0KWC+j37v7p5a2kZ9BPJvhRzWm3be+Hc9WvQOBUOw==", + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", + "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -6228,17 +6311,17 @@ } }, "node_modules/cron": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/cron/-/cron-2.3.1.tgz", - "integrity": "sha512-1eRRlIT0UfIqauwbG9pkg3J6CX9A6My2ytJWqAXoK0T9oJnUZTzGBNPxao0zjodIbPgf8UQWjE62BMb9eVllSQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cron/-/cron-2.4.0.tgz", + "integrity": "sha512-Cx77ic1TyIAtUggr0oAhtS8MLzPBUqGNIvdDM7jE3oFIxfe8LXWI9q3iQN/H2CebAiMir53LQKWOhEKnzkJTAQ==", "dependencies": { "luxon": "^3.2.1" } }, "node_modules/cronstrue": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.27.0.tgz", - "integrity": "sha512-p+w818EttA27EfIeZP5Z3k3ps9hy6DlRv3txbWxysTIlWEAE6DdYIjCaaeZhWaNfcowuXZrg0HVFWLTqGb85hg==", + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.28.0.tgz", + "integrity": "sha512-yByAR5on9i/p26djiSve4l29/AJkjCFDgopq+3gUVrQh2xgb3KKScofwkpf5XcRhuWAX0u0EuEK2nltB5hV1jQ==", "bin": { "cronstrue": "bin/cli.js" } @@ -6669,9 +6752,9 @@ } }, "node_modules/dompurify": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.6.tgz", - "integrity": "sha512-RQ9Ue979JnMiQ3a5E9KT3DLbUj9NCeulCZvVqnFRy+lj8j8sL9fmsUaGJTkhRts/74IM5HxPal5jaPjrTpH8zQ==" + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.7.tgz", + "integrity": "sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ==" }, "node_modules/domutils": { "version": "3.1.0", @@ -6745,9 +6828,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.454", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz", - "integrity": "sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==", + "version": "1.4.485", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.485.tgz", + "integrity": "sha512-1ndQ5IBNEnFirPwvyud69GHL+31FkE09gH/CJ6m3KCbkx3i0EVOrjwz4UNxRmN9H8OVHbC6vMRZGN1yCvjSs9w==", "dev": true }, "node_modules/elementtree": { @@ -7096,9 +7179,9 @@ } }, "node_modules/execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", "dev": true, "dependencies": { "cross-spawn": "^7.0.3", @@ -7431,9 +7514,9 @@ } }, "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", - "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "devOptional": true, "engines": { "node": ">=14" @@ -7800,9 +7883,9 @@ } }, "node_modules/globby/node_modules/fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -8425,9 +8508,9 @@ } }, "node_modules/immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.2.tgz", + "integrity": "sha512-oGXzbEDem9OOpDWZu88jGiYCvIsLHMvGw+8OXlpsvTFvIQplQbjg1B1cvKg8f7Hoch6+NGjpPsH1Fr+Mc2D1aA==", "dev": true }, "node_modules/import-fresh": { @@ -8659,9 +8742,9 @@ } }, "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "devOptional": true, "dependencies": { "has": "^1.0.3" @@ -8870,18 +8953,18 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/jackspeak": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", - "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.2.tgz", + "integrity": "sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==", "devOptional": true, "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -9153,9 +9236,9 @@ } }, "node_modules/less/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "optional": true, "bin": { @@ -9679,9 +9762,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -12565,9 +12648,9 @@ } }, "node_modules/rollup": { - "version": "3.26.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.2.tgz", - "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==", + "version": "3.27.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.27.2.tgz", + "integrity": "sha512-YGwmHf7h2oUHkVBT248x0yt6vZkYQ3/rvE5iQuVBh3WO8GcJ6BNeOkpoX1yMHIiBm18EMLjBPIoUDkhgnyxGOQ==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -13035,13 +13118,14 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/sigstore": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.7.0.tgz", - "integrity": "sha512-KP7QULhWdlu3hlp+jw2EvgWKlOGOY9McLj/jrchLjHNlNPK0KWIwF919cbmOp6QiKXLmPijR2qH/5KYWlbtG9Q==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.8.0.tgz", + "integrity": "sha512-ogU8qtQ3VFBawRJ8wjsBEX/vIFeHuGs1fm4jZtjWQwjo8pfAt7T/rh+udlAN4+QUe0IzA8qRSc/YZ7dHP6kh+w==", "devOptional": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.1.0", - "@sigstore/tuf": "^1.0.1", + "@sigstore/bundle": "^1.0.0", + "@sigstore/protobuf-specs": "^0.2.0", + "@sigstore/tuf": "^1.0.3", "make-fetch-happen": "^11.0.1" }, "bin": { @@ -13948,9 +14032,9 @@ } }, "node_modules/tslib": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" }, "node_modules/tslint": { "version": "6.1.3", @@ -14075,9 +14159,9 @@ } }, "node_modules/tslint/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -14426,6 +14510,7 @@ "version": "3.9.19", "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.19.tgz", "integrity": "sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==", + "deprecated": "The library contains critical security issues and should not be used for production! The maintenance of the project has been discontinued. Consider migrating your code to isolated-vm.", "dev": true, "dependencies": { "acorn": "^8.7.0", @@ -14474,9 +14559,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.88.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz", - "integrity": "sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==", + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", "dev": true, "peer": true, "dependencies": { @@ -15059,9 +15144,9 @@ } }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "engines": { "node": ">=0.10.0" diff --git a/frontend/package.json b/frontend/package.json index c37ed294d..3af80e3d1 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -44,11 +44,11 @@ "@materia-ui/ngx-monaco-editor": "^6.0.0", "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", - "@taiga-ui/addon-charts": "3.38.0", - "@taiga-ui/cdk": "3.38.0", - "@taiga-ui/core": "3.38.0", - "@taiga-ui/icons": "3.38.0", - "@taiga-ui/kit": "3.38.0", + "@taiga-ui/addon-charts": "3.39.1", + "@taiga-ui/cdk": "3.39.1", + "@taiga-ui/core": "3.39.1", + "@taiga-ui/icons": "3.39.1", + "@taiga-ui/kit": "3.39.1", "@tinkoff/ng-dompurify": "4.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", diff --git a/frontend/projects/shared/package.json b/frontend/projects/shared/package.json index 64e244562..008826d12 100644 --- a/frontend/projects/shared/package.json +++ b/frontend/projects/shared/package.json @@ -1,6 +1,6 @@ { "name": "@start9labs/shared", - "version": "0.3.2", + "version": "0.3.4", "peerDependencies": { "@angular/common": ">=13.2.0", "@angular/core": ">=13.2.0", diff --git a/frontend/projects/shared/src/components/initializing/logs-window/logs-window.component.ts b/frontend/projects/shared/src/components/initializing/logs-window/logs-window.component.ts index 6439ba062..449b89dcc 100644 --- a/frontend/projects/shared/src/components/initializing/logs-window/logs-window.component.ts +++ b/frontend/projects/shared/src/components/initializing/logs-window/logs-window.component.ts @@ -5,8 +5,7 @@ import { TuiDestroyService } from '@taiga-ui/cdk' import { SetupLogsService } from '../../../services/setup-logs.service' import { Log } from '../../../types/api' import { toLocalIsoString } from '../../../util/to-local-iso-string' - -const Convert = require('ansi-to-html') +import Convert from 'ansi-to-html' const convert = new Convert({ bg: 'transparent', }) diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 89f8e9548..05d2d293c 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -19,6 +19,7 @@ "target": "es2020", "module": "es2020", "lib": ["es2020", "dom"], + "allowSyntheticDefaultImports": true, "paths": { /* These paths are relative to each app base folder */ "@start9labs/marketplace": ["../marketplace/src/public-api"], From f7b079b1b4c2267bcdb9791fd313327095873b29 Mon Sep 17 00:00:00 2001 From: Matt Hill Date: Mon, 14 Aug 2023 07:39:07 -0600 Subject: [PATCH 014/169] start menu lol (#2389) * start menu lol * add icons, abstract header menu * chore: few tweaks --------- Co-authored-by: waterplea --- frontend/projects/shared/styles/taiga.scss | 3 +- .../components/card/card.component.html | 2 +- .../components/card/card.component.scss | 2 +- .../portal/components/card/card.component.ts | 16 ++++-- .../header-menu/header-menu.component.html | 56 +++++++++++++++++++ .../header-menu/header-menu.component.scss | 17 ++++++ .../header-menu/header-menu.component.ts | 22 ++++++++ .../components/header/header.component.html | 1 + .../components/header/header.component.scss | 3 +- .../components/header/header.component.ts | 17 +++++- .../navigation/navigation.component.html | 2 +- .../navigation/navigation.component.scss | 6 +- .../navigation/navigation.component.ts | 4 +- .../app/apps/portal/pipes/to-desktop-item.ts | 2 - .../ui/pages/system/proxies/proxies.page.html | 2 +- 15 files changed, 136 insertions(+), 19 deletions(-) create mode 100644 frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.html create mode 100644 frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.scss create mode 100644 frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts diff --git a/frontend/projects/shared/styles/taiga.scss b/frontend/projects/shared/styles/taiga.scss index 3cafeedfd..ed482baf7 100644 --- a/frontend/projects/shared/styles/taiga.scss +++ b/frontend/projects/shared/styles/taiga.scss @@ -80,7 +80,8 @@ tui-dropdown[data-appearance='start-os'][data-appearance='start-os'] { &::before { background: var(--tui-clear); box-shadow: 1rem 0 var(--tui-clear), -1rem 0 var(--tui-clear); - padding-top: 0.375rem; + padding-top: 0.375rem !important; + padding-bottom: 0 !important; } &::after { diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html index 899d83144..db497170b 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html +++ b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html @@ -2,7 +2,7 @@ - + = {} + get isService(): boolean { + return !this.id.includes('/') + } + @HostListener('click') onClick() { const { id, icon, title } = this diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.html b/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.html new file mode 100644 index 000000000..4690eb04f --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.html @@ -0,0 +1,56 @@ + + + + +

    StartOS

    + + + + + + + + + + + + + + +
    +
    +
    diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.scss b/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.scss new file mode 100644 index 000000000..37973ef33 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.scss @@ -0,0 +1,17 @@ +.item { + justify-content: flex-start; + gap: 0.75rem; +} + +.title { + margin: 0; + padding: 0 0.5rem 0.25rem; + white-space: nowrap; + font: var(--tui-font-text-l); + font-weight: bold; +} + +.external { + margin-left: auto; + padding-left: 0.5rem; +} diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts b/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts new file mode 100644 index 000000000..84daae18c --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts @@ -0,0 +1,22 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core' +import { + TuiButtonModule, + TuiDataListModule, + TuiHostedDropdownModule, + TuiSvgModule, +} from '@taiga-ui/core' + +@Component({ + selector: 'header-menu', + templateUrl: 'header-menu.component.html', + styleUrls: ['header-menu.component.scss'], + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + TuiHostedDropdownModule, + TuiDataListModule, + TuiSvgModule, + TuiButtonModule, + ], +}) +export class HeaderMenuComponent {} diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header.component.html b/frontend/projects/ui/src/app/apps/portal/components/header/header.component.html index 54abed9a7..f6f904187 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/header/header.component.html +++ b/frontend/projects/ui/src/app/apps/portal/components/header/header.component.html @@ -8,4 +8,5 @@ Notifications +
diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header.component.scss b/frontend/projects/ui/src/app/apps/portal/components/header/header.component.scss index e07f51a9c..71d68d68f 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/header/header.component.scss +++ b/frontend/projects/ui/src/app/apps/portal/components/header/header.component.scss @@ -5,9 +5,10 @@ padding: 0 1rem 0 2rem; font-size: 1.5rem; // TODO: Theme - background: rgb(51 51 51 / 74%); + background: rgb(51 51 51 / 84%); } .toolbar { + display: flex; margin-left: auto; } diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header.component.ts b/frontend/projects/ui/src/app/apps/portal/components/header/header.component.ts index 8e84d8f47..c8005f68d 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/header/header.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/components/header/header.component.ts @@ -1,6 +1,12 @@ import { ChangeDetectionStrategy, Component } from '@angular/core' import { TuiBadgedContentModule } from '@taiga-ui/kit' -import { TuiButtonModule } from '@taiga-ui/core' +import { + TuiButtonModule, + TuiDataListModule, + TuiHostedDropdownModule, + TuiSvgModule, +} from '@taiga-ui/core' +import { HeaderMenuComponent } from './header-menu/header-menu.component' @Component({ selector: 'header[appHeader]', @@ -8,6 +14,13 @@ import { TuiButtonModule } from '@taiga-ui/core' styleUrls: ['header.component.scss'], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, - imports: [TuiBadgedContentModule, TuiButtonModule], + imports: [ + TuiBadgedContentModule, + TuiButtonModule, + TuiHostedDropdownModule, + TuiDataListModule, + TuiSvgModule, + HeaderMenuComponent, + ], }) export class HeaderComponent {} diff --git a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html index 0fcd71661..d57dc2cfe 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html +++ b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html @@ -4,7 +4,7 @@ routerLinkActive="tab_active" [routerLinkActiveOptions]="{ exact: true }" > - Home + , id: string, diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html b/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html index 133765a87..b358ad465 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html @@ -105,7 +105,7 @@ [icon]="icon" > - + From 7a31d093563fa9f152245f6fcb16f0025706a363 Mon Sep 17 00:00:00 2001 From: J H <2364004+Blu-J@users.noreply.github.com> Date: Thu, 17 Aug 2023 12:49:06 -0600 Subject: [PATCH 015/169] feature: Include the start init files. This includes the docker commands to get things compressed. And this is the start of the rpc, but needs lots of work, or very little, not sure yet anymore. I beleive that the things that are missing are the rpc, and the effects. So, lots of work, but is still good to have I suppose. --- libs/start_init/.gitignore | 6 + libs/start_init/initSrc/CallbackHolder.ts | 22 + libs/start_init/initSrc/Effects.ts | 184 ++ libs/start_init/initSrc/Runtime.ts | 174 ++ libs/start_init/initSrc/index.ts | 35 + libs/start_init/package-lock.json | 2782 +++++++++++++++++++++ libs/start_init/package.json | 36 + libs/start_init/readme.md | 86 + libs/start_init/tsconfig.json | 26 + 9 files changed, 3351 insertions(+) create mode 100644 libs/start_init/.gitignore create mode 100644 libs/start_init/initSrc/CallbackHolder.ts create mode 100644 libs/start_init/initSrc/Effects.ts create mode 100644 libs/start_init/initSrc/Runtime.ts create mode 100644 libs/start_init/initSrc/index.ts create mode 100644 libs/start_init/package-lock.json create mode 100644 libs/start_init/package.json create mode 100644 libs/start_init/readme.md create mode 100644 libs/start_init/tsconfig.json diff --git a/libs/start_init/.gitignore b/libs/start_init/.gitignore new file mode 100644 index 000000000..e1584097d --- /dev/null +++ b/libs/start_init/.gitignore @@ -0,0 +1,6 @@ +node_modules/ +dist/ +bundle.js +startInit.js +service/ +service.js \ No newline at end of file diff --git a/libs/start_init/initSrc/CallbackHolder.ts b/libs/start_init/initSrc/CallbackHolder.ts new file mode 100644 index 000000000..16d4ac264 --- /dev/null +++ b/libs/start_init/initSrc/CallbackHolder.ts @@ -0,0 +1,22 @@ + + +export class CallbackHolder { + constructor() { + + } + private root = (Math.random() + 1).toString(36).substring(7); + private inc = 0 + private callbacks = new Map() + private newId() { + return this.root + (this.inc++).toString(36) + } + addCallback(callback: Function) { + return this.callbacks.set(this.newId(), callback); + } + callCallback(index: string, args: any[]): Promise { + const callback = this.callbacks.get(index) + if (!callback) throw new Error(`Callback ${index} does not exist`) + this.callbacks.delete(index) + return Promise.resolve().then(() => callback(...args)) + } +} \ No newline at end of file diff --git a/libs/start_init/initSrc/Effects.ts b/libs/start_init/initSrc/Effects.ts new file mode 100644 index 000000000..13eb9ce0d --- /dev/null +++ b/libs/start_init/initSrc/Effects.ts @@ -0,0 +1,184 @@ +import * as T from "@start9labs/start-sdk/lib/types" +import * as net from "net" +import { CallbackHolder } from "./CallbackHolder" + +const path = "/start9/sockets/rpcOut.sock" +const MAIN = "main" as const +export class Effects implements T.Effects { + constructor(readonly method: string, readonly callbackHolder: CallbackHolder) {} + id = 0 + rpcRound(method: string, params: unknown) { + const id = this.id++; + const client = net.createConnection(path, () => { + client.write(JSON.stringify({ + id, + method, + params + })); + }); + return new Promise((resolve, reject) => { + client.on('data', (data) => { + try { + resolve(JSON.parse(data.toString())?.result) + } catch (error) { + reject(error) + } + client.end(); + }); + }) + } + started= this.method !== MAIN ? null : ()=> { + return this.rpcRound('started', null) + } + bind(...[options]: Parameters) { + return this.rpcRound('bind', (options)) as ReturnType + } + clearBindings(...[]: Parameters) { + return this.rpcRound('clearBindings', null) as ReturnType + } + clearNetworkInterfaces( + ...[]: Parameters + ) { + return this.rpcRound('clearNetworkInterfaces', null) as ReturnType + } + executeAction(...[options]: Parameters) { + return this.rpcRound('executeAction', options) as ReturnType + } + exists(...[packageId]: Parameters) { + return this.rpcRound('exists', packageId) as ReturnType + } + exportAction(...[options]: Parameters) { + return this.rpcRound('exportAction', (options)) as ReturnType + } + exportNetworkInterface( + ...[options]: Parameters + ) { + return this.rpcRound('exportNetworkInterface', (options)) as ReturnType + } + exposeForDependents(...[options]: any) { + + return this.rpcRound('exposeForDependents', (null)) as ReturnType + } + exposeUi(...[options]: Parameters) { + + return this.rpcRound('exposeUi', (options)) as ReturnType + } + getConfigured(...[]: Parameters) { + + return this.rpcRound('getConfigured',null) as ReturnType + } + getContainerIp(...[]: Parameters) { + + return this.rpcRound('getContainerIp', null) as ReturnType + } + getHostnames: any = (...[allOptions]: any[]) => { + const options = { + ...allOptions, + callback: this.callbackHolder.addCallback(allOptions.callback) + } + return this.rpcRound('getHostnames', options) as ReturnType + } + getInterface(...[options]: Parameters) { + + return this.rpcRound('getInterface', {...options, callback: this.callbackHolder.addCallback(options.callback)}) as ReturnType + } + getIPHostname(...[]: Parameters) { + + return this.rpcRound('getIPHostname', (null)) as ReturnType + } + getLocalHostname(...[]: Parameters) { + + return this.rpcRound('getLocalHostname', null) as ReturnType + } + getPrimaryUrl(...[options]: Parameters) { + + return this.rpcRound('getPrimaryUrl', {...options, callback: this.callbackHolder.addCallback(options.callback)}) as ReturnType + } + getServicePortForward( + ...[options]: Parameters + ) { + + return this.rpcRound('getServicePortForward', (options)) as ReturnType + } + getServiceTorHostname( + ...[interfaceId, packageId]: Parameters + ) { + + return this.rpcRound('getServiceTorHostname', ({interfaceId, packageId})) as ReturnType + } + getSslCertificate(...[packageId, algorithm]: Parameters) { + + return this.rpcRound('getSslCertificate', ({packageId, algorithm})) as ReturnType + } + getSslKey(...[packageId, algorithm]: Parameters) { + + return this.rpcRound('getSslKey', ({packageId, algorithm})) as ReturnType + } + getSystemSmtp(...[options]: Parameters) { + + return this.rpcRound('getSystemSmtp', {...options, callback: this.callbackHolder.addCallback(options.callback)}) as ReturnType + } + is_sandboxed(...[]: Parameters) { + + return this.rpcRound('is_sandboxed', (null)) as ReturnType + } + listInterface(...[options]: Parameters) { + + return this.rpcRound('listInterface', {...options, callback: this.callbackHolder.addCallback(options.callback)}) as ReturnType + } + mount(...[options]: Parameters) { + + return this.rpcRound('mount', options) as ReturnType + } + removeAction(...[options]: Parameters) { + + return this.rpcRound('removeAction', options) as ReturnType + } + removeAddress(...[options]: Parameters) { + + return this.rpcRound('removeAddress', options) as ReturnType + } + restart(...[]: Parameters) { + + this.rpcRound('restart', null) + } + reverseProxy(...[options]: Parameters) { + + return this.rpcRound('reverseProxy', options) as ReturnType + } + running(...[packageId]: Parameters) { + + return this.rpcRound('running', {packageId}) as ReturnType + } + // runRsync(...[options]: Parameters) { + // + // return this.rpcRound('executeAction', options) as ReturnType + // + // return this.rpcRound('executeAction', options) as ReturnType + // } + setConfigured(...[configured]: Parameters) { + + return this.rpcRound('setConfigured', {configured}) as ReturnType + } + setDependencies(...[dependencies]: Parameters) { + + return this.rpcRound('setDependencies', {dependencies}) as ReturnType + } + setHealth(...[options]: Parameters) { + + return this.rpcRound('setHealth', options) as ReturnType + } + shutdown(...[]: Parameters) { + + return this.rpcRound('shutdown', null) + } + stopped(...[packageId]: Parameters) { + + return this.rpcRound('stopped', {packageId}) as ReturnType + } + store: T.Effects['store'] = { + get:(options) => this.rpcRound('getStore', {...options, callback: this.callbackHolder.addCallback(options.callback)}) as ReturnType, + set:(options) => this.rpcRound('setStore', options) as ReturnType + + } +} diff --git a/libs/start_init/initSrc/Runtime.ts b/libs/start_init/initSrc/Runtime.ts new file mode 100644 index 000000000..b40b987f5 --- /dev/null +++ b/libs/start_init/initSrc/Runtime.ts @@ -0,0 +1,174 @@ +// @ts-check + +import * as net from "net" +import { + object, + some, + string, + literal, + array, + number, + matches, +} from "ts-matches" +import { Effects } from "./Effects" +import { CallbackHolder } from "./CallbackHolder" + +import * as CP from "child_process" +import * as Mod from "module" + +const childProcesses = new Map() +let childProcessIndex = 0 +const require = Mod.prototype.require +const setupRequire = () => { + const requireChildProcessIndex = childProcessIndex++ + // @ts-ignore + Mod.prototype.require = (name, ...rest) => { + if (["child_process", "node:child_process"].indexOf(name) !== -1) { + return { + exec(...args: any[]) { + const returning = CP.exec.apply(null, args as any) + const childProcessArray = + childProcesses.get(requireChildProcessIndex) ?? [] + childProcessArray.push(returning) + childProcesses.set(requireChildProcessIndex, childProcessArray) + return returning + }, + execFile(...args: any[]) { + const returning = CP.execFile.apply(null, args as any) + const childProcessArray = + childProcesses.get(requireChildProcessIndex) ?? [] + childProcessArray.push(returning) + childProcesses.set(requireChildProcessIndex, childProcessArray) + return returning + }, + execFileSync: CP.execFileSync, + execSync: CP.execSync, + fork(...args: any[]) { + const returning = CP.fork.apply(null, args as any) + const childProcessArray = + childProcesses.get(requireChildProcessIndex) ?? [] + childProcessArray.push(returning) + childProcesses.set(requireChildProcessIndex, childProcessArray) + return returning + }, + spawn(...args: any[]) { + const returning = CP.spawn.apply(null, args as any) + const childProcessArray = + childProcesses.get(requireChildProcessIndex) ?? [] + childProcessArray.push(returning) + childProcesses.set(requireChildProcessIndex, childProcessArray) + return returning + }, + spawnSync: CP.spawnSync, + } as typeof CP + } + console.log("require", name) + return require(name, ...rest) + } + return requireChildProcessIndex +} + +const cleanupRequire = (requireChildProcessIndex: number) => { + const foundChildren = childProcesses.get(requireChildProcessIndex) + if (!foundChildren) return + childProcesses.delete(requireChildProcessIndex) + foundChildren.forEach((x) => x.kill()) +} + +const idType = some(string, number) +const path = "/start9/sockets/rpc.sock" +const runType = object({ + id: idType, + method: literal("run"), + params: object({ + methodName: string.map((x) => { + const splitValue = x.split("/") + if (splitValue.length === 1) + throw new Error(`X (${x}) is not a valid path`) + return splitValue.slice(1) + }), + methodArgs: object, + }), +}) +const callbackType = object({ + id: idType, + method: literal("callback"), + params: object({ + callback: string, + args: array, + }), +}) +const dealWithInput = async (callbackHolder: CallbackHolder, input: unknown) => + matches(input) + .when(runType, async ({ id, params: { methodName, methodArgs } }) => { + const index = setupRequire() + const effects = new Effects(`/${methodName.join("/")}`, callbackHolder) + // @ts-ignore + return import("/services/service.js") + .then((x) => methodName.reduce(reduceMethod(methodArgs, effects), x)) + .then() + .then((result) => ({ id, result })) + .catch((error) => ({ + id, + error: { message: error?.message ?? String(error) }, + })) + .finally(() => cleanupRequire(index)) + }) + .when(callbackType, async ({ id, params: { callback, args } }) => + Promise.resolve(callbackHolder.callCallback(callback, args)) + .then((result) => ({ id, result })) + .catch((error) => ({ + id, + error: { message: error?.message ?? String(error) }, + })), + ) + + .defaultToLazy(() => { + console.warn(`Coudln't parse the following input ${input}`) + return { + error: { message: "Could not figure out shape" }, + } + }) + +const jsonParse = (x: Buffer) => JSON.parse(x.toString()) +export class Runtime { + unixSocketServer = net.createServer(async (server) => {}) + private callbacks = new CallbackHolder() + constructor() { + this.unixSocketServer.listen(path) + + this.unixSocketServer.on("connection", (s) => { + s.on("data", (a) => + Promise.resolve(a) + .then(jsonParse) + .then(dealWithInput.bind(null, this.callbacks)) + .then((x) => { + console.log("x", JSON.stringify(x), typeof x) + return x + }) + .catch((error) => ({ + error: { message: error?.message ?? String(error) }, + })) + .then(JSON.stringify) + .then((x) => new Promise((resolve) => s.write("" + x, resolve))) + .finally(() => void s.end()), + ) + }) + } +} +function reduceMethod( + methodArgs: object, + effects: Effects, +): (previousValue: any, currentValue: string) => any { + return (x: any, method: string) => + Promise.resolve(x) + .then((x) => x[method]) + .then((x) => + typeof x !== "function" + ? x + : x({ + ...methodArgs, + effects, + }), + ) +} \ No newline at end of file diff --git a/libs/start_init/initSrc/index.ts b/libs/start_init/initSrc/index.ts new file mode 100644 index 000000000..8621daa5e --- /dev/null +++ b/libs/start_init/initSrc/index.ts @@ -0,0 +1,35 @@ +import { Runtime } from "./Runtime" + +new Runtime() + +/** + +So, this is going to be sent into a running comtainer along with any of the other node modules that are going to be needed and used. + +Once the container is started, we will go into a loading/ await state. +This is the init system, and it will always be running, and it will be waiting for a command to be sent to it. + +Each command will be a stopable promise. And an example is going to be something like an action/ main/ or just a query into the types. + +A command will be sent an object which are the effects, and the effects will be things like the file system, the network, the process, and the os. + + + */ +// So OS Adapter +// ============== + +/** +* Why: So when the we call from the os we enter or leave here? + + */ + +/** +Command: This is a command that the + +There are + */ + +/** +TODO: +Should I seperate those adapter in/out? + */ diff --git a/libs/start_init/package-lock.json b/libs/start_init/package-lock.json new file mode 100644 index 000000000..2ccaca591 --- /dev/null +++ b/libs/start_init/package-lock.json @@ -0,0 +1,2782 @@ +{ + "name": "start-init", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "start-init", + "version": "0.0.0", + "dependencies": { + "@iarna/toml": "^2.2.5", + "@start9labs/start-sdk": "=0.4.0-rev0.lib0.rc8.alpha3", + "esbuild": "0.18.4", + "esbuild-plugin-resolve": "^2.0.0", + "filebrowser": "^1.0.0", + "isomorphic-fetch": "^3.0.0", + "ts-matches": "^5.4.1", + "tslib": "^2.5.3", + "typescript": "^5.1.3", + "yaml": "^2.3.1" + }, + "devDependencies": { + "@swc/cli": "^0.1.62", + "@swc/core": "^1.3.65", + "@types/node": "^20.2.5", + "prettier": "^2.8.8", + "rollup": "^3.25.1" + } + }, + "../start-sdk": { + "name": "@start9labs/start-sdk", + "version": "0.4.0-rev0.lib0.rc5", + "extraneous": true, + "license": "MIT", + "dependencies": { + "@iarna/toml": "^2.2.5", + "ts-matches": "^5.4.1", + "yaml": "^2.2.2" + }, + "devDependencies": { + "@types/jest": "^29.4.0", + "jest": "^29.4.3", + "ts-jest": "^29.0.5", + "ts-node": "^10.9.1", + "tsc-multi": "^0.6.1", + "tsconfig-paths": "^3.14.2", + "typescript": "^5.0.4", + "vitest": "^0.29.2" + } + }, + "../tmp/service": { + "extraneous": true, + "dependencies": { + "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc7", + "filebrowser": "git+https://github.com/start9labs/filebrowser-wrapper.git#32e05d3d2157038b099329c11453b00d29ccca78", + "ts-matches": "^5.4.1" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "@vercel/ncc": "^0.36.1", + "prettier": "^2.8.4", + "typescript": "^5.1.3" + } + }, + "@start9labs/start-sdk@0.4.0-rev0.lib0.rc8.alpha1": { + "extraneous": true + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.4.tgz", + "integrity": "sha512-yKmQC9IiuvHdsNEbPHSprnMHg6OhL1cSeQZLzPpgzJBJ9ppEg9GAZN8MKj1TcmB4tZZUrq5xjK7KCmhwZP8iDA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.4.tgz", + "integrity": "sha512-yQVgO+V307hA2XhzELQ6F91CBGX7gSnlVGAj5YIqjQOxThDpM7fOcHT2YLJbE6gNdPtgRSafQrsK8rJ9xHCaZg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.4.tgz", + "integrity": "sha512-yLKXMxQg6sk1ntftxQ5uwyVgG4/S2E7UoOCc5N4YZW7fdkfRiYEXqm7CMuIfY2Vs3FTrNyKmSfNevIuIvJnMww==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.4.tgz", + "integrity": "sha512-MVPEoZjZpk2xQ1zckZrb8eQuQib+QCzdmMs3YZAYEQPg+Rztk5pUxGyk8htZOC8Z38NMM29W+MqY9Sqo/sDGKw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.4.tgz", + "integrity": "sha512-uEsRtYRUDsz7i2tXg/t/SyF+5gU1cvi9B6B8i5ebJgtUUHJYWyIPIesmIOL4/+bywjxsDMA/XrNFMgMffLnh5A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.4.tgz", + "integrity": "sha512-I8EOigqWnOHRin6Zp5Y1cfH3oT54bd7Sdz/VnpUNksbOtfp8IWRTH4pgkgO5jWaRQPjCpJcOpdRjYAMjPt8wXg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.4.tgz", + "integrity": "sha512-1bHfgMz/cNMjbpsYxjVgMJ1iwKq+NdDPlACBrWULD7ZdFmBQrhMicMaKb5CdmdVyvIwXmasOuF4r6Iq574kUTA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.4.tgz", + "integrity": "sha512-4XCGqM/Ay1LCXUBH59bL4JbSbbTK1K22dWHymWMGaEh2sQCDOUw+OQxozYV/YdBb91leK2NbuSrE2BRamwgaYw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.4.tgz", + "integrity": "sha512-J42vLHaYREyiBwH0eQE4/7H1DTfZx8FuxyWSictx4d7ezzuKE3XOkIvOg+SQzRz7T9HLVKzq2tvbAov4UfufBw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.4.tgz", + "integrity": "sha512-4ksIqFwhq7OExty7Sl1n0vqQSCqTG4sU6i99G2yuMr28CEOUZ/60N+IO9hwI8sIxBqmKmDgncE1n5CMu/3m0IA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.4.tgz", + "integrity": "sha512-bsWtoVHkGQgAsFXioDueXRiUIfSGrVkJjBBz4gcBJxXcD461cWFQFyu8Fxdj9TP+zEeqJ8C/O4LFFMBNi6Fscw==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.4.tgz", + "integrity": "sha512-LRD9Fu8wJQgIOOV1o3nRyzrheFYjxA0C1IVWZ93eNRRWBKgarYFejd5WBtrp43cE4y4D4t3qWWyklm73Mrsd/g==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.4.tgz", + "integrity": "sha512-jtQgoZjM92gauVRxNaaG/TpL3Pr4WcL3Pwqi9QgdrBGrEXzB+twohQiWNSTycs6lUygakos4mm2h0B9/SHveng==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.4.tgz", + "integrity": "sha512-7WaU/kRZG0VCV09Xdlkg6LNAsfU9SAxo6XEdaZ8ffO4lh+DZoAhGTx7+vTMOXKxa+r2w1LYDGxfJa2rcgagMRA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.4.tgz", + "integrity": "sha512-D19ed0xreKQvC5t+ArE2njSnm18WPpE+1fhwaiJHf+Xwqsq+/SUaV8Mx0M27nszdU+Atq1HahrgCOZCNNEASUg==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.4.tgz", + "integrity": "sha512-Rx3AY1sxyiO/gvCGP00nL69L60dfmWyjKWY06ugpB8Ydpdsfi3BHW58HWC24K3CAjAPSwxcajozC2PzA9JBS1g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.4.tgz", + "integrity": "sha512-AaShPmN9c6w1mKRpliKFlaWcSkpBT4KOlk93UfFgeI3F3cbjzdDKGsbKnOZozmYbE1izZKLmNJiW0sFM+A5JPA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.4.tgz", + "integrity": "sha512-tRGvGwou3BrvHVvF8HxTqEiC5VtPzySudS9fh2jBIKpLX7HCW8jIkW+LunkFDNwhslx4xMAgh0jAHsx/iCymaQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.4.tgz", + "integrity": "sha512-acORFDI95GKhmAnlH8EarBeuqoy/j3yxIU+FDB91H3+ZON+8HhTadtT450YkaMzX6lEWbhi+mjVUCj00M5yyOQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.4.tgz", + "integrity": "sha512-1NxP+iOk8KSvS1L9SSxEvBAJk39U0GiGZkiiJGbuDF9G4fG7DSDw6XLxZMecAgmvQrwwx7yVKdNN3GgNh0UfKg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.4.tgz", + "integrity": "sha512-OKr8jze93vbgqZ/r23woWciTixUwLa976C9W7yNBujtnVHyvsL/ocYG61tsktUfJOpyIz5TsohkBZ6Lo2+PCcQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.4.tgz", + "integrity": "sha512-qJr3wVvcLjPFcV4AMDS3iquhBfTef2zo/jlm8RMxmiRp3Vy2HY8WMxrykJlcbCnqLXZPA0YZxZGND6eug85ogg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" + }, + "node_modules/@mole-inc/bin-wrapper": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@mole-inc/bin-wrapper/-/bin-wrapper-8.0.1.tgz", + "integrity": "sha512-sTGoeZnjI8N4KS+sW2AN95gDBErhAguvkw/tWdCjeM8bvxpz5lqrnd0vOJABA1A+Ic3zED7PYoLP/RANLgVotA==", + "dev": true, + "dependencies": { + "bin-check": "^4.1.0", + "bin-version-check": "^5.0.0", + "content-disposition": "^0.5.4", + "ext-name": "^5.0.0", + "file-type": "^17.1.6", + "filenamify": "^5.0.2", + "got": "^11.8.5", + "os-filter-obj": "^2.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@start9labs/start-sdk": { + "version": "0.4.0-rev0.lib0.rc8.alpha3", + "resolved": "https://registry.npmjs.org/@start9labs/start-sdk/-/start-sdk-0.4.0-rev0.lib0.rc8.alpha3.tgz", + "integrity": "sha512-7thHf2iHJovkwsyKbd4lfV0/bOCv5vbPB3EYahPyLtN3rEY+siLDzu/Tmc7XdtsCKLVlLawqYkGPEakmaFs8FQ==", + "dependencies": { + "@iarna/toml": "^2.2.5", + "isomorphic-fetch": "^3.0.0", + "ts-matches": "^5.4.1", + "yaml": "^2.2.2" + } + }, + "node_modules/@swc/cli": { + "version": "0.1.62", + "resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.1.62.tgz", + "integrity": "sha512-kOFLjKY3XH1DWLfXL1/B5MizeNorHR8wHKEi92S/Zi9Md/AK17KSqR8MgyRJ6C1fhKHvbBCl8wboyKAFXStkYw==", + "dev": true, + "dependencies": { + "@mole-inc/bin-wrapper": "^8.0.1", + "commander": "^7.1.0", + "fast-glob": "^3.2.5", + "semver": "^7.3.8", + "slash": "3.0.0", + "source-map": "^0.7.3" + }, + "bin": { + "spack": "bin/spack.js", + "swc": "bin/swc.js", + "swcx": "bin/swcx.js" + }, + "engines": { + "node": ">= 12.13" + }, + "peerDependencies": { + "@swc/core": "^1.2.66", + "chokidar": "^3.5.1" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@swc/cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@swc/core": { + "version": "1.3.65", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.65.tgz", + "integrity": "sha512-d5iDiKWf12FBo6h9Fro2pcnLK6HSPbyZ7A1U5iFNpRRx8XEd4uGdKtf5NoXJ3GDLQDLXnNSLA82Cl6SfrJ1lyw==", + "dev": true, + "hasInstallScript": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.3.65", + "@swc/core-darwin-x64": "1.3.65", + "@swc/core-linux-arm-gnueabihf": "1.3.65", + "@swc/core-linux-arm64-gnu": "1.3.65", + "@swc/core-linux-arm64-musl": "1.3.65", + "@swc/core-linux-x64-gnu": "1.3.65", + "@swc/core-linux-x64-musl": "1.3.65", + "@swc/core-win32-arm64-msvc": "1.3.65", + "@swc/core-win32-ia32-msvc": "1.3.65", + "@swc/core-win32-x64-msvc": "1.3.65" + }, + "peerDependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.3.65", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.65.tgz", + "integrity": "sha512-fQIXZgr7CD/+1ADqrVbz/gHvSoIMmggHvPzguQjV8FggBuS9Efm1D1ZrdUSqptggKvuLLHMZf+49tENq8NWWcg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.3.65", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.65.tgz", + "integrity": "sha512-kGuWP7OP9mwOiIcJpEVa+ydC3Wxf0fPQ1MK0hUIPFcR6tAUEdOvdAuCzP6U20RX/JbbgwfI/Qq6ugT7VL6omgg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.3.65", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.65.tgz", + "integrity": "sha512-Bjbzldp8n4mWSdAvBt4VuLiHlfFM5pyftjJvJnmSY4H1IzbxkByyT60OHOedcIPRiZveD8NJzUJqutqrgTmtLg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.3.65", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.65.tgz", + "integrity": "sha512-GmxtcCymeQqEqT9n5mo857koRsUbEwmuijrBA4OeD5KOPW9gqAmUxr+ZgwgYHwyJ3CiN+UbK8uEqPsL6UVQmLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.3.65", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.65.tgz", + "integrity": "sha512-yv9jP3gbfMsYrqswT2MwK5Q1+avSwRXAKo+LYUknTeoLQNNlukDfqSLHajNq23XrVDRP4B3Pjn7kaqjxRcihbg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.3.65", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.65.tgz", + "integrity": "sha512-GQkwysEPTlAOQ3jiTiedObzh6pBaf9RLaQqpGdCp+iKze9+BR+STBP0IIKhZDMPG/nWWNhrYFD/VMQxRoYPjfw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.3.65", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.65.tgz", + "integrity": "sha512-ETzhOhtDluYFK4x73OTM9gVTMyzGd2WeWGlCu3WoT1EPPUwCqQpcAqI3TfEcP1ljFDG0pPkpYzVpwNf8yjQElg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.3.65", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.65.tgz", + "integrity": "sha512-3weD0I6F8bggN0KOnbZkvYC1PBrT5wrvohpvtgijRsODxjoWwztozjawJxF3rqgVqlSI/+nA+JkrN48e2cxJjQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.3.65", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.65.tgz", + "integrity": "sha512-i6c3D7E9Ca41HteW3+hn1OKQfjIabc2P0p1mJRXBkn+igwb+Ba6gXJc7NqhrlF8uZsDhhcGZTsAqBBtfcfTuHQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.3.65", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.65.tgz", + "integrity": "sha512-tQ9hEDtwPZxQ2sYb2n8ypfmdMjobKAf6VSnChteLMktofU7o562op5pLS6D6QCP2AtL3lcwe1piTCgIhk4vmjA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", + "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "dev": true + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.2.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", + "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==", + "dev": true + }, + "node_modules/@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/bin-check": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", + "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==", + "dev": true, + "dependencies": { + "execa": "^0.7.0", + "executable": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-version": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-6.0.0.tgz", + "integrity": "sha512-nk5wEsP4RiKjG+vF+uG8lFsEn4d7Y6FVDamzzftSunXOoOcOOkzcWdKVlGgFFwlUQCj63SgnUkLLGF8v7lufhw==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "find-versions": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bin-version-check": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-5.0.0.tgz", + "integrity": "sha512-Q3FMQnS5eZmrBGqmDXLs4dbAn/f+52voP6ykJYmweSA60t6DyH4UTSwZhtbK5UH+LBoWvDljILUQMLRUtsynsA==", + "dev": true, + "dependencies": { + "bin-version": "^6.0.0", + "semver": "^7.3.5", + "semver-truncate": "^2.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bin-version/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/bin-version/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/bin-version/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bin-version/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bin-version/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bin-version/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bin-version/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bin-version/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bin-version/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/esbuild": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.4.tgz", + "integrity": "sha512-9rxWV/Cb2DMUXfe9aUsYtqg0KTlw146ElFH22kYeK9KVV1qT082X4lpmiKsa12ePiCcIcB686TQJxaGAa9TFvA==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.4", + "@esbuild/android-arm64": "0.18.4", + "@esbuild/android-x64": "0.18.4", + "@esbuild/darwin-arm64": "0.18.4", + "@esbuild/darwin-x64": "0.18.4", + "@esbuild/freebsd-arm64": "0.18.4", + "@esbuild/freebsd-x64": "0.18.4", + "@esbuild/linux-arm": "0.18.4", + "@esbuild/linux-arm64": "0.18.4", + "@esbuild/linux-ia32": "0.18.4", + "@esbuild/linux-loong64": "0.18.4", + "@esbuild/linux-mips64el": "0.18.4", + "@esbuild/linux-ppc64": "0.18.4", + "@esbuild/linux-riscv64": "0.18.4", + "@esbuild/linux-s390x": "0.18.4", + "@esbuild/linux-x64": "0.18.4", + "@esbuild/netbsd-x64": "0.18.4", + "@esbuild/openbsd-x64": "0.18.4", + "@esbuild/sunos-x64": "0.18.4", + "@esbuild/win32-arm64": "0.18.4", + "@esbuild/win32-ia32": "0.18.4", + "@esbuild/win32-x64": "0.18.4" + } + }, + "node_modules/esbuild-plugin-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esbuild-plugin-resolve/-/esbuild-plugin-resolve-2.0.0.tgz", + "integrity": "sha512-eJy9B8yDW5X/J48eWtR1uVmv+DKfHvYYnrrcqQoe/nUkVHVOTZlJnSevkYyGOz6hI90t036Y5QIPDrGzmppxfg==" + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", + "dev": true, + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dev": true, + "dependencies": { + "mime-db": "^1.28.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "dev": true, + "dependencies": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-type": { + "version": "17.1.6", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-17.1.6.tgz", + "integrity": "sha512-hlDw5Ev+9e883s0pwUsuuYNu4tD7GgpUnOvykjv1Gya0ZIjuKumthDRua90VUn6/nlRKAjcxLUnHNTIUWwWIiw==", + "dev": true, + "dependencies": { + "readable-web-to-node-stream": "^3.0.2", + "strtok3": "^7.0.0-alpha.9", + "token-types": "^5.0.0-alpha.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/filebrowser": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/filebrowser/-/filebrowser-1.0.0.tgz", + "integrity": "sha512-RRONYpCDzbmWPhBX43T4dE+ptqLznJ7lKfbMaZLChB2i2ZIdFXoqT9qZTi70Dpq6fnJHuvcdeiRqMIPZKhVgTQ==", + "dependencies": { + "commander": "^2.9.0", + "content-disposition": "^0.5.1", + "express": "^4.14.0" + } + }, + "node_modules/filename-reserved-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz", + "integrity": "sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/filenamify": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-5.1.1.tgz", + "integrity": "sha512-M45CbrJLGACfrPOkrTp3j2EcO9OBkKUYME0eiqOCa7i2poaklU0jhlIaMlr8ijLorT0uLAzrn3qXOp5684CkfA==", + "dev": true, + "dependencies": { + "filename-reserved-regex": "^3.0.0", + "strip-outer": "^2.0.0", + "trim-repeated": "^2.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-versions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz", + "integrity": "sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==", + "dev": true, + "dependencies": { + "semver-regex": "^4.0.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "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" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isomorphic-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", + "dependencies": { + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-filter-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz", + "integrity": "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==", + "dev": true, + "dependencies": { + "arch": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/peek-readable": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", + "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dev": true, + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.25.1.tgz", + "integrity": "sha512-tywOR+rwIt5m2ZAWSe5AIJcTat8vGlnPFAv15ycCrw33t6iFsXZ6mzHVFh2psSjxQPmI+xgzMZZizUAukBI4aQ==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-regex": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", + "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver-truncate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-2.0.0.tgz", + "integrity": "sha512-Rh266MLDYNeML5h90ttdMwfXe1+Nc4LAWd9X1KdJe8pPHP4kFmvLZALtsMNHNdvTyQygbEC0D59sIz47DIaq8w==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-truncate/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", + "dev": true, + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==", + "dev": true, + "dependencies": { + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-outer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-2.0.0.tgz", + "integrity": "sha512-A21Xsm1XzUkK0qK1ZrytDUvqsQWict2Cykhvi0fBQntGG5JSprESasEyV1EZ/4CiR5WB5KjzLTrP/bO37B0wPg==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strtok3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", + "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", + "dev": true, + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/token-types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", + "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "dev": true, + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/trim-repeated": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-2.0.0.tgz", + "integrity": "sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ts-matches": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ts-matches/-/ts-matches-5.4.1.tgz", + "integrity": "sha512-kXrY75F0s0WD15N2bWKDScKlKgwnusN6dTRzGs1N7LlxQRnazrsBISC1HL4sy2adsyk65Zbx3Ui3IGN8leAFOQ==" + }, + "node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", + "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "engines": { + "node": ">= 14" + } + }, + "service": { + "extraneous": true, + "dependencies": { + "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc7", + "filebrowser": "git+https://github.com/start9labs/filebrowser-wrapper.git#32e05d3d2157038b099329c11453b00d29ccca78", + "ts-matches": "^5.4.1" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "@vercel/ncc": "^0.36.1", + "prettier": "^2.8.4", + "typescript": "^5.1.3" + } + } + } +} diff --git a/libs/start_init/package.json b/libs/start_init/package.json new file mode 100644 index 000000000..73f7c9cde --- /dev/null +++ b/libs/start_init/package.json @@ -0,0 +1,36 @@ +{ + "name": "start-init", + "version": "0.0.0", + "description": "We want to be the sdk intermitent for the system", + "scripts": { + "bundle:esbuild": "esbuild initSrc/index.ts --platform=node --bundle --outfile=startInit.js", + "bundle:service": "esbuild /service/startos/procedures/index.ts --platform=node --bundle --outfile=service.js", + "run:manifest": "esbuild /service/startos/procedures/index.ts --platform=node --bundle --outfile=service.js" + }, + "author": "", + "prettier": { + "trailingComma": "all", + "tabWidth": 2, + "semi": false, + "singleQuote": false + }, + "dependencies": { + "@iarna/toml": "^2.2.5", + "@start9labs/start-sdk": "=0.4.0-rev0.lib0.rc8.alpha3", + "esbuild": "0.18.4", + "esbuild-plugin-resolve": "^2.0.0", + "filebrowser": "^1.0.0", + "isomorphic-fetch": "^3.0.0", + "ts-matches": "^5.4.1", + "tslib": "^2.5.3", + "typescript": "^5.1.3", + "yaml": "^2.3.1" + }, + "devDependencies": { + "@swc/cli": "^0.1.62", + "@swc/core": "^1.3.65", + "@types/node": "^20.2.5", + "prettier": "^2.8.8", + "rollup": "^3.25.1" + } +} diff --git a/libs/start_init/readme.md b/libs/start_init/readme.md new file mode 100644 index 000000000..023091463 --- /dev/null +++ b/libs/start_init/readme.md @@ -0,0 +1,86 @@ +## Testing + +So, we are going to + +1. create a fake server +2. pretend socket server os (while the fake server is running) +3. Run a fake effects system (while 1/2 are running) + +In order to simulate that we created a server like the start-os and +a fake server (in this case I am using syncthing-wrapper) + +### TODO + +Undo the packing that I have done earlier, and hijack the embassy.js to use the bundle service + code + +Converting embassy.js -> service.js + +```sequence {theme="hand"} +startOs ->> startInit.js: Rpc Call +startInit.js ->> service.js: Rpc Converted into js code +``` + +### Create a fake server + +```bash +run_test () { + ( + set -e + libs=/home/jh/Projects/start-os/libs/start_init + sockets=/tmp/start9 + service=/home/jh/Projects/syncthing-wrapper + + docker run \ + -v $libs:/libs \ + -v $service:/service \ + -w /libs \ + --rm node:18-alpine \ + sh -c " + npm i && + npm run bundle:esbuild && + npm run bundle:service + " + + + + docker run \ + -v ./libs/start_init/:/libs \ + -w /libs \ + --rm node:18-alpine \ + sh -c " + npm i && + npm run bundle:esbuild + " + + + + rm -rf $sockets || true + mkdir -p $sockets/sockets + cd $service + docker run \ + -v $libs:/start-init \ + -v $sockets:/start9 \ + --rm -it $(docker build -q .) sh -c " + apk add nodejs && + node /start-init/bundleEs.js + " + ) +} +run_test +``` + +### Pretend Socket Server OS + +First we are going to create our fake server client with the bash then send it the json possible data + +```bash +sudo socat - unix-client:/tmp/start9/sockets/rpc.sock +``` + + +```json +{"id":"a","method":"run","params":{"methodName":"/dependencyMounts","methodArgs":[]}} +{"id":"a","method":"run","params":{"methodName":"/actions/test","methodArgs":{"input":{"id": 1}}}} +{"id":"b","method":"run","params":{"methodName":"/actions/test","methodArgs":{"id": 1}}} + +``` diff --git a/libs/start_init/tsconfig.json b/libs/start_init/tsconfig.json new file mode 100644 index 000000000..3af74fc39 --- /dev/null +++ b/libs/start_init/tsconfig.json @@ -0,0 +1,26 @@ +{ + "include": [ + "./**/*.mjs", + "./**/*.js", + "initSrc/Runtime.ts", + "initSrc/index.ts", + "effects.ts" + ], + "exclude": [], + "inputs": ["./lib/index.ts"], + "compilerOptions": { + "target": "es2022", + "module": "es2022", + "moduleResolution": "node", + "allowJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true + }, + "ts-node": { + "compilerOptions": { + "module": "commonjs" + } + } +} From 7e18aafe203d49440ee650724ca08385ce5f4799 Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Wed, 13 Sep 2023 22:52:25 +0400 Subject: [PATCH 016/169] feat(portal): add scrolling to the desktop (#2410) * feat(portal): add scrolling to the desktop * chore: comments * chore: fix --- frontend/package-lock.json | 179 ++++++++---------- frontend/package.json | 11 +- .../src/pages/list/search/search.module.ts | 4 +- .../pages/list/skeleton/skeleton.module.ts | 4 +- .../release-notes/release-notes.module.ts | 4 +- .../src/pages/show/about/about.module.ts | 4 +- .../show/additional/additional.module.ts | 4 +- .../show/dependencies/dependencies.module.ts | 4 +- .../src/app/pages/success/success.module.ts | 4 +- .../markdown/markdown.component.module.ts | 4 +- .../src/directives/drag-scroller.directive.ts | 60 ++++++ ...rective.ts => responsive-col.directive.ts} | 56 +++++- .../responsive-col.directive.ts | 56 ------ .../responsive-col/responsive-col.module.ts | 10 - .../{safe-links => }/safe-links.directive.ts | 1 + .../safe-links/safe-links.module.ts | 8 - frontend/projects/shared/src/public-api.ts | 8 +- frontend/projects/ui/src/app/app.module.ts | 4 +- .../portal/components/card/card.component.ts | 5 + .../drawer/drawer-item.directive.ts | 17 +- .../header-menu/header-menu.component.html | 2 +- .../header-menu/header-menu.component.ts | 14 +- .../app/apps/portal/pipes/to-desktop-item.ts | 4 +- .../routes/desktop/desktop.component.html | 52 ++--- .../routes/desktop/desktop.component.scss | 36 +++- .../portal/routes/desktop/desktop.module.ts | 4 + .../marketplace-list.module.ts | 4 +- .../services/app-list/app-list.module.ts | 4 +- .../services/app-show/app-show.module.ts | 4 +- .../os-update/os-update.page.module.ts | 4 +- .../apps/ui/pages/updates/updates.module.ts | 4 +- .../widget-list.component.module.ts | 4 +- 32 files changed, 326 insertions(+), 257 deletions(-) create mode 100644 frontend/projects/shared/src/directives/drag-scroller.directive.ts rename frontend/projects/shared/src/directives/{responsive-col/responsive-col-viewport.directive.ts => responsive-col.directive.ts} (55%) delete mode 100644 frontend/projects/shared/src/directives/responsive-col/responsive-col.directive.ts delete mode 100644 frontend/projects/shared/src/directives/responsive-col/responsive-col.module.ts rename frontend/projects/shared/src/directives/{safe-links => }/safe-links.directive.ts (97%) delete mode 100644 frontend/projects/shared/src/directives/safe-links/safe-links.module.ts diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 9420f3851..81545020d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -23,11 +23,12 @@ "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc8.beta2", - "@taiga-ui/addon-charts": "3.39.1", - "@taiga-ui/cdk": "3.39.1", - "@taiga-ui/core": "3.39.1", - "@taiga-ui/icons": "3.39.1", - "@taiga-ui/kit": "3.39.1", + "@taiga-ui/addon-charts": "3.44.0", + "@taiga-ui/cdk": "3.44.0", + "@taiga-ui/core": "3.44.0", + "@taiga-ui/experimental": "3.44.0", + "@taiga-ui/icons": "3.44.0", + "@taiga-ui/kit": "3.44.0", "@tinkoff/ng-dompurify": "4.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", @@ -3590,31 +3591,31 @@ "dev": true }, "node_modules/@maskito/angular": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-1.4.0.tgz", - "integrity": "sha512-JQqcqgHxF8pz8B6J69I7sbXGuM3DKfpmmaDO1MO0RPOWVDoH2tjuC/VBmSvjnR4sRlvJOsj1aHEQt6cVaSeTog==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-1.5.1.tgz", + "integrity": "sha512-unT8l4CLuehliS8alLYyPVLZHI+KyIm53Yll3yHJEtJy3Wz5rmCuj0h9IPaJ2clR/gXFAi5e5rLEX5SD1uWl4g==", "dependencies": { - "tslib": "^2.3.0" + "tslib": "2.6.2" }, "peerDependencies": { "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@angular/forms": ">=12.0.0", - "@maskito/core": "^1.4.0", + "@maskito/core": "^1.5.1", "rxjs": ">=6.0.0" } }, "node_modules/@maskito/core": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@maskito/core/-/core-1.4.0.tgz", - "integrity": "sha512-Q5o3vQ4c52VzJf6dvA1RgruMHM3uwPCjw2ghwJDNeU7W9xn/iuI61KN/kyuMeZDicRQwE+ddVokg2jEtYiPfJw==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@maskito/core/-/core-1.5.1.tgz", + "integrity": "sha512-AkwUyNjtf4cIAluJc459jf2YRVTVvreMNUpnStx6Kzne1DHf5RZUNeVba+6QYQHe0Mn0E8ftYoYOT5Ac8Wd1ow==" }, "node_modules/@maskito/kit": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-1.4.0.tgz", - "integrity": "sha512-1hILMNvXbX2GisdrvnFmqqWrjsD4jhUJUWAviIXUBXlxGuh++yqBxx07XEC6BwtYeMDxHD/dF0i5xQ9/oNdxcg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-1.5.1.tgz", + "integrity": "sha512-/jMMAAmjUqplY62+UGVNwXjK+7XihYRpw4C51WpszrSlH6Sj//bEDcLIA5iqkJD+cK5ROoEyQ63XDRo0D9tUGg==", "peerDependencies": { - "@maskito/core": "^1.4.0" + "@maskito/core": "^1.5.1" } }, "node_modules/@materia-ui/ngx-monaco-editor": { @@ -3633,7 +3634,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/@ng-web-apis/common/-/common-3.0.2.tgz", "integrity": "sha512-PWMegIsuxfmya8AgSx4fQR5mt4ozaSflJARN6I4W6kGKxX/MnHGt86+djN3P6KVoWjI+bcQt2UlF1jlW9DgWiQ==", - "peer": true, "dependencies": { "tslib": "^2.2.0" }, @@ -3644,9 +3644,9 @@ } }, "node_modules/@ng-web-apis/intersection-observer": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@ng-web-apis/intersection-observer/-/intersection-observer-3.1.1.tgz", - "integrity": "sha512-DjJK2LiZlfoS5IxeYCV8Qq+ebgEg5sAXRGWYyh/URDzKM6zZeYl+Wf09KVFW4NXgRUPcpBanhOL3DFAdMKEpaQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@ng-web-apis/intersection-observer/-/intersection-observer-3.1.2.tgz", + "integrity": "sha512-AojVoHWCS62lJ6LE4BHzyY9E0CXIX8OLmdBw4q6PBJOSZan4vlpup/f9Pl2FPMvw2tVu986IvORFShu1d98y0g==", "dependencies": { "tslib": "^2.2.0" }, @@ -3659,7 +3659,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-3.0.2.tgz", "integrity": "sha512-x1cq/Vznmz4aJ7STbZmA+4HCE+jxDiw2J359+iyiB+xyCVfZTECrJYP9g/hhzIRxyVPFznrPp61TDCRnLVyNWw==", - "peer": true, "dependencies": { "tslib": "^2.2.0" }, @@ -3672,7 +3671,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/@ng-web-apis/resize-observer/-/resize-observer-3.0.2.tgz", "integrity": "sha512-4aTZNHztwyJe4nJY/++0diUcd8jL7kQS+doPCREE6U4niM8Xvc98uK4qD340Faw9pmybkgsKD7EinyyPE5DIFQ==", - "peer": true, "dependencies": { "tslib": "^2.2.0" }, @@ -4042,9 +4040,9 @@ } }, "node_modules/@taiga-ui/addon-charts": { - "version": "3.39.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.39.1.tgz", - "integrity": "sha512-gWae4F0d4Ya4bvKmS6T16SNNkMwCXnsw3LeJhV5lx3jvNr6T8BGGsFZz/+HUrzNsCz+EWhWnZw/zIdusw+wgqg==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.44.0.tgz", + "integrity": "sha512-yC42GGVMBgAZm+6ej+UlQNO6Jl4JKT7cGRmz07Jvw+cd2KXDv6+A2cNqmI7EfJnig/3/Lfh560QIRz1uKcTQQw==", "dependencies": { "tslib": ">=2.0.0" }, @@ -4052,22 +4050,22 @@ "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@ng-web-apis/common": ">=3.0.0", - "@taiga-ui/cdk": ">=3.39.1", - "@taiga-ui/core": ">=3.39.1", + "@taiga-ui/cdk": ">=3.44.0", + "@taiga-ui/core": ">=3.44.0", "@tinkoff/ng-polymorpheus": ">=4.0.0" } }, "node_modules/@taiga-ui/cdk": { - "version": "3.39.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.39.1.tgz", - "integrity": "sha512-58DPLyB1bvFHcvn2f5TtXTML0acsXKzXRryyBwQcq3Y7m6DpzmLYWCtcqoYjKk2hN/MVn651GJ8oAqtMZxjmhQ==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.44.0.tgz", + "integrity": "sha512-sr0vqcuc/ziMjdQTcVPOayhmDwPp4GW1W3lBeUmmuXJpGm7DKrohA0CRUZG+2QZvw7ePVG/G2jBM8268k4I2mw==", "dependencies": { - "@ng-web-apis/common": "3.0.1", - "@ng-web-apis/mutation-observer": "3.0.1", - "@ng-web-apis/resize-observer": "3.0.1", + "@ng-web-apis/common": "3.0.2", + "@ng-web-apis/mutation-observer": "3.0.2", + "@ng-web-apis/resize-observer": "3.0.2", "@tinkoff/ng-event-plugins": "3.1.0", "@tinkoff/ng-polymorpheus": "4.1.0", - "tslib": "2.6.1" + "tslib": "2.6.2" }, "optionalDependencies": { "ng-morph": "2.2.5", @@ -4081,49 +4079,12 @@ "rxjs": ">=6.0.0" } }, - "node_modules/@taiga-ui/cdk/node_modules/@ng-web-apis/common": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@ng-web-apis/common/-/common-3.0.1.tgz", - "integrity": "sha512-pk0ibndaku/uip6MNST3/SA+sUcQZoajV2y4Mg6frfJzLq3wnKMQH25voL7wgG+XTaWvsS2OPDddPRFLn6qM7g==", - "dependencies": { - "tslib": "^2.2.0" - }, - "peerDependencies": { - "@angular/common": ">=12.0.0", - "@angular/core": ">=12.0.0", - "rxjs": ">=6.4.0" - } - }, - "node_modules/@taiga-ui/cdk/node_modules/@ng-web-apis/mutation-observer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-3.0.1.tgz", - "integrity": "sha512-ChzNd/Q4R+wZEHBIqnffX9BsWlHgLxhA0BtJ5OLLnBeUQ/A1O+6v20qfrVmjMzgFqB8SpF+0c9j6SpWpsZHjWw==", - "dependencies": { - "tslib": "^2.2.0" - }, - "peerDependencies": { - "@angular/core": ">=12.0.0", - "@ng-web-apis/common": ">=2.0.0" - } - }, - "node_modules/@taiga-ui/cdk/node_modules/@ng-web-apis/resize-observer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@ng-web-apis/resize-observer/-/resize-observer-3.0.1.tgz", - "integrity": "sha512-2rtkX3EeS0Qk6s1lzI5PaLYvDPuC4FT4WBS0yhmI6e8ipoJttNNB+sCLgd5aWarcMXMFWIcWqpmcJxzFFF73Fg==", - "dependencies": { - "tslib": "^2.2.0" - }, - "peerDependencies": { - "@angular/core": ">=12.0.0", - "@ng-web-apis/common": ">=2.0.0" - } - }, "node_modules/@taiga-ui/core": { - "version": "3.39.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.39.1.tgz", - "integrity": "sha512-ubFqZMpd6V/wo+i2RQ1nAs0QnnguNP08dHDu1Sdwgt+raTjJ6tIneBo8Ot9twQmomu5tGVm9id6JcF7NdCn3eQ==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.44.0.tgz", + "integrity": "sha512-rd8+uADy38iIBjoVvUs5fH2oDGBVb0S/eb/PynQB5vh5zddGFsg10mGfjqtUKoLCdrMmlIVfSJ2Fv0AbibsIaQ==", "dependencies": { - "@taiga-ui/i18n": "^3.39.1", + "@taiga-ui/i18n": "^3.44.0", "tslib": ">=2.0.0" }, "peerDependencies": { @@ -4135,45 +4096,63 @@ "@angular/router": ">=12.0.0", "@ng-web-apis/common": ">=3.0.0", "@ng-web-apis/mutation-observer": ">=3.0.0", - "@taiga-ui/cdk": ">=3.39.1", - "@taiga-ui/i18n": ">=3.39.1", + "@taiga-ui/cdk": ">=3.44.0", + "@taiga-ui/i18n": ">=3.44.0", "@tinkoff/ng-event-plugins": ">=3.1.0", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } }, + "node_modules/@taiga-ui/experimental": { + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/experimental/-/experimental-3.44.0.tgz", + "integrity": "sha512-fR//2I2FwPPomAyoJSTb+Mla/WOmSZyhnjBVqTZ1jAEbZEmEYwYFMWmWCCorfGiHQhJz0W9d+A22/04FEn94BA==", + "dependencies": { + "tslib": ">=2.0.0" + }, + "peerDependencies": { + "@angular/common": ">=12.0.0", + "@angular/core": ">=12.0.0", + "@taiga-ui/cdk": ">=3.44.0", + "@taiga-ui/core": ">=3.44.0", + "@taiga-ui/kit": ">=3.44.0", + "@tinkoff/ng-polymorpheus": ">=4.0.0", + "rxjs": ">=6.0.0" + } + }, "node_modules/@taiga-ui/i18n": { - "version": "3.39.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.39.1.tgz", - "integrity": "sha512-OoelgJCMZt5WdoT6ej+5ywip/7mBFU4AB2lQJTiO0hVCwhLvxQd6lEbQtKbt5uQzxZXGku+P4452DTP2zvW1mA==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.44.0.tgz", + "integrity": "sha512-SzjCLKxhGicGEdTPcI6wCtJyoA+SdTZiimzvf1Xt03B+CCc/2rqsPL45XVlnVAwX4lyZUq0mHiA/OcxPlIme+Q==", "dependencies": { "tslib": ">=2.0.0" }, "peerDependencies": { "@angular/core": ">=12.0.0", - "@taiga-ui/cdk": ">=3.39.1" + "@ng-web-apis/common": ">=3.0.0", + "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/icons": { - "version": "3.39.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.39.1.tgz", - "integrity": "sha512-qlCeehk2EANlBNZY6/Ah2aXmmuWE/vveC44w85APIwWelxC+1JUFiGYu3mWqmUjpWy6UPNql8COmLpmldRICmw==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.44.0.tgz", + "integrity": "sha512-hVWZfPQrGRG1MywuNwRh0jzOJsUFDMiRvdqZrLSs1iQBH/lwEQAZ2KoLHEgGt0GOTwK9DzgXIKVo4bwexs+EmA==", "dependencies": { "tslib": ">=2.0.0" }, "peerDependencies": { - "@taiga-ui/cdk": ">=3.39.1" + "@taiga-ui/cdk": ">=3.44.0" } }, "node_modules/@taiga-ui/kit": { - "version": "3.39.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.39.1.tgz", - "integrity": "sha512-VuXx74QWmAw/HPyw/yIt5+3kLAGhMDqwTARIPteLCnnmEdqT52tB6eulamVKBmEtRbq8TPa21JxKCyaQuNa5VQ==", - "dependencies": { - "@maskito/angular": "1.4.0", - "@maskito/core": "1.4.0", - "@maskito/kit": "1.4.0", - "@ng-web-apis/intersection-observer": "3.1.1", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.44.0.tgz", + "integrity": "sha512-klWCWT9IizqJAzCc+XauiTFmX11Qz2zwxvfpLZwAtVWz/cmllf05gL5ynL0LIXhGrzu+2YVQRys9cej2yN2G9Q==", + "dependencies": { + "@maskito/angular": "1.5.1", + "@maskito/core": "1.5.1", + "@maskito/kit": "1.5.1", + "@ng-web-apis/intersection-observer": "3.1.2", "text-mask-core": "5.1.2", "tslib": ">=2.0.0" }, @@ -4185,9 +4164,9 @@ "@ng-web-apis/common": ">=3.0.0", "@ng-web-apis/mutation-observer": ">=3.0.0", "@ng-web-apis/resize-observer": ">=3.0.0", - "@taiga-ui/cdk": ">=3.39.1", - "@taiga-ui/core": ">=3.39.1", - "@taiga-ui/i18n": ">=3.39.1", + "@taiga-ui/cdk": ">=3.44.0", + "@taiga-ui/core": ">=3.44.0", + "@taiga-ui/i18n": ">=3.44.0", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } @@ -14032,9 +14011,9 @@ } }, "node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tslint": { "version": "6.1.3", diff --git a/frontend/package.json b/frontend/package.json index 3af80e3d1..b21673832 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -44,11 +44,12 @@ "@materia-ui/ngx-monaco-editor": "^6.0.0", "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", - "@taiga-ui/addon-charts": "3.39.1", - "@taiga-ui/cdk": "3.39.1", - "@taiga-ui/core": "3.39.1", - "@taiga-ui/icons": "3.39.1", - "@taiga-ui/kit": "3.39.1", + "@taiga-ui/addon-charts": "3.44.0", + "@taiga-ui/cdk": "3.44.0", + "@taiga-ui/core": "3.44.0", + "@taiga-ui/experimental": "3.44.0", + "@taiga-ui/icons": "3.44.0", + "@taiga-ui/kit": "3.44.0", "@tinkoff/ng-dompurify": "4.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", diff --git a/frontend/projects/marketplace/src/pages/list/search/search.module.ts b/frontend/projects/marketplace/src/pages/list/search/search.module.ts index 32aad93bb..d0072bc02 100644 --- a/frontend/projects/marketplace/src/pages/list/search/search.module.ts +++ b/frontend/projects/marketplace/src/pages/list/search/search.module.ts @@ -2,12 +2,12 @@ import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' import { FormsModule } from '@angular/forms' import { IonicModule } from '@ionic/angular' -import { ResponsiveColModule } from '@start9labs/shared' +import { ResponsiveColDirective } from '@start9labs/shared' import { SearchComponent } from './search.component' @NgModule({ - imports: [IonicModule, FormsModule, CommonModule, ResponsiveColModule], + imports: [IonicModule, FormsModule, CommonModule, ResponsiveColDirective], declarations: [SearchComponent], exports: [SearchComponent], }) diff --git a/frontend/projects/marketplace/src/pages/list/skeleton/skeleton.module.ts b/frontend/projects/marketplace/src/pages/list/skeleton/skeleton.module.ts index 434b17f1e..9df2a3596 100644 --- a/frontend/projects/marketplace/src/pages/list/skeleton/skeleton.module.ts +++ b/frontend/projects/marketplace/src/pages/list/skeleton/skeleton.module.ts @@ -1,12 +1,12 @@ import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' import { IonicModule } from '@ionic/angular' -import { ResponsiveColModule } from '@start9labs/shared' +import { ResponsiveColDirective } from '@start9labs/shared' import { SkeletonComponent } from './skeleton.component' @NgModule({ - imports: [CommonModule, IonicModule, ResponsiveColModule], + imports: [CommonModule, IonicModule, ResponsiveColDirective], declarations: [SkeletonComponent], exports: [SkeletonComponent], }) diff --git a/frontend/projects/marketplace/src/pages/release-notes/release-notes.module.ts b/frontend/projects/marketplace/src/pages/release-notes/release-notes.module.ts index 59ec09c96..ae554f156 100644 --- a/frontend/projects/marketplace/src/pages/release-notes/release-notes.module.ts +++ b/frontend/projects/marketplace/src/pages/release-notes/release-notes.module.ts @@ -4,7 +4,7 @@ import { IonicModule } from '@ionic/angular' import { EmverPipesModule, MarkdownPipeModule, - SafeLinksModule, + SafeLinksDirective, TextSpinnerComponentModule, } from '@start9labs/shared' import { TuiElementModule } from '@taiga-ui/cdk' @@ -21,7 +21,7 @@ import { ReleaseNotesComponent } from './release-notes.component' MarkdownPipeModule, TuiElementModule, NgDompurifyModule, - SafeLinksModule, + SafeLinksDirective, ], declarations: [ReleaseNotesComponent], exports: [ReleaseNotesComponent], diff --git a/frontend/projects/marketplace/src/pages/show/about/about.module.ts b/frontend/projects/marketplace/src/pages/show/about/about.module.ts index cc7d4f234..24ff139ed 100644 --- a/frontend/projects/marketplace/src/pages/show/about/about.module.ts +++ b/frontend/projects/marketplace/src/pages/show/about/about.module.ts @@ -5,7 +5,7 @@ import { IonicModule } from '@ionic/angular' import { EmverPipesModule, MarkdownPipeModule, - SafeLinksModule, + SafeLinksDirective, } from '@start9labs/shared' import { NgDompurifyModule } from '@tinkoff/ng-dompurify' @@ -19,7 +19,7 @@ import { AboutComponent } from './about.component' MarkdownPipeModule, EmverPipesModule, NgDompurifyModule, - SafeLinksModule, + SafeLinksDirective, ], declarations: [AboutComponent], exports: [AboutComponent], diff --git a/frontend/projects/marketplace/src/pages/show/additional/additional.module.ts b/frontend/projects/marketplace/src/pages/show/additional/additional.module.ts index 640d9e7d4..208175eb3 100644 --- a/frontend/projects/marketplace/src/pages/show/additional/additional.module.ts +++ b/frontend/projects/marketplace/src/pages/show/additional/additional.module.ts @@ -1,7 +1,7 @@ import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' import { IonicModule } from '@ionic/angular' -import { MarkdownModule, ResponsiveColModule } from '@start9labs/shared' +import { MarkdownModule, ResponsiveColDirective } from '@start9labs/shared' import { AdditionalComponent } from './additional.component' import { @@ -16,7 +16,7 @@ import { TuiButtonModule } from '@taiga-ui/core' CommonModule, IonicModule, MarkdownModule, - ResponsiveColModule, + ResponsiveColDirective, TuiRadioListModule, FormsModule, TuiStringifyContentPipeModule, diff --git a/frontend/projects/marketplace/src/pages/show/dependencies/dependencies.module.ts b/frontend/projects/marketplace/src/pages/show/dependencies/dependencies.module.ts index abb3032e9..1d8e403c8 100644 --- a/frontend/projects/marketplace/src/pages/show/dependencies/dependencies.module.ts +++ b/frontend/projects/marketplace/src/pages/show/dependencies/dependencies.module.ts @@ -4,7 +4,7 @@ import { RouterModule } from '@angular/router' import { IonicModule } from '@ionic/angular' import { EmverPipesModule, - ResponsiveColModule, + ResponsiveColDirective, SharedPipesModule, } from '@start9labs/shared' @@ -17,7 +17,7 @@ import { DependenciesComponent } from './dependencies.component' IonicModule, SharedPipesModule, EmverPipesModule, - ResponsiveColModule, + ResponsiveColDirective, ], declarations: [DependenciesComponent], exports: [DependenciesComponent], diff --git a/frontend/projects/setup-wizard/src/app/pages/success/success.module.ts b/frontend/projects/setup-wizard/src/app/pages/success/success.module.ts index c0a7a0ec2..ef937ded7 100644 --- a/frontend/projects/setup-wizard/src/app/pages/success/success.module.ts +++ b/frontend/projects/setup-wizard/src/app/pages/success/success.module.ts @@ -2,7 +2,7 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { IonicModule } from '@ionic/angular' import { FormsModule } from '@angular/forms' -import { ResponsiveColModule } from '@start9labs/shared' +import { ResponsiveColDirective } from '@start9labs/shared' import { SuccessPage } from './success.page' import { PasswordPageModule } from '../../modals/password/password.module' @@ -16,7 +16,7 @@ import { DownloadDocComponent } from './download-doc/download-doc.component' IonicModule, PasswordPageModule, SuccessPageRoutingModule, - ResponsiveColModule, + ResponsiveColDirective, ], declarations: [SuccessPage, DownloadDocComponent], exports: [SuccessPage], diff --git a/frontend/projects/shared/src/components/markdown/markdown.component.module.ts b/frontend/projects/shared/src/components/markdown/markdown.component.module.ts index 8b8e3a6fe..e643ee2e8 100644 --- a/frontend/projects/shared/src/components/markdown/markdown.component.module.ts +++ b/frontend/projects/shared/src/components/markdown/markdown.component.module.ts @@ -4,7 +4,7 @@ import { IonicModule } from '@ionic/angular' import { NgDompurifyModule } from '@tinkoff/ng-dompurify' import { MarkdownPipeModule } from '../../pipes/markdown/markdown.module' -import { SafeLinksModule } from '../../directives/safe-links/safe-links.module' +import { SafeLinksDirective } from '../../directives/safe-links.directive' import { TextSpinnerComponentModule } from '../text-spinner/text-spinner.component.module' import { MarkdownComponent } from './markdown.component' @@ -15,7 +15,7 @@ import { MarkdownComponent } from './markdown.component' IonicModule, MarkdownPipeModule, TextSpinnerComponentModule, - SafeLinksModule, + SafeLinksDirective, NgDompurifyModule, ], exports: [MarkdownComponent], diff --git a/frontend/projects/shared/src/directives/drag-scroller.directive.ts b/frontend/projects/shared/src/directives/drag-scroller.directive.ts new file mode 100644 index 000000000..c70c41d75 --- /dev/null +++ b/frontend/projects/shared/src/directives/drag-scroller.directive.ts @@ -0,0 +1,60 @@ +import { + Directive, + ElementRef, + HostListener, + inject, + NgZone, +} from '@angular/core' +import { DOCUMENT } from '@angular/common' +import { ANIMATION_FRAME } from '@ng-web-apis/common' +import { takeUntilDestroyed } from '@angular/core/rxjs-interop' +import { tuiZonefree } from '@taiga-ui/cdk' +import { filter } from 'rxjs' + +const SIZE = 100 +const SPEED = 15 + +@Directive({ + selector: '[dragScroller]', + standalone: true, +}) +export class DragScrollerDirective { + private readonly element: HTMLElement = inject(ElementRef).nativeElement + private dragging = false + private x = 0 + private y = 0 + + private readonly sub = inject(ANIMATION_FRAME) + .pipe( + filter(() => this.dragging), + tuiZonefree(inject(NgZone)), + takeUntilDestroyed(), + ) + .subscribe(() => { + this.element.scrollTop += this.y * SPEED + this.element.scrollLeft += this.x * SPEED + }) + + @HostListener('document:pointerdown.silent', ['true']) + @HostListener('document:pointerup.silent', ['false']) + onPointer(dragging: boolean) { + this.dragging = dragging + this.x = 0 + this.y = 0 + } + + @HostListener('pointermove.silent', ['$event']) + onPointerMove(event: PointerEvent) { + if (!this.dragging) { + return + } + + const { clientX, clientY } = event + const { top, left, right, bottom } = this.element.getBoundingClientRect() + const x = Math.min(clientX - left, SIZE) - Math.min(right - clientX, SIZE) + const y = Math.min(clientY - top, SIZE) - Math.min(bottom - clientY, SIZE) + + this.x = x / SIZE + this.y = y / SIZE + } +} diff --git a/frontend/projects/shared/src/directives/responsive-col/responsive-col-viewport.directive.ts b/frontend/projects/shared/src/directives/responsive-col.directive.ts similarity index 55% rename from frontend/projects/shared/src/directives/responsive-col/responsive-col-viewport.directive.ts rename to frontend/projects/shared/src/directives/responsive-col.directive.ts index aeded81ac..56e92627d 100644 --- a/frontend/projects/shared/src/directives/responsive-col/responsive-col-viewport.directive.ts +++ b/frontend/projects/shared/src/directives/responsive-col.directive.ts @@ -1,5 +1,7 @@ import { Directive, + OnInit, + Optional, ElementRef, Inject, InjectionToken, @@ -8,10 +10,14 @@ import { } from '@angular/core' import { ResizeObserverService } from '@ng-web-apis/resize-observer' import { distinctUntilChanged, map, Observable } from 'rxjs' -import { tuiZonefree } from '@taiga-ui/cdk' +import { tuiZonefree, TuiDestroyService } from '@taiga-ui/cdk' +import { IonCol } from '@ionic/angular' +import { takeUntil } from 'rxjs' export type Step = 'xs' | 'sm' | 'md' | 'lg' | 'xl' +const SIZE: readonly Step[] = ['xl', 'lg', 'md', 'sm', 'xs'] + /** * Not exported: * https://github.com/ionic-team/ionic-framework/blob/main/core/src/utils/media.ts @@ -41,6 +47,7 @@ export const BREAKPOINTS = new InjectionToken( selector: '[responsiveColViewport]', exportAs: 'viewport', providers: [ResizeObserverService], + standalone: true, }) export class ResponsiveColViewportDirective extends Observable { @Input() @@ -65,3 +72,50 @@ export class ResponsiveColViewportDirective extends Observable { tuiZonefree(this.zone), ) } + +@Directive({ + selector: 'ion-col[responsiveCol]', + providers: [TuiDestroyService], + standalone: true, +}) +export class ResponsiveColDirective implements OnInit { + readonly size: Record = { + xs: '12', + sm: '6', + md: '4', + lg: '3', + xl: '2', + } + + constructor( + @Optional() + viewport$: ResponsiveColViewportDirective | null, + destroy$: TuiDestroyService, + private readonly col: IonCol, + ) { + viewport$?.pipe(takeUntil(destroy$)).subscribe(size => { + const max = this.size[size] || this.findMax(size) + + this.col.sizeLg = max + this.col.sizeMd = max + this.col.sizeSm = max + this.col.sizeXl = max + this.col.sizeXs = max + }) + } + + ngOnInit() { + this.size.lg = this.col.sizeLg + this.size.md = this.col.sizeMd + this.size.sm = this.col.sizeSm + this.size.xl = this.col.sizeXl + this.size.xs = this.col.sizeXs + } + + private findMax(current: Step): string | undefined { + const start = SIZE.indexOf(current) - 1 + const max = SIZE.find((size, i) => i > start && this.size[size]) || current + + return this.size[max] + } +} diff --git a/frontend/projects/shared/src/directives/responsive-col/responsive-col.directive.ts b/frontend/projects/shared/src/directives/responsive-col/responsive-col.directive.ts deleted file mode 100644 index fbe7dc896..000000000 --- a/frontend/projects/shared/src/directives/responsive-col/responsive-col.directive.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Directive, OnInit, Optional } from '@angular/core' -import { TuiDestroyService } from '@taiga-ui/cdk' -import { - ResponsiveColViewportDirective, - Step, -} from './responsive-col-viewport.directive' -import { IonCol } from '@ionic/angular' -import { takeUntil } from 'rxjs' - -const SIZE: readonly Step[] = ['xl', 'lg', 'md', 'sm', 'xs'] - -@Directive({ - selector: 'ion-col[responsiveCol]', - providers: [TuiDestroyService], -}) -export class ResponsiveColDirective implements OnInit { - readonly size: Record = { - xs: '12', - sm: '6', - md: '4', - lg: '3', - xl: '2', - } - - constructor( - @Optional() - viewport$: ResponsiveColViewportDirective | null, - destroy$: TuiDestroyService, - private readonly col: IonCol, - ) { - viewport$?.pipe(takeUntil(destroy$)).subscribe(size => { - const max = this.size[size] || this.findMax(size) - - this.col.sizeLg = max - this.col.sizeMd = max - this.col.sizeSm = max - this.col.sizeXl = max - this.col.sizeXs = max - }) - } - - ngOnInit() { - this.size.lg = this.col.sizeLg - this.size.md = this.col.sizeMd - this.size.sm = this.col.sizeSm - this.size.xl = this.col.sizeXl - this.size.xs = this.col.sizeXs - } - - private findMax(current: Step): string | undefined { - const start = SIZE.indexOf(current) - 1 - const max = SIZE.find((size, i) => i > start && this.size[size]) || current - - return this.size[max] - } -} diff --git a/frontend/projects/shared/src/directives/responsive-col/responsive-col.module.ts b/frontend/projects/shared/src/directives/responsive-col/responsive-col.module.ts deleted file mode 100644 index 9b87b16dc..000000000 --- a/frontend/projects/shared/src/directives/responsive-col/responsive-col.module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { NgModule } from '@angular/core' - -import { ResponsiveColViewportDirective } from './responsive-col-viewport.directive' -import { ResponsiveColDirective } from './responsive-col.directive' - -@NgModule({ - declarations: [ResponsiveColDirective, ResponsiveColViewportDirective], - exports: [ResponsiveColDirective, ResponsiveColViewportDirective], -}) -export class ResponsiveColModule {} diff --git a/frontend/projects/shared/src/directives/safe-links/safe-links.directive.ts b/frontend/projects/shared/src/directives/safe-links.directive.ts similarity index 97% rename from frontend/projects/shared/src/directives/safe-links/safe-links.directive.ts rename to frontend/projects/shared/src/directives/safe-links.directive.ts index a757fbe29..2671c9733 100644 --- a/frontend/projects/shared/src/directives/safe-links/safe-links.directive.ts +++ b/frontend/projects/shared/src/directives/safe-links.directive.ts @@ -4,6 +4,7 @@ import { DOCUMENT } from '@angular/common' // TODO: Refactor to use `MutationObserver` so it works with dynamic content @Directive({ selector: '[safeLinks]', + standalone: true, }) export class SafeLinksDirective implements AfterViewInit { constructor( diff --git a/frontend/projects/shared/src/directives/safe-links/safe-links.module.ts b/frontend/projects/shared/src/directives/safe-links/safe-links.module.ts deleted file mode 100644 index 7268e9b01..000000000 --- a/frontend/projects/shared/src/directives/safe-links/safe-links.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NgModule } from '@angular/core' -import { SafeLinksDirective } from './safe-links.directive' - -@NgModule({ - declarations: [SafeLinksDirective], - exports: [SafeLinksDirective], -}) -export class SafeLinksModule {} diff --git a/frontend/projects/shared/src/public-api.ts b/frontend/projects/shared/src/public-api.ts index dcf29257b..aaa32896b 100644 --- a/frontend/projects/shared/src/public-api.ts +++ b/frontend/projects/shared/src/public-api.ts @@ -18,11 +18,9 @@ export * from './components/text-spinner/text-spinner.component.module' export * from './components/ticker/ticker.component' export * from './components/ticker/ticker.module' -export * from './directives/responsive-col/responsive-col.directive' -export * from './directives/responsive-col/responsive-col.module' -export * from './directives/responsive-col/responsive-col-viewport.directive' -export * from './directives/safe-links/safe-links.directive' -export * from './directives/safe-links/safe-links.module' +export * from './directives/drag-scroller.directive' +export * from './directives/responsive-col.directive' +export * from './directives/safe-links.directive' export * from './mocks/get-setup-status' diff --git a/frontend/projects/ui/src/app/app.module.ts b/frontend/projects/ui/src/app/app.module.ts index 9db493975..e3636426a 100644 --- a/frontend/projects/ui/src/app/app.module.ts +++ b/frontend/projects/ui/src/app/app.module.ts @@ -13,10 +13,10 @@ import { MonacoEditorModule } from '@materia-ui/ngx-monaco-editor' import { MarkdownModule, DarkThemeModule, - ResponsiveColModule, SharedPipesModule, LightThemeModule, LoadingModule, + ResponsiveColViewportDirective, } from '@start9labs/shared' import { AppComponent } from './app.component' @@ -61,7 +61,7 @@ import { environment } from '../environments/environment' TuiModeModule, TuiThemeNightModule, WidgetsPageModule, - ResponsiveColModule, + ResponsiveColViewportDirective, DarkThemeModule, LightThemeModule, ServiceWorkerModule.register('ngsw-worker.js', { diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts index 5547d314b..2c3b87760 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts @@ -61,4 +61,9 @@ export class CardComponent { this.navigation.addTab({ icon, title, routerLink }) } + + @HostListener('pointerdown.prevent') + onDown() { + // Prevents Firefox from starting a native drag + } } diff --git a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer-item.directive.ts b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer-item.directive.ts index 4921d580b..6e29ff0ca 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer-item.directive.ts +++ b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer-item.directive.ts @@ -8,6 +8,7 @@ import { import { tuiGetActualTarget, tuiIsElement, tuiPx } from '@taiga-ui/cdk' import { DrawerComponent } from './drawer.component' import { DesktopService } from '../../services/desktop.service' +import { TuiAlertService } from '@taiga-ui/core' /** * This directive is responsible for drag and drop of the drawer item. @@ -17,10 +18,12 @@ import { DesktopService } from '../../services/desktop.service' selector: '[drawerItem]', standalone: true, host: { + '[style.userSelect]': '"none"', '[style.touchAction]': '"none"', }, }) export class DrawerItemDirective { + private readonly alerts = inject(TuiAlertService) private readonly desktop = inject(DesktopService) private readonly drawer = inject(DrawerComponent) private readonly element: HTMLElement = inject(ElementRef).nativeElement @@ -31,11 +34,8 @@ export class DrawerItemDirective { @Input() drawerItem = '' - @HostListener('pointerdown.prevent.silent', ['$event']) + @HostListener('pointerdown.silent', ['$event']) onStart(event: PointerEvent): void { - // This element is already on the desktop - if (this.desktop.items.includes(this.drawerItem)) return - const target = tuiGetActualTarget(event) const { x, y, pointerId } = event const { left, top } = this.element.getBoundingClientRect() @@ -62,6 +62,15 @@ export class DrawerItemDirective { onMove(x: number, y: number): void { // This element is not dragged if (Number.isNaN(this.x)) return + // This element is already on the desktop + if (this.desktop.items.includes(this.drawerItem)) { + this.onPointer() + this.alerts + .open('This item is already added', { status: 'warning' }) + .subscribe() + + return + } this.process(x, y) this.desktop.add('') diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.html b/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.html index 4690eb04f..c6db54658 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.html +++ b/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.html @@ -46,7 +46,7 @@

StartOS

- diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts b/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts index 84daae18c..4d7483e40 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts @@ -1,10 +1,12 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' import { TuiButtonModule, TuiDataListModule, TuiHostedDropdownModule, TuiSvgModule, } from '@taiga-ui/core' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { AuthService } from 'src/app/services/auth.service' @Component({ selector: 'header-menu', @@ -19,4 +21,12 @@ import { TuiButtonModule, ], }) -export class HeaderMenuComponent {} +export class HeaderMenuComponent { + private readonly api = inject(ApiService) + private readonly auth = inject(AuthService) + + logout() { + this.api.logout({}).catch(e => console.error('Failed to log out', e)) + this.auth.setUnverified() + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-item.ts b/frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-item.ts index 4e623a181..07fef2336 100644 --- a/frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-item.ts +++ b/frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-item.ts @@ -27,8 +27,8 @@ export class ToDesktopItemPipe implements PipeTransform { } return { - icon: packages[id].icon, - title: packages[id].manifest.title, + icon: packages[id]?.icon, + title: packages[id]?.manifest.title, routerLink, } } diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html index 54a4d54d4..b9b0bae80 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html @@ -12,30 +12,32 @@ @tuiScaleIn (pointerup)="onRemove()" > - - + -
- - + + + + +
diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.scss b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.scss index ee97235f8..dd8bfe078 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.scss +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.scss @@ -6,9 +6,8 @@ align-content: center; justify-content: center; height: 100%; - max-width: 56rem; + max-width: calc(100vw - 4rem); margin: 0 auto; - padding: 1rem 0; } .loader { @@ -16,13 +15,30 @@ width: 10rem; } +.fade { + @include scrollbar-hidden(); + + width: 100%; + height: calc(100% - 4rem); + display: flex; + flex-direction: column; + overflow: auto; +} + .tiles { width: 100%; - min-height: 5.5rem; justify-content: center; grid-template-columns: repeat(auto-fit, 12.5rem); - grid-auto-rows: 5.5rem; + grid-auto-rows: min-content; gap: 2rem; + margin: auto; + + &::after { + content: ''; + grid-column: 1; + height: 1rem; + order: 999; + } } .remove { @@ -41,8 +57,12 @@ } } -.item._dragged, -.item._empty { - border-radius: var(--tui-radius-l); - box-shadow: inset 0 0 0 0.5rem var(--tui-clear-active); +.item { + height: 5.5rem; + + &._dragged, + &._empty { + border-radius: var(--tui-radius-l); + box-shadow: inset 0 0 0 0.5rem var(--tui-clear-active); + } } diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts index fa4e0e7f2..f500d6b8c 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts @@ -1,7 +1,9 @@ import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' import { RouterModule, Routes } from '@angular/router' +import { DragScrollerDirective } from '@start9labs/shared' import { TuiLoaderModule, TuiSvgModule } from '@taiga-ui/core' +import { TuiFadeModule } from '@taiga-ui/experimental' import { TuiTilesModule } from '@taiga-ui/kit' import { DesktopComponent } from './desktop.component' import { CardComponent } from '../../components/card/card.component' @@ -25,6 +27,8 @@ const ROUTES: Routes = [ TuiTilesModule, ToDesktopItemPipe, RouterModule.forChild(ROUTES), + TuiFadeModule, + DragScrollerDirective, ], declarations: [DesktopComponent], exports: [DesktopComponent], diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.module.ts index 7a7e19e81..d2d3909a4 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.module.ts @@ -6,7 +6,7 @@ import { IonicModule } from '@ionic/angular' import { SharedPipesModule, EmverPipesModule, - ResponsiveColModule, + ResponsiveColDirective, } from '@start9labs/shared' import { FilterPackagesPipeModule, @@ -45,7 +45,7 @@ const routes: Routes = [ SkeletonModule, MarketplaceSettingsPageModule, StoreIconComponentModule, - ResponsiveColModule, + ResponsiveColDirective, ], declarations: [MarketplaceListPage], exports: [MarketplaceListPage], diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.module.ts index b0dbbc7af..87b65a33c 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.module.ts @@ -5,7 +5,7 @@ import { IonicModule } from '@ionic/angular' import { AppListPage } from './app-list.page' import { EmverPipesModule, - ResponsiveColModule, + ResponsiveColDirective, TextSpinnerComponentModule, TickerModule, } from '@start9labs/shared' @@ -35,7 +35,7 @@ const routes: Routes = [ RouterModule.forChild(routes), BadgeMenuComponentModule, WidgetListComponentModule, - ResponsiveColModule, + ResponsiveColDirective, TickerModule, LaunchMenuComponentModule, ], diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts index 60d7e114a..e81f6e294 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts @@ -5,7 +5,7 @@ import { IonicModule } from '@ionic/angular' import { AppShowPage } from './app-show.page' import { EmverPipesModule, - ResponsiveColModule, + ResponsiveColDirective, SharedPipesModule, } from '@start9labs/shared' import { StatusComponentModule } from '../status/status.component.module' @@ -59,7 +59,7 @@ const routes: Routes = [ RouterModule.forChild(routes), AppConfigPageModule, EmverPipesModule, - ResponsiveColModule, + ResponsiveColDirective, SharedPipesModule, InsecureWarningComponentModule, LaunchMenuComponentModule, diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts index 426dc846d..141055614 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts @@ -1,6 +1,6 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' -import { MarkdownPipeModule, SafeLinksModule } from '@start9labs/shared' +import { MarkdownPipeModule, SafeLinksDirective } from '@start9labs/shared' import { TuiButtonModule, TuiScrollbarModule } from '@taiga-ui/core' import { TuiAutoFocusModule } from '@taiga-ui/cdk' import { NgDompurifyModule } from '@tinkoff/ng-dompurify' @@ -14,7 +14,7 @@ import { OSUpdatePage } from './os-update.page' TuiButtonModule, TuiAutoFocusModule, TuiScrollbarModule, - SafeLinksModule, + SafeLinksDirective, NgDompurifyModule, ], exports: [OSUpdatePage], diff --git a/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts index e5d1970bb..4615ccf6d 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts @@ -9,7 +9,7 @@ import { import { EmverPipesModule, MarkdownPipeModule, - SafeLinksModule, + SafeLinksDirective, SharedPipesModule, } from '@start9labs/shared' import { NgDompurifyModule } from '@tinkoff/ng-dompurify' @@ -40,7 +40,7 @@ const routes: Routes = [ StoreIconComponentModule, EmverPipesModule, MimeTypePipeModule, - SafeLinksModule, + SafeLinksDirective, NgDompurifyModule, TuiProgressModule, ], diff --git a/frontend/projects/ui/src/app/common/widget-list/widget-list.component.module.ts b/frontend/projects/ui/src/app/common/widget-list/widget-list.component.module.ts index bead5c4b3..0fdec7d01 100644 --- a/frontend/projects/ui/src/app/common/widget-list/widget-list.component.module.ts +++ b/frontend/projects/ui/src/app/common/widget-list/widget-list.component.module.ts @@ -2,14 +2,14 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { IonicModule } from '@ionic/angular' import { RouterModule } from '@angular/router' -import { ResponsiveColModule } from '@start9labs/shared' +import { ResponsiveColDirective } from '@start9labs/shared' import { AnyLinkComponent } from './any-link/any-link.component' import { WidgetListComponent } from './widget-list.component' import { WidgetCardComponent } from './widget-card/widget-card.component' @NgModule({ declarations: [WidgetListComponent, WidgetCardComponent, AnyLinkComponent], - imports: [CommonModule, IonicModule, RouterModule, ResponsiveColModule], + imports: [CommonModule, IonicModule, RouterModule, ResponsiveColDirective], exports: [WidgetListComponent], }) export class WidgetListComponentModule {} From cb36754c46456eaddb9b70899dadbf4f47efd9ea Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Tue, 26 Sep 2023 22:37:46 +0400 Subject: [PATCH 017/169] refactor: refactor service page to get rid of ionic (#2421) --- frontend/angular.json | 1 + frontend/package-lock.json | 116 ++++---- frontend/package.json | 13 +- .../ui/src/app/apps/portal/portal.module.ts | 6 +- .../components/action-success.component.ts | 56 ++++ .../service/components/action.component.ts | 26 ++ .../service/components/actions.component.ts | 238 ++++++++++++++++ .../components/additional.component.ts | 46 +++ .../components/config-dep.component.ts | 104 +++++++ .../components/credential.component.ts | 64 +++++ .../components/dependency.component.ts | 57 ++++ .../components/health-check.component.ts | 113 ++++++++ .../service/components/interface.component.ts | 53 ++++ .../service/components/menu.component.ts | 25 ++ .../service/components/progress.component.ts | 27 ++ .../service/components/status.component.ts | 58 ++++ .../service/modals/actions.component.ts | 222 +++++++++++++++ .../routes/service/modals/config.component.ts | 268 ++++++++++++++++++ .../service/modals/credentials.component.ts | 78 +++++ .../service/modals/interface.component.ts | 37 +++ .../routes/service/modals/logs.component.ts | 37 +++ .../service/pipes/group-actions.pipe.ts | 35 +++ .../service/pipes/interface-info.pipe.ts | 77 +++++ .../service/pipes/progress-data.pipe.ts | 14 + .../service/pipes/to-additional.pipe.ts | 84 ++++++ .../service/pipes/to-dependencies.pipe.ts | 136 +++++++++ .../routes/service/pipes/to-menu.pipe.ts | 162 +++++++++++ .../routes/service/pipes/to-status.pipe.ts | 16 ++ .../routes/service/service.component.html | 106 +++++++ .../routes/service/service.component.scss | 26 ++ .../routes/service/service.component.ts | 99 +++++++ .../portal/routes/service/service.module.ts | 56 ++++ .../routes/service/types/dependency-info.ts | 9 + .../service/types/package-config-data.ts | 6 + .../routes/services/service.component.html | 1 - .../routes/services/service.component.scss | 0 .../routes/services/service.component.ts | 37 --- .../portal/routes/services/services.module.ts | 18 -- .../app/apps/portal/utils/to-router-link.ts | 2 +- .../services/app-show/app-show.module.ts | 1 + .../ui/src/app/common/logs/logs.component.ts | 4 +- frontend/projects/ui/src/styles.scss | 39 +++ 42 files changed, 2451 insertions(+), 122 deletions(-) create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/components/action-success.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/components/action.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/components/actions.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/components/additional.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/components/config-dep.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/components/credential.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/components/dependency.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/components/health-check.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/components/interface.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/components/menu.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/components/progress.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/modals/actions.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/modals/config.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/modals/credentials.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/modals/interface.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/modals/logs.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/pipes/group-actions.pipe.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/pipes/interface-info.pipe.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/pipes/progress-data.pipe.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-additional.pipe.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-dependencies.pipe.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-menu.pipe.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-status.pipe.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/service.component.html create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/service.component.scss create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/service.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/service.module.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/types/dependency-info.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/types/package-config-data.ts delete mode 100644 frontend/projects/ui/src/app/apps/portal/routes/services/service.component.html delete mode 100644 frontend/projects/ui/src/app/apps/portal/routes/services/service.component.scss delete mode 100644 frontend/projects/ui/src/app/apps/portal/routes/services/service.component.ts delete mode 100644 frontend/projects/ui/src/app/apps/portal/routes/services/services.module.ts diff --git a/frontend/angular.json b/frontend/angular.json index d2f159ff2..5af567f09 100644 --- a/frontend/angular.json +++ b/frontend/angular.json @@ -50,6 +50,7 @@ ], "styles": [ "node_modules/@taiga-ui/core/styles/taiga-ui-theme.less", + "node_modules/@taiga-ui/styles/taiga-ui-global.less", "projects/shared/styles/taiga.scss", "projects/shared/styles/variables.scss", "projects/shared/styles/global.scss", diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 81545020d..90c1ddf7f 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -23,12 +23,13 @@ "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc8.beta2", - "@taiga-ui/addon-charts": "3.44.0", - "@taiga-ui/cdk": "3.44.0", - "@taiga-ui/core": "3.44.0", - "@taiga-ui/experimental": "3.44.0", - "@taiga-ui/icons": "3.44.0", - "@taiga-ui/kit": "3.44.0", + "@taiga-ui/addon-charts": "3.45.0", + "@taiga-ui/cdk": "3.45.0", + "@taiga-ui/core": "3.45.0", + "@taiga-ui/experimental": "3.45.0", + "@taiga-ui/icons": "3.45.0", + "@taiga-ui/kit": "3.45.0", + "@taiga-ui/styles": "3.45.0", "@tinkoff/ng-dompurify": "4.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", @@ -3591,9 +3592,9 @@ "dev": true }, "node_modules/@maskito/angular": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-1.5.1.tgz", - "integrity": "sha512-unT8l4CLuehliS8alLYyPVLZHI+KyIm53Yll3yHJEtJy3Wz5rmCuj0h9IPaJ2clR/gXFAi5e5rLEX5SD1uWl4g==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-1.7.0.tgz", + "integrity": "sha512-RcBEXkuUf5zyaNQZv26LxOZ2DrILR34Ci1OWRaeI0JfHSslKdMlbQMdWXvGKga6ChGY5Sfl64AsmQ1D2kMvGlQ==", "dependencies": { "tslib": "2.6.2" }, @@ -3601,21 +3602,21 @@ "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@angular/forms": ">=12.0.0", - "@maskito/core": "^1.5.1", + "@maskito/core": "^1.7.0", "rxjs": ">=6.0.0" } }, "node_modules/@maskito/core": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@maskito/core/-/core-1.5.1.tgz", - "integrity": "sha512-AkwUyNjtf4cIAluJc459jf2YRVTVvreMNUpnStx6Kzne1DHf5RZUNeVba+6QYQHe0Mn0E8ftYoYOT5Ac8Wd1ow==" + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@maskito/core/-/core-1.7.0.tgz", + "integrity": "sha512-sjdv1MSJnWWor/Qy1u1+ZZtqejzfVt6zqMUfy5RToEPZSBWlsCg1JSfjRu9WRb3yirpZnj3j80JkTGCicFrvuw==" }, "node_modules/@maskito/kit": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-1.5.1.tgz", - "integrity": "sha512-/jMMAAmjUqplY62+UGVNwXjK+7XihYRpw4C51WpszrSlH6Sj//bEDcLIA5iqkJD+cK5ROoEyQ63XDRo0D9tUGg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-1.7.0.tgz", + "integrity": "sha512-LX/ngWFnPKWnQfvU9m5fss8NIBO261DlQdXOtlbhoXgyscVoR8RVeUHRVuRKEhJgd1I+dvlP1vUxms2qltFTjw==", "peerDependencies": { - "@maskito/core": "^1.5.1" + "@maskito/core": "^1.7.0" } }, "node_modules/@materia-ui/ngx-monaco-editor": { @@ -4040,9 +4041,9 @@ } }, "node_modules/@taiga-ui/addon-charts": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.44.0.tgz", - "integrity": "sha512-yC42GGVMBgAZm+6ej+UlQNO6Jl4JKT7cGRmz07Jvw+cd2KXDv6+A2cNqmI7EfJnig/3/Lfh560QIRz1uKcTQQw==", + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.45.0.tgz", + "integrity": "sha512-KR9d95Hix/+5oiXiyfnqnzpyxw7am689tZ69y+2Unv2kYENQqc0LXf2SG981rIHLJVr4mVDuBfmJ7I32M+zvVw==", "dependencies": { "tslib": ">=2.0.0" }, @@ -4050,15 +4051,15 @@ "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@ng-web-apis/common": ">=3.0.0", - "@taiga-ui/cdk": ">=3.44.0", - "@taiga-ui/core": ">=3.44.0", + "@taiga-ui/cdk": ">=3.45.0", + "@taiga-ui/core": ">=3.45.0", "@tinkoff/ng-polymorpheus": ">=4.0.0" } }, "node_modules/@taiga-ui/cdk": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.44.0.tgz", - "integrity": "sha512-sr0vqcuc/ziMjdQTcVPOayhmDwPp4GW1W3lBeUmmuXJpGm7DKrohA0CRUZG+2QZvw7ePVG/G2jBM8268k4I2mw==", + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.45.0.tgz", + "integrity": "sha512-pFdy5yxkzPGYrtyA1e92SYYXel3uHb+3b2NFjNqbFzLnW3p0NYILZfQPb4I4U9X5cZBhVaFlPGsHXwswCZKqGw==", "dependencies": { "@ng-web-apis/common": "3.0.2", "@ng-web-apis/mutation-observer": "3.0.2", @@ -4080,11 +4081,11 @@ } }, "node_modules/@taiga-ui/core": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.44.0.tgz", - "integrity": "sha512-rd8+uADy38iIBjoVvUs5fH2oDGBVb0S/eb/PynQB5vh5zddGFsg10mGfjqtUKoLCdrMmlIVfSJ2Fv0AbibsIaQ==", + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.45.0.tgz", + "integrity": "sha512-16mCoBlorIx9PHZUGRWfX2K6LTMNo62h4bKOkZEz/l5nxzP+Wsa/vHgmditwE4eKg7v7nHGSPrdmNxlgzcs2dQ==", "dependencies": { - "@taiga-ui/i18n": "^3.44.0", + "@taiga-ui/i18n": "^3.45.0", "tslib": ">=2.0.0" }, "peerDependencies": { @@ -4096,34 +4097,34 @@ "@angular/router": ">=12.0.0", "@ng-web-apis/common": ">=3.0.0", "@ng-web-apis/mutation-observer": ">=3.0.0", - "@taiga-ui/cdk": ">=3.44.0", - "@taiga-ui/i18n": ">=3.44.0", + "@taiga-ui/cdk": ">=3.45.0", + "@taiga-ui/i18n": ">=3.45.0", "@tinkoff/ng-event-plugins": ">=3.1.0", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/experimental": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/experimental/-/experimental-3.44.0.tgz", - "integrity": "sha512-fR//2I2FwPPomAyoJSTb+Mla/WOmSZyhnjBVqTZ1jAEbZEmEYwYFMWmWCCorfGiHQhJz0W9d+A22/04FEn94BA==", + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/experimental/-/experimental-3.45.0.tgz", + "integrity": "sha512-XsYKHl+CSGd/Te4UtQb/nHOOo9jI6UjAcqna2D5aPi/sntgP1m2hY7Wu0mxtk9ExajuqZjxocJSx1mSorwDC/Q==", "dependencies": { "tslib": ">=2.0.0" }, "peerDependencies": { "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", - "@taiga-ui/cdk": ">=3.44.0", - "@taiga-ui/core": ">=3.44.0", - "@taiga-ui/kit": ">=3.44.0", + "@taiga-ui/cdk": ">=3.45.0", + "@taiga-ui/core": ">=3.45.0", + "@taiga-ui/kit": ">=3.45.0", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/i18n": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.44.0.tgz", - "integrity": "sha512-SzjCLKxhGicGEdTPcI6wCtJyoA+SdTZiimzvf1Xt03B+CCc/2rqsPL45XVlnVAwX4lyZUq0mHiA/OcxPlIme+Q==", + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.45.0.tgz", + "integrity": "sha512-Dx8QvGaEu/i7M/F0QXa4fRygk5pL8ZXCnIyvRVWcGoJG9Bzfueb+1gsyBp/b7ogHK3FSgj88QsN1EBW1L0IiXQ==", "dependencies": { "tslib": ">=2.0.0" }, @@ -4134,24 +4135,24 @@ } }, "node_modules/@taiga-ui/icons": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.44.0.tgz", - "integrity": "sha512-hVWZfPQrGRG1MywuNwRh0jzOJsUFDMiRvdqZrLSs1iQBH/lwEQAZ2KoLHEgGt0GOTwK9DzgXIKVo4bwexs+EmA==", + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.45.0.tgz", + "integrity": "sha512-Dn3ImJx2o3vEGtUn05IeEj0JPEYU3wEUtyXcOpK1mqN2AxYnLmAFU/5AtYMeJeQoGEuFsRlGbZfcihieR1CPsQ==", "dependencies": { "tslib": ">=2.0.0" }, "peerDependencies": { - "@taiga-ui/cdk": ">=3.44.0" + "@taiga-ui/cdk": ">=3.45.0" } }, "node_modules/@taiga-ui/kit": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.44.0.tgz", - "integrity": "sha512-klWCWT9IizqJAzCc+XauiTFmX11Qz2zwxvfpLZwAtVWz/cmllf05gL5ynL0LIXhGrzu+2YVQRys9cej2yN2G9Q==", + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.45.0.tgz", + "integrity": "sha512-BlQeWh6x041YOsxHU+e0BZaZofo8QZ04gAtKewvWXXUret0keBEbnXhFpyiQLQR0GjM1/0ls3rPHORW4rYYvUw==", "dependencies": { - "@maskito/angular": "1.5.1", - "@maskito/core": "1.5.1", - "@maskito/kit": "1.5.1", + "@maskito/angular": "1.7.0", + "@maskito/core": "1.7.0", + "@maskito/kit": "1.7.0", "@ng-web-apis/intersection-observer": "3.1.2", "text-mask-core": "5.1.2", "tslib": ">=2.0.0" @@ -4164,13 +4165,22 @@ "@ng-web-apis/common": ">=3.0.0", "@ng-web-apis/mutation-observer": ">=3.0.0", "@ng-web-apis/resize-observer": ">=3.0.0", - "@taiga-ui/cdk": ">=3.44.0", - "@taiga-ui/core": ">=3.44.0", - "@taiga-ui/i18n": ">=3.44.0", + "@taiga-ui/cdk": ">=3.45.0", + "@taiga-ui/core": ">=3.45.0", + "@taiga-ui/i18n": ">=3.45.0", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } }, + "node_modules/@taiga-ui/styles": { + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/styles/-/styles-3.45.0.tgz", + "integrity": "sha512-WxJh5/U0JUsiJmPebw5x6PbCcfad7rV+soUhM3pdUb86uQs+grpqinIEXhhyeuIZrylofkyo70lgV13gJHRr/w==", + "peerDependencies": { + "@taiga-ui/cdk": ">=3.45.0", + "tslib": ">=2.0.0" + } + }, "node_modules/@tinkoff/ng-dompurify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@tinkoff/ng-dompurify/-/ng-dompurify-4.0.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index b21673832..592463a34 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -44,12 +44,13 @@ "@materia-ui/ngx-monaco-editor": "^6.0.0", "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", - "@taiga-ui/addon-charts": "3.44.0", - "@taiga-ui/cdk": "3.44.0", - "@taiga-ui/core": "3.44.0", - "@taiga-ui/experimental": "3.44.0", - "@taiga-ui/icons": "3.44.0", - "@taiga-ui/kit": "3.44.0", + "@taiga-ui/addon-charts": "3.45.0", + "@taiga-ui/cdk": "3.45.0", + "@taiga-ui/core": "3.45.0", + "@taiga-ui/experimental": "3.45.0", + "@taiga-ui/icons": "3.45.0", + "@taiga-ui/kit": "3.45.0", + "@taiga-ui/styles": "3.45.0", "@tinkoff/ng-dompurify": "4.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", diff --git a/frontend/projects/ui/src/app/apps/portal/portal.module.ts b/frontend/projects/ui/src/app/apps/portal/portal.module.ts index 85e49a6fd..ef6abe620 100644 --- a/frontend/projects/ui/src/app/apps/portal/portal.module.ts +++ b/frontend/projects/ui/src/app/apps/portal/portal.module.ts @@ -21,11 +21,9 @@ const ROUTES: Routes = [ import('./routes/desktop/desktop.module').then(m => m.DesktopModule), }, { - path: 'services', + path: 'service', loadChildren: () => - import('./routes/services/services.module').then( - m => m.ServicesModule, - ), + import('./routes/service/service.module').then(m => m.ServiceModule), }, { path: 'system', diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/action-success.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/action-success.component.ts new file mode 100644 index 000000000..90086cb9e --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/action-success.component.ts @@ -0,0 +1,56 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { CopyService } from '@start9labs/shared' +import { TuiButtonModule, TuiDialogContext } from '@taiga-ui/core' +import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' +import { QrCodeModule } from 'ng-qrcode' +import { ActionResponse } from 'src/app/services/api/api.types' + +@Component({ + template: ` + {{ context.data.message }} + + +

+ {{ context.data.value }} + +

+
+ `, + styles: [ + ` + qr-code { + margin: 1rem auto; + display: flex; + justify-content: center; + } + + p { + display: flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + } + `, + ], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, QrCodeModule, TuiButtonModule], +}) +export class ServiceActionSuccessComponent { + readonly copyService = inject(CopyService) + readonly context = + inject>(POLYMORPHEUS_CONTEXT) +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/action.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/action.component.ts new file mode 100644 index 000000000..5861b0fd0 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/action.component.ts @@ -0,0 +1,26 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core' +import { TuiSvgModule } from '@taiga-ui/core' + +interface ActionItem { + readonly icon: string + readonly name: string + readonly description: string +} + +@Component({ + selector: '[action]', + template: ` + +
+ {{ action.name }} +
{{ action.description }}
+
+ `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [TuiSvgModule], +}) +export class ServiceActionComponent { + @Input({ required: true }) + action!: ActionItem +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/actions.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/actions.component.ts new file mode 100644 index 000000000..80577811b --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/actions.component.ts @@ -0,0 +1,238 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, Input } from '@angular/core' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { TuiButtonModule, TuiDialogService } from '@taiga-ui/core' +import { tuiPure } from '@taiga-ui/cdk' +import { TUI_PROMPT } from '@taiga-ui/kit' +import { PatchDB } from 'patch-db-client' +import { filter } from 'rxjs' +import { + PackageStatus, + PrimaryStatus, + renderPkgStatus, +} from 'src/app/services/pkg-status-rendering.service' +import { + DataModel, + InterfaceInfo, + PackageDataEntry, +} from 'src/app/services/patch-db/data-model' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { FormDialogService } from 'src/app/services/form-dialog.service' +import { hasCurrentDeps } from 'src/app/util/has-deps' +import { ServiceConfigModal } from '../modals/config.component' +import { PackageConfigData } from '../types/package-config-data' +import { ToDependenciesPipe } from '../pipes/to-dependencies.pipe' + +@Component({ + selector: 'service-actions', + template: ` + + + + + + + + `, + styles: [':host { display: flex; gap: 1rem }'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + providers: [ToDependenciesPipe], + imports: [CommonModule, TuiButtonModule], +}) +export class ServiceActionsComponent { + @Input({ required: true }) + service!: PackageDataEntry + + constructor( + private readonly dialogs: TuiDialogService, + private readonly errorService: ErrorService, + private readonly loader: LoadingService, + private readonly embassyApi: ApiService, + private readonly formDialog: FormDialogService, + private readonly patch: PatchDB, + private readonly dependencies: ToDependenciesPipe, + ) {} + + private get id(): string { + return this.service.manifest.id + } + + get interfaceInfo(): Record { + return this.service.installed!['interfaceInfo'] + } + + get isConfigured(): boolean { + return this.service.installed!.status.configured + } + + get isRunning(): boolean { + return this.getStatus(this.service).primary === PrimaryStatus.Running + } + + get isStopped(): boolean { + return this.getStatus(this.service).primary === PrimaryStatus.Stopped + } + + @tuiPure + getStatus(service: PackageDataEntry): PackageStatus { + return renderPkgStatus(service) + } + + presentModalConfig(): void { + this.formDialog.open(ServiceConfigModal, { + label: `${this.service.manifest.title} configuration`, + data: { pkgId: this.id }, + }) + } + + async tryStart(): Promise { + if (this.dependencies.transform(this.service).some(d => !!d.errorText)) { + const depErrMsg = `${this.service.manifest.title} has unmet dependencies. It will not work as expected.` + const proceed = await this.presentAlertStart(depErrMsg) + + if (!proceed) return + } + + const alertMsg = this.service.manifest.alerts.start + + if (alertMsg) { + const proceed = await this.presentAlertStart(alertMsg) + + if (!proceed) return + } + + this.start() + } + + async tryStop(): Promise { + const { title, alerts, id } = this.service.manifest + + let content = alerts.stop || '' + if (await hasCurrentDeps(this.patch, id)) { + const depMessage = `Services that depend on ${title} will no longer work properly and may crash` + content = content ? `${content}.\n\n${depMessage}` : depMessage + } + + if (content) { + this.dialogs + .open(TUI_PROMPT, { + label: 'Warning', + size: 's', + data: { + content, + yes: 'Stop', + no: 'Cancel', + }, + }) + .pipe(filter(Boolean)) + .subscribe(() => this.stop()) + } else { + this.stop() + } + } + + async tryRestart(): Promise { + const { id, title } = this.service.manifest + + if (await hasCurrentDeps(this.patch, id)) { + this.dialogs + .open(TUI_PROMPT, { + label: 'Warning', + size: 's', + data: { + content: `Services that depend on ${title} may temporarily experiences issues`, + yes: 'Restart', + no: 'Cancel', + }, + }) + .pipe(filter(Boolean)) + .subscribe(() => this.restart()) + } else { + this.restart() + } + } + + private async start(): Promise { + const loader = this.loader.open(`Starting...`).subscribe() + + try { + await this.embassyApi.startPackage({ id: this.id }) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } + + private async stop(): Promise { + const loader = this.loader.open(`Stopping...`).subscribe() + + try { + await this.embassyApi.stopPackage({ id: this.id }) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } + + private async restart(): Promise { + const loader = this.loader.open(`Restarting...`).subscribe() + + try { + await this.embassyApi.restartPackage({ id: this.id }) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } + + private async presentAlertStart(content: string): Promise { + return new Promise(async resolve => { + this.dialogs + .open(TUI_PROMPT, { + label: 'Warning', + size: 's', + data: { + content, + yes: 'Continue', + no: 'Cancel', + }, + }) + .subscribe(response => resolve(response)) + }) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/additional.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/additional.component.ts new file mode 100644 index 000000000..9b74fcba3 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/additional.component.ts @@ -0,0 +1,46 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, Input } from '@angular/core' +import { TuiSvgModule } from '@taiga-ui/core' +import { AdditionalItem, FALLBACK_URL } from '../pipes/to-additional.pipe' + +@Component({ + selector: '[additional]', + template: ` +
+ {{ additional.name }} +
{{ additional.description }}
+
+ + `, + styles: [ + ` + :host._disabled { + pointer-events: none; + opacity: var(--tui-disabled-opacity); + } + `, + ], + host: { + '[attr.href]': 'additional.description', + '[class._disabled]': 'disabled', + target: '_blank', + rel: 'noreferrer', + }, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, TuiSvgModule], +}) +export class ServiceAdditionalComponent { + @Input({ required: true }) + additional!: AdditionalItem + + get disabled(): boolean { + return this.additional.description === FALLBACK_URL + } + + get icon(): string | undefined { + return this.additional.description.startsWith('http') + ? 'tuiIconExternalLinkLarge' + : this.additional.icon + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/config-dep.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/config-dep.component.ts new file mode 100644 index 000000000..14becf2e8 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/config-dep.component.ts @@ -0,0 +1,104 @@ +import { + ChangeDetectionStrategy, + Component, + Input, + OnChanges, +} from '@angular/core' +import { compare, getValueByPointer, Operation } from 'fast-json-patch' +import { isObject } from '@start9labs/shared' +import { tuiIsNumber } from '@taiga-ui/cdk' +import { CommonModule } from '@angular/common' +import { TuiNotificationModule } from '@taiga-ui/core' + +@Component({ + selector: 'config-dep', + template: ` + +

+ {{ package }} +

+ The following modifications have been made to {{ package }} to satisfy + {{ dep }}: +
    +
  • +
+ To accept these modifications, click "Save". +
+ `, + standalone: true, + imports: [CommonModule, TuiNotificationModule], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ConfigDepComponent implements OnChanges { + @Input() + package = '' + + @Input() + dep = '' + + @Input() + original: object = {} + + @Input() + value: object = {} + + diff: string[] = [] + + ngOnChanges() { + this.diff = compare(this.original, this.value).map( + op => `${this.getPath(op)}: ${this.getMessage(op)}`, + ) + } + + private getPath(operation: Operation): string { + const path = operation.path + .substring(1) + .split('/') + .map(node => { + const num = Number(node) + return isNaN(num) ? node : num + }) + + if (tuiIsNumber(path[path.length - 1])) { + path.pop() + } + + return path.join(' → ') + } + + private getMessage(operation: Operation): string { + switch (operation.op) { + case 'add': + return `Added ${this.getNewValue(operation.value)}` + case 'remove': + return `Removed ${this.getOldValue(operation.path)}` + case 'replace': + return `Changed from ${this.getOldValue( + operation.path, + )} to ${this.getNewValue(operation.value)}` + default: + return `Unknown operation` + } + } + + private getOldValue(path: any): string { + const val = getValueByPointer(this.original, path) + if (['string', 'number', 'boolean'].includes(typeof val)) { + return val + } else if (isObject(val)) { + return 'entry' + } else { + return 'list' + } + } + + private getNewValue(val: any): string { + if (['string', 'number', 'boolean'].includes(typeof val)) { + return val + } else if (isObject(val)) { + return 'new entry' + } else { + return 'new list' + } + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/credential.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/credential.component.ts new file mode 100644 index 000000000..1c11145fb --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/credential.component.ts @@ -0,0 +1,64 @@ +import { + ChangeDetectionStrategy, + Component, + inject, + Input, +} from '@angular/core' +import { CopyService } from '@start9labs/shared' +import { mask } from 'src/app/util/mask' +import { TuiButtonModule, TuiLabelModule } from '@taiga-ui/core' + +@Component({ + selector: 'service-credential', + template: ` + + + + `, + styles: [ + ` + :host { + display: flex; + padding: 0.5rem 0; + + &:not(:last-of-type) { + box-shadow: 0 1px var(--tui-clear); + } + } + `, + ], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [TuiButtonModule, TuiLabelModule], +}) +export class ServiceCredentialComponent { + @Input() + label = '' + + @Input() + value = '' + + masked = true + + readonly copyService = inject(CopyService) + + get mask(): string { + return mask(this.value, 64) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/dependency.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/dependency.component.ts new file mode 100644 index 000000000..0faa48a58 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/dependency.component.ts @@ -0,0 +1,57 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core' +import { EmverPipesModule } from '@start9labs/shared' +import { CommonModule } from '@angular/common' +import { TuiSvgModule } from '@taiga-ui/core' +import { DependencyInfo } from '../types/dependency-info' + +@Component({ + selector: '[serviceDependency]', + template: ` + + + + + {{ dep.title }} + +
{{ dep.version | displayEmver }}
+
+ {{ dep.errorText || 'Satisfied' }} +
+
+
+ {{ dep.actionText }} + +
+ `, + styles: [ + ` + img { + width: 1.5rem; + height: 1.5rem; + border-radius: 100%; + } + + tui-svg { + width: 1rem; + height: 1rem; + } + `, + ], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [EmverPipesModule, CommonModule, TuiSvgModule], +}) +export class ServiceDependencyComponent { + @Input({ required: true, alias: 'serviceDependency' }) + dep!: DependencyInfo + + get color(): string { + return this.dep.errorText + ? 'var(--tui-warning-fill)' + : 'var(--tui-success-fill)' + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/health-check.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/health-check.component.ts new file mode 100644 index 000000000..68848965b --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/health-check.component.ts @@ -0,0 +1,113 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, Input } from '@angular/core' +import { TuiLoaderModule, TuiSvgModule } from '@taiga-ui/core' +import { + HealthCheckResult, + HealthResult, +} from 'src/app/services/patch-db/data-model' + +@Component({ + selector: 'service-health-check', + template: ` + + + + +
+ {{ check.name }} +
+ {{ message }} +
+
+ `, + styles: [ + ` + :first-letter { + text-transform: uppercase; + } + + tui-loader { + width: 1.5rem; + height: 1.5rem; + } + `, + ], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, TuiLoaderModule, TuiSvgModule], +}) +export class ServiceHealthCheckComponent { + @Input({ required: true }) + check!: HealthCheckResult + + @Input() + connected = false + + get loading(): boolean { + const { result } = this.check + + return ( + !result || + result === HealthResult.Starting || + result === HealthResult.Loading + ) + } + + get icon(): string { + switch (this.check.result) { + case HealthResult.Success: + return 'tuiIconCheckLarge' + case HealthResult.Failure: + return 'tuiIconAlertTriangleLarge' + default: + return 'tuiIconMinusLarge' + } + } + + get color(): string { + switch (this.check.result) { + case HealthResult.Success: + return 'var(--tui-success-fill)' + case HealthResult.Failure: + return 'var(--tui-warning-fill)' + case HealthResult.Starting: + case HealthResult.Loading: + return 'var(--tui-primary)' + default: + return 'var(--tui-text-02)' + } + } + + get message(): string { + if (!this.check.result) { + return 'Awaiting result...' + } + + const prefix = + this.check.result !== HealthResult.Failure && + this.check.result !== HealthResult.Loading + ? this.check.result + : '' + + switch (this.check.result) { + case HealthResult.Failure: + return prefix + this.check.error + case HealthResult.Starting: + return `${prefix}...` + case HealthResult.Success: + return `${prefix}: ${this.check.message}` + case HealthResult.Loading: + return prefix + this.check.message + default: + return prefix + } + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/interface.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/interface.component.ts new file mode 100644 index 000000000..2794c2693 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/interface.component.ts @@ -0,0 +1,53 @@ +import { DOCUMENT, CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + inject, + Input, +} from '@angular/core' +import { TuiButtonModule, TuiSvgModule } from '@taiga-ui/core' +import { ConfigService } from 'src/app/services/config.service' +import { InterfaceInfo } from 'src/app/services/patch-db/data-model' +import { ExtendedInterfaceInfo } from '../pipes/interface-info.pipe' + +@Component({ + selector: 'button[serviceInterface]', + template: ` + +
+ {{ info.name }} +
{{ info.description }}
+
{{ info.typeDetail }}
+
+ + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [TuiButtonModule, CommonModule, TuiSvgModule], +}) +export class ServiceInterfaceComponent { + private readonly document = inject(DOCUMENT) + private readonly config = inject(ConfigService) + + @Input({ required: true, alias: 'serviceInterface' }) + info!: ExtendedInterfaceInfo + + @Input() + disabled = false + + launchUI(info: InterfaceInfo) { + this.document.defaultView?.open( + this.config.launchableAddress(info), + '_blank', + 'noreferrer', + ) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/menu.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/menu.component.ts new file mode 100644 index 000000000..a227d4a6f --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/menu.component.ts @@ -0,0 +1,25 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core' +import { TuiSvgModule } from '@taiga-ui/core' +import { ServiceMenu } from '../pipes/to-menu.pipe' + +@Component({ + selector: '[serviceMenu]', + template: ` + +
+ {{ menu.name }} +
+ {{ menu.description }} + +
+
+ + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [TuiSvgModule], +}) +export class ServiceMenuComponent { + @Input({ required: true, alias: 'serviceMenu' }) + menu!: ServiceMenu +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/progress.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/progress.component.ts new file mode 100644 index 000000000..9fda9bf54 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/progress.component.ts @@ -0,0 +1,27 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core' +import { TuiProgressModule } from '@taiga-ui/kit' + +@Component({ + selector: '[progress]', + template: ` + + : {{ progress }}% + + `, + styles: [':host { line-height: 2rem }'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [TuiProgressModule], +}) +export class ServiceProgressComponent { + @Input({ required: true }) + progress = 0 +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts new file mode 100644 index 000000000..59eb44e8b --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts @@ -0,0 +1,58 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + HostBinding, + Input, +} from '@angular/core' +import { InstallProgress } from 'src/app/services/patch-db/data-model' +import { StatusRendering } from 'src/app/services/pkg-status-rendering.service' +import { InstallProgressPipeModule } from 'src/app/common/install-progress/install-progress.module' + +@Component({ + selector: 'service-status', + template: ` + + {{ connected ? rendering.display : 'Unknown' }} + + + + + Installing + + {{ progress }} + + + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, InstallProgressPipeModule], +}) +export class ServiceStatusComponent { + @Input({ required: true }) + rendering!: StatusRendering + + @Input() + installProgress?: InstallProgress + + @Input() + connected = false + + @HostBinding('style.color') + get color(): string { + if (!this.connected) return 'var(--tui-text-02)' + + switch (this.rendering.color) { + case 'danger': + return 'var(--tui-error-fill)' + case 'warning': + return 'var(--tui-warning-fill)' + case 'success': + return 'var(--tui-success-fill)' + case 'primary': + return 'var(--tui-info-fill)' + default: + return 'var(--tui-text-02)' + } + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/modals/actions.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/modals/actions.component.ts new file mode 100644 index 000000000..686eb4a99 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/modals/actions.component.ts @@ -0,0 +1,222 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, Inject } from '@angular/core' +import { Router } from '@angular/router' +import { + isEmptyObject, + WithId, + ErrorService, + LoadingService, +} from '@start9labs/shared' +import { TuiDialogContext, TuiDialogService } from '@taiga-ui/core' +import { TUI_PROMPT } from '@taiga-ui/kit' +import { + POLYMORPHEUS_CONTEXT, + PolymorpheusComponent, +} from '@tinkoff/ng-polymorpheus' +import { PatchDB } from 'patch-db-client' +import { filter, switchMap, timer } from 'rxjs' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { + Action, + DataModel, + PackageDataEntry, + PackageState, +} from 'src/app/services/patch-db/data-model' +import { hasCurrentDeps } from 'src/app/util/has-deps' +import { FormDialogService } from 'src/app/services/form-dialog.service' +import { FormPage } from 'src/app/apps/ui/modals/form/form.page' +import { ServiceActionComponent } from '../components/action.component' +import { ServiceActionSuccessComponent } from '../components/action-success.component' +import { GroupActionsPipe } from '../pipes/group-actions.pipe' + +@Component({ + template: ` + +
+

Standard Actions

+ +
+ +

Actions for {{ pkg.manifest.title }}

+
+ +
+
+
+ `, + styles: [ + ` + h3 { + text-transform: uppercase; + font-weight: bold; + font-size: 1rem; + margin: 2rem 0 1rem; + color: var(--tui-text-02); + } + `, + ], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, ServiceActionComponent, GroupActionsPipe], +}) +export class ServiceActionsModal { + readonly pkg$ = this.patch + .watch$('package-data', this.context.data) + .pipe(filter(pkg => pkg.state === PackageState.Installed)) + + readonly action = { + icon: 'tuiIconTrash2Large', + name: 'Uninstall', + description: + 'This will uninstall the service from StartOS and delete all data permanently.', + } + + constructor( + @Inject(POLYMORPHEUS_CONTEXT) + private readonly context: TuiDialogContext, + private readonly embassyApi: ApiService, + private readonly dialogs: TuiDialogService, + private readonly errorService: ErrorService, + private readonly loader: LoadingService, + private readonly router: Router, + private readonly patch: PatchDB, + private readonly formDialog: FormDialogService, + ) {} + + async handleAction(action: WithId) { + if (action.disabled) { + this.dialogs + .open(action.disabled, { + label: 'Forbidden', + size: 's', + }) + .subscribe() + } else { + if (action['input-spec'] && !isEmptyObject(action['input-spec'])) { + this.formDialog.open(FormPage, { + label: action.name, + data: { + spec: action['input-spec'], + buttons: [ + { + text: 'Execute', + handler: async (value: any) => + this.executeAction(action.id, value), + }, + ], + }, + }) + } else { + this.dialogs + .open(TUI_PROMPT, { + label: 'Confirm', + size: 's', + data: { + content: `Are you sure you want to execute action "${ + action.name + }"? ${action.warning || ''}`, + yes: 'Execute', + no: 'Cancel', + }, + }) + .pipe(filter(Boolean)) + .subscribe(() => this.executeAction(action.id)) + } + } + } + + async tryUninstall(pkg: PackageDataEntry): Promise { + const { title, alerts, id } = pkg.manifest + + let content = + alerts.uninstall || + `Uninstalling ${title} will permanently delete its data` + + if (await hasCurrentDeps(this.patch, id)) { + content = `${content}. Services that depend on ${title} will no longer work properly and may crash` + } + + this.dialogs + .open(TUI_PROMPT, { + label: 'Warning', + size: 's', + data: { + content, + yes: 'Uninstall', + no: 'Cancel', + }, + }) + .pipe(filter(Boolean)) + .subscribe(() => this.uninstall()) + } + + private async uninstall() { + const loader = this.loader.open(`Beginning uninstall...`).subscribe() + + try { + await this.embassyApi.uninstallPackage({ id: this.context.data }) + this.embassyApi + .setDbValue(['ack-instructions', this.context.data], false) + .catch(e => console.error('Failed to mark instructions as unseen', e)) + this.router.navigate(['portal', 'desktop']) + this.context.$implicit.complete() + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } + + private async executeAction( + actionId: string, + input?: object, + ): Promise { + const loader = this.loader.open('Executing action...').subscribe() + + try { + const data = await this.embassyApi.executePackageAction({ + id: this.context.data, + 'action-id': actionId, + input, + }) + + timer(500) + .pipe( + switchMap(() => + this.dialogs.open( + new PolymorpheusComponent(ServiceActionSuccessComponent), + { + label: 'Execution Complete', + data, + }, + ), + ), + ) + .subscribe() + + return true + } catch (e: any) { + this.errorService.handleError(e) + return false + } finally { + loader.unsubscribe() + } + } + + asIsOrder() { + return 0 + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/modals/config.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/modals/config.component.ts new file mode 100644 index 000000000..880a297f5 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/modals/config.component.ts @@ -0,0 +1,268 @@ +import { CommonModule } from '@angular/common' +import { Component, Inject, ViewChild } from '@angular/core' +import { + ErrorService, + getErrorMessage, + isEmptyObject, + LoadingService, +} from '@start9labs/shared' +import { InputSpec } from '@start9labs/start-sdk/lib/config/configTypes' +import { + TuiButtonModule, + TuiDialogContext, + TuiDialogService, + TuiLoaderModule, + TuiModeModule, + TuiNotificationModule, +} from '@taiga-ui/core' +import { TUI_PROMPT, TuiPromptData } from '@taiga-ui/kit' +import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' +import { compare, Operation } from 'fast-json-patch' +import { PatchDB } from 'patch-db-client' +import { endWith, firstValueFrom, Subscription } from 'rxjs' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { + DataModel, + PackageDataEntry, +} from 'src/app/services/patch-db/data-model' +import { hasCurrentDeps } from 'src/app/util/has-deps' +import { getAllPackages, getPackage } from 'src/app/util/get-package-data' +import { Breakages } from 'src/app/services/api/api.types' +import { InvalidService } from 'src/app/common/form/invalid.service' +import { ActionButton, FormPage } from 'src/app/apps/ui/modals/form/form.page' +import { FormPageModule } from 'src/app/apps/ui/modals/form/form.module' +import { PackageConfigData } from '../types/package-config-data' +import { ConfigDepComponent } from '../components/config-dep.component' + +@Component({ + template: ` + + + +
+
+ + + + {{ pkg.manifest.title }} has been automatically configured with + recommended defaults. Make whatever changes you want, then click "Save". + + + + + + No config options for {{ pkg.manifest.title }} + {{ pkg.manifest.version }}. + + + + + + + `, + styles: [ + ` + tui-notification { + font-size: 1rem; + margin-bottom: 1rem; + } + `, + ], + standalone: true, + imports: [ + CommonModule, + FormPageModule, + TuiLoaderModule, + TuiNotificationModule, + TuiButtonModule, + TuiModeModule, + ConfigDepComponent, + ], + providers: [InvalidService], +}) +export class ServiceConfigModal { + @ViewChild(FormPage) + private readonly form?: FormPage> + + readonly pkgId = this.context.data.pkgId + readonly dependentInfo = this.context.data.dependentInfo + + loadingError = '' + loadingText = this.dependentInfo + ? `Setting properties to accommodate ${this.dependentInfo.title}` + : 'Loading Config' + + pkg?: PackageDataEntry + spec: InputSpec = {} + patch: Operation[] = [] + buttons: ActionButton[] = [ + { + text: 'Save', + handler: value => this.save(value), + }, + ] + + original: object | null = null + value: object | null = null + + constructor( + @Inject(POLYMORPHEUS_CONTEXT) + private readonly context: TuiDialogContext, + private readonly dialogs: TuiDialogService, + private readonly errorService: ErrorService, + private readonly loader: LoadingService, + private readonly embassyApi: ApiService, + private readonly patchDb: PatchDB, + ) {} + + get success(): boolean { + return ( + !!this.form && + !this.form.form.dirty && + !this.original && + !this.pkg?.installed?.status?.configured + ) + } + + async ngOnInit() { + try { + this.pkg = await getPackage(this.patchDb, this.pkgId) + + if (!this.pkg) { + this.loadingError = 'This service does not exist' + + return + } + + if (this.dependentInfo) { + const depConfig = await this.embassyApi.dryConfigureDependency({ + 'dependency-id': this.pkgId, + 'dependent-id': this.dependentInfo.id, + }) + + this.original = depConfig['old-config'] + this.value = depConfig['new-config'] || this.original + this.spec = depConfig.spec + this.patch = compare(this.original, this.value) + } else { + const { config, spec } = await this.embassyApi.getPackageConfig({ + id: this.pkgId, + }) + + this.original = config + this.value = config + this.spec = spec + } + } catch (e: any) { + this.loadingError = getErrorMessage(e) + } finally { + this.loadingText = '' + } + } + + private async save(config: any) { + const loader = new Subscription() + + try { + await this.uploadFiles(config, loader) + + if (await hasCurrentDeps(this.patchDb, this.pkgId)) { + await this.configureDeps(config, loader) + } else { + await this.configure(config, loader) + } + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } + + private async uploadFiles(config: Record, loader: Subscription) { + loader.unsubscribe() + loader.closed = false + + // TODO: Could be nested files + const keys = Object.keys(config).filter(key => config[key] instanceof File) + const message = `Uploading File${keys.length > 1 ? 's' : ''}...` + + if (!keys.length) return + + loader.add(this.loader.open(message).subscribe()) + + const hashes = await Promise.all( + keys.map(key => this.embassyApi.uploadFile(config[key])), + ) + keys.forEach((key, i) => (config[key] = hashes[i])) + } + + private async configureDeps( + config: Record, + loader: Subscription, + ) { + loader.unsubscribe() + loader.closed = false + loader.add(this.loader.open('Checking dependent services...').subscribe()) + + const breakages = await this.embassyApi.drySetPackageConfig({ + id: this.pkgId, + config, + }) + + loader.unsubscribe() + loader.closed = false + + if (isEmptyObject(breakages) || (await this.approveBreakages(breakages))) { + await this.configure(config, loader) + } + } + + private async configure(config: Record, loader: Subscription) { + loader.unsubscribe() + loader.closed = false + loader.add(this.loader.open('Saving...').subscribe()) + + await this.embassyApi.setPackageConfig({ id: this.pkgId, config }) + this.context.$implicit.complete() + } + + private async approveBreakages(breakages: Breakages): Promise { + const packages = await getAllPackages(this.patchDb) + const message = + 'As a result of this change, the following services will no longer work properly and may crash:
    ' + const content = `${message}${Object.keys(breakages).map( + id => `
  • ${packages[id].manifest.title}
  • `, + )}
` + const data: TuiPromptData = { content, yes: 'Continue', no: 'Cancel' } + + return firstValueFrom( + this.dialogs.open(TUI_PROMPT, { data }).pipe(endWith(false)), + ) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/modals/credentials.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/modals/credentials.component.ts new file mode 100644 index 000000000..1fd75a42e --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/modals/credentials.component.ts @@ -0,0 +1,78 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { ErrorService, SharedPipesModule } from '@start9labs/shared' +import { TuiForModule } from '@taiga-ui/cdk' +import { TuiButtonModule } from '@taiga-ui/core' +import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' +import { BehaviorSubject } from 'rxjs' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { SkeletonListComponentModule } from 'src/app/common/skeleton-list/skeleton-list.component.module' +import { ServiceCredentialComponent } from '../components/credential.component' + +@Component({ + template: ` + + + + + No credentials + + `, + styles: [ + ` + button { + float: right; + margin-top: 1rem; + } + `, + ], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + TuiForModule, + TuiButtonModule, + SharedPipesModule, + SkeletonListComponentModule, + ServiceCredentialComponent, + ], +}) +export class ServiceCredentialsModal { + private readonly api = inject(ApiService) + private readonly errorService = inject(ErrorService) + + readonly id = inject<{ data: string }>(POLYMORPHEUS_CONTEXT).data + readonly loading$ = new BehaviorSubject(true) + + credentials: Record = {} + + async ngOnInit() { + await this.getCredentials() + } + + async refresh() { + await this.getCredentials() + } + + private async getCredentials(): Promise { + this.loading$.next(true) + + try { + this.credentials = await this.api.getPackageCredentials({ id: this.id }) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + this.loading$.next(false) + } + } + + asIsOrder(a: any, b: any) { + return 0 + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/modals/interface.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/modals/interface.component.ts new file mode 100644 index 000000000..199afc3d0 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/modals/interface.component.ts @@ -0,0 +1,37 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' +import { PatchDB } from 'patch-db-client' +import { Observable } from 'rxjs' +import { InterfaceAddressesComponentModule } from 'src/app/common/interface-addresses/interface-addresses.module' +import { InterfaceInfo } from 'src/app/services/patch-db/data-model' + +interface Context { + packageId: string + interfaceId: string +} + +@Component({ + template: ` + + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, InterfaceAddressesComponentModule], +}) +export class ServiceInterfaceModal { + readonly context = inject<{ data: Context }>(POLYMORPHEUS_CONTEXT).data + + readonly interfaceInfo$: Observable = inject(PatchDB).watch$( + 'package-data', + this.context.packageId, + 'installed', + 'interfaceInfo', + this.context.interfaceId, + ) +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/modals/logs.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/modals/logs.component.ts new file mode 100644 index 000000000..65648c85f --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/modals/logs.component.ts @@ -0,0 +1,37 @@ +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { RR } from 'src/app/services/api/api.types' +import { LogsComponentModule } from 'src/app/common/logs/logs.component.module' + +@Component({ + template: + '', + styles: [ + ` + logs { + display: block; + height: 60vh; + margin-bottom: 5rem; + + ::ng-deep ion-header { + display: none; + } + } + `, + ], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [LogsComponentModule], +}) +export class ServiceLogsModal { + private readonly api = inject(ApiService) + + readonly id = inject<{ data: string }>(POLYMORPHEUS_CONTEXT).data + + readonly follow = async (params: RR.FollowServerLogsReq) => + this.api.followPackageLogs({ id: this.id, ...params }) + + readonly fetch = async (params: RR.GetServerLogsReq) => + this.api.getPackageLogs({ id: this.id, ...params }) +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/group-actions.pipe.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/group-actions.pipe.ts new file mode 100644 index 000000000..5aad8c68f --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/group-actions.pipe.ts @@ -0,0 +1,35 @@ +import { Pipe, PipeTransform } from '@angular/core' +import { WithId } from '@start9labs/shared' +import { Action, PackageDataEntry } from 'src/app/services/patch-db/data-model' + +@Pipe({ + name: 'groupActions', + standalone: true, +}) +export class GroupActionsPipe implements PipeTransform { + transform( + actions: PackageDataEntry['actions'], + ): Array>> | null { + if (!actions) return null + + const noGroup = 'noGroup' + const grouped = Object.entries(actions).reduce< + Record[]> + >((groups, [id, action]) => { + const actionWithId = { id, ...action } + const groupKey = action.group || noGroup + + if (!groups[groupKey]) { + groups[groupKey] = [actionWithId] + } else { + groups[groupKey].push(actionWithId) + } + + return groups + }, {}) + + return Object.values(grouped).map(group => + group.sort((a, b) => a.name.localeCompare(b.name)), + ) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/interface-info.pipe.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/interface-info.pipe.ts new file mode 100644 index 000000000..8ab557b2b --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/interface-info.pipe.ts @@ -0,0 +1,77 @@ +import { inject, Pipe, PipeTransform } from '@angular/core' +import { TuiDialogService } from '@taiga-ui/core' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' +import { + InterfaceInfo, + PackageDataEntry, +} from 'src/app/services/patch-db/data-model' +import { ServiceInterfaceModal } from '../modals/interface.component' + +export interface ExtendedInterfaceInfo extends InterfaceInfo { + id: string + icon: string + color: string + typeDetail: string + action: () => void +} + +@Pipe({ + name: 'interfaceInfo', + standalone: true, +}) +export class InterfaceInfoPipe implements PipeTransform { + private readonly dialogs = inject(TuiDialogService) + + transform({ + manifest, + installed, + }: PackageDataEntry): ExtendedInterfaceInfo[] { + return Object.entries(installed!.interfaceInfo).map(([id, val]) => { + let color: string + let icon: string + let typeDetail: string + + switch (val.type) { + case 'ui': + color = 'var(--tui-primary)' + icon = 'tuiIconMonitorLarge' + typeDetail = 'User Interface (UI)' + break + case 'p2p': + color = 'var(--tui-info-fill)' + icon = 'tuiIconUsersLarge' + typeDetail = 'Peer-To-Peer Interface (P2P)' + break + case 'api': + color = 'var(--tui-support-09)' + icon = 'tuiIconTerminalLarge' + typeDetail = 'Application Program Interface (API)' + break + case 'other': + color = 'var(--tui-text-02)' + icon = 'tuiIconBoxLarge' + typeDetail = 'Unknown Interface Type' + break + } + + return { + ...val, + id, + color, + icon, + typeDetail, + action: () => + this.dialogs + .open(new PolymorpheusComponent(ServiceInterfaceModal), { + label: val.name, + size: 'l', + data: { + packageId: manifest.id, + interfaceId: id, + }, + }) + .subscribe(), + } + }) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/progress-data.pipe.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/progress-data.pipe.ts new file mode 100644 index 000000000..6fc7d3956 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/progress-data.pipe.ts @@ -0,0 +1,14 @@ +import { Pipe, PipeTransform } from '@angular/core' +import { PackageDataEntry } from 'src/app/services/patch-db/data-model' +import { ProgressData } from 'src/app/types/progress-data' +import { packageLoadingProgress } from 'src/app/util/package-loading-progress' + +@Pipe({ + name: 'progressData', + standalone: true, +}) +export class ProgressDataPipe implements PipeTransform { + transform(pkg: PackageDataEntry): ProgressData | null { + return packageLoadingProgress(pkg['install-progress']) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-additional.pipe.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-additional.pipe.ts new file mode 100644 index 000000000..fcf07bbe1 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-additional.pipe.ts @@ -0,0 +1,84 @@ +import { inject, Pipe, PipeTransform } from '@angular/core' +import { TuiDialogService } from '@taiga-ui/core' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' +import { Manifest } from '@start9labs/marketplace' +import { CopyService, MarkdownComponent } from '@start9labs/shared' +import { from } from 'rxjs' +import { PackageDataEntry } from 'src/app/services/patch-db/data-model' +import { ApiService } from 'src/app/services/api/embassy-api.service' + +export const FALLBACK_URL = 'Not provided' + +export interface AdditionalItem { + name: string + description: string + icon?: string + action?: () => void +} + +@Pipe({ + name: 'toAdditional', + standalone: true, +}) +export class ToAdditionalPipe implements PipeTransform { + private readonly api = inject(ApiService) + private readonly copyService = inject(CopyService) + private readonly dialogs = inject(TuiDialogService) + + transform({ manifest, installed }: PackageDataEntry): AdditionalItem[] { + return [ + { + name: 'Installed', + description: new Intl.DateTimeFormat('en-US', { + dateStyle: 'medium', + timeStyle: 'medium', + }).format(new Date(installed?.['installed-at'] || 0)), + }, + { + name: 'Git Hash', + description: manifest['git-hash'] || 'Unknown', + icon: manifest['git-hash'] ? 'tuiIconCopyLarge' : '', + action: () => + manifest['git-hash'] && this.copyService.copy(manifest['git-hash']), + }, + { + name: 'License', + description: manifest.license, + icon: 'tuiIconChevronRightLarge', + action: () => this.showLicense(manifest), + }, + { + name: 'Website', + description: manifest['marketing-site'] || FALLBACK_URL, + }, + { + name: 'Source Repository', + description: manifest['upstream-repo'], + }, + { + name: 'Support Site', + description: manifest['support-site'] || FALLBACK_URL, + }, + { + name: 'Donation Link', + description: manifest['donation-url'] || FALLBACK_URL, + }, + ] + } + + private showLicense({ id, version }: Manifest) { + this.dialogs + .open(new PolymorpheusComponent(MarkdownComponent), { + label: 'License', + size: 'l', + data: { + content: from( + this.api.getStatic( + `/public/package-data/${id}/${version}/LICENSE.md`, + ), + ), + }, + }) + .subscribe() + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-dependencies.pipe.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-dependencies.pipe.ts new file mode 100644 index 000000000..c0951d6d6 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-dependencies.pipe.ts @@ -0,0 +1,136 @@ +import { Pipe, PipeTransform } from '@angular/core' +import { NavigationExtras, Router } from '@angular/router' +import { Manifest } from '@start9labs/marketplace' +import { + DependencyErrorType, + PackageDataEntry, +} from 'src/app/services/patch-db/data-model' +import { DependentInfo } from 'src/app/types/dependent-info' +import { FormDialogService } from 'src/app/services/form-dialog.service' +import { ServiceConfigModal } from '../modals/config.component' +import { DependencyInfo } from '../types/dependency-info' +import { PackageConfigData } from '../types/package-config-data' + +@Pipe({ + name: 'toDependencies', + standalone: true, +}) +export class ToDependenciesPipe implements PipeTransform { + constructor( + private readonly router: Router, + private readonly formDialog: FormDialogService, + ) {} + + transform(pkg: PackageDataEntry): DependencyInfo[] { + if (!pkg.installed) return [] + + return Object.keys(pkg.installed['current-dependencies']) + .filter(depId => !!pkg.manifest.dependencies[depId]) + .map(depId => this.setDepValues(pkg, depId)) + } + + private setDepValues(pkg: PackageDataEntry, depId: string): DependencyInfo { + let errorText = '' + let actionText = 'View' + let action = (): unknown => + this.router.navigate([`portal`, `service`, depId]) + + const error = pkg.installed!.status['dependency-errors'][depId] + + if (error) { + // health checks failed + if (error.type === DependencyErrorType.HealthChecksFailed) { + errorText = 'Health check failed' + // not installed + } else if (error.type === DependencyErrorType.NotInstalled) { + errorText = 'Not installed' + actionText = 'Install' + action = () => this.fixDep(pkg, 'install', depId) + // incorrect version + } else if (error.type === DependencyErrorType.IncorrectVersion) { + errorText = 'Incorrect version' + actionText = 'Update' + action = () => this.fixDep(pkg, 'update', depId) + // not running + } else if (error.type === DependencyErrorType.NotRunning) { + errorText = 'Not running' + actionText = 'Start' + // config unsatisfied + } else if (error.type === DependencyErrorType.ConfigUnsatisfied) { + errorText = 'Config not satisfied' + actionText = 'Auto config' + action = () => this.fixDep(pkg, 'configure', depId) + } else if (error.type === DependencyErrorType.Transitive) { + errorText = 'Dependency has a dependency issue' + } + errorText = `${errorText}. ${pkg.manifest.title} will not work as expected.` + } + + const depInfo = pkg.installed!['dependency-info'][depId] + + return { + id: depId, + version: pkg.manifest.dependencies[depId].version, + title: depInfo?.title || depId, + icon: depInfo?.icon || '', + errorText, + actionText, + action, + } + } + + async fixDep( + pkg: PackageDataEntry, + action: 'install' | 'update' | 'configure', + depId: string, + ): Promise { + switch (action) { + case 'install': + case 'update': + return this.installDep(pkg.manifest, depId) + case 'configure': + return this.formDialog.open(ServiceConfigModal, { + label: `${ + pkg.installed!['dependency-info'][depId].title + } configuration`, + data: { + pkgId: depId, + dependentInfo: pkg.manifest, + }, + }) + } + } + + private async installDep(manifest: Manifest, depId: string): Promise { + const version = manifest.dependencies[depId].version + + const dependentInfo: DependentInfo = { + id: manifest.id, + title: manifest.title, + version, + } + const navigationExtras: NavigationExtras = { + state: { dependentInfo }, + } + + await this.router.navigate(['marketplace', depId], navigationExtras) + } + + private async configureDep( + manifest: Manifest, + dependencyId: string, + ): Promise { + const dependentInfo: DependentInfo = { + id: manifest.id, + title: manifest.title, + } + + return this.formDialog.open(ServiceConfigModal, { + label: 'Config', + data: { + pkgId: dependencyId, + dependentInfo, + }, + }) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-menu.pipe.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-menu.pipe.ts new file mode 100644 index 000000000..133269fad --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-menu.pipe.ts @@ -0,0 +1,162 @@ +import { inject, Pipe, PipeTransform, Type } from '@angular/core' +import { ActivatedRoute, Router } from '@angular/router' +import { Manifest } from '@start9labs/marketplace' +import { MarkdownComponent } from '@start9labs/shared' +import { TuiDialogService } from '@taiga-ui/core' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' +import { from } from 'rxjs' +import { + PackageDataEntry, + InstalledPackageInfo, +} from 'src/app/services/patch-db/data-model' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { FormDialogService } from 'src/app/services/form-dialog.service' +import { ProxyService } from 'src/app/services/proxy.service' +import { PackageConfigData } from '../types/package-config-data' +import { ServiceConfigModal } from '../modals/config.component' +import { ServiceLogsModal } from '../modals/logs.component' +import { ServiceCredentialsModal } from '../modals/credentials.component' +import { ServiceActionsModal } from '../modals/actions.component' + +export interface ServiceMenu { + icon: string + name: string + description: string + action: () => void +} + +@Pipe({ + name: 'toMenu', + standalone: true, +}) +export class ToMenusPipe implements PipeTransform { + private readonly api = inject(ApiService) + private readonly dialogs = inject(TuiDialogService) + private readonly formDialog = inject(FormDialogService) + private readonly route = inject(ActivatedRoute) + private readonly router = inject(Router) + private readonly proxyService = inject(ProxyService) + + transform({ manifest, installed }: PackageDataEntry): ServiceMenu[] { + const url = installed?.['marketplace-url'] + + return [ + { + icon: 'tuiIconListLarge', + name: 'Instructions', + description: `Understand how to use ${manifest.title}`, + action: () => this.showInstructions(manifest), + }, + { + icon: 'tuiIconSlidersLarge', + name: 'Config', + description: `Customize ${manifest.title}`, + action: () => this.openConfig(manifest), + }, + { + icon: 'tuiIconKeyLarge', + name: 'Credentials', + description: `Password, keys, or other credentials of interest`, + action: () => + this.showDialog( + `${manifest.title} credentials`, + manifest.id, + ServiceCredentialsModal, + ), + }, + { + icon: 'tuiIconZapLarge', + name: 'Actions', + description: `Uninstall and other commands specific to ${manifest.title}`, + action: () => + this.showDialog( + `${manifest.title} credentials`, + manifest.id, + ServiceActionsModal, + ), + }, + { + icon: 'tuiIconShieldLarge', + name: 'Outbound Proxy', + description: `Proxy all outbound traffic from ${manifest.title}`, + action: () => this.setProxy(manifest, installed!), + }, + { + icon: 'tuiIconFileTextLarge', + name: 'Logs', + description: `Raw, unfiltered logs`, + action: () => + this.showDialog( + `${manifest.title} logs`, + manifest.id, + ServiceLogsModal, + ), + }, + url + ? { + icon: 'tuiIconShoppingBagLarge', + name: 'Marketplace Listing', + description: `View ${manifest.title} on the Marketplace`, + action: () => + this.router.navigate(['marketplace', manifest.id], { + relativeTo: this.route, + queryParams: { url }, + }), + } + : { + icon: 'tuiIconShoppingBagLarge', + name: 'Marketplace Listing', + description: `This package was not installed from the marketplace`, + action: () => {}, + }, + ] + } + + private showInstructions({ title, id, version }: Manifest) { + this.api + .setDbValue(['ack-instructions', id], true) + .catch(e => console.error('Failed to mark instructions as seen', e)) + + this.dialogs + .open(new PolymorpheusComponent(MarkdownComponent), { + label: `${title} instructions`, + size: 'l', + data: { + content: from( + this.api.getStatic( + `/public/package-data/${id}/${version}/INSTRUCTIONS.md`, + ), + ), + }, + }) + .subscribe() + } + + private showDialog(label: string, data: any, modal: Type) { + this.dialogs + .open(new PolymorpheusComponent(modal), { + size: 'l', + label, + data, + }) + .subscribe() + } + + private openConfig({ title, id }: Manifest) { + this.formDialog.open(ServiceConfigModal, { + label: `${title} configuration`, + data: { pkgId: id }, + }) + } + + private setProxy( + { id }: Manifest, + { outboundProxy, interfaceInfo }: InstalledPackageInfo, + ) { + this.proxyService.presentModalSetOutboundProxy({ + outboundProxy, + packageId: id, + hasP2P: Object.values(interfaceInfo).some(i => i.type === 'p2p'), + }) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-status.pipe.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-status.pipe.ts new file mode 100644 index 000000000..6d915b94c --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-status.pipe.ts @@ -0,0 +1,16 @@ +import { Pipe, PipeTransform } from '@angular/core' +import { PackageDataEntry } from 'src/app/services/patch-db/data-model' +import { + PackageStatus, + renderPkgStatus, +} from 'src/app/services/pkg-status-rendering.service' + +@Pipe({ + name: 'toStatus', + standalone: true, +}) +export class ToStatusPipe implements PipeTransform { + transform(pkg: PackageDataEntry): PackageStatus { + return renderPkgStatus(pkg) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.html b/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.html new file mode 100644 index 000000000..d58506443 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.html @@ -0,0 +1,106 @@ + + + + +

Downloading

+

Validating

+

Unpacking

+
+
+ + + +
+

Status

+ + +
+ + +
+

Interfaces

+ +
+ + +
+

Health Checks

+ +
+
+ + +
+

Dependencies

+ +
+
+ +
+

Menu

+ +
+ +
+

Additional Info

+ + + + + + +
+
+
+
+
+
diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.scss b/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.scss new file mode 100644 index 000000000..3f186a990 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.scss @@ -0,0 +1,26 @@ +@import '@taiga-ui/core/styles/taiga-ui-local'; + +:host { + display: block; + height: 100%; + padding: 1px 2rem 3rem; + box-sizing: border-box; + overflow: auto; + + // TODO: Theme + background: #373a3f; +} + +.title { + text-transform: uppercase; + font-weight: bold; + font-size: 1rem; + margin: 2rem 0 1rem; + color: var(--tui-text-02); +} + +.status { + font-size: x-large; + margin: 1em 0; + display: block; +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.ts new file mode 100644 index 000000000..7e08c9687 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.ts @@ -0,0 +1,99 @@ +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { ActivatedRoute, Router } from '@angular/router' +import { getPkgId, isEmptyObject } from '@start9labs/shared' +import { PatchDB } from 'patch-db-client' +import { map, Observable, tap } from 'rxjs' +import { + DataModel, + HealthCheckResult, + PackageDataEntry, + PackageState, + ServiceOutboundProxy, +} from 'src/app/services/patch-db/data-model' +import { + PackageStatus, + PrimaryRendering, + PrimaryStatus, + StatusRendering, +} from 'src/app/services/pkg-status-rendering.service' +import { ConnectionService } from 'src/app/services/connection.service' +import { NavigationService } from '../../components/navigation/navigation.service' +import { toRouterLink } from '../../utils/to-router-link' + +const STATES = [ + PackageState.Installing, + PackageState.Updating, + PackageState.Restoring, +] + +@Component({ + templateUrl: 'service.component.html', + styleUrls: ['service.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ServiceComponent { + private readonly route = inject(ActivatedRoute) + private readonly router = inject(Router) + private readonly navigation = inject(NavigationService) + private readonly patch = inject>(PatchDB) + + readonly pkgId = getPkgId(this.route) + + readonly connected$ = inject(ConnectionService).connected$ + + readonly service$ = this.patch.watch$('package-data', this.pkgId).pipe( + tap(pkg => { + // if package disappears, navigate to list page + if (!pkg) { + this.router.navigate(['..'], { relativeTo: this.route }) + } else { + this.navigation.addTab({ + icon: pkg.icon, + title: pkg.manifest.title, + routerLink: toRouterLink(pkg.manifest.id), + }) + } + }), + ) + + readonly health$: Observable = this.patch + .watch$('package-data', this.pkgId, 'installed', 'status', 'main') + .pipe( + map(main => + main.status !== 'running' || isEmptyObject(main.health) + ? null + : Object.values(main.health), + ), + ) + + getRendering({ primary }: PackageStatus): StatusRendering { + return PrimaryRendering[primary] + } + + isInstalled({ state }: PackageDataEntry): boolean { + return state === PackageState.Installed + } + + isRunning({ primary }: PackageStatus): boolean { + return primary === PrimaryStatus.Running + } + + isBackingUp({ primary }: PackageStatus): boolean { + return primary === PrimaryStatus.BackingUp + } + + showProgress({ state }: PackageDataEntry): boolean { + return STATES.includes(state) + } + + getProxy(proxy?: ServiceOutboundProxy): string { + switch (proxy) { + case 'primary': + return 'System Primary' + case 'mirror': + return 'Mirror P2P' + default: + return proxy?.proxyId || 'None' + } + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/service.module.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/service.module.ts new file mode 100644 index 000000000..f4cb13244 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/service.module.ts @@ -0,0 +1,56 @@ +import { CommonModule } from '@angular/common' +import { NgModule } from '@angular/core' +import { RouterModule, Routes } from '@angular/router' +import { TuiLetModule } from '@taiga-ui/cdk' + +import { ServiceComponent } from './service.component' +import { ServiceProgressComponent } from './components/progress.component' +import { ServiceStatusComponent } from './components/status.component' +import { ServiceActionsComponent } from './components/actions.component' +import { ServiceInterfaceComponent } from './components/interface.component' +import { ServiceHealthCheckComponent } from './components/health-check.component' +import { ServiceDependencyComponent } from './components/dependency.component' +import { ServiceMenuComponent } from './components/menu.component' +import { ServiceAdditionalComponent } from './components/additional.component' + +import { ProgressDataPipe } from './pipes/progress-data.pipe' +import { ToDependenciesPipe } from './pipes/to-dependencies.pipe' +import { ToStatusPipe } from './pipes/to-status.pipe' +import { InterfaceInfoPipe } from './pipes/interface-info.pipe' +import { ToMenusPipe } from './pipes/to-menu.pipe' +import { ToAdditionalPipe } from './pipes/to-additional.pipe' + +const ROUTES: Routes = [ + { + path: ':pkgId', + component: ServiceComponent, + }, +] + +@NgModule({ + imports: [ + CommonModule, + TuiLetModule, + + ServiceProgressComponent, + ServiceStatusComponent, + ServiceActionsComponent, + ServiceInterfaceComponent, + ServiceHealthCheckComponent, + ServiceDependencyComponent, + ServiceMenuComponent, + ServiceAdditionalComponent, + + ProgressDataPipe, + ToDependenciesPipe, + ToStatusPipe, + InterfaceInfoPipe, + ToMenusPipe, + ToAdditionalPipe, + + RouterModule.forChild(ROUTES), + ], + declarations: [ServiceComponent], + exports: [ServiceComponent], +}) +export class ServiceModule {} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/types/dependency-info.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/types/dependency-info.ts new file mode 100644 index 000000000..a28c44a24 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/types/dependency-info.ts @@ -0,0 +1,9 @@ +export interface DependencyInfo { + id: string + title: string + icon: string + version: string + errorText: string + actionText: string + action: () => any +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/types/package-config-data.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/types/package-config-data.ts new file mode 100644 index 000000000..3981773fc --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/types/package-config-data.ts @@ -0,0 +1,6 @@ +import { DependentInfo } from 'src/app/types/dependent-info' + +export interface PackageConfigData { + readonly pkgId: string + readonly dependentInfo?: DependentInfo +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/service.component.html b/frontend/projects/ui/src/app/apps/portal/routes/services/service.component.html deleted file mode 100644 index 044b180cf..000000000 --- a/frontend/projects/ui/src/app/apps/portal/routes/services/service.component.html +++ /dev/null @@ -1 +0,0 @@ -{{ (service$ | async)?.manifest?.title }} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/service.component.scss b/frontend/projects/ui/src/app/apps/portal/routes/services/service.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/service.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/services/service.component.ts deleted file mode 100644 index ab64abb9a..000000000 --- a/frontend/projects/ui/src/app/apps/portal/routes/services/service.component.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { ChangeDetectionStrategy, Component, inject } from '@angular/core' -import { ActivatedRoute, Router } from '@angular/router' -import { getPkgId } from '@start9labs/shared' -import { PatchDB } from 'patch-db-client' -import { tap } from 'rxjs' -import { DataModel } from 'src/app/services/patch-db/data-model' -import { NavigationService } from '../../components/navigation/navigation.service' -import { toRouterLink } from '../../utils/to-router-link' - -@Component({ - templateUrl: 'service.component.html', - styleUrls: ['service.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class ServiceComponent { - private readonly route = inject(ActivatedRoute) - private readonly router = inject(Router) - private readonly navigation = inject(NavigationService) - private readonly patch = inject>(PatchDB) - - readonly service$ = this.patch - .watch$('package-data', getPkgId(this.route)) - .pipe( - tap(pkg => { - // if package disappears, navigate to list page - if (!pkg) { - this.router.navigate(['..'], { relativeTo: this.route }) - } else { - this.navigation.addTab({ - icon: pkg.icon, - title: pkg.manifest.title, - routerLink: toRouterLink(pkg.manifest.id), - }) - } - }), - ) -} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/services/services.module.ts b/frontend/projects/ui/src/app/apps/portal/routes/services/services.module.ts deleted file mode 100644 index 3312e476f..000000000 --- a/frontend/projects/ui/src/app/apps/portal/routes/services/services.module.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { CommonModule } from '@angular/common' -import { NgModule } from '@angular/core' -import { RouterModule, Routes } from '@angular/router' -import { ServiceComponent } from './service.component' - -const ROUTES: Routes = [ - { - path: ':pkgId', - component: ServiceComponent, - }, -] - -@NgModule({ - imports: [CommonModule, RouterModule.forChild(ROUTES)], - declarations: [ServiceComponent], - exports: [ServiceComponent], -}) -export class ServicesModule {} diff --git a/frontend/projects/ui/src/app/apps/portal/utils/to-router-link.ts b/frontend/projects/ui/src/app/apps/portal/utils/to-router-link.ts index 40a9ce418..459eed52d 100644 --- a/frontend/projects/ui/src/app/apps/portal/utils/to-router-link.ts +++ b/frontend/projects/ui/src/app/apps/portal/utils/to-router-link.ts @@ -1,3 +1,3 @@ export function toRouterLink(id: string): string { - return id.includes('/') ? id : `/portal/services/${id}` + return id.includes('/') ? id : `/portal/service/${id}` } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts index e81f6e294..704b867d6 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts @@ -64,5 +64,6 @@ const routes: Routes = [ InsecureWarningComponentModule, LaunchMenuComponentModule, ], + exports: [InterfaceInfoPipe], }) export class AppShowPageModule {} diff --git a/frontend/projects/ui/src/app/common/logs/logs.component.ts b/frontend/projects/ui/src/app/common/logs/logs.component.ts index 195767962..776d6fa1c 100644 --- a/frontend/projects/ui/src/app/common/logs/logs.component.ts +++ b/frontend/projects/ui/src/app/common/logs/logs.component.ts @@ -53,8 +53,8 @@ export class LogsComponent { params: ServerLogsReq, ) => Promise @Input({ required: true }) context!: string - @Input({ required: true }) defaultBack!: string - @Input({ required: true }) pageTitle!: string + @Input() defaultBack = '' + @Input() pageTitle = '' loading = true infiniteStatus: 0 | 1 | 2 = 0 diff --git a/frontend/projects/ui/src/styles.scss b/frontend/projects/ui/src/styles.scss index 8180ca0cf..145147082 100644 --- a/frontend/projects/ui/src/styles.scss +++ b/frontend/projects/ui/src/styles.scss @@ -1,3 +1,5 @@ +@import '@taiga-ui/core/styles/taiga-ui-local'; + @font-face { font-family: 'text-security-disc'; src: url('/assets/fonts/text-security-disc.woff2') format('woff2'); @@ -364,3 +366,40 @@ ul { cursor: pointer; margin: 0 12px 6px 0; } + +.g-action { + @include transition(background); + @include clearbtn(); + + display: flex; + align-items: center; + width: 100%; + gap: 1rem; + text-align: left; + font-size: 0.85rem; + padding: 0.5rem 1rem; + margin: 0 -1rem; + line-height: 1.25rem; + border-radius: 0.5rem; + color: var(--tui-text-01); + --tui-skeleton-radius: 1rem; +} + +a.g-action, +button.g-action { + &:hover { + background: var(--tui-clear); + } + + &:not(:last-child) { + box-shadow: 0 0.51rem 0 -0.5rem; + } + + &_static { + cursor: default; + + &:hover { + background: transparent; + } + } +} From df7a30bd14e2ed3415c61d0648cd292cc59a5772 Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Fri, 13 Oct 2023 19:04:20 +0400 Subject: [PATCH 018/169] refactor: refactor backups page to get rid of ionic (#2446) --- frontend/package-lock.json | 120 ++++----- frontend/package.json | 14 +- .../components/card/card.component.html | 9 +- .../components/card/card.component.scss | 4 + .../portal/components/card/card.component.ts | 2 +- .../components/drawer/drawer.component.ts | 2 +- .../navigation/navigation.component.html | 11 +- .../navigation/navigation.component.scss | 5 +- .../navigation/navigation.component.ts | 3 +- .../system-utilities.ts} | 4 + .../app/apps/portal/pipes/to-desktop-item.ts | 24 +- .../service/modals/actions.component.ts | 13 +- .../routes/service/service.component.html | 14 +- .../routes/service/service.component.scss | 27 +- .../routes/service/service.component.ts | 3 +- .../system/backups/backups.component.ts | 79 ++++++ .../backups/components/physical.component.ts | 81 ++++++ .../backups/components/status.component.ts | 69 +++++ .../backups/components/targets.component.ts | 124 +++++++++ .../backups/components/upcoming.component.ts | 78 ++++++ .../system/backups/modals/backup.component.ts | 131 +++++++++ .../system/backups/modals/edit.component.ts | 152 +++++++++++ .../backups/modals/history.component.ts | 198 ++++++++++++++ .../system/backups/modals/jobs.component.ts | 176 +++++++++++++ .../backups/modals/recover.component.ts | 131 +++++++++ .../system/backups/modals/report.component.ts | 86 ++++++ .../system/backups/modals/target.component.ts | 125 +++++++++ .../backups/modals/targets.component.ts | 249 ++++++++++++++++++ .../system/backups/pipes/duration.pipe.ts | 11 + .../backups/pipes/get-backup-icon.pipe.ts | 19 ++ .../backups/pipes/get-display-info.pipe.ts | 40 +++ .../system/backups/pipes/has-error.pipe.ts | 15 ++ .../backups/pipes/to-human-cron.pipe.ts | 35 +++ .../system/backups/pipes/to-options.pipe.ts | 42 +++ .../system/backups/services/create.service.ts | 46 ++++ .../backups/services/restore.service.ts | 97 +++++++ .../system/backups/types/backup-config.ts | 19 ++ .../system/backups/types/backup-type.ts | 1 + .../system/backups/types/display-info.ts | 6 + .../system/backups/types/recover-data.ts | 7 + .../system/backups/types/recover-option.ts | 8 + .../system/backups/utils/job-builder.ts | 41 +++ .../portal/routes/system/system.module.ts | 11 + .../navigation.service.ts | 7 +- .../app/apps/portal/types/navigation-item.ts | 5 + .../apps/portal/utils/system-tab-resolver.ts | 10 + .../app/apps/portal/utils/to-desktop-item.ts | 26 ++ .../ui/modals/prompt/prompt.component.html | 2 +- .../backup-history/backup-history.module.ts | 1 + .../pages/backup-jobs/backup-jobs.module.ts | 1 + .../edit-job/edit-job.component.scss | 1 + .../form-toggle/form-toggle.component.scss | 14 - .../form/form-toggle/form-toggle.component.ts | 2 +- frontend/projects/ui/src/styles.scss | 78 +++++- 54 files changed, 2313 insertions(+), 166 deletions(-) rename frontend/projects/ui/src/app/apps/portal/{components/drawer/drawer.const.ts => constants/system-utilities.ts} (84%) create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/backups.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/physical.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/status.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/targets.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/upcoming.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/backup.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/edit.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/history.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/jobs.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/recover.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/report.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/target.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/duration.pipe.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/get-backup-icon.pipe.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/get-display-info.pipe.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/has-error.pipe.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/to-human-cron.pipe.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/to-options.pipe.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/services/create.service.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/services/restore.service.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/backup-config.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/backup-type.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/display-info.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/recover-data.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/recover-option.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/backups/utils/job-builder.ts rename frontend/projects/ui/src/app/apps/portal/{components/navigation => services}/navigation.service.ts (83%) create mode 100644 frontend/projects/ui/src/app/apps/portal/types/navigation-item.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/utils/system-tab-resolver.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/utils/to-desktop-item.ts delete mode 100644 frontend/projects/ui/src/app/common/form/form-toggle/form-toggle.component.scss diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 90c1ddf7f..176c9c6f3 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -23,13 +23,13 @@ "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc8.beta2", - "@taiga-ui/addon-charts": "3.45.0", - "@taiga-ui/cdk": "3.45.0", - "@taiga-ui/core": "3.45.0", - "@taiga-ui/experimental": "3.45.0", - "@taiga-ui/icons": "3.45.0", - "@taiga-ui/kit": "3.45.0", - "@taiga-ui/styles": "3.45.0", + "@taiga-ui/addon-charts": "3.47.0", + "@taiga-ui/cdk": "3.47.0", + "@taiga-ui/core": "3.47.0", + "@taiga-ui/experimental": "3.47.0", + "@taiga-ui/icons": "3.47.0", + "@taiga-ui/kit": "3.47.0", + "@taiga-ui/styles": "3.47.0", "@tinkoff/ng-dompurify": "4.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", @@ -3632,9 +3632,9 @@ } }, "node_modules/@ng-web-apis/common": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@ng-web-apis/common/-/common-3.0.2.tgz", - "integrity": "sha512-PWMegIsuxfmya8AgSx4fQR5mt4ozaSflJARN6I4W6kGKxX/MnHGt86+djN3P6KVoWjI+bcQt2UlF1jlW9DgWiQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@ng-web-apis/common/-/common-3.0.3.tgz", + "integrity": "sha512-CJm/NYQ4JrN0qNVbPcKeRnZ5nL0zL6RrJrNwBW/LnZEGp9t0mxgLYKw52fM4xRm0OVXOXoRwCbjr8gSUD6vstQ==", "dependencies": { "tslib": "^2.2.0" }, @@ -3645,9 +3645,9 @@ } }, "node_modules/@ng-web-apis/intersection-observer": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@ng-web-apis/intersection-observer/-/intersection-observer-3.1.2.tgz", - "integrity": "sha512-AojVoHWCS62lJ6LE4BHzyY9E0CXIX8OLmdBw4q6PBJOSZan4vlpup/f9Pl2FPMvw2tVu986IvORFShu1d98y0g==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@ng-web-apis/intersection-observer/-/intersection-observer-3.1.3.tgz", + "integrity": "sha512-mGxUcPOJ/y8oXY85c9k2UnZpGElu1wgAwN66brfFNKswwCYM8GLbrIOm0Zsdb6vyJiNFgaoZ+tG+dEZPobCzGQ==", "dependencies": { "tslib": "^2.2.0" }, @@ -3657,9 +3657,9 @@ } }, "node_modules/@ng-web-apis/mutation-observer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-3.0.2.tgz", - "integrity": "sha512-x1cq/Vznmz4aJ7STbZmA+4HCE+jxDiw2J359+iyiB+xyCVfZTECrJYP9g/hhzIRxyVPFznrPp61TDCRnLVyNWw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-3.0.3.tgz", + "integrity": "sha512-gl2OGn7+N8w0VuBLzGP5Ypw2nMqbnV3TgNdnQSyCC5I7+3Rz/Q3OzQqciTNUPAqd5HWWwW/IKFPvgI6ePYWXog==", "dependencies": { "tslib": "^2.2.0" }, @@ -3669,9 +3669,9 @@ } }, "node_modules/@ng-web-apis/resize-observer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@ng-web-apis/resize-observer/-/resize-observer-3.0.2.tgz", - "integrity": "sha512-4aTZNHztwyJe4nJY/++0diUcd8jL7kQS+doPCREE6U4niM8Xvc98uK4qD340Faw9pmybkgsKD7EinyyPE5DIFQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@ng-web-apis/resize-observer/-/resize-observer-3.0.3.tgz", + "integrity": "sha512-2EVqcl/HTzObQmIgtXEs2KHrPUXC8r6ePPfbAAUbuVdlDAZm6vKsXYHvH+Zkm/JKNp1MZJb/3kb6UkkZtf8ewA==", "dependencies": { "tslib": "^2.2.0" }, @@ -4041,9 +4041,9 @@ } }, "node_modules/@taiga-ui/addon-charts": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.45.0.tgz", - "integrity": "sha512-KR9d95Hix/+5oiXiyfnqnzpyxw7am689tZ69y+2Unv2kYENQqc0LXf2SG981rIHLJVr4mVDuBfmJ7I32M+zvVw==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.47.0.tgz", + "integrity": "sha512-winbbnpo1hJv6vq/6ov2TEF1OnGCNeLgZAfokJ4/dYTysT9xUPgEiQAff55sqo6zlY2sYLBgHtxn3djeW5bj+Q==", "dependencies": { "tslib": ">=2.0.0" }, @@ -4051,19 +4051,19 @@ "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@ng-web-apis/common": ">=3.0.0", - "@taiga-ui/cdk": ">=3.45.0", - "@taiga-ui/core": ">=3.45.0", + "@taiga-ui/cdk": ">=3.47.0", + "@taiga-ui/core": ">=3.47.0", "@tinkoff/ng-polymorpheus": ">=4.0.0" } }, "node_modules/@taiga-ui/cdk": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.45.0.tgz", - "integrity": "sha512-pFdy5yxkzPGYrtyA1e92SYYXel3uHb+3b2NFjNqbFzLnW3p0NYILZfQPb4I4U9X5cZBhVaFlPGsHXwswCZKqGw==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.47.0.tgz", + "integrity": "sha512-SCEnKZq5Psac4NexCPDKmb+38YAcowaWWZNBuOgCJZp63aesHkRkH0KjMCoTBWe19F4EPsE48ARndJa/1wPQkA==", "dependencies": { - "@ng-web-apis/common": "3.0.2", - "@ng-web-apis/mutation-observer": "3.0.2", - "@ng-web-apis/resize-observer": "3.0.2", + "@ng-web-apis/common": "3.0.3", + "@ng-web-apis/mutation-observer": "3.0.3", + "@ng-web-apis/resize-observer": "3.0.3", "@tinkoff/ng-event-plugins": "3.1.0", "@tinkoff/ng-polymorpheus": "4.1.0", "tslib": "2.6.2" @@ -4081,11 +4081,11 @@ } }, "node_modules/@taiga-ui/core": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.45.0.tgz", - "integrity": "sha512-16mCoBlorIx9PHZUGRWfX2K6LTMNo62h4bKOkZEz/l5nxzP+Wsa/vHgmditwE4eKg7v7nHGSPrdmNxlgzcs2dQ==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.47.0.tgz", + "integrity": "sha512-+NKA/yvvOr/XZvv0DRDV2kTqdZ8W3weQX4t80lS8SvCM++yl4Ep8p7/tSv16LZYSpaFPxzWx7o4bPJkgD5CwzQ==", "dependencies": { - "@taiga-ui/i18n": "^3.45.0", + "@taiga-ui/i18n": "^3.47.0", "tslib": ">=2.0.0" }, "peerDependencies": { @@ -4097,34 +4097,34 @@ "@angular/router": ">=12.0.0", "@ng-web-apis/common": ">=3.0.0", "@ng-web-apis/mutation-observer": ">=3.0.0", - "@taiga-ui/cdk": ">=3.45.0", - "@taiga-ui/i18n": ">=3.45.0", + "@taiga-ui/cdk": ">=3.47.0", + "@taiga-ui/i18n": ">=3.47.0", "@tinkoff/ng-event-plugins": ">=3.1.0", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/experimental": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/experimental/-/experimental-3.45.0.tgz", - "integrity": "sha512-XsYKHl+CSGd/Te4UtQb/nHOOo9jI6UjAcqna2D5aPi/sntgP1m2hY7Wu0mxtk9ExajuqZjxocJSx1mSorwDC/Q==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/experimental/-/experimental-3.47.0.tgz", + "integrity": "sha512-cmgVXL5aXPys2qL92Xk/fLcLpU/8EPGkayYN7UtT7MNnz3bFM+vbfiY7qbbXrNUvbPjjt5El81hG4NLu9/XJag==", "dependencies": { "tslib": ">=2.0.0" }, "peerDependencies": { "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", - "@taiga-ui/cdk": ">=3.45.0", - "@taiga-ui/core": ">=3.45.0", - "@taiga-ui/kit": ">=3.45.0", + "@taiga-ui/cdk": ">=3.47.0", + "@taiga-ui/core": ">=3.47.0", + "@taiga-ui/kit": ">=3.47.0", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/i18n": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.45.0.tgz", - "integrity": "sha512-Dx8QvGaEu/i7M/F0QXa4fRygk5pL8ZXCnIyvRVWcGoJG9Bzfueb+1gsyBp/b7ogHK3FSgj88QsN1EBW1L0IiXQ==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.47.0.tgz", + "integrity": "sha512-41C+ZBm8+rSR5/8ODmBn14dr5Z5MLYTpadXeV7u+AnrfsGQ3hA4D/AeiFHMNhp8zdXnsndDh0m/smB7Vkf2k5w==", "dependencies": { "tslib": ">=2.0.0" }, @@ -4135,25 +4135,25 @@ } }, "node_modules/@taiga-ui/icons": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.45.0.tgz", - "integrity": "sha512-Dn3ImJx2o3vEGtUn05IeEj0JPEYU3wEUtyXcOpK1mqN2AxYnLmAFU/5AtYMeJeQoGEuFsRlGbZfcihieR1CPsQ==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.47.0.tgz", + "integrity": "sha512-natMScHcxN4o9p7cG1dZncGkqDD7PsCqtx+s9x7hivUz5V/CPxJC8p0qBZRxgwcVZfSvvBbl9iP6Pubazkztxw==", "dependencies": { "tslib": ">=2.0.0" }, "peerDependencies": { - "@taiga-ui/cdk": ">=3.45.0" + "@taiga-ui/cdk": ">=3.47.0" } }, "node_modules/@taiga-ui/kit": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.45.0.tgz", - "integrity": "sha512-BlQeWh6x041YOsxHU+e0BZaZofo8QZ04gAtKewvWXXUret0keBEbnXhFpyiQLQR0GjM1/0ls3rPHORW4rYYvUw==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.47.0.tgz", + "integrity": "sha512-un5nqmhxp9Q8Oa1aM5OjHxRTJb920raVImiXmaqJGyFIapgm8evqU6Ru9eaBH82giwMRUrVsjAa/zrzclvLsLg==", "dependencies": { "@maskito/angular": "1.7.0", "@maskito/core": "1.7.0", "@maskito/kit": "1.7.0", - "@ng-web-apis/intersection-observer": "3.1.2", + "@ng-web-apis/intersection-observer": "3.1.3", "text-mask-core": "5.1.2", "tslib": ">=2.0.0" }, @@ -4165,19 +4165,19 @@ "@ng-web-apis/common": ">=3.0.0", "@ng-web-apis/mutation-observer": ">=3.0.0", "@ng-web-apis/resize-observer": ">=3.0.0", - "@taiga-ui/cdk": ">=3.45.0", - "@taiga-ui/core": ">=3.45.0", - "@taiga-ui/i18n": ">=3.45.0", + "@taiga-ui/cdk": ">=3.47.0", + "@taiga-ui/core": ">=3.47.0", + "@taiga-ui/i18n": ">=3.47.0", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/styles": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/styles/-/styles-3.45.0.tgz", - "integrity": "sha512-WxJh5/U0JUsiJmPebw5x6PbCcfad7rV+soUhM3pdUb86uQs+grpqinIEXhhyeuIZrylofkyo70lgV13gJHRr/w==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/styles/-/styles-3.47.0.tgz", + "integrity": "sha512-zgW9IhVhUpax7VuH3K4KL53OkZxy5JIxQ5JuSmLE+XIHsQ3sEDkoqnGSmvkDVbex5fo6Kbs/7iS5G1yKrSWw+Q==", "peerDependencies": { - "@taiga-ui/cdk": ">=3.45.0", + "@taiga-ui/cdk": ">=3.47.0", "tslib": ">=2.0.0" } }, diff --git a/frontend/package.json b/frontend/package.json index 592463a34..4e17618ee 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -44,13 +44,13 @@ "@materia-ui/ngx-monaco-editor": "^6.0.0", "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", - "@taiga-ui/addon-charts": "3.45.0", - "@taiga-ui/cdk": "3.45.0", - "@taiga-ui/core": "3.45.0", - "@taiga-ui/experimental": "3.45.0", - "@taiga-ui/icons": "3.45.0", - "@taiga-ui/kit": "3.45.0", - "@taiga-ui/styles": "3.45.0", + "@taiga-ui/addon-charts": "3.47.0", + "@taiga-ui/cdk": "3.47.0", + "@taiga-ui/core": "3.47.0", + "@taiga-ui/experimental": "3.47.0", + "@taiga-ui/icons": "3.47.0", + "@taiga-ui/kit": "3.47.0", + "@taiga-ui/styles": "3.47.0", "@tinkoff/ng-dompurify": "4.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html index db497170b..db41e3af8 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html +++ b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html @@ -1,5 +1,12 @@ - + + + + diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.scss b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.scss index 0af6ca6c3..32d5b1271 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.scss +++ b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.scss @@ -29,6 +29,10 @@ border-radius: 100%; } +tui-svg.icon { + transform: scale(1.5); +} + .title { max-width: 100%; } diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts index 2c3b87760..2f1c2c258 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts @@ -14,7 +14,7 @@ import { TuiHostedDropdownModule, TuiSvgModule, } from '@taiga-ui/core' -import { NavigationService } from '../navigation/navigation.service' +import { NavigationService } from '../../services/navigation.service' import { Action, ActionsComponent } from '../actions/actions.component' import { toRouterLink } from '../../utils/to-router-link' diff --git a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts index d516a0887..f22dccb1f 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts @@ -21,9 +21,9 @@ import { import { TuiInputModule } from '@taiga-ui/kit' import { CardComponent } from '../card/card.component' import { ServicesService } from '../../services/services.service' -import { SYSTEM_UTILITIES } from './drawer.const' import { toRouterLink } from '../../utils/to-router-link' import { DrawerItemDirective } from './drawer-item.directive' +import { SYSTEM_UTILITIES } from '../../constants/system-utilities' @Component({ selector: 'app-drawer', diff --git a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html index d57dc2cfe..ba901e01c 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html +++ b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html @@ -4,7 +4,7 @@ routerLinkActive="tab_active" [routerLinkActiveOptions]="{ exact: true }" > - + - + + + +

-

Interfaces

+

Interfaces

-

Health Checks

+

Health Checks

Health Checks
-

Dependencies

+

Dependencies

-

Additional Info

+

Additional Info

Additional Info class="g-action" [class.g-action_static]="!additional.icon" [additional]="additional" - (click)="additional.action && additional.action()" + (click)="additional.action?.()" > diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.scss b/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.scss index 3f186a990..913a5907f 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.scss +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.scss @@ -1,26 +1,15 @@ @import '@taiga-ui/core/styles/taiga-ui-local'; -:host { - display: block; - height: 100%; - padding: 1px 2rem 3rem; - box-sizing: border-box; - overflow: auto; - - // TODO: Theme - background: #373a3f; -} - -.title { - text-transform: uppercase; - font-weight: bold; - font-size: 1rem; - margin: 2rem 0 1rem; - color: var(--tui-text-02); -} - .status { font-size: x-large; margin: 1em 0; display: block; } + +.g-action_static { + cursor: default; + + &:hover { + background: transparent; + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.ts index 7e08c9687..d7f44ddf0 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.ts @@ -17,7 +17,7 @@ import { StatusRendering, } from 'src/app/services/pkg-status-rendering.service' import { ConnectionService } from 'src/app/services/connection.service' -import { NavigationService } from '../../components/navigation/navigation.service' +import { NavigationService } from '../../services/navigation.service' import { toRouterLink } from '../../utils/to-router-link' const STATES = [ @@ -29,6 +29,7 @@ const STATES = [ @Component({ templateUrl: 'service.component.html', styleUrls: ['service.component.scss'], + host: { class: 'g-page' }, changeDetection: ChangeDetectionStrategy.OnPush, }) export class ServiceComponent { diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/backups.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/backups.component.ts new file mode 100644 index 000000000..871ed87b8 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/backups.component.ts @@ -0,0 +1,79 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { TuiDialogService, TuiSvgModule } from '@taiga-ui/core' +import { BackupsCreateService } from './services/create.service' +import { BackupsRestoreService } from './services/restore.service' +import { BackupsUpcomingComponent } from './components/upcoming.component' +import { TARGETS } from './modals/targets.component' +import { HISTORY } from './modals/history.component' +import { JOBS } from './modals/jobs.component' + +@Component({ + template: ` +
+

Options

+ +
+
+

Upcoming Jobs

+
+
+ `, + host: { class: 'g-page' }, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, TuiSvgModule, BackupsUpcomingComponent], +}) +export class BackupsComponent { + private readonly dialogs = inject(TuiDialogService) + + readonly options = [ + { + name: 'Create a Backup', + icon: 'tuiIconPlusLarge', + description: 'Create a one-time backup', + action: inject(BackupsCreateService).handle, + }, + { + name: 'Restore from Backup', + icon: 'tuiIconShareLarge', + description: 'Restore services from a backup', + action: inject(BackupsRestoreService).handle, + }, + { + name: 'Jobs', + icon: 'tuiIconToolLarge', + description: 'Manage backup jobs', + action: () => + this.dialogs + .open(JOBS, { label: 'Backup Jobs', size: 'l' }) + .subscribe(), + }, + { + name: 'Targets', + icon: 'tuiIconDatabaseLarge', + description: 'Manage backup targets', + action: () => + this.dialogs.open(TARGETS, { label: 'Backup Targets' }).subscribe(), + }, + { + name: 'History', + icon: 'tuiIconArchiveLarge', + description: 'View your entire backup history', + action: () => + this.dialogs + .open(HISTORY, { label: 'Backup History', size: 'l' }) + .subscribe(), + }, + ] +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/physical.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/physical.component.ts new file mode 100644 index 000000000..9b041819c --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/physical.component.ts @@ -0,0 +1,81 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + EventEmitter, + Input, + Output, +} from '@angular/core' +import { TuiForModule } from '@taiga-ui/cdk' +import { TuiButtonModule, TuiSvgModule } from '@taiga-ui/core' +import { UnknownDisk } from 'src/app/services/api/api.types' +import { IonicModule } from '@ionic/angular' +import { UnitConversionPipesModule } from '@start9labs/shared' + +@Component({ + selector: 'table[backupsPhysical]', + template: ` + + + Make/Model + Label + Capacity + Used + + + + + + + {{ disk.vendor || 'unknown make' }}, + {{ disk.model || 'unknown model' }} + + {{ disk.label }} + {{ disk.capacity | convertBytes }} + {{ disk.used ? (disk.used | convertBytes) : 'Unknown' }} + + + + + + + +
Loading
+ + +
+ + + + To add a new physical backup target, connect the drive and click + refresh. + + + + + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + TuiForModule, + TuiSvgModule, + TuiButtonModule, + IonicModule, + UnitConversionPipesModule, + ], +}) +export class BackupsPhysicalComponent { + @Input() + backupsPhysical: readonly UnknownDisk[] | null = null + + @Output() + readonly add = new EventEmitter() +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/status.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/status.component.ts new file mode 100644 index 000000000..a021438f3 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/status.component.ts @@ -0,0 +1,69 @@ +import { + ChangeDetectionStrategy, + Component, + inject, + Input, +} from '@angular/core' +import { Emver } from '@start9labs/shared' +import { TuiSvgModule } from '@taiga-ui/core' +import { BackupTarget } from 'src/app/services/api/api.types' +import { BackupType } from '../types/backup-type' + +@Component({ + selector: 'backups-status', + template: ` + + {{ status.text }} + `, + styles: [':host { display: flex; gap: 0.5rem; align-items: center }'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [TuiSvgModule], +}) +export class BackupsStatusComponent { + private readonly emver = inject(Emver) + + @Input({ required: true }) type!: BackupType + @Input({ required: true }) target!: BackupTarget + + get status() { + if (!this.target.mountable) { + return { + icon: 'tuiIconBarChartLarge', + color: 'var(--tui-negative)', + text: 'Unable to connect', + } + } + + if (this.type === 'create') { + return { + icon: 'tuiIconCloudLarge', + color: 'var(--tui-positive)', + text: this.hasBackup + ? 'Available, contains existing backup' + : 'Available for fresh backup', + } + } + + if (this.hasBackup) { + return { + icon: 'tuiIconCloudLarge', + color: 'var(--tui-positive)', + text: 'Embassy backup detected', + } + } + + return { + icon: 'tuiIconCloudOffLarge', + color: 'var(--tui-negative)', + text: 'No Embassy backup', + } + } + + private get hasBackup(): boolean { + return ( + !!this.target['embassy-os'] && + this.emver.compare(this.target['embassy-os'].version, '0.3.0') !== -1 + ) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/targets.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/targets.component.ts new file mode 100644 index 000000000..0b955a35c --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/targets.component.ts @@ -0,0 +1,124 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + EventEmitter, + inject, + Input, + Output, +} from '@angular/core' +import { TuiForModule } from '@taiga-ui/cdk' +import { + TuiButtonModule, + TuiDialogOptions, + TuiDialogService, + TuiSvgModule, +} from '@taiga-ui/core' +import { TUI_PROMPT, TuiPromptData } from '@taiga-ui/kit' +import { filter, map, Subject, switchMap } from 'rxjs' +import { BackupTarget } from 'src/app/services/api/api.types' +import { GetBackupIconPipe } from '../pipes/get-backup-icon.pipe' + +@Component({ + selector: 'table[backupsTargets]', + template: ` + + + Name + Type + Available + Path + + + + + + {{ target.name }} + + + {{ target.type | titlecase }} + + + + + {{ target.path }} + + + + + + + + +
Loading
+ + +
+ + No saved backup targets. + + + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + TuiForModule, + TuiSvgModule, + TuiButtonModule, + GetBackupIconPipe, + ], +}) +export class BackupsTargetsComponent { + private readonly dialogs = inject(TuiDialogService) + + readonly delete$ = new Subject() + readonly update$ = new Subject() + + @Input() + backupsTargets: readonly BackupTarget[] | null = null + + @Output() + readonly update = new EventEmitter() + + @Output() + readonly delete = this.delete$.pipe( + switchMap(id => + this.dialogs.open(TUI_PROMPT, OPTIONS).pipe( + filter(Boolean), + map(() => id), + ), + ), + ) +} + +const OPTIONS: Partial> = { + label: 'Confirm', + size: 's', + data: { + content: 'Forget backup target? This actions cannot be undone.', + no: 'Cancel', + yes: 'Delete', + }, +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/upcoming.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/upcoming.component.ts new file mode 100644 index 000000000..6473356c7 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/upcoming.component.ts @@ -0,0 +1,78 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { TuiForModule } from '@taiga-ui/cdk' +import { TuiSvgModule } from '@taiga-ui/core' +import { PatchDB } from 'patch-db-client' +import { from, map, Observable } from 'rxjs' +import { CronJob } from 'cron' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { BackupJob } from 'src/app/services/api/api.types' +import { GetBackupIconPipe } from '../pipes/get-backup-icon.pipe' + +@Component({ + selector: 'table[backupsUpcoming]', + template: ` + + + Scheduled + Job + Target + Packages + + + + + + + Running + + + {{ job.next | date : 'MMM d, y, h:mm a' }} + + + {{ job.name }} + + + {{ job.target.name }} + + Packages: {{ job['package-ids'].length }} + + + You have no active or upcoming backup jobs + + + +
Loading
+ +
+ + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, TuiForModule, TuiSvgModule, GetBackupIconPipe], +}) +export class BackupsUpcomingComponent { + readonly current$: Observable = inject>(PatchDB) + .watch$('server-info', 'status-info', 'current-backup', 'job') + .pipe(map(job => job || {})) + + readonly upcoming$ = from(inject(ApiService).getBackupJobs({})).pipe( + map(jobs => + jobs + .map(job => { + const nextDate = new CronJob(job.cron, () => {}).nextDate() + + return { + ...job, + next: nextDate.toISO(), + diff: nextDate.diffNow().milliseconds, + } + }) + .sort((a, b) => a.diff - b.diff), + ), + ) +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/backup.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/backup.component.ts new file mode 100644 index 000000000..c45a0ad23 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/backup.component.ts @@ -0,0 +1,131 @@ +import { CommonModule } from '@angular/common' +import { Component, inject } from '@angular/core' +import { FormsModule } from '@angular/forms' +import { TuiForModule } from '@taiga-ui/cdk' +import { + TuiButtonModule, + TuiDialogContext, + TuiDialogOptions, + TuiGroupModule, + TuiLoaderModule, +} from '@taiga-ui/core' +import { TuiCheckboxBlockModule } from '@taiga-ui/kit' +import { + POLYMORPHEUS_CONTEXT, + PolymorpheusComponent, +} from '@tinkoff/ng-polymorpheus' +import { PatchDB } from 'patch-db-client' +import { firstValueFrom, map } from 'rxjs' +import { DataModel, PackageState } from 'src/app/services/patch-db/data-model' + +interface Package { + id: string + title: string + icon: string + disabled: boolean + checked: boolean +} + +@Component({ + template: ` +
+ +
+ + {{ pkg.title }} +
+
+ + No services installed! +
+
+ + +
+ `, + styles: [ + ` + :host { + display: flex; + flex-direction: column; + margin-top: 1.5rem; + } + + .icon { + width: 2.5rem; + border-radius: 100%; + } + `, + ], + standalone: true, + imports: [ + CommonModule, + FormsModule, + TuiForModule, + TuiButtonModule, + TuiGroupModule, + TuiCheckboxBlockModule, + TuiLoaderModule, + ], +}) +export class BackupsBackupModal { + private readonly patch = inject>(PatchDB) + readonly context = + inject>( + POLYMORPHEUS_CONTEXT, + ) + + hasSelection = false + + pkgs: readonly Package[] | null = null + + async ngOnInit() { + this.pkgs = await firstValueFrom( + this.patch.watch$('package-data').pipe( + map(pkgs => + Object.values(pkgs) + .map(({ manifest: { id, title }, icon, state }) => ({ + id, + title, + icon, + disabled: state !== PackageState.Installed, + checked: false, + })) + .sort((a, b) => + b.title.toLowerCase() > a.title.toLowerCase() ? -1 : 1, + ), + ), + ), + ) + } + + done() { + this.context.completeWith( + this.pkgs?.filter(p => p.checked).map(p => p.id) || [], + ) + } + + handleChange() { + this.hasSelection = !!this.pkgs?.some(p => p.checked) + } + + toggleSelectAll() { + this.pkgs?.forEach(p => (p.checked = !this.hasSelection && !p.disabled)) + this.hasSelection = !this.hasSelection + } +} + +export const BACKUP = new PolymorpheusComponent(BackupsBackupModal) + +export const BACKUP_OPTIONS: Partial> = { + label: 'Select Services to Back Up', +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/edit.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/edit.component.ts new file mode 100644 index 000000000..de21a5d04 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/edit.component.ts @@ -0,0 +1,152 @@ +import { CommonModule } from '@angular/common' +import { Component, inject } from '@angular/core' +import { FormsModule } from '@angular/forms' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { + TuiDialogContext, + TuiDialogService, + TuiWrapperModule, +} from '@taiga-ui/core' +import { TuiBadgeModule, TuiButtonModule } from '@taiga-ui/experimental' +import { + TuiInputModule, + TuiInputNumberModule, + TuiToggleModule, +} from '@taiga-ui/kit' +import { + POLYMORPHEUS_CONTEXT, + PolymorpheusComponent, +} from '@tinkoff/ng-polymorpheus' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { BackupJob, BackupTarget } from 'src/app/services/api/api.types' +import { TARGET, TARGET_CREATE } from './target.component' +import { BACKUP, BACKUP_OPTIONS } from './backup.component' +import { BackupJobBuilder } from '../utils/job-builder' +import { ToHumanCronPipe } from '../pipes/to-human-cron.pipe' + +@Component({ + template: ` +
+ + Job Name + + + + + + Schedule + + +
+ {{ human.message }} +
+
+ Also Execute Now + +
+ +
+ `, + styles: [ + ` + .form { + display: flex; + flex-direction: column; + gap: 1rem; + } + + .button[data-size] { + width: unset; + padding: 1rem; + text-indent: 0; + justify-content: space-between; + } + `, + ], + standalone: true, + imports: [ + CommonModule, + FormsModule, + TuiInputModule, + TuiInputNumberModule, + TuiToggleModule, + TuiWrapperModule, + TuiButtonModule, + TuiBadgeModule, + ToHumanCronPipe, + ], +}) +export class BackupsEditModal { + private readonly api = inject(ApiService) + private readonly errorService = inject(ErrorService) + private readonly loader = inject(LoadingService) + private readonly dialogs = inject(TuiDialogService) + private readonly context = + inject>(POLYMORPHEUS_CONTEXT) + + get job() { + return this.context.data + } + + async save() { + const loader = this.loader.open('Saving Job').subscribe() + + try { + const job = this.job.job.id + ? await this.api.updateBackupJob(this.job.buildUpdate(this.job.job.id)) + : await this.api.createBackupJob(this.job.buildCreate()) + + this.context.completeWith(job) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } + + selectTarget() { + this.dialogs.open(TARGET, TARGET_CREATE).subscribe(target => { + this.job.target = target + }) + } + + selectPackages() { + this.dialogs.open(BACKUP, BACKUP_OPTIONS).subscribe(id => { + this.job['package-ids'] = id + }) + } +} + +export const EDIT = new PolymorpheusComponent(BackupsEditModal) diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/history.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/history.component.ts new file mode 100644 index 000000000..ea5330fe3 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/history.component.ts @@ -0,0 +1,198 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { FormsModule } from '@angular/forms' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' +import { + ALWAYS_FALSE_HANDLER, + ALWAYS_TRUE_HANDLER, + TuiForModule, +} from '@taiga-ui/cdk' +import { + TuiButtonModule, + TuiDialogService, + TuiLinkModule, + TuiSvgModule, +} from '@taiga-ui/core' +import { TuiCheckboxModule } from '@taiga-ui/kit' +import { BehaviorSubject } from 'rxjs' +import { BackupRun } from 'src/app/services/api/api.types' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { DurationPipe } from '../pipes/duration.pipe' +import { HasErrorPipe } from '../pipes/has-error.pipe' +import { GetBackupIconPipe } from '../pipes/get-backup-icon.pipe' +import { REPORT } from './report.component' + +@Component({ + template: ` + +

+ Past Events + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Started AtDurationResultJobTarget
{{ run['started-at'] | date : 'medium' }} + {{ run['started-at'] | duration : run['completed-at'] }} Minutes + + + + + + + {{ run.job.name || 'No job' }} + + {{ run.job.target.name }} +
Loading
No backups have been run yet.
+ `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + FormsModule, + TuiForModule, + TuiButtonModule, + TuiCheckboxModule, + TuiSvgModule, + TuiLinkModule, + DurationPipe, + HasErrorPipe, + GetBackupIconPipe, + ], +}) +export class BackupsHistoryModal { + private readonly api = inject(ApiService) + private readonly dialogs = inject(TuiDialogService) + private readonly errorService = inject(ErrorService) + private readonly loader = inject(LoadingService) + + readonly loading$ = new BehaviorSubject(true) + + runs: BackupRun[] | null = null + selected: boolean[] = [] + + get all(): boolean | null { + if (this.selected.length === 0) return false + + const response = this.selected[0] + + for (let i = 1; i < this.selected.length; i++) { + if (this.selected[i] !== response) { + return null + } + } + + return response + } + + get disabled() { + return !this.selected.length || !this.selected.some(Boolean) + } + + async ngOnInit() { + try { + this.runs = await this.api.getBackupRuns({}) + this.selected = this.runs.map(ALWAYS_FALSE_HANDLER) + } catch (e: any) { + this.runs = [] + this.errorService.handleError(e) + } finally { + this.loading$.next(false) + } + } + + async delete() { + const loader = this.loader.open('Deleting...').subscribe() + const ids = this.selected + .filter(Boolean) + .map((_, i) => this.runs?.[i].id || '') + + try { + await this.api.deleteBackupRuns({ ids }) + this.runs = this.runs?.filter(r => !ids.includes(r.id)) || [] + this.selected = this.runs.map(ALWAYS_FALSE_HANDLER) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } + + showReport(run: BackupRun) { + this.dialogs + .open(REPORT, { + label: 'Backup Report', + data: { + report: run.report, + timestamp: run['completed-at'], + }, + }) + .subscribe() + } + + toggle() { + if (this.all) { + this.selected = this.selected.map(ALWAYS_FALSE_HANDLER) + } else { + this.selected = this.selected.map(ALWAYS_TRUE_HANDLER) + } + } +} + +export const HISTORY = new PolymorpheusComponent(BackupsHistoryModal) diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/jobs.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/jobs.component.ts new file mode 100644 index 000000000..132afaf71 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/jobs.component.ts @@ -0,0 +1,176 @@ +import { CommonModule } from '@angular/common' +import { Component, inject, OnInit } from '@angular/core' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { TuiForModule } from '@taiga-ui/cdk' +import { + TuiButtonModule, + TuiDialogOptions, + TuiDialogService, + TuiNotificationModule, + TuiSvgModule, +} from '@taiga-ui/core' +import { TUI_PROMPT, TuiPromptData } from '@taiga-ui/kit' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' +import { BehaviorSubject, filter } from 'rxjs' +import { BackupJob } from 'src/app/services/api/api.types' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { BackupJobBuilder } from '../utils/job-builder' +import { ToHumanCronPipe } from '../pipes/to-human-cron.pipe' +import { GetBackupIconPipe } from '../pipes/get-backup-icon.pipe' +import { EDIT } from './edit.component' + +@Component({ + template: ` + + Scheduling automatic backups is an excellent way to ensure your Embassy + data is safely backed up. Your Embassy will issue a notification whenever + one of your scheduled backups succeeds or fails. +
+ View instructions + + +

+ Saved Jobs + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTargetPackagesSchedule
{{ job.name }} + + {{ job.target.name }} + Packages: {{ job['package-ids'].length }}{{ (job.cron | toHumanCron).message }} + + +
Loading
No jobs found.
+ `, + standalone: true, + imports: [ + CommonModule, + TuiForModule, + TuiNotificationModule, + TuiButtonModule, + TuiSvgModule, + ToHumanCronPipe, + GetBackupIconPipe, + ], +}) +export class BackupsJobsModal implements OnInit { + private readonly dialogs = inject(TuiDialogService) + private readonly loader = inject(LoadingService) + private readonly errorService = inject(ErrorService) + private readonly api = inject(ApiService) + + readonly loading$ = new BehaviorSubject(true) + + jobs?: BackupJob[] + + async ngOnInit() { + try { + this.jobs = await this.api.getBackupJobs({}) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + this.loading$.next(false) + } + } + + create() { + this.dialogs + .open(EDIT, { + label: 'Create New Job', + data: new BackupJobBuilder({ + name: `Backup Job ${(this.jobs?.length || 0) + 1}`, + }), + }) + .subscribe(job => { + this.jobs = this.jobs?.concat(job) + }) + } + + update(data: BackupJob) { + this.dialogs + .open(EDIT, { + label: 'Edit Job', + data: new BackupJobBuilder(data), + }) + .subscribe(job => { + data.name = job.name + data.target = job.target + data.cron = job.cron + data['package-ids'] = job['package-ids'] + }) + } + + delete(id: string) { + this.dialogs + .open(TUI_PROMPT, PROMPT_OPTIONS) + .pipe(filter(Boolean)) + .subscribe(async () => { + const loader = this.loader.open('Deleting...').subscribe() + + try { + await this.api.removeBackupTarget({ id }) + this.jobs = this.jobs?.filter(a => a.id !== id) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + }) + } +} + +const PROMPT_OPTIONS: Partial> = { + label: 'Confirm', + size: 's', + data: { + content: 'Delete backup job? This action cannot be undone.', + yes: 'Delete', + no: 'Cancel', + }, +} + +export const JOBS = new PolymorpheusComponent(BackupsJobsModal) diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/recover.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/recover.component.ts new file mode 100644 index 000000000..576c3beda --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/recover.component.ts @@ -0,0 +1,131 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { FormsModule } from '@angular/forms' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { + TuiButtonModule, + TuiDialogContext, + TuiGroupModule, +} from '@taiga-ui/core' +import { TuiCheckboxBlockModule } from '@taiga-ui/kit' +import { + POLYMORPHEUS_CONTEXT, + PolymorpheusComponent, +} from '@tinkoff/ng-polymorpheus' +import { PatchDB } from 'patch-db-client' +import { take } from 'rxjs' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { PackageBackupInfo } from 'src/app/services/api/api.types' +import { ToOptionsPipe } from '../pipes/to-options.pipe' +import { RecoverOption } from '../types/recover-option' +import { RecoverData } from '../types/recover-data' +import { TuiMapperPipeModule } from '@taiga-ui/cdk' + +@Component({ + template: ` + +
+ +
+ {{ option.title }} +
Version {{ option.version }}
+
Backup made: {{ option.timestamp | date : 'medium' }}
+
+ {{ message.text }} +
+
+
+
+ +
+ +
+
+ `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + FormsModule, + ToOptionsPipe, + TuiButtonModule, + TuiCheckboxBlockModule, + TuiGroupModule, + TuiMapperPipeModule, + ], +}) +export class BackupsRecoverModal { + private readonly api = inject(ApiService) + private readonly loader = inject(LoadingService) + private readonly errorService = inject(ErrorService) + private readonly context = + inject>(POLYMORPHEUS_CONTEXT) + + readonly packageData$ = inject>(PatchDB) + .watch$('package-data') + .pipe(take(1)) + + readonly toMessage = (option: RecoverOption) => { + if (option['newer-eos']) { + return { + text: `Unavailable. Backup was made on a newer version of StartOS.`, + color: 'var(--tui-error-fill)', + } + } + + if (option.installed) { + return { + text: `Unavailable. ${option.title} is already installed.`, + color: 'var(--tui-warning-fill)', + } + } + + return { + text: 'Ready to restore', + color: 'var(--tui-success-fill)', + } + } + + get backups(): Record { + return this.context.data.backupInfo['package-backups'] + } + + isDisabled(options: RecoverOption[]): boolean { + return options.every(o => !o.checked) + } + + async restore(options: RecoverOption[]): Promise { + const ids = options.filter(({ checked }) => !!checked).map(({ id }) => id) + const loader = this.loader.open('Initializing...').subscribe() + + try { + await this.api.restorePackages({ + ids, + 'target-id': this.context.data.targetId, + password: this.context.data.password, + }) + + this.context.$implicit.complete() + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } +} + +export const RECOVER = new PolymorpheusComponent(BackupsRecoverModal) diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/report.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/report.component.ts new file mode 100644 index 000000000..b7a980a7a --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/report.component.ts @@ -0,0 +1,86 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { TuiDialogContext, TuiSvgModule } from '@taiga-ui/core' +import { + POLYMORPHEUS_CONTEXT, + PolymorpheusComponent, +} from '@tinkoff/ng-polymorpheus' +import { BackupReport } from 'src/app/services/api/api.types' + +@Component({ + template: ` +

Completed: {{ timestamp | date : 'medium' }}

+
+
+ System data +
{{ system.result }}
+
+ +
+
+
+ {{ pkg.key }} +
+ {{ pkg.value.error ? 'Failed: ' + pkg.value.error : 'Succeeded' }} +
+
+ +
+ `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, TuiSvgModule], +}) +export class BackupsReportModal { + private readonly context = + inject>( + POLYMORPHEUS_CONTEXT, + ) + + readonly system = this.getSystem() + + get report(): BackupReport { + return this.context.data.report + } + + get timestamp(): string { + return this.context.data.timestamp + } + + getColor(error: unknown) { + return error ? 'var(--tui-negative)' : 'var(--tui-positive)' + } + + getIcon(error: unknown) { + return error ? 'tuiIconMinusCircleLarge' : 'tuiIconCheckLarge' + } + + private getSystem() { + if (!this.report.server.attempted) { + return { + result: 'Not Attempted', + icon: 'tuiIconMinusLarge', + color: 'var(--tui-text-02)', + } + } + + if (this.report.server.error) { + return { + result: `Failed: ${this.report.server.error}`, + icon: 'tuiIconMinusCircleLarge', + color: 'var(--tui-negative)', + } + } + + return { + result: 'Succeeded', + icon: 'tuiIconCheckLarge', + color: 'var(--tui-positive)', + } + } +} + +export const REPORT = new PolymorpheusComponent(BackupsReportModal) diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/target.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/target.component.ts new file mode 100644 index 000000000..18b23060a --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/target.component.ts @@ -0,0 +1,125 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { ErrorService } from '@start9labs/shared' +import { TuiForModule } from '@taiga-ui/cdk' +import { + TuiButtonModule, + TuiDialogContext, + TuiDialogOptions, + TuiDialogService, + TuiLoaderModule, + TuiSvgModule, +} from '@taiga-ui/core' +import { + POLYMORPHEUS_CONTEXT, + PolymorpheusComponent, +} from '@tinkoff/ng-polymorpheus' +import { BehaviorSubject } from 'rxjs' +import { BackupTarget } from 'src/app/services/api/api.types' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { BackupType } from '../types/backup-type' +import { BackupsStatusComponent } from '../components/status.component' +import { GetDisplayInfoPipe } from '../pipes/get-display-info.pipe' +import { TARGETS } from './targets.component' + +@Component({ + template: ` + + +

Saved Targets

+ + +

No saved targets

+ +
+
+ `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + TuiLoaderModule, + TuiForModule, + TuiButtonModule, + TuiSvgModule, + BackupsStatusComponent, + GetDisplayInfoPipe, + ], +}) +export class BackupsTargetModal { + private readonly dialogs = inject(TuiDialogService) + private readonly errorService = inject(ErrorService) + private readonly api = inject(ApiService) + + readonly context = + inject>( + POLYMORPHEUS_CONTEXT, + ) + + readonly loading$ = new BehaviorSubject(true) + readonly loading = + this.context.data.type === 'create' + ? 'Loading Backup Targets' + : 'Loading Backup Sources' + + targets: BackupTarget[] = [] + + async ngOnInit() { + try { + this.targets = (await this.api.getBackupTargets({})).saved + } catch (e: any) { + this.errorService.handleError(e) + } finally { + this.loading$.next(false) + } + } + + isDisabled(target: BackupTarget): boolean { + return ( + !target.mountable || + (this.context.data.type === 'restore' && !target['embassy-os']) + ) + } + + goToTargets() { + this.dialogs.open(TARGETS, { label: 'Backup Targets' }).subscribe() + this.context.$implicit.complete() + } +} + +export const TARGET = new PolymorpheusComponent(BackupsTargetModal) + +export const TARGET_CREATE: Partial> = { + label: 'Select Backup Target', + data: { type: 'create' }, +} + +export const TARGET_RESTORE: Partial> = { + label: 'Select Backup Source', + data: { type: 'restore' }, +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts new file mode 100644 index 000000000..9231c4183 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts @@ -0,0 +1,249 @@ +import { CommonModule } from '@angular/common' +import { Component, inject, OnInit } from '@angular/core' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { + unionSelectKey, + unionValueKey, +} from '@start9labs/start-sdk/lib/config/configTypes' +import { TuiButtonModule, TuiNotificationModule } from '@taiga-ui/core' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' +import { + BehaviorSubject, + catchError, + from, + Observable, + of, + share, + startWith, + switchMap, +} from 'rxjs' +import { FormPage } from 'src/app/apps/ui/modals/form/form.page' +import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' +import { + cifsSpec, + diskBackupTargetSpec, + dropboxSpec, + googleDriveSpec, + remoteBackupTargetSpec, +} from 'src/app/apps/ui/pages/backups/types/target-types' +import { FormDialogService } from 'src/app/services/form-dialog.service' +import { + BackupTarget, + BackupTargetType, + RR, + UnknownDisk, +} from 'src/app/services/api/api.types' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { BackupConfig } from '../types/backup-config' +import { BackupsPhysicalComponent } from '../components/physical.component' +import { BackupsTargetsComponent } from '../components/targets.component' + +@Component({ + template: ` + + + Backup targets are physical or virtual locations for storing encrypted + backups. They can be physical drives plugged into your server, shared + folders on your Local Area Network (LAN), or third party clouds such as + Dropbox or Google Drive. + + View instructions + + +

+ Unknown Physical Drives + +

+
+

+ Saved Targets + +

+
+ `, + standalone: true, + imports: [ + CommonModule, + TuiNotificationModule, + TuiButtonModule, + BackupsPhysicalComponent, + BackupsTargetsComponent, + ], +}) +export class BackupsTargetsModal implements OnInit { + private readonly api = inject(ApiService) + private readonly errorService = inject(ErrorService) + private readonly formDialog = inject(FormDialogService) + private readonly loader = inject(LoadingService) + + readonly loading$ = new BehaviorSubject(true) + + targets?: RR.GetBackupTargetsRes + + ngOnInit() { + this.refresh() + } + + async refresh() { + this.loading$.next(true) + + try { + this.targets = await this.api.getBackupTargets({}) + } catch (e: any) { + this.errorService.handleError(e) + this.targets = { 'unknown-disks': [], saved: [] } + } finally { + this.loading$.next(false) + } + } + + async onDelete(id: string) { + const loader = this.loader.open('Removing...').subscribe() + + try { + await this.api.removeBackupTarget({ id }) + this.setTargets(this.targets?.saved.filter(a => a.id !== id)) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } + + async onUpdate(value: BackupTarget) { + this.formDialog.open(FormPage, { + label: 'Update Target', + data: { + value, + spec: await this.getSpec(value), + buttons: [ + { + text: 'Save', + handler: ( + response: + | RR.UpdateCifsBackupTargetReq + | RR.UpdateCloudBackupTargetReq + | RR.UpdateDiskBackupTargetReq, + ) => this.update(value.type, { ...response, id: value.id }), + }, + ], + }, + }) + } + + async addPhysical(disk: UnknownDisk) { + this.formDialog.open(FormPage, { + label: 'New Physical Target', + data: { + spec: await configBuilderToSpec(diskBackupTargetSpec), + value: { name: disk.label || disk.logicalname }, + buttons: [ + { + text: 'Save', + handler: (value: Omit) => + this.add('disk', { + logicalname: disk.logicalname, + ...value, + }).then(response => { + this.setTargets( + this.targets?.saved.concat(response), + this.targets?.['unknown-disks'].filter(a => a !== disk), + ) + return true + }), + }, + ], + }, + }) + } + + async addRemote() { + this.formDialog.open(FormPage, { + label: 'New Remote Target', + data: { + spec: await configBuilderToSpec(remoteBackupTargetSpec), + buttons: [ + { + text: 'Save', + handler: ({ type }: BackupConfig) => + this.add( + type[unionSelectKey] === 'cifs' ? 'cifs' : 'cloud', + type[unionValueKey], + ), + }, + ], + }, + }) + } + + private async add( + type: BackupTargetType, + value: + | RR.AddCifsBackupTargetReq + | RR.AddCloudBackupTargetReq + | RR.AddDiskBackupTargetReq, + ): Promise { + const loader = this.loader.open('Saving target...').subscribe() + + try { + return await this.api.addBackupTarget(type, value) + } finally { + loader.unsubscribe() + } + } + + private async update( + type: BackupTargetType, + value: + | RR.UpdateCifsBackupTargetReq + | RR.UpdateCloudBackupTargetReq + | RR.UpdateDiskBackupTargetReq, + ): Promise { + const loader = this.loader.open('Saving target...').subscribe() + + try { + return await this.api.updateBackupTarget(type, value) + } finally { + loader.unsubscribe() + } + } + + private setTargets( + saved: BackupTarget[] = this.targets?.saved || [], + unknown: UnknownDisk[] = this.targets?.['unknown-disks'] || [], + ) { + this.targets = { ['unknown-disks']: unknown, saved } + } + + private async getSpec(target: BackupTarget) { + switch (target.type) { + case 'cifs': + return await configBuilderToSpec(cifsSpec) + case 'cloud': + return await configBuilderToSpec( + target.provider === 'dropbox' ? dropboxSpec : googleDriveSpec, + ) + case 'disk': + return await configBuilderToSpec(diskBackupTargetSpec) + } + } +} + +export const TARGETS = new PolymorpheusComponent(BackupsTargetsModal) diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/duration.pipe.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/duration.pipe.ts new file mode 100644 index 000000000..76c4fd82f --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/duration.pipe.ts @@ -0,0 +1,11 @@ +import { Pipe, PipeTransform } from '@angular/core' + +@Pipe({ + name: 'duration', + standalone: true, +}) +export class DurationPipe implements PipeTransform { + transform(start: string, finish: string): number { + return (new Date(finish).valueOf() - new Date(start).valueOf()) / 100 + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/get-backup-icon.pipe.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/get-backup-icon.pipe.ts new file mode 100644 index 000000000..4c84a9d73 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/get-backup-icon.pipe.ts @@ -0,0 +1,19 @@ +import { Pipe, PipeTransform } from '@angular/core' +import { BackupTargetType } from 'src/app/services/api/api.types' + +@Pipe({ + name: 'getBackupIcon', + standalone: true, +}) +export class GetBackupIconPipe implements PipeTransform { + transform(type: BackupTargetType) { + switch (type) { + case 'cifs': + return 'tuiIconFolder' + case 'cloud': + return 'tuiIconCloud' + case 'disk': + return 'tuiIconSave' + } + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/get-display-info.pipe.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/get-display-info.pipe.ts new file mode 100644 index 000000000..88f29d242 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/get-display-info.pipe.ts @@ -0,0 +1,40 @@ +import { Pipe, PipeTransform } from '@angular/core' +import { BackupTarget } from 'src/app/services/api/api.types' +import { DisplayInfo } from '../types/display-info' +import { GetBackupIconPipe } from './get-backup-icon.pipe' + +@Pipe({ + name: 'getDisplayInfo', + standalone: true, +}) +export class GetDisplayInfoPipe implements PipeTransform { + readonly icon = new GetBackupIconPipe() + + transform(target: BackupTarget): DisplayInfo { + const result = { + name: target.name, + path: `Path: ${target.path}`, + icon: this.icon.transform(target.type), + } + + switch (target.type) { + case 'cifs': + return { + ...result, + description: `Network Folder: ${target.hostname}`, + } + case 'cloud': + return { + ...result, + description: `Provider: ${target.provider}`, + } + case 'disk': + return { + ...result, + description: `Physical Drive: ${target.vendor || 'Unknown Vendor'}, ${ + target.model || 'Unknown Model' + }`, + } + } + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/has-error.pipe.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/has-error.pipe.ts new file mode 100644 index 000000000..898c8fb41 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/has-error.pipe.ts @@ -0,0 +1,15 @@ +import { Pipe, PipeTransform } from '@angular/core' +import { BackupReport } from 'src/app/services/api/api.types' + +@Pipe({ + name: 'hasError', + standalone: true, +}) +export class HasErrorPipe implements PipeTransform { + transform(report: BackupReport): boolean { + return ( + !!report.server.error || + !!Object.values(report.packages).find(({ error }) => error) + ) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/to-human-cron.pipe.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/to-human-cron.pipe.ts new file mode 100644 index 000000000..50653058e --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/to-human-cron.pipe.ts @@ -0,0 +1,35 @@ +import { Pipe, PipeTransform } from '@angular/core' +import cronstrue from 'cronstrue' + +@Pipe({ + name: 'toHumanCron', + standalone: true, +}) +export class ToHumanCronPipe implements PipeTransform { + transform(cron: string): { message: string; color: string } { + const toReturn = { + message: '', + color: 'var(--tui-positive)', + } + + try { + const human = cronstrue.toString(cron, { + verbose: true, + throwExceptionOnParseError: true, + }) + const zero = Number(cron[0]) + const one = Number(cron[1]) + if (Number.isNaN(zero) || Number.isNaN(one)) { + throw new Error( + `${human}. Cannot run cron jobs more than once per hour`, + ) + } + toReturn.message = human + } catch (e) { + toReturn.message = e as string + toReturn.color = 'var(--tui-negative)' + } + + return toReturn + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/to-options.pipe.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/to-options.pipe.ts new file mode 100644 index 000000000..9f61c238a --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/to-options.pipe.ts @@ -0,0 +1,42 @@ +import { inject, Pipe, PipeTransform } from '@angular/core' +import { Emver } from '@start9labs/shared' +import { map, Observable } from 'rxjs' +import { PackageBackupInfo } from 'src/app/services/api/api.types' +import { ConfigService } from 'src/app/services/config.service' +import { PackageDataEntry } from 'src/app/services/patch-db/data-model' +import { RecoverOption } from '../types/recover-option' + +@Pipe({ + name: 'toOptions', + standalone: true, +}) +export class ToOptionsPipe implements PipeTransform { + private readonly config = inject(ConfigService) + private readonly emver = inject(Emver) + + transform( + packageData$: Observable>, + packageBackups: Record = {}, + ): Observable { + return packageData$.pipe( + map(packageData => + Object.keys(packageBackups) + .map(id => ({ + ...packageBackups[id], + id, + installed: !!packageData[id], + checked: false, + 'newer-eos': this.compare(packageBackups[id]['os-version']), + })) + .sort((a, b) => + b.title.toLowerCase() > a.title.toLowerCase() ? -1 : 1, + ), + ), + ) + } + + private compare(version: string): boolean { + // checks to see if backup was made on a newer version of eOS + return this.emver.compare(version, this.config.version) === 1 + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/services/create.service.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/services/create.service.ts new file mode 100644 index 000000000..5a0c86917 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/services/create.service.ts @@ -0,0 +1,46 @@ +import { inject, Injectable } from '@angular/core' +import { LoadingService } from '@start9labs/shared' +import { TuiDialogOptions, TuiDialogService } from '@taiga-ui/core' +import { from, switchMap } from 'rxjs' +import { BackupTarget } from 'src/app/services/api/api.types' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { TARGET, TARGET_CREATE } from '../modals/target.component' +import { BACKUP, BACKUP_OPTIONS } from '../modals/backup.component' + +@Injectable({ + providedIn: 'root', +}) +export class BackupsCreateService { + private readonly loader = inject(LoadingService) + private readonly dialogs = inject(TuiDialogService) + private readonly api = inject(ApiService) + + readonly handle = () => { + this.dialogs + .open(TARGET, TARGET_CREATE) + .pipe( + switchMap(({ id }) => + this.dialogs + .open(BACKUP, OPTIONS) + .pipe(switchMap(ids => from(this.createBackup(id, ids)))), + ), + ) + .subscribe() + } + + private async createBackup( + targetId: string, + pkgIds: string[], + ): Promise { + const loader = this.loader.open('Beginning backup...').subscribe() + + await this.api + .createBackup({ 'target-id': targetId, 'package-ids': pkgIds }) + .finally(() => loader.unsubscribe()) + } +} + +const OPTIONS: Partial> = { + ...BACKUP_OPTIONS, + data: { btnText: 'Create Backup' }, +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/services/restore.service.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/services/restore.service.ts new file mode 100644 index 000000000..b1f6b3faf --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/services/restore.service.ts @@ -0,0 +1,97 @@ +import { inject, Injectable } from '@angular/core' +import { Router } from '@angular/router' +import * as argon2 from '@start9labs/argon2' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { TuiDialogOptions, TuiDialogService } from '@taiga-ui/core' +import { + catchError, + EMPTY, + exhaustMap, + map, + Observable, + of, + switchMap, + take, + tap, +} from 'rxjs' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { BackupTarget } from 'src/app/services/api/api.types' +import { + PROMPT, + PromptOptions, +} from 'src/app/apps/ui/modals/prompt/prompt.component' +import { TARGET, TARGET_RESTORE } from '../modals/target.component' +import { RECOVER } from '../modals/recover.component' +import { RecoverData } from '../types/recover-data' + +@Injectable({ + providedIn: 'root', +}) +export class BackupsRestoreService { + private readonly errorService = inject(ErrorService) + private readonly dialogs = inject(TuiDialogService) + private readonly router = inject(Router) + private readonly api = inject(ApiService) + private readonly loader = inject(LoadingService) + + readonly handle = () => { + this.dialogs + .open(TARGET, TARGET_RESTORE) + .pipe( + switchMap(target => + this.dialogs.open(PROMPT, PROMPT_OPTIONS).pipe( + exhaustMap(password => + this.getRecoverData( + target.id, + password, + target['embassy-os']?.['password-hash'] || '', + ), + ), + take(1), + switchMap(data => + this.dialogs.open(RECOVER, { + label: 'Select Services to Restore', + data, + }), + ), + ), + ), + ) + .subscribe(() => { + this.router.navigate(['/portal/desktop']) + }) + } + + private getRecoverData( + targetId: string, + password: string, + hash: string, + ): Observable { + return of(password).pipe( + tap(() => argon2.verify(hash, password)), + switchMap(() => { + const loader = this.loader.open('Decrypting drive...').subscribe() + + return this.api + .getBackupInfo({ 'target-id': targetId, password }) + .finally(() => loader.unsubscribe()) + }), + catchError(e => { + this.errorService.handleError(e) + + return EMPTY + }), + map(backupInfo => ({ targetId, password, backupInfo })), + ) + } +} + +const PROMPT_OPTIONS: Partial> = { + label: 'Password Required', + data: { + message: `Enter the master password that was used to encrypt this backup. On the next screen, you will select the individual services you want to restore.`, + label: 'Master Password', + placeholder: 'Enter master password', + useMask: true, + }, +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/backup-config.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/backup-config.ts new file mode 100644 index 000000000..e6b485163 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/backup-config.ts @@ -0,0 +1,19 @@ +import { + unionSelectKey, + unionValueKey, +} from '@start9labs/start-sdk/lib/config/configTypes' +import { RR } from 'src/app/services/api/api.types' + +export type BackupConfig = + | { + type: { + [unionSelectKey]: 'dropbox' | 'google-drive' + [unionValueKey]: RR.AddCloudBackupTargetReq + } + } + | { + type: { + [unionSelectKey]: 'cifs' + [unionValueKey]: RR.AddCifsBackupTargetReq + } + } diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/backup-type.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/backup-type.ts new file mode 100644 index 000000000..0befec6a2 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/backup-type.ts @@ -0,0 +1 @@ +export type BackupType = 'create' | 'restore' diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/display-info.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/display-info.ts new file mode 100644 index 000000000..767b17116 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/display-info.ts @@ -0,0 +1,6 @@ +export interface DisplayInfo { + name: string + path: string + description: string + icon: string +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/recover-data.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/recover-data.ts new file mode 100644 index 000000000..7823451ac --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/recover-data.ts @@ -0,0 +1,7 @@ +import { BackupInfo } from 'src/app/services/api/api.types' + +export interface RecoverData { + targetId: string + backupInfo: BackupInfo + password: string +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/recover-option.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/recover-option.ts new file mode 100644 index 000000000..e73e9e4c9 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/recover-option.ts @@ -0,0 +1,8 @@ +import { PackageBackupInfo } from 'src/app/services/api/api.types' + +export interface RecoverOption extends PackageBackupInfo { + id: string + checked: boolean + installed: boolean + 'newer-eos': boolean +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/utils/job-builder.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/utils/job-builder.ts new file mode 100644 index 000000000..b84e4d369 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/utils/job-builder.ts @@ -0,0 +1,41 @@ +import { BackupJob, BackupTarget, RR } from 'src/app/services/api/api.types' + +export class BackupJobBuilder { + name: string + target: BackupTarget + cron: string + 'package-ids': string[] + now = false + + constructor(readonly job: Partial) { + const { name, target, cron } = job + this.name = name || '' + this.target = target || ({} as BackupTarget) + this.cron = cron || '0 2 * * *' + this['package-ids'] = job['package-ids'] || [] + } + + buildCreate(): RR.CreateBackupJobReq { + const { name, target, cron, now } = this + + return { + name, + 'target-id': target.id, + cron, + 'package-ids': this['package-ids'], + now, + } + } + + buildUpdate(id: string): RR.UpdateBackupJobReq { + const { name, target, cron } = this + + return { + id, + name, + 'target-id': target.id, + cron, + 'package-ids': this['package-ids'], + } + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts index 6732156a7..d7fb704aa 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts @@ -1,11 +1,22 @@ import { NgModule } from '@angular/core' import { RouterModule, Routes } from '@angular/router' +import { systemTabResolver } from '../../utils/system-tab-resolver' +import { toDesktopItem } from '../../utils/to-desktop-item' const ROUTES: Routes = [ { + title: systemTabResolver, + path: 'backups', + loadComponent: () => + import('./backups/backups.component').then(m => m.BackupsComponent), + data: toDesktopItem('/portal/system/backups'), + }, + { + title: systemTabResolver, path: 'snek', loadComponent: () => import('./snek/snek.component').then(m => m.SnekComponent), + data: toDesktopItem('/portal/system/snek'), }, ] diff --git a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.service.ts b/frontend/projects/ui/src/app/apps/portal/services/navigation.service.ts similarity index 83% rename from frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.service.ts rename to frontend/projects/ui/src/app/apps/portal/services/navigation.service.ts index 232634697..8ff3f429c 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.service.ts +++ b/frontend/projects/ui/src/app/apps/portal/services/navigation.service.ts @@ -1,11 +1,6 @@ import { Injectable } from '@angular/core' import { BehaviorSubject, Observable } from 'rxjs' - -export interface NavigationItem { - readonly routerLink: string - readonly icon: string - readonly title: string -} +import { NavigationItem } from '../types/navigation-item' @Injectable({ providedIn: 'root', diff --git a/frontend/projects/ui/src/app/apps/portal/types/navigation-item.ts b/frontend/projects/ui/src/app/apps/portal/types/navigation-item.ts new file mode 100644 index 000000000..ea912247c --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/types/navigation-item.ts @@ -0,0 +1,5 @@ +export interface NavigationItem { + readonly routerLink: string + readonly icon: string + readonly title: string +} diff --git a/frontend/projects/ui/src/app/apps/portal/utils/system-tab-resolver.ts b/frontend/projects/ui/src/app/apps/portal/utils/system-tab-resolver.ts new file mode 100644 index 000000000..02d355d3c --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/utils/system-tab-resolver.ts @@ -0,0 +1,10 @@ +import { ActivatedRouteSnapshot } from '@angular/router' +import { inject } from '@angular/core' +import { NavigationService } from '../services/navigation.service' +import { NavigationItem } from '../types/navigation-item' + +export function systemTabResolver({ data }: ActivatedRouteSnapshot): string { + inject(NavigationService).addTab(data as NavigationItem) + + return data['title'] +} diff --git a/frontend/projects/ui/src/app/apps/portal/utils/to-desktop-item.ts b/frontend/projects/ui/src/app/apps/portal/utils/to-desktop-item.ts new file mode 100644 index 000000000..cbeed8dfe --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/utils/to-desktop-item.ts @@ -0,0 +1,26 @@ +import { PackageDataEntry } from 'src/app/services/patch-db/data-model' +import { SYSTEM_UTILITIES } from '../constants/system-utilities' +import { NavigationItem } from '../types/navigation-item' +import { toRouterLink } from './to-router-link' + +export function toDesktopItem( + id: string, + packages: Record = {}, +): NavigationItem { + const item = SYSTEM_UTILITIES[id] + const routerLink = toRouterLink(id) + + if (SYSTEM_UTILITIES[id]) { + return { + icon: item.icon, + title: item.title, + routerLink, + } + } + + return { + icon: packages[id]?.icon, + title: packages[id]?.manifest.title, + routerLink, + } +} diff --git a/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html b/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html index 788210973..b407d3dfa 100644 --- a/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html +++ b/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html @@ -16,7 +16,7 @@ [placeholder]="options.placeholder || ''" /> -
+
diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.module.ts index dac31f7f2..f620cd13e 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.module.ts @@ -26,5 +26,6 @@ const routes: Routes = [ RouterModule.forChild(routes), ], declarations: [BackupHistoryPage, DurationPipe, HasErrorPipe], + exports: [DurationPipe, HasErrorPipe], }) export class BackupHistoryPageModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts index b26d01ed4..12f9f5929 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts @@ -37,5 +37,6 @@ const routes: Routes = [ TuiWrapperModule, ], declarations: [BackupJobsPage, ToHumanCronPipe, EditJobComponent], + exports: [ToHumanCronPipe], }) export class BackupJobsPageModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.scss b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.scss index 18b650d0c..083cd95d8 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.scss +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.scss @@ -1,4 +1,5 @@ .button { + width: 100%; height: var(--tui-height-l); display: flex; align-items: center; diff --git a/frontend/projects/ui/src/app/common/form/form-toggle/form-toggle.component.scss b/frontend/projects/ui/src/app/common/form/form-toggle/form-toggle.component.scss deleted file mode 100644 index 6acffed43..000000000 --- a/frontend/projects/ui/src/app/common/form/form-toggle/form-toggle.component.scss +++ /dev/null @@ -1,14 +0,0 @@ -:host { - height: var(--tui-height-l); - display: flex; - align-items: center; - padding: 0 1rem; - box-shadow: inset 0 0 0 1px var(--tui-base-03); - font: var(--tui-font-text-l); - font-weight: bold; - border-radius: var(--tui-radius-m); -} - -tui-toggle { - margin-left: auto; -} diff --git a/frontend/projects/ui/src/app/common/form/form-toggle/form-toggle.component.ts b/frontend/projects/ui/src/app/common/form/form-toggle/form-toggle.component.ts index b35d75a57..629a0a7fa 100644 --- a/frontend/projects/ui/src/app/common/form/form-toggle/form-toggle.component.ts +++ b/frontend/projects/ui/src/app/common/form/form-toggle/form-toggle.component.ts @@ -5,6 +5,6 @@ import { Control } from '../control' @Component({ selector: 'form-toggle', templateUrl: './form-toggle.component.html', - styleUrls: ['./form-toggle.component.scss'], + host: { class: 'g-toggle' }, }) export class FormToggleComponent extends Control {} diff --git a/frontend/projects/ui/src/styles.scss b/frontend/projects/ui/src/styles.scss index 145147082..c8f13efd9 100644 --- a/frontend/projects/ui/src/styles.scss +++ b/frontend/projects/ui/src/styles.scss @@ -75,6 +75,8 @@ --ion-background-color-rgb: var(--ion-color-medium-rgb); --ion-text-color: var(--ion-color-dark); --ion-text-color-rgb: var(--ion-color-dark-rgb); + + --tui-skeleton-radius: 1rem; } $subheader-height: 48px; @@ -367,13 +369,64 @@ ul { margin: 0 12px 6px 0; } +.g-page { + display: block; + height: 100%; + padding: 1px 2rem 3rem; + box-sizing: border-box; + overflow: auto; + + // TODO: Theme + background: #373a3f; +} + +.g-table { + width: 100%; + + td, + th { + font: var(--tui-font-text-s); + text-align: left; + height: 2rem; + padding: 0 0.25rem; + box-shadow: inset 0 -1px var(--tui-clear); + } + + th { + background: var(--tui-clear); + font-weight: bold; + } + + .tui-skeleton { + max-height: 0.5rem; + } +} + +.g-title { + display: flex; + align-items: center; + gap: 1rem; + text-transform: uppercase; + font-weight: bold; + font-size: 1rem; + margin: 2rem 0 1rem; + color: var(--tui-text-02); +} + +.g-buttons { + display: flex; + justify-content: flex-end; + gap: 16px; + margin-top: 24px; +} + .g-action { @include transition(background); @include clearbtn(); display: flex; align-items: center; - width: 100%; + width: stretch; gap: 1rem; text-align: left; font-size: 0.85rem; @@ -382,11 +435,15 @@ ul { line-height: 1.25rem; border-radius: 0.5rem; color: var(--tui-text-01); - --tui-skeleton-radius: 1rem; } a.g-action, button.g-action { + &:disabled { + pointer-events: none; + opacity: var(--tui-disabled-opacity); + } + &:hover { background: var(--tui-clear); } @@ -394,12 +451,19 @@ button.g-action { &:not(:last-child) { box-shadow: 0 0.51rem 0 -0.5rem; } +} - &_static { - cursor: default; +.g-toggle { + height: var(--tui-height-l); + display: flex; + align-items: center; + padding: 0 1rem; + box-shadow: inset 0 0 0 1px var(--tui-base-03); + font: var(--tui-font-text-l); + font-weight: bold; + border-radius: var(--tui-radius-m); - &:hover { - background: transparent; - } + tui-toggle { + margin-left: auto; } } From 8034e5bbcb7555d87acaf1ba1a36117640185777 Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Mon, 16 Oct 2023 07:31:34 +0400 Subject: [PATCH 019/169] refactor: refactor updates page to get rid of ionic (#2459) --- .../shared/src/services/emver.service.ts | 2 +- .../ui/src/app/app/menu/menu.component.ts | 4 +- .../components/card/card.component.html | 21 +- .../components/card/card.component.scss | 1 + .../portal/components/card/card.component.ts | 9 + .../components/drawer/drawer.component.html | 1 + .../components/drawer/drawer.component.ts | 4 +- .../components/skeleton-list.component.ts | 26 ++ .../apps/portal/constants/system-utilities.ts | 4 + .../app/apps/portal/pipes/to-notifications.ts | 15 ++ .../routes/desktop/dektop-loading.service.ts | 2 +- .../routes/desktop/desktop.component.html | 1 + .../routes/desktop/desktop.component.ts | 9 +- .../portal/routes/desktop/desktop.module.ts | 2 + .../service/modals/interface.component.ts | 5 +- .../routes/service/service.component.ts | 2 +- .../backups/components/upcoming.component.ts | 5 +- .../system/backups/modals/backup.component.ts | 2 +- .../backups/modals/recover.component.ts | 2 +- .../portal/routes/system/system.module.ts | 7 + .../updates/components/item.component.ts | 237 ++++++++++++++++++ .../updates/pipes/filter-updates.pipe.ts | 27 ++ .../updates/pipes/install-progress.pipe.ts | 13 + .../system/updates/updates.component.ts | 77 ++++++ .../portal/services/notifications.service.ts | 78 ++++++ .../apps/portal/services/services.service.ts | 2 +- .../ui/pages/updates/filter-updates.pipe.ts | 2 +- .../apps/ui/pages/updates/updates.module.ts | 1 + .../widgets/built-in/add/add.component.ts | 4 +- .../built-in/health/health.component.ts | 7 +- .../ui/src/app/services/api/mock-patch.ts | 16 +- 31 files changed, 550 insertions(+), 38 deletions(-) create mode 100644 frontend/projects/ui/src/app/apps/portal/components/skeleton-list.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/pipes/to-notifications.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/updates/pipes/filter-updates.pipe.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/updates/pipes/install-progress.pipe.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/updates/updates.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/services/notifications.service.ts diff --git a/frontend/projects/shared/src/services/emver.service.ts b/frontend/projects/shared/src/services/emver.service.ts index 8dda885ac..60d3a9990 100644 --- a/frontend/projects/shared/src/services/emver.service.ts +++ b/frontend/projects/shared/src/services/emver.service.ts @@ -7,7 +7,7 @@ import * as emver from '@start9labs/emver' export class Emver { constructor() {} - compare(lhs: string, rhs: string): number | null { + compare(lhs?: string, rhs?: string): number | null { if (!lhs || !rhs) return null return emver.compare(lhs, rhs) } diff --git a/frontend/projects/ui/src/app/app/menu/menu.component.ts b/frontend/projects/ui/src/app/app/menu/menu.component.ts index 6cd2fb003..eb45bbca9 100644 --- a/frontend/projects/ui/src/app/app/menu/menu.component.ts +++ b/frontend/projects/ui/src/app/app/menu/menu.component.ts @@ -97,9 +97,7 @@ export class MenuComponent { map(([marketplace, local]) => Object.entries(marketplace).reduce((list, [_, store]) => { store?.packages.forEach(({ manifest: { id, version } }) => { - if ( - this.emver.compare(version, local[id]?.manifest.version || '') === 1 - ) + if (this.emver.compare(version, local[id]?.manifest.version) === 1) list.add(id) }) return list diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html index db41e3af8..fae74942f 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html +++ b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html @@ -1,12 +1,17 @@ - - - - + + + {{ badge }} + + + + + + diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.scss b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.scss index 32d5b1271..8cddd4339 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.scss +++ b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.scss @@ -27,6 +27,7 @@ width: 2.5rem; height: 2.5rem; border-radius: 100%; + color: var(--tui-text-01-night); } tui-svg.icon { diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts index 2f1c2c258..5853a574f 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts @@ -6,6 +6,10 @@ import { inject, Input, } from '@angular/core' +import { + TuiBadgeAlertModule, + TuiBadgedContentModule, +} from '@taiga-ui/experimental' import { RouterLink } from '@angular/router' import { TickerModule } from '@start9labs/shared' import { @@ -32,6 +36,8 @@ import { toRouterLink } from '../../utils/to-router-link' TuiDataListModule, TuiSvgModule, TickerModule, + TuiBadgedContentModule, + TuiBadgeAlertModule, ActionsComponent, ], }) @@ -50,6 +56,9 @@ export class CardComponent { @Input() actions: Record = {} + @Input() + badge: number | null = null + get isService(): boolean { return !this.id.includes('/') } diff --git a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html index 5fc199810..8be5ae964 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html +++ b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html @@ -22,6 +22,7 @@

System Utilities

empty: empty " appCard + [badge]="item.key | toNotifications | async" [drawerItem]="item.key" [id]="item.key" [title]="item.value.title" diff --git a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts index f22dccb1f..2bf63a14c 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts @@ -24,6 +24,7 @@ import { ServicesService } from '../../services/services.service' import { toRouterLink } from '../../utils/to-router-link' import { DrawerItemDirective } from './drawer-item.directive' import { SYSTEM_UTILITIES } from '../../constants/system-utilities' +import { ToNotificationsPipe } from '../../pipes/to-notifications' @Component({ selector: 'app-drawer', @@ -34,6 +35,7 @@ import { SYSTEM_UTILITIES } from '../../constants/system-utilities' imports: [ CommonModule, FormsModule, + RouterLink, TuiSvgModule, TuiScrollbarModule, TuiActiveZoneModule, @@ -43,7 +45,7 @@ import { SYSTEM_UTILITIES } from '../../constants/system-utilities' TuiFilterPipeModule, CardComponent, DrawerItemDirective, - RouterLink, + ToNotificationsPipe, ], }) export class DrawerComponent { diff --git a/frontend/projects/ui/src/app/apps/portal/components/skeleton-list.component.ts b/frontend/projects/ui/src/app/apps/portal/components/skeleton-list.component.ts new file mode 100644 index 000000000..b3fca5e06 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/components/skeleton-list.component.ts @@ -0,0 +1,26 @@ +import { Component, Input } from '@angular/core' +import { TuiRepeatTimesModule } from '@taiga-ui/cdk' + +@Component({ + selector: 'skeleton-list', + template: ` +
+
+
+
+
+ `, + standalone: true, + imports: [TuiRepeatTimesModule], +}) +export class SkeletonListComponent { + @Input() rows = 3 + @Input() showAvatar = false +} diff --git a/frontend/projects/ui/src/app/apps/portal/constants/system-utilities.ts b/frontend/projects/ui/src/app/apps/portal/constants/system-utilities.ts index 6e79d1fbe..448aeeaa5 100644 --- a/frontend/projects/ui/src/app/apps/portal/constants/system-utilities.ts +++ b/frontend/projects/ui/src/app/apps/portal/constants/system-utilities.ts @@ -4,6 +4,10 @@ export const SYSTEM_UTILITIES: Record = icon: 'tuiIconSaveLarge', title: 'Backups', }, + '/portal/system/updates': { + icon: 'tuiIconGlobeLarge', + title: 'Updates', + }, '/portal/system/devices': { icon: 'assets/img/icon_transparent.png', title: 'Devices', diff --git a/frontend/projects/ui/src/app/apps/portal/pipes/to-notifications.ts b/frontend/projects/ui/src/app/apps/portal/pipes/to-notifications.ts new file mode 100644 index 000000000..fb5add305 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/pipes/to-notifications.ts @@ -0,0 +1,15 @@ +import { inject, Pipe, PipeTransform } from '@angular/core' +import { NotificationsService } from '../services/notifications.service' +import { Observable } from 'rxjs' + +@Pipe({ + name: 'toNotifications', + standalone: true, +}) +export class ToNotificationsPipe implements PipeTransform { + readonly notifications = inject(NotificationsService) + + transform(id: string): Observable { + return this.notifications.getNotifications(id) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/dektop-loading.service.ts b/frontend/projects/ui/src/app/apps/portal/routes/desktop/dektop-loading.service.ts index 2a4dc34c3..f0e50f0f2 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/desktop/dektop-loading.service.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/dektop-loading.service.ts @@ -21,7 +21,7 @@ import { DesktopService } from '../../services/desktop.service' }) export class DektopLoadingService extends Observable { private readonly desktop = inject(DesktopService) - private readonly patch = inject>(PatchDB) + private readonly patch = inject(PatchDB) private readonly loading = this.patch.watch$('ui', 'desktop').pipe( take(1), tap(items => (this.desktop.items = items.filter(Boolean))), diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html index b9b0bae80..a4016fe29 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html @@ -33,6 +33,7 @@ appCard @tuiFadeIn [id]="item" + [badge]="item | toNotifications | async" [title]="desktopItem.title" [icon]="desktopItem.icon" [routerLink]="desktopItem.routerLink" diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts index d879372d3..913d8d24f 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts @@ -10,12 +10,8 @@ import { EMPTY_QUERY, TUI_PARENT_STOP } from '@taiga-ui/cdk' import { tuiFadeIn, tuiScaleIn } from '@taiga-ui/core' import { TuiTileComponent, TuiTilesComponent } from '@taiga-ui/kit' import { PatchDB } from 'patch-db-client' -import { - DataModel, - PackageDataEntry, -} from 'src/app/services/patch-db/data-model' +import { DataModel } from 'src/app/services/patch-db/data-model' import { DesktopService } from '../../services/desktop.service' -import { Observable } from 'rxjs' import { DektopLoadingService } from './dektop-loading.service' @Component({ @@ -29,8 +25,7 @@ export class DesktopComponent { readonly desktop = inject(DesktopService) readonly loading$ = inject(DektopLoadingService) - readonly packages$: Observable> = - inject>(PatchDB).watch$('package-data') + readonly packages$ = inject(PatchDB).watch$('package-data') @ViewChild(TuiTilesComponent) readonly tile?: TuiTilesComponent diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts index f500d6b8c..6354bc61c 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts @@ -8,6 +8,7 @@ import { TuiTilesModule } from '@taiga-ui/kit' import { DesktopComponent } from './desktop.component' import { CardComponent } from '../../components/card/card.component' import { ToDesktopItemPipe } from '../../pipes/to-desktop-item' +import { ToNotificationsPipe } from '../../pipes/to-notifications' import { DesktopItemDirective } from './desktop-item.directive' const ROUTES: Routes = [ @@ -29,6 +30,7 @@ const ROUTES: Routes = [ RouterModule.forChild(ROUTES), TuiFadeModule, DragScrollerDirective, + ToNotificationsPipe, ], declarations: [DesktopComponent], exports: [DesktopComponent], diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/modals/interface.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/modals/interface.component.ts index 199afc3d0..ad5e19d2f 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/service/modals/interface.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/modals/interface.component.ts @@ -2,9 +2,8 @@ import { CommonModule } from '@angular/common' import { ChangeDetectionStrategy, Component, inject } from '@angular/core' import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' import { PatchDB } from 'patch-db-client' -import { Observable } from 'rxjs' import { InterfaceAddressesComponentModule } from 'src/app/common/interface-addresses/interface-addresses.module' -import { InterfaceInfo } from 'src/app/services/patch-db/data-model' +import { DataModel } from 'src/app/services/patch-db/data-model' interface Context { packageId: string @@ -27,7 +26,7 @@ interface Context { export class ServiceInterfaceModal { readonly context = inject<{ data: Context }>(POLYMORPHEUS_CONTEXT).data - readonly interfaceInfo$: Observable = inject(PatchDB).watch$( + readonly interfaceInfo$ = inject(PatchDB).watch$( 'package-data', this.context.packageId, 'installed', diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.ts index d7f44ddf0..2a49413ba 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.ts @@ -36,7 +36,7 @@ export class ServiceComponent { private readonly route = inject(ActivatedRoute) private readonly router = inject(Router) private readonly navigation = inject(NavigationService) - private readonly patch = inject>(PatchDB) + private readonly patch = inject(PatchDB) readonly pkgId = getPkgId(this.route) diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/upcoming.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/upcoming.component.ts index 6473356c7..855231d76 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/upcoming.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/upcoming.component.ts @@ -3,11 +3,10 @@ import { ChangeDetectionStrategy, Component, inject } from '@angular/core' import { TuiForModule } from '@taiga-ui/cdk' import { TuiSvgModule } from '@taiga-ui/core' import { PatchDB } from 'patch-db-client' -import { from, map, Observable } from 'rxjs' +import { from, map } from 'rxjs' import { CronJob } from 'cron' import { DataModel } from 'src/app/services/patch-db/data-model' import { ApiService } from 'src/app/services/api/embassy-api.service' -import { BackupJob } from 'src/app/services/api/api.types' import { GetBackupIconPipe } from '../pipes/get-backup-icon.pipe' @Component({ @@ -56,7 +55,7 @@ import { GetBackupIconPipe } from '../pipes/get-backup-icon.pipe' imports: [CommonModule, TuiForModule, TuiSvgModule, GetBackupIconPipe], }) export class BackupsUpcomingComponent { - readonly current$: Observable = inject>(PatchDB) + readonly current$ = inject(PatchDB) .watch$('server-info', 'status-info', 'current-backup', 'job') .pipe(map(job => job || {})) diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/backup.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/backup.component.ts index c45a0ad23..2d7c9e982 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/backup.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/backup.component.ts @@ -78,7 +78,7 @@ interface Package { ], }) export class BackupsBackupModal { - private readonly patch = inject>(PatchDB) + private readonly patch = inject(PatchDB) readonly context = inject>( POLYMORPHEUS_CONTEXT, diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/recover.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/recover.component.ts index 576c3beda..e6837b31d 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/recover.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/recover.component.ts @@ -75,7 +75,7 @@ export class BackupsRecoverModal { private readonly context = inject>(POLYMORPHEUS_CONTEXT) - readonly packageData$ = inject>(PatchDB) + readonly packageData$ = inject(PatchDB) .watch$('package-data') .pipe(take(1)) diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts index d7fb704aa..645ffc063 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts @@ -11,6 +11,13 @@ const ROUTES: Routes = [ import('./backups/backups.component').then(m => m.BackupsComponent), data: toDesktopItem('/portal/system/backups'), }, + { + title: systemTabResolver, + path: 'updates', + loadComponent: () => + import('./updates/updates.component').then(m => m.UpdatesComponent), + data: toDesktopItem('/portal/system/updates'), + }, { title: systemTabResolver, path: 'snek', diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts new file mode 100644 index 000000000..8eba526db --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts @@ -0,0 +1,237 @@ +import { NgIf } from '@angular/common' +import { Component, inject, Input } from '@angular/core' +import { RouterLink } from '@angular/router' +import { + AbstractMarketplaceService, + MarketplacePkg, + MimeTypePipeModule, +} from '@start9labs/marketplace' +import { + EmverPipesModule, + isEmptyObject, + LoadingService, + MarkdownPipeModule, + SafeLinksDirective, + SharedPipesModule, +} from '@start9labs/shared' +import { + TuiButtonModule, + TuiDialogService, + TuiLinkModule, + TuiLoaderModule, + TuiSvgModule, +} from '@taiga-ui/core' +import { TuiAvatarModule } from '@taiga-ui/experimental' +import { + TUI_PROMPT, + TuiAccordionModule, + TuiProgressModule, +} from '@taiga-ui/kit' +import { NgDompurifyModule } from '@tinkoff/ng-dompurify' +import { PatchDB } from 'patch-db-client' +import { + DataModel, + PackageDataEntry, +} from 'src/app/services/patch-db/data-model' +import { MarketplaceService } from 'src/app/services/marketplace.service' +import { hasCurrentDeps } from 'src/app/util/has-deps' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { Breakages } from 'src/app/services/api/api.types' +import { getAllPackages } from 'src/app/util/get-package-data' +import { InstallProgressPipe } from '../pipes/install-progress.pipe' + +@Component({ + selector: 'updates-item', + template: ` + +
+ +
+ {{ pkg.manifest.title }} +
+ + {{ local.manifest.version || '' | displayEmver }} + + + {{ pkg.manifest.version | displayEmver }} + +
+
+ {{ errors }} +
+
+ + + + + + + +
+ + What's new +

+ + View listing + +
+
+ `, + styles: [ + ` + :host { + display: block; + --tui-base-03: transparent; + + &:not(:last-child) { + border-bottom: 1px solid var(--tui-clear); + } + } + `, + ], + standalone: true, + imports: [ + NgIf, + RouterLink, + EmverPipesModule, + MarkdownPipeModule, + MimeTypePipeModule, + NgDompurifyModule, + SafeLinksDirective, + SharedPipesModule, + TuiProgressModule, + TuiAccordionModule, + TuiAvatarModule, + TuiSvgModule, + TuiButtonModule, + TuiLinkModule, + TuiLoaderModule, + InstallProgressPipe, + ], +}) +export class UpdatesItemComponent { + private readonly api = inject(ApiService) + private readonly dialogs = inject(TuiDialogService) + private readonly loader = inject(LoadingService) + private readonly patch = inject(PatchDB) + private readonly marketplace = inject( + AbstractMarketplaceService, + ) as MarketplaceService + + @Input({ required: true }) + pkg!: MarketplacePkg + + @Input({ required: true }) + local!: PackageDataEntry + + @Input({ required: true }) + url = '' + + get errors(): string { + return this.marketplace.updateErrors[this.pkg.manifest.id] + } + + get ready(): boolean { + return !this.marketplace.updateQueue[this.pkg.manifest.id] + } + + async onClick() { + const { id, version } = this.pkg.manifest + + delete this.marketplace.updateErrors[id] + this.marketplace.updateQueue[id] = true + + if (await hasCurrentDeps(this.patch, this.local.manifest.id)) { + await this.dry() + } else { + await this.update() + } + } + + private async dry() { + const { id, version } = this.pkg.manifest + const loader = this.loader + .open('Checking dependent services...') + .subscribe() + + try { + const breakages = await this.api.dryUpdatePackage({ + id, + version, + }) + loader.unsubscribe() + + if (isEmptyObject(breakages)) { + await this.update() + } else { + const proceed = await this.alert(breakages) + + if (proceed) { + await this.update() + } else { + delete this.marketplace.updateQueue[id] + } + } + } catch (e: any) { + delete this.marketplace.updateQueue[id] + this.marketplace.updateErrors[id] = e.message + loader.unsubscribe() + } + } + + private async update() { + const { id, version } = this.pkg.manifest + + try { + await this.marketplace.installPackage(id, version, this.url) + delete this.marketplace.updateQueue[id] + } catch (e: any) { + delete this.marketplace.updateQueue[id] + this.marketplace.updateErrors[id] = e.message + } + } + + private async alert(breakages: Breakages): Promise { + const content: string = `As a result of updating ${this.pkg.manifest.title}, the following services will no longer work properly and may crash:
    ` + const local = await getAllPackages(this.patch) + const bullets = Object.keys(breakages) + .map(id => `
  • ${local[id].manifest.title}
  • `) + .join('') + + return new Promise(async resolve => { + this.dialogs + .open(TUI_PROMPT, { + label: 'Warning', + size: 's', + data: { + content: `${content}${bullets}
`, + yes: 'Continue', + no: 'Cancel', + }, + }) + .subscribe(response => resolve(response)) + }) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/updates/pipes/filter-updates.pipe.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/updates/pipes/filter-updates.pipe.ts new file mode 100644 index 000000000..6e66f0c14 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/updates/pipes/filter-updates.pipe.ts @@ -0,0 +1,27 @@ +import { inject, Pipe, PipeTransform } from '@angular/core' +import { Emver } from '@start9labs/shared' +import { MarketplacePkg } from '@start9labs/marketplace' +import { PackageDataEntry } from 'src/app/services/patch-db/data-model' + +@Pipe({ + name: 'filterUpdates', + standalone: true, +}) +export class FilterUpdatesPipe implements PipeTransform { + private readonly emver = inject(Emver) + + transform( + pkgs?: MarketplacePkg[], + local?: Record, + ): MarketplacePkg[] | null { + return ( + pkgs?.filter( + ({ manifest }) => + this.emver.compare( + manifest.version, + local?.[manifest.id]?.manifest.version, // @TODO this won't work, need old version + ) === 1, + ) || null + ) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/updates/pipes/install-progress.pipe.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/updates/pipes/install-progress.pipe.ts new file mode 100644 index 000000000..3fa08e2d9 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/updates/pipes/install-progress.pipe.ts @@ -0,0 +1,13 @@ +import { Pipe, PipeTransform } from '@angular/core' +import { InstallProgress } from 'src/app/services/patch-db/data-model' +import { packageLoadingProgress } from 'src/app/util/package-loading-progress' + +@Pipe({ + name: 'installProgress', + standalone: true, +}) +export class InstallProgressPipe implements PipeTransform { + transform(installProgress?: InstallProgress): number { + return packageLoadingProgress(installProgress)?.totalProgress || 0 + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/updates/updates.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/updates/updates.component.ts new file mode 100644 index 000000000..c30f9ada0 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/updates/updates.component.ts @@ -0,0 +1,77 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { + AbstractMarketplaceService, + StoreIconComponentModule, +} from '@start9labs/marketplace' +import { TuiForModule } from '@taiga-ui/cdk' +import { PatchDB } from 'patch-db-client' +import { combineLatest } from 'rxjs' +import { MarketplaceService } from 'src/app/services/marketplace.service' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { ConfigService } from 'src/app/services/config.service' +import { FilterUpdatesPipe } from './pipes/filter-updates.pipe' +import { UpdatesItemComponent } from './components/item.component' +import { SkeletonListComponent } from '../../../components/skeleton-list.component' + +@Component({ + template: ` + +
+

+ + {{ host.name }} +

+

+ Request Failed +

+ +
+
+

All services are up to date!

+ + + + `, + host: { class: 'g-page' }, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + TuiForModule, + StoreIconComponentModule, + FilterUpdatesPipe, + UpdatesItemComponent, + SkeletonListComponent, + ], +}) +export class UpdatesComponent { + private readonly marketplace = inject( + AbstractMarketplaceService, + ) as MarketplaceService + + readonly config = inject(ConfigService) + + readonly data$ = combineLatest({ + hosts: this.marketplace.getKnownHosts$(true), + mp: this.marketplace.getMarketplace$(), + local: inject(PatchDB).watch$('package-data'), + errors: this.marketplace.getRequestErrors$(), + }) +} diff --git a/frontend/projects/ui/src/app/apps/portal/services/notifications.service.ts b/frontend/projects/ui/src/app/apps/portal/services/notifications.service.ts new file mode 100644 index 000000000..1c8eeb8a0 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/services/notifications.service.ts @@ -0,0 +1,78 @@ +import { inject, Injectable } from '@angular/core' +import { AbstractMarketplaceService } from '@start9labs/marketplace' +import { Emver } from '@start9labs/shared' +import { PatchDB } from 'patch-db-client' +import { + combineLatest, + EMPTY, + filter, + first, + map, + Observable, + pairwise, + startWith, + switchMap, +} from 'rxjs' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { MarketplaceService } from 'src/app/services/marketplace.service' +import { ConnectionService } from 'src/app/services/connection.service' + +@Injectable({ + providedIn: 'root', +}) +export class NotificationsService { + private readonly emver = inject(Emver) + private readonly patch = inject(PatchDB) + private readonly marketplace = inject( + AbstractMarketplaceService, + ) as MarketplaceService + + private readonly local$ = inject(ConnectionService).connected$.pipe( + filter(Boolean), + switchMap(() => this.patch.watch$('package-data').pipe(first())), + switchMap(outer => + this.patch.watch$('package-data').pipe( + pairwise(), + filter(([prev, curr]) => + Object.values(prev).some( + p => + !curr[p.manifest.id] || + (p['install-progress'] && + !curr[p.manifest.id]['install-progress']), + ), + ), + map(([_, curr]) => curr), + startWith(outer), + ), + ), + ) + + private readonly updates$ = combineLatest([ + this.marketplace.getMarketplace$(true), + this.local$, + ]).pipe( + map( + ([marketplace, local]) => + Object.entries(marketplace).reduce( + (list, [_, store]) => + store?.packages.reduce( + (result, { manifest: { id, version } }) => + this.emver.compare(version, local[id]?.manifest.version) === 1 + ? result.add(id) + : result, + list, + ) || list, + new Set(), + ).size, + ), + ) + + getNotifications(id: string): Observable { + switch (id) { + case '/portal/system/updates': + return this.updates$ + default: + return EMPTY + } + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/services/services.service.ts b/frontend/projects/ui/src/app/apps/portal/services/services.service.ts index 0a0683fbc..8afc6f43e 100644 --- a/frontend/projects/ui/src/app/apps/portal/services/services.service.ts +++ b/frontend/projects/ui/src/app/apps/portal/services/services.service.ts @@ -10,7 +10,7 @@ import { providedIn: 'root', }) export class ServicesService extends Observable { - private readonly services$ = inject>(PatchDB) + private readonly services$ = inject(PatchDB) .watch$('package-data') .pipe( map(pkgs => Object.values(pkgs)), diff --git a/frontend/projects/ui/src/app/apps/ui/pages/updates/filter-updates.pipe.ts b/frontend/projects/ui/src/app/apps/ui/pages/updates/filter-updates.pipe.ts index b0a99424f..ab2497b5b 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/updates/filter-updates.pipe.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/updates/filter-updates.pipe.ts @@ -17,7 +17,7 @@ export class FilterUpdatesPipe implements PipeTransform { ({ manifest }) => this.emver.compare( manifest.version, - local[manifest.id]?.manifest.version || '', // @TODO this won't work, need old version + local[manifest.id]?.manifest.version, // @TODO this won't work, need old version ) === 1, ) } diff --git a/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts index 4615ccf6d..28b881b41 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts @@ -44,5 +44,6 @@ const routes: Routes = [ NgDompurifyModule, TuiProgressModule, ], + exports: [FilterUpdatesPipe, InstallProgressPipe], }) export class UpdatesPageModule {} diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.ts index 40ae052a2..9feb5dee6 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.ts @@ -1,6 +1,6 @@ import { ChangeDetectionStrategy, Component, inject } from '@angular/core' import { PatchDB } from 'patch-db-client' -import { Widget } from 'src/app/services/patch-db/data-model' +import { DataModel, Widget } from 'src/app/services/patch-db/data-model' import { POLYMORPHEUS_CONTEXT, PolymorpheusComponent, @@ -17,7 +17,7 @@ import { BUILT_IN_WIDGETS } from '../widgets' export class AddWidgetComponent { readonly context = inject>(POLYMORPHEUS_CONTEXT) - readonly installed$ = inject(PatchDB).watch$('ui', 'widgets') + readonly installed$ = inject(PatchDB).watch$('ui', 'widgets') readonly widgets = BUILT_IN_WIDGETS diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.ts index 4b5b12413..4ecfd131e 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.ts @@ -1,7 +1,10 @@ import { ChangeDetectionStrategy, Component, inject } from '@angular/core' import { PatchDB } from 'patch-db-client' import { map } from 'rxjs' -import { PackageDataEntry } from 'src/app/services/patch-db/data-model' +import { + DataModel, + PackageDataEntry, +} from 'src/app/services/patch-db/data-model' import { PrimaryStatus } from 'src/app/services/pkg-status-rendering.service' import { getPackageInfo } from 'src/app/util/get-package-info' import { PkgInfo } from 'src/app/types/pkg-info' @@ -21,7 +24,7 @@ export class HealthComponent { 'Transitioning', ] as const - readonly data$ = inject(PatchDB) + readonly data$ = inject(PatchDB) .watch$('package-data') .pipe( map(data => { diff --git a/frontend/projects/ui/src/app/services/api/mock-patch.ts b/frontend/projects/ui/src/app/services/api/mock-patch.ts index e15257242..ae9e9b4d7 100644 --- a/frontend/projects/ui/src/app/services/api/mock-patch.ts +++ b/frontend/projects/ui/src/app/services/api/mock-patch.ts @@ -111,7 +111,19 @@ export const mockPatchData: DataModel = { '$argon2d$v=19$m=1024,t=1,p=1$YXNkZmFzZGZhc2RmYXNkZg$Ceev1I901G6UwU+hY0sHrFZ56D+o+LNJ', }, 'package-data': { - bitcoind: Mock.bitcoind, - lnd: Mock.lnd, + bitcoind: { + ...Mock.bitcoind, + manifest: { + ...Mock.bitcoind.manifest, + version: '0.19.0', + }, + }, + lnd: { + ...Mock.lnd, + manifest: { + ...Mock.lnd.manifest, + version: '0.11.0', + }, + }, }, } From b195e3435f564a7d670e4721a6273052aeff959c Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Mon, 23 Oct 2023 02:49:05 +0400 Subject: [PATCH 020/169] fix: fix discussed issues (#2467) * fix: fix discussed issues * chore: fix issues * fix package lock --------- Co-authored-by: Matt Hill --- frontend/package-lock.json | 4267 +++++++++++------ frontend/package.json | 14 +- frontend/projects/ui/src/app/app.providers.ts | 5 + .../components/card/card.component.html | 4 +- .../portal/components/card/card.component.ts | 4 +- .../navigation/navigation.component.scss | 10 + .../navigation/navigation.component.ts | 8 +- .../system/backups/backups.component.ts | 18 +- .../backups/modals/history.component.ts | 122 +- .../system/backups/modals/jobs.component.ts | 94 +- .../system/backups/modals/target.component.ts | 4 +- .../backups/modals/targets.component.ts | 29 +- .../updates/components/item.component.ts | 2 +- .../portal/services/navigation.service.ts | 6 +- .../services/routing-strategy.service.ts | 73 + frontend/projects/ui/src/styles.scss | 6 + 16 files changed, 3078 insertions(+), 1588 deletions(-) create mode 100644 frontend/projects/ui/src/app/apps/portal/services/routing-strategy.service.ts diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 176c9c6f3..763e62539 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -23,13 +23,13 @@ "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc8.beta2", - "@taiga-ui/addon-charts": "3.47.0", - "@taiga-ui/cdk": "3.47.0", - "@taiga-ui/core": "3.47.0", - "@taiga-ui/experimental": "3.47.0", - "@taiga-ui/icons": "3.47.0", - "@taiga-ui/kit": "3.47.0", - "@taiga-ui/styles": "3.47.0", + "@taiga-ui/addon-charts": "3.49.1", + "@taiga-ui/cdk": "3.49.1", + "@taiga-ui/core": "3.49.1", + "@taiga-ui/experimental": "3.491.1-canary.5e01f6f\n", + "@taiga-ui/icons": "3.49.1", + "@taiga-ui/kit": "3.49.1", + "@taiga-ui/styles": "3.49.1", "@tinkoff/ng-dompurify": "4.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", @@ -121,12 +121,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1601.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1601.8.tgz", - "integrity": "sha512-kOXVGwsQnZvtz2UZNefcEy64Jiwq0eSoQUeozvDXOaYRJABLjPKI2YaarvKC9/Z1SGLuje0o/eRJO4T8aRk9rQ==", + "version": "0.1602.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.7.tgz", + "integrity": "sha512-r6+z4jRE+e9VNeTmJCGz5VI5azRagOqE4SIDqaywz75eHOJ9UPSo9MHy8zFw1eLt1WcvCDqk+Pk9+krh2E+B8Q==", "devOptional": true, "dependencies": { - "@angular-devkit/core": "16.1.8", + "@angular-devkit/core": "16.2.7", "rxjs": "7.8.1" }, "engines": { @@ -136,40 +136,40 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.1.8.tgz", - "integrity": "sha512-iyElPBQdcJq2plw5YqSz4mzNUfSRXI3ISFTEwPtimzPOorsj/OxB3Z6kJ8fDUsBAJ5OKR7xL7VnQJJ3S+05RhQ==", + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.7.tgz", + "integrity": "sha512-OTH4qzXmWXifhvH0iXwPUhElWEU9SUcIZyWYbv2NR5ImAw/GE07vDuBljGRJeSEC9MpFbThwEFbHD8oRWiLUag==", "dev": true, "dependencies": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1601.8", - "@angular-devkit/build-webpack": "0.1601.8", - "@angular-devkit/core": "16.1.8", - "@babel/core": "7.22.5", - "@babel/generator": "7.22.7", + "@angular-devkit/architect": "0.1602.7", + "@angular-devkit/build-webpack": "0.1602.7", + "@angular-devkit/core": "16.2.7", + "@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.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.5", - "@babel/preset-env": "7.22.5", - "@babel/runtime": "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.1.8", + "@ngtools/webpack": "16.2.7", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", "autoprefixer": "10.4.14", - "babel-loader": "9.1.2", + "babel-loader": "9.1.3", "babel-plugin-istanbul": "6.1.1", "browserslist": "^4.21.5", - "cacache": "17.1.3", "chokidar": "3.5.3", "copy-webpack-plugin": "11.0.0", "critters": "0.0.20", "css-loader": "6.8.1", - "esbuild-wasm": "0.17.19", - "fast-glob": "3.2.12", + "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", @@ -178,31 +178,31 @@ "less-loader": "11.1.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.2.1", - "magic-string": "0.30.0", + "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": "3.2.0", - "postcss": "8.4.24", - "postcss-loader": "7.3.2", + "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.63.2", - "sass-loader": "13.3.1", - "semver": "7.5.3", + "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.17.7", + "terser": "5.19.2", "text-table": "0.2.0", "tree-kill": "1.2.2", - "tslib": "2.5.3", - "vite": "4.3.9", - "webpack": "5.86.0", + "tslib": "2.6.1", + "vite": "4.4.7", + "webpack": "5.88.2", "webpack-dev-middleware": "6.1.1", - "webpack-dev-server": "4.15.0", + "webpack-dev-server": "4.15.1", "webpack-merge": "5.9.0", "webpack-subresource-integrity": "5.1.0" }, @@ -212,7 +212,7 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.17.19" + "esbuild": "0.18.17" }, "peerDependencies": { "@angular/compiler-cli": "^16.0.0", @@ -258,9 +258,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.3.tgz", + "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==", "dev": true }, "node_modules/@angular-devkit/build-angular/node_modules/ajv": { @@ -313,15 +313,15 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", "dev": true }, "node_modules/@angular-devkit/build-angular/node_modules/webpack": { - "version": "5.86.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", - "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -333,7 +333,7 @@ "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.14.1", + "enhanced-resolve": "^5.15.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -343,7 +343,7 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.2", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", @@ -366,12 +366,12 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1601.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1601.8.tgz", - "integrity": "sha512-LUMA3xNnN4IY/FPaqyF6rzba+QVxl3vA+v0l71CBIKNU+Qee6D9xe8KG0Bn7relqDhWZOSHY0nhhO2mBoz4iQg==", + "version": "0.1602.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.7.tgz", + "integrity": "sha512-3+MV9ehn65XUUMSBBgfg5K2zZs2jhif75ypI+BBUfZDUWeKR5MeGJy0aDHZ+2H94kPkmSD3PrkOuitWdnDjTgA==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1601.8", + "@angular-devkit/architect": "0.1602.7", "rxjs": "7.8.1" }, "engines": { @@ -385,13 +385,14 @@ } }, "node_modules/@angular-devkit/core": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.8.tgz", - "integrity": "sha512-dSRD/+bGanArIXkj+kaU1kDFleZeQMzmBiOXX+pK0Ah9/0Yn1VmY3RZh1zcX9vgIQXV+t7UPrTpOjaERMUtVGw==", + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.7.tgz", + "integrity": "sha512-XskObYrg7NRdEuHnSVZOM7OeinEL8HzugjmKnawAa+dAbFCCoGsVWjMliA/Q8sb1yfGkyL0WW7DZABZj7EGwWA==", "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" }, @@ -410,13 +411,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.8.tgz", - "integrity": "sha512-6LyzMdFJs337RTxxkI2U1Ndw0CW5mMX/aXWl8d7cW2odiSrAg8IdlMqpc+AM8+CPfsB0FtS1aWkEZqJLT0jHOg==", + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.2.7.tgz", + "integrity": "sha512-zu3xHwA4w+kXHkyyjGl3i7uSU2/kKLPKuyyixw0WLcKUQCYd7TWmu8OC0qCDa42XkxP9gGL091dJFu56exgneA==", "dependencies": { - "@angular-devkit/core": "16.1.8", + "@angular-devkit/core": "16.2.7", "jsonc-parser": "3.2.0", - "magic-string": "0.30.0", + "magic-string": "0.30.1", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -427,9 +428,9 @@ } }, "node_modules/@angular/animations": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.1.8.tgz", - "integrity": "sha512-aIAf8EAZomgXMF6AP0wTPAc04Cvw+nL9nkEVwQNVxMByZpcbnnqHWHokLD8es8DzlwDT+EIZS4wZMBA4XUmPyA==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.2.10.tgz", + "integrity": "sha512-UudunZoyFWWNpuWkwiBxC3cleLCVJGHIfMgypFwC35YjtiIlRJ0r4nVkc96Rq1xd4mT71Dbk1kQHc8urB8A7aw==", "dependencies": { "tslib": "^2.3.0" }, @@ -437,19 +438,19 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "16.1.8" + "@angular/core": "16.2.10" } }, "node_modules/@angular/cli": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.1.8.tgz", - "integrity": "sha512-amOIHMq8EvixhnI+do5Bcy6IZSFAJx0njhhLM4ltDuNUczH8VH0hNegZKxhb8K87AMO8jITFM+NLrzccyghsDQ==", + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.2.7.tgz", + "integrity": "sha512-30yBAYzbrj/WM4tLiX4IU5byw0b5Y5LEzcpjYZglv/RXPrnevGlRXmgCulpt8wIdkd668N7kXEQ23nipuJDXMg==", "devOptional": true, "dependencies": { - "@angular-devkit/architect": "0.1601.8", - "@angular-devkit/core": "16.1.8", - "@angular-devkit/schematics": "16.1.8", - "@schematics/angular": "16.1.8", + "@angular-devkit/architect": "0.1602.7", + "@angular-devkit/core": "16.2.7", + "@angular-devkit/schematics": "16.2.7", + "@schematics/angular": "16.2.7", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.1", @@ -461,7 +462,7 @@ "ora": "5.4.1", "pacote": "15.2.0", "resolve": "1.22.2", - "semver": "7.5.3", + "semver": "7.5.4", "symbol-observable": "4.0.0", "yargs": "17.7.2" }, @@ -475,9 +476,9 @@ } }, "node_modules/@angular/common": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.1.8.tgz", - "integrity": "sha512-Zm+Ysxdf74VwG3mbAqs2v1QFUR+h9RyJBXF5VFABEpgFw7NUOBKrayjJmKjgZ0TBAmL2+nXehJgcPph3zNp3sg==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.2.10.tgz", + "integrity": "sha512-cLth66aboInNcWFjDBRmK30jC5KN10nKDDcv4U/r3TDTBpKOtnmTjNFFr7dmjfUmVhHFy/66piBMfpjZI93Rxg==", "dependencies": { "tslib": "^2.3.0" }, @@ -485,14 +486,14 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "16.1.8", + "@angular/core": "16.2.10", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.1.8.tgz", - "integrity": "sha512-jF2zk3LjrcI/xpjJG6yoLiL2t2l5227i8SjhRUawAL1sy0xtb/PiSLjCNhuSgyixbB/8az/YezZe11MSg48FDg==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.2.10.tgz", + "integrity": "sha512-ty6SfqkZlV2bLU/SSi3wmxrEFgPrK+WVslCNIr3FlTnCBdqpIbadHN2QB3A1d9XaNc7c4Tq5DQKh34cwMwNbuw==", "dependencies": { "tslib": "^2.3.0" }, @@ -500,7 +501,7 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "16.1.8" + "@angular/core": "16.2.10" }, "peerDependenciesMeta": { "@angular/core": { @@ -509,12 +510,12 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.1.8.tgz", - "integrity": "sha512-Whk3RBnEYwN0c6Mo7hU6JDpHSyKONmIQEN8ViHJXwmyHK8w+/Z27iBw10QiyWUMtYb4tIM1xSLhRFAwH/3WnPQ==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.2.10.tgz", + "integrity": "sha512-swgmtm4R23vQV9nJTXdDEFpOyIw3kz80mdT9qo3VId/2rqenOK253JsFypoqEj/fKzjV9gwXtTbmrMlhVyuyxw==", "dev": true, "dependencies": { - "@babel/core": "7.22.5", + "@babel/core": "7.23.2", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", @@ -532,14 +533,88 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/compiler": "16.1.8", + "@angular/compiler": "16.2.10", "typescript": ">=4.9.3 <5.2" } }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "dev": true, + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@angular/core": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.1.8.tgz", - "integrity": "sha512-XtOpY9HA85hPGrPwe1rgE8NJ3bFWbuJFx4SUlzB66k9B5jo8bD2Dxl/0id55RFS5gmvCe/Qhh0zoGyMpkWjMHA==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.2.10.tgz", + "integrity": "sha512-0XTsPjNflFhOl2CfNEdGeDOklG2t+m/D3g10Y7hg9dBjC1dURUEqTmM4d6J7JNbBURrP+/iP7uLsn3WRSipGUw==", "dependencies": { "tslib": "^2.3.0" }, @@ -552,9 +627,9 @@ } }, "node_modules/@angular/forms": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.1.8.tgz", - "integrity": "sha512-V36q42ExvL93T7oYvRf4Z2z2V/kOm0wgaFgkNSiBHgIpuwvrAZ9nRZBui5Fqdnep3xKYd980vAaTtACA1blv3Q==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.2.10.tgz", + "integrity": "sha512-TZliEtSWIL1UzY8kjed4QcMawWS8gk/H60KVgzCh83NGE0wd1OGv20Z5OR7O8j07dxB9vaxY7CQz/8eCz5KaNQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -562,25 +637,25 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.1.8", - "@angular/core": "16.1.8", - "@angular/platform-browser": "16.1.8", + "@angular/common": "16.2.10", + "@angular/core": "16.2.10", + "@angular/platform-browser": "16.2.10", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-16.1.8.tgz", - "integrity": "sha512-aP0M8NXt1VoVoRoK4te922X7UIrI0Wsi3XMudySCeOZwkMwuTO/cI9Bq/jF4di4pweAAlTA0HfewdKgyDa6ebA==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-16.2.10.tgz", + "integrity": "sha512-r3KNXizhZDtj5/L68xnrtgHp5iSYf4NPyWHovoyAWClabsZ64cK38fOzMNCT/otrwqJWlz9ELnW/b/pxR+M9sw==", "dev": true, "engines": { "node": "^16.14.0 || >=18.10.0" } }, "node_modules/@angular/platform-browser": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.1.8.tgz", - "integrity": "sha512-wfUCVU7DLMHy5Rw7LY8KSTuLk0ff2bWElT6WSAKXXFEPjQiWuXbbIe+gglJX5HFQQHoyVwNbsSDIIgEp535Kvw==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.2.10.tgz", + "integrity": "sha512-TOZiK7ji550F8G39Ri255NnK1+2Xlr74RiElJdQct4TzfN0lqNf2KRDFFNwDohkP/78FUzcP4qBxs+Nf8M7OuQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -588,9 +663,9 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/animations": "16.1.8", - "@angular/common": "16.1.8", - "@angular/core": "16.1.8" + "@angular/animations": "16.2.10", + "@angular/common": "16.2.10", + "@angular/core": "16.2.10" }, "peerDependenciesMeta": { "@angular/animations": { @@ -599,9 +674,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.1.8.tgz", - "integrity": "sha512-mhQH78Zn/oFe+U8DmVvPJ0/7neDlnKcgktQ7f1vFNibRLqkmHW/o1vZ0B7CAmO+yzGbB8mt+RBCFAfA7g3oRDg==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.2.10.tgz", + "integrity": "sha512-YVmhAjOmsp2SWRonv6Mr/qXuKroCiew9asd1IlAZ//wqcml9ZrNAcX3WlDa8ZqdmOplQb0LuvvirfNB/6Is/jg==", "dependencies": { "tslib": "^2.3.0" }, @@ -609,19 +684,19 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.1.8", - "@angular/compiler": "16.1.8", - "@angular/core": "16.1.8", - "@angular/platform-browser": "16.1.8" + "@angular/common": "16.2.10", + "@angular/compiler": "16.2.10", + "@angular/core": "16.2.10", + "@angular/platform-browser": "16.2.10" } }, "node_modules/@angular/pwa": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@angular/pwa/-/pwa-16.1.8.tgz", - "integrity": "sha512-P88cR+GeGzrH4T6W0F3vamfko+iXfyrI3nMXR6Qcz/gZw5STQmZao5oVro4vpKgc2HxKarvxnF/N5VIwVFWIXQ==", + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/@angular/pwa/-/pwa-16.2.7.tgz", + "integrity": "sha512-7Tv3XIGmxRNmDyVOMKziUhsRSMuECLcKPJW9tl6cdIfcBCvjqEkZCGyQ4p2wBwYKhzcufHTF5hnLuOW8oQ0oCQ==", "dependencies": { - "@angular-devkit/schematics": "16.1.8", - "@schematics/angular": "16.1.8", + "@angular-devkit/schematics": "16.2.7", + "@schematics/angular": "16.2.7", "parse5-html-rewriting-stream": "7.0.0" }, "engines": { @@ -639,9 +714,9 @@ } }, "node_modules/@angular/router": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.1.8.tgz", - "integrity": "sha512-p11Mz0qQbl26fcEEQ9LEUZhKrca9kqSwMWgxBRMWZl0AgtbWQadiVdjiQY0rvpohI7qSO8m3s7CFIQLKIOEvYQ==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.2.10.tgz", + "integrity": "sha512-ndiq2NkGZ8hTsyL/KK8qsiR3UA0NjOFIn1jtGXOKtHryXZ6vSTtkhtkE4h4+G6/QNTL1IKtocFhOQt/xsc7DUA==", "dependencies": { "tslib": "^2.3.0" }, @@ -649,16 +724,16 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.1.8", - "@angular/core": "16.1.8", - "@angular/platform-browser": "16.1.8", + "@angular/common": "16.2.10", + "@angular/core": "16.2.10", + "@angular/platform-browser": "16.2.10", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/service-worker": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-16.1.8.tgz", - "integrity": "sha512-P7DW7K//3Jv8uptJ0wFzsJ+F/rs4A1DvBxvbcRwJIKlRCedzUQiTTFE6pCDh2YRS0915faSs8PO4SmvrA5HqGw==", + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-16.2.10.tgz", + "integrity": "sha512-CBcmvLLYwkJUyRehxYrC/SOR5+rWAt6hKBHCNJHapLfVYddAC7xZNfjDp35e0rm0eOfCLlEUmtmi9DOqBHFM2A==", "dependencies": { "tslib": "^2.3.0" }, @@ -669,8 +744,8 @@ "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "16.1.8", - "@angular/core": "16.1.8" + "@angular/common": "16.2.10", + "@angular/core": "16.2.10" } }, "node_modules/@assemblyscript/loader": { @@ -680,47 +755,48 @@ "dev": true }, "node_modules/@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.5" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", - "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.5", - "@babel/parser": "^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.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.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -740,9 +816,9 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz", - "integrity": "sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", "dev": true, "dependencies": { "@babel/types": "^7.22.5", @@ -767,34 +843,31 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", - "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", - "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "browserslist": "^4.21.9", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { @@ -807,15 +880,15 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", - "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-replace-supers": "^7.22.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", @@ -829,18 +902,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -851,9 +912,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", - "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -877,9 +938,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", - "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", + "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -893,22 +954,36 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -927,40 +1002,40 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", - "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -969,18 +1044,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", @@ -1003,14 +1066,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", - "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.9" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1020,13 +1083,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", - "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { @@ -1061,9 +1124,9 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", - "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { "@babel/types": "^7.22.5" @@ -1082,59 +1145,87 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz", - "integrity": "sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", - "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.6", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -1142,9 +1233,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", - "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1154,9 +1245,9 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", - "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", + "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1169,14 +1260,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", - "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", + "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.5" + "@babel/plugin-transform-optional-chaining": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1189,6 +1280,7 @@ "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", @@ -1219,6 +1311,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", @@ -1482,14 +1575,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz", - "integrity": "sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", + "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -1532,9 +1625,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", - "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", + "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1563,12 +1656,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", - "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", + "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, @@ -1580,18 +1673,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", - "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", + "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, @@ -1602,18 +1695,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", @@ -1631,9 +1712,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", - "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", + "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1677,9 +1758,9 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", - "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", + "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1709,9 +1790,9 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", - "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", + "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1725,9 +1806,9 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", - "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", + "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1757,9 +1838,9 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", - "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", + "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1788,9 +1869,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", - "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", + "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1819,12 +1900,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", - "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", + "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1835,12 +1916,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", - "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", + "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-simple-access": "^7.22.5" }, @@ -1852,15 +1933,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", - "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", + "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1917,9 +1998,9 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", - "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", + "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1933,9 +2014,9 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", - "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", + "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1949,16 +2030,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", - "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", + "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", + "@babel/compat-data": "^7.22.9", + "@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.22.5" + "@babel/plugin-transform-parameters": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1984,9 +2065,9 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", - "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", + "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -2000,9 +2081,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz", - "integrity": "sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", + "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -2017,9 +2098,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", - "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", + "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -2048,13 +2129,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", - "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", + "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, @@ -2081,13 +2162,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", - "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.1" + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -2112,17 +2193,17 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.5.tgz", - "integrity": "sha512-bg4Wxd1FWeFx3daHFTWk1pkSWK/AyQuiyAoeZAOkAOUBjnZPH6KT7eMxouV47tQ6hl6ax2zyAWBdWZXbrvXlaw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", + "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.3", - "babel-plugin-polyfill-corejs3": "^0.8.1", - "babel-plugin-polyfill-regenerator": "^0.5.0", - "semver": "^6.3.0" + "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" }, "engines": { "node": ">=6.9.0" @@ -2217,9 +2298,9 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", - "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -2280,13 +2361,13 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.5.tgz", - "integrity": "sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", + "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", + "@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", @@ -2311,13 +2392,13 @@ "@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.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.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", @@ -2342,7 +2423,7 @@ "@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.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", @@ -2360,11 +2441,11 @@ "@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.3", - "babel-plugin-polyfill-corejs3": "^0.8.1", - "babel-plugin-polyfill-regenerator": "^0.5.0", - "core-js-compat": "^3.30.2", - "semver": "^6.3.0" + "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" }, "engines": { "node": ">=6.9.0" @@ -2405,9 +2486,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", - "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.11" @@ -2431,19 +2512,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", - "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.7", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/types": "^7.22.5", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2451,26 +2532,29 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2509,9 +2593,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", + "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", "cpu": [ "arm" ], @@ -2525,9 +2609,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", + "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", "cpu": [ "arm64" ], @@ -2541,9 +2625,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz", + "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", "cpu": [ "x64" ], @@ -2557,9 +2641,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", + "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", "cpu": [ "arm64" ], @@ -2573,9 +2657,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", + "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", "cpu": [ "x64" ], @@ -2589,9 +2673,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", + "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", "cpu": [ "arm64" ], @@ -2605,9 +2689,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", + "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", "cpu": [ "x64" ], @@ -2621,9 +2705,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", + "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", "cpu": [ "arm" ], @@ -2637,9 +2721,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", + "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==", "cpu": [ "arm64" ], @@ -2653,9 +2737,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", + "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", "cpu": [ "ia32" ], @@ -2669,9 +2753,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", + "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", "cpu": [ "loong64" ], @@ -2685,9 +2769,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", + "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", "cpu": [ "mips64el" ], @@ -2701,9 +2785,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", + "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", "cpu": [ "ppc64" ], @@ -2717,9 +2801,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", + "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", "cpu": [ "riscv64" ], @@ -2733,9 +2817,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", + "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", "cpu": [ "s390x" ], @@ -2749,9 +2833,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", + "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", "cpu": [ "x64" ], @@ -2765,9 +2849,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", + "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", "cpu": [ "x64" ], @@ -2781,9 +2865,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", + "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", "cpu": [ "x64" ], @@ -2797,9 +2881,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", + "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", "cpu": [ "x64" ], @@ -2813,9 +2897,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", + "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", "cpu": [ "arm64" ], @@ -2829,9 +2913,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", + "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", "cpu": [ "ia32" ], @@ -2845,9 +2929,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", + "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", "cpu": [ "x64" ], @@ -3537,9 +3621,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { "node": ">=6.0.0" @@ -3570,21 +3654,15 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", @@ -3681,9 +3759,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.1.8.tgz", - "integrity": "sha512-co2SC1a822655Ek2f6fkMFsswHeCm2obNceb0kftLSpqomCgPAC3T447pB3TE1Iw+BEMFdjrAgIrp3nyYWwHsQ==", + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.7.tgz", + "integrity": "sha512-QnVoYpMNMuV387VgmP/c/ylD9qUIZpN02LMg3rQqz7NDej0jboBZaxqLJ+7jQaCoEIFVGIgL/RR/X1kponxJZg==", "dev": true, "engines": { "node": "^16.14.0 || >=18.10.0", @@ -3880,15 +3958,15 @@ } }, "node_modules/@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "version": "1.0.0-next.23", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.23.tgz", + "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==", "dev": true }, "node_modules/@rollup/plugin-json": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.0.0.tgz", - "integrity": "sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.0.1.tgz", + "integrity": "sha512-RgVfl5hWMkxN1h/uZj8FVESvPuBJ/uf6ly6GTj0GONnkfoBN5KC0MSz+PN2OLDgYXMhtG0mWpTrkiOjoxAIevw==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1" @@ -3897,7 +3975,7 @@ "node": ">=14.0.0" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { @@ -3906,9 +3984,9 @@ } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.1.0.tgz", - "integrity": "sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", + "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1", @@ -3922,7 +4000,7 @@ "node": ">=14.0.0" }, "peerDependencies": { - "rollup": "^2.78.0||^3.0.0" + "rollup": "^2.78.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { @@ -3931,9 +4009,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", - "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.5.tgz", + "integrity": "sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==", "dev": true, "dependencies": { "@types/estree": "^1.0.0", @@ -3944,7 +4022,7 @@ "node": ">=14.0.0" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { @@ -3953,18 +4031,18 @@ } }, "node_modules/@rollup/pluginutils/node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.3.tgz", + "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==", "dev": true }, "node_modules/@schematics/angular": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.1.8.tgz", - "integrity": "sha512-gTHy1A/E9BCr0sj3VCr6eBYkgVkO96QWiZcFumedGnvstvp5wiCoIoJPLLfYaxVt1vt08xmnmS3OZ3r0qCLdpA==", + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.7.tgz", + "integrity": "sha512-sL+7vmwYPdo29rp99XYlm8gibqcjjOL5LKEleVQlv63SRES3HLMt7DeYivUfizcMENu/1hDtX41ig4Mu1SpNzg==", "dependencies": { - "@angular-devkit/core": "16.1.8", - "@angular-devkit/schematics": "16.1.8", + "@angular-devkit/core": "16.2.7", + "@angular-devkit/schematics": "16.2.7", "jsonc-parser": "3.2.0" }, "engines": { @@ -3974,9 +4052,9 @@ } }, "node_modules/@sigstore/bundle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.0.0.tgz", - "integrity": "sha512-yLvrWDOh6uMOUlFCTJIZEnwOT9Xte7NPXUqVexEKGSF5XtBAuSg5du0kn3dRR0p47a4ah10Y0mNt8+uyeQXrBQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", + "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", "devOptional": true, "dependencies": { "@sigstore/protobuf-specs": "^0.2.0" @@ -3986,10 +4064,24 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.0.tgz", - "integrity": "sha512-8ZhZKAVfXjIspDWwm3D3Kvj0ddbJ0HqDZ/pOs5cx88HpT8mVsotFrg7H1UMnXOuDHz6Zykwxn4mxG3QLuN+RUg==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", + "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", + "devOptional": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", + "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", "devOptional": true, + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "make-fetch-happen": "^11.0.1" + }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -4041,9 +4133,9 @@ } }, "node_modules/@taiga-ui/addon-charts": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.47.0.tgz", - "integrity": "sha512-winbbnpo1hJv6vq/6ov2TEF1OnGCNeLgZAfokJ4/dYTysT9xUPgEiQAff55sqo6zlY2sYLBgHtxn3djeW5bj+Q==", + "version": "3.49.1", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.49.1.tgz", + "integrity": "sha512-Y2b421JSEOboB+wbLcf0uPeYWGtMtc4ZmqSF4cT8DPB8vA8QsG2HWj+JrOVjwnsryiuTieiFHE3txk1w4sjTVA==", "dependencies": { "tslib": ">=2.0.0" }, @@ -4051,21 +4143,21 @@ "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@ng-web-apis/common": ">=3.0.0", - "@taiga-ui/cdk": ">=3.47.0", - "@taiga-ui/core": ">=3.47.0", + "@taiga-ui/cdk": ">=3.49.1", + "@taiga-ui/core": ">=3.49.1", "@tinkoff/ng-polymorpheus": ">=4.0.0" } }, "node_modules/@taiga-ui/cdk": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.47.0.tgz", - "integrity": "sha512-SCEnKZq5Psac4NexCPDKmb+38YAcowaWWZNBuOgCJZp63aesHkRkH0KjMCoTBWe19F4EPsE48ARndJa/1wPQkA==", + "version": "3.49.1", + "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.49.1.tgz", + "integrity": "sha512-Mo+o/ey7WJYvXh/4hQiUca0VRVmGtEn13PMWY+wAE+243F8KeoMca/CGpzV3DhpK3WTUbFyURvmNV0pR78Qmzw==", "dependencies": { "@ng-web-apis/common": "3.0.3", "@ng-web-apis/mutation-observer": "3.0.3", "@ng-web-apis/resize-observer": "3.0.3", "@tinkoff/ng-event-plugins": "3.1.0", - "@tinkoff/ng-polymorpheus": "4.1.0", + "@tinkoff/ng-polymorpheus": "4.2.0", "tslib": "2.6.2" }, "optionalDependencies": { @@ -4081,11 +4173,11 @@ } }, "node_modules/@taiga-ui/core": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.47.0.tgz", - "integrity": "sha512-+NKA/yvvOr/XZvv0DRDV2kTqdZ8W3weQX4t80lS8SvCM++yl4Ep8p7/tSv16LZYSpaFPxzWx7o4bPJkgD5CwzQ==", + "version": "3.49.1", + "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.49.1.tgz", + "integrity": "sha512-rup9I5GVtbv5QNGj6jw2w1J2sHPRLwlmokI+/ceTzTlL4h1SvwH0vNm1hcQu4/nlsoYE4m3f8TyXs/1rM3lzxw==", "dependencies": { - "@taiga-ui/i18n": "^3.47.0", + "@taiga-ui/i18n": "^3.49.1", "tslib": ">=2.0.0" }, "peerDependencies": { @@ -4097,34 +4189,34 @@ "@angular/router": ">=12.0.0", "@ng-web-apis/common": ">=3.0.0", "@ng-web-apis/mutation-observer": ">=3.0.0", - "@taiga-ui/cdk": ">=3.47.0", - "@taiga-ui/i18n": ">=3.47.0", + "@taiga-ui/cdk": ">=3.49.1", + "@taiga-ui/i18n": ">=3.49.1", "@tinkoff/ng-event-plugins": ">=3.1.0", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/experimental": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/experimental/-/experimental-3.47.0.tgz", - "integrity": "sha512-cmgVXL5aXPys2qL92Xk/fLcLpU/8EPGkayYN7UtT7MNnz3bFM+vbfiY7qbbXrNUvbPjjt5El81hG4NLu9/XJag==", + "version": "3.491.1-canary.5e01f6f", + "resolved": "https://registry.npmjs.org/@taiga-ui/experimental/-/experimental-3.491.1-canary.5e01f6f.tgz", + "integrity": "sha512-bQCGK8DKYzMZ+0SZNJkplmZ/EhyJoaWsQk0F/P/WefA6SrjupHTUq3K35P1hT1Ixr0vADONOcEDFd5DgziTZ5g==", "dependencies": { "tslib": ">=2.0.0" }, "peerDependencies": { "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", - "@taiga-ui/cdk": ">=3.47.0", - "@taiga-ui/core": ">=3.47.0", - "@taiga-ui/kit": ">=3.47.0", + "@taiga-ui/cdk": ">=3.49.1", + "@taiga-ui/core": ">=3.49.1", + "@taiga-ui/kit": ">=3.49.1", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/i18n": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.47.0.tgz", - "integrity": "sha512-41C+ZBm8+rSR5/8ODmBn14dr5Z5MLYTpadXeV7u+AnrfsGQ3hA4D/AeiFHMNhp8zdXnsndDh0m/smB7Vkf2k5w==", + "version": "3.49.1", + "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.49.1.tgz", + "integrity": "sha512-x85DI7iuMUlKbvH+M/kuyYT7jmaV2ILxFXeCjrLs93iHilLisF3o9Zz+z+2pKgyjkBdnx0t2M3Bme2J3N6mXYA==", "dependencies": { "tslib": ">=2.0.0" }, @@ -4135,20 +4227,20 @@ } }, "node_modules/@taiga-ui/icons": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.47.0.tgz", - "integrity": "sha512-natMScHcxN4o9p7cG1dZncGkqDD7PsCqtx+s9x7hivUz5V/CPxJC8p0qBZRxgwcVZfSvvBbl9iP6Pubazkztxw==", + "version": "3.49.1", + "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.49.1.tgz", + "integrity": "sha512-TVllWirA7FIaGMGJuQqEPG5NbGvbxuxJaq7oNGV88+mBLaZtMIsIuWrG+ojCCwYYN+AztDFcfwG1BtSEpaGqww==", "dependencies": { "tslib": ">=2.0.0" }, "peerDependencies": { - "@taiga-ui/cdk": ">=3.47.0" + "@taiga-ui/cdk": ">=3.49.1" } }, "node_modules/@taiga-ui/kit": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.47.0.tgz", - "integrity": "sha512-un5nqmhxp9Q8Oa1aM5OjHxRTJb920raVImiXmaqJGyFIapgm8evqU6Ru9eaBH82giwMRUrVsjAa/zrzclvLsLg==", + "version": "3.49.1", + "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.49.1.tgz", + "integrity": "sha512-CwK3iWXQsgx8Hn5yIc42ndZbtm2oS5C5byo40B8ex+vYQeoOj7NTRmrBJ/XIhWi66vpSbbYY7+d8b/5g6vgfXg==", "dependencies": { "@maskito/angular": "1.7.0", "@maskito/core": "1.7.0", @@ -4165,19 +4257,19 @@ "@ng-web-apis/common": ">=3.0.0", "@ng-web-apis/mutation-observer": ">=3.0.0", "@ng-web-apis/resize-observer": ">=3.0.0", - "@taiga-ui/cdk": ">=3.47.0", - "@taiga-ui/core": ">=3.47.0", - "@taiga-ui/i18n": ">=3.47.0", + "@taiga-ui/cdk": ">=3.49.1", + "@taiga-ui/core": ">=3.49.1", + "@taiga-ui/i18n": ">=3.49.1", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/styles": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/styles/-/styles-3.47.0.tgz", - "integrity": "sha512-zgW9IhVhUpax7VuH3K4KL53OkZxy5JIxQ5JuSmLE+XIHsQ3sEDkoqnGSmvkDVbex5fo6Kbs/7iS5G1yKrSWw+Q==", + "version": "3.49.1", + "resolved": "https://registry.npmjs.org/@taiga-ui/styles/-/styles-3.49.1.tgz", + "integrity": "sha512-J1SEVKY/UUyM97M7HyzMbgbmRS3EZwqeTyRStezejpg/kBJrbOQaBx76cUCoBvVJ6PZ5S5N/AapnrutW1RTkfg==", "peerDependencies": { - "@taiga-ui/cdk": ">=3.47.0", + "@taiga-ui/cdk": ">=3.49.1", "tslib": ">=2.0.0" } }, @@ -4209,11 +4301,11 @@ } }, "node_modules/@tinkoff/ng-polymorpheus": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@tinkoff/ng-polymorpheus/-/ng-polymorpheus-4.1.0.tgz", - "integrity": "sha512-rhe7Fe+rTK5cqfbeySy9fmwBilgMUGkSVX4rrkpmPRSTDhSh/djrRUW0q5ukbN56Rx/AKSYZ5B/nEqY+HL1jZg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tinkoff/ng-polymorpheus/-/ng-polymorpheus-4.2.0.tgz", + "integrity": "sha512-DBjAXyfYq5PUuJSZK42TSJXqgAFkinavUdHy9bPSy88tLl0ZH3h+JK1EQSYqRP0WJzBe4lXywwDyH4HjagK7sg==", "dependencies": { - "tslib": "^2.0.0" + "tslib": "2.6.2" }, "peerDependencies": { "@angular/core": ">=12.0.0", @@ -4221,12 +4313,12 @@ } }, "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "devOptional": true, + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, "engines": { - "node": ">= 10" + "node": ">= 6" } }, "node_modules/@ts-morph/common": { @@ -4241,28 +4333,6 @@ "path-browserify": "^1.0.1" } }, - "node_modules/@ts-morph/common/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "optional": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@ts-morph/common/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "optional": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -4309,10 +4379,34 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/@tufjs/models/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "devOptional": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "devOptional": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.4.tgz", + "integrity": "sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==", "dev": true, "dependencies": { "@types/connect": "*", @@ -4320,27 +4414,27 @@ } }, "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.12.tgz", + "integrity": "sha512-ky0kWSqXVxSqgqJvPIkgFkcn4C8MnRog308Ou8xBBIVo39OmUFy+jqNe0nPwLCDFxUpmT9EvT91YzOJgkDRcFg==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "version": "3.4.37", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.37.tgz", + "integrity": "sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.2.tgz", + "integrity": "sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q==", "dev": true, "dependencies": { "@types/express-serve-static-core": "*", @@ -4366,9 +4460,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.44.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", - "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", + "version": "8.44.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.6.tgz", + "integrity": "sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==", "dev": true, "dependencies": { "@types/estree": "*", @@ -4376,9 +4470,9 @@ } }, "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.6.tgz", + "integrity": "sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==", "dev": true, "dependencies": { "@types/eslint": "*", @@ -4392,9 +4486,9 @@ "dev": true }, "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.20.tgz", + "integrity": "sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==", "dev": true, "dependencies": { "@types/body-parser": "*", @@ -4404,9 +4498,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "version": "4.17.39", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz", + "integrity": "sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==", "dev": true, "dependencies": { "@types/node": "*", @@ -4416,51 +4510,56 @@ } }, "node_modules/@types/fs-extra": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.2.tgz", - "integrity": "sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==", + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.4.tgz", + "integrity": "sha512-OMcQKnlrkrOI0TaZ/MgVDA8LYFl7CykzFsjMj9l5x3un2nFxCY20ZFlnqrM0lcqlbs0Yro2HbnZlmopyRaoJ5w==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.3.tgz", + "integrity": "sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==", "dev": true }, "node_modules/@types/http-proxy": { - "version": "1.17.11", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", - "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "version": "1.17.13", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.13.tgz", + "integrity": "sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/js-yaml": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", - "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.8.tgz", + "integrity": "sha512-m6jnPk1VhlYRiLFm3f8X9Uep761f+CK8mHyS65LutH2OhmBF0BeMEjHgg05usH8PLZMWWc/BUR9RPmkvpWnyRA==", "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", "dev": true }, + "node_modules/@types/luxon": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.3.tgz", + "integrity": "sha512-/BJF3NT0pRMuxrenr42emRUF67sXwcZCd+S1ksG/Fcf9O7C3kKCY4uJSbKBE4KDUIYr3WMsvfmWD8hRjXExBJQ==" + }, "node_modules/@types/marked": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.1.tgz", - "integrity": "sha512-vSSbKZFbNktrQ15v7o1EaH78EbWV+sPQbPjHG+Cp8CaNcPFUEfjZ0Iml/V0bFDwsTlYe8o6XC5Hfdp91cqPV2g==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.2.tgz", + "integrity": "sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==", "dev": true }, "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.4.tgz", + "integrity": "sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==", "dev": true }, "node_modules/@types/minimatch": { @@ -4470,51 +4569,51 @@ "optional": true }, "node_modules/@types/mustache": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@types/mustache/-/mustache-4.2.2.tgz", - "integrity": "sha512-MUSpfpW0yZbTgjekDbH0shMYBUD+X/uJJJMm9LXN1d5yjl5lCY1vN/eWKD6D1tOtjA6206K0zcIPnUaFMurdNA==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@types/mustache/-/mustache-4.2.4.tgz", + "integrity": "sha512-5DK8oX+pyEJm8Arm57Ut2R4KCeDuNQhLAuU04IgaKB7nYsFYzhpWqSoFnp7kCtVG7wXKftnaEJIyUFTVvSkkzw==", "dev": true }, "node_modules/@types/node": { - "version": "18.17.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.3.tgz", - "integrity": "sha512-2x8HWtFk0S99zqVQABU9wTpr8wPoaDHZUcAkoTKH+nL7kPv3WUI9cRi/Kk5Mz4xdqXSqTkKP7IWNoQQYCnDsTA==", + "version": "18.18.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.6.tgz", + "integrity": "sha512-wf3Vz+jCmOQ2HV1YUJuCWdL64adYxumkrxtc+H1VUQlnQI04+5HtH+qZCOE21lBE7gIrt+CwX2Wv8Acrw5Ak6w==", "dev": true }, "node_modules/@types/node-jose": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@types/node-jose/-/node-jose-1.1.10.tgz", - "integrity": "sha512-7L0ucJTugW4x/sYpQ+c5IudAwr0pFuxDVnZLpHKWpff7p1lVa3wTuNvnrzFBNeLojE+UY0cVCwNGXLxXsMIrzw==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@types/node-jose/-/node-jose-1.1.12.tgz", + "integrity": "sha512-HtSXbirRMuONr/KSNtBgh631xCt/t3lPz0geQ4pe/FA+yu06TUrJrXEU5y8nJFHNy8KhiZrq6OVlqXD1AtT/dQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.1.tgz", + "integrity": "sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==", "dev": true }, "node_modules/@types/pbkdf2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4HCoGwR3221nOc7G0Z/6KgTNGgaaFGkbGrtUJsB+zlKX2LBVjFHHIUkieMBgHHXgBH5Gq6dZHJKdBYdtlhBQvw==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "version": "6.9.9", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.9.tgz", + "integrity": "sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==", "dev": true }, "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.6.tgz", + "integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==", "dev": true }, "node_modules/@types/resolve": { @@ -4530,9 +4629,9 @@ "dev": true }, "node_modules/@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.3.tgz", + "integrity": "sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==", "dev": true, "dependencies": { "@types/mime": "^1", @@ -4540,18 +4639,18 @@ } }, "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.3.tgz", + "integrity": "sha512-4KG+yMEuvDPRrYq5fyVm/I2uqAJSAwZK9VSa+Zf+zUq9/oxSSvy3kkIqyL+jjStv6UCVi8/Aho0NHtB1Fwosrg==", "dev": true, "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", - "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.4.tgz", + "integrity": "sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==", "dev": true, "dependencies": { "@types/http-errors": "*", @@ -4566,18 +4665,18 @@ "dev": true }, "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "version": "0.3.35", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.35.tgz", + "integrity": "sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/trusted-types": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", - "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.5.tgz", + "integrity": "sha512-I3pkr8j/6tmQtKV/ZzHtuaqYSQvyjGRKH4go60Rr0IDLlFxuRT5V32uvB1mecM5G1EVAUyF/4r4QZ1GHgz+mxA==" }, "node_modules/@types/uuid": { "version": "8.3.4", @@ -4586,9 +4685,9 @@ "dev": true }, "node_modules/@types/ws": { - "version": "8.5.5", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", - "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.8.tgz", + "integrity": "sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg==", "dev": true, "dependencies": { "@types/node": "*" @@ -4752,6 +4851,99 @@ "@xtuc/long": "4.2.2" } }, + "node_modules/@wessberg/ts-evaluator": { + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz", + "integrity": "sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==", + "deprecated": "this package has been renamed to ts-evaluator. Please install ts-evaluator instead", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "jsdom": "^16.4.0", + "object-path": "^0.11.5", + "tslib": "^2.0.3" + }, + "engines": { + "node": ">=10.1.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/wessberg/ts-evaluator?sponsor=1" + }, + "peerDependencies": { + "typescript": ">=3.2.x || >= 4.x" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@wessberg/ts-evaluator/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -4807,6 +4999,28 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/acorn-import-assertions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", @@ -4817,9 +5031,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true, "engines": { "node": ">=0.4.0" @@ -4865,13 +5079,11 @@ } }, "node_modules/agentkeepalive": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.4.0.tgz", - "integrity": "sha512-MysLRwkhsJTZKs+fsZIsTgBlr3IjQroonVJWMSqC9k3LS6f6ZifePl9fCqOtvc8p0CeYDSZVFvytdkwhOGaSZA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", "devOptional": true, "dependencies": { - "debug": "^4.1.0", - "depd": "^2.0.0", "humanize-ms": "^1.2.1" }, "engines": { @@ -5150,12 +5362,12 @@ } }, "node_modules/babel-loader": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", - "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", "dev": true, "dependencies": { - "find-cache-dir": "^3.3.2", + "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" }, "engines": { @@ -5183,13 +5395,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", - "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", + "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.2", + "@babel/helper-define-polyfill-provider": "^0.4.3", "semver": "^6.3.1" }, "peerDependencies": { @@ -5206,25 +5418,25 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", - "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz", + "integrity": "sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2", - "core-js-compat": "^3.31.0" + "@babel/helper-define-polyfill-provider": "^0.4.3", + "core-js-compat": "^3.32.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", - "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", + "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2" + "@babel/helper-define-polyfill-provider": "^0.4.3" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -5408,12 +5620,13 @@ "dev": true }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "devOptional": true, "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/braces": { @@ -5428,10 +5641,16 @@ "node": ">=8" } }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "funding": [ { @@ -5448,10 +5667,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -5520,16 +5739,16 @@ } }, "node_modules/cacache": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.3.tgz", - "integrity": "sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==", - "devOptional": true, + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.0.tgz", + "integrity": "sha512-I7mVOPl3PUCeRub1U8YoGz2Lqv9WOBpobZ8RyWFXmReuILz+3OAyTa5oH3QPdtKZD7N0Yk00aLfzn0qvp8dZ1w==", + "dev": true, "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", @@ -5539,26 +5758,27 @@ "unique-filename": "^3.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "devOptional": true, + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "dev": true, "engines": { - "node": ">=12" + "node": "14 || >=16.14" } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5582,9 +5802,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001519", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz", - "integrity": "sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==", + "version": "1.0.30001553", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001553.tgz", + "integrity": "sha512-N0ttd6TrFfuqKNi+pMgWJTb9qrdJu4JSpgPFLe/lrD19ugC6fZgF0pUewRowDwzdDnb9V41mFcdlYgl/PyKf4A==", "dev": true, "funding": [ { @@ -5716,9 +5936,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", - "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", + "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==", "engines": { "node": ">=6" }, @@ -5877,6 +6097,18 @@ "node": ">=6" } }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/code-block-writer": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-10.1.1.tgz", @@ -5926,14 +6158,20 @@ } }, "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "dev": true, "engines": { - "node": ">=14" + "node": ">=16" } }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -6130,9 +6368,9 @@ } }, "node_modules/core-js": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.0.tgz", - "integrity": "sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww==", + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.1.tgz", + "integrity": "sha512-qVSq3s+d4+GsqN0teRCJtM6tdEEXyWxjzbhVrCHmBS5ZTM0FS2MOS0D13dUXAWDUN6a+lHI/N1hF9Ytz6iLl9Q==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -6140,12 +6378,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.0.tgz", - "integrity": "sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==", + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.1.tgz", + "integrity": "sha512-6pYKNOgD/j/bkC5xS5IIg6bncid3rfrI42oBH1SQJbsmYPKF7rhzcFzYCcxYMmNQQ0rCEB8WqpW7QHndOggaeQ==", "dev": true, "dependencies": { - "browserslist": "^4.21.9" + "browserslist": "^4.22.1" }, "funding": { "type": "opencollective", @@ -6300,17 +6538,18 @@ } }, "node_modules/cron": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/cron/-/cron-2.4.0.tgz", - "integrity": "sha512-Cx77ic1TyIAtUggr0oAhtS8MLzPBUqGNIvdDM7jE3oFIxfe8LXWI9q3iQN/H2CebAiMir53LQKWOhEKnzkJTAQ==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/cron/-/cron-2.4.4.tgz", + "integrity": "sha512-MHlPImXJj3K7x7lyUHjtKEOl69CSlTOWxS89jiFgNkzXfvhVjhMz/nc7/EIfN9vgooZp8XTtXJ1FREdmbyXOiQ==", "dependencies": { - "luxon": "^3.2.1" + "@types/luxon": "~3.3.0", + "luxon": "~3.3.0" } }, "node_modules/cronstrue": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.28.0.tgz", - "integrity": "sha512-yByAR5on9i/p26djiSve4l29/AJkjCFDgopq+3gUVrQh2xgb3KKScofwkpf5XcRhuWAX0u0EuEK2nltB5hV1jQ==", + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.32.0.tgz", + "integrity": "sha512-dmNflOCNJL6lZEj0dp2YhGIPY83VTjFue6d9feFhnNtrER6mAjBrUvSgK95j3IB/xNGpLjaZDIDG6ACKTZr9Yw==", "bin": { "cronstrue": "bin/cli.js" } @@ -6395,6 +6634,30 @@ "node": ">=4" } }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, "node_modules/cuint": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", @@ -6410,6 +6673,20 @@ "node": ">= 6" } }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -6435,6 +6712,12 @@ "node": ">=0.10.0" } }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -6562,6 +6845,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -6586,18 +6883,59 @@ "node": ">= 6" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/degenerator/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, "engines": { - "node": ">=0.4.0" + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "node_modules/degenerator/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/degenerator/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "devOptional": true }, @@ -6605,7 +6943,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "devOptional": true, + "dev": true, "engines": { "node": ">= 0.8" } @@ -6668,9 +7006,9 @@ "dev": true }, "node_modules/dns-packet": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", - "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" @@ -6725,6 +7063,27 @@ } ] }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", @@ -6817,9 +7176,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.485", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.485.tgz", - "integrity": "sha512-1ndQ5IBNEnFirPwvyud69GHL+31FkE09gH/CJ6m3KCbkx3i0EVOrjwz4UNxRmN9H8OVHbC6vMRZGN1yCvjSs9w==", + "version": "1.4.563", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.563.tgz", + "integrity": "sha512-dg5gj5qOgfZNkPNeyKBZQAQitIQ/xwfIDmEQJHCbXaD9ebTZxwJXUsDYcBlAvZGZLi+/354l35J1wkmP6CqYaw==", "dev": true }, "node_modules/elementtree": { @@ -6951,9 +7310,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", + "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", "dev": true }, "node_modules/es6-promise": { @@ -6962,9 +7321,9 @@ "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, "node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", + "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", "dev": true, "hasInstallScript": true, "bin": { @@ -6974,34 +7333,34 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" + "@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" } }, "node_modules/esbuild-wasm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.19.tgz", - "integrity": "sha512-X9UQEMJMZXwlGCfqcBmJ1jEa+KrLfd+gCBypO/TSzo5hZvbVwFqpxj1YCuX54ptTF75wxmrgorR4RL40AKtLVg==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz", + "integrity": "sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==", "dev": true, "bin": { "esbuild": "bin/esbuild" @@ -7035,22 +7394,21 @@ } }, "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, "dependencies": { "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "estraverse": "^5.2.0", + "esutils": "^2.0.2" }, "bin": { "escodegen": "bin/escodegen.js", "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">=4.0" + "node": ">=6.0" }, "optionalDependencies": { "source-map": "~0.6.1" @@ -7079,6 +7437,15 @@ "node": ">=8.0.0" } }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -7104,7 +7471,7 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", @@ -7113,15 +7480,6 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", @@ -7153,9 +7511,9 @@ "dev": true }, "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true }, "node_modules/events": { @@ -7294,9 +7652,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "devOptional": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -7423,20 +7781,19 @@ "dev": true }, "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dev": true, "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/find-up": { @@ -7467,9 +7824,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "dev": true, "funding": [ { @@ -7548,16 +7905,16 @@ } }, "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, "engines": { "node": "*" }, "funding": { "type": "patreon", - "url": "https://www.patreon.com/infusion" + "url": "https://github.com/sponsors/rawify" } }, "node_modules/fresh": { @@ -7585,21 +7942,21 @@ } }, "node_modules/fs-minipass": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz", - "integrity": "sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "devOptional": true, "dependencies": { - "minipass": "^5.0.0" + "minipass": "^7.0.3" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/fs-monkey": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", - "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", "dev": true }, "node_modules/fs.realpath": { @@ -7609,9 +7966,9 @@ "devOptional": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -7660,10 +8017,13 @@ "dev": true }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "devOptional": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "devOptional": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/fuse.js": { "version": "6.6.2", @@ -7710,15 +8070,15 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7762,15 +8122,6 @@ "node": ">= 6" } }, - "node_modules/get-uri/node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/get-uri/node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -7804,19 +8155,19 @@ } }, "node_modules/glob": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", - "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "devOptional": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", + "jackspeak": "^2.3.5", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", "path-scurry": "^1.10.1" }, "bin": { - "glob": "dist/cjs/src/bin.js" + "glob": "dist/esm/bin.mjs" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -7843,6 +8194,30 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "devOptional": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "devOptional": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -7871,20 +8246,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby/node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, "dependencies": { - "@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" + "get-intrinsic": "^1.1.3" }, - "engines": { - "node": ">=8.6.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/graceful-fs": { @@ -7893,6 +8264,18 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "devOptional": true }, + "node_modules/guess-parser": { + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz", + "integrity": "sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==", + "dev": true, + "dependencies": { + "@wessberg/ts-evaluator": "0.0.27" + }, + "peerDependencies": { + "typescript": ">=3.7.5" + } + }, "node_modules/gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -7914,18 +8297,6 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "devOptional": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -7935,6 +8306,18 @@ "node": ">=4" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", @@ -7978,6 +8361,18 @@ "node": ">=4" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "devOptional": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hdr-histogram-js": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", @@ -8073,6 +8468,18 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/html-entities": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", @@ -8169,12 +8576,12 @@ } }, "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "devOptional": true, + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, "dependencies": { - "@tootallnate/once": "2", + "@tootallnate/once": "1", "agent-base": "6", "debug": "4" }, @@ -8206,6 +8613,12 @@ } } }, + "node_modules/http-proxy/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -8483,6 +8896,30 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "devOptional": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "devOptional": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/image-size": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", @@ -8497,9 +8934,9 @@ } }, "node_modules/immutable": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.2.tgz", - "integrity": "sha512-oGXzbEDem9OOpDWZu88jGiYCvIsLHMvGw+8OXlpsvTFvIQplQbjg1B1cvKg8f7Hoch6+NGjpPsH1Fr+Mc2D1aA==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", "dev": true }, "node_modules/import-fresh": { @@ -8731,12 +9168,12 @@ } }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "devOptional": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8828,17 +9265,20 @@ } }, "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, "engines": { "node": ">=0.10.0" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, "node_modules/is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", @@ -8951,9 +9391,9 @@ } }, "node_modules/jackspeak": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.2.tgz", - "integrity": "sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "devOptional": true, "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -9007,18 +9447,18 @@ } }, "node_modules/jiti": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", - "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", + "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", "dev": true, "bin": { "jiti": "bin/jiti.js" } }, "node_modules/jose": { - "version": "4.14.4", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", - "integrity": "sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==", + "version": "4.15.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.4.tgz", + "integrity": "sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==", "funding": { "url": "https://github.com/sponsors/panva" } @@ -9040,6 +9480,52 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "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" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -9129,13 +9615,13 @@ } }, "node_modules/launch-editor": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", - "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", "dev": true, "dependencies": { "picocolors": "^1.0.0", - "shell-quote": "^1.7.3" + "shell-quote": "^1.8.1" } }, "node_modules/leek": { @@ -9210,30 +9696,6 @@ "webpack": "^5.0.0" } }, - "node_modules/less/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "optional": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/less/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "optional": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/less/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -9290,39 +9752,36 @@ "dev": true }, "node_modules/lint-staged": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.3.tgz", - "integrity": "sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.3.0.tgz", + "integrity": "sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==", "dev": true, "dependencies": { - "chalk": "5.2.0", - "cli-truncate": "^3.1.0", - "commander": "^10.0.0", - "debug": "^4.3.4", - "execa": "^7.0.0", + "chalk": "5.3.0", + "commander": "11.0.0", + "debug": "4.3.4", + "execa": "7.2.0", "lilconfig": "2.1.0", - "listr2": "^5.0.7", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.3", - "pidtree": "^0.6.0", - "string-argv": "^0.3.1", - "yaml": "^2.2.2" + "listr2": "6.6.1", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.1" }, "bin": { "lint-staged": "bin/lint-staged.js" }, "engines": { - "node": "^14.13.1 || >=16.0.0" + "node": "^16.14.0 || >=18.0.0" }, "funding": { "url": "https://opencollective.com/lint-staged" } }, "node_modules/lint-staged/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -9331,23 +9790,30 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/lint-staged/node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, "node_modules/listr2": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", - "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", + "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", "dev": true, "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.19", - "log-update": "^4.0.0", - "p-map": "^4.0.0", + "cli-truncate": "^3.1.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^5.0.1", "rfdc": "^1.3.0", - "rxjs": "^7.8.0", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" + "wrap-ansi": "^8.1.0" }, "engines": { - "node": "^14.13.1 || >=16.0.0" + "node": ">=16.0.0" }, "peerDependencies": { "enquirer": ">= 2.3.0 < 3" @@ -9358,67 +9824,83 @@ } } }, - "node_modules/listr2/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/listr2/node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "node_modules/listr2/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/listr2/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/listr2/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/listr2/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/listr2/node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/loader-runner": { @@ -9517,6 +9999,24 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, + "node_modules/lodash.escape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", + "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==", + "dev": true + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true + }, + "node_modules/lodash.invokemap": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz", + "integrity": "sha512-CfkycNtMqgUlfjfdh2BhKO/ZXrP8ePOX5lEU/g0R3ItJcnuxWDwokMGKx1hWcfOikmyOVx6X9IwWnDGlgKl61w==", + "dev": true + }, "node_modules/lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", @@ -9540,12 +10040,24 @@ "lodash.isarray": "^3.0.0" } }, + "node_modules/lodash.pullall": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.pullall/-/lodash.pullall-4.2.0.tgz", + "integrity": "sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg==", + "dev": true + }, "node_modules/lodash.restparam": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==", "dev": true }, + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", + "dev": true + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -9626,97 +10138,113 @@ } }, "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", "dev": true, "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "type-fest": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/log-update/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/log-update/node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + "node_modules/log-update/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, - "dependencies": { - "yallist": "^3.0.2" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/luxon": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", - "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==", + "node_modules/log-update/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/macos-release": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", - "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", + "node_modules/log-update/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, "engines": { "node": ">=6" }, @@ -9724,39 +10252,166 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/magic-string": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", - "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "node_modules/log-update/node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/log-update/node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/log-update/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/luxon": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", + "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/macos-release": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", + "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true, "bin": { - "semver": "bin/semver.js" + "semver": "bin/semver" } }, "node_modules/make-error": { @@ -9791,6 +10446,61 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "devOptional": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/make-fetch-happen/node_modules/cacache": { + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", + "devOptional": true, + "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" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/cacache/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "devOptional": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "devOptional": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/make-fetch-happen/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -9800,6 +10510,15 @@ "node": ">=12" } }, + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/marked": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", @@ -9956,18 +10675,15 @@ "dev": true }, "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", "devOptional": true, "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "*" } }, "node_modules/minimist": { @@ -9980,12 +10696,12 @@ } }, "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "devOptional": true, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/minipass-collect": { @@ -10019,12 +10735,12 @@ "devOptional": true }, "node_modules/minipass-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", - "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "devOptional": true, "dependencies": { - "minipass": "^5.0.0", + "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, @@ -10248,28 +10964,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/multimatch/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "optional": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/multimatch/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "optional": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/mustache": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", @@ -10344,9 +11038,9 @@ } }, "node_modules/needle/node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", "dev": true, "optional": true }, @@ -10390,38 +11084,16 @@ "@angular-devkit/schematics": ">=11.0.0" } }, - "node_modules/ng-morph/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "optional": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/ng-morph/node_modules/jsonc-parser": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", "optional": true }, - "node_modules/ng-morph/node_modules/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", - "optional": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/ng-packagr": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-16.1.0.tgz", - "integrity": "sha512-NbgzDRtRiYJi98Ssky7U5GoicZz7VkR3OW5qd9q3dt3H/JNqLh2PwB745NFG2cT00lEvfrY6LJ1NAcOjoWDibA==", + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-16.2.3.tgz", + "integrity": "sha512-VTJ7Qtge52+1subkhmF5nOqLNbVutA8/igJ0A5vH6Mgpb8Z/3HeZomtD1SHzZF5Dqp+p+QPHE548FWYu1MdMSQ==", "dev": true, "dependencies": { "@rollup/plugin-json": "^6.0.0", @@ -10430,19 +11102,19 @@ "ansi-colors": "^4.1.3", "autoprefixer": "^10.4.12", "browserslist": "^4.21.4", - "cacache": "^17.0.0", + "cacache": "^18.0.0", "chokidar": "^3.5.3", - "commander": "^10.0.0", + "commander": "^11.0.0", "convert-source-map": "^2.0.0", "dependency-graph": "^0.11.0", - "esbuild-wasm": "^0.17.0", + "esbuild-wasm": "^0.19.0", "fast-glob": "^3.2.12", "find-cache-dir": "^3.3.2", "injection-js": "^2.4.0", "jsonc-parser": "^3.2.0", "less": "^4.1.3", "ora": "^5.1.0", - "piscina": "^3.2.0", + "piscina": "^4.0.0", "postcss": "^8.4.16", "postcss-url": "^10.1.3", "rollup": "^3.0.0", @@ -10453,28 +11125,483 @@ "ng-packagr": "cli/main.js" }, "engines": { - "node": "^16.14.0 || >=18.10.0" - }, - "optionalDependencies": { - "esbuild": "^0.17.0" + "node": "^16.14.0 || >=18.10.0" + }, + "optionalDependencies": { + "esbuild": "^0.19.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^16.0.0 || ^16.2.0-next.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "tslib": "^2.3.0", + "typescript": ">=4.9.3 <5.2" + }, + "peerDependenciesMeta": { + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/ng-packagr/node_modules/@esbuild/android-arm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz", + "integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/@esbuild/android-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz", + "integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/@esbuild/android-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz", + "integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz", + "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/@esbuild/darwin-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz", + "integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz", + "integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz", + "integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/@esbuild/linux-arm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz", + "integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/@esbuild/linux-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz", + "integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/@esbuild/linux-ia32": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz", + "integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/@esbuild/linux-loong64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz", + "integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz", + "integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz", + "integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz", + "integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/@esbuild/linux-s390x": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz", + "integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/@esbuild/linux-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz", + "integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz", + "integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz", + "integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/@esbuild/sunos-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz", + "integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/@esbuild/win32-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz", + "integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/@esbuild/win32-ia32": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz", + "integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/@esbuild/win32-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz", + "integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/ng-packagr/node_modules/esbuild": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz", + "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.5", + "@esbuild/android-arm64": "0.19.5", + "@esbuild/android-x64": "0.19.5", + "@esbuild/darwin-arm64": "0.19.5", + "@esbuild/darwin-x64": "0.19.5", + "@esbuild/freebsd-arm64": "0.19.5", + "@esbuild/freebsd-x64": "0.19.5", + "@esbuild/linux-arm": "0.19.5", + "@esbuild/linux-arm64": "0.19.5", + "@esbuild/linux-ia32": "0.19.5", + "@esbuild/linux-loong64": "0.19.5", + "@esbuild/linux-mips64el": "0.19.5", + "@esbuild/linux-ppc64": "0.19.5", + "@esbuild/linux-riscv64": "0.19.5", + "@esbuild/linux-s390x": "0.19.5", + "@esbuild/linux-x64": "0.19.5", + "@esbuild/netbsd-x64": "0.19.5", + "@esbuild/openbsd-x64": "0.19.5", + "@esbuild/sunos-x64": "0.19.5", + "@esbuild/win32-arm64": "0.19.5", + "@esbuild/win32-ia32": "0.19.5", + "@esbuild/win32-x64": "0.19.5" + } + }, + "node_modules/ng-packagr/node_modules/esbuild-wasm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.19.5.tgz", + "integrity": "sha512-7zmLLn2QCj93XfMmHtzrDJ1UBuOHB2CZz1ghoCEZiRajxjUvHsF40PnbzFIY/pmesqPRaEtEWii0uzsTbnAgrA==", + "dev": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ng-packagr/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/ng-packagr/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" }, - "peerDependencies": { - "@angular/compiler-cli": "^16.0.0 || ^16.1.0-next.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "tslib": "^2.3.0", - "typescript": ">=4.9.3 <5.2" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ng-packagr/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" }, - "peerDependenciesMeta": { - "tailwindcss": { - "optional": true - } + "engines": { + "node": ">=8" } }, - "node_modules/ng-packagr/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "node_modules/ng-packagr/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, "node_modules/ng-qrcode": { "version": "16.0.0", @@ -10512,9 +11639,9 @@ "optional": true }, "node_modules/node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -10530,6 +11657,25 @@ } } }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -10564,9 +11710,9 @@ } }, "node_modules/node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", + "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", "dev": true, "optional": true, "bin": { @@ -10575,16 +11721,6 @@ "node-gyp-build-test": "build-test.js" } }, - "node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/node-gyp/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -10703,9 +11839,13 @@ } }, "node_modules/node-jose/node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } @@ -10777,9 +11917,9 @@ } }, "node_modules/npm-install-checks": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.1.1.tgz", - "integrity": "sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", "devOptional": true, "dependencies": { "semver": "^7.1.1" @@ -10857,6 +11997,15 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/npm-registry-fetch/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/npm-run-path": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", @@ -10911,15 +12060,30 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "dev": true + }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-path": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", + "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", + "dev": true, + "engines": { + "node": ">= 10.12.0" + } + }, "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -11224,29 +12388,6 @@ "node": ">= 8" } }, - "node_modules/pac-proxy-agent/node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", @@ -11313,6 +12454,56 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/pacote/node_modules/cacache": { + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", + "devOptional": true, + "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" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/pacote/node_modules/cacache/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "devOptional": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/pacote/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "devOptional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/pacote/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/pako": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", @@ -11361,7 +12552,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "optional": true + "devOptional": true }, "node_modules/parse5-html-rewriting-stream": { "version": "7.0.0", @@ -11499,9 +12690,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", - "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", "devOptional": true, "engines": { "node": "14 || >=16.14" @@ -11547,7 +12738,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "devOptional": true, "engines": { "node": ">=8.6" }, @@ -11578,9 +12768,9 @@ } }, "node_modules/piscina": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", - "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.0.0.tgz", + "integrity": "sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==", "dev": true, "dependencies": { "eventemitter-asyncresource": "^1.0.0", @@ -11592,15 +12782,100 @@ } }, "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "dev": true, "dependencies": { - "find-up": "^4.0.0" + "find-up": "^6.3.0" }, "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pkg-dir/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/please-upgrade-node": { @@ -11621,9 +12896,9 @@ } }, "node_modules/postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "funding": [ { @@ -11649,14 +12924,13 @@ } }, "node_modules/postcss-loader": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.2.tgz", - "integrity": "sha512-c7qDlXErX6n0VT+LUsW+nwefVtTu3ORtVvK8EXuUIDcxo+b/euYqpuHlJAvePb0Af5e8uMjR/13e0lTuYifaig==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", + "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", "dev": true, "dependencies": { - "cosmiconfig": "^8.1.3", + "cosmiconfig": "^8.2.0", "jiti": "^1.18.2", - "klona": "^2.0.6", "semver": "^7.3.8" }, "engines": { @@ -11672,14 +12946,14 @@ } }, "node_modules/postcss-loader/node_modules/cosmiconfig": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", - "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "dependencies": { - "import-fresh": "^3.2.1", + "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", + "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "engines": { @@ -11687,6 +12961,14 @@ }, "funding": { "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/postcss-modules-extract-imports": { @@ -11779,14 +13061,19 @@ "postcss": "^8.0.0" } }, - "node_modules/postcss-url/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/postcss-url/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/postcss-url/node_modules/mime": { @@ -11801,16 +13088,13 @@ "node": ">=4.0.0" } }, - "node_modules/postcss-url/node_modules/minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "node_modules/postcss-url/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "bin": { + "semver": "bin/semver.js" } }, "node_modules/postcss-value-parser": { @@ -11938,29 +13222,6 @@ "node": ">= 8" } }, - "node_modules/proxy-agent/node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/proxy-agent/node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/proxy-agent/node_modules/socks-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", @@ -11988,6 +13249,12 @@ "dev": true, "optional": true }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -12129,6 +13396,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -12349,9 +13622,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -12367,9 +13640,9 @@ "dev": true }, "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" @@ -12585,16 +13858,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/rimraf/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -12637,9 +13900,9 @@ } }, "node_modules/rollup": { - "version": "3.27.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.27.2.tgz", - "integrity": "sha512-YGwmHf7h2oUHkVBT248x0yt6vZkYQ3/rvE5iQuVBh3WO8GcJ6BNeOkpoX1yMHIiBm18EMLjBPIoUDkhgnyxGOQ==", + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -12727,9 +13990,9 @@ "devOptional": true }, "node_modules/sass": { - "version": "1.63.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.63.2.tgz", - "integrity": "sha512-u56TU0AIFqMtauKl/OJ1AeFsXqRHkgO7nCWmHaDwfxDo9GUMSqBA4NEh6GMuh1CYVM7zuROYtZrHzPc2ixK+ww==", + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", + "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -12744,12 +14007,11 @@ } }, "node_modules/sass-loader": { - "version": "13.3.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.1.tgz", - "integrity": "sha512-cBTxmgyVA1nXPvIK4brjJMXOMJ2v2YrQEuHqLw3LylGb3gsR6jAvdjHMcy/+JGTmmIF9SauTrLLR7bsWDMWqgg==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", + "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", "dev": true, "dependencies": { - "klona": "^2.0.6", "neo-async": "^2.6.2" }, "engines": { @@ -12787,6 +14049,18 @@ "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", "dev": true }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/schema-utils": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", @@ -12825,9 +14099,9 @@ } }, "node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "devOptional": true, "dependencies": { "lru-cache": "^6.0.0" @@ -13027,6 +14301,21 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -13107,13 +14396,14 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/sigstore": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.8.0.tgz", - "integrity": "sha512-ogU8qtQ3VFBawRJ8wjsBEX/vIFeHuGs1fm4jZtjWQwjo8pfAt7T/rh+udlAN4+QUe0IzA8qRSc/YZ7dHP6kh+w==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", + "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", "devOptional": true, "dependencies": { - "@sigstore/bundle": "^1.0.0", + "@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" }, @@ -13125,14 +14415,14 @@ } }, "node_modules/sirv": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", - "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", + "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", "dev": true, "dependencies": { "@polka/url": "^1.0.0-next.20", "mrmime": "^1.0.0", - "totalist": "^1.0.0" + "totalist": "^3.0.0" }, "engines": { "node": ">= 10" @@ -13345,9 +14635,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", "devOptional": true }, "node_modules/spdy": { @@ -13407,12 +14697,12 @@ "integrity": "sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ==" }, "node_modules/ssri": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", - "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", "devOptional": true, "dependencies": { - "minipass": "^5.0.0" + "minipass": "^7.0.3" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -13655,6 +14945,12 @@ "node": ">=0.10" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -13665,9 +14961,9 @@ } }, "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "devOptional": true, "dependencies": { "chownr": "^2.0.0", @@ -13705,6 +15001,15 @@ "node": ">=8" } }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -13712,9 +15017,9 @@ "devOptional": true }, "node_modules/terser": { - "version": "5.17.7", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.7.tgz", - "integrity": "sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==", + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -13832,16 +15137,6 @@ "node": ">=8" } }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/test-exclude/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -13940,18 +15235,49 @@ } }, "node_modules/totalist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, "engines": { "node": ">=6" } }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } }, "node_modules/tree-kill": { "version": "1.2.2", @@ -14020,6 +15346,15 @@ } } }, + "node_modules/ts-node/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -14065,16 +15400,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/tslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/tslint/node_modules/builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", @@ -14351,9 +15676,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -14388,6 +15713,16 @@ "punycode": "^2.1.0" } }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -14448,14 +15783,14 @@ } }, "node_modules/vite": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", - "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.7.tgz", + "integrity": "sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw==", "dev": true, "dependencies": { - "esbuild": "^0.17.5", - "postcss": "^8.4.23", - "rollup": "^3.21.0" + "esbuild": "^0.18.10", + "postcss": "^8.4.26", + "rollup": "^3.25.2" }, "bin": { "vite": "bin/vite.js" @@ -14463,12 +15798,16 @@ "engines": { "node": "^14.18.0 || >=16.0.0" }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@types/node": ">= 14", "less": "*", + "lightningcss": "^1.21.0", "sass": "*", "stylus": "*", "sugarss": "*", @@ -14481,6 +15820,9 @@ "less": { "optional": true }, + "lightningcss": { + "optional": true + }, "sass": { "optional": true }, @@ -14512,6 +15854,37 @@ "node": ">=6.0" } }, + "node_modules/vm2/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -14543,14 +15916,18 @@ } }, "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } }, "node_modules/webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", "dev": true, "peer": true, "dependencies": { @@ -14596,20 +15973,27 @@ } }, "node_modules/webpack-bundle-analyzer": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.0.tgz", - "integrity": "sha512-+bXGmO1LyiNx0i9enBu3H8mv42sj/BJWhZNFwjz92tVnBa9J3JMGo2an2IXlEleoDOPn/Hofl5hr/xCpObUDtw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.1.tgz", + "integrity": "sha512-jnd6EoYrf9yMxCyYDPj8eutJvtjQNp8PHmni/e/ulydHBWhT5J3menXt3HEkScsu9YqMAcG4CfFjs3rj5pVU1w==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "0.5.7", "acorn": "^8.0.4", "acorn-walk": "^8.0.0", - "chalk": "^4.1.0", "commander": "^7.2.0", + "escape-string-regexp": "^4.0.0", "gzip-size": "^6.0.0", - "lodash": "^4.17.20", + "is-plain-object": "^5.0.0", + "lodash.debounce": "^4.0.8", + "lodash.escape": "^4.0.1", + "lodash.flatten": "^4.4.0", + "lodash.invokemap": "^4.6.0", + "lodash.pullall": "^4.2.0", + "lodash.uniqby": "^4.7.0", "opener": "^1.5.2", - "sirv": "^1.0.7", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", "ws": "^7.3.1" }, "bin": { @@ -14619,55 +16003,15 @@ "node": ">= 10.13.0" } }, - "node_modules/webpack-bundle-analyzer/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">=0.4.0" } }, - "node_modules/webpack-bundle-analyzer/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/webpack-bundle-analyzer/node_modules/commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", @@ -14677,25 +16021,16 @@ "node": ">= 10" } }, - "node_modules/webpack-bundle-analyzer/node_modules/has-flag": { + "node_modules/webpack-bundle-analyzer/node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" + "node": ">=10" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/webpack-dev-middleware": { @@ -14727,9 +16062,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz", - "integrity": "sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ==", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -14738,7 +16073,7 @@ "@types/serve-index": "^1.9.1", "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", + "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", @@ -14809,9 +16144,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", "dev": true, "engines": { "node": ">=10.0.0" @@ -14873,9 +16208,9 @@ } }, "node_modules/webpack/node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.3.tgz", + "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==", "dev": true, "peer": true }, @@ -14955,18 +16290,38 @@ "node": ">=0.8.0" } }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, "node_modules/whatwg-fetch": { - "version": "3.6.17", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.17.tgz", - "integrity": "sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==" + "version": "3.6.19", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", + "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==" + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true }, "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/which": { @@ -15281,6 +16636,18 @@ } } }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, "node_modules/xregexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", @@ -15315,9 +16682,9 @@ "dev": true }, "node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", + "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", "engines": { "node": ">= 14" } @@ -15371,9 +16738,9 @@ } }, "node_modules/zone.js": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.1.tgz", - "integrity": "sha512-+bIeDAFEBYuXRuU3qGQvzdPap+N1zjM4KkBAiiQuVVCrHrhjDuY6VkUhNa5+U27+9w0q3fbKiMCbpJ0XzMmSWA==", + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.3.tgz", + "integrity": "sha512-MKPbmZie6fASC/ps4dkmIhaT5eonHkEt6eAy80K42tAm0G2W+AahLJjbfi6X9NPdciOE9GRFTTM8u2IiF6O3ww==", "dependencies": { "tslib": "^2.3.0" } diff --git a/frontend/package.json b/frontend/package.json index 4e17618ee..d3f6d2edb 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -44,13 +44,13 @@ "@materia-ui/ngx-monaco-editor": "^6.0.0", "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", - "@taiga-ui/addon-charts": "3.47.0", - "@taiga-ui/cdk": "3.47.0", - "@taiga-ui/core": "3.47.0", - "@taiga-ui/experimental": "3.47.0", - "@taiga-ui/icons": "3.47.0", - "@taiga-ui/kit": "3.47.0", - "@taiga-ui/styles": "3.47.0", + "@taiga-ui/addon-charts": "3.49.1", + "@taiga-ui/cdk": "3.49.1", + "@taiga-ui/core": "3.49.1", + "@taiga-ui/experimental": "3.491.1-canary.5e01f6f\n", + "@taiga-ui/icons": "3.49.1", + "@taiga-ui/kit": "3.49.1", + "@taiga-ui/styles": "3.49.1", "@tinkoff/ng-dompurify": "4.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", diff --git a/frontend/projects/ui/src/app/app.providers.ts b/frontend/projects/ui/src/app/app.providers.ts index 9bcbfbb0f..eb4515ad7 100644 --- a/frontend/projects/ui/src/app/app.providers.ts +++ b/frontend/projects/ui/src/app/app.providers.ts @@ -24,6 +24,7 @@ import { ThemeSwitcherService } from './services/theme-switcher.service' import { DateTransformerService } from './services/date-transformer.service' import { DatetimeTransformerService } from './services/datetime-transformer.service' import { MarketplaceService } from './services/marketplace.service' +import { RoutingStrategyService } from './apps/portal/services/routing-strategy.service' const { useMocks, @@ -79,6 +80,10 @@ export const APP_PROVIDERS: Provider[] = [ provide: AbstractMarketplaceService, useClass: MarketplaceService, }, + { + provide: RouteReuseStrategy, + useExisting: RoutingStrategyService, + }, ] export function appInitializer( diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html index fae74942f..d6da51049 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html +++ b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html @@ -1,8 +1,8 @@ - + {{ badge }} - +
-
-

Upcoming Jobs

+

Upcoming Jobs

+
-
+
`, host: { class: 'g-page' }, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, - imports: [CommonModule, TuiSvgModule, BackupsUpcomingComponent], + imports: [ + CommonModule, + TuiSvgModule, + TuiFadeModule, + BackupsUpcomingComponent, + ], }) export class BackupsComponent { private readonly dialogs = inject(TuiDialogService) @@ -64,7 +70,9 @@ export class BackupsComponent { icon: 'tuiIconDatabaseLarge', description: 'Manage backup targets', action: () => - this.dialogs.open(TARGETS, { label: 'Backup Targets' }).subscribe(), + this.dialogs + .open(TARGETS, { label: 'Backup Targets', size: 'l' }) + .subscribe(), }, { name: 'History', diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/history.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/history.component.ts index ea5330fe3..b2a7e677b 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/history.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/history.component.ts @@ -14,6 +14,7 @@ import { TuiLinkModule, TuiSvgModule, } from '@taiga-ui/core' +import { TuiFadeModule } from '@taiga-ui/experimental' import { TuiCheckboxModule } from '@taiga-ui/kit' import { BehaviorSubject } from 'rxjs' import { BackupRun } from 'src/app/services/api/api.types' @@ -38,68 +39,70 @@ import { REPORT } from './report.component' Delete Selected - - - - - - - - - - - - - - - - - + + + + + + + +
- - Started AtDurationResultJobTarget
{{ run['started-at'] | date : 'medium' }} - {{ run['started-at'] | duration : run['completed-at'] }} Minutes - - - +
+ + + + + + + + + + + + + + + + + - - - - - - + + + + + + + - - - - - -
+ + Started AtDurationResultJobTarget
{{ run['started-at'] | date : 'medium' }} + {{ run['started-at'] | duration : run['completed-at'] }} Minutes + - - - {{ run.job.name || 'No job' }} - - {{ run.job.target.name }} -
Loading
{{ run.job.name || 'No job' }} + + {{ run.job.target.name }} +
No backups have been run yet.
+ +
Loading
No backups have been run yet.
+
`, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, @@ -111,6 +114,7 @@ import { REPORT } from './report.component' TuiCheckboxModule, TuiSvgModule, TuiLinkModule, + TuiFadeModule, DurationPipe, HasErrorPipe, GetBackupIconPipe, diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/jobs.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/jobs.component.ts index 132afaf71..ffec3a653 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/jobs.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/jobs.component.ts @@ -9,6 +9,7 @@ import { TuiNotificationModule, TuiSvgModule, } from '@taiga-ui/core' +import { TuiFadeModule } from '@taiga-ui/experimental' import { TUI_PROMPT, TuiPromptData } from '@taiga-ui/kit' import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' import { BehaviorSubject, filter } from 'rxjs' @@ -39,52 +40,54 @@ import { EDIT } from './edit.component' Create New Job - - - - - - - - - - - - - - - - - - - - - +
+
NameTargetPackagesSchedule
{{ job.name }} - - {{ job.target.name }} - Packages: {{ job['package-ids'].length }}{{ (job.cron | toHumanCron).message }} - - -
Loading
+ + + + + + + - - - - - -
NameTargetPackagesSchedule
No jobs found.
+ + + + {{ job.name }} + + + {{ job.target.name }} + + Packages: {{ job['package-ids'].length }} + {{ (job.cron | toHumanCron).message }} + + + + + + + +
Loading
+ +
+ + No jobs found. + + + + `, standalone: true, imports: [ @@ -93,6 +96,7 @@ import { EDIT } from './edit.component' TuiNotificationModule, TuiButtonModule, TuiSvgModule, + TuiFadeModule, ToHumanCronPipe, GetBackupIconPipe, ], diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/target.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/target.component.ts index 18b23060a..ff9cb8b62 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/target.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/target.component.ts @@ -107,8 +107,10 @@ export class BackupsTargetModal { } goToTargets() { - this.dialogs.open(TARGETS, { label: 'Backup Targets' }).subscribe() this.context.$implicit.complete() + this.dialogs + .open(TARGETS, { label: 'Backup Targets', size: 'l' }) + .subscribe() } } diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts index 9231c4183..737e1d9c8 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts @@ -37,6 +37,7 @@ import { ApiService } from 'src/app/services/api/embassy-api.service' import { BackupConfig } from '../types/backup-config' import { BackupsPhysicalComponent } from '../components/physical.component' import { BackupsTargetsComponent } from '../components/targets.component' +import { TuiFadeModule } from '@taiga-ui/experimental' @Component({ template: ` @@ -60,23 +61,27 @@ import { BackupsTargetsComponent } from '../components/targets.component' Refresh -
+
+
+

Saved Targets

-
+
+
+
`, standalone: true, imports: [ @@ -85,6 +90,7 @@ import { BackupsTargetsComponent } from '../components/targets.component' TuiButtonModule, BackupsPhysicalComponent, BackupsTargetsComponent, + TuiFadeModule, ], }) export class BackupsTargetsModal implements OnInit { @@ -103,6 +109,7 @@ export class BackupsTargetsModal implements OnInit { async refresh() { this.loading$.next(true) + this.targets = undefined try { this.targets = await this.api.getBackupTargets({}) diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts index 8eba526db..007e4e473 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts @@ -46,7 +46,7 @@ import { InstallProgressPipe } from '../pipes/install-progress.pipe'
-
+
{{ pkg.manifest.title }}
diff --git a/frontend/projects/ui/src/app/apps/portal/services/navigation.service.ts b/frontend/projects/ui/src/app/apps/portal/services/navigation.service.ts index 8ff3f429c..57b7b1d8a 100644 --- a/frontend/projects/ui/src/app/apps/portal/services/navigation.service.ts +++ b/frontend/projects/ui/src/app/apps/portal/services/navigation.service.ts @@ -6,7 +6,7 @@ import { NavigationItem } from '../types/navigation-item' providedIn: 'root', }) export class NavigationService { - readonly tabs = new BehaviorSubject([]) + private readonly tabs = new BehaviorSubject([]) getTabs(): Observable { return this.tabs @@ -21,4 +21,8 @@ export class NavigationService { this.tabs.next([...this.tabs.value, tab]) } } + + hasTab(path: string): boolean { + return this.tabs.value.some(t => t.routerLink === path) + } } diff --git a/frontend/projects/ui/src/app/apps/portal/services/routing-strategy.service.ts b/frontend/projects/ui/src/app/apps/portal/services/routing-strategy.service.ts new file mode 100644 index 000000000..2d0c40e56 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/services/routing-strategy.service.ts @@ -0,0 +1,73 @@ +import { inject, Injectable } from '@angular/core' +import { + ActivatedRouteSnapshot, + BaseRouteReuseStrategy, + createUrlTreeFromSnapshot, + DetachedRouteHandle, + UrlSerializer, +} from '@angular/router' +import { NavigationService } from './navigation.service' + +@Injectable({ + providedIn: 'root', +}) +export class RoutingStrategyService extends BaseRouteReuseStrategy { + private readonly url = inject(UrlSerializer) + private readonly navigation = inject(NavigationService) + private readonly handlers = new Map() + + override shouldDetach(route: ActivatedRouteSnapshot): boolean { + const path = this.getPath(route) + const store = this.navigation.hasTab(path) + + if (!store) this.handlers.delete(path) + + return store + } + + override store( + route: ActivatedRouteSnapshot, + handle: DetachedRouteHandle, + ): void { + this.handlers.set(this.getPath(route), handle) + } + + override shouldAttach(route: ActivatedRouteSnapshot): boolean { + return !!this.handlers.get(this.getPath(route)) + } + + override retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle | null { + return this.handlers.get(this.getPath(route)) || null + } + + override shouldReuseRoute( + future: ActivatedRouteSnapshot, + curr: ActivatedRouteSnapshot, + ): boolean { + // return future.routeConfig === curr.routeConfig + // TODO: Copied from ionic for backwards compatibility, remove later + if (future.routeConfig !== curr.routeConfig) { + return false + } + + // checking router params + const futureParams = future.params + const currentParams = curr.params + const keysA = Object.keys(futureParams) + const keysB = Object.keys(currentParams) + if (keysA.length !== keysB.length) { + return false + } + // Test for A's keys different from B. + for (const key of keysA) { + if (currentParams[key] !== futureParams[key]) { + return false + } + } + return true + } + + private getPath(route: ActivatedRouteSnapshot): string { + return this.url.serialize(createUrlTreeFromSnapshot(route, ['.'])) + } +} diff --git a/frontend/projects/ui/src/styles.scss b/frontend/projects/ui/src/styles.scss index c8f13efd9..5ee831568 100644 --- a/frontend/projects/ui/src/styles.scss +++ b/frontend/projects/ui/src/styles.scss @@ -382,6 +382,7 @@ ul { .g-table { width: 100%; + min-width: 40rem; td, th { @@ -467,3 +468,8 @@ button.g-action { margin-left: auto; } } + +.g-hidden-scrollbar { + @include scrollbar-hidden; + overflow: auto !important; +} From 06207145af4e4c646e912645604ac0b436b18a4a Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Mon, 6 Nov 2023 21:05:05 +0400 Subject: [PATCH 021/169] refactor: refactor sideload page (#2475) * refactor: refactor sideload page * chore: improve ux * chore: update * chore: update --- frontend/package-lock.json | 464 ++++++++++++++---- frontend/package.json | 14 +- .../pages/show/package/package.component.html | 18 +- .../pages/show/package/package.component.scss | 3 +- .../marketplace/src/pipes/mime-type.pipe.ts | 2 + frontend/projects/shared/styles/taiga.scss | 7 + frontend/projects/ui/src/app/app.providers.ts | 2 +- .../ui/src/app/app/snek/snek.module.ts | 2 +- .../app/apps/diagnostic/home/home.module.ts | 2 +- .../components/card/card.component.html | 4 +- .../portal/components/card/card.component.ts | 2 +- .../header-menu/header-menu.component.ts | 2 +- .../components/header/header.component.html | 7 +- .../components/header/header.component.ts | 8 +- .../navigation/navigation.component.html | 2 +- .../navigation/navigation.component.ts | 3 +- .../apps/portal/constants/system-utilities.ts | 14 +- .../components/action-success.component.ts | 5 +- .../service/components/actions.component.ts | 3 +- .../components/credential.component.ts | 7 +- .../service/components/interface.component.ts | 5 +- .../routes/service/modals/config.component.ts | 2 +- .../service/modals/credentials.component.ts | 2 +- .../backups/components/physical.component.ts | 3 +- .../backups/components/targets.component.ts | 6 +- .../system/backups/modals/backup.component.ts | 2 +- .../system/backups/modals/edit.component.ts | 3 +- .../backups/modals/history.component.ts | 10 +- .../system/backups/modals/jobs.component.ts | 9 +- .../backups/modals/recover.component.ts | 7 +- .../system/backups/modals/target.component.ts | 2 +- .../backups/modals/targets.component.ts | 15 +- .../system/sideload/dependencies.component.ts | 58 +++ .../system/sideload/package.component.ts | 131 +++++ .../system/sideload/sideload.component.ts | 119 +++++ .../routes/system/sideload/sideload.utils.ts | 162 ++++++ .../portal/routes/system/system.module.ts | 7 + .../updates/components/item.component.ts | 3 +- .../portal/services/navigation.service.ts | 4 +- .../app/apps/ui/modals/form/form.module.ts | 3 +- .../ui/modals/prompt/prompt.component.html | 2 +- .../apps/ui/modals/prompt/prompt.module.ts | 3 +- .../backup-select/backup-select.module.ts | 3 +- .../recover-select/recover-select.module.ts | 3 +- .../target-select/target-select.module.ts | 2 +- .../pages/backup-jobs/backup-jobs.module.ts | 7 +- .../modals/app-config/app-config.module.ts | 2 +- .../ui/pages/system/email/email.module.ts | 3 +- .../ui/pages/system/proxies/proxies.module.ts | 2 +- .../ui/pages/system/proxies/proxies.page.html | 5 +- .../os-update/os-update.page.module.ts | 3 +- .../form/form-array/form-array.component.html | 2 +- .../form-object/form-object.component.html | 4 +- .../form/form-text/form-text.component.html | 4 +- .../ui/src/app/common/form/form.module.ts | 2 +- .../common/os-welcome/os-welcome.module.ts | 2 +- .../toast-container/toast-container.module.ts | 7 +- frontend/projects/ui/src/styles.scss | 1 + 58 files changed, 952 insertions(+), 229 deletions(-) create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/sideload/dependencies.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.utils.ts diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 763e62539..95b5fba70 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -23,13 +23,13 @@ "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc8.beta2", - "@taiga-ui/addon-charts": "3.49.1", - "@taiga-ui/cdk": "3.49.1", - "@taiga-ui/core": "3.49.1", - "@taiga-ui/experimental": "3.491.1-canary.5e01f6f\n", - "@taiga-ui/icons": "3.49.1", - "@taiga-ui/kit": "3.49.1", - "@taiga-ui/styles": "3.49.1", + "@taiga-ui/addon-charts": "3.52.0", + "@taiga-ui/cdk": "3.52.0", + "@taiga-ui/core": "3.52.0", + "@taiga-ui/experimental": "3.52.0", + "@taiga-ui/icons": "3.52.0", + "@taiga-ui/kit": "3.52.0", + "@taiga-ui/styles": "3.52.0", "@tinkoff/ng-dompurify": "4.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", @@ -3670,9 +3670,9 @@ "dev": true }, "node_modules/@maskito/angular": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-1.7.0.tgz", - "integrity": "sha512-RcBEXkuUf5zyaNQZv26LxOZ2DrILR34Ci1OWRaeI0JfHSslKdMlbQMdWXvGKga6ChGY5Sfl64AsmQ1D2kMvGlQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-1.8.1.tgz", + "integrity": "sha512-iT9/YK+lTRd8ofU1Qd2pJHofshi/QnSGXS9MBIjt8Mk034pLCYutB5ua+2kiZYMdPk7kyuaSXYZOSL/Pt5cBuA==", "dependencies": { "tslib": "2.6.2" }, @@ -3680,21 +3680,21 @@ "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@angular/forms": ">=12.0.0", - "@maskito/core": "^1.7.0", + "@maskito/core": "^1.8.1", "rxjs": ">=6.0.0" } }, "node_modules/@maskito/core": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@maskito/core/-/core-1.7.0.tgz", - "integrity": "sha512-sjdv1MSJnWWor/Qy1u1+ZZtqejzfVt6zqMUfy5RToEPZSBWlsCg1JSfjRu9WRb3yirpZnj3j80JkTGCicFrvuw==" + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@maskito/core/-/core-1.8.1.tgz", + "integrity": "sha512-h9+Z91WASHQ6z6kDP7uIHyMUPxNwA1mOIPsFxdg2MHq1RASFUNKHj66uU5xuR0OJu17qcCCzUu7ixZ43QQ/HYg==" }, "node_modules/@maskito/kit": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-1.7.0.tgz", - "integrity": "sha512-LX/ngWFnPKWnQfvU9m5fss8NIBO261DlQdXOtlbhoXgyscVoR8RVeUHRVuRKEhJgd1I+dvlP1vUxms2qltFTjw==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-1.8.1.tgz", + "integrity": "sha512-eevH2iyqRjxw8kzt7gmLETrlkPTj4Mq1mbIOOD2VQ+O33ocNFl1a87s02mRQGk6UmSJBmHLT/2EaVfUEswBmWA==", "peerDependencies": { - "@maskito/core": "^1.7.0" + "@maskito/core": "^1.8.1" } }, "node_modules/@materia-ui/ngx-monaco-editor": { @@ -3710,9 +3710,9 @@ } }, "node_modules/@ng-web-apis/common": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@ng-web-apis/common/-/common-3.0.3.tgz", - "integrity": "sha512-CJm/NYQ4JrN0qNVbPcKeRnZ5nL0zL6RrJrNwBW/LnZEGp9t0mxgLYKw52fM4xRm0OVXOXoRwCbjr8gSUD6vstQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@ng-web-apis/common/-/common-3.0.5.tgz", + "integrity": "sha512-rCaOxTKNQ0w0SFeH1Zdw+D8s2igE1QKRdVKDgAeZ7i4utQlSJWHP3de4k4lVEFM1cRiJh3Oq6QX2IOuLrgxEdw==", "dependencies": { "tslib": "^2.2.0" }, @@ -3723,9 +3723,9 @@ } }, "node_modules/@ng-web-apis/intersection-observer": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@ng-web-apis/intersection-observer/-/intersection-observer-3.1.3.tgz", - "integrity": "sha512-mGxUcPOJ/y8oXY85c9k2UnZpGElu1wgAwN66brfFNKswwCYM8GLbrIOm0Zsdb6vyJiNFgaoZ+tG+dEZPobCzGQ==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@ng-web-apis/intersection-observer/-/intersection-observer-3.1.5.tgz", + "integrity": "sha512-+79rkKa7Ce1h6qcnDxvNITIjMjnVSaHZ1TlR5y57cOWhh2kyX5bBwgBx+lTa702o27oO3HOYrS3YnJidDiiPsQ==", "dependencies": { "tslib": "^2.2.0" }, @@ -3735,9 +3735,9 @@ } }, "node_modules/@ng-web-apis/mutation-observer": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-3.0.3.tgz", - "integrity": "sha512-gl2OGn7+N8w0VuBLzGP5Ypw2nMqbnV3TgNdnQSyCC5I7+3Rz/Q3OzQqciTNUPAqd5HWWwW/IKFPvgI6ePYWXog==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-3.0.5.tgz", + "integrity": "sha512-pr8cxdNa+6VwZDAt7SWKrsuxr1yaTvbct9KG0dONl7zFLQf6n6yvpwgNTOz/PZQyReQxn8W7eHKPo4Q0aAwy/g==", "dependencies": { "tslib": "^2.2.0" }, @@ -3747,9 +3747,9 @@ } }, "node_modules/@ng-web-apis/resize-observer": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@ng-web-apis/resize-observer/-/resize-observer-3.0.3.tgz", - "integrity": "sha512-2EVqcl/HTzObQmIgtXEs2KHrPUXC8r6ePPfbAAUbuVdlDAZm6vKsXYHvH+Zkm/JKNp1MZJb/3kb6UkkZtf8ewA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@ng-web-apis/resize-observer/-/resize-observer-3.0.5.tgz", + "integrity": "sha512-nmOpNL7c+RAxsnsmF2TvSuyWGQMqCTJ7MYVzSrDdNDFVqkEX5yQGu0UC+JM/8sEBcePjqju6OkJDWOLGF7uhOQ==", "dependencies": { "tslib": "^2.2.0" }, @@ -4133,9 +4133,9 @@ } }, "node_modules/@taiga-ui/addon-charts": { - "version": "3.49.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.49.1.tgz", - "integrity": "sha512-Y2b421JSEOboB+wbLcf0uPeYWGtMtc4ZmqSF4cT8DPB8vA8QsG2HWj+JrOVjwnsryiuTieiFHE3txk1w4sjTVA==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.52.0.tgz", + "integrity": "sha512-qu2p6Uo5qMTdh1hfnEB4xLHF0vsOw2YhDcq1bcqNWmI6Su2K090P2lsd9mCNyNHWAIrejjcCqBKRwJDopVm0hw==", "dependencies": { "tslib": ">=2.0.0" }, @@ -4143,25 +4143,51 @@ "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@ng-web-apis/common": ">=3.0.0", - "@taiga-ui/cdk": ">=3.49.1", - "@taiga-ui/core": ">=3.49.1", + "@taiga-ui/cdk": ">=3.52.0", + "@taiga-ui/core": ">=3.52.0", "@tinkoff/ng-polymorpheus": ">=4.0.0" } }, - "node_modules/@taiga-ui/cdk": { - "version": "3.49.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.49.1.tgz", - "integrity": "sha512-Mo+o/ey7WJYvXh/4hQiUca0VRVmGtEn13PMWY+wAE+243F8KeoMca/CGpzV3DhpK3WTUbFyURvmNV0pR78Qmzw==", + "node_modules/@taiga-ui/addon-commerce": { + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-commerce/-/addon-commerce-3.52.0.tgz", + "integrity": "sha512-4oRmYhTsaN34L37MpwLder8eF3/WgsP/36qQWxsyhKCRN+H/ltpw7Yp16JO0Tg+nkj0ErtGOzZ4vZMl4+xJnAA==", + "peer": true, "dependencies": { - "@ng-web-apis/common": "3.0.3", - "@ng-web-apis/mutation-observer": "3.0.3", - "@ng-web-apis/resize-observer": "3.0.3", + "tslib": ">=2.0.0" + }, + "peerDependencies": { + "@angular/common": ">=12.0.0", + "@angular/core": ">=12.0.0", + "@angular/forms": ">=12.0.0", + "@maskito/angular": ">=1.3.0", + "@maskito/core": ">=1.3.0", + "@maskito/kit": ">=1.3.0", + "@ng-web-apis/common": ">=3.0.0", + "@taiga-ui/cdk": ">=3.52.0", + "@taiga-ui/core": ">=3.52.0", + "@taiga-ui/i18n": ">=3.52.0", + "@taiga-ui/kit": ">=3.52.0", + "@tinkoff/ng-polymorpheus": ">=4.0.0", + "rxjs": ">=6.0.0" + } + }, + "node_modules/@taiga-ui/cdk": { + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.52.0.tgz", + "integrity": "sha512-fZ9HGUu1rpJXf9yq8SH0K5qLugErtaoCQErGd0Waa6zEV9jb0bm4XoCwSAUKTAUutJ1iQCzj34F5oDoDTG2ydA==", + "dependencies": { + "@angular-devkit/schematics": "12.2.18", + "@ng-web-apis/common": "3.0.5", + "@ng-web-apis/mutation-observer": "3.0.5", + "@ng-web-apis/resize-observer": "3.0.5", + "@schematics/angular": "12.2.18", "@tinkoff/ng-event-plugins": "3.1.0", "@tinkoff/ng-polymorpheus": "4.2.0", "tslib": "2.6.2" }, "optionalDependencies": { - "ng-morph": "2.2.5", + "ng-morph": "4.0.0", "parse5": "6.0.1" }, "peerDependencies": { @@ -4172,12 +4198,144 @@ "rxjs": ">=6.0.0" } }, + "node_modules/@taiga-ui/cdk/node_modules/@angular-devkit/core": { + "version": "12.2.18", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.18.tgz", + "integrity": "sha512-GDLHGe9HEY5SRS+NrKr14C8aHsRCiBFkBFSSbeohgLgcgSXzZHFoU84nDWrl3KZNP8oqcUSv5lHu6dLcf2fnww==", + "dependencies": { + "ajv": "8.6.2", + "ajv-formats": "2.1.0", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@taiga-ui/cdk/node_modules/@angular-devkit/core/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@taiga-ui/cdk/node_modules/@angular-devkit/core/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@taiga-ui/cdk/node_modules/@angular-devkit/schematics": { + "version": "12.2.18", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.18.tgz", + "integrity": "sha512-bZ9NS5PgoVfetRC6WeQBHCY5FqPZ9y2TKHUo12sOB2YSL3tgWgh1oXyP8PtX34gasqsLjNULxEQsAQYEsiX/qQ==", + "dependencies": { + "@angular-devkit/core": "12.2.18", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@taiga-ui/cdk/node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@taiga-ui/cdk/node_modules/@angular-devkit/schematics/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@taiga-ui/cdk/node_modules/@schematics/angular": { + "version": "12.2.18", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.18.tgz", + "integrity": "sha512-niRS9Ly9y8uI0YmTSbo8KpdqCCiZ/ATMZWeS2id5M8JZvfXbngwiqJvojdSol0SWU+n1W4iA+lJBdt4gSKlD5w==", + "dependencies": { + "@angular-devkit/core": "12.2.18", + "@angular-devkit/schematics": "12.2.18", + "jsonc-parser": "3.0.0" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@taiga-ui/cdk/node_modules/ajv": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@taiga-ui/cdk/node_modules/ajv-formats": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", + "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@taiga-ui/cdk/node_modules/jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==" + }, + "node_modules/@taiga-ui/cdk/node_modules/magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dependencies": { + "sourcemap-codec": "^1.4.4" + } + }, + "node_modules/@taiga-ui/cdk/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, "node_modules/@taiga-ui/core": { - "version": "3.49.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.49.1.tgz", - "integrity": "sha512-rup9I5GVtbv5QNGj6jw2w1J2sHPRLwlmokI+/ceTzTlL4h1SvwH0vNm1hcQu4/nlsoYE4m3f8TyXs/1rM3lzxw==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.52.0.tgz", + "integrity": "sha512-KstWj5idjABd4qj7kvv7qRRRCogGKlT90LaAHZ/ha6sR8/nLDXtLcLJkLrWSSI6LFQXXTLtj/SDeMxdMvkCTSw==", "dependencies": { - "@taiga-ui/i18n": "^3.49.1", + "@taiga-ui/i18n": "^3.52.0", "tslib": ">=2.0.0" }, "peerDependencies": { @@ -4189,34 +4347,35 @@ "@angular/router": ">=12.0.0", "@ng-web-apis/common": ">=3.0.0", "@ng-web-apis/mutation-observer": ">=3.0.0", - "@taiga-ui/cdk": ">=3.49.1", - "@taiga-ui/i18n": ">=3.49.1", + "@taiga-ui/cdk": ">=3.52.0", + "@taiga-ui/i18n": ">=3.52.0", "@tinkoff/ng-event-plugins": ">=3.1.0", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/experimental": { - "version": "3.491.1-canary.5e01f6f", - "resolved": "https://registry.npmjs.org/@taiga-ui/experimental/-/experimental-3.491.1-canary.5e01f6f.tgz", - "integrity": "sha512-bQCGK8DKYzMZ+0SZNJkplmZ/EhyJoaWsQk0F/P/WefA6SrjupHTUq3K35P1hT1Ixr0vADONOcEDFd5DgziTZ5g==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/experimental/-/experimental-3.52.0.tgz", + "integrity": "sha512-oql9ctZ0eXeQ6f4n525sL4xI2N5r9+qu4sEvuJaS9Qv008hyxKdgdqLRB4CmG4qIphfukHm2Q1cU+lsDM7+ENg==", "dependencies": { "tslib": ">=2.0.0" }, "peerDependencies": { "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", - "@taiga-ui/cdk": ">=3.49.1", - "@taiga-ui/core": ">=3.49.1", - "@taiga-ui/kit": ">=3.49.1", + "@taiga-ui/addon-commerce": ">=3.52.0", + "@taiga-ui/cdk": ">=3.52.0", + "@taiga-ui/core": ">=3.52.0", + "@taiga-ui/kit": ">=3.52.0", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/i18n": { - "version": "3.49.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.49.1.tgz", - "integrity": "sha512-x85DI7iuMUlKbvH+M/kuyYT7jmaV2ILxFXeCjrLs93iHilLisF3o9Zz+z+2pKgyjkBdnx0t2M3Bme2J3N6mXYA==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.52.0.tgz", + "integrity": "sha512-182Yf1QQXEjKSqEScuH01DZMBIyCa2/yOe6qtvmlAHjl67DRjaajtd0N7ehrNl8C9TyN4HsAbcGRtyMP0/0xgQ==", "dependencies": { "tslib": ">=2.0.0" }, @@ -4227,25 +4386,25 @@ } }, "node_modules/@taiga-ui/icons": { - "version": "3.49.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.49.1.tgz", - "integrity": "sha512-TVllWirA7FIaGMGJuQqEPG5NbGvbxuxJaq7oNGV88+mBLaZtMIsIuWrG+ojCCwYYN+AztDFcfwG1BtSEpaGqww==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.52.0.tgz", + "integrity": "sha512-0DjCqzCgk5FGh64NCf1tNgbXVR8TEVn9kUyhdaoEVd3K38eVyKtx/6DWjB0oV5+a1ZG1uq+oP6ixNurC4C6x8g==", "dependencies": { "tslib": ">=2.0.0" }, "peerDependencies": { - "@taiga-ui/cdk": ">=3.49.1" + "@taiga-ui/cdk": ">=3.52.0" } }, "node_modules/@taiga-ui/kit": { - "version": "3.49.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.49.1.tgz", - "integrity": "sha512-CwK3iWXQsgx8Hn5yIc42ndZbtm2oS5C5byo40B8ex+vYQeoOj7NTRmrBJ/XIhWi66vpSbbYY7+d8b/5g6vgfXg==", - "dependencies": { - "@maskito/angular": "1.7.0", - "@maskito/core": "1.7.0", - "@maskito/kit": "1.7.0", - "@ng-web-apis/intersection-observer": "3.1.3", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.52.0.tgz", + "integrity": "sha512-T5DR6Np7RiMGX+xMmeGisCc33Js5X2nztObW5VfprU3C7eCp15Z7rw3J3+NdJtf90IJ4EijcbEP8HPxE2sJIVQ==", + "dependencies": { + "@maskito/angular": "1.8.1", + "@maskito/core": "1.8.1", + "@maskito/kit": "1.8.1", + "@ng-web-apis/intersection-observer": "3.1.5", "text-mask-core": "5.1.2", "tslib": ">=2.0.0" }, @@ -4257,19 +4416,19 @@ "@ng-web-apis/common": ">=3.0.0", "@ng-web-apis/mutation-observer": ">=3.0.0", "@ng-web-apis/resize-observer": ">=3.0.0", - "@taiga-ui/cdk": ">=3.49.1", - "@taiga-ui/core": ">=3.49.1", - "@taiga-ui/i18n": ">=3.49.1", + "@taiga-ui/cdk": ">=3.52.0", + "@taiga-ui/core": ">=3.52.0", + "@taiga-ui/i18n": ">=3.52.0", "@tinkoff/ng-polymorpheus": ">=4.0.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/styles": { - "version": "3.49.1", - "resolved": "https://registry.npmjs.org/@taiga-ui/styles/-/styles-3.49.1.tgz", - "integrity": "sha512-J1SEVKY/UUyM97M7HyzMbgbmRS3EZwqeTyRStezejpg/kBJrbOQaBx76cUCoBvVJ6PZ5S5N/AapnrutW1RTkfg==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/styles/-/styles-3.52.0.tgz", + "integrity": "sha512-VabK+8cV2DErI8cENyy2u/xjX2U0bg8J0fL/A9PrCu8LS9VZGXuH7m7AbMbo05ADpmkqDYDt9N0eBzik3+pVxw==", "peerDependencies": { - "@taiga-ui/cdk": ">=3.49.1", + "@taiga-ui/cdk": ">=3.52.0", "tslib": ">=2.0.0" } }, @@ -4322,17 +4481,56 @@ } }, "node_modules/@ts-morph/common": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.9.2.tgz", - "integrity": "sha512-IPyg+c3Am0EBoa63W0f/AKeLrJhvzMzQ4BIvD1baxLopmiHOj1HFTXYxC6e8iTZ+UYtN+/WFM9UyGRnoA20b8g==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.20.0.tgz", + "integrity": "sha512-7uKjByfbPpwuzkstL3L5MQyuXPSKdoNG93Fmi2JoDcTf3pEP731JdRFAduRVkOs8oqxPsXKA+ScrWkdQ8t/I+Q==", "optional": true, "dependencies": { - "fast-glob": "^3.2.5", - "minimatch": "^3.0.4", - "mkdirp": "^1.0.4", + "fast-glob": "^3.2.12", + "minimatch": "^7.4.3", + "mkdirp": "^2.1.6", "path-browserify": "^1.0.1" } }, + "node_modules/@ts-morph/common/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "optional": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@ts-morph/common/node_modules/mkdirp": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", + "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "optional": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -6110,9 +6308,9 @@ } }, "node_modules/code-block-writer": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-10.1.1.tgz", - "integrity": "sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-12.0.0.tgz", + "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==", "optional": true }, "node_modules/color-convert": { @@ -7675,8 +7873,7 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -11069,25 +11266,78 @@ } }, "node_modules/ng-morph": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/ng-morph/-/ng-morph-2.2.5.tgz", - "integrity": "sha512-plxrHfcz7aNRcTCxS9tUxI1F5Vfx5CZAAw8NAnJCyCb41Js6S+EyPDvn2v7H2QyfZzXU1H0BAqtiRQv/rE2zTA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ng-morph/-/ng-morph-4.0.0.tgz", + "integrity": "sha512-+opfMF/33fMQRt38oSPT+fnexZm8c635LaTDKOlAnkaDGRWcOM4EllqLf73m+5+D8gurwYXOkimIzj6Jmpx1cA==", "optional": true, "dependencies": { - "jsonc-parser": "3.0.0", - "minimatch": "3.0.5", + "jsonc-parser": "3.2.0", + "minimatch": "9.0.1", "multimatch": "5.0.0", - "ts-morph": "10.0.2" + "semver": "7.4.0", + "ts-morph": "19.0.0" }, "peerDependencies": { "@angular-devkit/core": ">=11.0.0", - "@angular-devkit/schematics": ">=11.0.0" + "@angular-devkit/schematics": ">=11.0.0", + "tslib": "2.5.3" } }, - "node_modules/ng-morph/node_modules/jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "node_modules/ng-morph/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ng-morph/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ng-morph/node_modules/minimatch": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "optional": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ng-morph/node_modules/semver": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz", + "integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==", + "optional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ng-morph/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "optional": true }, "node_modules/ng-packagr": { @@ -14608,6 +14858,12 @@ "node": ">=0.10.0" } }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead" + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -15294,13 +15550,13 @@ "integrity": "sha512-kXrY75F0s0WD15N2bWKDScKlKgwnusN6dTRzGs1N7LlxQRnazrsBISC1HL4sy2adsyk65Zbx3Ui3IGN8leAFOQ==" }, "node_modules/ts-morph": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-10.0.2.tgz", - "integrity": "sha512-TVuIfEqtr9dW25K3Jajqpqx7t/zLRFxKu2rXQZSDjTm4MO4lfmuj1hn8WEryjeDDBFcNOCi+yOmYUYR4HucrAg==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-19.0.0.tgz", + "integrity": "sha512-D6qcpiJdn46tUqV45vr5UGM2dnIEuTGNxVhg0sk5NX11orcouwj6i1bMqZIz2mZTZB1Hcgy7C3oEVhAT+f6mbQ==", "optional": true, "dependencies": { - "@ts-morph/common": "~0.9.0", - "code-block-writer": "^10.1.1" + "@ts-morph/common": "~0.20.0", + "code-block-writer": "^12.0.0" } }, "node_modules/ts-node": { diff --git a/frontend/package.json b/frontend/package.json index d3f6d2edb..1a0980626 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -44,13 +44,13 @@ "@materia-ui/ngx-monaco-editor": "^6.0.0", "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", - "@taiga-ui/addon-charts": "3.49.1", - "@taiga-ui/cdk": "3.49.1", - "@taiga-ui/core": "3.49.1", - "@taiga-ui/experimental": "3.491.1-canary.5e01f6f\n", - "@taiga-ui/icons": "3.49.1", - "@taiga-ui/kit": "3.49.1", - "@taiga-ui/styles": "3.49.1", + "@taiga-ui/addon-charts": "3.52.0", + "@taiga-ui/cdk": "3.52.0", + "@taiga-ui/core": "3.52.0", + "@taiga-ui/experimental": "3.52.0", + "@taiga-ui/icons": "3.52.0", + "@taiga-ui/kit": "3.52.0", + "@taiga-ui/styles": "3.52.0", "@tinkoff/ng-dompurify": "4.0.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", diff --git a/frontend/projects/marketplace/src/pages/show/package/package.component.html b/frontend/projects/marketplace/src/pages/show/package/package.component.html index 6007ce65b..cec0c1f95 100644 --- a/frontend/projects/marketplace/src/pages/show/package/package.component.html +++ b/frontend/projects/marketplace/src/pages/show/package/package.component.html @@ -1,11 +1,9 @@ -
- -
-

{{ pkg.manifest.title }}

-

{{ pkg.manifest.version | displayEmver }}

-

- Released: {{ published | date : 'medium' }} -

- -
+ +
+

{{ pkg.manifest.title }}

+

{{ pkg.manifest.version | displayEmver }}

+

+ Released: {{ published | date : 'medium' }} +

+
diff --git a/frontend/projects/marketplace/src/pages/show/package/package.component.scss b/frontend/projects/marketplace/src/pages/show/package/package.component.scss index 9e75cfd41..52859a076 100644 --- a/frontend/projects/marketplace/src/pages/show/package/package.component.scss +++ b/frontend/projects/marketplace/src/pages/show/package/package.component.scss @@ -1,7 +1,8 @@ -.header { +:host { display: flex; align-items: flex-start; padding: 16px; + line-height: 2; } .text { diff --git a/frontend/projects/marketplace/src/pipes/mime-type.pipe.ts b/frontend/projects/marketplace/src/pipes/mime-type.pipe.ts index a0dc14a00..14715ec29 100644 --- a/frontend/projects/marketplace/src/pipes/mime-type.pipe.ts +++ b/frontend/projects/marketplace/src/pipes/mime-type.pipe.ts @@ -6,6 +6,8 @@ import { MarketplacePkg } from '../types' }) export class MimeTypePipe implements PipeTransform { transform(pkg: MarketplacePkg): string { + if (pkg.icon.startsWith('data:')) return pkg.icon + if (pkg.manifest.assets.icon) { switch (pkg.manifest.assets.icon.split('.').pop()) { case 'png': diff --git a/frontend/projects/shared/styles/taiga.scss b/frontend/projects/shared/styles/taiga.scss index ed482baf7..ea9cd857b 100644 --- a/frontend/projects/shared/styles/taiga.scss +++ b/frontend/projects/shared/styles/taiga.scss @@ -39,6 +39,13 @@ color: var(--tui-error-fill); } +[tuiWrapper][data-appearance='input-file'] { + &:hover, + &:active { + background: transparent !important; + } +} + tui-dialog { transform: translate3d(0, 0, 0); } diff --git a/frontend/projects/ui/src/app/app.providers.ts b/frontend/projects/ui/src/app/app.providers.ts index eb4515ad7..e6b52a1f6 100644 --- a/frontend/projects/ui/src/app/app.providers.ts +++ b/frontend/projects/ui/src/app/app.providers.ts @@ -4,10 +4,10 @@ import { Router, RouteReuseStrategy } from '@angular/router' import { IonicRouteStrategy, IonNav } from '@ionic/angular' import { TUI_DATE_FORMAT, TUI_DATE_SEPARATOR } from '@taiga-ui/cdk' import { - tuiButtonOptionsProvider, tuiNumberFormatProvider, tuiTextfieldOptionsProvider, } from '@taiga-ui/core' +import { tuiButtonOptionsProvider } from '@taiga-ui/experimental' import { TUI_DATE_TIME_VALUE_TRANSFORMER, TUI_DATE_VALUE_TRANSFORMER, diff --git a/frontend/projects/ui/src/app/app/snek/snek.module.ts b/frontend/projects/ui/src/app/app/snek/snek.module.ts index 8bb81a01e..a678b8395 100644 --- a/frontend/projects/ui/src/app/app/snek/snek.module.ts +++ b/frontend/projects/ui/src/app/app/snek/snek.module.ts @@ -1,10 +1,10 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { IonicModule } from '@ionic/angular' +import { TuiButtonModule } from '@taiga-ui/experimental' import { SnekDirective } from './snek.directive' import { SnakePage } from './snake.page' -import { TuiButtonModule } from '@taiga-ui/core' @NgModule({ imports: [CommonModule, IonicModule, TuiButtonModule], diff --git a/frontend/projects/ui/src/app/apps/diagnostic/home/home.module.ts b/frontend/projects/ui/src/app/apps/diagnostic/home/home.module.ts index 62f6394e5..530fccaa2 100644 --- a/frontend/projects/ui/src/app/apps/diagnostic/home/home.module.ts +++ b/frontend/projects/ui/src/app/apps/diagnostic/home/home.module.ts @@ -1,7 +1,7 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { RouterModule, Routes } from '@angular/router' -import { TuiButtonModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { HomePage } from './home.page' const ROUTES: Routes = [ diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html index d6da51049..17f8fe9f2 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html +++ b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html @@ -24,9 +24,9 @@ diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts index 06ac33daa..df7b39038 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts @@ -9,11 +9,11 @@ import { import { TuiBadgedContentModule, TuiBadgeNotificationModule, + TuiButtonModule, } from '@taiga-ui/experimental' import { RouterLink } from '@angular/router' import { TickerModule } from '@start9labs/shared' import { - TuiButtonModule, TuiDataListModule, TuiHostedDropdownModule, TuiSvgModule, diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts b/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts index 4d7483e40..5a08d4ba9 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts @@ -1,10 +1,10 @@ import { ChangeDetectionStrategy, Component, inject } from '@angular/core' import { - TuiButtonModule, TuiDataListModule, TuiHostedDropdownModule, TuiSvgModule, } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { ApiService } from 'src/app/services/api/embassy-api.service' import { AuthService } from 'src/app/services/auth.service' diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header.component.html b/frontend/projects/ui/src/app/apps/portal/components/header/header.component.html index f6f904187..5a0c60aa5 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/header/header.component.html +++ b/frontend/projects/ui/src/app/apps/portal/components/header/header.component.html @@ -1,10 +1,11 @@
- - - diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header.component.ts b/frontend/projects/ui/src/app/apps/portal/components/header/header.component.ts index c8005f68d..1ef1c3005 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/header/header.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/components/header/header.component.ts @@ -1,11 +1,14 @@ import { ChangeDetectionStrategy, Component } from '@angular/core' -import { TuiBadgedContentModule } from '@taiga-ui/kit' import { - TuiButtonModule, TuiDataListModule, TuiHostedDropdownModule, TuiSvgModule, } from '@taiga-ui/core' +import { + TuiBadgedContentModule, + TuiBadgeNotificationModule, + TuiButtonModule, +} from '@taiga-ui/experimental' import { HeaderMenuComponent } from './header-menu/header-menu.component' @Component({ @@ -16,6 +19,7 @@ import { HeaderMenuComponent } from './header-menu/header-menu.component' changeDetection: ChangeDetectionStrategy.OnPush, imports: [ TuiBadgedContentModule, + TuiBadgeNotificationModule, TuiButtonModule, TuiHostedDropdownModule, TuiDataListModule, diff --git a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html index ba901e01c..4b9705b98 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html +++ b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html @@ -25,7 +25,7 @@
@@ -65,14 +64,14 @@ import { EDIT } from './edit.component' tuiIconButton appearance="icon" size="xs" - icon="tuiIconEdit2" + iconLeft="tuiIconEdit2" (click)="update(job)" > diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/recover.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/recover.component.ts index e6837b31d..4a72d8a4d 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/recover.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/recover.component.ts @@ -2,11 +2,8 @@ import { CommonModule } from '@angular/common' import { ChangeDetectionStrategy, Component, inject } from '@angular/core' import { FormsModule } from '@angular/forms' import { ErrorService, LoadingService } from '@start9labs/shared' -import { - TuiButtonModule, - TuiDialogContext, - TuiGroupModule, -} from '@taiga-ui/core' +import { TuiDialogContext, TuiGroupModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { TuiCheckboxBlockModule } from '@taiga-ui/kit' import { POLYMORPHEUS_CONTEXT, diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/target.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/target.component.ts index ff9cb8b62..fd3458023 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/target.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/target.component.ts @@ -2,8 +2,8 @@ import { CommonModule } from '@angular/common' import { ChangeDetectionStrategy, Component, inject } from '@angular/core' import { ErrorService } from '@start9labs/shared' import { TuiForModule } from '@taiga-ui/cdk' +import { TuiButtonModule } from '@taiga-ui/experimental' import { - TuiButtonModule, TuiDialogContext, TuiDialogOptions, TuiDialogService, diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts index 737e1d9c8..4c93e3a0d 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts @@ -5,18 +5,10 @@ import { unionSelectKey, unionValueKey, } from '@start9labs/start-sdk/lib/config/configTypes' -import { TuiButtonModule, TuiNotificationModule } from '@taiga-ui/core' +import { TuiNotificationModule } from '@taiga-ui/core' +import { TuiButtonModule, TuiFadeModule } from '@taiga-ui/experimental' import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' -import { - BehaviorSubject, - catchError, - from, - Observable, - of, - share, - startWith, - switchMap, -} from 'rxjs' +import { BehaviorSubject } from 'rxjs' import { FormPage } from 'src/app/apps/ui/modals/form/form.page' import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' import { @@ -37,7 +29,6 @@ import { ApiService } from 'src/app/services/api/embassy-api.service' import { BackupConfig } from '../types/backup-config' import { BackupsPhysicalComponent } from '../components/physical.component' import { BackupsTargetsComponent } from '../components/targets.component' -import { TuiFadeModule } from '@taiga-ui/experimental' @Component({ template: ` diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/dependencies.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/dependencies.component.ts new file mode 100644 index 000000000..e3d23f944 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/dependencies.component.ts @@ -0,0 +1,58 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, Input } from '@angular/core' +import { MarketplacePkg } from '@start9labs/marketplace' +import { EmverPipesModule } from '@start9labs/shared' +import { + TuiAvatarModule, + TuiCellModule, + TuiTitleModule, +} from '@taiga-ui/experimental' + +@Component({ + selector: 'sideload-dependencies', + template: ` +

Dependencies

+
+ +
+
+ {{ getTitle(dep.key) }}  + + (required) + (required by default) + (optional) + +
+
+ {{ dep.value.version | displayEmver }} +
+
+ {{ dep.value.description }} +
+
+
+ `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + TuiTitleModule, + EmverPipesModule, + TuiAvatarModule, + TuiCellModule, + ], +}) +export class SideloadDependenciesComponent { + @Input({ required: true }) + package!: MarketplacePkg + + getTitle(key: string): string { + return this.package['dependency-metadata'][key]?.title || key + } + + getImage(key: string): string { + const icon = this.package['dependency-metadata'][key]?.icon + + return icon ? `data:image/png;base64,${icon}` : key.substring(0, 2) + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts new file mode 100644 index 000000000..68a41b30f --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts @@ -0,0 +1,131 @@ +import { CommonModule } from '@angular/common' +import { Component, inject, Input } from '@angular/core' +import { Router, RouterLink } from '@angular/router' +import { + AboutModule, + AdditionalModule, + MarketplacePkg, + PackageModule, +} from '@start9labs/marketplace' +import { + Emver, + ErrorService, + LoadingService, + SharedPipesModule, +} from '@start9labs/shared' +import { TuiLetModule } from '@taiga-ui/cdk' +import { TuiAlertService } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' +import { PatchDB } from 'patch-db-client' +import { combineLatest, map } from 'rxjs' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { ClientStorageService } from 'src/app/services/client-storage.service' + +import { toDesktopItem } from '../../../utils/to-desktop-item' +import { NavigationService } from '../../../services/navigation.service' +import { SideloadDependenciesComponent } from './dependencies.component' + +@Component({ + selector: 'sideload-package', + template: ` + + + + View installed + + + + + + + `, + standalone: true, + imports: [ + CommonModule, + RouterLink, + SharedPipesModule, + AboutModule, + AdditionalModule, + PackageModule, + TuiButtonModule, + TuiLetModule, + SideloadDependenciesComponent, + ], +}) +export class SideloadPackageComponent { + private readonly loader = inject(LoadingService) + private readonly api = inject(ApiService) + private readonly errorService = inject(ErrorService) + private readonly router = inject(Router) + private readonly navigation = inject(NavigationService) + private readonly alerts = inject(TuiAlertService) + private readonly emver = inject(Emver) + + readonly button$ = combineLatest([ + inject(ClientStorageService).showDevTools$, + inject(PatchDB) + .watch$('package-data') + .pipe( + map(local => + local[this.package.manifest.id] + ? this.emver.compare( + local[this.package.manifest.id].manifest.version, + this.package.manifest.version, + ) + : null, + ), + ), + ]).pipe( + map(([devtools, version]) => { + switch (version) { + case null: + return 'Install' + case 1: + return 'Update' + case -1: + return devtools ? 'Downgrade' : '' + default: + return '' + } + }), + ) + + @Input({ required: true }) + package!: MarketplacePkg + + @Input({ required: true }) + file!: File + + async upload() { + const loader = this.loader.open('Uploading package').subscribe() + const { manifest, icon } = this.package + const { size } = this.file + + try { + const pkg = await this.api.sideloadPackage({ manifest, icon, size }) + + await this.api.uploadPackage(pkg, this.file) + await this.router.navigate(['/portal/service', manifest.id]) + + this.navigation.removeTab(toDesktopItem('/portal/system/sideload')) + this.alerts + .open('Package uploaded successfully', { status: 'success' }) + .subscribe() + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.component.ts new file mode 100644 index 000000000..040e4453a --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.component.ts @@ -0,0 +1,119 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { FormsModule } from '@angular/forms' +import { MarketplacePkg } from '@start9labs/marketplace' +import { TuiLinkModule, TuiWrapperModule } from '@taiga-ui/core' +import { TuiAvatarModule, TuiButtonModule } from '@taiga-ui/experimental' +import { + TuiInputFilesModule, + tuiInputFilesOptionsProvider, +} from '@taiga-ui/kit' +import { Subject } from 'rxjs' +import { ConfigService } from 'src/app/services/config.service' + +import { parseS9pk, validateS9pk } from './sideload.utils' +import { SideloadPackageComponent } from './package.component' + +@Component({ + template: ` + + + + + + + + +
+ +

Invalid package file

+ +
+ +
+ +

Upload .s9pk package file

+

+ Tip: switch to LAN for faster uploads +

+ +
+
+
+
+
+ `, + host: { class: 'g-page', '[style.padding-top.rem]': '2' }, + styles: [ + ` + tui-input-files { + height: 100%; + max-width: 40rem; + margin: 0 auto; + } + `, + ], + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [tuiInputFilesOptionsProvider({ maxFileSize: Infinity })], + standalone: true, + imports: [ + CommonModule, + FormsModule, + TuiInputFilesModule, + TuiLinkModule, + TuiAvatarModule, + TuiWrapperModule, + TuiButtonModule, + SideloadPackageComponent, + ], +}) +export class SideloadComponent { + readonly refresh$ = new Subject() + readonly isTor = inject(ConfigService).isTor() + + invalid = false + file: File | null = null + package: MarketplacePkg | null = null + + clear() { + this.invalid = false + this.file = null + this.package = null + } + + async onFile(file: File | null) { + if (!file || !(await validateS9pk(file))) { + this.invalid = true + } else { + this.package = await parseS9pk(file) + this.file = file + } + + this.refresh$.next() + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.utils.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.utils.ts new file mode 100644 index 000000000..b302658d3 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.utils.ts @@ -0,0 +1,162 @@ +import { Manifest, MarketplacePkg } from '@start9labs/marketplace' +import cbor from 'cbor' + +interface Positions { + [key: string]: [bigint, bigint] // [position, length] +} + +const MAGIC = new Uint8Array([59, 59]) +const VERSION = new Uint8Array([1]) + +export async function validateS9pk(file: File): Promise { + const magic = new Uint8Array(await blobToBuffer(file.slice(0, 2))) + const version = new Uint8Array(await blobToBuffer(file.slice(2, 3))) + + return compare(magic, MAGIC) && compare(version, VERSION) +} + +export async function parseS9pk(file: File): Promise { + const positions: Positions = {} + // magic=2bytes, version=1bytes, pubkey=32bytes, signature=64bytes, toc_length=4bytes = 103byte is starting point + let start = 103 + let end = start + 1 // 104 + const tocLength = new DataView( + await blobToBuffer(file.slice(99, 103) ?? new Blob()), + ).getUint32(0, false) + await getPositions(start, end, file, positions, tocLength as any) + + const manifest = await getAsset(positions, file, 'manifest') + const [icon] = await Promise.all([ + await getIcon(positions, file, manifest), + // getAsset(positions, file, 'license'), + // getAsset(positions, file, 'instructions'), + ]) + + return { + manifest, + icon, + license: '', + instructions: '', + categories: [], + versions: [], + 'dependency-metadata': {}, + 'published-at': '', + } +} + +async function getPositions( + initialStart: number, + initialEnd: number, + file: Blob, + positions: Positions, + tocLength: number, +) { + let start = initialStart + let end = initialEnd + const titleLength = new Uint8Array( + await blobToBuffer(file.slice(start, end)), + )[0] + const tocTitle = await file.slice(end, end + titleLength).text() + start = end + titleLength + end = start + 8 + const chapterPosition = new DataView( + await blobToBuffer(file.slice(start, end)), + ).getBigUint64(0, false) + start = end + end = start + 8 + const chapterLength = new DataView( + await blobToBuffer(file.slice(start, end)), + ).getBigUint64(0, false) + + positions[tocTitle] = [chapterPosition, chapterLength] + start = end + end = start + 1 + if (end <= tocLength + (initialStart - 1)) { + await getPositions(start, end, file, positions, tocLength) + } +} + +async function readBlobAsDataURL( + f: Blob | File, +): Promise { + const reader = new FileReader() + return new Promise((resolve, reject) => { + reader.onloadend = () => { + resolve(reader.result) + } + reader.readAsDataURL(f) + reader.onerror = _ => reject(new Error('error reading blob')) + }) +} + +async function blobToDataURL(data: Blob | File): Promise { + const res = await readBlobAsDataURL(data) + if (res instanceof ArrayBuffer) { + throw new Error('readBlobAsDataURL response should not be an array buffer') + } + if (res == null) { + throw new Error('readBlobAsDataURL response should not be null') + } + if (typeof res === 'string') return res + throw new Error('no possible blob to data url resolution found') +} + +async function blobToBuffer(data: Blob | File): Promise { + const res = await readBlobToArrayBuffer(data) + if (res instanceof String) { + throw new Error('readBlobToArrayBuffer response should not be a string') + } + if (res == null) { + throw new Error('readBlobToArrayBuffer response should not be null') + } + if (res instanceof ArrayBuffer) return res + throw new Error('no possible blob to array buffer resolution found') +} + +async function readBlobToArrayBuffer( + f: Blob | File, +): Promise { + const reader = new FileReader() + return new Promise((resolve, reject) => { + reader.onloadend = () => { + resolve(reader.result) + } + reader.readAsArrayBuffer(f) + reader.onerror = _ => reject(new Error('error reading blob')) + }) +} + +function compare(a: Uint8Array, b: Uint8Array) { + for (let i = 0; i < a.length; i++) { + if (a[i] !== b[i]) return false + } + return true +} + +async function getAsset( + positions: Positions, + file: Blob, + asset: 'manifest' | 'license' | 'instructions', +): Promise { + const data = await blobToBuffer( + file.slice( + Number(positions[asset][0]), + Number(positions[asset][0]) + Number(positions[asset][1]), + ), + ) + return cbor.decode(data, true) +} + +async function getIcon( + positions: Positions, + file: Blob, + manifest: Manifest, +): Promise { + const contentType = `image/${manifest.assets.icon.split('.').pop()}` + const data = file.slice( + Number(positions['icon'][0]), + Number(positions['icon'][0]) + Number(positions['icon'][1]), + contentType, + ) + return blobToDataURL(data) +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts index 645ffc063..e0ea03716 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts @@ -11,6 +11,13 @@ const ROUTES: Routes = [ import('./backups/backups.component').then(m => m.BackupsComponent), data: toDesktopItem('/portal/system/backups'), }, + { + title: systemTabResolver, + path: 'sideload', + loadComponent: () => + import('./sideload/sideload.component').then(m => m.SideloadComponent), + data: toDesktopItem('/portal/system/sideload'), + }, { title: systemTabResolver, path: 'updates', diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts index 007e4e473..fe52087a2 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts @@ -15,13 +15,12 @@ import { SharedPipesModule, } from '@start9labs/shared' import { - TuiButtonModule, TuiDialogService, TuiLinkModule, TuiLoaderModule, TuiSvgModule, } from '@taiga-ui/core' -import { TuiAvatarModule } from '@taiga-ui/experimental' +import { TuiAvatarModule, TuiButtonModule } from '@taiga-ui/experimental' import { TUI_PROMPT, TuiAccordionModule, diff --git a/frontend/projects/ui/src/app/apps/portal/services/navigation.service.ts b/frontend/projects/ui/src/app/apps/portal/services/navigation.service.ts index 57b7b1d8a..1c91b9585 100644 --- a/frontend/projects/ui/src/app/apps/portal/services/navigation.service.ts +++ b/frontend/projects/ui/src/app/apps/portal/services/navigation.service.ts @@ -12,8 +12,8 @@ export class NavigationService { return this.tabs } - removeTab(tab: NavigationItem) { - this.tabs.next(this.tabs.value.filter(t => t !== tab)) + removeTab({ routerLink }: NavigationItem) { + this.tabs.next(this.tabs.value.filter(t => t.routerLink !== routerLink)) } addTab(tab: NavigationItem) { diff --git a/frontend/projects/ui/src/app/apps/ui/modals/form/form.module.ts b/frontend/projects/ui/src/app/apps/ui/modals/form/form.module.ts index 464f60770..4b7009137 100644 --- a/frontend/projects/ui/src/app/apps/ui/modals/form/form.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/modals/form/form.module.ts @@ -3,7 +3,8 @@ import { CommonModule } from '@angular/common' import { ReactiveFormsModule } from '@angular/forms' import { RouterModule } from '@angular/router' import { TuiValueChangesModule } from '@taiga-ui/cdk' -import { TuiButtonModule, TuiModeModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' +import { TuiModeModule } from '@taiga-ui/core' import { FormModule } from 'src/app/common/form/form.module' import { FormPage } from './form.page' diff --git a/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html b/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html index b407d3dfa..daf261009 100644 --- a/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html +++ b/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html @@ -34,7 +34,7 @@ title="Toggle masking" size="xs" class="button" - [icon]="masked ? 'tuiIconEye' : 'tuiIconEyeOff'" + [iconLeft]="masked ? 'tuiIconEye' : 'tuiIconEyeOff'" (click)="masked = !masked" > diff --git a/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.module.ts b/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.module.ts index 12cd96f6b..d872cb565 100644 --- a/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.module.ts @@ -1,7 +1,8 @@ import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' import { FormsModule } from '@angular/forms' -import { TuiButtonModule, TuiTextfieldControllerModule } from '@taiga-ui/core' +import { TuiTextfieldControllerModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { TuiInputModule } from '@taiga-ui/kit' import { TuiAutoFocusModule } from '@taiga-ui/cdk' import { PromptComponent } from './prompt.component' diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.module.ts index bcb9ed156..4d5d6dbcd 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.module.ts @@ -1,7 +1,8 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { FormsModule } from '@angular/forms' -import { TuiButtonModule, TuiGroupModule } from '@taiga-ui/core' +import { TuiGroupModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { TuiCheckboxBlockModule } from '@taiga-ui/kit' import { BackupSelectPage } from './backup-select.page' diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.module.ts index 0f7e63288..ab1eabf6b 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.module.ts @@ -1,7 +1,8 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { FormsModule } from '@angular/forms' -import { TuiButtonModule, TuiGroupModule } from '@taiga-ui/core' +import { TuiGroupModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { TuiCheckboxBlockModule } from '@taiga-ui/kit' import { RecoverSelectPage } from './recover-select.page' import { ToOptionsPipe } from './to-options.pipe' diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.module.ts index 3b88319de..6ea234db5 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.module.ts @@ -1,7 +1,7 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { IonicModule } from '@ionic/angular' -import { TuiButtonModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { TargetSelectPage, TargetStatusComponent } from './target-select.page' import { TargetPipesModule } from '../../pipes/target-pipes.module' import { TextSpinnerComponentModule } from '@start9labs/shared' diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts index 12f9f5929..f5c833049 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts @@ -3,11 +3,8 @@ import { NgModule } from '@angular/core' import { FormsModule } from '@angular/forms' import { RouterModule, Routes } from '@angular/router' import { IonicModule } from '@ionic/angular' -import { - TuiButtonModule, - TuiNotificationModule, - TuiWrapperModule, -} from '@taiga-ui/core' +import { TuiNotificationModule, TuiWrapperModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { TuiInputModule, TuiToggleModule } from '@taiga-ui/kit' import { BackupJobsPage } from './backup-jobs.page' import { EditJobComponent } from './edit-job/edit-job.component' diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.module.ts index c7caf81ad..3279dd8bb 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.module.ts @@ -2,11 +2,11 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { ReactiveFormsModule } from '@angular/forms' import { - TuiButtonModule, TuiLoaderModule, TuiModeModule, TuiNotificationModule, } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { FormPageModule } from 'src/app/apps/ui/modals/form/form.module' import { AppConfigPage } from './app-config.page' diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/email/email.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/email/email.module.ts index 2bcbd043b..f86ad248a 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/email/email.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/email/email.module.ts @@ -1,7 +1,8 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { IonicModule } from '@ionic/angular' -import { TuiButtonModule, TuiNotificationModule } from '@taiga-ui/core' +import { TuiNotificationModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { EmailPage } from './email.page' import { Routes, RouterModule } from '@angular/router' import { FormsModule, ReactiveFormsModule } from '@angular/forms' diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.module.ts index fe6410830..a18c8cbbe 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.module.ts @@ -4,13 +4,13 @@ import { FormsModule } from '@angular/forms' import { RouterModule, Routes } from '@angular/router' import { IonicModule } from '@ionic/angular' import { - TuiButtonModule, TuiDataListModule, TuiHostedDropdownModule, TuiNotificationModule, TuiSvgModule, TuiWrapperModule, } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { TuiBadgeModule, TuiInputModule, TuiToggleModule } from '@taiga-ui/kit' import { ProxiesPage } from './proxies.page' diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html b/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html index b358ad465..2e15ce50f 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html @@ -102,11 +102,8 @@ appearance="flat" tuiHostedDropdownHost size="s" - [icon]="icon" + iconLeft="tuiIconMoreHorizontal" > - - - diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts index 141055614..95c7c02d2 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts @@ -1,7 +1,8 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { MarkdownPipeModule, SafeLinksDirective } from '@start9labs/shared' -import { TuiButtonModule, TuiScrollbarModule } from '@taiga-ui/core' +import { TuiScrollbarModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { TuiAutoFocusModule } from '@taiga-ui/cdk' import { NgDompurifyModule } from '@tinkoff/ng-dompurify' import { OSUpdatePage } from './os-update.page' diff --git a/frontend/projects/ui/src/app/common/form/form-array/form-array.component.html b/frontend/projects/ui/src/app/common/form/form-array/form-array.component.html index 25afe7012..d66387fb5 100644 --- a/frontend/projects/ui/src/app/common/form/form-array/form-array.component.html +++ b/frontend/projects/ui/src/app/common/form/form-array/form-array.component.html @@ -48,7 +48,7 @@ tuiIconButton type="button" class="remove" - icon="tuiIconTrash" + iconLeft="tuiIconTrash" appearance="icon" size="m" title="Remove" diff --git a/frontend/projects/ui/src/app/common/form/form-object/form-object.component.html b/frontend/projects/ui/src/app/common/form/form-object/form-object.component.html index 763e4386f..aa9e85f19 100644 --- a/frontend/projects/ui/src/app/common/form/form-object/form-object.component.html +++ b/frontend/projects/ui/src/app/common/form/form-object/form-object.component.html @@ -2,11 +2,11 @@

diff --git a/frontend/projects/ui/src/app/common/form/form-text/form-text.component.html b/frontend/projects/ui/src/app/common/form/form-text/form-text.component.html index e466d16aa..0db900238 100644 --- a/frontend/projects/ui/src/app/common/form/form-text/form-text.component.html +++ b/frontend/projects/ui/src/app/common/form/form-text/form-text.component.html @@ -27,7 +27,7 @@ title="Generate" size="xs" class="button" - icon="tuiIconRefreshCcw" + iconLeft="tuiIconRefreshCcw" (click)="generate()" > diff --git a/frontend/projects/ui/src/app/common/form/form.module.ts b/frontend/projects/ui/src/app/common/form/form.module.ts index 29e63a629..b4cf2756a 100644 --- a/frontend/projects/ui/src/app/common/form/form.module.ts +++ b/frontend/projects/ui/src/app/common/form/form.module.ts @@ -4,7 +4,6 @@ import { FormsModule, ReactiveFormsModule } from '@angular/forms' import { MaskitoModule } from '@maskito/angular' import { TuiMapperPipeModule, TuiValueChangesModule } from '@taiga-ui/cdk' import { - TuiButtonModule, TuiErrorModule, TuiExpandModule, TuiHintModule, @@ -15,6 +14,7 @@ import { TuiTooltipModule, TuiWrapperModule, } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { TuiElasticContainerModule, TuiFieldErrorPipeModule, diff --git a/frontend/projects/ui/src/app/common/os-welcome/os-welcome.module.ts b/frontend/projects/ui/src/app/common/os-welcome/os-welcome.module.ts index 3597aab3e..907d358a6 100644 --- a/frontend/projects/ui/src/app/common/os-welcome/os-welcome.module.ts +++ b/frontend/projects/ui/src/app/common/os-welcome/os-welcome.module.ts @@ -1,5 +1,5 @@ import { NgModule } from '@angular/core' -import { TuiButtonModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { OSWelcomePage } from './os-welcome.page' @NgModule({ diff --git a/frontend/projects/ui/src/app/common/toast-container/toast-container.module.ts b/frontend/projects/ui/src/app/common/toast-container/toast-container.module.ts index 0029ddada..bf24027d3 100644 --- a/frontend/projects/ui/src/app/common/toast-container/toast-container.module.ts +++ b/frontend/projects/ui/src/app/common/toast-container/toast-container.module.ts @@ -2,11 +2,8 @@ import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' import { RouterModule } from '@angular/router' import { TuiAutoFocusModule } from '@taiga-ui/cdk' -import { - TuiAlertModule, - TuiButtonModule, - TuiDialogModule, -} from '@taiga-ui/core' +import { TuiAlertModule, TuiDialogModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' import { ToastContainerComponent } from './toast-container.component' import { NotificationsToastComponent } from './notifications-toast/notifications-toast.component' diff --git a/frontend/projects/ui/src/styles.scss b/frontend/projects/ui/src/styles.scss index 5ee831568..789e4f7df 100644 --- a/frontend/projects/ui/src/styles.scss +++ b/frontend/projects/ui/src/styles.scss @@ -375,6 +375,7 @@ ul { padding: 1px 2rem 3rem; box-sizing: border-box; overflow: auto; + isolation: isolate; // TODO: Theme background: #373a3f; From 40b19c5e67b05216fdf60ad4ad1b1c2553d8308a Mon Sep 17 00:00:00 2001 From: J H <2364004+Blu-J@users.noreply.github.com> Date: Wed, 8 Nov 2023 15:35:08 -0700 Subject: [PATCH 022/169] chore: Remove the long running from the docker --- backend/src/manager/manager_container.rs | 30 ++---- backend/src/manager/mod.rs | 100 +++++++------------- backend/src/manager/persistent_container.rs | 8 +- backend/src/procedure/mod.rs | 2 +- 4 files changed, 44 insertions(+), 96 deletions(-) diff --git a/backend/src/manager/manager_container.rs b/backend/src/manager/manager_container.rs index 32e11c2e5..ba13a652d 100644 --- a/backend/src/manager/manager_container.rs +++ b/backend/src/manager/manager_container.rs @@ -138,7 +138,7 @@ async fn create_service_manager( desired_state: Arc>, seed: Arc, current_state: Arc>, - persistent_container: Arc>, + persistent_container: Arc, ) { let mut desired_state_receiver = desired_state.subscribe(); let mut running_service: Option> = None; @@ -149,23 +149,12 @@ async fn create_service_manager( match (current, desired) { (StartStop::Start, StartStop::Start) => (), (StartStop::Start, StartStop::Stop) => { - if persistent_container.is_none() { - if let Err(err) = seed.stop_container().await { - tracing::error!("Could not stop container"); - tracing::debug!("{:?}", err) - } - running_service = None; - } else if let Some(current_service) = running_service.take() { - tokio::select! { - _ = current_service => (), - _ = tokio::time::sleep(Duration::from_secs_f64(seed.manifest - .containers - .as_ref() - .and_then(|c| c.main.sigterm_timeout).map(|x| x.as_secs_f64()).unwrap_or_default())) => { - tracing::error!("Could not stop service"); - } - } + if let Err(err) = seed.stop_container().await { + tracing::error!("Could not stop container"); + tracing::debug!("{:?}", err) } + running_service = None; + current_state.send_modify(|x| *x = StartStop::Stop); } (StartStop::Stop, StartStop::Start) => starting_service( @@ -243,12 +232,7 @@ fn starting_service( let set_stopped = { move || current_state.send_modify(|x| *x = StartStop::Stop) }; let running_main_loop = async move { while desired_state.borrow().is_start() { - let result = run_main( - seed.clone(), - persistent_container.clone(), - set_running.clone(), - ) - .await; + let result = run_main(seed.clone()).await; set_stopped(); run_main_log_result(result, seed.clone()).await; } diff --git a/backend/src/manager/mod.rs b/backend/src/manager/mod.rs index cf4457b9f..b34e29efb 100644 --- a/backend/src/manager/mod.rs +++ b/backend/src/manager/mod.rs @@ -40,7 +40,7 @@ use crate::procedure::docker::{DockerContainer, DockerProcedure, LongRunning}; use crate::procedure::{NoOutput, ProcedureName}; use crate::s9pk::manifest::Manifest; use crate::status::MainStatus; -use crate::util::docker::{get_container_ip, kill_container}; +use crate::util::docker::get_container_ip; use crate::util::NonDetachingJoinHandle; use crate::volume::Volume; use crate::Error; @@ -61,7 +61,7 @@ use self::manager_seed::ManagerSeed; pub const HEALTH_CHECK_COOLDOWN_SECONDS: u64 = 15; pub const HEALTH_CHECK_GRACE_PERIOD_SECONDS: u64 = 5; -type ManagerPersistentContainer = Arc>; +type ManagerPersistentContainer = Arc; type BackupGuard = Arc>>; pub enum BackupReturn { Error(Error), @@ -221,10 +221,8 @@ impl Manager { } /// Used as a getter, but also used in procedure - pub fn rpc_client(&self) -> Option> { - (*self.persistent_container) - .as_ref() - .map(|x| x.rpc_client()) + pub fn rpc_client(&self) -> Arc { + self.persistent_container.rpc_client() } async fn _transition_abort(&self) { @@ -428,7 +426,7 @@ async fn configure( if !configure_context.dry_run { // run config action let res = action - .set(ctx, id, version, &dependencies, volumes, &config) + .set(ctx, id, version, dependencies, volumes, &config) .await?; // track dependencies with no pointers @@ -462,7 +460,7 @@ async fn configure( } let dependency_config_errs = - compute_dependency_config_errs(&ctx, &db, &manifest, ¤t_dependencies, overrides) + compute_dependency_config_errs(ctx, &db, &manifest, ¤t_dependencies, overrides) .await?; // cache current config for dependents @@ -650,37 +648,14 @@ pub enum OnStop { type RunMainResult = Result, Error>; #[instrument(skip_all)] -async fn run_main( - seed: Arc, - persistent_container: ManagerPersistentContainer, - started: Arc, -) -> RunMainResult { - let mut runtime = NonDetachingJoinHandle::from(tokio::spawn(start_up_image(seed.clone()))); - let ip = match persistent_container.is_some() { - false => Some(match get_running_ip(&seed, &mut runtime).await { - GetRunningIp::Ip(x) => x, - GetRunningIp::Error(e) => return Err(e), - GetRunningIp::EarlyExit(x) => return Ok(x), - }), - true => None, - }; - - let svc = if let Some(ip) = ip { - let net = add_network_for_main(&seed, ip).await?; - started(); - Some(net) - } else { - None - }; +async fn run_main(seed: Arc) -> RunMainResult { + let runtime = NonDetachingJoinHandle::from(tokio::spawn(start_up_image(seed.clone()))); let health = main_health_check_daemon(seed.clone()); let res = tokio::select! { a = runtime => a.map_err(|_| Error::new(eyre!("Manager runtime panicked!"), crate::ErrorKind::Docker)).and_then(|a| a), _ = health => Err(Error::new(eyre!("Health check daemon exited!"), crate::ErrorKind::Unknown)) }; - if let Some(svc) = svc { - remove_network_for_main(svc).await?; - } res } @@ -847,41 +822,30 @@ async fn send_signal(manager: &Manager, gid: Arc, signal: Signal) -> Result // .commit_health_check_results // .store(false, Ordering::SeqCst); - if let Some(rpc_client) = manager.rpc_client() { - let main_gid = *gid.main_gid.0.borrow(); - let next_gid = gid.new_gid(); - #[cfg(feature = "js_engine")] - if let Err(e) = crate::procedure::js_scripts::JsProcedure::default() - .execute::<_, NoOutput>( - &manager.seed.ctx.datadir, - &manager.seed.manifest.id, - &manager.seed.manifest.version, - ProcedureName::Signal, - &manager.seed.manifest.volumes, - Some(embassy_container_init::SignalGroupParams { - gid: main_gid, - signal: signal as u32, - }), - None, // TODO - next_gid, - Some(rpc_client), - ) - .await? - { - tracing::error!("Failed to send js signal: {}", e.1); - tracing::debug!("{:?}", e); - } - } else { - // send signal to container - kill_container(&manager.seed.container_name, Some(signal)) - .await - .or_else(|e| { - if e.kind == ErrorKind::NotFound { - Ok(()) - } else { - Err(e) - } - })?; + let rpc_client = manager.rpc_client(); + + let main_gid = *gid.main_gid.0.borrow(); + let next_gid = gid.new_gid(); + #[cfg(feature = "js_engine")] + if let Err(e) = crate::procedure::js_scripts::JsProcedure::default() + .execute::<_, NoOutput>( + &manager.seed.ctx.datadir, + &manager.seed.manifest.id, + &manager.seed.manifest.version, + ProcedureName::Signal, + &manager.seed.manifest.volumes, + Some(embassy_container_init::SignalGroupParams { + gid: main_gid, + signal: signal as u32, + }), + None, // TODO + next_gid, + Some(rpc_client), + ) + .await? + { + tracing::error!("Failed to send js signal: {}", e.1); + tracing::debug!("{:?}", e); } Ok(()) diff --git a/backend/src/manager/persistent_container.rs b/backend/src/manager/persistent_container.rs index d9868a622..da51f6ea0 100644 --- a/backend/src/manager/persistent_container.rs +++ b/backend/src/manager/persistent_container.rs @@ -25,16 +25,16 @@ pub struct PersistentContainer { impl PersistentContainer { #[instrument(skip_all)] - pub async fn init(seed: &Arc) -> Result, Error> { + pub async fn init(seed: &Arc) -> Result { Ok(if let Some(containers) = &seed.manifest.containers { let (running_docker, rpc_client) = spawn_persistent_container(seed.clone(), containers.main.clone()).await?; - Some(Self { + Self { _running_docker: running_docker, rpc_client, - }) + } } else { - None + todo!("No containers in manifest") }) } diff --git a/backend/src/procedure/mod.rs b/backend/src/procedure/mod.rs index 62f4de9cf..02449a076 100644 --- a/backend/src/procedure/mod.rs +++ b/backend/src/procedure/mod.rs @@ -109,7 +109,7 @@ impl PackageProcedure { input, timeout, gid, - rpc_client, + Some(rpc_client), ) .await } From 18cd6c81a3686807004d5cf3f9ae797e5c2774bb Mon Sep 17 00:00:00 2001 From: J H <2364004+Blu-J@users.noreply.github.com> Date: Wed, 8 Nov 2023 15:53:29 -0700 Subject: [PATCH 023/169] chore: Make sure the test is testing something is correct shape --- backend/src/procedure/mod.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/src/procedure/mod.rs b/backend/src/procedure/mod.rs index 02449a076..7c02a03d5 100644 --- a/backend/src/procedure/mod.rs +++ b/backend/src/procedure/mod.rs @@ -179,5 +179,7 @@ impl<'de> Deserialize<'de> for NoOutput { #[test] fn test_deser_no_output() { serde_json::from_str::("").unwrap(); - serde_json::from_str::>("{\"Ok\": null}").unwrap(); + serde_json::from_str::>("{\"Ok\": null}") + .unwrap() + .unwrap(); } From b5da076e2cf7e7b17f1d65052b1681b77e7a4156 Mon Sep 17 00:00:00 2001 From: J H <2364004+Blu-J@users.noreply.github.com> Date: Wed, 8 Nov 2023 17:19:30 -0700 Subject: [PATCH 024/169] chore: Add in some modifications to make the sandboxed and execute in the container --- backend/src/manager/manager_container.rs | 12 ++- backend/src/manager/persistent_container.rs | 84 ++++++++++++++++++++- 2 files changed, 86 insertions(+), 10 deletions(-) diff --git a/backend/src/manager/manager_container.rs b/backend/src/manager/manager_container.rs index ba13a652d..00937fc5c 100644 --- a/backend/src/manager/manager_container.rs +++ b/backend/src/manager/manager_container.rs @@ -223,16 +223,14 @@ fn starting_service( persistent_container: ManagerPersistentContainer, running_service: &mut Option>, ) { - let set_running = { - let current_state = current_state.clone(); - Arc::new(move || { - current_state.send_modify(|x| *x = StartStop::Start); - }) - }; let set_stopped = { move || current_state.send_modify(|x| *x = StartStop::Stop) }; let running_main_loop = async move { while desired_state.borrow().is_start() { - let result = run_main(seed.clone()).await; + let result = persistent_container + .execute(models::ProcedureName::Main, Value::Null, None) + .await; + + run_main(seed.clone()).await; set_stopped(); run_main_log_result(result, seed.clone()).await; } diff --git a/backend/src/manager/persistent_container.rs b/backend/src/manager/persistent_container.rs index da51f6ea0..0753a9bb4 100644 --- a/backend/src/manager/persistent_container.rs +++ b/backend/src/manager/persistent_container.rs @@ -3,8 +3,10 @@ use std::time::Duration; use color_eyre::eyre::eyre; use helpers::UnixRpcClient; -use tokio::sync::oneshot; +use models::ProcedureName; +use serde::de::DeserializeOwned; use tokio::sync::watch::{self, Receiver}; +use tokio::sync::{oneshot, Mutex}; use tracing::instrument; use super::manager_seed::ManagerSeed; @@ -12,15 +14,20 @@ use super::{ add_network_for_main, get_long_running_ip, long_running_docker, remove_network_for_main, GetRunningIp, }; +use crate::prelude::*; use crate::procedure::docker::DockerContainer; use crate::util::NonDetachingJoinHandle; -use crate::Error; + +struct ProcedureId(u64); /// Persistant container are the old containers that need to run all the time /// The goal is that all services will be persistent containers, waiting to run the main system. pub struct PersistentContainer { _running_docker: NonDetachingJoinHandle<()>, + // TODO: Drb: Implement to spec https://github.com/Start9Labs/start-sdk/blob/master/lib/types.ts#L223 pub rpc_client: Receiver>, + manager_seed: Arc, + procedures: Mutex>, } impl PersistentContainer { @@ -32,15 +39,86 @@ impl PersistentContainer { Self { _running_docker: running_docker, rpc_client, + manager_seed: seed.clone(), + procedures: Default::default(), } } else { - todo!("No containers in manifest") + todo!("DRB No containers in manifest") }) } pub fn rpc_client(&self) -> Arc { self.rpc_client.borrow().clone() } + + pub async fn execute( + &self, + name: ProcedureName, + input: Value, + timeout: Option, + ) -> Result, Error> + where + O: DeserializeOwned, + { + match self._execute(name, input, timeout).await { + Ok(Ok(a)) => Ok(Ok(imbl_value::from_value(a).map_err(|e| { + Error::new( + eyre!("Error deserializing output: {}", e), + crate::ErrorKind::Deserialization, + ) + })?)), + Ok(Err(e)) => Ok(Err(e)), + Err(e) => Err(e), + } + } + pub async fn sanboxed( + &self, + name: ProcedureName, + input: Value, + timeout: Option, + ) -> Result, Error> + where + O: DeserializeOwned, + { + match self._sandboxed(name, input, timeout).await { + Ok(Ok(a)) => Ok(Ok(imbl_value::from_value(a).map_err(|e| { + Error::new( + eyre!("Error deserializing output: {}", e), + crate::ErrorKind::Deserialization, + ) + })?)), + Ok(Err(e)) => Ok(Err(e)), + Err(e) => Err(e), + } + } + async fn _execute( + &self, + name: ProcedureName, + input: Value, + timeout: Option, + ) -> Result, Error> { + todo!( + r#""" + DRB + Call into the persistant via rpc, start a procedure. + Procedure already has access to rpc to call back, maybe an id to track? + Should be able to cancel. + Note(Main): Only one should be running at a time + Note(Main): Has additional effect of setRunning + Note: The input (Option) is not generic because we don't want to clone this fn for each type of input + Note: The output is not generic because we don't want to clone this fn for each type of output + """# + ) + } + + async fn _sandboxed( + &self, + name: ProcedureName, + input: Value, + timeout: Option, + ) -> Result, Error> { + todo!("DRB") + } } pub async fn spawn_persistent_container( From c491dfdd3a0d47e8aff1f16827fa94a96aade2e3 Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Thu, 9 Nov 2023 23:23:58 +0400 Subject: [PATCH 025/169] feat: use routes for service sections (#2502) * feat: use routes for service sections * chore: fix comment --- .../components/card/card.component.html | 2 +- .../navigation/navigation.component.html | 3 +- .../navigation/navigation.component.ts | 6 +- ...-desktop-item.ts => to-navigation-item.ts} | 8 +- .../routes/desktop/desktop.component.html | 8 +- .../portal/routes/desktop/desktop.module.ts | 4 +- .../service/components/actions.component.ts | 2 +- .../components/additional-item.component.ts | 47 ++++++ .../components/additional.component.ts | 56 +++----- .../components/dependencies.component.ts | 24 ++++ .../components/health-checks.component.ts | 32 +++++ .../service/components/interface.component.ts | 2 +- .../components/interfaces.component.ts | 42 ++++++ .../service/components/menu-item.component.ts | 25 ++++ .../service/components/menu.component.ts | 49 +++++-- .../service/components/status.component.ts | 9 ++ .../service/pipes/interface-info.pipe.ts | 26 +--- .../service/pipes/to-dependencies.pipe.ts | 47 +++--- .../routes/service/pipes/to-menu.pipe.ts | 21 +-- .../{modals => routes}/actions.component.ts | 43 +++--- .../{modals => routes}/interface.component.ts | 22 +-- .../{modals => routes}/logs.component.ts | 20 ++- .../routes/service/routes/outlet.component.ts | 86 +++++++++++ .../service/routes/service.component.ts | 134 ++++++++++++++++++ .../routes/service/service.component.html | 106 -------------- .../routes/service/service.component.scss | 15 -- .../routes/service/service.component.ts | 100 ------------- .../portal/routes/service/service.module.ts | 79 +++++------ .../portal/routes/service/utils/update-tab.ts | 9 ++ .../system/sideload/package.component.ts | 3 +- .../portal/routes/system/system.module.ts | 16 +-- .../portal/services/navigation.service.ts | 30 +++- ...-desktop-item.ts => to-navigation-item.ts} | 2 +- .../services/app-show/app-show.module.ts | 2 +- 34 files changed, 637 insertions(+), 443 deletions(-) rename frontend/projects/ui/src/app/apps/portal/pipes/{to-desktop-item.ts => to-navigation-item.ts} (61%) create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/components/additional-item.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/components/dependencies.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/components/health-checks.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/components/interfaces.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/components/menu-item.component.ts rename frontend/projects/ui/src/app/apps/portal/routes/service/{modals => routes}/actions.component.ts (82%) rename frontend/projects/ui/src/app/apps/portal/routes/service/{modals => routes}/interface.component.ts (67%) rename frontend/projects/ui/src/app/apps/portal/routes/service/{modals => routes}/logs.component.ts (67%) create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/routes/outlet.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/routes/service.component.ts delete mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/service.component.html delete mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/service.component.scss delete mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/service.component.ts create mode 100644 frontend/projects/ui/src/app/apps/portal/routes/service/utils/update-tab.ts rename frontend/projects/ui/src/app/apps/portal/utils/{to-desktop-item.ts => to-navigation-item.ts} (94%) diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html index 17f8fe9f2..d0dd4ff08 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html +++ b/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html @@ -4,7 +4,7 @@ {{ badge }} diff --git a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html index 4b9705b98..a098c17c7 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html +++ b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html @@ -11,7 +11,6 @@ #rla="routerLinkActive" class="tab" routerLinkActive="tab_active" - [routerLinkActiveOptions]="{ exact: true }" [routerLink]="tab.routerLink" > Close diff --git a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.ts b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.ts index c702b9816..c34a5ac4b 100644 --- a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.ts @@ -20,9 +20,9 @@ export class NavigationComponent { readonly tabs$ = this.navigation.getTabs() - removeTab(tab: NavigationItem, active: boolean) { - this.navigation.removeTab(tab) + removeTab(routerLink: string, active: boolean) { + this.navigation.removeTab(routerLink) - if (active) this.router.navigate(['./portal/desktop']) + if (active) this.router.navigate(['/portal/desktop']) } } diff --git a/frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-item.ts b/frontend/projects/ui/src/app/apps/portal/pipes/to-navigation-item.ts similarity index 61% rename from frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-item.ts rename to frontend/projects/ui/src/app/apps/portal/pipes/to-navigation-item.ts index f3204b58a..39d1d91c7 100644 --- a/frontend/projects/ui/src/app/apps/portal/pipes/to-desktop-item.ts +++ b/frontend/projects/ui/src/app/apps/portal/pipes/to-navigation-item.ts @@ -1,17 +1,17 @@ import { Pipe, PipeTransform } from '@angular/core' import { PackageDataEntry } from 'src/app/services/patch-db/data-model' import { NavigationItem } from '../types/navigation-item' -import { toDesktopItem } from '../utils/to-desktop-item' +import { toNavigationItem } from '../utils/to-navigation-item' @Pipe({ - name: 'toDesktopItem', + name: 'toNavigationItem', standalone: true, }) -export class ToDesktopItemPipe implements PipeTransform { +export class ToNavigationItemPipe implements PipeTransform { transform( packages: Record, id: string, ): NavigationItem | null { - return id ? toDesktopItem(id, packages) : null + return id ? toNavigationItem(id, packages) : null } } diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html index a4016fe29..4b993c6c5 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html @@ -28,15 +28,15 @@ [desktopItem]="item" > diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts index 6354bc61c..a68955baf 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts @@ -7,7 +7,7 @@ import { TuiFadeModule } from '@taiga-ui/experimental' import { TuiTilesModule } from '@taiga-ui/kit' import { DesktopComponent } from './desktop.component' import { CardComponent } from '../../components/card/card.component' -import { ToDesktopItemPipe } from '../../pipes/to-desktop-item' +import { ToNavigationItemPipe } from '../../pipes/to-navigation-item' import { ToNotificationsPipe } from '../../pipes/to-notifications' import { DesktopItemDirective } from './desktop-item.directive' @@ -26,7 +26,7 @@ const ROUTES: Routes = [ TuiSvgModule, TuiLoaderModule, TuiTilesModule, - ToDesktopItemPipe, + ToNavigationItemPipe, RouterModule.forChild(ROUTES), TuiFadeModule, DragScrollerDirective, diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/actions.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/actions.component.ts index 8016e382f..234e5ac90 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/service/components/actions.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/actions.component.ts @@ -119,7 +119,7 @@ export class ServiceActionsComponent { } async tryStart(): Promise { - if (this.dependencies.transform(this.service).some(d => !!d.errorText)) { + if (this.dependencies.transform(this.service)?.some(d => !!d.errorText)) { const depErrMsg = `${this.service.manifest.title} has unmet dependencies. It will not work as expected.` const proceed = await this.presentAlertStart(depErrMsg) diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/additional-item.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/additional-item.component.ts new file mode 100644 index 000000000..f4e60de41 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/additional-item.component.ts @@ -0,0 +1,47 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, Input } from '@angular/core' +import { TuiSvgModule } from '@taiga-ui/core' +import { AdditionalItem, FALLBACK_URL } from '../pipes/to-additional.pipe' + +@Component({ + selector: '[additionalItem]', + template: ` +
+ {{ additionalItem.name }} +
{{ additionalItem.description }}
+
+ + `, + styles: [ + ` + :host._disabled { + pointer-events: none; + opacity: var(--tui-disabled-opacity); + } + `, + ], + host: { + rel: 'noreferrer', + target: '_blank', + '[class._disabled]': 'disabled', + '[attr.href]': + 'additionalItem.description.startsWith("http") ? additionalItem.description : null', + }, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, TuiSvgModule], +}) +export class ServiceAdditionalItemComponent { + @Input({ required: true }) + additionalItem!: AdditionalItem + + get disabled(): boolean { + return this.additionalItem.description === FALLBACK_URL + } + + get icon(): string | undefined { + return this.additionalItem.description.startsWith('http') + ? 'tuiIconExternalLinkLarge' + : this.additionalItem.icon + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/additional.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/additional.component.ts index 9b74fcba3..db233569d 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/service/components/additional.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/additional.component.ts @@ -1,46 +1,34 @@ import { CommonModule } from '@angular/common' import { ChangeDetectionStrategy, Component, Input } from '@angular/core' -import { TuiSvgModule } from '@taiga-ui/core' -import { AdditionalItem, FALLBACK_URL } from '../pipes/to-additional.pipe' +import { PackageDataEntry } from 'src/app/services/patch-db/data-model' +import { ToAdditionalPipe } from '../pipes/to-additional.pipe' +import { ServiceAdditionalItemComponent } from './additional-item.component' @Component({ - selector: '[additional]', + selector: 'service-additional', template: ` -
- {{ additional.name }} -
{{ additional.description }}
-
- +

Additional Info

+ + + + + + `, - styles: [ - ` - :host._disabled { - pointer-events: none; - opacity: var(--tui-disabled-opacity); - } - `, - ], - host: { - '[attr.href]': 'additional.description', - '[class._disabled]': 'disabled', - target: '_blank', - rel: 'noreferrer', - }, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, - imports: [CommonModule, TuiSvgModule], + imports: [CommonModule, ToAdditionalPipe, ServiceAdditionalItemComponent], }) export class ServiceAdditionalComponent { @Input({ required: true }) - additional!: AdditionalItem - - get disabled(): boolean { - return this.additional.description === FALLBACK_URL - } - - get icon(): string | undefined { - return this.additional.description.startsWith('http') - ? 'tuiIconExternalLinkLarge' - : this.additional.icon - } + service!: PackageDataEntry } diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/dependencies.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/dependencies.component.ts new file mode 100644 index 000000000..d735d5398 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/dependencies.component.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, Input } from '@angular/core' +import { ServiceDependencyComponent } from './dependency.component' +import { DependencyInfo } from '../types/dependency-info' + +@Component({ + selector: 'service-dependencies', + template: ` +

Dependencies

+ + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, ServiceDependencyComponent], +}) +export class ServiceDependenciesComponent { + @Input({ required: true }) + dependencies: readonly DependencyInfo[] = [] +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/health-checks.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/health-checks.component.ts new file mode 100644 index 000000000..54928a408 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/health-checks.component.ts @@ -0,0 +1,32 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + inject, + Input, +} from '@angular/core' +import { HealthCheckResult } from 'src/app/services/patch-db/data-model' +import { ConnectionService } from 'src/app/services/connection.service' +import { ServiceHealthCheckComponent } from './health-check.component' + +@Component({ + selector: 'service-health-checks', + template: ` +

Health Checks

+ + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, ServiceHealthCheckComponent], +}) +export class ServiceHealthChecksComponent { + @Input({ required: true }) + checks: readonly HealthCheckResult[] = [] + + readonly connected$ = inject(ConnectionService).connected$ +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/interface.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/interface.component.ts index 2b39eb027..45ded6d6d 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/service/components/interface.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/interface.component.ts @@ -12,7 +12,7 @@ import { InterfaceInfo } from 'src/app/services/patch-db/data-model' import { ExtendedInterfaceInfo } from '../pipes/interface-info.pipe' @Component({ - selector: 'button[serviceInterface]', + selector: 'a[serviceInterface]', template: `
diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/interfaces.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/interfaces.component.ts new file mode 100644 index 000000000..f70261748 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/interfaces.component.ts @@ -0,0 +1,42 @@ +import { NgForOf } from '@angular/common' +import { ChangeDetectionStrategy, Component, Input } from '@angular/core' +import { PackageDataEntry } from 'src/app/services/patch-db/data-model' +import { + PackageStatus, + PrimaryStatus, +} from 'src/app/services/pkg-status-rendering.service' +import { InterfaceInfoPipe } from '../pipes/interface-info.pipe' +import { ToStatusPipe } from '../pipes/to-status.pipe' +import { ServiceInterfaceComponent } from './interface.component' +import { RouterLink } from '@angular/router' + +@Component({ + selector: 'service-interfaces', + template: ` +

Interfaces

+ + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + NgForOf, + RouterLink, + InterfaceInfoPipe, + ServiceInterfaceComponent, + ToStatusPipe, + ], +}) +export class ServiceInterfacesComponent { + @Input({ required: true }) + service!: PackageDataEntry + + isRunning({ primary }: PackageStatus): boolean { + return primary === PrimaryStatus.Running + } +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/menu-item.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/menu-item.component.ts new file mode 100644 index 000000000..6f6503f6f --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/menu-item.component.ts @@ -0,0 +1,25 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core' +import { TuiSvgModule } from '@taiga-ui/core' +import { ServiceMenu } from '../pipes/to-menu.pipe' + +@Component({ + selector: '[serviceMenuItem]', + template: ` + +
+ {{ menu.name }} +
+ {{ menu.description }} + +
+
+ + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [TuiSvgModule], +}) +export class ServiceMenuItemComponent { + @Input({ required: true, alias: 'serviceMenuItem' }) + menu!: ServiceMenu +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/menu.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/menu.component.ts index a227d4a6f..cc0fef09e 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/service/components/menu.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/menu.component.ts @@ -1,25 +1,46 @@ +import { CommonModule } from '@angular/common' import { ChangeDetectionStrategy, Component, Input } from '@angular/core' -import { TuiSvgModule } from '@taiga-ui/core' -import { ServiceMenu } from '../pipes/to-menu.pipe' +import { PackageDataEntry } from 'src/app/services/patch-db/data-model' +import { ToMenuPipe } from '../pipes/to-menu.pipe' +import { ServiceMenuItemComponent } from './menu-item.component' @Component({ - selector: '[serviceMenu]', + selector: 'service-menu', template: ` - -
- {{ menu.name }} -
- {{ menu.description }} - +

Menu

+
- + `, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, - imports: [TuiSvgModule], + imports: [CommonModule, ToMenuPipe, ServiceMenuItemComponent], }) export class ServiceMenuComponent { - @Input({ required: true, alias: 'serviceMenu' }) - menu!: ServiceMenu + @Input({ required: true }) + service!: PackageDataEntry + + get color(): string { + return this.service.installed?.outboundProxy + ? 'var(--tui-success-fill)' + : 'var(--tui-warning-fill)' + } + + get proxy(): string { + switch (this.service.installed?.outboundProxy) { + case 'primary': + return 'System Primary' + case 'mirror': + return 'Mirror P2P' + default: + return this.service.installed?.outboundProxy?.proxyId || 'None' + } + } } diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts index 59eb44e8b..a636fbc68 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts @@ -24,6 +24,15 @@ import { InstallProgressPipeModule } from 'src/app/common/install-progress/insta `, + styles: [ + ` + :host { + font-size: x-large; + margin: 1em 0; + display: block; + } + `, + ], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, InstallProgressPipeModule], diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/interface-info.pipe.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/interface-info.pipe.ts index 8ab557b2b..cc1d793dc 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/interface-info.pipe.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/interface-info.pipe.ts @@ -1,18 +1,15 @@ -import { inject, Pipe, PipeTransform } from '@angular/core' -import { TuiDialogService } from '@taiga-ui/core' -import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' +import { Pipe, PipeTransform } from '@angular/core' import { InterfaceInfo, PackageDataEntry, } from 'src/app/services/patch-db/data-model' -import { ServiceInterfaceModal } from '../modals/interface.component' export interface ExtendedInterfaceInfo extends InterfaceInfo { id: string icon: string color: string typeDetail: string - action: () => void + routerLink: string } @Pipe({ @@ -20,12 +17,7 @@ export interface ExtendedInterfaceInfo extends InterfaceInfo { standalone: true, }) export class InterfaceInfoPipe implements PipeTransform { - private readonly dialogs = inject(TuiDialogService) - - transform({ - manifest, - installed, - }: PackageDataEntry): ExtendedInterfaceInfo[] { + transform({ installed }: PackageDataEntry): ExtendedInterfaceInfo[] { return Object.entries(installed!.interfaceInfo).map(([id, val]) => { let color: string let icon: string @@ -60,17 +52,7 @@ export class InterfaceInfoPipe implements PipeTransform { color, icon, typeDetail, - action: () => - this.dialogs - .open(new PolymorpheusComponent(ServiceInterfaceModal), { - label: val.name, - size: 'l', - data: { - packageId: manifest.id, - interfaceId: id, - }, - }) - .subscribe(), + routerLink: `./interface/${id}`, } }) } diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-dependencies.pipe.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-dependencies.pipe.ts index c0951d6d6..9e575e9ba 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-dependencies.pipe.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-dependencies.pipe.ts @@ -10,6 +10,8 @@ import { FormDialogService } from 'src/app/services/form-dialog.service' import { ServiceConfigModal } from '../modals/config.component' import { DependencyInfo } from '../types/dependency-info' import { PackageConfigData } from '../types/package-config-data' +import { NavigationService } from '../../../services/navigation.service' +import { toRouterLink } from '../../../utils/to-router-link' @Pipe({ name: 'toDependencies', @@ -19,23 +21,32 @@ export class ToDependenciesPipe implements PipeTransform { constructor( private readonly router: Router, private readonly formDialog: FormDialogService, + private readonly navigation: NavigationService, ) {} - transform(pkg: PackageDataEntry): DependencyInfo[] { - if (!pkg.installed) return [] + transform(pkg: PackageDataEntry): DependencyInfo[] | null { + if (!pkg.installed) return null - return Object.keys(pkg.installed['current-dependencies']) - .filter(depId => !!pkg.manifest.dependencies[depId]) + const deps = Object.keys(pkg.installed['current-dependencies']) + .filter(depId => pkg.manifest.dependencies[depId]) .map(depId => this.setDepValues(pkg, depId)) + + return deps.length ? deps : null } - private setDepValues(pkg: PackageDataEntry, depId: string): DependencyInfo { + private setDepValues(pkg: PackageDataEntry, id: string): DependencyInfo { + const error = pkg.installed!.status['dependency-errors'][id] + const depInfo = pkg.installed!['dependency-info'][id] + const version = pkg.manifest.dependencies[id].version + const title = depInfo?.title || id + const icon = depInfo?.icon || '' + let errorText = '' let actionText = 'View' - let action = (): unknown => - this.router.navigate([`portal`, `service`, depId]) - - const error = pkg.installed!.status['dependency-errors'][depId] + let action = () => { + this.navigation.addTab({ icon, title, routerLink: toRouterLink(id) }) + this.router.navigate([`portal`, `service`, id]) + } if (error) { // health checks failed @@ -45,12 +56,12 @@ export class ToDependenciesPipe implements PipeTransform { } else if (error.type === DependencyErrorType.NotInstalled) { errorText = 'Not installed' actionText = 'Install' - action = () => this.fixDep(pkg, 'install', depId) + action = () => this.fixDep(pkg, 'install', id) // incorrect version } else if (error.type === DependencyErrorType.IncorrectVersion) { errorText = 'Incorrect version' actionText = 'Update' - action = () => this.fixDep(pkg, 'update', depId) + action = () => this.fixDep(pkg, 'update', id) // not running } else if (error.type === DependencyErrorType.NotRunning) { errorText = 'Not running' @@ -59,24 +70,14 @@ export class ToDependenciesPipe implements PipeTransform { } else if (error.type === DependencyErrorType.ConfigUnsatisfied) { errorText = 'Config not satisfied' actionText = 'Auto config' - action = () => this.fixDep(pkg, 'configure', depId) + action = () => this.fixDep(pkg, 'configure', id) } else if (error.type === DependencyErrorType.Transitive) { errorText = 'Dependency has a dependency issue' } errorText = `${errorText}. ${pkg.manifest.title} will not work as expected.` } - const depInfo = pkg.installed!['dependency-info'][depId] - - return { - id: depId, - version: pkg.manifest.dependencies[depId].version, - title: depInfo?.title || depId, - icon: depInfo?.icon || '', - errorText, - actionText, - action, - } + return { id, icon, title, version, errorText, actionText, action } } async fixDep( diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-menu.pipe.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-menu.pipe.ts index 133269fad..b1110eb5d 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-menu.pipe.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-menu.pipe.ts @@ -14,9 +14,7 @@ import { FormDialogService } from 'src/app/services/form-dialog.service' import { ProxyService } from 'src/app/services/proxy.service' import { PackageConfigData } from '../types/package-config-data' import { ServiceConfigModal } from '../modals/config.component' -import { ServiceLogsModal } from '../modals/logs.component' import { ServiceCredentialsModal } from '../modals/credentials.component' -import { ServiceActionsModal } from '../modals/actions.component' export interface ServiceMenu { icon: string @@ -29,7 +27,7 @@ export interface ServiceMenu { name: 'toMenu', standalone: true, }) -export class ToMenusPipe implements PipeTransform { +export class ToMenuPipe implements PipeTransform { private readonly api = inject(ApiService) private readonly dialogs = inject(TuiDialogService) private readonly formDialog = inject(FormDialogService) @@ -69,11 +67,9 @@ export class ToMenusPipe implements PipeTransform { name: 'Actions', description: `Uninstall and other commands specific to ${manifest.title}`, action: () => - this.showDialog( - `${manifest.title} credentials`, - manifest.id, - ServiceActionsModal, - ), + this.router.navigate(['actions'], { + relativeTo: this.route, + }), }, { icon: 'tuiIconShieldLarge', @@ -86,11 +82,9 @@ export class ToMenusPipe implements PipeTransform { name: 'Logs', description: `Raw, unfiltered logs`, action: () => - this.showDialog( - `${manifest.title} logs`, - manifest.id, - ServiceLogsModal, - ), + this.router.navigate(['logs'], { + relativeTo: this.route, + }), }, url ? { @@ -99,7 +93,6 @@ export class ToMenusPipe implements PipeTransform { description: `View ${manifest.title} on the Marketplace`, action: () => this.router.navigate(['marketplace', manifest.id], { - relativeTo: this.route, queryParams: { url }, }), } diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/modals/actions.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/routes/actions.component.ts similarity index 82% rename from frontend/projects/ui/src/app/apps/portal/routes/service/modals/actions.component.ts rename to frontend/projects/ui/src/app/apps/portal/routes/service/routes/actions.component.ts index cae649863..2529d8535 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/service/modals/actions.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/routes/actions.component.ts @@ -1,18 +1,16 @@ import { CommonModule } from '@angular/common' -import { ChangeDetectionStrategy, Component, Inject } from '@angular/core' -import { Router } from '@angular/router' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { ActivatedRoute, Router } from '@angular/router' import { isEmptyObject, WithId, ErrorService, LoadingService, + getPkgId, } from '@start9labs/shared' -import { TuiDialogContext, TuiDialogService } from '@taiga-ui/core' +import { TuiDialogService } from '@taiga-ui/core' import { TUI_PROMPT } from '@taiga-ui/kit' -import { - POLYMORPHEUS_CONTEXT, - PolymorpheusComponent, -} from '@tinkoff/ng-polymorpheus' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' import { PatchDB } from 'patch-db-client' import { filter, switchMap, timer } from 'rxjs' import { ApiService } from 'src/app/services/api/embassy-api.service' @@ -27,7 +25,11 @@ import { FormDialogService } from 'src/app/services/form-dialog.service' import { FormPage } from 'src/app/apps/ui/modals/form/form.page' import { ServiceActionComponent } from '../components/action.component' import { ServiceActionSuccessComponent } from '../components/action-success.component' +import { DesktopService } from '../../../services/desktop.service' import { GroupActionsPipe } from '../pipes/group-actions.pipe' +import { updateTab } from '../utils/update-tab' +import { NavigationService } from '../../../services/navigation.service' +import { toRouterLink } from '../../../utils/to-router-link' @Component({ template: ` @@ -41,7 +43,9 @@ import { GroupActionsPipe } from '../pipes/group-actions.pipe' > -

Actions for {{ pkg.manifest.title }}

+

+ Actions for {{ pkg.manifest.title }} +

- - - -
-

Health Checks

- -
-
- - -
-

Dependencies

- -
-
- -
-

Menu

- -
- -
-

Additional Info

- - - - - - -
- - - - - diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.scss b/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.scss deleted file mode 100644 index 913a5907f..000000000 --- a/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.scss +++ /dev/null @@ -1,15 +0,0 @@ -@import '@taiga-ui/core/styles/taiga-ui-local'; - -.status { - font-size: x-large; - margin: 1em 0; - display: block; -} - -.g-action_static { - cursor: default; - - &:hover { - background: transparent; - } -} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.ts deleted file mode 100644 index 2a49413ba..000000000 --- a/frontend/projects/ui/src/app/apps/portal/routes/service/service.component.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { ChangeDetectionStrategy, Component, inject } from '@angular/core' -import { ActivatedRoute, Router } from '@angular/router' -import { getPkgId, isEmptyObject } from '@start9labs/shared' -import { PatchDB } from 'patch-db-client' -import { map, Observable, tap } from 'rxjs' -import { - DataModel, - HealthCheckResult, - PackageDataEntry, - PackageState, - ServiceOutboundProxy, -} from 'src/app/services/patch-db/data-model' -import { - PackageStatus, - PrimaryRendering, - PrimaryStatus, - StatusRendering, -} from 'src/app/services/pkg-status-rendering.service' -import { ConnectionService } from 'src/app/services/connection.service' -import { NavigationService } from '../../services/navigation.service' -import { toRouterLink } from '../../utils/to-router-link' - -const STATES = [ - PackageState.Installing, - PackageState.Updating, - PackageState.Restoring, -] - -@Component({ - templateUrl: 'service.component.html', - styleUrls: ['service.component.scss'], - host: { class: 'g-page' }, - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class ServiceComponent { - private readonly route = inject(ActivatedRoute) - private readonly router = inject(Router) - private readonly navigation = inject(NavigationService) - private readonly patch = inject(PatchDB) - - readonly pkgId = getPkgId(this.route) - - readonly connected$ = inject(ConnectionService).connected$ - - readonly service$ = this.patch.watch$('package-data', this.pkgId).pipe( - tap(pkg => { - // if package disappears, navigate to list page - if (!pkg) { - this.router.navigate(['..'], { relativeTo: this.route }) - } else { - this.navigation.addTab({ - icon: pkg.icon, - title: pkg.manifest.title, - routerLink: toRouterLink(pkg.manifest.id), - }) - } - }), - ) - - readonly health$: Observable = this.patch - .watch$('package-data', this.pkgId, 'installed', 'status', 'main') - .pipe( - map(main => - main.status !== 'running' || isEmptyObject(main.health) - ? null - : Object.values(main.health), - ), - ) - - getRendering({ primary }: PackageStatus): StatusRendering { - return PrimaryRendering[primary] - } - - isInstalled({ state }: PackageDataEntry): boolean { - return state === PackageState.Installed - } - - isRunning({ primary }: PackageStatus): boolean { - return primary === PrimaryStatus.Running - } - - isBackingUp({ primary }: PackageStatus): boolean { - return primary === PrimaryStatus.BackingUp - } - - showProgress({ state }: PackageDataEntry): boolean { - return STATES.includes(state) - } - - getProxy(proxy?: ServiceOutboundProxy): string { - switch (proxy) { - case 'primary': - return 'System Primary' - case 'mirror': - return 'Mirror P2P' - default: - return proxy?.proxyId || 'None' - } - } -} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/service.module.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/service.module.ts index f4cb13244..fb2d6b8a1 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/service/service.module.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/service.module.ts @@ -1,56 +1,43 @@ -import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' import { RouterModule, Routes } from '@angular/router' -import { TuiLetModule } from '@taiga-ui/cdk' -import { ServiceComponent } from './service.component' -import { ServiceProgressComponent } from './components/progress.component' -import { ServiceStatusComponent } from './components/status.component' -import { ServiceActionsComponent } from './components/actions.component' -import { ServiceInterfaceComponent } from './components/interface.component' -import { ServiceHealthCheckComponent } from './components/health-check.component' -import { ServiceDependencyComponent } from './components/dependency.component' -import { ServiceMenuComponent } from './components/menu.component' -import { ServiceAdditionalComponent } from './components/additional.component' - -import { ProgressDataPipe } from './pipes/progress-data.pipe' -import { ToDependenciesPipe } from './pipes/to-dependencies.pipe' -import { ToStatusPipe } from './pipes/to-status.pipe' -import { InterfaceInfoPipe } from './pipes/interface-info.pipe' -import { ToMenusPipe } from './pipes/to-menu.pipe' -import { ToAdditionalPipe } from './pipes/to-additional.pipe' +import { ServiceOutletComponent } from './routes/outlet.component' +import { ServiceRoute } from './routes/service.component' const ROUTES: Routes = [ { - path: ':pkgId', - component: ServiceComponent, + path: '', + component: ServiceOutletComponent, + children: [ + { + path: ':pkgId', + component: ServiceRoute, + }, + { + path: ':pkgId/actions', + loadComponent: () => + import('./routes/actions.component').then(m => m.ServiceActionsRoute), + }, + { + path: ':pkgId/interface/:interfaceId', + loadComponent: () => + import('./routes/interface.component').then( + m => m.ServiceInterfaceRoute, + ), + }, + { + path: ':pkgId/logs', + loadComponent: () => + import('./routes/logs.component').then(m => m.ServiceLogsRoute), + }, + { + path: '', + pathMatch: 'full', + redirectTo: '/portal/desktop', + }, + ], }, ] -@NgModule({ - imports: [ - CommonModule, - TuiLetModule, - - ServiceProgressComponent, - ServiceStatusComponent, - ServiceActionsComponent, - ServiceInterfaceComponent, - ServiceHealthCheckComponent, - ServiceDependencyComponent, - ServiceMenuComponent, - ServiceAdditionalComponent, - - ProgressDataPipe, - ToDependenciesPipe, - ToStatusPipe, - InterfaceInfoPipe, - ToMenusPipe, - ToAdditionalPipe, - - RouterModule.forChild(ROUTES), - ], - declarations: [ServiceComponent], - exports: [ServiceComponent], -}) +@NgModule({ imports: [RouterModule.forChild(ROUTES)] }) export class ServiceModule {} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/utils/update-tab.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/utils/update-tab.ts new file mode 100644 index 000000000..cbc717315 --- /dev/null +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/utils/update-tab.ts @@ -0,0 +1,9 @@ +import { inject } from '@angular/core' +import { ActivatedRoute } from '@angular/router' +import { getPkgId } from '@start9labs/shared' +import { NavigationService } from 'src/app/apps/portal/services/navigation.service' +import { toRouterLink } from 'src/app/apps/portal/utils/to-router-link' + +export function updateTab(path: string, id = getPkgId(inject(ActivatedRoute))) { + inject(NavigationService).updateTab(toRouterLink(id), toRouterLink(id) + path) +} diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts index 68a41b30f..94930baa0 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts @@ -22,7 +22,6 @@ import { DataModel } from 'src/app/services/patch-db/data-model' import { ApiService } from 'src/app/services/api/embassy-api.service' import { ClientStorageService } from 'src/app/services/client-storage.service' -import { toDesktopItem } from '../../../utils/to-desktop-item' import { NavigationService } from '../../../services/navigation.service' import { SideloadDependenciesComponent } from './dependencies.component' @@ -118,7 +117,7 @@ export class SideloadPackageComponent { await this.api.uploadPackage(pkg, this.file) await this.router.navigate(['/portal/service', manifest.id]) - this.navigation.removeTab(toDesktopItem('/portal/system/sideload')) + this.navigation.removeTab('/portal/system/sideload') this.alerts .open('Package uploaded successfully', { status: 'success' }) .subscribe() diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts index e0ea03716..cc5638b33 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts @@ -1,7 +1,7 @@ import { NgModule } from '@angular/core' import { RouterModule, Routes } from '@angular/router' import { systemTabResolver } from '../../utils/system-tab-resolver' -import { toDesktopItem } from '../../utils/to-desktop-item' +import { toNavigationItem } from '../../utils/to-navigation-item' const ROUTES: Routes = [ { @@ -9,34 +9,30 @@ const ROUTES: Routes = [ path: 'backups', loadComponent: () => import('./backups/backups.component').then(m => m.BackupsComponent), - data: toDesktopItem('/portal/system/backups'), + data: toNavigationItem('/portal/system/backups'), }, { title: systemTabResolver, path: 'sideload', loadComponent: () => import('./sideload/sideload.component').then(m => m.SideloadComponent), - data: toDesktopItem('/portal/system/sideload'), + data: toNavigationItem('/portal/system/sideload'), }, { title: systemTabResolver, path: 'updates', loadComponent: () => import('./updates/updates.component').then(m => m.UpdatesComponent), - data: toDesktopItem('/portal/system/updates'), + data: toNavigationItem('/portal/system/updates'), }, { title: systemTabResolver, path: 'snek', loadComponent: () => import('./snek/snek.component').then(m => m.SnekComponent), - data: toDesktopItem('/portal/system/snek'), + data: toNavigationItem('/portal/system/snek'), }, ] -@NgModule({ - imports: [RouterModule.forChild(ROUTES)], - declarations: [], - exports: [], -}) +@NgModule({ imports: [RouterModule.forChild(ROUTES)] }) export class SystemModule {} diff --git a/frontend/projects/ui/src/app/apps/portal/services/navigation.service.ts b/frontend/projects/ui/src/app/apps/portal/services/navigation.service.ts index 1c91b9585..a4a789d22 100644 --- a/frontend/projects/ui/src/app/apps/portal/services/navigation.service.ts +++ b/frontend/projects/ui/src/app/apps/portal/services/navigation.service.ts @@ -12,17 +12,37 @@ export class NavigationService { return this.tabs } - removeTab({ routerLink }: NavigationItem) { - this.tabs.next(this.tabs.value.filter(t => t.routerLink !== routerLink)) + removeTab(routerLink: string) { + this.tabs.next( + this.tabs.value.filter(t => !t.routerLink.startsWith(routerLink)), + ) } addTab(tab: NavigationItem) { - if (this.tabs.value.every(t => t.routerLink !== tab.routerLink)) { - this.tabs.next([...this.tabs.value, tab]) - } + const current = this.tabs.value.find(t => + t.routerLink.startsWith(tab.routerLink), + ) + + this.tabs.next( + current + ? this.tabs.value.map(t => (t === current ? tab : t)) + : this.tabs.value.concat(tab), + ) + } + + updateTab(old: string, routerLink: string) { + this.tabs.next( + this.tabs.value.map(t => + t.routerLink === old ? { ...t, routerLink } : t, + ), + ) } hasTab(path: string): boolean { return this.tabs.value.some(t => t.routerLink === path) } + + hasSubtab(path: string): boolean { + return this.tabs.value.some(t => t.routerLink.startsWith(path)) + } } diff --git a/frontend/projects/ui/src/app/apps/portal/utils/to-desktop-item.ts b/frontend/projects/ui/src/app/apps/portal/utils/to-navigation-item.ts similarity index 94% rename from frontend/projects/ui/src/app/apps/portal/utils/to-desktop-item.ts rename to frontend/projects/ui/src/app/apps/portal/utils/to-navigation-item.ts index cbeed8dfe..b33afe3a4 100644 --- a/frontend/projects/ui/src/app/apps/portal/utils/to-desktop-item.ts +++ b/frontend/projects/ui/src/app/apps/portal/utils/to-navigation-item.ts @@ -3,7 +3,7 @@ import { SYSTEM_UTILITIES } from '../constants/system-utilities' import { NavigationItem } from '../types/navigation-item' import { toRouterLink } from './to-router-link' -export function toDesktopItem( +export function toNavigationItem( id: string, packages: Record = {}, ): NavigationItem { diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts index 704b867d6..efa1ad187 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts @@ -64,6 +64,6 @@ const routes: Routes = [ InsecureWarningComponentModule, LaunchMenuComponentModule, ], - exports: [InterfaceInfoPipe], + exports: [InterfaceInfoPipe, ToStatusPipe], }) export class AppShowPageModule {} From df1ac8e1e24e07cdb2aaa216f6ad6cc2c95733dd Mon Sep 17 00:00:00 2001 From: Matt Hill Date: Thu, 9 Nov 2023 15:36:20 -0700 Subject: [PATCH 026/169] makefile too --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index ec2183178..47d11e167 100644 --- a/Makefile +++ b/Makefile @@ -194,7 +194,7 @@ frontend/dist/raw/diagnostic-ui: $(FRONTEND_DIAGNOSTIC_UI_SRC) $(FRONTEND_SHARED npm --prefix frontend run build:dui frontend/dist/raw/install-wizard: $(FRONTEND_INSTALL_WIZARD_SRC) $(FRONTEND_SHARED_SRC) - npm --prefix frontend run build:install-wiz + npm --prefix frontend run build:install frontend/dist/static: $(EMBASSY_UIS) $(ENVIRONMENT_FILE) ./compress-uis.sh From 09303ab2fb4506c211e471a24ae1cacfb3b93166 Mon Sep 17 00:00:00 2001 From: Matt Hill Date: Thu, 9 Nov 2023 16:04:18 -0700 Subject: [PATCH 027/169] make it run --- .../service/components/status.component.ts | 1 + .../system/updates/updates.component.ts | 4 +- .../pages/services/status/status.component.ts | 1 + .../server-metrics/server-metrics.page.html | 224 ++++++++++-------- 4 files changed, 130 insertions(+), 100 deletions(-) diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts index a636fbc68..d97e5523c 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts @@ -14,6 +14,7 @@ import { InstallProgressPipeModule } from 'src/app/common/install-progress/insta template: ` {{ connected ? rendering.display : 'Unknown' }} + diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/updates/updates.component.ts b/frontend/projects/ui/src/app/apps/portal/routes/system/updates/updates.component.ts index c30f9ada0..1b4b48434 100644 --- a/frontend/projects/ui/src/app/apps/portal/routes/system/updates/updates.component.ts +++ b/frontend/projects/ui/src/app/apps/portal/routes/system/updates/updates.component.ts @@ -38,8 +38,8 @@ import { SkeletonListComponent } from '../../../components/skeleton-list.compone else: loading; empty: blank " - [pkg]="pkg" - [local]="data.local[pkg.manifest.id]" + [marketplacePkg]="pkg" + [localPkg]="data.local[pkg.manifest.id]" [url]="host.url" > diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/status/status.component.ts b/frontend/projects/ui/src/app/apps/ui/pages/services/status/status.component.ts index 0535030b2..156dc9e6c 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/services/status/status.component.ts +++ b/frontend/projects/ui/src/app/apps/ui/pages/services/status/status.component.ts @@ -21,6 +21,7 @@ export class StatusComponent { @Input() style?: string = 'regular' @Input() weight?: string = 'normal' @Input() installProgress?: InstallProgress + @Input() sigtermTimeout?: string | null = null readonly connected$ = this.connectionService.connected$ diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.html b/frontend/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.html index 47cac26ef..58be4b196 100644 --- a/frontend/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.html +++ b/frontend/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.html @@ -13,24 +13,24 @@ Websocket Failed. Reconnecting

- - System Time - - Current Time (UTC) -
- {{ timeInfo.systemCurrentTime | date : 'MMMM d, y, h:mm:ss a' : 'UTC' - }} -
-
- - Start Time (UTC) -
- {{ timeInfo.systemStartTime | date : 'MMMM d, y, h:mm:ss a' : 'UTC' }} -
-
- - Uptime -
+ + +

Current Time (UTC)

+

+ {{ serverData[0].value | date : 'MMMM d, y, h:mm:ss a' : 'UTC' }} +

+

+ + NTP not synced, time could be wrong + +

+
+
+ + + +

Uptime

+

{{ uptime.days }} Days, {{ uptime.hours }} @@ -39,87 +39,115 @@

Minutes, {{ uptime.seconds }} Seconds -
-
- +
+ +
+ + + + General + + Temperature + + + {{ general.temperature.value }} °C + + N/A + + + + + + Memory + + Percentage Used + + {{ memory['percentage-used'].value }} % + + + + Total + + {{ memory.total.value }} MiB + + + + Used + + {{ memory.used.value }} MiB + + + + Available + {{ memory.available.value }} MiB + + + zram Used + {{ memory['zram-used'].value }} MiB + + + zram Total + {{ memory['zram-total'].value }} MiB + + + zram Available + + {{ memory['zram-available'].value }} MiB + + + + + + CPU + + Percentage Used + {{ cpu['percentage-used'].value }} % + + + User Space + + {{ cpu['user-space'].value }} % + + + + Kernel Space + + {{ cpu['kernel-space'].value }} % + + + + Idle + {{ cpu.idle.value }} % + + + I/O Wait + {{ cpu.wait.value }} % + + - - - General - - Temperature -
{{ metrics.general.temperature }} °C
-
- - Memory - - Percentage Used -
{{ metrics.memory['percentage-used'] }} %
-
- - Total -
{{ metrics.memory.total }} MiB
-
- - Available -
{{ metrics.memory.available }} MiB
-
- - Used -
{{ metrics.memory.used }} MiB
-
- - Swap Total -
{{ metrics.memory['swap-total'] }} MiB
-
- - Swap Free -
{{ metrics.memory['swap-free'] }} MiB
-
- - Swap Used -
{{ metrics.memory['swap-used'] }} MiB
-
- - CPU - - User Space -
{{ metrics.cpu['user-space'] }} %
-
- - Kernel Space -
{{ metrics.cpu['kernel-space'] }} %
-
- - I/O Wait -
{{ metrics.cpu['io-wait'] }} %
-
- - Idle -
{{ metrics.cpu.idle }} %
-
- - Usage -
{{ metrics.cpu.usage }} %
-
- - Disk - - Size -
{{ metrics.disk.size }} GB
-
- - Used -
{{ metrics.disk.used }} GB
-
- - Percentage Used -
{{ metrics.disk['percentage-used'] }} %
-
- - Available -
{{ metrics.disk.available }} GB
-
+ + Disk + + Percentage Used + {{ disk['percentage-used'].value }} % + + + Capacity + + {{ disk.capacity.value }} GB + + + + Used + + {{ disk.used.value }} GB + + + + Available + {{ disk.available.value }} GB + +
From 94d22ed1aa1ccb29b3c921d53b64a9eb244215aa Mon Sep 17 00:00:00 2001 From: J H <2364004+Blu-J@users.noreply.github.com> Date: Fri, 10 Nov 2023 09:26:00 -0700 Subject: [PATCH 028/169] chore: Remove the other procedures since all are now via the js --- backend/src/bins/start_deno.rs | 14 +- backend/src/manager/mod.rs | 66 +- backend/src/manager/persistent_container.rs | 9 + backend/src/procedure/docker.rs | 437 ------------- backend/src/procedure/js_scripts.rs | 684 -------------------- backend/src/procedure/mod.rs | 92 +-- 6 files changed, 77 insertions(+), 1225 deletions(-) diff --git a/backend/src/bins/start_deno.rs b/backend/src/bins/start_deno.rs index 0be507082..870821734 100644 --- a/backend/src/bins/start_deno.rs +++ b/backend/src/bins/start_deno.rs @@ -34,9 +34,10 @@ async fn execute( input, } = arg; PackageLogger::init(&pkg_id); - procedure - .execute_impl(&directory, &pkg_id, &pkg_version, name, &volumes, input) - .await + // procedure + // .execute_impl(&directory, &pkg_id, &pkg_version, name, &volumes, input) + // .await + todo!("@DRB Remove") } #[command(cli_only, display(display_serializable))] async fn sandbox( @@ -52,9 +53,10 @@ async fn sandbox( input, } = arg; PackageLogger::init(&pkg_id); - procedure - .sandboxed_impl(&directory, &pkg_id, &pkg_version, &volumes, input, name) - .await + // procedure + // .sandboxed_impl(&directory, &pkg_id, &pkg_version, &volumes, input, name) + // .await + todo!("@DRB Remove") } use tracing::Subscriber; diff --git a/backend/src/manager/mod.rs b/backend/src/manager/mod.rs index b34e29efb..56fa408fd 100644 --- a/backend/src/manager/mod.rs +++ b/backend/src/manager/mod.rs @@ -13,6 +13,7 @@ use models::{ErrorKind, OptionExt, PackageId}; use nix::sys::signal::Signal; use persistent_container::PersistentContainer; use rand::SeedableRng; +use serde::de::DeserializeOwned; use sqlx::Connection; use start_stop::StartStop; use tokio::sync::watch::{self, Sender}; @@ -328,6 +329,38 @@ impl Manager { let transition = self.transition.borrow(); matches!(*transition, TransitionState::BackingUp(_)) } + + pub async fn execute( + &self, + name: ProcedureName, + input: Value, + timeout: Option, + ) -> Result, Error> + where + O: DeserializeOwned, + { + self.persistent_container + .execute(name, input, timeout) + .await + } + + pub async fn sanboxed( + &self, + name: ProcedureName, + input: Value, + timeout: Option, + ) -> Result, Error> + where + O: DeserializeOwned, + { + self.persistent_container + .sanboxed(name, input, timeout) + .await + } + + pub async fn send_signal(&self, gid: Arc, signal: Signal) -> Result<(), Error> { + self.persistent_container.send_signal(gid, signal).await + } } #[instrument(skip_all)] @@ -817,36 +850,5 @@ async fn get_running_ip(seed: &ManagerSeed, mut runtime: &mut RuntimeOfCommand) } async fn send_signal(manager: &Manager, gid: Arc, signal: Signal) -> Result<(), Error> { - // stop health checks from committing their results - // shared - // .commit_health_check_results - // .store(false, Ordering::SeqCst); - - let rpc_client = manager.rpc_client(); - - let main_gid = *gid.main_gid.0.borrow(); - let next_gid = gid.new_gid(); - #[cfg(feature = "js_engine")] - if let Err(e) = crate::procedure::js_scripts::JsProcedure::default() - .execute::<_, NoOutput>( - &manager.seed.ctx.datadir, - &manager.seed.manifest.id, - &manager.seed.manifest.version, - ProcedureName::Signal, - &manager.seed.manifest.volumes, - Some(embassy_container_init::SignalGroupParams { - gid: main_gid, - signal: signal as u32, - }), - None, // TODO - next_gid, - Some(rpc_client), - ) - .await? - { - tracing::error!("Failed to send js signal: {}", e.1); - tracing::debug!("{:?}", e); - } - - Ok(()) + manager.send_signal(gid, signal).await } diff --git a/backend/src/manager/persistent_container.rs b/backend/src/manager/persistent_container.rs index 0753a9bb4..e6380bf49 100644 --- a/backend/src/manager/persistent_container.rs +++ b/backend/src/manager/persistent_container.rs @@ -4,6 +4,7 @@ use std::time::Duration; use color_eyre::eyre::eyre; use helpers::UnixRpcClient; use models::ProcedureName; +use nix::sys::signal::Signal; use serde::de::DeserializeOwned; use tokio::sync::watch::{self, Receiver}; use tokio::sync::{oneshot, Mutex}; @@ -30,6 +31,9 @@ pub struct PersistentContainer { procedures: Mutex>, } +// BLUJ TODO Need to get the only action is this and not procedure/ +// BLUJ Modify the rpc client to match the new type + impl PersistentContainer { #[instrument(skip_all)] pub async fn init(seed: &Arc) -> Result { @@ -71,6 +75,7 @@ impl PersistentContainer { Err(e) => Err(e), } } + pub async fn sanboxed( &self, name: ProcedureName, @@ -119,6 +124,10 @@ impl PersistentContainer { ) -> Result, Error> { todo!("DRB") } + + pub async fn send_signal(&self, gid: Arc, signal: Signal) -> Result<(), Error> { + todo!("DRB") + } } pub async fn spawn_persistent_container( diff --git a/backend/src/procedure/docker.rs b/backend/src/procedure/docker.rs index 57207d5c9..c6912c97f 100644 --- a/backend/src/procedure/docker.rs +++ b/backend/src/procedure/docker.rs @@ -217,443 +217,6 @@ impl DockerProcedure { Ok(()) } - #[instrument(skip_all)] - pub async fn execute( - &self, - ctx: &RpcContext, - pkg_id: &PackageId, - pkg_version: &Version, - name: ProcedureName, - volumes: &Volumes, - input: Option, - timeout: Option, - ) -> Result, Error> { - let name = name.docker_name(); - let name: Option<&str> = name.as_deref(); - let mut cmd = tokio::process::Command::new(CONTAINER_TOOL); - let container_name = Self::container_name(pkg_id, name); - cmd.arg("run") - .arg("--rm") - .arg("--network=start9") - .arg(format!("--add-host=embassy:{}", Ipv4Addr::from(HOST_IP))) - .arg("--name") - .arg(&container_name) - .arg(format!("--hostname={}", &container_name)) - .arg("--no-healthcheck") - .kill_on_drop(true); - remove_container(&container_name, true).await?; - cmd.args(self.docker_args(ctx, pkg_id, pkg_version, volumes).await?); - let input_buf = if let (Some(input), Some(format)) = (&input, &self.io_format) { - cmd.stdin(std::process::Stdio::piped()); - Some(format.to_vec(input)?) - } else { - None - }; - cmd.stdout(std::process::Stdio::piped()); - cmd.stderr(std::process::Stdio::piped()); - tracing::trace!( - "{}", - format!("{:?}", cmd) - .split(r#"" ""#) - .collect::>() - .join(" ") - ); - let mut handle = cmd.spawn().with_kind(crate::ErrorKind::Docker)?; - let id = handle.id(); - let timeout_fut = if let Some(timeout) = timeout { - EitherFuture::Right(async move { - tokio::time::sleep(timeout).await; - - Ok(()) - }) - } else { - EitherFuture::Left(futures::future::pending::>()) - }; - if let (Some(input), Some(mut stdin)) = (&input_buf, handle.stdin.take()) { - use tokio::io::AsyncWriteExt; - stdin - .write_all(input) - .await - .with_kind(crate::ErrorKind::Docker)?; - stdin.flush().await?; - stdin.shutdown().await?; - drop(stdin); - } - enum Race { - Done(T), - TimedOut, - } - - let io_format = self.io_format; - let mut output = BufReader::new( - handle - .stdout - .take() - .ok_or_else(|| eyre!("Can't takeout stdout in execute")) - .with_kind(crate::ErrorKind::Docker)?, - ); - let output = NonDetachingJoinHandle::from(tokio::spawn(async move { - match async { - if let Some(format) = io_format { - return match max_by_lines(&mut output, None).await { - MaxByLines::Done(buffer) => { - Ok::( - match format.from_slice(buffer.as_bytes()) { - Ok(a) => a, - Err(e) => { - tracing::trace!( - "Failed to deserialize stdout from {}: {}, falling back to UTF-8 string.", - format, - e - ); - Value::String(buffer) - } - }, - ) - }, - MaxByLines::Error(e) => Err(e), - MaxByLines::Overflow(buffer) => Ok(Value::String(buffer)) - } - } - - let lines = buf_reader_to_lines(&mut output, 1000).await?; - if lines.is_empty() { - return Ok(Value::Null); - } - - let joined_output = lines.join("\n"); - Ok(Value::String(joined_output)) - }.await { - Ok(a) => Ok((a, output)), - Err(e) => Err((e, output)) - } - })); - let err_output = BufReader::new( - handle - .stderr - .take() - .ok_or_else(|| eyre!("Can't takeout std err")) - .with_kind(crate::ErrorKind::Docker)?, - ); - - let err_output = NonDetachingJoinHandle::from(tokio::spawn(async move { - let lines = buf_reader_to_lines(err_output, 1000).await?; - let joined_output = lines.join("\n"); - Ok::<_, Error>(joined_output) - })); - - let res = tokio::select! { - res = handle.wait() => Race::Done(res.with_kind(crate::ErrorKind::Docker)?), - res = timeout_fut => { - res?; - Race::TimedOut - }, - }; - let exit_status = match res { - Race::Done(x) => x, - Race::TimedOut => { - if let Some(id) = id { - signal::kill(Pid::from_raw(id as i32), signal::SIGKILL) - .with_kind(crate::ErrorKind::Docker)?; - } - return Ok(Err((143, "Timed out. Retrying soon...".to_owned()))); - } - }; - Ok( - if exit_status.success() || exit_status.code() == Some(143) { - Ok(serde_json::from_value( - output - .await - .with_kind(crate::ErrorKind::Unknown)? - .map(|(v, _)| v) - .map_err(|(e, _)| tracing::warn!("{}", e)) - .unwrap_or_default(), - ) - .with_kind(crate::ErrorKind::Deserialization)?) - } else { - Err(( - exit_status.code().unwrap_or_default(), - err_output.await.with_kind(crate::ErrorKind::Unknown)??, - )) - }, - ) - } - - #[instrument(skip_all)] - pub async fn inject( - &self, - _ctx: &RpcContext, - pkg_id: &PackageId, - _pkg_version: &Version, - _name: ProcedureName, - _volumes: &Volumes, - input: Option, - timeout: Option, - ) -> Result, Error> { - let mut cmd = tokio::process::Command::new(CONTAINER_TOOL); - - cmd.arg("exec"); - - cmd.args(self.docker_args_inject(pkg_id)); - let input_buf = if let (Some(input), Some(format)) = (&input, &self.io_format) { - cmd.stdin(std::process::Stdio::piped()); - Some(format.to_vec(input)?) - } else { - None - }; - cmd.stdout(std::process::Stdio::piped()); - cmd.stderr(std::process::Stdio::piped()); - tracing::trace!( - "{}", - format!("{:?}", cmd) - .split(r#"" ""#) - .collect::>() - .join(" ") - ); - let mut handle = cmd.spawn().with_kind(crate::ErrorKind::Docker)?; - let id = handle.id(); - let timeout_fut = if let Some(timeout) = timeout { - EitherFuture::Right(async move { - tokio::time::sleep(timeout).await; - - Ok(()) - }) - } else { - EitherFuture::Left(futures::future::pending::>()) - }; - if let (Some(input), Some(mut stdin)) = (&input_buf, handle.stdin.take()) { - use tokio::io::AsyncWriteExt; - stdin - .write_all(input) - .await - .with_kind(crate::ErrorKind::Docker)?; - stdin.flush().await?; - stdin.shutdown().await?; - drop(stdin); - } - enum Race { - Done(T), - TimedOut, - } - - let io_format = self.io_format; - let mut output = BufReader::new( - handle - .stdout - .take() - .ok_or_else(|| eyre!("Can't takeout stdout in inject")) - .with_kind(crate::ErrorKind::Docker)?, - ); - let output = NonDetachingJoinHandle::from(tokio::spawn(async move { - match async { - if let Some(format) = io_format { - return match max_by_lines(&mut output, None).await { - MaxByLines::Done(buffer) => { - Ok::( - match format.from_slice(buffer.as_bytes()) { - Ok(a) => a, - Err(e) => { - tracing::trace!( - "Failed to deserialize stdout from {}: {}, falling back to UTF-8 string.", - format, - e - ); - Value::String(buffer) - } - }, - ) - }, - MaxByLines::Error(e) => Err(e), - MaxByLines::Overflow(buffer) => Ok(Value::String(buffer)) - } - } - - let lines = buf_reader_to_lines(&mut output, 1000).await?; - if lines.is_empty() { - return Ok(Value::Null); - } - - let joined_output = lines.join("\n"); - Ok(Value::String(joined_output)) - }.await { - Ok(a) => Ok((a, output)), - Err(e) => Err((e, output)) - } - })); - let err_output = BufReader::new( - handle - .stderr - .take() - .ok_or_else(|| eyre!("Can't takeout std err")) - .with_kind(crate::ErrorKind::Docker)?, - ); - - let err_output = NonDetachingJoinHandle::from(tokio::spawn(async move { - let lines = buf_reader_to_lines(err_output, 1000).await?; - let joined_output = lines.join("\n"); - Ok::<_, Error>(joined_output) - })); - - let res = tokio::select! { - res = handle.wait() => Race::Done(res.with_kind(crate::ErrorKind::Docker)?), - res = timeout_fut => { - res?; - Race::TimedOut - }, - }; - let exit_status = match res { - Race::Done(x) => x, - Race::TimedOut => { - if let Some(id) = id { - signal::kill(Pid::from_raw(id as i32), signal::SIGKILL) - .with_kind(crate::ErrorKind::Docker)?; - } - return Ok(Err((143, "Timed out. Retrying soon...".to_owned()))); - } - }; - Ok( - if exit_status.success() || exit_status.code() == Some(143) { - Ok(serde_json::from_value( - output - .await - .with_kind(crate::ErrorKind::Unknown)? - .map(|(v, _)| v) - .map_err(|(e, _)| tracing::warn!("{}", e)) - .unwrap_or_default(), - ) - .with_kind(crate::ErrorKind::Deserialization)?) - } else { - Err(( - exit_status.code().unwrap_or_default(), - err_output.await.with_kind(crate::ErrorKind::Unknown)??, - )) - }, - ) - } - - #[instrument(skip_all)] - pub async fn sandboxed( - &self, - ctx: &RpcContext, - pkg_id: &PackageId, - pkg_version: &Version, - volumes: &Volumes, - input: Option, - timeout: Option, - ) -> Result, Error> { - let mut cmd = tokio::process::Command::new(CONTAINER_TOOL); - cmd.arg("run").arg("--rm").arg("--network=none"); - cmd.args( - self.docker_args(ctx, pkg_id, pkg_version, &volumes.to_readonly()) - .await?, - ); - let input_buf = if let (Some(input), Some(format)) = (&input, &self.io_format) { - cmd.stdin(std::process::Stdio::piped()); - Some(format.to_vec(input)?) - } else { - None - }; - cmd.stdout(std::process::Stdio::piped()); - cmd.stderr(std::process::Stdio::piped()); - let mut handle = cmd.spawn().with_kind(crate::ErrorKind::Docker)?; - if let (Some(input), Some(stdin)) = (&input_buf, &mut handle.stdin) { - use tokio::io::AsyncWriteExt; - stdin - .write_all(input) - .await - .with_kind(crate::ErrorKind::Docker)?; - } - - let err_output = BufReader::new( - handle - .stderr - .take() - .ok_or_else(|| eyre!("Can't takeout std err")) - .with_kind(crate::ErrorKind::Docker)?, - ); - let err_output = NonDetachingJoinHandle::from(tokio::spawn(async move { - let lines = buf_reader_to_lines(err_output, 1000).await?; - let joined_output = lines.join("\n"); - Ok::<_, Error>(joined_output) - })); - - let io_format = self.io_format; - let mut output = BufReader::new( - handle - .stdout - .take() - .ok_or_else(|| eyre!("Can't takeout stdout in sandboxed")) - .with_kind(crate::ErrorKind::Docker)?, - ); - let output = NonDetachingJoinHandle::from(tokio::spawn(async move { - match async { - if let Some(format) = io_format { - return match max_by_lines(&mut output, None).await { - MaxByLines::Done(buffer) => { - Ok::( - match format.from_slice(buffer.as_bytes()) { - Ok(a) => a, - Err(e) => { - tracing::trace!( - "Failed to deserialize stdout from {}: {}, falling back to UTF-8 string.", - format, - e - ); - Value::String(buffer) - } - }, - ) - }, - MaxByLines::Error(e) => Err(e), - MaxByLines::Overflow(buffer) => Ok(Value::String(buffer)) - } - } - - let lines = buf_reader_to_lines(&mut output, 1000).await?; - if lines.is_empty() { - return Ok(Value::Null); - } - - let joined_output = lines.join("\n"); - Ok(Value::String(joined_output)) - }.await { - Ok(a) => Ok((a, output)), - Err(e) => Err((e, output)) - } - })); - - let handle = if let Some(dur) = timeout { - async move { - tokio::time::timeout(dur, handle.wait()) - .await - .with_kind(crate::ErrorKind::Docker)? - .with_kind(crate::ErrorKind::Docker) - } - .boxed() - } else { - async { handle.wait().await.with_kind(crate::ErrorKind::Docker) }.boxed() - }; - let exit_status = handle.await?; - Ok( - if exit_status.success() || exit_status.code() == Some(143) { - Ok(serde_json::from_value( - output - .await - .with_kind(crate::ErrorKind::Unknown)? - .map(|(v, _)| v) - .map_err(|(e, _)| tracing::warn!("{}", e)) - .unwrap_or_default(), - ) - .with_kind(crate::ErrorKind::Deserialization)?) - } else { - Err(( - exit_status.code().unwrap_or_default(), - err_output.await.with_kind(crate::ErrorKind::Unknown)??, - )) - }, - ) - } - pub fn container_name(pkg_id: &PackageId, name: Option<&str>) -> String { if let Some(name) = name { format!("{}_{}.{}", pkg_id, name, NET_TLD) diff --git a/backend/src/procedure/js_scripts.rs b/backend/src/procedure/js_scripts.rs index 27756b4a3..c27fae29b 100644 --- a/backend/src/procedure/js_scripts.rs +++ b/backend/src/procedure/js_scripts.rs @@ -67,125 +67,6 @@ impl JsProcedure { pub fn validate(&self, _volumes: &Volumes) -> Result<(), color_eyre::eyre::Report> { Ok(()) } - - #[instrument(skip_all)] - pub async fn execute( - &self, - directory: &PathBuf, - pkg_id: &PackageId, - pkg_version: &Version, - name: ProcedureName, - volumes: &Volumes, - input: Option, - timeout: Option, - _gid: ProcessGroupId, - _rpc_client: Option>, - ) -> Result, Error> { - Command::new("start-deno") - .arg("execute") - .input(Some(&mut std::io::Cursor::new(IoFormat::Json.to_vec( - &ExecuteArgs { - procedure: self.clone(), - directory: directory.clone(), - pkg_id: pkg_id.clone(), - pkg_version: pkg_version.clone(), - name, - volumes: volumes.clone(), - input: input.and_then(|x| serde_json::to_value(x).ok()), - }, - )?))) - .timeout(timeout) - .invoke(ErrorKind::Javascript) - .await - .and_then(|res| IoFormat::Json.from_slice(&res)) - } - - #[instrument(skip_all)] - pub async fn sandboxed( - &self, - directory: &PathBuf, - pkg_id: &PackageId, - pkg_version: &Version, - volumes: &Volumes, - input: Option, - timeout: Option, - name: ProcedureName, - ) -> Result, Error> { - Command::new("start-deno") - .arg("sandbox") - .input(Some(&mut std::io::Cursor::new(IoFormat::Json.to_vec( - &ExecuteArgs { - procedure: self.clone(), - directory: directory.clone(), - pkg_id: pkg_id.clone(), - pkg_version: pkg_version.clone(), - name, - volumes: volumes.clone(), - input: input.and_then(|x| serde_json::to_value(x).ok()), - }, - )?))) - .timeout(timeout) - .invoke(ErrorKind::Javascript) - .await - .and_then(|res| IoFormat::Json.from_slice(&res)) - } - - #[instrument(skip_all)] - pub async fn execute_impl( - &self, - directory: &PathBuf, - pkg_id: &PackageId, - pkg_version: &Version, - name: ProcedureName, - volumes: &Volumes, - input: Option, - ) -> Result, Error> { - let res = async move { - let running_action = JsExecutionEnvironment::load_from_package( - directory, - pkg_id, - pkg_version, - Box::new(volumes.clone()), - ) - .await? - .run_action(name, input, self.args.clone()); - let output: Option = running_action.await?; - let output: O = unwrap_known_error(output)?; - Ok(output) - } - .await - .map_err(|(error, message)| (error.as_code_num(), message)); - - Ok(res) - } - - #[instrument(skip_all)] - pub async fn sandboxed_impl( - &self, - directory: &PathBuf, - pkg_id: &PackageId, - pkg_version: &Version, - volumes: &Volumes, - input: Option, - name: ProcedureName, - ) -> Result, Error> { - Ok(async move { - let running_action = JsExecutionEnvironment::load_from_package( - directory, - pkg_id, - pkg_version, - Box::new(volumes.clone()), - ) - .await? - .read_only_effects() - .run_action(name, input, self.args.clone()); - let output: Option = running_action.await?; - let output: O = unwrap_known_error(output)?; - Ok(output) - } - .await - .map_err(|(error, message)| (error.as_code_num(), message))) - } } fn unwrap_known_error( @@ -211,568 +92,3 @@ fn unwrap_known_error( }, } } - -#[tokio::test] -async fn js_action_execute() { - let js_action = JsProcedure { args: vec![] }; - let path: PathBuf = "test/js_action_execute/" - .parse::() - .unwrap() - .canonicalize() - .unwrap(); - let package_id = "test-package".parse().unwrap(); - let package_version: Version = "0.3.0.3".parse().unwrap(); - let name = ProcedureName::GetConfig; - let volumes: Volumes = serde_json::from_value(serde_json::json!({ - "main": { - "type": "data" - }, - "compat": { - "type": "assets" - }, - "filebrowser" :{ - "package-id": "filebrowser", - "path": "data", - "readonly": true, - "type": "pointer", - "volume-id": "main", - } - })) - .unwrap(); - let input: Option = Some(serde_json::json!({"test":123})); - let timeout = Some(Duration::from_secs(10)); - let _output: crate::config::action::ConfigRes = js_action - .execute( - &path, - &package_id, - &package_version, - name, - &volumes, - input, - timeout, - ProcessGroupId(0), - None, - ) - .await - .unwrap() - .unwrap(); - assert_eq!( - &std::fs::read_to_string( - "test/js_action_execute/package-data/volumes/test-package/data/main/test.log" - ) - .unwrap(), - "This is a test" - ); - std::fs::remove_file( - "test/js_action_execute/package-data/volumes/test-package/data/main/test.log", - ) - .unwrap(); -} - -#[tokio::test] -async fn js_action_execute_error() { - let js_action = JsProcedure { args: vec![] }; - let path: PathBuf = "test/js_action_execute/" - .parse::() - .unwrap() - .canonicalize() - .unwrap(); - let package_id = "test-package".parse().unwrap(); - let package_version: Version = "0.3.0.3".parse().unwrap(); - let name = ProcedureName::SetConfig; - let volumes: Volumes = serde_json::from_value(serde_json::json!({ - "main": { - "type": "data" - }, - "compat": { - "type": "assets" - }, - "filebrowser" :{ - "package-id": "filebrowser", - "path": "data", - "readonly": true, - "type": "pointer", - "volume-id": "main", - } - })) - .unwrap(); - let input: Option = None; - let timeout = Some(Duration::from_secs(10)); - let output: Result = js_action - .execute( - &path, - &package_id, - &package_version, - name, - &volumes, - input, - timeout, - ProcessGroupId(0), - None, - ) - .await - .unwrap(); - assert_eq!("Err((2, \"Not setup\"))", &format!("{:?}", output)); -} - -#[tokio::test] -async fn js_action_fetch() { - let js_action = JsProcedure { args: vec![] }; - let path: PathBuf = "test/js_action_execute/" - .parse::() - .unwrap() - .canonicalize() - .unwrap(); - let package_id = "test-package".parse().unwrap(); - let package_version: Version = "0.3.0.3".parse().unwrap(); - let name = ProcedureName::Action("fetch".parse().unwrap()); - let volumes: Volumes = serde_json::from_value(serde_json::json!({ - "main": { - "type": "data" - }, - "compat": { - "type": "assets" - }, - "filebrowser" :{ - "package-id": "filebrowser", - "path": "data", - "readonly": true, - "type": "pointer", - "volume-id": "main", - } - })) - .unwrap(); - let input: Option = None; - let timeout = Some(Duration::from_secs(10)); - js_action - .execute::( - &path, - &package_id, - &package_version, - name, - &volumes, - input, - timeout, - ProcessGroupId(0), - None, - ) - .await - .unwrap() - .unwrap(); -} - -#[tokio::test] -async fn js_test_slow() { - let js_action = JsProcedure { args: vec![] }; - let path: PathBuf = "test/js_action_execute/" - .parse::() - .unwrap() - .canonicalize() - .unwrap(); - let package_id = "test-package".parse().unwrap(); - let package_version: Version = "0.3.0.3".parse().unwrap(); - let name = ProcedureName::Action("slow".parse().unwrap()); - let volumes: Volumes = serde_json::from_value(serde_json::json!({ - "main": { - "type": "data" - }, - "compat": { - "type": "assets" - }, - "filebrowser" :{ - "package-id": "filebrowser", - "path": "data", - "readonly": true, - "type": "pointer", - "volume-id": "main", - } - })) - .unwrap(); - let input: Option = None; - let timeout = Some(Duration::from_secs(10)); - tracing::debug!("testing start"); - tokio::select! { - a = js_action - .execute::( - &path, - &package_id, - &package_version, - name, - &volumes, - input, - timeout, - ProcessGroupId(0), - None, - ) => { a.unwrap().unwrap(); }, - _ = tokio::time::sleep(Duration::from_secs(1)) => () - } - tracing::debug!("testing end should"); - tokio::time::sleep(Duration::from_secs(2)).await; - tracing::debug!("Done"); -} -#[tokio::test] -async fn js_action_var_arg() { - let js_action = JsProcedure { - args: vec![42.into()], - }; - let path: PathBuf = "test/js_action_execute/" - .parse::() - .unwrap() - .canonicalize() - .unwrap(); - let package_id = "test-package".parse().unwrap(); - let package_version: Version = "0.3.0.3".parse().unwrap(); - let name = ProcedureName::Action("js-action-var-arg".parse().unwrap()); - let volumes: Volumes = serde_json::from_value(serde_json::json!({ - "main": { - "type": "data" - }, - "compat": { - "type": "assets" - }, - "filebrowser" :{ - "package-id": "filebrowser", - "path": "data", - "readonly": true, - "type": "pointer", - "volume-id": "main", - } - })) - .unwrap(); - let input: Option = None; - let timeout = Some(Duration::from_secs(10)); - js_action - .execute::( - &path, - &package_id, - &package_version, - name, - &volumes, - input, - timeout, - ProcessGroupId(0), - None, - ) - .await - .unwrap() - .unwrap(); -} - -#[tokio::test] -async fn js_action_test_rename() { - let js_action = JsProcedure { args: vec![] }; - let path: PathBuf = "test/js_action_execute/" - .parse::() - .unwrap() - .canonicalize() - .unwrap(); - let package_id = "test-package".parse().unwrap(); - let package_version: Version = "0.3.0.3".parse().unwrap(); - let name = ProcedureName::Action("test-rename".parse().unwrap()); - let volumes: Volumes = serde_json::from_value(serde_json::json!({ - "main": { - "type": "data" - }, - "compat": { - "type": "assets" - }, - "filebrowser" :{ - "package-id": "filebrowser", - "path": "data", - "readonly": true, - "type": "pointer", - "volume-id": "main", - } - })) - .unwrap(); - let input: Option = None; - let timeout = Some(Duration::from_secs(10)); - js_action - .execute::( - &path, - &package_id, - &package_version, - name, - &volumes, - input, - timeout, - ProcessGroupId(0), - None, - ) - .await - .unwrap() - .unwrap(); -} - -#[tokio::test] -async fn js_action_test_deep_dir() { - let js_action = JsProcedure { args: vec![] }; - let path: PathBuf = "test/js_action_execute/" - .parse::() - .unwrap() - .canonicalize() - .unwrap(); - let package_id = "test-package".parse().unwrap(); - let package_version: Version = "0.3.0.3".parse().unwrap(); - let name = ProcedureName::Action("test-deep-dir".parse().unwrap()); - let volumes: Volumes = serde_json::from_value(serde_json::json!({ - "main": { - "type": "data" - }, - "compat": { - "type": "assets" - }, - "filebrowser" :{ - "package-id": "filebrowser", - "path": "data", - "readonly": true, - "type": "pointer", - "volume-id": "main", - } - })) - .unwrap(); - let input: Option = None; - let timeout = Some(Duration::from_secs(10)); - js_action - .execute::( - &path, - &package_id, - &package_version, - name, - &volumes, - input, - timeout, - ProcessGroupId(0), - None, - ) - .await - .unwrap() - .unwrap(); -} -#[tokio::test] -async fn js_action_test_deep_dir_escape() { - let js_action = JsProcedure { args: vec![] }; - let path: PathBuf = "test/js_action_execute/" - .parse::() - .unwrap() - .canonicalize() - .unwrap(); - let package_id = "test-package".parse().unwrap(); - let package_version: Version = "0.3.0.3".parse().unwrap(); - let name = ProcedureName::Action("test-deep-dir-escape".parse().unwrap()); - let volumes: Volumes = serde_json::from_value(serde_json::json!({ - "main": { - "type": "data" - }, - "compat": { - "type": "assets" - }, - "filebrowser" :{ - "package-id": "filebrowser", - "path": "data", - "readonly": true, - "type": "pointer", - "volume-id": "main", - } - })) - .unwrap(); - let input: Option = None; - let timeout = Some(Duration::from_secs(10)); - js_action - .execute::( - &path, - &package_id, - &package_version, - name, - &volumes, - input, - timeout, - ProcessGroupId(0), - None, - ) - .await - .unwrap() - .unwrap(); -} -#[tokio::test] -async fn js_action_test_zero_dir() { - let js_action = JsProcedure { args: vec![] }; - let path: PathBuf = "test/js_action_execute/" - .parse::() - .unwrap() - .canonicalize() - .unwrap(); - let package_id = "test-package".parse().unwrap(); - let package_version: Version = "0.3.0.3".parse().unwrap(); - let name = ProcedureName::Action("test-zero-dir".parse().unwrap()); - let volumes: Volumes = serde_json::from_value(serde_json::json!({ - "main": { - "type": "data" - }, - "compat": { - "type": "assets" - }, - "filebrowser" :{ - "package-id": "filebrowser", - "path": "data", - "readonly": true, - "type": "pointer", - "volume-id": "main", - } - })) - .unwrap(); - let input: Option = None; - let timeout = Some(Duration::from_secs(10)); - js_action - .execute::( - &path, - &package_id, - &package_version, - name, - &volumes, - input, - timeout, - ProcessGroupId(0), - None, - ) - .await - .unwrap() - .unwrap(); -} -#[tokio::test] -async fn js_action_test_read_dir() { - let js_action = JsProcedure { args: vec![] }; - let path: PathBuf = "test/js_action_execute/" - .parse::() - .unwrap() - .canonicalize() - .unwrap(); - let package_id = "test-package".parse().unwrap(); - let package_version: Version = "0.3.0.3".parse().unwrap(); - let name = ProcedureName::Action("test-read-dir".parse().unwrap()); - let volumes: Volumes = serde_json::from_value(serde_json::json!({ - "main": { - "type": "data" - }, - "compat": { - "type": "assets" - }, - "filebrowser" :{ - "package-id": "filebrowser", - "path": "data", - "readonly": true, - "type": "pointer", - "volume-id": "main", - } - })) - .unwrap(); - let input: Option = None; - let timeout = Some(Duration::from_secs(10)); - js_action - .execute::( - &path, - &package_id, - &package_version, - name, - &volumes, - input, - timeout, - ProcessGroupId(0), - None, - ) - .await - .unwrap() - .unwrap(); -} - -#[tokio::test] -async fn js_rsync() { - let js_action = JsProcedure { args: vec![] }; - let path: PathBuf = "test/js_action_execute/" - .parse::() - .unwrap() - .canonicalize() - .unwrap(); - let package_id = "test-package".parse().unwrap(); - let package_version: Version = "0.3.0.3".parse().unwrap(); - let name = ProcedureName::Action("test-rsync".parse().unwrap()); - let volumes: Volumes = serde_json::from_value(serde_json::json!({ - "main": { - "type": "data" - }, - "compat": { - "type": "assets" - }, - "filebrowser" :{ - "package-id": "filebrowser", - "path": "data", - "readonly": true, - "type": "pointer", - "volume-id": "main", - } - })) - .unwrap(); - let input: Option = None; - let timeout = Some(Duration::from_secs(10)); - js_action - .execute::( - &path, - &package_id, - &package_version, - name, - &volumes, - input, - timeout, - ProcessGroupId(0), - None, - ) - .await - .unwrap() - .unwrap(); -} - -#[tokio::test] -async fn js_disk_usage() { - let js_action = JsProcedure { args: vec![] }; - let path: PathBuf = "test/js_action_execute/" - .parse::() - .unwrap() - .canonicalize() - .unwrap(); - let package_id = "test-package".parse().unwrap(); - let package_version: Version = "0.3.0.3".parse().unwrap(); - let name = ProcedureName::Action("test-disk-usage".parse().unwrap()); - let volumes: Volumes = serde_json::from_value(serde_json::json!({ - "main": { - "type": "data" - }, - "compat": { - "type": "assets" - }, - "filebrowser" :{ - "package-id": "filebrowser", - "path": "data", - "readonly": true, - "type": "pointer", - "volume-id": "main", - } - })) - .unwrap(); - let input: Option = None; - let timeout = Some(Duration::from_secs(10)); - js_action - .execute::( - &path, - &package_id, - &package_version, - name, - &volumes, - input, - timeout, - ProcessGroupId(0), - None, - ) - .await - .unwrap() - .unwrap(); -} diff --git a/backend/src/procedure/mod.rs b/backend/src/procedure/mod.rs index 7c02a03d5..68b295af9 100644 --- a/backend/src/procedure/mod.rs +++ b/backend/src/procedure/mod.rs @@ -69,51 +69,19 @@ impl PackageProcedure { timeout: Option, ) -> Result, Error> { tracing::trace!("Procedure execute {} {} - {:?}", self, pkg_id, name); - match self { - PackageProcedure::Docker(procedure) if procedure.inject == true => { - procedure - .inject(ctx, pkg_id, pkg_version, name, volumes, input, timeout) - .await - } - PackageProcedure::Docker(procedure) => { - procedure - .execute(ctx, pkg_id, pkg_version, name, volumes, input, timeout) - .await - } - #[cfg(feature = "js_engine")] - PackageProcedure::Script(procedure) => { - let man = ctx - .managers - .get(&(pkg_id.clone(), pkg_version.clone())) - .await - .ok_or_else(|| { - Error::new( - eyre!("No manager found for {}", pkg_id), - ErrorKind::NotFound, - ) - })?; - let rpc_client = man.rpc_client(); - let gid = if matches!(name, ProcedureName::Main) { - man.gid.new_main_gid() - } else { - man.gid.new_gid() - }; - - procedure - .execute( - &ctx.datadir, - pkg_id, - pkg_version, - name, - volumes, - input, - timeout, - gid, - Some(rpc_client), - ) - .await - } - } + let manager = ctx + .managers + .get(&(pkg_id.clone(), pkg_version.clone())) + .await + .ok_or_else(|| { + Error::new( + eyre!("No manager found for {}", pkg_id), + ErrorKind::NotFound, + ) + })?; + manager + .execute(name, imbl_value::to_value(&input)?, timeout) + .await } #[instrument(skip_all)] @@ -128,27 +96,19 @@ impl PackageProcedure { name: ProcedureName, ) -> Result, Error> { tracing::trace!("Procedure sandboxed {} {} - {:?}", self, pkg_id, name); - match self { - PackageProcedure::Docker(procedure) => { - procedure - .sandboxed(ctx, pkg_id, pkg_version, volumes, input, timeout) - .await - } - #[cfg(feature = "js_engine")] - PackageProcedure::Script(procedure) => { - procedure - .sandboxed( - &ctx.datadir, - pkg_id, - pkg_version, - volumes, - input, - timeout, - name, - ) - .await - } - } + let manager = ctx + .managers + .get(&(pkg_id.clone(), pkg_version.clone())) + .await + .ok_or_else(|| { + Error::new( + eyre!("No manager found for {}", pkg_id), + ErrorKind::NotFound, + ) + })?; + manager + .sanboxed(name, imbl_value::to_value(&input)?, timeout) + .await } } From 38a624fecf3109a648e243458660506c729dfa8a Mon Sep 17 00:00:00 2001 From: J H <2364004+Blu-J@users.noreply.github.com> Date: Mon, 13 Nov 2023 10:55:39 -0700 Subject: [PATCH 029/169] chore: Remove the todoes that we have done. Leaving in the thing about the rpc client because that will be part of the rewrite, and some of the previous logic should be usefull for the next version of the api. We do need a bidirection but that should world --- backend/src/manager/persistent_container.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/backend/src/manager/persistent_container.rs b/backend/src/manager/persistent_container.rs index e6380bf49..ac141679d 100644 --- a/backend/src/manager/persistent_container.rs +++ b/backend/src/manager/persistent_container.rs @@ -31,9 +31,6 @@ pub struct PersistentContainer { procedures: Mutex>, } -// BLUJ TODO Need to get the only action is this and not procedure/ -// BLUJ Modify the rpc client to match the new type - impl PersistentContainer { #[instrument(skip_all)] pub async fn init(seed: &Arc) -> Result { From a36ab71600632d3a0242a612548e16389c7de3d7 Mon Sep 17 00:00:00 2001 From: J H <2364004+Blu-J@users.noreply.github.com> Date: Mon, 13 Nov 2023 15:16:21 -0700 Subject: [PATCH 030/169] chore: Add some more comments for DrBones --- backend/src/manager/mod.rs | 4 ++-- backend/src/manager/persistent_container.rs | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/backend/src/manager/mod.rs b/backend/src/manager/mod.rs index 56fa408fd..474ca7e58 100644 --- a/backend/src/manager/mod.rs +++ b/backend/src/manager/mod.rs @@ -682,7 +682,7 @@ type RunMainResult = Result, Error>; #[instrument(skip_all)] async fn run_main(seed: Arc) -> RunMainResult { - let runtime = NonDetachingJoinHandle::from(tokio::spawn(start_up_image(seed.clone()))); + let runtime = NonDetachingJoinHandle::from(tokio::spawn(execute_main(seed.clone()))); let health = main_health_check_daemon(seed.clone()); let res = tokio::select! { @@ -694,7 +694,7 @@ async fn run_main(seed: Arc) -> RunMainResult { /// We want to start up the manifest, but in this case we want to know that we have generated the certificates. /// Note for _generated_certificate: Needed to know that before we start the state we have generated the certificate -async fn start_up_image(seed: Arc) -> Result, Error> { +async fn execute_main(seed: Arc) -> Result, Error> { seed.manifest .main .execute::<(), NoOutput>( diff --git a/backend/src/manager/persistent_container.rs b/backend/src/manager/persistent_container.rs index ac141679d..f71b98646 100644 --- a/backend/src/manager/persistent_container.rs +++ b/backend/src/manager/persistent_container.rs @@ -21,6 +21,8 @@ use crate::util::NonDetachingJoinHandle; struct ProcedureId(u64); +// @DRB Need to have a way of starting the the procudures and getting the information back +// @DRB On top of this we need to also have the procedures to have the effects and get the results back for them, maybe lock them to the running instance? /// Persistant container are the old containers that need to run all the time /// The goal is that all services will be persistent containers, waiting to run the main system. pub struct PersistentContainer { From 46f594ab71f9a53a14c25deca8c221cecd03635b Mon Sep 17 00:00:00 2001 From: J H <2364004+Blu-J@users.noreply.github.com> Date: Mon, 13 Nov 2023 15:18:51 -0700 Subject: [PATCH 031/169] chore: Add in the changes that where discussed with @Dr_Bonez in the room --- libs/start_init/initSrc/Effects.ts | 4 ++-- libs/start_init/initSrc/Runtime.ts | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/libs/start_init/initSrc/Effects.ts b/libs/start_init/initSrc/Effects.ts index 13eb9ce0d..7c376b0be 100644 --- a/libs/start_init/initSrc/Effects.ts +++ b/libs/start_init/initSrc/Effects.ts @@ -2,14 +2,14 @@ import * as T from "@start9labs/start-sdk/lib/types" import * as net from "net" import { CallbackHolder } from "./CallbackHolder" -const path = "/start9/sockets/rpcOut.sock" +const SOCKET_PATH = "/start9/sockets/startDaemon.sock" const MAIN = "main" as const export class Effects implements T.Effects { constructor(readonly method: string, readonly callbackHolder: CallbackHolder) {} id = 0 rpcRound(method: string, params: unknown) { const id = this.id++; - const client = net.createConnection(path, () => { + const client = net.createConnection(SOCKET_PATH, () => { client.write(JSON.stringify({ id, method, diff --git a/libs/start_init/initSrc/Runtime.ts b/libs/start_init/initSrc/Runtime.ts index b40b987f5..0c4b764c2 100644 --- a/libs/start_init/initSrc/Runtime.ts +++ b/libs/start_init/initSrc/Runtime.ts @@ -16,6 +16,10 @@ import { CallbackHolder } from "./CallbackHolder" import * as CP from "child_process" import * as Mod from "module" + +const SOCKET_PATH = "/start9/sockets/rpc.sock" +const LOCATION_OF_SERVICE_JS = "/services/service.js" + const childProcesses = new Map() let childProcessIndex = 0 const require = Mod.prototype.require @@ -76,7 +80,6 @@ const cleanupRequire = (requireChildProcessIndex: number) => { } const idType = some(string, number) -const path = "/start9/sockets/rpc.sock" const runType = object({ id: idType, method: literal("run"), @@ -104,7 +107,7 @@ const dealWithInput = async (callbackHolder: CallbackHolder, input: unknown) => const index = setupRequire() const effects = new Effects(`/${methodName.join("/")}`, callbackHolder) // @ts-ignore - return import("/services/service.js") + return import(LOCATION_OF_SERVICE_JS) .then((x) => methodName.reduce(reduceMethod(methodArgs, effects), x)) .then() .then((result) => ({ id, result })) @@ -135,7 +138,7 @@ export class Runtime { unixSocketServer = net.createServer(async (server) => {}) private callbacks = new CallbackHolder() constructor() { - this.unixSocketServer.listen(path) + this.unixSocketServer.listen(SOCKET_PATH) this.unixSocketServer.on("connection", (s) => { s.on("data", (a) => From 5f40d9400ca58b2b1930d31dbcd2765b96943879 Mon Sep 17 00:00:00 2001 From: Aiden McClelland Date: Mon, 13 Nov 2023 15:29:27 -0700 Subject: [PATCH 032/169] move container init system to project root --- {libs/start_init => container-runtime}/.gitignore | 0 {libs/start_init => container-runtime}/initSrc/CallbackHolder.ts | 0 {libs/start_init => container-runtime}/initSrc/Effects.ts | 0 {libs/start_init => container-runtime}/initSrc/Runtime.ts | 0 {libs/start_init => container-runtime}/initSrc/index.ts | 0 {libs/start_init => container-runtime}/package-lock.json | 0 {libs/start_init => container-runtime}/package.json | 0 {libs/start_init => container-runtime}/readme.md | 0 {libs/start_init => container-runtime}/tsconfig.json | 0 9 files changed, 0 insertions(+), 0 deletions(-) rename {libs/start_init => container-runtime}/.gitignore (100%) rename {libs/start_init => container-runtime}/initSrc/CallbackHolder.ts (100%) rename {libs/start_init => container-runtime}/initSrc/Effects.ts (100%) rename {libs/start_init => container-runtime}/initSrc/Runtime.ts (100%) rename {libs/start_init => container-runtime}/initSrc/index.ts (100%) rename {libs/start_init => container-runtime}/package-lock.json (100%) rename {libs/start_init => container-runtime}/package.json (100%) rename {libs/start_init => container-runtime}/readme.md (100%) rename {libs/start_init => container-runtime}/tsconfig.json (100%) diff --git a/libs/start_init/.gitignore b/container-runtime/.gitignore similarity index 100% rename from libs/start_init/.gitignore rename to container-runtime/.gitignore diff --git a/libs/start_init/initSrc/CallbackHolder.ts b/container-runtime/initSrc/CallbackHolder.ts similarity index 100% rename from libs/start_init/initSrc/CallbackHolder.ts rename to container-runtime/initSrc/CallbackHolder.ts diff --git a/libs/start_init/initSrc/Effects.ts b/container-runtime/initSrc/Effects.ts similarity index 100% rename from libs/start_init/initSrc/Effects.ts rename to container-runtime/initSrc/Effects.ts diff --git a/libs/start_init/initSrc/Runtime.ts b/container-runtime/initSrc/Runtime.ts similarity index 100% rename from libs/start_init/initSrc/Runtime.ts rename to container-runtime/initSrc/Runtime.ts diff --git a/libs/start_init/initSrc/index.ts b/container-runtime/initSrc/index.ts similarity index 100% rename from libs/start_init/initSrc/index.ts rename to container-runtime/initSrc/index.ts diff --git a/libs/start_init/package-lock.json b/container-runtime/package-lock.json similarity index 100% rename from libs/start_init/package-lock.json rename to container-runtime/package-lock.json diff --git a/libs/start_init/package.json b/container-runtime/package.json similarity index 100% rename from libs/start_init/package.json rename to container-runtime/package.json diff --git a/libs/start_init/readme.md b/container-runtime/readme.md similarity index 100% rename from libs/start_init/readme.md rename to container-runtime/readme.md diff --git a/libs/start_init/tsconfig.json b/container-runtime/tsconfig.json similarity index 100% rename from libs/start_init/tsconfig.json rename to container-runtime/tsconfig.json From 862ca375ee96a48e56f95534684666da1a226215 Mon Sep 17 00:00:00 2001 From: Matt Hill Date: Mon, 13 Nov 2023 15:59:16 -0700 Subject: [PATCH 033/169] rename frontend to web --- frontend/.vscode/extensions.json | 4 -- frontend/.vscode/launch.json | 20 --------- frontend/.vscode/tasks.json | 42 ------------------ {frontend => web}/.browserslistrc | 0 {frontend => web}/.editorconfig | 0 {frontend => web}/.gitignore | 0 {frontend => web}/.prettierrc | 0 {frontend => web}/README.md | 0 {frontend => web}/angular.json | 0 {frontend => web}/build-config.js | 0 {frontend => web}/config-sample.json | 0 {frontend => web}/ionic.config.json | 0 {frontend => web}/lint-staged.config.js | 0 {frontend => web}/package-lock.json | 0 {frontend => web}/package.json | 0 {frontend => web}/patchdb-ui-seed.json | 0 .../src/app/app-routing.module.ts | 0 .../install-wizard/src/app/app.component.html | 0 .../install-wizard/src/app/app.component.scss | 0 .../install-wizard/src/app/app.component.ts | 0 .../install-wizard/src/app/app.module.ts | 0 .../src/app/pages/home/home.module.ts | 0 .../src/app/pages/home/home.page.html | 0 .../src/app/pages/home/home.page.scss | 0 .../src/app/pages/home/home.page.ts | 0 .../src/app/services/api/api.service.ts | 0 .../src/app/services/api/live-api.service.ts | 0 .../src/app/services/api/mock-api.service.ts | 0 .../src/environments/environment.prod.ts | 0 .../src/environments/environment.ts | 0 .../projects/install-wizard/src/index.html | 0 .../projects/install-wizard/src/main.ts | 0 .../projects/install-wizard/src/polyfills.ts | 0 .../projects/install-wizard/src/styles.scss | 0 .../projects/install-wizard/src/zone-flags.ts | 0 .../projects/install-wizard/tsconfig.json | 0 .../projects/marketplace/ng-package.json | 0 .../projects/marketplace/package.json | 0 .../store-icon/store-icon.component.html | 0 .../store-icon/store-icon.component.module.ts | 0 .../store-icon/store-icon.component.scss | 0 .../store-icon/store-icon.component.ts | 0 .../list/categories/categories.component.html | 0 .../list/categories/categories.component.scss | 0 .../list/categories/categories.component.ts | 0 .../list/categories/categories.module.ts | 0 .../src/pages/list/item/item.component.html | 0 .../src/pages/list/item/item.component.ts | 0 .../src/pages/list/item/item.module.ts | 0 .../pages/list/search/search.component.html | 0 .../pages/list/search/search.component.scss | 0 .../src/pages/list/search/search.component.ts | 0 .../src/pages/list/search/search.module.ts | 0 .../list/skeleton/skeleton.component.html | 0 .../pages/list/skeleton/skeleton.component.ts | 0 .../pages/list/skeleton/skeleton.module.ts | 0 .../release-notes.component.html | 0 .../release-notes.component.scss | 0 .../release-notes/release-notes.component.ts | 0 .../release-notes/release-notes.module.ts | 0 .../src/pages/show/about/about.component.html | 0 .../src/pages/show/about/about.component.scss | 0 .../src/pages/show/about/about.component.ts | 0 .../src/pages/show/about/about.module.ts | 0 .../show/additional/additional.component.html | 0 .../show/additional/additional.component.scss | 0 .../show/additional/additional.component.ts | 0 .../show/additional/additional.module.ts | 0 .../dependencies/dependencies.component.html | 0 .../dependencies/dependencies.component.ts | 0 .../show/dependencies/dependencies.module.ts | 0 .../pages/show/package/package.component.html | 0 .../pages/show/package/package.component.scss | 0 .../pages/show/package/package.component.ts | 0 .../src/pages/show/package/package.module.ts | 0 .../src/pipes/filter-packages.pipe.ts | 0 .../marketplace/src/pipes/mime-type.pipe.ts | 0 .../projects/marketplace/src/public-api.ts | 0 .../src/services/marketplace.service.ts | 0 .../projects/marketplace/src/types.ts | 0 .../projects/marketplace/tsconfig.json | 0 .../src/app/app-routing.module.ts | 0 .../setup-wizard/src/app/app.component.html | 0 .../setup-wizard/src/app/app.component.scss | 0 .../setup-wizard/src/app/app.component.ts | 0 .../setup-wizard/src/app/app.module.ts | 0 .../modals/cifs-modal/cifs-modal.module.ts | 0 .../modals/cifs-modal/cifs-modal.page.html | 0 .../modals/cifs-modal/cifs-modal.page.scss | 0 .../app/modals/cifs-modal/cifs-modal.page.ts | 0 .../app/modals/password/password.module.ts | 0 .../app/modals/password/password.page.html | 0 .../src/app/modals/password/password.page.ts | 0 .../app/pages/attach/attach-routing.module.ts | 0 .../src/app/pages/attach/attach.module.ts | 0 .../src/app/pages/attach/attach.page.html | 0 .../src/app/pages/attach/attach.page.scss | 0 .../src/app/pages/attach/attach.page.ts | 0 .../pages/embassy/embassy-routing.module.ts | 0 .../src/app/pages/embassy/embassy.module.ts | 0 .../src/app/pages/embassy/embassy.page.html | 0 .../src/app/pages/embassy/embassy.page.scss | 0 .../src/app/pages/embassy/embassy.page.ts | 0 .../src/app/pages/home/home-routing.module.ts | 0 .../src/app/pages/home/home.module.ts | 0 .../src/app/pages/home/home.page.html | 0 .../src/app/pages/home/home.page.scss | 0 .../src/app/pages/home/home.page.ts | 0 .../src/app/pages/loading/loading.module.ts | 0 .../src/app/pages/loading/loading.page.html | 0 .../src/app/pages/loading/loading.page.ts | 0 .../pages/recover/drive-status.component.html | 0 .../pages/recover/recover-routing.module.ts | 0 .../src/app/pages/recover/recover.module.ts | 0 .../src/app/pages/recover/recover.page.html | 0 .../src/app/pages/recover/recover.page.scss | 0 .../src/app/pages/recover/recover.page.ts | 0 .../download-doc/download-doc.component.html | 0 .../download-doc/download-doc.component.ts | 0 .../pages/success/success-routing.module.ts | 0 .../src/app/pages/success/success.module.ts | 0 .../src/app/pages/success/success.page.html | 0 .../src/app/pages/success/success.page.scss | 0 .../src/app/pages/success/success.page.ts | 0 .../pages/transfer/transfer-routing.module.ts | 0 .../src/app/pages/transfer/transfer.module.ts | 0 .../src/app/pages/transfer/transfer.page.html | 0 .../src/app/pages/transfer/transfer.page.scss | 0 .../src/app/pages/transfer/transfer.page.ts | 0 .../src/app/services/api/api.service.ts | 0 .../src/app/services/api/live-api.service.ts | 0 .../src/app/services/api/mock-api.service.ts | 0 .../src/app/services/state.service.ts | 0 .../src/environments/environment.prod.ts | 0 .../src/environments/environment.ts | 0 .../projects/setup-wizard/src/index.html | 0 .../projects/setup-wizard/src/main.ts | 0 .../projects/setup-wizard/src/polyfills.ts | 0 .../projects/setup-wizard/src/styles.scss | 0 .../projects/setup-wizard/src/zone-flags.ts | 0 .../projects/setup-wizard/tsconfig.json | 0 .../fonts/Benton_Sans/BentonSans-Regular.otf | Bin .../fonts/Courier_New/CourierNew-Bold.ttf | Bin .../fonts/Courier_New/CourierNew-Regular.ttf | Bin .../fonts/Montserrat/Montserrat-Black.ttf | Bin .../Montserrat/Montserrat-BlackItalic.ttf | Bin .../fonts/Montserrat/Montserrat-Bold.ttf | Bin .../Montserrat/Montserrat-BoldItalic.ttf | Bin .../fonts/Montserrat/Montserrat-ExtraBold.ttf | Bin .../Montserrat/Montserrat-ExtraBoldItalic.ttf | Bin .../Montserrat/Montserrat-ExtraLight.ttf | Bin .../Montserrat-ExtraLightItalic.ttf | Bin .../fonts/Montserrat/Montserrat-Italic.ttf | Bin .../fonts/Montserrat/Montserrat-Light.ttf | Bin .../Montserrat/Montserrat-LightItalic.ttf | Bin .../fonts/Montserrat/Montserrat-Medium.ttf | Bin .../Montserrat/Montserrat-MediumItalic.ttf | Bin .../fonts/Montserrat/Montserrat-Regular.ttf | Bin .../fonts/Montserrat/Montserrat-SemiBold.ttf | Bin .../Montserrat/Montserrat-SemiBoldItalic.ttf | Bin .../fonts/Montserrat/Montserrat-Thin.ttf | Bin .../Montserrat/Montserrat-ThinItalic.ttf | Bin .../shared/assets/fonts/Montserrat/OFL.txt | 0 .../shared/assets/fonts/Open_Sans/LICENSE.txt | 0 .../assets/fonts/Open_Sans/OpenSans-Bold.ttf | Bin .../fonts/Open_Sans/OpenSans-BoldItalic.ttf | Bin .../fonts/Open_Sans/OpenSans-ExtraBold.ttf | Bin .../Open_Sans/OpenSans-ExtraBoldItalic.ttf | Bin .../fonts/Open_Sans/OpenSans-Italic.ttf | Bin .../assets/fonts/Open_Sans/OpenSans-Light.ttf | Bin .../fonts/Open_Sans/OpenSans-LightItalic.ttf | Bin .../fonts/Open_Sans/OpenSans-Regular.ttf | Bin .../fonts/Open_Sans/OpenSans-SemiBold.ttf | Bin .../Open_Sans/OpenSans-SemiBoldItalic.ttf | Bin .../assets/fonts/text-security-disc.woff2 | Bin .../projects/shared/assets/icon/favicon.ico | Bin .../shared/assets/img/background_dark.jpeg | Bin .../shared/assets/img/background_light.jpeg | Bin .../shared/assets/img/community-store.png | Bin .../projects/shared/assets/img/icon.png | Bin .../shared/assets/img/icon_apple_touch.png | Bin .../shared/assets/img/icons/bitcoin.svg | 0 .../projects/shared/assets/img/icons/snek.png | Bin .../shared/assets/img/icons/wifi-0.png | Bin .../shared/assets/img/icons/wifi-1.png | Bin .../shared/assets/img/icons/wifi-2.png | Bin .../shared/assets/img/icons/wifi-3.png | Bin .../assets/img/service-icons/bitcoind.svg | 0 .../img/service-icons/btc-rpc-proxy.png | Bin .../shared/assets/img/service-icons/lnd.png | Bin .../shared/assets/markdown/md-sample.md | 0 .../projects/shared/ng-package.json | 0 .../projects/shared/package.json | 0 .../projects/shared/src/classes/http-error.ts | 0 .../projects/shared/src/classes/rpc-error.ts | 0 .../initializing/initializing.component.html | 0 .../initializing/initializing.component.scss | 0 .../initializing/initializing.component.ts | 0 .../initializing/initializing.module.ts | 0 .../logs-window/logs-window.component.html | 0 .../logs-window/logs-window.component.scss | 0 .../logs-window/logs-window.component.ts | 0 .../components/loading/loading.component.scss | 0 .../components/loading/loading.component.ts | 0 .../src/components/loading/loading.module.ts | 0 .../src/components/loading/loading.service.ts | 0 .../markdown/markdown.component.html | 0 .../markdown/markdown.component.module.ts | 0 .../markdown/markdown.component.scss | 0 .../components/markdown/markdown.component.ts | 0 .../text-spinner/text-spinner.component.html | 0 .../text-spinner.component.module.ts | 0 .../text-spinner/text-spinner.component.scss | 0 .../text-spinner/text-spinner.component.ts | 0 .../components/ticker/ticker.component.scss | 0 .../src/components/ticker/ticker.component.ts | 0 .../src/components/ticker/ticker.module.ts | 0 .../src/directives/drag-scroller.directive.ts | 0 .../src/directives/enter/enter.directive.ts | 0 .../src/directives/enter/enter.module.ts | 0 .../directives/responsive-col.directive.ts | 0 .../src/directives/safe-links.directive.ts | 0 .../shared/src/mocks/get-setup-status.ts | 0 .../shared/src/pipes/emver/emver.module.ts | 0 .../shared/src/pipes/emver/emver.pipe.ts | 0 .../shared/src/pipes/guid/guid.module.ts | 0 .../shared/src/pipes/guid/guid.pipe.ts | 0 .../src/pipes/markdown/markdown.module.ts | 0 .../src/pipes/markdown/markdown.pipe.ts | 0 .../shared/src/pipes/shared/empty.pipe.ts | 0 .../shared/src/pipes/shared/includes.pipe.ts | 0 .../shared/src/pipes/shared/shared.module.ts | 0 .../shared/src/pipes/shared/trust.pipe.ts | 0 .../unit-conversion/unit-conversion.module.ts | 0 .../unit-conversion/unit-conversion.pipe.ts | 0 .../projects/shared/src/public-api.ts | 0 .../shared/src/services/copy.service.ts | 0 .../src/services/download-html.service.ts | 0 .../shared/src/services/emver.service.ts | 0 .../shared/src/services/error.service.ts | 0 .../shared/src/services/http.service.ts | 0 .../shared/src/services/setup-logs.service.ts | 0 .../shared/src/services/setup.service.ts | 0 .../dark-theme/dark-theme.component.scss | 0 .../themes/dark-theme/dark-theme.component.ts | 0 .../themes/dark-theme/dark-theme.module.ts | 0 .../light-theme/light-theme.component.scss | 0 .../light-theme/light-theme.component.ts | 0 .../themes/light-theme/light-theme.module.ts | 0 .../shared/src/tokens/relative-url.ts | 0 .../projects/shared/src/tokens/theme.ts | 0 .../projects/shared/src/types/api.ts | 0 .../projects/shared/src/types/constructor.ts | 0 .../projects/shared/src/types/http.types.ts | 0 .../projects/shared/src/types/rpc.types.ts | 0 .../projects/shared/src/types/url.ts | 0 .../shared/src/types/workspace-config.ts | 0 .../projects/shared/src/util/base-64.ts | 0 .../shared/src/util/copy-to-clipboard.ts | 0 .../shared/src/util/get-new-entries.ts | 0 .../projects/shared/src/util/get-pkg-id.ts | 0 .../projects/shared/src/util/invert.ts | 0 .../projects/shared/src/util/misc.util.ts | 0 .../projects/shared/src/util/rpc.util.ts | 0 .../shared/src/util/to-local-iso-string.ts | 0 .../projects/shared/src/util/unused.ts | 0 .../projects/shared/styles/global.scss | 0 .../projects/shared/styles/shared.scss | 0 .../projects/shared/styles/taiga.scss | 0 .../projects/shared/styles/variables.scss | 0 .../projects/shared/tsconfig.json | 0 .../projects/ui/ngsw-config.json | 0 .../projects/ui/src/app/app.component.html | 0 .../projects/ui/src/app/app.component.scss | 0 .../projects/ui/src/app/app.component.ts | 0 .../projects/ui/src/app/app.module.ts | 0 .../projects/ui/src/app/app.providers.ts | 0 .../connection-bar.component.html | 0 .../connection-bar.component.module.ts | 0 .../connection-bar.component.scss | 0 .../connection-bar.component.ts | 0 .../src/app/app/footer/footer.component.html | 0 .../src/app/app/footer/footer.component.scss | 0 .../ui/src/app/app/footer/footer.component.ts | 0 .../ui/src/app/app/footer/footer.module.ts | 0 .../ui/src/app/app/menu/menu.component.html | 0 .../ui/src/app/app/menu/menu.component.scss | 0 .../ui/src/app/app/menu/menu.component.ts | 0 .../ui/src/app/app/menu/menu.module.ts | 0 .../app/preloader/preloader.component.html | 0 .../app/app/preloader/preloader.component.ts | 0 .../src/app/app/preloader/preloader.module.ts | 0 .../ui/src/app/app/snek/snake.page.html | 0 .../ui/src/app/app/snek/snake.page.scss | 0 .../ui/src/app/app/snek/snake.page.ts | 0 .../ui/src/app/app/snek/snek.directive.ts | 0 .../ui/src/app/app/snek/snek.module.ts | 0 .../app/apps/diagnostic/diagnostic.module.ts | 0 .../app/apps/diagnostic/home/home.module.ts | 0 .../app/apps/diagnostic/home/home.page.html | 0 .../app/apps/diagnostic/home/home.page.scss | 0 .../src/app/apps/diagnostic/home/home.page.ts | 0 .../app/apps/diagnostic/logs/logs.module.ts | 0 .../app/apps/diagnostic/logs/logs.page.html | 0 .../src/app/apps/diagnostic/logs/logs.page.ts | 0 .../diagnostic/services/diagnostic.service.ts | 0 .../services/live-diagnostic.service.ts | 0 .../services/mock-diagnostic.service.ts | 0 .../ui/src/app/apps/loading/loading.module.ts | 0 .../ui/src/app/apps/loading/loading.page.html | 0 .../ui/src/app/apps/loading/loading.page.ts | 0 .../login/ca-wizard/ca-wizard.component.html | 0 .../login/ca-wizard/ca-wizard.component.scss | 0 .../login/ca-wizard/ca-wizard.component.ts | 0 .../ui/src/app/apps/login/login.module.ts | 0 .../ui/src/app/apps/login/login.page.html | 0 .../ui/src/app/apps/login/login.page.scss | 0 .../ui/src/app/apps/login/login.page.ts | 0 .../components/actions/actions.component.html | 0 .../components/actions/actions.component.scss | 0 .../components/actions/actions.component.ts | 0 .../components/card/card.component.html | 0 .../components/card/card.component.scss | 0 .../portal/components/card/card.component.ts | 0 .../drawer/drawer-item.directive.ts | 0 .../components/drawer/drawer.component.html | 0 .../components/drawer/drawer.component.scss | 0 .../components/drawer/drawer.component.ts | 0 .../header-menu/header-menu.component.html | 0 .../header-menu/header-menu.component.scss | 0 .../header-menu/header-menu.component.ts | 0 .../components/header/header.component.html | 0 .../components/header/header.component.scss | 0 .../components/header/header.component.ts | 0 .../navigation/navigation.component.html | 0 .../navigation/navigation.component.scss | 0 .../navigation/navigation.component.ts | 0 .../components/skeleton-list.component.ts | 0 .../apps/portal/constants/system-utilities.ts | 0 .../apps/portal/pipes/to-navigation-item.ts | 0 .../app/apps/portal/pipes/to-notifications.ts | 0 .../src/app/apps/portal/portal.component.html | 0 .../src/app/apps/portal/portal.component.scss | 0 .../src/app/apps/portal/portal.component.ts | 0 .../ui/src/app/apps/portal/portal.module.ts | 0 .../routes/desktop/dektop-loading.service.ts | 0 .../routes/desktop/desktop-item.directive.ts | 0 .../routes/desktop/desktop.component.html | 0 .../routes/desktop/desktop.component.scss | 0 .../routes/desktop/desktop.component.ts | 0 .../portal/routes/desktop/desktop.module.ts | 0 .../components/action-success.component.ts | 0 .../service/components/action.component.ts | 0 .../service/components/actions.component.ts | 0 .../components/additional-item.component.ts | 0 .../components/additional.component.ts | 0 .../components/config-dep.component.ts | 0 .../components/credential.component.ts | 0 .../components/dependencies.component.ts | 0 .../components/dependency.component.ts | 0 .../components/health-check.component.ts | 0 .../components/health-checks.component.ts | 0 .../service/components/interface.component.ts | 0 .../components/interfaces.component.ts | 0 .../service/components/menu-item.component.ts | 0 .../service/components/menu.component.ts | 0 .../service/components/progress.component.ts | 0 .../service/components/status.component.ts | 0 .../routes/service/modals/config.component.ts | 0 .../service/modals/credentials.component.ts | 0 .../service/pipes/group-actions.pipe.ts | 0 .../service/pipes/interface-info.pipe.ts | 0 .../service/pipes/progress-data.pipe.ts | 0 .../service/pipes/to-additional.pipe.ts | 0 .../routes/service/pipes/to-menu.pipe.ts | 0 .../service/routes/actions.component.ts | 0 .../service/routes/interface.component.ts | 0 .../routes/service/routes/logs.component.ts | 0 .../routes/service/routes/outlet.component.ts | 0 .../service/routes/service.component.ts | 0 .../portal/routes/service/service.module.ts | 0 .../routes/service/types/dependency-info.ts | 0 .../service/types/package-config-data.ts | 0 .../portal/routes/service/utils/update-tab.ts | 0 .../system/backups/backups.component.ts | 0 .../backups/components/physical.component.ts | 0 .../backups/components/status.component.ts | 0 .../backups/components/targets.component.ts | 0 .../backups/components/upcoming.component.ts | 0 .../system/backups/modals/backup.component.ts | 0 .../system/backups/modals/edit.component.ts | 0 .../backups/modals/history.component.ts | 0 .../system/backups/modals/jobs.component.ts | 0 .../backups/modals/recover.component.ts | 0 .../system/backups/modals/report.component.ts | 0 .../system/backups/modals/target.component.ts | 0 .../backups/modals/targets.component.ts | 0 .../system/backups/pipes/duration.pipe.ts | 0 .../backups/pipes/get-backup-icon.pipe.ts | 0 .../backups/pipes/get-display-info.pipe.ts | 0 .../system/backups/pipes/has-error.pipe.ts | 0 .../backups/pipes/to-human-cron.pipe.ts | 0 .../system/backups/pipes/to-options.pipe.ts | 0 .../system/backups/services/create.service.ts | 0 .../backups/services/restore.service.ts | 0 .../system/backups/types/backup-config.ts | 0 .../system/backups/types/backup-type.ts | 0 .../system/backups/types/display-info.ts | 0 .../system/backups/types/recover-data.ts | 0 .../system/backups/types/recover-option.ts | 0 .../system/backups/utils/job-builder.ts | 0 .../system/sideload/dependencies.component.ts | 0 .../system/sideload/package.component.ts | 0 .../system/sideload/sideload.component.ts | 0 .../routes/system/sideload/sideload.utils.ts | 0 .../routes/system/snek/snek.component.ts | 0 .../portal/routes/system/system.module.ts | 0 .../updates/components/item.component.ts | 0 .../updates/pipes/filter-updates.pipe.ts | 0 .../updates/pipes/install-progress.pipe.ts | 0 .../system/updates/updates.component.ts | 0 .../apps/portal/services/desktop.service.ts | 0 .../portal/services/navigation.service.ts | 0 .../portal/services/notifications.service.ts | 0 .../services/routing-strategy.service.ts | 0 .../apps/portal/services/services.service.ts | 0 .../app/apps/portal/types/navigation-item.ts | 0 .../apps/portal/utils/system-tab-resolver.ts | 0 .../apps/portal/utils/to-navigation-item.ts | 0 .../app/apps/portal/utils/to-router-link.ts | 0 .../backup-report.component.html | 0 .../backup-report/backup-report.component.ts | 0 .../backup-report/backup-report.module.ts | 0 .../app/apps/ui/modals/form/form.module.ts | 0 .../app/apps/ui/modals/form/form.page.html | 0 .../app/apps/ui/modals/form/form.page.scss | 0 .../src/app/apps/ui/modals/form/form.page.ts | 0 .../ui/modals/prompt/prompt.component.html | 0 .../ui/modals/prompt/prompt.component.scss | 0 .../apps/ui/modals/prompt/prompt.component.ts | 0 .../apps/ui/modals/prompt/prompt.module.ts | 0 .../apps/ui/pages/backups/backups.module.ts | 0 .../backing-up/backing-up.component.html | 0 .../backing-up/backing-up.component.ts | 0 .../directives/backup-create.directive.ts | 0 .../directives/backup-restore.directive.ts | 0 .../backup-select/backup-select.module.ts | 0 .../backup-select/backup-select.page.html | 0 .../backup-select/backup-select.page.scss | 0 .../backup-select/backup-select.page.ts | 0 .../recover-select/recover-select.module.ts | 0 .../recover-select/recover-select.page.html | 0 .../recover-select/recover-select.page.scss | 0 .../recover-select/recover-select.page.ts | 0 .../modals/recover-select/to-options.pipe.ts | 0 .../target-select/target-select.module.ts | 0 .../target-select/target-select.page.html | 0 .../target-select/target-select.page.scss | 0 .../target-select/target-select.page.ts | 0 .../target-status.component.html | 0 .../backup-history/backup-history.module.ts | 0 .../backup-history/backup-history.page.html | 0 .../backup-history/backup-history.page.scss | 0 .../backup-history/backup-history.page.ts | 0 .../pages/backup-jobs/backup-jobs.module.ts | 0 .../pages/backup-jobs/backup-jobs.page.html | 0 .../pages/backup-jobs/backup-jobs.page.scss | 0 .../pages/backup-jobs/backup-jobs.page.ts | 0 .../edit-job/edit-job.component.html | 0 .../edit-job/edit-job.component.scss | 0 .../edit-job/edit-job.component.ts | 0 .../pages/backup-jobs/edit-job/job-builder.ts | 0 .../pages/backups/pages/backup-jobs/pipes.ts | 0 .../backup-targets/backup-targets.module.ts | 0 .../backup-targets/backup-targets.page.html | 0 .../backup-targets/backup-targets.page.scss | 0 .../backup-targets/backup-targets.page.ts | 0 .../backups/pages/backups/backups.module.ts | 0 .../backups/pages/backups/backups.page.html | 0 .../backups/pages/backups/backups.page.scss | 0 .../backups/pages/backups/backups.page.ts | 0 .../backups/pipes/get-display-info.pipe.ts | 0 .../backups/pipes/has-valid-backup.pipe.ts | 0 .../backups/pipes/target-pipes.module.ts | 0 .../ui/pages/backups/types/target-types.ts | 0 .../src/app/apps/ui/pages/home/home.module.ts | 0 .../src/app/apps/ui/pages/home/home.page.html | 0 .../src/app/apps/ui/pages/home/home.page.scss | 0 .../src/app/apps/ui/pages/home/home.page.ts | 0 .../marketplace-list.module.ts | 0 .../marketplace-list.page.html | 0 .../marketplace-list.page.scss | 0 .../marketplace-list/marketplace-list.page.ts | 0 .../marketplace-settings.module.ts | 0 .../marketplace-settings.page.html | 0 .../marketplace-settings.page.scss | 0 .../marketplace-settings.page.ts | 0 .../marketplace-show-components.module.ts | 0 .../marketplace-show-controls.component.html | 0 .../marketplace-show-controls.component.ts | 0 .../marketplace-show-controls.page.scss | 0 .../marketplace-show-dependent.component.html | 0 .../marketplace-show-dependent.component.scss | 0 .../marketplace-show-dependent.component.ts | 0 .../marketplace-show-header.component.html | 0 .../marketplace-show-header.component.ts | 0 .../marketplace-show.module.ts | 0 .../marketplace-show.page.html | 0 .../marketplace-show.page.scss | 0 .../marketplace-show/marketplace-show.page.ts | 0 .../marketplace-status.component.html | 0 .../marketplace-status.component.scss | 0 .../marketplace-status.component.ts | 0 .../marketplace-status.module.ts | 0 .../pages/marketplace/marketplace.module.ts | 0 .../release-notes/release-notes.module.ts | 0 .../release-notes/release-notes.page.html | 0 .../release-notes/release-notes.page.ts | 0 .../notifications/notifications.module.ts | 0 .../notifications/notifications.page.html | 0 .../notifications/notifications.page.scss | 0 .../pages/notifications/notifications.page.ts | 0 .../action-success/action-success.module.ts | 0 .../action-success/action-success.page.html | 0 .../action-success/action-success.page.ts | 0 .../app-actions-item.component.html | 0 .../app-actions/app-actions.module.ts | 0 .../app-actions/app-actions.page.html | 0 .../app-actions/app-actions.page.scss | 0 .../services/app-actions/app-actions.page.ts | 0 .../app-credentials/app-credentials.module.ts | 0 .../app-credentials/app-credentials.page.html | 0 .../app-credentials/app-credentials.page.scss | 0 .../app-credentials/app-credentials.page.ts | 0 .../app-interface/app-interface.module.ts | 0 .../app-interface/app-interface.page.html | 0 .../app-interface/app-interface.page.scss | 0 .../app-interface/app-interface.page.ts | 0 .../app-list-icon.component.html | 0 .../app-list-icon.component.scss | 0 .../app-list-icon/app-list-icon.component.ts | 0 .../app-list-pkg/app-list-pkg.component.html | 0 .../app-list-pkg/app-list-pkg.component.scss | 0 .../app-list-pkg/app-list-pkg.component.ts | 0 .../launch-menu/launch-menu.component.html | 0 .../launch-menu/launch-menu.component.scss | 0 .../launch-menu/launch-menu.component.ts | 0 .../launch-menu/launch-menu.module.ts | 0 .../launchable-interfaces.pipe.ts | 0 .../services/app-list/app-list.module.ts | 0 .../services/app-list/app-list.page.html | 0 .../services/app-list/app-list.page.scss | 0 .../pages/services/app-list/app-list.page.ts | 0 .../services/app-list/package-info.pipe.ts | 0 .../services/app-logs/app-logs.module.ts | 0 .../services/app-logs/app-logs.page.html | 0 .../services/app-logs/app-logs.page.scss | 0 .../pages/services/app-logs/app-logs.page.ts | 0 .../services/app-show/app-show.module.ts | 0 .../services/app-show/app-show.page.html | 0 .../pages/services/app-show/app-show.page.ts | 0 .../app-show-additional.component.html | 0 .../app-show-additional.component.ts | 0 .../app-show-dependencies.component.html | 0 .../app-show-dependencies.component.scss | 0 .../app-show-dependencies.component.ts | 0 .../app-show-header.component.html | 0 .../app-show-header.component.scss | 0 .../app-show-header.component.ts | 0 .../app-show-health-checks.component.html | 0 .../app-show-health-checks.component.scss | 0 .../app-show-health-checks.component.ts | 0 .../app-show-interfaces.component.html | 0 .../app-show-interfaces.component.scss | 0 .../app-show-interfaces.component.ts | 0 .../app-show-menu.component.html | 0 .../app-show-menu.component.scss | 0 .../app-show-menu/app-show-menu.component.ts | 0 .../app-show-progress.component.html | 0 .../app-show-progress.component.scss | 0 .../app-show-progress.component.ts | 0 .../app-show-status.component.html | 0 .../app-show-status.component.scss | 0 .../app-show-status.component.ts | 0 .../app-config/app-config-dep.component.ts | 0 .../modals/app-config/app-config.module.ts | 0 .../modals/app-config/app-config.page.html | 0 .../modals/app-config/app-config.page.scss | 0 .../modals/app-config/app-config.page.ts | 0 .../app-show/pipes/health-color.pipe.ts | 0 .../app-show/pipes/progress-data.pipe.ts | 0 .../apps/ui/pages/services/services.module.ts | 0 .../services/status/status.component.html | 0 .../status/status.component.module.ts | 0 .../services/status/status.component.scss | 0 .../pages/services/status/status.component.ts | 0 .../ui/pages/system/domains/domain.const.ts | 0 .../ui/pages/system/domains/domains.module.ts | 0 .../ui/pages/system/domains/domains.page.html | 0 .../ui/pages/system/domains/domains.page.scss | 0 .../ui/pages/system/domains/domains.page.ts | 0 .../ui/pages/system/email/email.module.ts | 0 .../ui/pages/system/email/email.page.html | 0 .../ui/pages/system/email/email.page.scss | 0 .../apps/ui/pages/system/email/email.page.ts | 0 .../experimental-features.module.ts | 0 .../experimental-features.page.html | 0 .../experimental-features.page.scss | 0 .../experimental-features.page.ts | 0 .../system/kernel-logs/kernel-logs.module.ts | 0 .../system/kernel-logs/kernel-logs.page.html | 0 .../system/kernel-logs/kernel-logs.page.scss | 0 .../system/kernel-logs/kernel-logs.page.ts | 0 .../ui/pages/system/proxies/proxies.module.ts | 0 .../ui/pages/system/proxies/proxies.page.html | 0 .../ui/pages/system/proxies/proxies.page.scss | 0 .../ui/pages/system/proxies/proxies.page.ts | 0 .../ui/pages/system/router/router.module.ts | 0 .../ui/pages/system/router/router.page.html | 0 .../ui/pages/system/router/router.page.scss | 0 .../ui/pages/system/router/router.page.ts | 0 .../system/server-logs/server-logs.module.ts | 0 .../system/server-logs/server-logs.page.html | 0 .../system/server-logs/server-logs.page.scss | 0 .../system/server-logs/server-logs.page.ts | 0 .../server-metrics/server-metrics.module.ts | 0 .../server-metrics/server-metrics.page.html | 0 .../server-metrics/server-metrics.page.scss | 0 .../server-metrics/server-metrics.page.ts | 0 .../system/server-show/backup-color.pipe.ts | 0 .../server-show/os-update/os-update.page.html | 0 .../os-update/os-update.page.module.ts | 0 .../server-show/os-update/os-update.page.scss | 0 .../server-show/os-update/os-update.page.ts | 0 .../system/server-show/server-show.module.ts | 0 .../system/server-show/server-show.page.html | 0 .../system/server-show/server-show.page.scss | 0 .../system/server-show/server-show.page.ts | 0 .../server-specs/server-specs.module.ts | 0 .../server-specs/server-specs.page.html | 0 .../server-specs/server-specs.page.scss | 0 .../system/server-specs/server-specs.page.ts | 0 .../pages/system/sessions/sessions.module.ts | 0 .../pages/system/sessions/sessions.page.html | 0 .../pages/system/sessions/sessions.page.scss | 0 .../ui/pages/system/sessions/sessions.page.ts | 0 .../ui/pages/system/sideload/dnd.directive.ts | 0 .../pages/system/sideload/sideload.module.ts | 0 .../pages/system/sideload/sideload.page.html | 0 .../pages/system/sideload/sideload.page.scss | 0 .../ui/pages/system/sideload/sideload.page.ts | 0 .../pages/system/ssh-keys/ssh-keys.module.ts | 0 .../pages/system/ssh-keys/ssh-keys.page.html | 0 .../pages/system/ssh-keys/ssh-keys.page.scss | 0 .../ui/pages/system/ssh-keys/ssh-keys.page.ts | 0 .../app/apps/ui/pages/system/system.module.ts | 0 .../theme-switcher.component.html | 0 .../theme-switcher.component.ts | 0 .../theme-switcher/theme-switcher.module.ts | 0 .../pages/system/tor-logs/tor-logs.module.ts | 0 .../pages/system/tor-logs/tor-logs.page.html | 0 .../pages/system/tor-logs/tor-logs.page.scss | 0 .../ui/pages/system/tor-logs/tor-logs.page.ts | 0 .../system/ui-details/ui-details.module.ts | 0 .../system/ui-details/ui-details.page.html | 0 .../system/ui-details/ui-details.page.scss | 0 .../system/ui-details/ui-details.page.ts | 0 .../apps/ui/pages/system/wifi/wifi.const.ts | 0 .../apps/ui/pages/system/wifi/wifi.module.ts | 0 .../apps/ui/pages/system/wifi/wifi.page.html | 0 .../apps/ui/pages/system/wifi/wifi.page.scss | 0 .../apps/ui/pages/system/wifi/wifi.page.ts | 0 .../ui/pages/updates/filter-updates.pipe.ts | 0 .../ui/pages/updates/install-progress.pipe.ts | 0 .../apps/ui/pages/updates/updates.module.ts | 0 .../apps/ui/pages/updates/updates.page.html | 0 .../apps/ui/pages/updates/updates.page.scss | 0 .../app/apps/ui/pages/updates/updates.page.ts | 0 .../widgets/built-in/add/add.component.html | 0 .../widgets/built-in/add/add.component.scss | 0 .../widgets/built-in/add/add.component.ts | 0 .../pages/widgets/built-in/add/add.module.ts | 0 .../favorites/favorites.component.html | 0 .../favorites/favorites.component.scss | 0 .../built-in/favorites/favorites.component.ts | 0 .../built-in/favorites/favorites.module.ts | 0 .../built-in/health/health.component.html | 0 .../built-in/health/health.component.scss | 0 .../built-in/health/health.component.ts | 0 .../widgets/built-in/health/health.module.ts | 0 .../built-in/metrics/metrics.component.html | 0 .../built-in/metrics/metrics.component.scss | 0 .../built-in/metrics/metrics.component.ts | 0 .../built-in/metrics/metrics.module.ts | 0 .../built-in/network/network.component.html | 0 .../built-in/network/network.component.scss | 0 .../built-in/network/network.component.ts | 0 .../built-in/network/network.module.ts | 0 .../built-in/uptime/uptime.component.html | 0 .../built-in/uptime/uptime.component.scss | 0 .../built-in/uptime/uptime.component.ts | 0 .../widgets/built-in/uptime/uptime.module.ts | 0 .../apps/ui/pages/widgets/built-in/widgets.ts | 0 .../apps/ui/pages/widgets/widgets.module.ts | 0 .../apps/ui/pages/widgets/widgets.page.html | 0 .../apps/ui/pages/widgets/widgets.page.scss | 0 .../app/apps/ui/pages/widgets/widgets.page.ts | 0 .../projects/ui/src/app/apps/ui/ui.module.ts | 0 .../badge-menu.component.html | 0 .../badge-menu.component.module.ts | 0 .../badge-menu.component.scss | 0 .../badge-menu-button/badge-menu.component.ts | 0 .../src/app/common/form/control.directive.ts | 0 .../ui/src/app/common/form/control.ts | 0 .../form/form-array/form-array.component.html | 0 .../form/form-array/form-array.component.scss | 0 .../form/form-array/form-array.component.ts | 0 .../form/form-color/form-color.component.html | 0 .../form/form-color/form-color.component.scss | 0 .../form/form-color/form-color.component.ts | 0 .../form-control/form-control.component.html | 0 .../form-control/form-control.component.scss | 0 .../form-control/form-control.component.ts | 0 .../form-control/form-control.providers.ts | 0 .../form-datetime.component.html | 0 .../form-datetime/form-datetime.component.ts | 0 .../form/form-file/form-file.component.html | 0 .../form/form-file/form-file.component.scss | 0 .../form/form-file/form-file.component.ts | 0 .../form/form-group/form-group.component.html | 0 .../form/form-group/form-group.component.scss | 0 .../form/form-group/form-group.component.ts | 0 .../form/form-group/form-group.providers.ts | 0 .../form-multiselect.component.html | 0 .../form-multiselect.component.ts | 0 .../form-number/form-number.component.html | 0 .../form/form-number/form-number.component.ts | 0 .../form-object/form-object.component.html | 0 .../form-object/form-object.component.scss | 0 .../form/form-object/form-object.component.ts | 0 .../form-select/form-select.component.html | 0 .../form/form-select/form-select.component.ts | 0 .../form/form-text/form-text.component.html | 0 .../form/form-text/form-text.component.scss | 0 .../form/form-text/form-text.component.ts | 0 .../form-textarea.component.html | 0 .../form-textarea/form-textarea.component.ts | 0 .../form-toggle/form-toggle.component.html | 0 .../form/form-toggle/form-toggle.component.ts | 0 .../form/form-union/form-union.component.html | 0 .../form/form-union/form-union.component.scss | 0 .../form/form-union/form-union.component.ts | 0 .../ui/src/app/common/form/form.module.ts | 0 .../ui/src/app/common/form/hint.pipe.ts | 0 .../ui/src/app/common/form/invalid.service.ts | 0 .../ui/src/app/common/form/mustache.pipe.ts | 0 .../insecure-warning.component.html | 0 .../insecure-warning.component.scss | 0 .../insecure-warning.component.ts | 0 .../insecure-warning.module.ts | 0 .../install-progress.module.ts | 0 .../install-progress/install-progress.pipe.ts | 0 .../interface-addresses-item.component.html | 0 .../interface-addresses.component.html | 0 .../interface-addresses.component.scss | 0 .../interface-addresses.component.ts | 0 .../interface-addresses.module.ts | 0 .../src/app/common/logs/logs.component.html | 0 .../app/common/logs/logs.component.module.ts | 0 .../src/app/common/logs/logs.component.scss | 0 .../ui/src/app/common/logs/logs.component.ts | 0 .../common/os-welcome/os-welcome.module.ts | 0 .../common/os-welcome/os-welcome.page.html | 0 .../common/os-welcome/os-welcome.page.scss | 0 .../app/common/os-welcome/os-welcome.page.ts | 0 .../common/primary-ip/primary-ip.module.ts | 0 .../app/common/primary-ip/primary-ip.pipe.ts | 0 .../ui/src/app/common/qr/qr.component.ts | 0 .../ui/src/app/common/qr/qr.module.ts | 0 .../skeleton-list.component.html | 0 .../skeleton-list.component.module.ts | 0 .../skeleton-list/skeleton-list.component.ts | 0 .../notifications-toast.component.html | 0 .../notifications-toast.component.ts | 0 .../notifications-toast.service.ts | 0 .../refresh-alert.component.html | 0 .../refresh-alert/refresh-alert.component.ts | 0 .../refresh-alert/refresh-alert.service.ts | 0 .../toast-container.component.html | 0 .../toast-container.component.ts | 0 .../toast-container/toast-container.module.ts | 0 .../update-toast/update-toast.component.html | 0 .../update-toast/update-toast.component.ts | 0 .../update-toast/update-toast.service.ts | 0 .../any-link/any-link.component.html | 0 .../any-link/any-link.component.scss | 0 .../any-link/any-link.component.ts | 0 .../widget-card/widget-card.component.html | 0 .../widget-card/widget-card.component.scss | 0 .../widget-card/widget-card.component.ts | 0 .../widget-list/widget-list.component.html | 0 .../widget-list.component.module.ts | 0 .../widget-list/widget-list.component.scss | 0 .../widget-list/widget-list.component.ts | 0 .../projects/ui/src/app/guards/auth.guard.ts | 0 .../ui/src/app/guards/unauth.guard.ts | 0 .../projects/ui/src/app/routing.module.ts | 0 .../ui/src/app/services/api/api-icons.ts | 0 .../ui/src/app/services/api/api.fixures.ts | 0 .../ui/src/app/services/api/api.types.ts | 0 .../app/services/api/embassy-api.service.ts | 0 .../services/api/embassy-live-api.service.ts | 0 .../services/api/embassy-mock-api.service.ts | 0 .../ui/src/app/services/api/mock-patch.ts | 0 .../ui/src/app/services/auth.service.ts | 0 .../app/services/client-storage.service.ts | 0 .../ui/src/app/services/config.service.ts | 0 .../ui/src/app/services/connection.service.ts | 0 .../app/services/date-transformer.service.ts | 0 .../services/datetime-transformer.service.ts | 0 .../ui/src/app/services/dep-error.service.ts | 0 .../ui/src/app/services/eos.service.ts | 0 .../src/app/services/form-dialog.service.ts | 0 .../ui/src/app/services/form.service.ts | 0 .../src/app/services/marketplace.service.ts | 0 .../ui/src/app/services/patch-data.service.ts | 0 .../src/app/services/patch-db/data-model.ts | 0 .../patch-db/local-storage-bootstrap.ts | 0 .../app/services/patch-db/patch-db.factory.ts | 0 .../app/services/patch-db/patch-db.module.ts | 0 .../src/app/services/patch-monitor.service.ts | 0 .../services/pkg-status-rendering.service.ts | 0 .../ui/src/app/services/proxy.service.ts | 0 .../ui/src/app/services/split-pane.service.ts | 0 .../ui/src/app/services/storage.service.ts | 0 .../app/services/theme-switcher.service.ts | 0 .../ui/src/app/services/time-service.ts | 0 .../ui/src/app/types/dependent-info.ts | 0 .../projects/ui/src/app/types/pkg-info.ts | 0 .../ui/src/app/types/progress-data.ts | 0 .../projects/ui/src/app/util/animations.ts | 0 .../ui/src/app/util/clearnetAddress.ts | 0 .../ui/src/app/util/config-utilities.ts | 0 .../ui/src/app/util/configBuilderToSpec.ts | 0 .../projects/ui/src/app/util/countries.json | 0 .../projects/ui/src/app/util/dry-update.ts | 0 .../ui/src/app/util/get-package-data.ts | 0 .../ui/src/app/util/get-package-info.ts | 0 .../ui/src/app/util/get-project-id.ts | 0 .../ui/src/app/util/get-server-info.ts | 0 .../projects/ui/src/app/util/has-deps.ts | 0 .../projects/ui/src/app/util/mask.ts | 0 .../src/app/util/package-loading-progress.ts | 0 .../projects/ui/src/app/util/rxjs.util.ts | 0 .../projects/ui/src/app/util/web.util.ts | 0 .../ui/src/environments/environment.prod.ts | 0 .../ui/src/environments/environment.ts | 0 .../projects/ui/src/globals.d.ts | 0 {frontend => web}/projects/ui/src/index.html | 0 {frontend => web}/projects/ui/src/main.ts | 0 .../projects/ui/src/manifest.webmanifest | 0 .../projects/ui/src/polyfills.ts | 0 {frontend => web}/projects/ui/src/styles.scss | 0 .../projects/ui/src/zone-flags.ts | 0 {frontend => web}/projects/ui/tsconfig.json | 0 {frontend => web}/proxy.conf-sample.json | 0 {frontend => web}/tsconfig.json | 0 {frontend => web}/tsconfig.lib.json | 0 {frontend => web}/tslint.json | 0 869 files changed, 66 deletions(-) delete mode 100644 frontend/.vscode/extensions.json delete mode 100644 frontend/.vscode/launch.json delete mode 100644 frontend/.vscode/tasks.json rename {frontend => web}/.browserslistrc (100%) rename {frontend => web}/.editorconfig (100%) rename {frontend => web}/.gitignore (100%) rename {frontend => web}/.prettierrc (100%) rename {frontend => web}/README.md (100%) rename {frontend => web}/angular.json (100%) rename {frontend => web}/build-config.js (100%) rename {frontend => web}/config-sample.json (100%) rename {frontend => web}/ionic.config.json (100%) rename {frontend => web}/lint-staged.config.js (100%) rename {frontend => web}/package-lock.json (100%) rename {frontend => web}/package.json (100%) rename {frontend => web}/patchdb-ui-seed.json (100%) rename {frontend => web}/projects/install-wizard/src/app/app-routing.module.ts (100%) rename {frontend => web}/projects/install-wizard/src/app/app.component.html (100%) rename {frontend => web}/projects/install-wizard/src/app/app.component.scss (100%) rename {frontend => web}/projects/install-wizard/src/app/app.component.ts (100%) rename {frontend => web}/projects/install-wizard/src/app/app.module.ts (100%) rename {frontend => web}/projects/install-wizard/src/app/pages/home/home.module.ts (100%) rename {frontend => web}/projects/install-wizard/src/app/pages/home/home.page.html (100%) rename {frontend => web}/projects/install-wizard/src/app/pages/home/home.page.scss (100%) rename {frontend => web}/projects/install-wizard/src/app/pages/home/home.page.ts (100%) rename {frontend => web}/projects/install-wizard/src/app/services/api/api.service.ts (100%) rename {frontend => web}/projects/install-wizard/src/app/services/api/live-api.service.ts (100%) rename {frontend => web}/projects/install-wizard/src/app/services/api/mock-api.service.ts (100%) rename {frontend => web}/projects/install-wizard/src/environments/environment.prod.ts (100%) rename {frontend => web}/projects/install-wizard/src/environments/environment.ts (100%) rename {frontend => web}/projects/install-wizard/src/index.html (100%) rename {frontend => web}/projects/install-wizard/src/main.ts (100%) rename {frontend => web}/projects/install-wizard/src/polyfills.ts (100%) rename {frontend => web}/projects/install-wizard/src/styles.scss (100%) rename {frontend => web}/projects/install-wizard/src/zone-flags.ts (100%) rename {frontend => web}/projects/install-wizard/tsconfig.json (100%) rename {frontend => web}/projects/marketplace/ng-package.json (100%) rename {frontend => web}/projects/marketplace/package.json (100%) rename {frontend => web}/projects/marketplace/src/components/store-icon/store-icon.component.html (100%) rename {frontend => web}/projects/marketplace/src/components/store-icon/store-icon.component.module.ts (100%) rename {frontend => web}/projects/marketplace/src/components/store-icon/store-icon.component.scss (100%) rename {frontend => web}/projects/marketplace/src/components/store-icon/store-icon.component.ts (100%) rename {frontend => web}/projects/marketplace/src/pages/list/categories/categories.component.html (100%) rename {frontend => web}/projects/marketplace/src/pages/list/categories/categories.component.scss (100%) rename {frontend => web}/projects/marketplace/src/pages/list/categories/categories.component.ts (100%) rename {frontend => web}/projects/marketplace/src/pages/list/categories/categories.module.ts (100%) rename {frontend => web}/projects/marketplace/src/pages/list/item/item.component.html (100%) rename {frontend => web}/projects/marketplace/src/pages/list/item/item.component.ts (100%) rename {frontend => web}/projects/marketplace/src/pages/list/item/item.module.ts (100%) rename {frontend => web}/projects/marketplace/src/pages/list/search/search.component.html (100%) rename {frontend => web}/projects/marketplace/src/pages/list/search/search.component.scss (100%) rename {frontend => web}/projects/marketplace/src/pages/list/search/search.component.ts (100%) rename {frontend => web}/projects/marketplace/src/pages/list/search/search.module.ts (100%) rename {frontend => web}/projects/marketplace/src/pages/list/skeleton/skeleton.component.html (100%) rename {frontend => web}/projects/marketplace/src/pages/list/skeleton/skeleton.component.ts (100%) rename {frontend => web}/projects/marketplace/src/pages/list/skeleton/skeleton.module.ts (100%) rename {frontend => web}/projects/marketplace/src/pages/release-notes/release-notes.component.html (100%) rename {frontend => web}/projects/marketplace/src/pages/release-notes/release-notes.component.scss (100%) rename {frontend => web}/projects/marketplace/src/pages/release-notes/release-notes.component.ts (100%) rename {frontend => web}/projects/marketplace/src/pages/release-notes/release-notes.module.ts (100%) rename {frontend => web}/projects/marketplace/src/pages/show/about/about.component.html (100%) rename {frontend => web}/projects/marketplace/src/pages/show/about/about.component.scss (100%) rename {frontend => web}/projects/marketplace/src/pages/show/about/about.component.ts (100%) rename {frontend => web}/projects/marketplace/src/pages/show/about/about.module.ts (100%) rename {frontend => web}/projects/marketplace/src/pages/show/additional/additional.component.html (100%) rename {frontend => web}/projects/marketplace/src/pages/show/additional/additional.component.scss (100%) rename {frontend => web}/projects/marketplace/src/pages/show/additional/additional.component.ts (100%) rename {frontend => web}/projects/marketplace/src/pages/show/additional/additional.module.ts (100%) rename {frontend => web}/projects/marketplace/src/pages/show/dependencies/dependencies.component.html (100%) rename {frontend => web}/projects/marketplace/src/pages/show/dependencies/dependencies.component.ts (100%) rename {frontend => web}/projects/marketplace/src/pages/show/dependencies/dependencies.module.ts (100%) rename {frontend => web}/projects/marketplace/src/pages/show/package/package.component.html (100%) rename {frontend => web}/projects/marketplace/src/pages/show/package/package.component.scss (100%) rename {frontend => web}/projects/marketplace/src/pages/show/package/package.component.ts (100%) rename {frontend => web}/projects/marketplace/src/pages/show/package/package.module.ts (100%) rename {frontend => web}/projects/marketplace/src/pipes/filter-packages.pipe.ts (100%) rename {frontend => web}/projects/marketplace/src/pipes/mime-type.pipe.ts (100%) rename {frontend => web}/projects/marketplace/src/public-api.ts (100%) rename {frontend => web}/projects/marketplace/src/services/marketplace.service.ts (100%) rename {frontend => web}/projects/marketplace/src/types.ts (100%) rename {frontend => web}/projects/marketplace/tsconfig.json (100%) rename {frontend => web}/projects/setup-wizard/src/app/app-routing.module.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/app.component.html (100%) rename {frontend => web}/projects/setup-wizard/src/app/app.component.scss (100%) rename {frontend => web}/projects/setup-wizard/src/app/app.component.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/app.module.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.module.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.html (100%) rename {frontend => web}/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.scss (100%) rename {frontend => web}/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/modals/password/password.module.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/modals/password/password.page.html (100%) rename {frontend => web}/projects/setup-wizard/src/app/modals/password/password.page.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/attach/attach-routing.module.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/attach/attach.module.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/attach/attach.page.html (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/attach/attach.page.scss (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/attach/attach.page.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/embassy/embassy-routing.module.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/embassy/embassy.module.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/embassy/embassy.page.html (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/embassy/embassy.page.scss (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/embassy/embassy.page.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/home/home-routing.module.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/home/home.module.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/home/home.page.html (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/home/home.page.scss (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/home/home.page.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/loading/loading.module.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/loading/loading.page.html (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/loading/loading.page.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/recover/drive-status.component.html (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/recover/recover-routing.module.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/recover/recover.module.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/recover/recover.page.html (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/recover/recover.page.scss (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/recover/recover.page.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/success/download-doc/download-doc.component.html (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/success/download-doc/download-doc.component.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/success/success-routing.module.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/success/success.module.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/success/success.page.html (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/success/success.page.scss (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/success/success.page.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/transfer/transfer-routing.module.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/transfer/transfer.module.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/transfer/transfer.page.html (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/transfer/transfer.page.scss (100%) rename {frontend => web}/projects/setup-wizard/src/app/pages/transfer/transfer.page.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/services/api/api.service.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/services/api/live-api.service.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/services/api/mock-api.service.ts (100%) rename {frontend => web}/projects/setup-wizard/src/app/services/state.service.ts (100%) rename {frontend => web}/projects/setup-wizard/src/environments/environment.prod.ts (100%) rename {frontend => web}/projects/setup-wizard/src/environments/environment.ts (100%) rename {frontend => web}/projects/setup-wizard/src/index.html (100%) rename {frontend => web}/projects/setup-wizard/src/main.ts (100%) rename {frontend => web}/projects/setup-wizard/src/polyfills.ts (100%) rename {frontend => web}/projects/setup-wizard/src/styles.scss (100%) rename {frontend => web}/projects/setup-wizard/src/zone-flags.ts (100%) rename {frontend => web}/projects/setup-wizard/tsconfig.json (100%) rename {frontend => web}/projects/shared/assets/fonts/Benton_Sans/BentonSans-Regular.otf (100%) rename {frontend => web}/projects/shared/assets/fonts/Courier_New/CourierNew-Bold.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Courier_New/CourierNew-Regular.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Montserrat/Montserrat-Black.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Montserrat/Montserrat-BlackItalic.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Montserrat/Montserrat-Bold.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Montserrat/Montserrat-BoldItalic.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Montserrat/Montserrat-ExtraBold.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Montserrat/Montserrat-ExtraBoldItalic.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Montserrat/Montserrat-ExtraLight.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Montserrat/Montserrat-ExtraLightItalic.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Montserrat/Montserrat-Italic.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Montserrat/Montserrat-Light.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Montserrat/Montserrat-LightItalic.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Montserrat/Montserrat-Medium.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Montserrat/Montserrat-MediumItalic.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Montserrat/Montserrat-Regular.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Montserrat/Montserrat-SemiBold.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Montserrat/Montserrat-SemiBoldItalic.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Montserrat/Montserrat-Thin.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Montserrat/Montserrat-ThinItalic.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Montserrat/OFL.txt (100%) rename {frontend => web}/projects/shared/assets/fonts/Open_Sans/LICENSE.txt (100%) rename {frontend => web}/projects/shared/assets/fonts/Open_Sans/OpenSans-Bold.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Open_Sans/OpenSans-BoldItalic.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Open_Sans/OpenSans-ExtraBold.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Open_Sans/OpenSans-ExtraBoldItalic.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Open_Sans/OpenSans-Italic.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Open_Sans/OpenSans-Light.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Open_Sans/OpenSans-LightItalic.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Open_Sans/OpenSans-Regular.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Open_Sans/OpenSans-SemiBold.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/Open_Sans/OpenSans-SemiBoldItalic.ttf (100%) rename {frontend => web}/projects/shared/assets/fonts/text-security-disc.woff2 (100%) rename {frontend => web}/projects/shared/assets/icon/favicon.ico (100%) rename {frontend => web}/projects/shared/assets/img/background_dark.jpeg (100%) rename {frontend => web}/projects/shared/assets/img/background_light.jpeg (100%) rename {frontend => web}/projects/shared/assets/img/community-store.png (100%) rename {frontend => web}/projects/shared/assets/img/icon.png (100%) rename {frontend => web}/projects/shared/assets/img/icon_apple_touch.png (100%) rename {frontend => web}/projects/shared/assets/img/icons/bitcoin.svg (100%) rename {frontend => web}/projects/shared/assets/img/icons/snek.png (100%) rename {frontend => web}/projects/shared/assets/img/icons/wifi-0.png (100%) rename {frontend => web}/projects/shared/assets/img/icons/wifi-1.png (100%) rename {frontend => web}/projects/shared/assets/img/icons/wifi-2.png (100%) rename {frontend => web}/projects/shared/assets/img/icons/wifi-3.png (100%) rename {frontend => web}/projects/shared/assets/img/service-icons/bitcoind.svg (100%) rename {frontend => web}/projects/shared/assets/img/service-icons/btc-rpc-proxy.png (100%) rename {frontend => web}/projects/shared/assets/img/service-icons/lnd.png (100%) rename {frontend => web}/projects/shared/assets/markdown/md-sample.md (100%) rename {frontend => web}/projects/shared/ng-package.json (100%) rename {frontend => web}/projects/shared/package.json (100%) rename {frontend => web}/projects/shared/src/classes/http-error.ts (100%) rename {frontend => web}/projects/shared/src/classes/rpc-error.ts (100%) rename {frontend => web}/projects/shared/src/components/initializing/initializing.component.html (100%) rename {frontend => web}/projects/shared/src/components/initializing/initializing.component.scss (100%) rename {frontend => web}/projects/shared/src/components/initializing/initializing.component.ts (100%) rename {frontend => web}/projects/shared/src/components/initializing/initializing.module.ts (100%) rename {frontend => web}/projects/shared/src/components/initializing/logs-window/logs-window.component.html (100%) rename {frontend => web}/projects/shared/src/components/initializing/logs-window/logs-window.component.scss (100%) rename {frontend => web}/projects/shared/src/components/initializing/logs-window/logs-window.component.ts (100%) rename {frontend => web}/projects/shared/src/components/loading/loading.component.scss (100%) rename {frontend => web}/projects/shared/src/components/loading/loading.component.ts (100%) rename {frontend => web}/projects/shared/src/components/loading/loading.module.ts (100%) rename {frontend => web}/projects/shared/src/components/loading/loading.service.ts (100%) rename {frontend => web}/projects/shared/src/components/markdown/markdown.component.html (100%) rename {frontend => web}/projects/shared/src/components/markdown/markdown.component.module.ts (100%) rename {frontend => web}/projects/shared/src/components/markdown/markdown.component.scss (100%) rename {frontend => web}/projects/shared/src/components/markdown/markdown.component.ts (100%) rename {frontend => web}/projects/shared/src/components/text-spinner/text-spinner.component.html (100%) rename {frontend => web}/projects/shared/src/components/text-spinner/text-spinner.component.module.ts (100%) rename {frontend => web}/projects/shared/src/components/text-spinner/text-spinner.component.scss (100%) rename {frontend => web}/projects/shared/src/components/text-spinner/text-spinner.component.ts (100%) rename {frontend => web}/projects/shared/src/components/ticker/ticker.component.scss (100%) rename {frontend => web}/projects/shared/src/components/ticker/ticker.component.ts (100%) rename {frontend => web}/projects/shared/src/components/ticker/ticker.module.ts (100%) rename {frontend => web}/projects/shared/src/directives/drag-scroller.directive.ts (100%) rename {frontend => web}/projects/shared/src/directives/enter/enter.directive.ts (100%) rename {frontend => web}/projects/shared/src/directives/enter/enter.module.ts (100%) rename {frontend => web}/projects/shared/src/directives/responsive-col.directive.ts (100%) rename {frontend => web}/projects/shared/src/directives/safe-links.directive.ts (100%) rename {frontend => web}/projects/shared/src/mocks/get-setup-status.ts (100%) rename {frontend => web}/projects/shared/src/pipes/emver/emver.module.ts (100%) rename {frontend => web}/projects/shared/src/pipes/emver/emver.pipe.ts (100%) rename {frontend => web}/projects/shared/src/pipes/guid/guid.module.ts (100%) rename {frontend => web}/projects/shared/src/pipes/guid/guid.pipe.ts (100%) rename {frontend => web}/projects/shared/src/pipes/markdown/markdown.module.ts (100%) rename {frontend => web}/projects/shared/src/pipes/markdown/markdown.pipe.ts (100%) rename {frontend => web}/projects/shared/src/pipes/shared/empty.pipe.ts (100%) rename {frontend => web}/projects/shared/src/pipes/shared/includes.pipe.ts (100%) rename {frontend => web}/projects/shared/src/pipes/shared/shared.module.ts (100%) rename {frontend => web}/projects/shared/src/pipes/shared/trust.pipe.ts (100%) rename {frontend => web}/projects/shared/src/pipes/unit-conversion/unit-conversion.module.ts (100%) rename {frontend => web}/projects/shared/src/pipes/unit-conversion/unit-conversion.pipe.ts (100%) rename {frontend => web}/projects/shared/src/public-api.ts (100%) rename {frontend => web}/projects/shared/src/services/copy.service.ts (100%) rename {frontend => web}/projects/shared/src/services/download-html.service.ts (100%) rename {frontend => web}/projects/shared/src/services/emver.service.ts (100%) rename {frontend => web}/projects/shared/src/services/error.service.ts (100%) rename {frontend => web}/projects/shared/src/services/http.service.ts (100%) rename {frontend => web}/projects/shared/src/services/setup-logs.service.ts (100%) rename {frontend => web}/projects/shared/src/services/setup.service.ts (100%) rename {frontend => web}/projects/shared/src/themes/dark-theme/dark-theme.component.scss (100%) rename {frontend => web}/projects/shared/src/themes/dark-theme/dark-theme.component.ts (100%) rename {frontend => web}/projects/shared/src/themes/dark-theme/dark-theme.module.ts (100%) rename {frontend => web}/projects/shared/src/themes/light-theme/light-theme.component.scss (100%) rename {frontend => web}/projects/shared/src/themes/light-theme/light-theme.component.ts (100%) rename {frontend => web}/projects/shared/src/themes/light-theme/light-theme.module.ts (100%) rename {frontend => web}/projects/shared/src/tokens/relative-url.ts (100%) rename {frontend => web}/projects/shared/src/tokens/theme.ts (100%) rename {frontend => web}/projects/shared/src/types/api.ts (100%) rename {frontend => web}/projects/shared/src/types/constructor.ts (100%) rename {frontend => web}/projects/shared/src/types/http.types.ts (100%) rename {frontend => web}/projects/shared/src/types/rpc.types.ts (100%) rename {frontend => web}/projects/shared/src/types/url.ts (100%) rename {frontend => web}/projects/shared/src/types/workspace-config.ts (100%) rename {frontend => web}/projects/shared/src/util/base-64.ts (100%) rename {frontend => web}/projects/shared/src/util/copy-to-clipboard.ts (100%) rename {frontend => web}/projects/shared/src/util/get-new-entries.ts (100%) rename {frontend => web}/projects/shared/src/util/get-pkg-id.ts (100%) rename {frontend => web}/projects/shared/src/util/invert.ts (100%) rename {frontend => web}/projects/shared/src/util/misc.util.ts (100%) rename {frontend => web}/projects/shared/src/util/rpc.util.ts (100%) rename {frontend => web}/projects/shared/src/util/to-local-iso-string.ts (100%) rename {frontend => web}/projects/shared/src/util/unused.ts (100%) rename {frontend => web}/projects/shared/styles/global.scss (100%) rename {frontend => web}/projects/shared/styles/shared.scss (100%) rename {frontend => web}/projects/shared/styles/taiga.scss (100%) rename {frontend => web}/projects/shared/styles/variables.scss (100%) rename {frontend => web}/projects/shared/tsconfig.json (100%) rename {frontend => web}/projects/ui/ngsw-config.json (100%) rename {frontend => web}/projects/ui/src/app/app.component.html (100%) rename {frontend => web}/projects/ui/src/app/app.component.scss (100%) rename {frontend => web}/projects/ui/src/app/app.component.ts (100%) rename {frontend => web}/projects/ui/src/app/app.module.ts (100%) rename {frontend => web}/projects/ui/src/app/app.providers.ts (100%) rename {frontend => web}/projects/ui/src/app/app/connection-bar/connection-bar.component.html (100%) rename {frontend => web}/projects/ui/src/app/app/connection-bar/connection-bar.component.module.ts (100%) rename {frontend => web}/projects/ui/src/app/app/connection-bar/connection-bar.component.scss (100%) rename {frontend => web}/projects/ui/src/app/app/connection-bar/connection-bar.component.ts (100%) rename {frontend => web}/projects/ui/src/app/app/footer/footer.component.html (100%) rename {frontend => web}/projects/ui/src/app/app/footer/footer.component.scss (100%) rename {frontend => web}/projects/ui/src/app/app/footer/footer.component.ts (100%) rename {frontend => web}/projects/ui/src/app/app/footer/footer.module.ts (100%) rename {frontend => web}/projects/ui/src/app/app/menu/menu.component.html (100%) rename {frontend => web}/projects/ui/src/app/app/menu/menu.component.scss (100%) rename {frontend => web}/projects/ui/src/app/app/menu/menu.component.ts (100%) rename {frontend => web}/projects/ui/src/app/app/menu/menu.module.ts (100%) rename {frontend => web}/projects/ui/src/app/app/preloader/preloader.component.html (100%) rename {frontend => web}/projects/ui/src/app/app/preloader/preloader.component.ts (100%) rename {frontend => web}/projects/ui/src/app/app/preloader/preloader.module.ts (100%) rename {frontend => web}/projects/ui/src/app/app/snek/snake.page.html (100%) rename {frontend => web}/projects/ui/src/app/app/snek/snake.page.scss (100%) rename {frontend => web}/projects/ui/src/app/app/snek/snake.page.ts (100%) rename {frontend => web}/projects/ui/src/app/app/snek/snek.directive.ts (100%) rename {frontend => web}/projects/ui/src/app/app/snek/snek.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/diagnostic/diagnostic.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/diagnostic/home/home.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/diagnostic/home/home.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/diagnostic/home/home.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/diagnostic/home/home.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/diagnostic/logs/logs.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/diagnostic/logs/logs.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/diagnostic/logs/logs.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/diagnostic/services/diagnostic.service.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/diagnostic/services/live-diagnostic.service.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/diagnostic/services/mock-diagnostic.service.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/loading/loading.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/loading/loading.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/loading/loading.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/login/login.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/login/login.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/login/login.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/login/login.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/components/actions/actions.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/components/actions/actions.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/components/actions/actions.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/components/card/card.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/components/card/card.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/components/card/card.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/components/drawer/drawer-item.directive.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/components/drawer/drawer.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/components/header/header.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/components/header/header.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/components/header/header.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/components/navigation/navigation.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/components/navigation/navigation.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/components/skeleton-list.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/constants/system-utilities.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/pipes/to-navigation-item.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/pipes/to-notifications.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/portal.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/portal.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/portal.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/portal.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/desktop/dektop-loading.service.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/desktop/desktop-item.directive.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/components/action-success.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/components/action.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/components/actions.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/components/additional-item.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/components/additional.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/components/config-dep.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/components/credential.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/components/dependencies.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/components/dependency.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/components/health-check.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/components/health-checks.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/components/interface.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/components/interfaces.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/components/menu-item.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/components/menu.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/components/progress.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/modals/config.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/modals/credentials.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/pipes/group-actions.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/pipes/interface-info.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/pipes/progress-data.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/pipes/to-additional.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/pipes/to-menu.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/routes/actions.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/routes/interface.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/routes/logs.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/routes/outlet.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/routes/service.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/service.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/types/dependency-info.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/types/package-config-data.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/service/utils/update-tab.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/backups.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/components/physical.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/components/status.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/components/targets.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/components/upcoming.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/modals/backup.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/modals/edit.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/modals/history.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/modals/jobs.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/modals/recover.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/modals/report.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/modals/target.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/pipes/duration.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/pipes/get-backup-icon.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/pipes/get-display-info.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/pipes/has-error.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/pipes/to-human-cron.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/pipes/to-options.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/services/create.service.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/services/restore.service.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/types/backup-config.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/types/backup-type.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/types/display-info.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/types/recover-data.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/types/recover-option.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/backups/utils/job-builder.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/sideload/dependencies.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.utils.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/snek/snek.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/system.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/updates/pipes/filter-updates.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/updates/pipes/install-progress.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/routes/system/updates/updates.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/services/desktop.service.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/services/navigation.service.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/services/notifications.service.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/services/routing-strategy.service.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/services/services.service.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/types/navigation-item.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/utils/system-tab-resolver.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/utils/to-navigation-item.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/portal/utils/to-router-link.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/modals/form/form.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/modals/form/form.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/modals/form/form.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/modals/form/form.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/modals/prompt/prompt.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/backups.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/components/backing-up/backing-up.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/components/backing-up/backing-up.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/directives/backup-create.directive.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/directives/backup-restore.directive.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/to-options.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-status.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/job-builder.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/pipes.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pipes/get-display-info.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pipes/has-valid-backup.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/pipes/target-pipes.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/backups/types/target-types.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/home/home.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/home/home.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/home/home.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/home/home.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-components.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-header/marketplace-show-header.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-header/marketplace-show-header.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/marketplace.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/notifications/notifications.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions-item.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launchable-interfaces.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-list/package-info.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config-dep.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/health-color.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/progress-data.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/services.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/status/status.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/status/status.component.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/status/status.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/services/status/status.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/domains/domains.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/email/email.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/email/email.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/email/email.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/email/email.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/router/router.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/router/router.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/router/router.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/router/router.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/server-show/backup-color.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/sideload/dnd.directive.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/system.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.const.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/updates/filter-updates.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/updates/install-progress.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/updates/updates.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/updates/updates.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/updates/updates.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/built-in/widgets.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/widgets.module.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.html (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.scss (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.ts (100%) rename {frontend => web}/projects/ui/src/app/apps/ui/ui.module.ts (100%) rename {frontend => web}/projects/ui/src/app/common/badge-menu-button/badge-menu.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/badge-menu-button/badge-menu.component.module.ts (100%) rename {frontend => web}/projects/ui/src/app/common/badge-menu-button/badge-menu.component.scss (100%) rename {frontend => web}/projects/ui/src/app/common/badge-menu-button/badge-menu.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/form/control.directive.ts (100%) rename {frontend => web}/projects/ui/src/app/common/form/control.ts (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-array/form-array.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-array/form-array.component.scss (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-array/form-array.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-color/form-color.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-color/form-color.component.scss (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-color/form-color.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-control/form-control.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-control/form-control.component.scss (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-control/form-control.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-control/form-control.providers.ts (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-datetime/form-datetime.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-datetime/form-datetime.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-file/form-file.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-file/form-file.component.scss (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-file/form-file.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-group/form-group.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-group/form-group.component.scss (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-group/form-group.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-group/form-group.providers.ts (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-multiselect/form-multiselect.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-multiselect/form-multiselect.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-number/form-number.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-number/form-number.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-object/form-object.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-object/form-object.component.scss (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-object/form-object.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-select/form-select.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-select/form-select.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-text/form-text.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-text/form-text.component.scss (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-text/form-text.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-textarea/form-textarea.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-textarea/form-textarea.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-toggle/form-toggle.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-toggle/form-toggle.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-union/form-union.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-union/form-union.component.scss (100%) rename {frontend => web}/projects/ui/src/app/common/form/form-union/form-union.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/form/form.module.ts (100%) rename {frontend => web}/projects/ui/src/app/common/form/hint.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/common/form/invalid.service.ts (100%) rename {frontend => web}/projects/ui/src/app/common/form/mustache.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/common/insecure-warning/insecure-warning.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/insecure-warning/insecure-warning.component.scss (100%) rename {frontend => web}/projects/ui/src/app/common/insecure-warning/insecure-warning.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/insecure-warning/insecure-warning.module.ts (100%) rename {frontend => web}/projects/ui/src/app/common/install-progress/install-progress.module.ts (100%) rename {frontend => web}/projects/ui/src/app/common/install-progress/install-progress.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/common/interface-addresses/interface-addresses-item.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/interface-addresses/interface-addresses.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/interface-addresses/interface-addresses.component.scss (100%) rename {frontend => web}/projects/ui/src/app/common/interface-addresses/interface-addresses.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/interface-addresses/interface-addresses.module.ts (100%) rename {frontend => web}/projects/ui/src/app/common/logs/logs.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/logs/logs.component.module.ts (100%) rename {frontend => web}/projects/ui/src/app/common/logs/logs.component.scss (100%) rename {frontend => web}/projects/ui/src/app/common/logs/logs.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/os-welcome/os-welcome.module.ts (100%) rename {frontend => web}/projects/ui/src/app/common/os-welcome/os-welcome.page.html (100%) rename {frontend => web}/projects/ui/src/app/common/os-welcome/os-welcome.page.scss (100%) rename {frontend => web}/projects/ui/src/app/common/os-welcome/os-welcome.page.ts (100%) rename {frontend => web}/projects/ui/src/app/common/primary-ip/primary-ip.module.ts (100%) rename {frontend => web}/projects/ui/src/app/common/primary-ip/primary-ip.pipe.ts (100%) rename {frontend => web}/projects/ui/src/app/common/qr/qr.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/qr/qr.module.ts (100%) rename {frontend => web}/projects/ui/src/app/common/skeleton-list/skeleton-list.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/skeleton-list/skeleton-list.component.module.ts (100%) rename {frontend => web}/projects/ui/src/app/common/skeleton-list/skeleton-list.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.service.ts (100%) rename {frontend => web}/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.service.ts (100%) rename {frontend => web}/projects/ui/src/app/common/toast-container/toast-container.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/toast-container/toast-container.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/toast-container/toast-container.module.ts (100%) rename {frontend => web}/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/toast-container/update-toast/update-toast.service.ts (100%) rename {frontend => web}/projects/ui/src/app/common/widget-list/any-link/any-link.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/widget-list/any-link/any-link.component.scss (100%) rename {frontend => web}/projects/ui/src/app/common/widget-list/any-link/any-link.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.scss (100%) rename {frontend => web}/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.ts (100%) rename {frontend => web}/projects/ui/src/app/common/widget-list/widget-list.component.html (100%) rename {frontend => web}/projects/ui/src/app/common/widget-list/widget-list.component.module.ts (100%) rename {frontend => web}/projects/ui/src/app/common/widget-list/widget-list.component.scss (100%) rename {frontend => web}/projects/ui/src/app/common/widget-list/widget-list.component.ts (100%) rename {frontend => web}/projects/ui/src/app/guards/auth.guard.ts (100%) rename {frontend => web}/projects/ui/src/app/guards/unauth.guard.ts (100%) rename {frontend => web}/projects/ui/src/app/routing.module.ts (100%) rename {frontend => web}/projects/ui/src/app/services/api/api-icons.ts (100%) rename {frontend => web}/projects/ui/src/app/services/api/api.fixures.ts (100%) rename {frontend => web}/projects/ui/src/app/services/api/api.types.ts (100%) rename {frontend => web}/projects/ui/src/app/services/api/embassy-api.service.ts (100%) rename {frontend => web}/projects/ui/src/app/services/api/embassy-live-api.service.ts (100%) rename {frontend => web}/projects/ui/src/app/services/api/embassy-mock-api.service.ts (100%) rename {frontend => web}/projects/ui/src/app/services/api/mock-patch.ts (100%) rename {frontend => web}/projects/ui/src/app/services/auth.service.ts (100%) rename {frontend => web}/projects/ui/src/app/services/client-storage.service.ts (100%) rename {frontend => web}/projects/ui/src/app/services/config.service.ts (100%) rename {frontend => web}/projects/ui/src/app/services/connection.service.ts (100%) rename {frontend => web}/projects/ui/src/app/services/date-transformer.service.ts (100%) rename {frontend => web}/projects/ui/src/app/services/datetime-transformer.service.ts (100%) rename {frontend => web}/projects/ui/src/app/services/dep-error.service.ts (100%) rename {frontend => web}/projects/ui/src/app/services/eos.service.ts (100%) rename {frontend => web}/projects/ui/src/app/services/form-dialog.service.ts (100%) rename {frontend => web}/projects/ui/src/app/services/form.service.ts (100%) rename {frontend => web}/projects/ui/src/app/services/marketplace.service.ts (100%) rename {frontend => web}/projects/ui/src/app/services/patch-data.service.ts (100%) rename {frontend => web}/projects/ui/src/app/services/patch-db/data-model.ts (100%) rename {frontend => web}/projects/ui/src/app/services/patch-db/local-storage-bootstrap.ts (100%) rename {frontend => web}/projects/ui/src/app/services/patch-db/patch-db.factory.ts (100%) rename {frontend => web}/projects/ui/src/app/services/patch-db/patch-db.module.ts (100%) rename {frontend => web}/projects/ui/src/app/services/patch-monitor.service.ts (100%) rename {frontend => web}/projects/ui/src/app/services/pkg-status-rendering.service.ts (100%) rename {frontend => web}/projects/ui/src/app/services/proxy.service.ts (100%) rename {frontend => web}/projects/ui/src/app/services/split-pane.service.ts (100%) rename {frontend => web}/projects/ui/src/app/services/storage.service.ts (100%) rename {frontend => web}/projects/ui/src/app/services/theme-switcher.service.ts (100%) rename {frontend => web}/projects/ui/src/app/services/time-service.ts (100%) rename {frontend => web}/projects/ui/src/app/types/dependent-info.ts (100%) rename {frontend => web}/projects/ui/src/app/types/pkg-info.ts (100%) rename {frontend => web}/projects/ui/src/app/types/progress-data.ts (100%) rename {frontend => web}/projects/ui/src/app/util/animations.ts (100%) rename {frontend => web}/projects/ui/src/app/util/clearnetAddress.ts (100%) rename {frontend => web}/projects/ui/src/app/util/config-utilities.ts (100%) rename {frontend => web}/projects/ui/src/app/util/configBuilderToSpec.ts (100%) rename {frontend => web}/projects/ui/src/app/util/countries.json (100%) rename {frontend => web}/projects/ui/src/app/util/dry-update.ts (100%) rename {frontend => web}/projects/ui/src/app/util/get-package-data.ts (100%) rename {frontend => web}/projects/ui/src/app/util/get-package-info.ts (100%) rename {frontend => web}/projects/ui/src/app/util/get-project-id.ts (100%) rename {frontend => web}/projects/ui/src/app/util/get-server-info.ts (100%) rename {frontend => web}/projects/ui/src/app/util/has-deps.ts (100%) rename {frontend => web}/projects/ui/src/app/util/mask.ts (100%) rename {frontend => web}/projects/ui/src/app/util/package-loading-progress.ts (100%) rename {frontend => web}/projects/ui/src/app/util/rxjs.util.ts (100%) rename {frontend => web}/projects/ui/src/app/util/web.util.ts (100%) rename {frontend => web}/projects/ui/src/environments/environment.prod.ts (100%) rename {frontend => web}/projects/ui/src/environments/environment.ts (100%) rename {frontend => web}/projects/ui/src/globals.d.ts (100%) rename {frontend => web}/projects/ui/src/index.html (100%) rename {frontend => web}/projects/ui/src/main.ts (100%) rename {frontend => web}/projects/ui/src/manifest.webmanifest (100%) rename {frontend => web}/projects/ui/src/polyfills.ts (100%) rename {frontend => web}/projects/ui/src/styles.scss (100%) rename {frontend => web}/projects/ui/src/zone-flags.ts (100%) rename {frontend => web}/projects/ui/tsconfig.json (100%) rename {frontend => web}/proxy.conf-sample.json (100%) rename {frontend => web}/tsconfig.json (100%) rename {frontend => web}/tsconfig.lib.json (100%) rename {frontend => web}/tslint.json (100%) diff --git a/frontend/.vscode/extensions.json b/frontend/.vscode/extensions.json deleted file mode 100644 index 77b374577..000000000 --- a/frontend/.vscode/extensions.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846 - "recommendations": ["angular.ng-template"] -} diff --git a/frontend/.vscode/launch.json b/frontend/.vscode/launch.json deleted file mode 100644 index 740e35a0c..000000000 --- a/frontend/.vscode/launch.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "ng serve", - "type": "pwa-chrome", - "request": "launch", - "preLaunchTask": "npm: start", - "url": "http://localhost:4200/" - }, - { - "name": "ng test", - "type": "chrome", - "request": "launch", - "preLaunchTask": "npm: test", - "url": "http://localhost:9876/debug.html" - } - ] -} diff --git a/frontend/.vscode/tasks.json b/frontend/.vscode/tasks.json deleted file mode 100644 index a298b5bd8..000000000 --- a/frontend/.vscode/tasks.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558 - "version": "2.0.0", - "tasks": [ - { - "type": "npm", - "script": "start", - "isBackground": true, - "problemMatcher": { - "owner": "typescript", - "pattern": "$tsc", - "background": { - "activeOnStart": true, - "beginsPattern": { - "regexp": "(.*?)" - }, - "endsPattern": { - "regexp": "bundle generation complete" - } - } - } - }, - { - "type": "npm", - "script": "test", - "isBackground": true, - "problemMatcher": { - "owner": "typescript", - "pattern": "$tsc", - "background": { - "activeOnStart": true, - "beginsPattern": { - "regexp": "(.*?)" - }, - "endsPattern": { - "regexp": "bundle generation complete" - } - } - } - } - ] -} diff --git a/frontend/.browserslistrc b/web/.browserslistrc similarity index 100% rename from frontend/.browserslistrc rename to web/.browserslistrc diff --git a/frontend/.editorconfig b/web/.editorconfig similarity index 100% rename from frontend/.editorconfig rename to web/.editorconfig diff --git a/frontend/.gitignore b/web/.gitignore similarity index 100% rename from frontend/.gitignore rename to web/.gitignore diff --git a/frontend/.prettierrc b/web/.prettierrc similarity index 100% rename from frontend/.prettierrc rename to web/.prettierrc diff --git a/frontend/README.md b/web/README.md similarity index 100% rename from frontend/README.md rename to web/README.md diff --git a/frontend/angular.json b/web/angular.json similarity index 100% rename from frontend/angular.json rename to web/angular.json diff --git a/frontend/build-config.js b/web/build-config.js similarity index 100% rename from frontend/build-config.js rename to web/build-config.js diff --git a/frontend/config-sample.json b/web/config-sample.json similarity index 100% rename from frontend/config-sample.json rename to web/config-sample.json diff --git a/frontend/ionic.config.json b/web/ionic.config.json similarity index 100% rename from frontend/ionic.config.json rename to web/ionic.config.json diff --git a/frontend/lint-staged.config.js b/web/lint-staged.config.js similarity index 100% rename from frontend/lint-staged.config.js rename to web/lint-staged.config.js diff --git a/frontend/package-lock.json b/web/package-lock.json similarity index 100% rename from frontend/package-lock.json rename to web/package-lock.json diff --git a/frontend/package.json b/web/package.json similarity index 100% rename from frontend/package.json rename to web/package.json diff --git a/frontend/patchdb-ui-seed.json b/web/patchdb-ui-seed.json similarity index 100% rename from frontend/patchdb-ui-seed.json rename to web/patchdb-ui-seed.json diff --git a/frontend/projects/install-wizard/src/app/app-routing.module.ts b/web/projects/install-wizard/src/app/app-routing.module.ts similarity index 100% rename from frontend/projects/install-wizard/src/app/app-routing.module.ts rename to web/projects/install-wizard/src/app/app-routing.module.ts diff --git a/frontend/projects/install-wizard/src/app/app.component.html b/web/projects/install-wizard/src/app/app.component.html similarity index 100% rename from frontend/projects/install-wizard/src/app/app.component.html rename to web/projects/install-wizard/src/app/app.component.html diff --git a/frontend/projects/install-wizard/src/app/app.component.scss b/web/projects/install-wizard/src/app/app.component.scss similarity index 100% rename from frontend/projects/install-wizard/src/app/app.component.scss rename to web/projects/install-wizard/src/app/app.component.scss diff --git a/frontend/projects/install-wizard/src/app/app.component.ts b/web/projects/install-wizard/src/app/app.component.ts similarity index 100% rename from frontend/projects/install-wizard/src/app/app.component.ts rename to web/projects/install-wizard/src/app/app.component.ts diff --git a/frontend/projects/install-wizard/src/app/app.module.ts b/web/projects/install-wizard/src/app/app.module.ts similarity index 100% rename from frontend/projects/install-wizard/src/app/app.module.ts rename to web/projects/install-wizard/src/app/app.module.ts diff --git a/frontend/projects/install-wizard/src/app/pages/home/home.module.ts b/web/projects/install-wizard/src/app/pages/home/home.module.ts similarity index 100% rename from frontend/projects/install-wizard/src/app/pages/home/home.module.ts rename to web/projects/install-wizard/src/app/pages/home/home.module.ts diff --git a/frontend/projects/install-wizard/src/app/pages/home/home.page.html b/web/projects/install-wizard/src/app/pages/home/home.page.html similarity index 100% rename from frontend/projects/install-wizard/src/app/pages/home/home.page.html rename to web/projects/install-wizard/src/app/pages/home/home.page.html diff --git a/frontend/projects/install-wizard/src/app/pages/home/home.page.scss b/web/projects/install-wizard/src/app/pages/home/home.page.scss similarity index 100% rename from frontend/projects/install-wizard/src/app/pages/home/home.page.scss rename to web/projects/install-wizard/src/app/pages/home/home.page.scss diff --git a/frontend/projects/install-wizard/src/app/pages/home/home.page.ts b/web/projects/install-wizard/src/app/pages/home/home.page.ts similarity index 100% rename from frontend/projects/install-wizard/src/app/pages/home/home.page.ts rename to web/projects/install-wizard/src/app/pages/home/home.page.ts diff --git a/frontend/projects/install-wizard/src/app/services/api/api.service.ts b/web/projects/install-wizard/src/app/services/api/api.service.ts similarity index 100% rename from frontend/projects/install-wizard/src/app/services/api/api.service.ts rename to web/projects/install-wizard/src/app/services/api/api.service.ts diff --git a/frontend/projects/install-wizard/src/app/services/api/live-api.service.ts b/web/projects/install-wizard/src/app/services/api/live-api.service.ts similarity index 100% rename from frontend/projects/install-wizard/src/app/services/api/live-api.service.ts rename to web/projects/install-wizard/src/app/services/api/live-api.service.ts diff --git a/frontend/projects/install-wizard/src/app/services/api/mock-api.service.ts b/web/projects/install-wizard/src/app/services/api/mock-api.service.ts similarity index 100% rename from frontend/projects/install-wizard/src/app/services/api/mock-api.service.ts rename to web/projects/install-wizard/src/app/services/api/mock-api.service.ts diff --git a/frontend/projects/install-wizard/src/environments/environment.prod.ts b/web/projects/install-wizard/src/environments/environment.prod.ts similarity index 100% rename from frontend/projects/install-wizard/src/environments/environment.prod.ts rename to web/projects/install-wizard/src/environments/environment.prod.ts diff --git a/frontend/projects/install-wizard/src/environments/environment.ts b/web/projects/install-wizard/src/environments/environment.ts similarity index 100% rename from frontend/projects/install-wizard/src/environments/environment.ts rename to web/projects/install-wizard/src/environments/environment.ts diff --git a/frontend/projects/install-wizard/src/index.html b/web/projects/install-wizard/src/index.html similarity index 100% rename from frontend/projects/install-wizard/src/index.html rename to web/projects/install-wizard/src/index.html diff --git a/frontend/projects/install-wizard/src/main.ts b/web/projects/install-wizard/src/main.ts similarity index 100% rename from frontend/projects/install-wizard/src/main.ts rename to web/projects/install-wizard/src/main.ts diff --git a/frontend/projects/install-wizard/src/polyfills.ts b/web/projects/install-wizard/src/polyfills.ts similarity index 100% rename from frontend/projects/install-wizard/src/polyfills.ts rename to web/projects/install-wizard/src/polyfills.ts diff --git a/frontend/projects/install-wizard/src/styles.scss b/web/projects/install-wizard/src/styles.scss similarity index 100% rename from frontend/projects/install-wizard/src/styles.scss rename to web/projects/install-wizard/src/styles.scss diff --git a/frontend/projects/install-wizard/src/zone-flags.ts b/web/projects/install-wizard/src/zone-flags.ts similarity index 100% rename from frontend/projects/install-wizard/src/zone-flags.ts rename to web/projects/install-wizard/src/zone-flags.ts diff --git a/frontend/projects/install-wizard/tsconfig.json b/web/projects/install-wizard/tsconfig.json similarity index 100% rename from frontend/projects/install-wizard/tsconfig.json rename to web/projects/install-wizard/tsconfig.json diff --git a/frontend/projects/marketplace/ng-package.json b/web/projects/marketplace/ng-package.json similarity index 100% rename from frontend/projects/marketplace/ng-package.json rename to web/projects/marketplace/ng-package.json diff --git a/frontend/projects/marketplace/package.json b/web/projects/marketplace/package.json similarity index 100% rename from frontend/projects/marketplace/package.json rename to web/projects/marketplace/package.json diff --git a/frontend/projects/marketplace/src/components/store-icon/store-icon.component.html b/web/projects/marketplace/src/components/store-icon/store-icon.component.html similarity index 100% rename from frontend/projects/marketplace/src/components/store-icon/store-icon.component.html rename to web/projects/marketplace/src/components/store-icon/store-icon.component.html diff --git a/frontend/projects/marketplace/src/components/store-icon/store-icon.component.module.ts b/web/projects/marketplace/src/components/store-icon/store-icon.component.module.ts similarity index 100% rename from frontend/projects/marketplace/src/components/store-icon/store-icon.component.module.ts rename to web/projects/marketplace/src/components/store-icon/store-icon.component.module.ts diff --git a/frontend/projects/marketplace/src/components/store-icon/store-icon.component.scss b/web/projects/marketplace/src/components/store-icon/store-icon.component.scss similarity index 100% rename from frontend/projects/marketplace/src/components/store-icon/store-icon.component.scss rename to web/projects/marketplace/src/components/store-icon/store-icon.component.scss diff --git a/frontend/projects/marketplace/src/components/store-icon/store-icon.component.ts b/web/projects/marketplace/src/components/store-icon/store-icon.component.ts similarity index 100% rename from frontend/projects/marketplace/src/components/store-icon/store-icon.component.ts rename to web/projects/marketplace/src/components/store-icon/store-icon.component.ts diff --git a/frontend/projects/marketplace/src/pages/list/categories/categories.component.html b/web/projects/marketplace/src/pages/list/categories/categories.component.html similarity index 100% rename from frontend/projects/marketplace/src/pages/list/categories/categories.component.html rename to web/projects/marketplace/src/pages/list/categories/categories.component.html diff --git a/frontend/projects/marketplace/src/pages/list/categories/categories.component.scss b/web/projects/marketplace/src/pages/list/categories/categories.component.scss similarity index 100% rename from frontend/projects/marketplace/src/pages/list/categories/categories.component.scss rename to web/projects/marketplace/src/pages/list/categories/categories.component.scss diff --git a/frontend/projects/marketplace/src/pages/list/categories/categories.component.ts b/web/projects/marketplace/src/pages/list/categories/categories.component.ts similarity index 100% rename from frontend/projects/marketplace/src/pages/list/categories/categories.component.ts rename to web/projects/marketplace/src/pages/list/categories/categories.component.ts diff --git a/frontend/projects/marketplace/src/pages/list/categories/categories.module.ts b/web/projects/marketplace/src/pages/list/categories/categories.module.ts similarity index 100% rename from frontend/projects/marketplace/src/pages/list/categories/categories.module.ts rename to web/projects/marketplace/src/pages/list/categories/categories.module.ts diff --git a/frontend/projects/marketplace/src/pages/list/item/item.component.html b/web/projects/marketplace/src/pages/list/item/item.component.html similarity index 100% rename from frontend/projects/marketplace/src/pages/list/item/item.component.html rename to web/projects/marketplace/src/pages/list/item/item.component.html diff --git a/frontend/projects/marketplace/src/pages/list/item/item.component.ts b/web/projects/marketplace/src/pages/list/item/item.component.ts similarity index 100% rename from frontend/projects/marketplace/src/pages/list/item/item.component.ts rename to web/projects/marketplace/src/pages/list/item/item.component.ts diff --git a/frontend/projects/marketplace/src/pages/list/item/item.module.ts b/web/projects/marketplace/src/pages/list/item/item.module.ts similarity index 100% rename from frontend/projects/marketplace/src/pages/list/item/item.module.ts rename to web/projects/marketplace/src/pages/list/item/item.module.ts diff --git a/frontend/projects/marketplace/src/pages/list/search/search.component.html b/web/projects/marketplace/src/pages/list/search/search.component.html similarity index 100% rename from frontend/projects/marketplace/src/pages/list/search/search.component.html rename to web/projects/marketplace/src/pages/list/search/search.component.html diff --git a/frontend/projects/marketplace/src/pages/list/search/search.component.scss b/web/projects/marketplace/src/pages/list/search/search.component.scss similarity index 100% rename from frontend/projects/marketplace/src/pages/list/search/search.component.scss rename to web/projects/marketplace/src/pages/list/search/search.component.scss diff --git a/frontend/projects/marketplace/src/pages/list/search/search.component.ts b/web/projects/marketplace/src/pages/list/search/search.component.ts similarity index 100% rename from frontend/projects/marketplace/src/pages/list/search/search.component.ts rename to web/projects/marketplace/src/pages/list/search/search.component.ts diff --git a/frontend/projects/marketplace/src/pages/list/search/search.module.ts b/web/projects/marketplace/src/pages/list/search/search.module.ts similarity index 100% rename from frontend/projects/marketplace/src/pages/list/search/search.module.ts rename to web/projects/marketplace/src/pages/list/search/search.module.ts diff --git a/frontend/projects/marketplace/src/pages/list/skeleton/skeleton.component.html b/web/projects/marketplace/src/pages/list/skeleton/skeleton.component.html similarity index 100% rename from frontend/projects/marketplace/src/pages/list/skeleton/skeleton.component.html rename to web/projects/marketplace/src/pages/list/skeleton/skeleton.component.html diff --git a/frontend/projects/marketplace/src/pages/list/skeleton/skeleton.component.ts b/web/projects/marketplace/src/pages/list/skeleton/skeleton.component.ts similarity index 100% rename from frontend/projects/marketplace/src/pages/list/skeleton/skeleton.component.ts rename to web/projects/marketplace/src/pages/list/skeleton/skeleton.component.ts diff --git a/frontend/projects/marketplace/src/pages/list/skeleton/skeleton.module.ts b/web/projects/marketplace/src/pages/list/skeleton/skeleton.module.ts similarity index 100% rename from frontend/projects/marketplace/src/pages/list/skeleton/skeleton.module.ts rename to web/projects/marketplace/src/pages/list/skeleton/skeleton.module.ts diff --git a/frontend/projects/marketplace/src/pages/release-notes/release-notes.component.html b/web/projects/marketplace/src/pages/release-notes/release-notes.component.html similarity index 100% rename from frontend/projects/marketplace/src/pages/release-notes/release-notes.component.html rename to web/projects/marketplace/src/pages/release-notes/release-notes.component.html diff --git a/frontend/projects/marketplace/src/pages/release-notes/release-notes.component.scss b/web/projects/marketplace/src/pages/release-notes/release-notes.component.scss similarity index 100% rename from frontend/projects/marketplace/src/pages/release-notes/release-notes.component.scss rename to web/projects/marketplace/src/pages/release-notes/release-notes.component.scss diff --git a/frontend/projects/marketplace/src/pages/release-notes/release-notes.component.ts b/web/projects/marketplace/src/pages/release-notes/release-notes.component.ts similarity index 100% rename from frontend/projects/marketplace/src/pages/release-notes/release-notes.component.ts rename to web/projects/marketplace/src/pages/release-notes/release-notes.component.ts diff --git a/frontend/projects/marketplace/src/pages/release-notes/release-notes.module.ts b/web/projects/marketplace/src/pages/release-notes/release-notes.module.ts similarity index 100% rename from frontend/projects/marketplace/src/pages/release-notes/release-notes.module.ts rename to web/projects/marketplace/src/pages/release-notes/release-notes.module.ts diff --git a/frontend/projects/marketplace/src/pages/show/about/about.component.html b/web/projects/marketplace/src/pages/show/about/about.component.html similarity index 100% rename from frontend/projects/marketplace/src/pages/show/about/about.component.html rename to web/projects/marketplace/src/pages/show/about/about.component.html diff --git a/frontend/projects/marketplace/src/pages/show/about/about.component.scss b/web/projects/marketplace/src/pages/show/about/about.component.scss similarity index 100% rename from frontend/projects/marketplace/src/pages/show/about/about.component.scss rename to web/projects/marketplace/src/pages/show/about/about.component.scss diff --git a/frontend/projects/marketplace/src/pages/show/about/about.component.ts b/web/projects/marketplace/src/pages/show/about/about.component.ts similarity index 100% rename from frontend/projects/marketplace/src/pages/show/about/about.component.ts rename to web/projects/marketplace/src/pages/show/about/about.component.ts diff --git a/frontend/projects/marketplace/src/pages/show/about/about.module.ts b/web/projects/marketplace/src/pages/show/about/about.module.ts similarity index 100% rename from frontend/projects/marketplace/src/pages/show/about/about.module.ts rename to web/projects/marketplace/src/pages/show/about/about.module.ts diff --git a/frontend/projects/marketplace/src/pages/show/additional/additional.component.html b/web/projects/marketplace/src/pages/show/additional/additional.component.html similarity index 100% rename from frontend/projects/marketplace/src/pages/show/additional/additional.component.html rename to web/projects/marketplace/src/pages/show/additional/additional.component.html diff --git a/frontend/projects/marketplace/src/pages/show/additional/additional.component.scss b/web/projects/marketplace/src/pages/show/additional/additional.component.scss similarity index 100% rename from frontend/projects/marketplace/src/pages/show/additional/additional.component.scss rename to web/projects/marketplace/src/pages/show/additional/additional.component.scss diff --git a/frontend/projects/marketplace/src/pages/show/additional/additional.component.ts b/web/projects/marketplace/src/pages/show/additional/additional.component.ts similarity index 100% rename from frontend/projects/marketplace/src/pages/show/additional/additional.component.ts rename to web/projects/marketplace/src/pages/show/additional/additional.component.ts diff --git a/frontend/projects/marketplace/src/pages/show/additional/additional.module.ts b/web/projects/marketplace/src/pages/show/additional/additional.module.ts similarity index 100% rename from frontend/projects/marketplace/src/pages/show/additional/additional.module.ts rename to web/projects/marketplace/src/pages/show/additional/additional.module.ts diff --git a/frontend/projects/marketplace/src/pages/show/dependencies/dependencies.component.html b/web/projects/marketplace/src/pages/show/dependencies/dependencies.component.html similarity index 100% rename from frontend/projects/marketplace/src/pages/show/dependencies/dependencies.component.html rename to web/projects/marketplace/src/pages/show/dependencies/dependencies.component.html diff --git a/frontend/projects/marketplace/src/pages/show/dependencies/dependencies.component.ts b/web/projects/marketplace/src/pages/show/dependencies/dependencies.component.ts similarity index 100% rename from frontend/projects/marketplace/src/pages/show/dependencies/dependencies.component.ts rename to web/projects/marketplace/src/pages/show/dependencies/dependencies.component.ts diff --git a/frontend/projects/marketplace/src/pages/show/dependencies/dependencies.module.ts b/web/projects/marketplace/src/pages/show/dependencies/dependencies.module.ts similarity index 100% rename from frontend/projects/marketplace/src/pages/show/dependencies/dependencies.module.ts rename to web/projects/marketplace/src/pages/show/dependencies/dependencies.module.ts diff --git a/frontend/projects/marketplace/src/pages/show/package/package.component.html b/web/projects/marketplace/src/pages/show/package/package.component.html similarity index 100% rename from frontend/projects/marketplace/src/pages/show/package/package.component.html rename to web/projects/marketplace/src/pages/show/package/package.component.html diff --git a/frontend/projects/marketplace/src/pages/show/package/package.component.scss b/web/projects/marketplace/src/pages/show/package/package.component.scss similarity index 100% rename from frontend/projects/marketplace/src/pages/show/package/package.component.scss rename to web/projects/marketplace/src/pages/show/package/package.component.scss diff --git a/frontend/projects/marketplace/src/pages/show/package/package.component.ts b/web/projects/marketplace/src/pages/show/package/package.component.ts similarity index 100% rename from frontend/projects/marketplace/src/pages/show/package/package.component.ts rename to web/projects/marketplace/src/pages/show/package/package.component.ts diff --git a/frontend/projects/marketplace/src/pages/show/package/package.module.ts b/web/projects/marketplace/src/pages/show/package/package.module.ts similarity index 100% rename from frontend/projects/marketplace/src/pages/show/package/package.module.ts rename to web/projects/marketplace/src/pages/show/package/package.module.ts diff --git a/frontend/projects/marketplace/src/pipes/filter-packages.pipe.ts b/web/projects/marketplace/src/pipes/filter-packages.pipe.ts similarity index 100% rename from frontend/projects/marketplace/src/pipes/filter-packages.pipe.ts rename to web/projects/marketplace/src/pipes/filter-packages.pipe.ts diff --git a/frontend/projects/marketplace/src/pipes/mime-type.pipe.ts b/web/projects/marketplace/src/pipes/mime-type.pipe.ts similarity index 100% rename from frontend/projects/marketplace/src/pipes/mime-type.pipe.ts rename to web/projects/marketplace/src/pipes/mime-type.pipe.ts diff --git a/frontend/projects/marketplace/src/public-api.ts b/web/projects/marketplace/src/public-api.ts similarity index 100% rename from frontend/projects/marketplace/src/public-api.ts rename to web/projects/marketplace/src/public-api.ts diff --git a/frontend/projects/marketplace/src/services/marketplace.service.ts b/web/projects/marketplace/src/services/marketplace.service.ts similarity index 100% rename from frontend/projects/marketplace/src/services/marketplace.service.ts rename to web/projects/marketplace/src/services/marketplace.service.ts diff --git a/frontend/projects/marketplace/src/types.ts b/web/projects/marketplace/src/types.ts similarity index 100% rename from frontend/projects/marketplace/src/types.ts rename to web/projects/marketplace/src/types.ts diff --git a/frontend/projects/marketplace/tsconfig.json b/web/projects/marketplace/tsconfig.json similarity index 100% rename from frontend/projects/marketplace/tsconfig.json rename to web/projects/marketplace/tsconfig.json diff --git a/frontend/projects/setup-wizard/src/app/app-routing.module.ts b/web/projects/setup-wizard/src/app/app-routing.module.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/app-routing.module.ts rename to web/projects/setup-wizard/src/app/app-routing.module.ts diff --git a/frontend/projects/setup-wizard/src/app/app.component.html b/web/projects/setup-wizard/src/app/app.component.html similarity index 100% rename from frontend/projects/setup-wizard/src/app/app.component.html rename to web/projects/setup-wizard/src/app/app.component.html diff --git a/frontend/projects/setup-wizard/src/app/app.component.scss b/web/projects/setup-wizard/src/app/app.component.scss similarity index 100% rename from frontend/projects/setup-wizard/src/app/app.component.scss rename to web/projects/setup-wizard/src/app/app.component.scss diff --git a/frontend/projects/setup-wizard/src/app/app.component.ts b/web/projects/setup-wizard/src/app/app.component.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/app.component.ts rename to web/projects/setup-wizard/src/app/app.component.ts diff --git a/frontend/projects/setup-wizard/src/app/app.module.ts b/web/projects/setup-wizard/src/app/app.module.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/app.module.ts rename to web/projects/setup-wizard/src/app/app.module.ts diff --git a/frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.module.ts b/web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.module.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.module.ts rename to web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.module.ts diff --git a/frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.html b/web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.html similarity index 100% rename from frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.html rename to web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.html diff --git a/frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.scss b/web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.scss similarity index 100% rename from frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.scss rename to web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.scss diff --git a/frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.ts b/web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.ts rename to web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.ts diff --git a/frontend/projects/setup-wizard/src/app/modals/password/password.module.ts b/web/projects/setup-wizard/src/app/modals/password/password.module.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/modals/password/password.module.ts rename to web/projects/setup-wizard/src/app/modals/password/password.module.ts diff --git a/frontend/projects/setup-wizard/src/app/modals/password/password.page.html b/web/projects/setup-wizard/src/app/modals/password/password.page.html similarity index 100% rename from frontend/projects/setup-wizard/src/app/modals/password/password.page.html rename to web/projects/setup-wizard/src/app/modals/password/password.page.html diff --git a/frontend/projects/setup-wizard/src/app/modals/password/password.page.ts b/web/projects/setup-wizard/src/app/modals/password/password.page.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/modals/password/password.page.ts rename to web/projects/setup-wizard/src/app/modals/password/password.page.ts diff --git a/frontend/projects/setup-wizard/src/app/pages/attach/attach-routing.module.ts b/web/projects/setup-wizard/src/app/pages/attach/attach-routing.module.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/attach/attach-routing.module.ts rename to web/projects/setup-wizard/src/app/pages/attach/attach-routing.module.ts diff --git a/frontend/projects/setup-wizard/src/app/pages/attach/attach.module.ts b/web/projects/setup-wizard/src/app/pages/attach/attach.module.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/attach/attach.module.ts rename to web/projects/setup-wizard/src/app/pages/attach/attach.module.ts diff --git a/frontend/projects/setup-wizard/src/app/pages/attach/attach.page.html b/web/projects/setup-wizard/src/app/pages/attach/attach.page.html similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/attach/attach.page.html rename to web/projects/setup-wizard/src/app/pages/attach/attach.page.html diff --git a/frontend/projects/setup-wizard/src/app/pages/attach/attach.page.scss b/web/projects/setup-wizard/src/app/pages/attach/attach.page.scss similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/attach/attach.page.scss rename to web/projects/setup-wizard/src/app/pages/attach/attach.page.scss diff --git a/frontend/projects/setup-wizard/src/app/pages/attach/attach.page.ts b/web/projects/setup-wizard/src/app/pages/attach/attach.page.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/attach/attach.page.ts rename to web/projects/setup-wizard/src/app/pages/attach/attach.page.ts diff --git a/frontend/projects/setup-wizard/src/app/pages/embassy/embassy-routing.module.ts b/web/projects/setup-wizard/src/app/pages/embassy/embassy-routing.module.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/embassy/embassy-routing.module.ts rename to web/projects/setup-wizard/src/app/pages/embassy/embassy-routing.module.ts diff --git a/frontend/projects/setup-wizard/src/app/pages/embassy/embassy.module.ts b/web/projects/setup-wizard/src/app/pages/embassy/embassy.module.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/embassy/embassy.module.ts rename to web/projects/setup-wizard/src/app/pages/embassy/embassy.module.ts diff --git a/frontend/projects/setup-wizard/src/app/pages/embassy/embassy.page.html b/web/projects/setup-wizard/src/app/pages/embassy/embassy.page.html similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/embassy/embassy.page.html rename to web/projects/setup-wizard/src/app/pages/embassy/embassy.page.html diff --git a/frontend/projects/setup-wizard/src/app/pages/embassy/embassy.page.scss b/web/projects/setup-wizard/src/app/pages/embassy/embassy.page.scss similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/embassy/embassy.page.scss rename to web/projects/setup-wizard/src/app/pages/embassy/embassy.page.scss diff --git a/frontend/projects/setup-wizard/src/app/pages/embassy/embassy.page.ts b/web/projects/setup-wizard/src/app/pages/embassy/embassy.page.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/embassy/embassy.page.ts rename to web/projects/setup-wizard/src/app/pages/embassy/embassy.page.ts diff --git a/frontend/projects/setup-wizard/src/app/pages/home/home-routing.module.ts b/web/projects/setup-wizard/src/app/pages/home/home-routing.module.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/home/home-routing.module.ts rename to web/projects/setup-wizard/src/app/pages/home/home-routing.module.ts diff --git a/frontend/projects/setup-wizard/src/app/pages/home/home.module.ts b/web/projects/setup-wizard/src/app/pages/home/home.module.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/home/home.module.ts rename to web/projects/setup-wizard/src/app/pages/home/home.module.ts diff --git a/frontend/projects/setup-wizard/src/app/pages/home/home.page.html b/web/projects/setup-wizard/src/app/pages/home/home.page.html similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/home/home.page.html rename to web/projects/setup-wizard/src/app/pages/home/home.page.html diff --git a/frontend/projects/setup-wizard/src/app/pages/home/home.page.scss b/web/projects/setup-wizard/src/app/pages/home/home.page.scss similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/home/home.page.scss rename to web/projects/setup-wizard/src/app/pages/home/home.page.scss diff --git a/frontend/projects/setup-wizard/src/app/pages/home/home.page.ts b/web/projects/setup-wizard/src/app/pages/home/home.page.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/home/home.page.ts rename to web/projects/setup-wizard/src/app/pages/home/home.page.ts diff --git a/frontend/projects/setup-wizard/src/app/pages/loading/loading.module.ts b/web/projects/setup-wizard/src/app/pages/loading/loading.module.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/loading/loading.module.ts rename to web/projects/setup-wizard/src/app/pages/loading/loading.module.ts diff --git a/frontend/projects/setup-wizard/src/app/pages/loading/loading.page.html b/web/projects/setup-wizard/src/app/pages/loading/loading.page.html similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/loading/loading.page.html rename to web/projects/setup-wizard/src/app/pages/loading/loading.page.html diff --git a/frontend/projects/setup-wizard/src/app/pages/loading/loading.page.ts b/web/projects/setup-wizard/src/app/pages/loading/loading.page.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/loading/loading.page.ts rename to web/projects/setup-wizard/src/app/pages/loading/loading.page.ts diff --git a/frontend/projects/setup-wizard/src/app/pages/recover/drive-status.component.html b/web/projects/setup-wizard/src/app/pages/recover/drive-status.component.html similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/recover/drive-status.component.html rename to web/projects/setup-wizard/src/app/pages/recover/drive-status.component.html diff --git a/frontend/projects/setup-wizard/src/app/pages/recover/recover-routing.module.ts b/web/projects/setup-wizard/src/app/pages/recover/recover-routing.module.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/recover/recover-routing.module.ts rename to web/projects/setup-wizard/src/app/pages/recover/recover-routing.module.ts diff --git a/frontend/projects/setup-wizard/src/app/pages/recover/recover.module.ts b/web/projects/setup-wizard/src/app/pages/recover/recover.module.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/recover/recover.module.ts rename to web/projects/setup-wizard/src/app/pages/recover/recover.module.ts diff --git a/frontend/projects/setup-wizard/src/app/pages/recover/recover.page.html b/web/projects/setup-wizard/src/app/pages/recover/recover.page.html similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/recover/recover.page.html rename to web/projects/setup-wizard/src/app/pages/recover/recover.page.html diff --git a/frontend/projects/setup-wizard/src/app/pages/recover/recover.page.scss b/web/projects/setup-wizard/src/app/pages/recover/recover.page.scss similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/recover/recover.page.scss rename to web/projects/setup-wizard/src/app/pages/recover/recover.page.scss diff --git a/frontend/projects/setup-wizard/src/app/pages/recover/recover.page.ts b/web/projects/setup-wizard/src/app/pages/recover/recover.page.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/recover/recover.page.ts rename to web/projects/setup-wizard/src/app/pages/recover/recover.page.ts diff --git a/frontend/projects/setup-wizard/src/app/pages/success/download-doc/download-doc.component.html b/web/projects/setup-wizard/src/app/pages/success/download-doc/download-doc.component.html similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/success/download-doc/download-doc.component.html rename to web/projects/setup-wizard/src/app/pages/success/download-doc/download-doc.component.html diff --git a/frontend/projects/setup-wizard/src/app/pages/success/download-doc/download-doc.component.ts b/web/projects/setup-wizard/src/app/pages/success/download-doc/download-doc.component.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/success/download-doc/download-doc.component.ts rename to web/projects/setup-wizard/src/app/pages/success/download-doc/download-doc.component.ts diff --git a/frontend/projects/setup-wizard/src/app/pages/success/success-routing.module.ts b/web/projects/setup-wizard/src/app/pages/success/success-routing.module.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/success/success-routing.module.ts rename to web/projects/setup-wizard/src/app/pages/success/success-routing.module.ts diff --git a/frontend/projects/setup-wizard/src/app/pages/success/success.module.ts b/web/projects/setup-wizard/src/app/pages/success/success.module.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/success/success.module.ts rename to web/projects/setup-wizard/src/app/pages/success/success.module.ts diff --git a/frontend/projects/setup-wizard/src/app/pages/success/success.page.html b/web/projects/setup-wizard/src/app/pages/success/success.page.html similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/success/success.page.html rename to web/projects/setup-wizard/src/app/pages/success/success.page.html diff --git a/frontend/projects/setup-wizard/src/app/pages/success/success.page.scss b/web/projects/setup-wizard/src/app/pages/success/success.page.scss similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/success/success.page.scss rename to web/projects/setup-wizard/src/app/pages/success/success.page.scss diff --git a/frontend/projects/setup-wizard/src/app/pages/success/success.page.ts b/web/projects/setup-wizard/src/app/pages/success/success.page.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/success/success.page.ts rename to web/projects/setup-wizard/src/app/pages/success/success.page.ts diff --git a/frontend/projects/setup-wizard/src/app/pages/transfer/transfer-routing.module.ts b/web/projects/setup-wizard/src/app/pages/transfer/transfer-routing.module.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/transfer/transfer-routing.module.ts rename to web/projects/setup-wizard/src/app/pages/transfer/transfer-routing.module.ts diff --git a/frontend/projects/setup-wizard/src/app/pages/transfer/transfer.module.ts b/web/projects/setup-wizard/src/app/pages/transfer/transfer.module.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/transfer/transfer.module.ts rename to web/projects/setup-wizard/src/app/pages/transfer/transfer.module.ts diff --git a/frontend/projects/setup-wizard/src/app/pages/transfer/transfer.page.html b/web/projects/setup-wizard/src/app/pages/transfer/transfer.page.html similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/transfer/transfer.page.html rename to web/projects/setup-wizard/src/app/pages/transfer/transfer.page.html diff --git a/frontend/projects/setup-wizard/src/app/pages/transfer/transfer.page.scss b/web/projects/setup-wizard/src/app/pages/transfer/transfer.page.scss similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/transfer/transfer.page.scss rename to web/projects/setup-wizard/src/app/pages/transfer/transfer.page.scss diff --git a/frontend/projects/setup-wizard/src/app/pages/transfer/transfer.page.ts b/web/projects/setup-wizard/src/app/pages/transfer/transfer.page.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/pages/transfer/transfer.page.ts rename to web/projects/setup-wizard/src/app/pages/transfer/transfer.page.ts diff --git a/frontend/projects/setup-wizard/src/app/services/api/api.service.ts b/web/projects/setup-wizard/src/app/services/api/api.service.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/services/api/api.service.ts rename to web/projects/setup-wizard/src/app/services/api/api.service.ts diff --git a/frontend/projects/setup-wizard/src/app/services/api/live-api.service.ts b/web/projects/setup-wizard/src/app/services/api/live-api.service.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/services/api/live-api.service.ts rename to web/projects/setup-wizard/src/app/services/api/live-api.service.ts diff --git a/frontend/projects/setup-wizard/src/app/services/api/mock-api.service.ts b/web/projects/setup-wizard/src/app/services/api/mock-api.service.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/services/api/mock-api.service.ts rename to web/projects/setup-wizard/src/app/services/api/mock-api.service.ts diff --git a/frontend/projects/setup-wizard/src/app/services/state.service.ts b/web/projects/setup-wizard/src/app/services/state.service.ts similarity index 100% rename from frontend/projects/setup-wizard/src/app/services/state.service.ts rename to web/projects/setup-wizard/src/app/services/state.service.ts diff --git a/frontend/projects/setup-wizard/src/environments/environment.prod.ts b/web/projects/setup-wizard/src/environments/environment.prod.ts similarity index 100% rename from frontend/projects/setup-wizard/src/environments/environment.prod.ts rename to web/projects/setup-wizard/src/environments/environment.prod.ts diff --git a/frontend/projects/setup-wizard/src/environments/environment.ts b/web/projects/setup-wizard/src/environments/environment.ts similarity index 100% rename from frontend/projects/setup-wizard/src/environments/environment.ts rename to web/projects/setup-wizard/src/environments/environment.ts diff --git a/frontend/projects/setup-wizard/src/index.html b/web/projects/setup-wizard/src/index.html similarity index 100% rename from frontend/projects/setup-wizard/src/index.html rename to web/projects/setup-wizard/src/index.html diff --git a/frontend/projects/setup-wizard/src/main.ts b/web/projects/setup-wizard/src/main.ts similarity index 100% rename from frontend/projects/setup-wizard/src/main.ts rename to web/projects/setup-wizard/src/main.ts diff --git a/frontend/projects/setup-wizard/src/polyfills.ts b/web/projects/setup-wizard/src/polyfills.ts similarity index 100% rename from frontend/projects/setup-wizard/src/polyfills.ts rename to web/projects/setup-wizard/src/polyfills.ts diff --git a/frontend/projects/setup-wizard/src/styles.scss b/web/projects/setup-wizard/src/styles.scss similarity index 100% rename from frontend/projects/setup-wizard/src/styles.scss rename to web/projects/setup-wizard/src/styles.scss diff --git a/frontend/projects/setup-wizard/src/zone-flags.ts b/web/projects/setup-wizard/src/zone-flags.ts similarity index 100% rename from frontend/projects/setup-wizard/src/zone-flags.ts rename to web/projects/setup-wizard/src/zone-flags.ts diff --git a/frontend/projects/setup-wizard/tsconfig.json b/web/projects/setup-wizard/tsconfig.json similarity index 100% rename from frontend/projects/setup-wizard/tsconfig.json rename to web/projects/setup-wizard/tsconfig.json diff --git a/frontend/projects/shared/assets/fonts/Benton_Sans/BentonSans-Regular.otf b/web/projects/shared/assets/fonts/Benton_Sans/BentonSans-Regular.otf similarity index 100% rename from frontend/projects/shared/assets/fonts/Benton_Sans/BentonSans-Regular.otf rename to web/projects/shared/assets/fonts/Benton_Sans/BentonSans-Regular.otf diff --git a/frontend/projects/shared/assets/fonts/Courier_New/CourierNew-Bold.ttf b/web/projects/shared/assets/fonts/Courier_New/CourierNew-Bold.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Courier_New/CourierNew-Bold.ttf rename to web/projects/shared/assets/fonts/Courier_New/CourierNew-Bold.ttf diff --git a/frontend/projects/shared/assets/fonts/Courier_New/CourierNew-Regular.ttf b/web/projects/shared/assets/fonts/Courier_New/CourierNew-Regular.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Courier_New/CourierNew-Regular.ttf rename to web/projects/shared/assets/fonts/Courier_New/CourierNew-Regular.ttf diff --git a/frontend/projects/shared/assets/fonts/Montserrat/Montserrat-Black.ttf b/web/projects/shared/assets/fonts/Montserrat/Montserrat-Black.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Montserrat/Montserrat-Black.ttf rename to web/projects/shared/assets/fonts/Montserrat/Montserrat-Black.ttf diff --git a/frontend/projects/shared/assets/fonts/Montserrat/Montserrat-BlackItalic.ttf b/web/projects/shared/assets/fonts/Montserrat/Montserrat-BlackItalic.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Montserrat/Montserrat-BlackItalic.ttf rename to web/projects/shared/assets/fonts/Montserrat/Montserrat-BlackItalic.ttf diff --git a/frontend/projects/shared/assets/fonts/Montserrat/Montserrat-Bold.ttf b/web/projects/shared/assets/fonts/Montserrat/Montserrat-Bold.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Montserrat/Montserrat-Bold.ttf rename to web/projects/shared/assets/fonts/Montserrat/Montserrat-Bold.ttf diff --git a/frontend/projects/shared/assets/fonts/Montserrat/Montserrat-BoldItalic.ttf b/web/projects/shared/assets/fonts/Montserrat/Montserrat-BoldItalic.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Montserrat/Montserrat-BoldItalic.ttf rename to web/projects/shared/assets/fonts/Montserrat/Montserrat-BoldItalic.ttf diff --git a/frontend/projects/shared/assets/fonts/Montserrat/Montserrat-ExtraBold.ttf b/web/projects/shared/assets/fonts/Montserrat/Montserrat-ExtraBold.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Montserrat/Montserrat-ExtraBold.ttf rename to web/projects/shared/assets/fonts/Montserrat/Montserrat-ExtraBold.ttf diff --git a/frontend/projects/shared/assets/fonts/Montserrat/Montserrat-ExtraBoldItalic.ttf b/web/projects/shared/assets/fonts/Montserrat/Montserrat-ExtraBoldItalic.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Montserrat/Montserrat-ExtraBoldItalic.ttf rename to web/projects/shared/assets/fonts/Montserrat/Montserrat-ExtraBoldItalic.ttf diff --git a/frontend/projects/shared/assets/fonts/Montserrat/Montserrat-ExtraLight.ttf b/web/projects/shared/assets/fonts/Montserrat/Montserrat-ExtraLight.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Montserrat/Montserrat-ExtraLight.ttf rename to web/projects/shared/assets/fonts/Montserrat/Montserrat-ExtraLight.ttf diff --git a/frontend/projects/shared/assets/fonts/Montserrat/Montserrat-ExtraLightItalic.ttf b/web/projects/shared/assets/fonts/Montserrat/Montserrat-ExtraLightItalic.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Montserrat/Montserrat-ExtraLightItalic.ttf rename to web/projects/shared/assets/fonts/Montserrat/Montserrat-ExtraLightItalic.ttf diff --git a/frontend/projects/shared/assets/fonts/Montserrat/Montserrat-Italic.ttf b/web/projects/shared/assets/fonts/Montserrat/Montserrat-Italic.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Montserrat/Montserrat-Italic.ttf rename to web/projects/shared/assets/fonts/Montserrat/Montserrat-Italic.ttf diff --git a/frontend/projects/shared/assets/fonts/Montserrat/Montserrat-Light.ttf b/web/projects/shared/assets/fonts/Montserrat/Montserrat-Light.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Montserrat/Montserrat-Light.ttf rename to web/projects/shared/assets/fonts/Montserrat/Montserrat-Light.ttf diff --git a/frontend/projects/shared/assets/fonts/Montserrat/Montserrat-LightItalic.ttf b/web/projects/shared/assets/fonts/Montserrat/Montserrat-LightItalic.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Montserrat/Montserrat-LightItalic.ttf rename to web/projects/shared/assets/fonts/Montserrat/Montserrat-LightItalic.ttf diff --git a/frontend/projects/shared/assets/fonts/Montserrat/Montserrat-Medium.ttf b/web/projects/shared/assets/fonts/Montserrat/Montserrat-Medium.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Montserrat/Montserrat-Medium.ttf rename to web/projects/shared/assets/fonts/Montserrat/Montserrat-Medium.ttf diff --git a/frontend/projects/shared/assets/fonts/Montserrat/Montserrat-MediumItalic.ttf b/web/projects/shared/assets/fonts/Montserrat/Montserrat-MediumItalic.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Montserrat/Montserrat-MediumItalic.ttf rename to web/projects/shared/assets/fonts/Montserrat/Montserrat-MediumItalic.ttf diff --git a/frontend/projects/shared/assets/fonts/Montserrat/Montserrat-Regular.ttf b/web/projects/shared/assets/fonts/Montserrat/Montserrat-Regular.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Montserrat/Montserrat-Regular.ttf rename to web/projects/shared/assets/fonts/Montserrat/Montserrat-Regular.ttf diff --git a/frontend/projects/shared/assets/fonts/Montserrat/Montserrat-SemiBold.ttf b/web/projects/shared/assets/fonts/Montserrat/Montserrat-SemiBold.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Montserrat/Montserrat-SemiBold.ttf rename to web/projects/shared/assets/fonts/Montserrat/Montserrat-SemiBold.ttf diff --git a/frontend/projects/shared/assets/fonts/Montserrat/Montserrat-SemiBoldItalic.ttf b/web/projects/shared/assets/fonts/Montserrat/Montserrat-SemiBoldItalic.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Montserrat/Montserrat-SemiBoldItalic.ttf rename to web/projects/shared/assets/fonts/Montserrat/Montserrat-SemiBoldItalic.ttf diff --git a/frontend/projects/shared/assets/fonts/Montserrat/Montserrat-Thin.ttf b/web/projects/shared/assets/fonts/Montserrat/Montserrat-Thin.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Montserrat/Montserrat-Thin.ttf rename to web/projects/shared/assets/fonts/Montserrat/Montserrat-Thin.ttf diff --git a/frontend/projects/shared/assets/fonts/Montserrat/Montserrat-ThinItalic.ttf b/web/projects/shared/assets/fonts/Montserrat/Montserrat-ThinItalic.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Montserrat/Montserrat-ThinItalic.ttf rename to web/projects/shared/assets/fonts/Montserrat/Montserrat-ThinItalic.ttf diff --git a/frontend/projects/shared/assets/fonts/Montserrat/OFL.txt b/web/projects/shared/assets/fonts/Montserrat/OFL.txt similarity index 100% rename from frontend/projects/shared/assets/fonts/Montserrat/OFL.txt rename to web/projects/shared/assets/fonts/Montserrat/OFL.txt diff --git a/frontend/projects/shared/assets/fonts/Open_Sans/LICENSE.txt b/web/projects/shared/assets/fonts/Open_Sans/LICENSE.txt similarity index 100% rename from frontend/projects/shared/assets/fonts/Open_Sans/LICENSE.txt rename to web/projects/shared/assets/fonts/Open_Sans/LICENSE.txt diff --git a/frontend/projects/shared/assets/fonts/Open_Sans/OpenSans-Bold.ttf b/web/projects/shared/assets/fonts/Open_Sans/OpenSans-Bold.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Open_Sans/OpenSans-Bold.ttf rename to web/projects/shared/assets/fonts/Open_Sans/OpenSans-Bold.ttf diff --git a/frontend/projects/shared/assets/fonts/Open_Sans/OpenSans-BoldItalic.ttf b/web/projects/shared/assets/fonts/Open_Sans/OpenSans-BoldItalic.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Open_Sans/OpenSans-BoldItalic.ttf rename to web/projects/shared/assets/fonts/Open_Sans/OpenSans-BoldItalic.ttf diff --git a/frontend/projects/shared/assets/fonts/Open_Sans/OpenSans-ExtraBold.ttf b/web/projects/shared/assets/fonts/Open_Sans/OpenSans-ExtraBold.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Open_Sans/OpenSans-ExtraBold.ttf rename to web/projects/shared/assets/fonts/Open_Sans/OpenSans-ExtraBold.ttf diff --git a/frontend/projects/shared/assets/fonts/Open_Sans/OpenSans-ExtraBoldItalic.ttf b/web/projects/shared/assets/fonts/Open_Sans/OpenSans-ExtraBoldItalic.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Open_Sans/OpenSans-ExtraBoldItalic.ttf rename to web/projects/shared/assets/fonts/Open_Sans/OpenSans-ExtraBoldItalic.ttf diff --git a/frontend/projects/shared/assets/fonts/Open_Sans/OpenSans-Italic.ttf b/web/projects/shared/assets/fonts/Open_Sans/OpenSans-Italic.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Open_Sans/OpenSans-Italic.ttf rename to web/projects/shared/assets/fonts/Open_Sans/OpenSans-Italic.ttf diff --git a/frontend/projects/shared/assets/fonts/Open_Sans/OpenSans-Light.ttf b/web/projects/shared/assets/fonts/Open_Sans/OpenSans-Light.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Open_Sans/OpenSans-Light.ttf rename to web/projects/shared/assets/fonts/Open_Sans/OpenSans-Light.ttf diff --git a/frontend/projects/shared/assets/fonts/Open_Sans/OpenSans-LightItalic.ttf b/web/projects/shared/assets/fonts/Open_Sans/OpenSans-LightItalic.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Open_Sans/OpenSans-LightItalic.ttf rename to web/projects/shared/assets/fonts/Open_Sans/OpenSans-LightItalic.ttf diff --git a/frontend/projects/shared/assets/fonts/Open_Sans/OpenSans-Regular.ttf b/web/projects/shared/assets/fonts/Open_Sans/OpenSans-Regular.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Open_Sans/OpenSans-Regular.ttf rename to web/projects/shared/assets/fonts/Open_Sans/OpenSans-Regular.ttf diff --git a/frontend/projects/shared/assets/fonts/Open_Sans/OpenSans-SemiBold.ttf b/web/projects/shared/assets/fonts/Open_Sans/OpenSans-SemiBold.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Open_Sans/OpenSans-SemiBold.ttf rename to web/projects/shared/assets/fonts/Open_Sans/OpenSans-SemiBold.ttf diff --git a/frontend/projects/shared/assets/fonts/Open_Sans/OpenSans-SemiBoldItalic.ttf b/web/projects/shared/assets/fonts/Open_Sans/OpenSans-SemiBoldItalic.ttf similarity index 100% rename from frontend/projects/shared/assets/fonts/Open_Sans/OpenSans-SemiBoldItalic.ttf rename to web/projects/shared/assets/fonts/Open_Sans/OpenSans-SemiBoldItalic.ttf diff --git a/frontend/projects/shared/assets/fonts/text-security-disc.woff2 b/web/projects/shared/assets/fonts/text-security-disc.woff2 similarity index 100% rename from frontend/projects/shared/assets/fonts/text-security-disc.woff2 rename to web/projects/shared/assets/fonts/text-security-disc.woff2 diff --git a/frontend/projects/shared/assets/icon/favicon.ico b/web/projects/shared/assets/icon/favicon.ico similarity index 100% rename from frontend/projects/shared/assets/icon/favicon.ico rename to web/projects/shared/assets/icon/favicon.ico diff --git a/frontend/projects/shared/assets/img/background_dark.jpeg b/web/projects/shared/assets/img/background_dark.jpeg similarity index 100% rename from frontend/projects/shared/assets/img/background_dark.jpeg rename to web/projects/shared/assets/img/background_dark.jpeg diff --git a/frontend/projects/shared/assets/img/background_light.jpeg b/web/projects/shared/assets/img/background_light.jpeg similarity index 100% rename from frontend/projects/shared/assets/img/background_light.jpeg rename to web/projects/shared/assets/img/background_light.jpeg diff --git a/frontend/projects/shared/assets/img/community-store.png b/web/projects/shared/assets/img/community-store.png similarity index 100% rename from frontend/projects/shared/assets/img/community-store.png rename to web/projects/shared/assets/img/community-store.png diff --git a/frontend/projects/shared/assets/img/icon.png b/web/projects/shared/assets/img/icon.png similarity index 100% rename from frontend/projects/shared/assets/img/icon.png rename to web/projects/shared/assets/img/icon.png diff --git a/frontend/projects/shared/assets/img/icon_apple_touch.png b/web/projects/shared/assets/img/icon_apple_touch.png similarity index 100% rename from frontend/projects/shared/assets/img/icon_apple_touch.png rename to web/projects/shared/assets/img/icon_apple_touch.png diff --git a/frontend/projects/shared/assets/img/icons/bitcoin.svg b/web/projects/shared/assets/img/icons/bitcoin.svg similarity index 100% rename from frontend/projects/shared/assets/img/icons/bitcoin.svg rename to web/projects/shared/assets/img/icons/bitcoin.svg diff --git a/frontend/projects/shared/assets/img/icons/snek.png b/web/projects/shared/assets/img/icons/snek.png similarity index 100% rename from frontend/projects/shared/assets/img/icons/snek.png rename to web/projects/shared/assets/img/icons/snek.png diff --git a/frontend/projects/shared/assets/img/icons/wifi-0.png b/web/projects/shared/assets/img/icons/wifi-0.png similarity index 100% rename from frontend/projects/shared/assets/img/icons/wifi-0.png rename to web/projects/shared/assets/img/icons/wifi-0.png diff --git a/frontend/projects/shared/assets/img/icons/wifi-1.png b/web/projects/shared/assets/img/icons/wifi-1.png similarity index 100% rename from frontend/projects/shared/assets/img/icons/wifi-1.png rename to web/projects/shared/assets/img/icons/wifi-1.png diff --git a/frontend/projects/shared/assets/img/icons/wifi-2.png b/web/projects/shared/assets/img/icons/wifi-2.png similarity index 100% rename from frontend/projects/shared/assets/img/icons/wifi-2.png rename to web/projects/shared/assets/img/icons/wifi-2.png diff --git a/frontend/projects/shared/assets/img/icons/wifi-3.png b/web/projects/shared/assets/img/icons/wifi-3.png similarity index 100% rename from frontend/projects/shared/assets/img/icons/wifi-3.png rename to web/projects/shared/assets/img/icons/wifi-3.png diff --git a/frontend/projects/shared/assets/img/service-icons/bitcoind.svg b/web/projects/shared/assets/img/service-icons/bitcoind.svg similarity index 100% rename from frontend/projects/shared/assets/img/service-icons/bitcoind.svg rename to web/projects/shared/assets/img/service-icons/bitcoind.svg diff --git a/frontend/projects/shared/assets/img/service-icons/btc-rpc-proxy.png b/web/projects/shared/assets/img/service-icons/btc-rpc-proxy.png similarity index 100% rename from frontend/projects/shared/assets/img/service-icons/btc-rpc-proxy.png rename to web/projects/shared/assets/img/service-icons/btc-rpc-proxy.png diff --git a/frontend/projects/shared/assets/img/service-icons/lnd.png b/web/projects/shared/assets/img/service-icons/lnd.png similarity index 100% rename from frontend/projects/shared/assets/img/service-icons/lnd.png rename to web/projects/shared/assets/img/service-icons/lnd.png diff --git a/frontend/projects/shared/assets/markdown/md-sample.md b/web/projects/shared/assets/markdown/md-sample.md similarity index 100% rename from frontend/projects/shared/assets/markdown/md-sample.md rename to web/projects/shared/assets/markdown/md-sample.md diff --git a/frontend/projects/shared/ng-package.json b/web/projects/shared/ng-package.json similarity index 100% rename from frontend/projects/shared/ng-package.json rename to web/projects/shared/ng-package.json diff --git a/frontend/projects/shared/package.json b/web/projects/shared/package.json similarity index 100% rename from frontend/projects/shared/package.json rename to web/projects/shared/package.json diff --git a/frontend/projects/shared/src/classes/http-error.ts b/web/projects/shared/src/classes/http-error.ts similarity index 100% rename from frontend/projects/shared/src/classes/http-error.ts rename to web/projects/shared/src/classes/http-error.ts diff --git a/frontend/projects/shared/src/classes/rpc-error.ts b/web/projects/shared/src/classes/rpc-error.ts similarity index 100% rename from frontend/projects/shared/src/classes/rpc-error.ts rename to web/projects/shared/src/classes/rpc-error.ts diff --git a/frontend/projects/shared/src/components/initializing/initializing.component.html b/web/projects/shared/src/components/initializing/initializing.component.html similarity index 100% rename from frontend/projects/shared/src/components/initializing/initializing.component.html rename to web/projects/shared/src/components/initializing/initializing.component.html diff --git a/frontend/projects/shared/src/components/initializing/initializing.component.scss b/web/projects/shared/src/components/initializing/initializing.component.scss similarity index 100% rename from frontend/projects/shared/src/components/initializing/initializing.component.scss rename to web/projects/shared/src/components/initializing/initializing.component.scss diff --git a/frontend/projects/shared/src/components/initializing/initializing.component.ts b/web/projects/shared/src/components/initializing/initializing.component.ts similarity index 100% rename from frontend/projects/shared/src/components/initializing/initializing.component.ts rename to web/projects/shared/src/components/initializing/initializing.component.ts diff --git a/frontend/projects/shared/src/components/initializing/initializing.module.ts b/web/projects/shared/src/components/initializing/initializing.module.ts similarity index 100% rename from frontend/projects/shared/src/components/initializing/initializing.module.ts rename to web/projects/shared/src/components/initializing/initializing.module.ts diff --git a/frontend/projects/shared/src/components/initializing/logs-window/logs-window.component.html b/web/projects/shared/src/components/initializing/logs-window/logs-window.component.html similarity index 100% rename from frontend/projects/shared/src/components/initializing/logs-window/logs-window.component.html rename to web/projects/shared/src/components/initializing/logs-window/logs-window.component.html diff --git a/frontend/projects/shared/src/components/initializing/logs-window/logs-window.component.scss b/web/projects/shared/src/components/initializing/logs-window/logs-window.component.scss similarity index 100% rename from frontend/projects/shared/src/components/initializing/logs-window/logs-window.component.scss rename to web/projects/shared/src/components/initializing/logs-window/logs-window.component.scss diff --git a/frontend/projects/shared/src/components/initializing/logs-window/logs-window.component.ts b/web/projects/shared/src/components/initializing/logs-window/logs-window.component.ts similarity index 100% rename from frontend/projects/shared/src/components/initializing/logs-window/logs-window.component.ts rename to web/projects/shared/src/components/initializing/logs-window/logs-window.component.ts diff --git a/frontend/projects/shared/src/components/loading/loading.component.scss b/web/projects/shared/src/components/loading/loading.component.scss similarity index 100% rename from frontend/projects/shared/src/components/loading/loading.component.scss rename to web/projects/shared/src/components/loading/loading.component.scss diff --git a/frontend/projects/shared/src/components/loading/loading.component.ts b/web/projects/shared/src/components/loading/loading.component.ts similarity index 100% rename from frontend/projects/shared/src/components/loading/loading.component.ts rename to web/projects/shared/src/components/loading/loading.component.ts diff --git a/frontend/projects/shared/src/components/loading/loading.module.ts b/web/projects/shared/src/components/loading/loading.module.ts similarity index 100% rename from frontend/projects/shared/src/components/loading/loading.module.ts rename to web/projects/shared/src/components/loading/loading.module.ts diff --git a/frontend/projects/shared/src/components/loading/loading.service.ts b/web/projects/shared/src/components/loading/loading.service.ts similarity index 100% rename from frontend/projects/shared/src/components/loading/loading.service.ts rename to web/projects/shared/src/components/loading/loading.service.ts diff --git a/frontend/projects/shared/src/components/markdown/markdown.component.html b/web/projects/shared/src/components/markdown/markdown.component.html similarity index 100% rename from frontend/projects/shared/src/components/markdown/markdown.component.html rename to web/projects/shared/src/components/markdown/markdown.component.html diff --git a/frontend/projects/shared/src/components/markdown/markdown.component.module.ts b/web/projects/shared/src/components/markdown/markdown.component.module.ts similarity index 100% rename from frontend/projects/shared/src/components/markdown/markdown.component.module.ts rename to web/projects/shared/src/components/markdown/markdown.component.module.ts diff --git a/frontend/projects/shared/src/components/markdown/markdown.component.scss b/web/projects/shared/src/components/markdown/markdown.component.scss similarity index 100% rename from frontend/projects/shared/src/components/markdown/markdown.component.scss rename to web/projects/shared/src/components/markdown/markdown.component.scss diff --git a/frontend/projects/shared/src/components/markdown/markdown.component.ts b/web/projects/shared/src/components/markdown/markdown.component.ts similarity index 100% rename from frontend/projects/shared/src/components/markdown/markdown.component.ts rename to web/projects/shared/src/components/markdown/markdown.component.ts diff --git a/frontend/projects/shared/src/components/text-spinner/text-spinner.component.html b/web/projects/shared/src/components/text-spinner/text-spinner.component.html similarity index 100% rename from frontend/projects/shared/src/components/text-spinner/text-spinner.component.html rename to web/projects/shared/src/components/text-spinner/text-spinner.component.html diff --git a/frontend/projects/shared/src/components/text-spinner/text-spinner.component.module.ts b/web/projects/shared/src/components/text-spinner/text-spinner.component.module.ts similarity index 100% rename from frontend/projects/shared/src/components/text-spinner/text-spinner.component.module.ts rename to web/projects/shared/src/components/text-spinner/text-spinner.component.module.ts diff --git a/frontend/projects/shared/src/components/text-spinner/text-spinner.component.scss b/web/projects/shared/src/components/text-spinner/text-spinner.component.scss similarity index 100% rename from frontend/projects/shared/src/components/text-spinner/text-spinner.component.scss rename to web/projects/shared/src/components/text-spinner/text-spinner.component.scss diff --git a/frontend/projects/shared/src/components/text-spinner/text-spinner.component.ts b/web/projects/shared/src/components/text-spinner/text-spinner.component.ts similarity index 100% rename from frontend/projects/shared/src/components/text-spinner/text-spinner.component.ts rename to web/projects/shared/src/components/text-spinner/text-spinner.component.ts diff --git a/frontend/projects/shared/src/components/ticker/ticker.component.scss b/web/projects/shared/src/components/ticker/ticker.component.scss similarity index 100% rename from frontend/projects/shared/src/components/ticker/ticker.component.scss rename to web/projects/shared/src/components/ticker/ticker.component.scss diff --git a/frontend/projects/shared/src/components/ticker/ticker.component.ts b/web/projects/shared/src/components/ticker/ticker.component.ts similarity index 100% rename from frontend/projects/shared/src/components/ticker/ticker.component.ts rename to web/projects/shared/src/components/ticker/ticker.component.ts diff --git a/frontend/projects/shared/src/components/ticker/ticker.module.ts b/web/projects/shared/src/components/ticker/ticker.module.ts similarity index 100% rename from frontend/projects/shared/src/components/ticker/ticker.module.ts rename to web/projects/shared/src/components/ticker/ticker.module.ts diff --git a/frontend/projects/shared/src/directives/drag-scroller.directive.ts b/web/projects/shared/src/directives/drag-scroller.directive.ts similarity index 100% rename from frontend/projects/shared/src/directives/drag-scroller.directive.ts rename to web/projects/shared/src/directives/drag-scroller.directive.ts diff --git a/frontend/projects/shared/src/directives/enter/enter.directive.ts b/web/projects/shared/src/directives/enter/enter.directive.ts similarity index 100% rename from frontend/projects/shared/src/directives/enter/enter.directive.ts rename to web/projects/shared/src/directives/enter/enter.directive.ts diff --git a/frontend/projects/shared/src/directives/enter/enter.module.ts b/web/projects/shared/src/directives/enter/enter.module.ts similarity index 100% rename from frontend/projects/shared/src/directives/enter/enter.module.ts rename to web/projects/shared/src/directives/enter/enter.module.ts diff --git a/frontend/projects/shared/src/directives/responsive-col.directive.ts b/web/projects/shared/src/directives/responsive-col.directive.ts similarity index 100% rename from frontend/projects/shared/src/directives/responsive-col.directive.ts rename to web/projects/shared/src/directives/responsive-col.directive.ts diff --git a/frontend/projects/shared/src/directives/safe-links.directive.ts b/web/projects/shared/src/directives/safe-links.directive.ts similarity index 100% rename from frontend/projects/shared/src/directives/safe-links.directive.ts rename to web/projects/shared/src/directives/safe-links.directive.ts diff --git a/frontend/projects/shared/src/mocks/get-setup-status.ts b/web/projects/shared/src/mocks/get-setup-status.ts similarity index 100% rename from frontend/projects/shared/src/mocks/get-setup-status.ts rename to web/projects/shared/src/mocks/get-setup-status.ts diff --git a/frontend/projects/shared/src/pipes/emver/emver.module.ts b/web/projects/shared/src/pipes/emver/emver.module.ts similarity index 100% rename from frontend/projects/shared/src/pipes/emver/emver.module.ts rename to web/projects/shared/src/pipes/emver/emver.module.ts diff --git a/frontend/projects/shared/src/pipes/emver/emver.pipe.ts b/web/projects/shared/src/pipes/emver/emver.pipe.ts similarity index 100% rename from frontend/projects/shared/src/pipes/emver/emver.pipe.ts rename to web/projects/shared/src/pipes/emver/emver.pipe.ts diff --git a/frontend/projects/shared/src/pipes/guid/guid.module.ts b/web/projects/shared/src/pipes/guid/guid.module.ts similarity index 100% rename from frontend/projects/shared/src/pipes/guid/guid.module.ts rename to web/projects/shared/src/pipes/guid/guid.module.ts diff --git a/frontend/projects/shared/src/pipes/guid/guid.pipe.ts b/web/projects/shared/src/pipes/guid/guid.pipe.ts similarity index 100% rename from frontend/projects/shared/src/pipes/guid/guid.pipe.ts rename to web/projects/shared/src/pipes/guid/guid.pipe.ts diff --git a/frontend/projects/shared/src/pipes/markdown/markdown.module.ts b/web/projects/shared/src/pipes/markdown/markdown.module.ts similarity index 100% rename from frontend/projects/shared/src/pipes/markdown/markdown.module.ts rename to web/projects/shared/src/pipes/markdown/markdown.module.ts diff --git a/frontend/projects/shared/src/pipes/markdown/markdown.pipe.ts b/web/projects/shared/src/pipes/markdown/markdown.pipe.ts similarity index 100% rename from frontend/projects/shared/src/pipes/markdown/markdown.pipe.ts rename to web/projects/shared/src/pipes/markdown/markdown.pipe.ts diff --git a/frontend/projects/shared/src/pipes/shared/empty.pipe.ts b/web/projects/shared/src/pipes/shared/empty.pipe.ts similarity index 100% rename from frontend/projects/shared/src/pipes/shared/empty.pipe.ts rename to web/projects/shared/src/pipes/shared/empty.pipe.ts diff --git a/frontend/projects/shared/src/pipes/shared/includes.pipe.ts b/web/projects/shared/src/pipes/shared/includes.pipe.ts similarity index 100% rename from frontend/projects/shared/src/pipes/shared/includes.pipe.ts rename to web/projects/shared/src/pipes/shared/includes.pipe.ts diff --git a/frontend/projects/shared/src/pipes/shared/shared.module.ts b/web/projects/shared/src/pipes/shared/shared.module.ts similarity index 100% rename from frontend/projects/shared/src/pipes/shared/shared.module.ts rename to web/projects/shared/src/pipes/shared/shared.module.ts diff --git a/frontend/projects/shared/src/pipes/shared/trust.pipe.ts b/web/projects/shared/src/pipes/shared/trust.pipe.ts similarity index 100% rename from frontend/projects/shared/src/pipes/shared/trust.pipe.ts rename to web/projects/shared/src/pipes/shared/trust.pipe.ts diff --git a/frontend/projects/shared/src/pipes/unit-conversion/unit-conversion.module.ts b/web/projects/shared/src/pipes/unit-conversion/unit-conversion.module.ts similarity index 100% rename from frontend/projects/shared/src/pipes/unit-conversion/unit-conversion.module.ts rename to web/projects/shared/src/pipes/unit-conversion/unit-conversion.module.ts diff --git a/frontend/projects/shared/src/pipes/unit-conversion/unit-conversion.pipe.ts b/web/projects/shared/src/pipes/unit-conversion/unit-conversion.pipe.ts similarity index 100% rename from frontend/projects/shared/src/pipes/unit-conversion/unit-conversion.pipe.ts rename to web/projects/shared/src/pipes/unit-conversion/unit-conversion.pipe.ts diff --git a/frontend/projects/shared/src/public-api.ts b/web/projects/shared/src/public-api.ts similarity index 100% rename from frontend/projects/shared/src/public-api.ts rename to web/projects/shared/src/public-api.ts diff --git a/frontend/projects/shared/src/services/copy.service.ts b/web/projects/shared/src/services/copy.service.ts similarity index 100% rename from frontend/projects/shared/src/services/copy.service.ts rename to web/projects/shared/src/services/copy.service.ts diff --git a/frontend/projects/shared/src/services/download-html.service.ts b/web/projects/shared/src/services/download-html.service.ts similarity index 100% rename from frontend/projects/shared/src/services/download-html.service.ts rename to web/projects/shared/src/services/download-html.service.ts diff --git a/frontend/projects/shared/src/services/emver.service.ts b/web/projects/shared/src/services/emver.service.ts similarity index 100% rename from frontend/projects/shared/src/services/emver.service.ts rename to web/projects/shared/src/services/emver.service.ts diff --git a/frontend/projects/shared/src/services/error.service.ts b/web/projects/shared/src/services/error.service.ts similarity index 100% rename from frontend/projects/shared/src/services/error.service.ts rename to web/projects/shared/src/services/error.service.ts diff --git a/frontend/projects/shared/src/services/http.service.ts b/web/projects/shared/src/services/http.service.ts similarity index 100% rename from frontend/projects/shared/src/services/http.service.ts rename to web/projects/shared/src/services/http.service.ts diff --git a/frontend/projects/shared/src/services/setup-logs.service.ts b/web/projects/shared/src/services/setup-logs.service.ts similarity index 100% rename from frontend/projects/shared/src/services/setup-logs.service.ts rename to web/projects/shared/src/services/setup-logs.service.ts diff --git a/frontend/projects/shared/src/services/setup.service.ts b/web/projects/shared/src/services/setup.service.ts similarity index 100% rename from frontend/projects/shared/src/services/setup.service.ts rename to web/projects/shared/src/services/setup.service.ts diff --git a/frontend/projects/shared/src/themes/dark-theme/dark-theme.component.scss b/web/projects/shared/src/themes/dark-theme/dark-theme.component.scss similarity index 100% rename from frontend/projects/shared/src/themes/dark-theme/dark-theme.component.scss rename to web/projects/shared/src/themes/dark-theme/dark-theme.component.scss diff --git a/frontend/projects/shared/src/themes/dark-theme/dark-theme.component.ts b/web/projects/shared/src/themes/dark-theme/dark-theme.component.ts similarity index 100% rename from frontend/projects/shared/src/themes/dark-theme/dark-theme.component.ts rename to web/projects/shared/src/themes/dark-theme/dark-theme.component.ts diff --git a/frontend/projects/shared/src/themes/dark-theme/dark-theme.module.ts b/web/projects/shared/src/themes/dark-theme/dark-theme.module.ts similarity index 100% rename from frontend/projects/shared/src/themes/dark-theme/dark-theme.module.ts rename to web/projects/shared/src/themes/dark-theme/dark-theme.module.ts diff --git a/frontend/projects/shared/src/themes/light-theme/light-theme.component.scss b/web/projects/shared/src/themes/light-theme/light-theme.component.scss similarity index 100% rename from frontend/projects/shared/src/themes/light-theme/light-theme.component.scss rename to web/projects/shared/src/themes/light-theme/light-theme.component.scss diff --git a/frontend/projects/shared/src/themes/light-theme/light-theme.component.ts b/web/projects/shared/src/themes/light-theme/light-theme.component.ts similarity index 100% rename from frontend/projects/shared/src/themes/light-theme/light-theme.component.ts rename to web/projects/shared/src/themes/light-theme/light-theme.component.ts diff --git a/frontend/projects/shared/src/themes/light-theme/light-theme.module.ts b/web/projects/shared/src/themes/light-theme/light-theme.module.ts similarity index 100% rename from frontend/projects/shared/src/themes/light-theme/light-theme.module.ts rename to web/projects/shared/src/themes/light-theme/light-theme.module.ts diff --git a/frontend/projects/shared/src/tokens/relative-url.ts b/web/projects/shared/src/tokens/relative-url.ts similarity index 100% rename from frontend/projects/shared/src/tokens/relative-url.ts rename to web/projects/shared/src/tokens/relative-url.ts diff --git a/frontend/projects/shared/src/tokens/theme.ts b/web/projects/shared/src/tokens/theme.ts similarity index 100% rename from frontend/projects/shared/src/tokens/theme.ts rename to web/projects/shared/src/tokens/theme.ts diff --git a/frontend/projects/shared/src/types/api.ts b/web/projects/shared/src/types/api.ts similarity index 100% rename from frontend/projects/shared/src/types/api.ts rename to web/projects/shared/src/types/api.ts diff --git a/frontend/projects/shared/src/types/constructor.ts b/web/projects/shared/src/types/constructor.ts similarity index 100% rename from frontend/projects/shared/src/types/constructor.ts rename to web/projects/shared/src/types/constructor.ts diff --git a/frontend/projects/shared/src/types/http.types.ts b/web/projects/shared/src/types/http.types.ts similarity index 100% rename from frontend/projects/shared/src/types/http.types.ts rename to web/projects/shared/src/types/http.types.ts diff --git a/frontend/projects/shared/src/types/rpc.types.ts b/web/projects/shared/src/types/rpc.types.ts similarity index 100% rename from frontend/projects/shared/src/types/rpc.types.ts rename to web/projects/shared/src/types/rpc.types.ts diff --git a/frontend/projects/shared/src/types/url.ts b/web/projects/shared/src/types/url.ts similarity index 100% rename from frontend/projects/shared/src/types/url.ts rename to web/projects/shared/src/types/url.ts diff --git a/frontend/projects/shared/src/types/workspace-config.ts b/web/projects/shared/src/types/workspace-config.ts similarity index 100% rename from frontend/projects/shared/src/types/workspace-config.ts rename to web/projects/shared/src/types/workspace-config.ts diff --git a/frontend/projects/shared/src/util/base-64.ts b/web/projects/shared/src/util/base-64.ts similarity index 100% rename from frontend/projects/shared/src/util/base-64.ts rename to web/projects/shared/src/util/base-64.ts diff --git a/frontend/projects/shared/src/util/copy-to-clipboard.ts b/web/projects/shared/src/util/copy-to-clipboard.ts similarity index 100% rename from frontend/projects/shared/src/util/copy-to-clipboard.ts rename to web/projects/shared/src/util/copy-to-clipboard.ts diff --git a/frontend/projects/shared/src/util/get-new-entries.ts b/web/projects/shared/src/util/get-new-entries.ts similarity index 100% rename from frontend/projects/shared/src/util/get-new-entries.ts rename to web/projects/shared/src/util/get-new-entries.ts diff --git a/frontend/projects/shared/src/util/get-pkg-id.ts b/web/projects/shared/src/util/get-pkg-id.ts similarity index 100% rename from frontend/projects/shared/src/util/get-pkg-id.ts rename to web/projects/shared/src/util/get-pkg-id.ts diff --git a/frontend/projects/shared/src/util/invert.ts b/web/projects/shared/src/util/invert.ts similarity index 100% rename from frontend/projects/shared/src/util/invert.ts rename to web/projects/shared/src/util/invert.ts diff --git a/frontend/projects/shared/src/util/misc.util.ts b/web/projects/shared/src/util/misc.util.ts similarity index 100% rename from frontend/projects/shared/src/util/misc.util.ts rename to web/projects/shared/src/util/misc.util.ts diff --git a/frontend/projects/shared/src/util/rpc.util.ts b/web/projects/shared/src/util/rpc.util.ts similarity index 100% rename from frontend/projects/shared/src/util/rpc.util.ts rename to web/projects/shared/src/util/rpc.util.ts diff --git a/frontend/projects/shared/src/util/to-local-iso-string.ts b/web/projects/shared/src/util/to-local-iso-string.ts similarity index 100% rename from frontend/projects/shared/src/util/to-local-iso-string.ts rename to web/projects/shared/src/util/to-local-iso-string.ts diff --git a/frontend/projects/shared/src/util/unused.ts b/web/projects/shared/src/util/unused.ts similarity index 100% rename from frontend/projects/shared/src/util/unused.ts rename to web/projects/shared/src/util/unused.ts diff --git a/frontend/projects/shared/styles/global.scss b/web/projects/shared/styles/global.scss similarity index 100% rename from frontend/projects/shared/styles/global.scss rename to web/projects/shared/styles/global.scss diff --git a/frontend/projects/shared/styles/shared.scss b/web/projects/shared/styles/shared.scss similarity index 100% rename from frontend/projects/shared/styles/shared.scss rename to web/projects/shared/styles/shared.scss diff --git a/frontend/projects/shared/styles/taiga.scss b/web/projects/shared/styles/taiga.scss similarity index 100% rename from frontend/projects/shared/styles/taiga.scss rename to web/projects/shared/styles/taiga.scss diff --git a/frontend/projects/shared/styles/variables.scss b/web/projects/shared/styles/variables.scss similarity index 100% rename from frontend/projects/shared/styles/variables.scss rename to web/projects/shared/styles/variables.scss diff --git a/frontend/projects/shared/tsconfig.json b/web/projects/shared/tsconfig.json similarity index 100% rename from frontend/projects/shared/tsconfig.json rename to web/projects/shared/tsconfig.json diff --git a/frontend/projects/ui/ngsw-config.json b/web/projects/ui/ngsw-config.json similarity index 100% rename from frontend/projects/ui/ngsw-config.json rename to web/projects/ui/ngsw-config.json diff --git a/frontend/projects/ui/src/app/app.component.html b/web/projects/ui/src/app/app.component.html similarity index 100% rename from frontend/projects/ui/src/app/app.component.html rename to web/projects/ui/src/app/app.component.html diff --git a/frontend/projects/ui/src/app/app.component.scss b/web/projects/ui/src/app/app.component.scss similarity index 100% rename from frontend/projects/ui/src/app/app.component.scss rename to web/projects/ui/src/app/app.component.scss diff --git a/frontend/projects/ui/src/app/app.component.ts b/web/projects/ui/src/app/app.component.ts similarity index 100% rename from frontend/projects/ui/src/app/app.component.ts rename to web/projects/ui/src/app/app.component.ts diff --git a/frontend/projects/ui/src/app/app.module.ts b/web/projects/ui/src/app/app.module.ts similarity index 100% rename from frontend/projects/ui/src/app/app.module.ts rename to web/projects/ui/src/app/app.module.ts diff --git a/frontend/projects/ui/src/app/app.providers.ts b/web/projects/ui/src/app/app.providers.ts similarity index 100% rename from frontend/projects/ui/src/app/app.providers.ts rename to web/projects/ui/src/app/app.providers.ts diff --git a/frontend/projects/ui/src/app/app/connection-bar/connection-bar.component.html b/web/projects/ui/src/app/app/connection-bar/connection-bar.component.html similarity index 100% rename from frontend/projects/ui/src/app/app/connection-bar/connection-bar.component.html rename to web/projects/ui/src/app/app/connection-bar/connection-bar.component.html diff --git a/frontend/projects/ui/src/app/app/connection-bar/connection-bar.component.module.ts b/web/projects/ui/src/app/app/connection-bar/connection-bar.component.module.ts similarity index 100% rename from frontend/projects/ui/src/app/app/connection-bar/connection-bar.component.module.ts rename to web/projects/ui/src/app/app/connection-bar/connection-bar.component.module.ts diff --git a/frontend/projects/ui/src/app/app/connection-bar/connection-bar.component.scss b/web/projects/ui/src/app/app/connection-bar/connection-bar.component.scss similarity index 100% rename from frontend/projects/ui/src/app/app/connection-bar/connection-bar.component.scss rename to web/projects/ui/src/app/app/connection-bar/connection-bar.component.scss diff --git a/frontend/projects/ui/src/app/app/connection-bar/connection-bar.component.ts b/web/projects/ui/src/app/app/connection-bar/connection-bar.component.ts similarity index 100% rename from frontend/projects/ui/src/app/app/connection-bar/connection-bar.component.ts rename to web/projects/ui/src/app/app/connection-bar/connection-bar.component.ts diff --git a/frontend/projects/ui/src/app/app/footer/footer.component.html b/web/projects/ui/src/app/app/footer/footer.component.html similarity index 100% rename from frontend/projects/ui/src/app/app/footer/footer.component.html rename to web/projects/ui/src/app/app/footer/footer.component.html diff --git a/frontend/projects/ui/src/app/app/footer/footer.component.scss b/web/projects/ui/src/app/app/footer/footer.component.scss similarity index 100% rename from frontend/projects/ui/src/app/app/footer/footer.component.scss rename to web/projects/ui/src/app/app/footer/footer.component.scss diff --git a/frontend/projects/ui/src/app/app/footer/footer.component.ts b/web/projects/ui/src/app/app/footer/footer.component.ts similarity index 100% rename from frontend/projects/ui/src/app/app/footer/footer.component.ts rename to web/projects/ui/src/app/app/footer/footer.component.ts diff --git a/frontend/projects/ui/src/app/app/footer/footer.module.ts b/web/projects/ui/src/app/app/footer/footer.module.ts similarity index 100% rename from frontend/projects/ui/src/app/app/footer/footer.module.ts rename to web/projects/ui/src/app/app/footer/footer.module.ts diff --git a/frontend/projects/ui/src/app/app/menu/menu.component.html b/web/projects/ui/src/app/app/menu/menu.component.html similarity index 100% rename from frontend/projects/ui/src/app/app/menu/menu.component.html rename to web/projects/ui/src/app/app/menu/menu.component.html diff --git a/frontend/projects/ui/src/app/app/menu/menu.component.scss b/web/projects/ui/src/app/app/menu/menu.component.scss similarity index 100% rename from frontend/projects/ui/src/app/app/menu/menu.component.scss rename to web/projects/ui/src/app/app/menu/menu.component.scss diff --git a/frontend/projects/ui/src/app/app/menu/menu.component.ts b/web/projects/ui/src/app/app/menu/menu.component.ts similarity index 100% rename from frontend/projects/ui/src/app/app/menu/menu.component.ts rename to web/projects/ui/src/app/app/menu/menu.component.ts diff --git a/frontend/projects/ui/src/app/app/menu/menu.module.ts b/web/projects/ui/src/app/app/menu/menu.module.ts similarity index 100% rename from frontend/projects/ui/src/app/app/menu/menu.module.ts rename to web/projects/ui/src/app/app/menu/menu.module.ts diff --git a/frontend/projects/ui/src/app/app/preloader/preloader.component.html b/web/projects/ui/src/app/app/preloader/preloader.component.html similarity index 100% rename from frontend/projects/ui/src/app/app/preloader/preloader.component.html rename to web/projects/ui/src/app/app/preloader/preloader.component.html diff --git a/frontend/projects/ui/src/app/app/preloader/preloader.component.ts b/web/projects/ui/src/app/app/preloader/preloader.component.ts similarity index 100% rename from frontend/projects/ui/src/app/app/preloader/preloader.component.ts rename to web/projects/ui/src/app/app/preloader/preloader.component.ts diff --git a/frontend/projects/ui/src/app/app/preloader/preloader.module.ts b/web/projects/ui/src/app/app/preloader/preloader.module.ts similarity index 100% rename from frontend/projects/ui/src/app/app/preloader/preloader.module.ts rename to web/projects/ui/src/app/app/preloader/preloader.module.ts diff --git a/frontend/projects/ui/src/app/app/snek/snake.page.html b/web/projects/ui/src/app/app/snek/snake.page.html similarity index 100% rename from frontend/projects/ui/src/app/app/snek/snake.page.html rename to web/projects/ui/src/app/app/snek/snake.page.html diff --git a/frontend/projects/ui/src/app/app/snek/snake.page.scss b/web/projects/ui/src/app/app/snek/snake.page.scss similarity index 100% rename from frontend/projects/ui/src/app/app/snek/snake.page.scss rename to web/projects/ui/src/app/app/snek/snake.page.scss diff --git a/frontend/projects/ui/src/app/app/snek/snake.page.ts b/web/projects/ui/src/app/app/snek/snake.page.ts similarity index 100% rename from frontend/projects/ui/src/app/app/snek/snake.page.ts rename to web/projects/ui/src/app/app/snek/snake.page.ts diff --git a/frontend/projects/ui/src/app/app/snek/snek.directive.ts b/web/projects/ui/src/app/app/snek/snek.directive.ts similarity index 100% rename from frontend/projects/ui/src/app/app/snek/snek.directive.ts rename to web/projects/ui/src/app/app/snek/snek.directive.ts diff --git a/frontend/projects/ui/src/app/app/snek/snek.module.ts b/web/projects/ui/src/app/app/snek/snek.module.ts similarity index 100% rename from frontend/projects/ui/src/app/app/snek/snek.module.ts rename to web/projects/ui/src/app/app/snek/snek.module.ts diff --git a/frontend/projects/ui/src/app/apps/diagnostic/diagnostic.module.ts b/web/projects/ui/src/app/apps/diagnostic/diagnostic.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/diagnostic/diagnostic.module.ts rename to web/projects/ui/src/app/apps/diagnostic/diagnostic.module.ts diff --git a/frontend/projects/ui/src/app/apps/diagnostic/home/home.module.ts b/web/projects/ui/src/app/apps/diagnostic/home/home.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/diagnostic/home/home.module.ts rename to web/projects/ui/src/app/apps/diagnostic/home/home.module.ts diff --git a/frontend/projects/ui/src/app/apps/diagnostic/home/home.page.html b/web/projects/ui/src/app/apps/diagnostic/home/home.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/diagnostic/home/home.page.html rename to web/projects/ui/src/app/apps/diagnostic/home/home.page.html diff --git a/frontend/projects/ui/src/app/apps/diagnostic/home/home.page.scss b/web/projects/ui/src/app/apps/diagnostic/home/home.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/diagnostic/home/home.page.scss rename to web/projects/ui/src/app/apps/diagnostic/home/home.page.scss diff --git a/frontend/projects/ui/src/app/apps/diagnostic/home/home.page.ts b/web/projects/ui/src/app/apps/diagnostic/home/home.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/diagnostic/home/home.page.ts rename to web/projects/ui/src/app/apps/diagnostic/home/home.page.ts diff --git a/frontend/projects/ui/src/app/apps/diagnostic/logs/logs.module.ts b/web/projects/ui/src/app/apps/diagnostic/logs/logs.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/diagnostic/logs/logs.module.ts rename to web/projects/ui/src/app/apps/diagnostic/logs/logs.module.ts diff --git a/frontend/projects/ui/src/app/apps/diagnostic/logs/logs.page.html b/web/projects/ui/src/app/apps/diagnostic/logs/logs.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/diagnostic/logs/logs.page.html rename to web/projects/ui/src/app/apps/diagnostic/logs/logs.page.html diff --git a/frontend/projects/ui/src/app/apps/diagnostic/logs/logs.page.ts b/web/projects/ui/src/app/apps/diagnostic/logs/logs.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/diagnostic/logs/logs.page.ts rename to web/projects/ui/src/app/apps/diagnostic/logs/logs.page.ts diff --git a/frontend/projects/ui/src/app/apps/diagnostic/services/diagnostic.service.ts b/web/projects/ui/src/app/apps/diagnostic/services/diagnostic.service.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/diagnostic/services/diagnostic.service.ts rename to web/projects/ui/src/app/apps/diagnostic/services/diagnostic.service.ts diff --git a/frontend/projects/ui/src/app/apps/diagnostic/services/live-diagnostic.service.ts b/web/projects/ui/src/app/apps/diagnostic/services/live-diagnostic.service.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/diagnostic/services/live-diagnostic.service.ts rename to web/projects/ui/src/app/apps/diagnostic/services/live-diagnostic.service.ts diff --git a/frontend/projects/ui/src/app/apps/diagnostic/services/mock-diagnostic.service.ts b/web/projects/ui/src/app/apps/diagnostic/services/mock-diagnostic.service.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/diagnostic/services/mock-diagnostic.service.ts rename to web/projects/ui/src/app/apps/diagnostic/services/mock-diagnostic.service.ts diff --git a/frontend/projects/ui/src/app/apps/loading/loading.module.ts b/web/projects/ui/src/app/apps/loading/loading.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/loading/loading.module.ts rename to web/projects/ui/src/app/apps/loading/loading.module.ts diff --git a/frontend/projects/ui/src/app/apps/loading/loading.page.html b/web/projects/ui/src/app/apps/loading/loading.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/loading/loading.page.html rename to web/projects/ui/src/app/apps/loading/loading.page.html diff --git a/frontend/projects/ui/src/app/apps/loading/loading.page.ts b/web/projects/ui/src/app/apps/loading/loading.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/loading/loading.page.ts rename to web/projects/ui/src/app/apps/loading/loading.page.ts diff --git a/frontend/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.html b/web/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.html rename to web/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.html diff --git a/frontend/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.scss b/web/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.scss rename to web/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.scss diff --git a/frontend/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.ts b/web/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.ts rename to web/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.ts diff --git a/frontend/projects/ui/src/app/apps/login/login.module.ts b/web/projects/ui/src/app/apps/login/login.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/login/login.module.ts rename to web/projects/ui/src/app/apps/login/login.module.ts diff --git a/frontend/projects/ui/src/app/apps/login/login.page.html b/web/projects/ui/src/app/apps/login/login.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/login/login.page.html rename to web/projects/ui/src/app/apps/login/login.page.html diff --git a/frontend/projects/ui/src/app/apps/login/login.page.scss b/web/projects/ui/src/app/apps/login/login.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/login/login.page.scss rename to web/projects/ui/src/app/apps/login/login.page.scss diff --git a/frontend/projects/ui/src/app/apps/login/login.page.ts b/web/projects/ui/src/app/apps/login/login.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/login/login.page.ts rename to web/projects/ui/src/app/apps/login/login.page.ts diff --git a/frontend/projects/ui/src/app/apps/portal/components/actions/actions.component.html b/web/projects/ui/src/app/apps/portal/components/actions/actions.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/components/actions/actions.component.html rename to web/projects/ui/src/app/apps/portal/components/actions/actions.component.html diff --git a/frontend/projects/ui/src/app/apps/portal/components/actions/actions.component.scss b/web/projects/ui/src/app/apps/portal/components/actions/actions.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/components/actions/actions.component.scss rename to web/projects/ui/src/app/apps/portal/components/actions/actions.component.scss diff --git a/frontend/projects/ui/src/app/apps/portal/components/actions/actions.component.ts b/web/projects/ui/src/app/apps/portal/components/actions/actions.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/components/actions/actions.component.ts rename to web/projects/ui/src/app/apps/portal/components/actions/actions.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.html b/web/projects/ui/src/app/apps/portal/components/card/card.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/components/card/card.component.html rename to web/projects/ui/src/app/apps/portal/components/card/card.component.html diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.scss b/web/projects/ui/src/app/apps/portal/components/card/card.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/components/card/card.component.scss rename to web/projects/ui/src/app/apps/portal/components/card/card.component.scss diff --git a/frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts b/web/projects/ui/src/app/apps/portal/components/card/card.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/components/card/card.component.ts rename to web/projects/ui/src/app/apps/portal/components/card/card.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer-item.directive.ts b/web/projects/ui/src/app/apps/portal/components/drawer/drawer-item.directive.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/components/drawer/drawer-item.directive.ts rename to web/projects/ui/src/app/apps/portal/components/drawer/drawer-item.directive.ts diff --git a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html b/web/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html rename to web/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html diff --git a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.scss b/web/projects/ui/src/app/apps/portal/components/drawer/drawer.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.scss rename to web/projects/ui/src/app/apps/portal/components/drawer/drawer.component.scss diff --git a/frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts b/web/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts rename to web/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.html b/web/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.html rename to web/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.html diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.scss b/web/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.scss rename to web/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.scss diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts b/web/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts rename to web/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header.component.html b/web/projects/ui/src/app/apps/portal/components/header/header.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/components/header/header.component.html rename to web/projects/ui/src/app/apps/portal/components/header/header.component.html diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header.component.scss b/web/projects/ui/src/app/apps/portal/components/header/header.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/components/header/header.component.scss rename to web/projects/ui/src/app/apps/portal/components/header/header.component.scss diff --git a/frontend/projects/ui/src/app/apps/portal/components/header/header.component.ts b/web/projects/ui/src/app/apps/portal/components/header/header.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/components/header/header.component.ts rename to web/projects/ui/src/app/apps/portal/components/header/header.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html b/web/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html rename to web/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html diff --git a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.scss b/web/projects/ui/src/app/apps/portal/components/navigation/navigation.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.scss rename to web/projects/ui/src/app/apps/portal/components/navigation/navigation.component.scss diff --git a/frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.ts b/web/projects/ui/src/app/apps/portal/components/navigation/navigation.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/components/navigation/navigation.component.ts rename to web/projects/ui/src/app/apps/portal/components/navigation/navigation.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/components/skeleton-list.component.ts b/web/projects/ui/src/app/apps/portal/components/skeleton-list.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/components/skeleton-list.component.ts rename to web/projects/ui/src/app/apps/portal/components/skeleton-list.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/constants/system-utilities.ts b/web/projects/ui/src/app/apps/portal/constants/system-utilities.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/constants/system-utilities.ts rename to web/projects/ui/src/app/apps/portal/constants/system-utilities.ts diff --git a/frontend/projects/ui/src/app/apps/portal/pipes/to-navigation-item.ts b/web/projects/ui/src/app/apps/portal/pipes/to-navigation-item.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/pipes/to-navigation-item.ts rename to web/projects/ui/src/app/apps/portal/pipes/to-navigation-item.ts diff --git a/frontend/projects/ui/src/app/apps/portal/pipes/to-notifications.ts b/web/projects/ui/src/app/apps/portal/pipes/to-notifications.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/pipes/to-notifications.ts rename to web/projects/ui/src/app/apps/portal/pipes/to-notifications.ts diff --git a/frontend/projects/ui/src/app/apps/portal/portal.component.html b/web/projects/ui/src/app/apps/portal/portal.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/portal.component.html rename to web/projects/ui/src/app/apps/portal/portal.component.html diff --git a/frontend/projects/ui/src/app/apps/portal/portal.component.scss b/web/projects/ui/src/app/apps/portal/portal.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/portal.component.scss rename to web/projects/ui/src/app/apps/portal/portal.component.scss diff --git a/frontend/projects/ui/src/app/apps/portal/portal.component.ts b/web/projects/ui/src/app/apps/portal/portal.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/portal.component.ts rename to web/projects/ui/src/app/apps/portal/portal.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/portal.module.ts b/web/projects/ui/src/app/apps/portal/portal.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/portal.module.ts rename to web/projects/ui/src/app/apps/portal/portal.module.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/dektop-loading.service.ts b/web/projects/ui/src/app/apps/portal/routes/desktop/dektop-loading.service.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/desktop/dektop-loading.service.ts rename to web/projects/ui/src/app/apps/portal/routes/desktop/dektop-loading.service.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop-item.directive.ts b/web/projects/ui/src/app/apps/portal/routes/desktop/desktop-item.directive.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop-item.directive.ts rename to web/projects/ui/src/app/apps/portal/routes/desktop/desktop-item.directive.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html b/web/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html rename to web/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.scss b/web/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.scss rename to web/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.scss diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts b/web/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts rename to web/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts b/web/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts rename to web/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/action-success.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/components/action-success.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/components/action-success.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/components/action-success.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/action.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/components/action.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/components/action.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/components/action.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/actions.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/components/actions.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/components/actions.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/components/actions.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/additional-item.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/components/additional-item.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/components/additional-item.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/components/additional-item.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/additional.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/components/additional.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/components/additional.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/components/additional.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/config-dep.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/components/config-dep.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/components/config-dep.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/components/config-dep.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/credential.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/components/credential.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/components/credential.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/components/credential.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/dependencies.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/components/dependencies.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/components/dependencies.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/components/dependencies.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/dependency.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/components/dependency.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/components/dependency.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/components/dependency.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/health-check.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/components/health-check.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/components/health-check.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/components/health-check.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/health-checks.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/components/health-checks.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/components/health-checks.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/components/health-checks.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/interface.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/components/interface.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/components/interface.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/components/interface.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/interfaces.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/components/interfaces.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/components/interfaces.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/components/interfaces.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/menu-item.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/components/menu-item.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/components/menu-item.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/components/menu-item.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/menu.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/components/menu.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/components/menu.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/components/menu.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/progress.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/components/progress.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/components/progress.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/components/progress.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/modals/config.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/modals/config.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/modals/config.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/modals/config.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/modals/credentials.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/modals/credentials.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/modals/credentials.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/modals/credentials.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/group-actions.pipe.ts b/web/projects/ui/src/app/apps/portal/routes/service/pipes/group-actions.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/pipes/group-actions.pipe.ts rename to web/projects/ui/src/app/apps/portal/routes/service/pipes/group-actions.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/interface-info.pipe.ts b/web/projects/ui/src/app/apps/portal/routes/service/pipes/interface-info.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/pipes/interface-info.pipe.ts rename to web/projects/ui/src/app/apps/portal/routes/service/pipes/interface-info.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/progress-data.pipe.ts b/web/projects/ui/src/app/apps/portal/routes/service/pipes/progress-data.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/pipes/progress-data.pipe.ts rename to web/projects/ui/src/app/apps/portal/routes/service/pipes/progress-data.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-additional.pipe.ts b/web/projects/ui/src/app/apps/portal/routes/service/pipes/to-additional.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-additional.pipe.ts rename to web/projects/ui/src/app/apps/portal/routes/service/pipes/to-additional.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-menu.pipe.ts b/web/projects/ui/src/app/apps/portal/routes/service/pipes/to-menu.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/pipes/to-menu.pipe.ts rename to web/projects/ui/src/app/apps/portal/routes/service/pipes/to-menu.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/routes/actions.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/routes/actions.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/routes/actions.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/routes/actions.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/routes/interface.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/routes/interface.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/routes/interface.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/routes/interface.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/routes/logs.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/routes/logs.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/routes/logs.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/routes/logs.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/routes/outlet.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/routes/outlet.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/routes/outlet.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/routes/outlet.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/routes/service.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/routes/service.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/routes/service.component.ts rename to web/projects/ui/src/app/apps/portal/routes/service/routes/service.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/service.module.ts b/web/projects/ui/src/app/apps/portal/routes/service/service.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/service.module.ts rename to web/projects/ui/src/app/apps/portal/routes/service/service.module.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/types/dependency-info.ts b/web/projects/ui/src/app/apps/portal/routes/service/types/dependency-info.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/types/dependency-info.ts rename to web/projects/ui/src/app/apps/portal/routes/service/types/dependency-info.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/types/package-config-data.ts b/web/projects/ui/src/app/apps/portal/routes/service/types/package-config-data.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/types/package-config-data.ts rename to web/projects/ui/src/app/apps/portal/routes/service/types/package-config-data.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/service/utils/update-tab.ts b/web/projects/ui/src/app/apps/portal/routes/service/utils/update-tab.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/service/utils/update-tab.ts rename to web/projects/ui/src/app/apps/portal/routes/service/utils/update-tab.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/backups.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/backups.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/backups.component.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/backups.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/physical.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/components/physical.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/physical.component.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/components/physical.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/status.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/components/status.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/status.component.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/components/status.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/targets.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/components/targets.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/targets.component.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/components/targets.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/upcoming.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/components/upcoming.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/components/upcoming.component.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/components/upcoming.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/backup.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/modals/backup.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/backup.component.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/modals/backup.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/edit.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/modals/edit.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/edit.component.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/modals/edit.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/history.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/modals/history.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/history.component.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/modals/history.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/jobs.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/modals/jobs.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/jobs.component.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/modals/jobs.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/recover.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/modals/recover.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/recover.component.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/modals/recover.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/report.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/modals/report.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/report.component.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/modals/report.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/target.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/modals/target.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/target.component.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/modals/target.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/duration.pipe.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/pipes/duration.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/duration.pipe.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/pipes/duration.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/get-backup-icon.pipe.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/pipes/get-backup-icon.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/get-backup-icon.pipe.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/pipes/get-backup-icon.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/get-display-info.pipe.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/pipes/get-display-info.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/get-display-info.pipe.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/pipes/get-display-info.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/has-error.pipe.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/pipes/has-error.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/has-error.pipe.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/pipes/has-error.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/to-human-cron.pipe.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/pipes/to-human-cron.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/to-human-cron.pipe.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/pipes/to-human-cron.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/to-options.pipe.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/pipes/to-options.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/pipes/to-options.pipe.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/pipes/to-options.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/services/create.service.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/services/create.service.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/services/create.service.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/services/create.service.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/services/restore.service.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/services/restore.service.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/services/restore.service.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/services/restore.service.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/backup-config.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/types/backup-config.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/backup-config.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/types/backup-config.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/backup-type.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/types/backup-type.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/backup-type.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/types/backup-type.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/display-info.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/types/display-info.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/display-info.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/types/display-info.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/recover-data.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/types/recover-data.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/recover-data.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/types/recover-data.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/recover-option.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/types/recover-option.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/types/recover-option.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/types/recover-option.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/backups/utils/job-builder.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/utils/job-builder.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/backups/utils/job-builder.ts rename to web/projects/ui/src/app/apps/portal/routes/system/backups/utils/job-builder.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/dependencies.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/sideload/dependencies.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/sideload/dependencies.component.ts rename to web/projects/ui/src/app/apps/portal/routes/system/sideload/dependencies.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts rename to web/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.component.ts rename to web/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.utils.ts b/web/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.utils.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.utils.ts rename to web/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.utils.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/snek/snek.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/snek/snek.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/snek/snek.component.ts rename to web/projects/ui/src/app/apps/portal/routes/system/snek/snek.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts b/web/projects/ui/src/app/apps/portal/routes/system/system.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/system.module.ts rename to web/projects/ui/src/app/apps/portal/routes/system/system.module.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts rename to web/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/updates/pipes/filter-updates.pipe.ts b/web/projects/ui/src/app/apps/portal/routes/system/updates/pipes/filter-updates.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/updates/pipes/filter-updates.pipe.ts rename to web/projects/ui/src/app/apps/portal/routes/system/updates/pipes/filter-updates.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/updates/pipes/install-progress.pipe.ts b/web/projects/ui/src/app/apps/portal/routes/system/updates/pipes/install-progress.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/updates/pipes/install-progress.pipe.ts rename to web/projects/ui/src/app/apps/portal/routes/system/updates/pipes/install-progress.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/portal/routes/system/updates/updates.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/updates/updates.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/routes/system/updates/updates.component.ts rename to web/projects/ui/src/app/apps/portal/routes/system/updates/updates.component.ts diff --git a/frontend/projects/ui/src/app/apps/portal/services/desktop.service.ts b/web/projects/ui/src/app/apps/portal/services/desktop.service.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/services/desktop.service.ts rename to web/projects/ui/src/app/apps/portal/services/desktop.service.ts diff --git a/frontend/projects/ui/src/app/apps/portal/services/navigation.service.ts b/web/projects/ui/src/app/apps/portal/services/navigation.service.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/services/navigation.service.ts rename to web/projects/ui/src/app/apps/portal/services/navigation.service.ts diff --git a/frontend/projects/ui/src/app/apps/portal/services/notifications.service.ts b/web/projects/ui/src/app/apps/portal/services/notifications.service.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/services/notifications.service.ts rename to web/projects/ui/src/app/apps/portal/services/notifications.service.ts diff --git a/frontend/projects/ui/src/app/apps/portal/services/routing-strategy.service.ts b/web/projects/ui/src/app/apps/portal/services/routing-strategy.service.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/services/routing-strategy.service.ts rename to web/projects/ui/src/app/apps/portal/services/routing-strategy.service.ts diff --git a/frontend/projects/ui/src/app/apps/portal/services/services.service.ts b/web/projects/ui/src/app/apps/portal/services/services.service.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/services/services.service.ts rename to web/projects/ui/src/app/apps/portal/services/services.service.ts diff --git a/frontend/projects/ui/src/app/apps/portal/types/navigation-item.ts b/web/projects/ui/src/app/apps/portal/types/navigation-item.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/types/navigation-item.ts rename to web/projects/ui/src/app/apps/portal/types/navigation-item.ts diff --git a/frontend/projects/ui/src/app/apps/portal/utils/system-tab-resolver.ts b/web/projects/ui/src/app/apps/portal/utils/system-tab-resolver.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/utils/system-tab-resolver.ts rename to web/projects/ui/src/app/apps/portal/utils/system-tab-resolver.ts diff --git a/frontend/projects/ui/src/app/apps/portal/utils/to-navigation-item.ts b/web/projects/ui/src/app/apps/portal/utils/to-navigation-item.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/utils/to-navigation-item.ts rename to web/projects/ui/src/app/apps/portal/utils/to-navigation-item.ts diff --git a/frontend/projects/ui/src/app/apps/portal/utils/to-router-link.ts b/web/projects/ui/src/app/apps/portal/utils/to-router-link.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/portal/utils/to-router-link.ts rename to web/projects/ui/src/app/apps/portal/utils/to-router-link.ts diff --git a/frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.html b/web/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.html rename to web/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.ts b/web/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.ts rename to web/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.module.ts b/web/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.module.ts rename to web/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/modals/form/form.module.ts b/web/projects/ui/src/app/apps/ui/modals/form/form.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/modals/form/form.module.ts rename to web/projects/ui/src/app/apps/ui/modals/form/form.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/modals/form/form.page.html b/web/projects/ui/src/app/apps/ui/modals/form/form.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/modals/form/form.page.html rename to web/projects/ui/src/app/apps/ui/modals/form/form.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/modals/form/form.page.scss b/web/projects/ui/src/app/apps/ui/modals/form/form.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/modals/form/form.page.scss rename to web/projects/ui/src/app/apps/ui/modals/form/form.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/modals/form/form.page.ts b/web/projects/ui/src/app/apps/ui/modals/form/form.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/modals/form/form.page.ts rename to web/projects/ui/src/app/apps/ui/modals/form/form.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html b/web/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html rename to web/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.scss b/web/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.scss rename to web/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.ts b/web/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.ts rename to web/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.module.ts b/web/projects/ui/src/app/apps/ui/modals/prompt/prompt.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/modals/prompt/prompt.module.ts rename to web/projects/ui/src/app/apps/ui/modals/prompt/prompt.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/backups.module.ts b/web/projects/ui/src/app/apps/ui/pages/backups/backups.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/backups.module.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/backups.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/components/backing-up/backing-up.component.html b/web/projects/ui/src/app/apps/ui/pages/backups/components/backing-up/backing-up.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/components/backing-up/backing-up.component.html rename to web/projects/ui/src/app/apps/ui/pages/backups/components/backing-up/backing-up.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/components/backing-up/backing-up.component.ts b/web/projects/ui/src/app/apps/ui/pages/backups/components/backing-up/backing-up.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/components/backing-up/backing-up.component.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/components/backing-up/backing-up.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/directives/backup-create.directive.ts b/web/projects/ui/src/app/apps/ui/pages/backups/directives/backup-create.directive.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/directives/backup-create.directive.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/directives/backup-create.directive.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/directives/backup-restore.directive.ts b/web/projects/ui/src/app/apps/ui/pages/backups/directives/backup-restore.directive.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/directives/backup-restore.directive.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/directives/backup-restore.directive.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.module.ts b/web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.module.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.html b/web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.html rename to web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.scss b/web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.scss rename to web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.ts b/web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.module.ts b/web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.module.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.html b/web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.html rename to web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.scss b/web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.scss rename to web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.ts b/web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/to-options.pipe.ts b/web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/to-options.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/to-options.pipe.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/to-options.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.module.ts b/web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.module.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.html b/web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.html rename to web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.scss b/web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.scss rename to web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.ts b/web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-status.component.html b/web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-status.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-status.component.html rename to web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-status.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.module.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.module.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.html b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.html rename to web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.scss b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.scss rename to web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.html b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.html rename to web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.scss b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.scss rename to web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.html b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.html rename to web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.scss b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.scss rename to web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/job-builder.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/job-builder.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/job-builder.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/job-builder.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/pipes.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/pipes.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/pipes.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/pipes.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.module.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.module.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.html b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.html rename to web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.scss b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.scss rename to web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.module.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.module.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.html b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.html rename to web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.scss b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.scss rename to web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pipes/get-display-info.pipe.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pipes/get-display-info.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pipes/get-display-info.pipe.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/pipes/get-display-info.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pipes/has-valid-backup.pipe.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pipes/has-valid-backup.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pipes/has-valid-backup.pipe.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/pipes/has-valid-backup.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/pipes/target-pipes.module.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pipes/target-pipes.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/pipes/target-pipes.module.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/pipes/target-pipes.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/backups/types/target-types.ts b/web/projects/ui/src/app/apps/ui/pages/backups/types/target-types.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/backups/types/target-types.ts rename to web/projects/ui/src/app/apps/ui/pages/backups/types/target-types.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/home/home.module.ts b/web/projects/ui/src/app/apps/ui/pages/home/home.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/home/home.module.ts rename to web/projects/ui/src/app/apps/ui/pages/home/home.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/home/home.page.html b/web/projects/ui/src/app/apps/ui/pages/home/home.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/home/home.page.html rename to web/projects/ui/src/app/apps/ui/pages/home/home.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/home/home.page.scss b/web/projects/ui/src/app/apps/ui/pages/home/home.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/home/home.page.scss rename to web/projects/ui/src/app/apps/ui/pages/home/home.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/home/home.page.ts b/web/projects/ui/src/app/apps/ui/pages/home/home.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/home/home.page.ts rename to web/projects/ui/src/app/apps/ui/pages/home/home.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.module.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.module.ts rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.html b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.html rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.scss b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.scss rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.ts rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.module.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.module.ts rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.html b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.html rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.scss b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.scss rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.ts rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-components.module.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-components.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-components.module.ts rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-components.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.html b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.html rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.ts rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.page.scss b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.page.scss rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.html b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.html rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.scss b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.scss rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.ts rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-header/marketplace-show-header.component.html b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-header/marketplace-show-header.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-header/marketplace-show-header.component.html rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-header/marketplace-show-header.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-header/marketplace-show-header.component.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-header/marketplace-show-header.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-header/marketplace-show-header.component.ts rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-header/marketplace-show-header.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.module.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.module.ts rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.html b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.html rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.scss b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.scss rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.ts rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.html b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.html rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.scss b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.scss rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.ts rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.module.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.module.ts rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace.module.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/marketplace.module.ts rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.module.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.module.ts rename to web/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.page.html b/web/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.page.html rename to web/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.page.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.page.ts rename to web/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/notifications/notifications.module.ts b/web/projects/ui/src/app/apps/ui/pages/notifications/notifications.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/notifications/notifications.module.ts rename to web/projects/ui/src/app/apps/ui/pages/notifications/notifications.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.html b/web/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.html rename to web/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.scss b/web/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.scss rename to web/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.ts b/web/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.ts rename to web/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.module.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.module.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.html b/web/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.html rename to web/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions-item.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions-item.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions-item.component.html rename to web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions-item.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.module.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.module.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.html b/web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.html rename to web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.scss rename to web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.module.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.module.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.html b/web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.html rename to web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.scss rename to web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.module.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.module.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.html b/web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.html rename to web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.scss rename to web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.html rename to web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.scss rename to web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.html rename to web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.scss rename to web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.html rename to web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.scss rename to web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.module.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.module.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launchable-interfaces.pipe.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launchable-interfaces.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launchable-interfaces.pipe.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launchable-interfaces.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.module.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.module.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.html b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.html rename to web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.scss rename to web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-list/package-info.pipe.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-list/package-info.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-list/package-info.pipe.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-list/package-info.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.module.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.module.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.html b/web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.html rename to web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.scss rename to web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.page.html b/web/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.page.html rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.page.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.page.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.html rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.html rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.scss rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.html rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.scss rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.html rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.scss rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.html rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.scss rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.html rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.scss rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.html rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.scss rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.html rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.scss rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config-dep.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config-dep.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config-dep.component.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config-dep.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.module.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.module.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.html b/web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.html rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.scss rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/health-color.pipe.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/health-color.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/health-color.pipe.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/health-color.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/progress-data.pipe.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/progress-data.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/progress-data.pipe.ts rename to web/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/progress-data.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/services.module.ts b/web/projects/ui/src/app/apps/ui/pages/services/services.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/services.module.ts rename to web/projects/ui/src/app/apps/ui/pages/services/services.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/status/status.component.html b/web/projects/ui/src/app/apps/ui/pages/services/status/status.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/status/status.component.html rename to web/projects/ui/src/app/apps/ui/pages/services/status/status.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/status/status.component.module.ts b/web/projects/ui/src/app/apps/ui/pages/services/status/status.component.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/status/status.component.module.ts rename to web/projects/ui/src/app/apps/ui/pages/services/status/status.component.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/status/status.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/status/status.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/status/status.component.scss rename to web/projects/ui/src/app/apps/ui/pages/services/status/status.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/services/status/status.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/status/status.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/services/status/status.component.ts rename to web/projects/ui/src/app/apps/ui/pages/services/status/status.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts b/web/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts rename to web/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/domains/domains.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.module.ts rename to web/projects/ui/src/app/apps/ui/pages/system/domains/domains.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html b/web/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html rename to web/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.scss rename to web/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.ts rename to web/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/email/email.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/email/email.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/email/email.module.ts rename to web/projects/ui/src/app/apps/ui/pages/system/email/email.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/email/email.page.html b/web/projects/ui/src/app/apps/ui/pages/system/email/email.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/email/email.page.html rename to web/projects/ui/src/app/apps/ui/pages/system/email/email.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/email/email.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/email/email.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/email/email.page.scss rename to web/projects/ui/src/app/apps/ui/pages/system/email/email.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/email/email.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/email/email.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/email/email.page.ts rename to web/projects/ui/src/app/apps/ui/pages/system/email/email.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.module.ts rename to web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.html b/web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.html rename to web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.scss rename to web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.ts rename to web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.module.ts rename to web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.html b/web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.html rename to web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.scss rename to web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.ts rename to web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.module.ts rename to web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html b/web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html rename to web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.scss rename to web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.ts rename to web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/router/router.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/router/router.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/router/router.module.ts rename to web/projects/ui/src/app/apps/ui/pages/system/router/router.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/router/router.page.html b/web/projects/ui/src/app/apps/ui/pages/system/router/router.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/router/router.page.html rename to web/projects/ui/src/app/apps/ui/pages/system/router/router.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/router/router.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/router/router.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/router/router.page.scss rename to web/projects/ui/src/app/apps/ui/pages/system/router/router.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/router/router.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/router/router.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/router/router.page.ts rename to web/projects/ui/src/app/apps/ui/pages/system/router/router.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.module.ts rename to web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.html b/web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.html rename to web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.scss rename to web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.ts rename to web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.module.ts rename to web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.html b/web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.html rename to web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.scss rename to web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.ts rename to web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/backup-color.pipe.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-show/backup-color.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/server-show/backup-color.pipe.ts rename to web/projects/ui/src/app/apps/ui/pages/system/server-show/backup-color.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.html b/web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.html rename to web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts rename to web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.scss rename to web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.ts rename to web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.module.ts rename to web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.html b/web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.html rename to web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.scss rename to web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.ts rename to web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.module.ts rename to web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.html b/web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.html rename to web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.scss rename to web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.ts rename to web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.module.ts rename to web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.html b/web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.html rename to web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.scss rename to web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.ts rename to web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/sideload/dnd.directive.ts b/web/projects/ui/src/app/apps/ui/pages/system/sideload/dnd.directive.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/sideload/dnd.directive.ts rename to web/projects/ui/src/app/apps/ui/pages/system/sideload/dnd.directive.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.module.ts rename to web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.html b/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.html rename to web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.scss rename to web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.ts rename to web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.module.ts rename to web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.html b/web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.html rename to web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.scss rename to web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.ts rename to web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/system.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/system.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/system.module.ts rename to web/projects/ui/src/app/apps/ui/pages/system/system.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.component.html b/web/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.component.html rename to web/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.component.ts b/web/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.component.ts rename to web/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.module.ts rename to web/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.module.ts rename to web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.html b/web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.html rename to web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.scss rename to web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.ts rename to web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.module.ts rename to web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.html b/web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.html rename to web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.scss rename to web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.ts rename to web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.const.ts b/web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.const.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.const.ts rename to web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.const.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.module.ts rename to web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.html b/web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.html rename to web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.scss rename to web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.ts rename to web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/updates/filter-updates.pipe.ts b/web/projects/ui/src/app/apps/ui/pages/updates/filter-updates.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/updates/filter-updates.pipe.ts rename to web/projects/ui/src/app/apps/ui/pages/updates/filter-updates.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/updates/install-progress.pipe.ts b/web/projects/ui/src/app/apps/ui/pages/updates/install-progress.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/updates/install-progress.pipe.ts rename to web/projects/ui/src/app/apps/ui/pages/updates/install-progress.pipe.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts b/web/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts rename to web/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.page.html b/web/projects/ui/src/app/apps/ui/pages/updates/updates.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/updates/updates.page.html rename to web/projects/ui/src/app/apps/ui/pages/updates/updates.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.page.scss b/web/projects/ui/src/app/apps/ui/pages/updates/updates.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/updates/updates.page.scss rename to web/projects/ui/src/app/apps/ui/pages/updates/updates.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/updates/updates.page.ts b/web/projects/ui/src/app/apps/ui/pages/updates/updates.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/updates/updates.page.ts rename to web/projects/ui/src/app/apps/ui/pages/updates/updates.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.html b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.html rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.scss b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.scss rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.ts rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.module.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.module.ts rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.html b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.html rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.scss b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.scss rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.ts rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.module.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.module.ts rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.html b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.html rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.scss b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.scss rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.ts rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.module.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.module.ts rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.html b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.html rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.scss b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.scss rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.ts rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.module.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.module.ts rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.html b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.html rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.scss b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.scss rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.ts rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.module.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.module.ts rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.html b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.html rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.scss b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.scss rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.ts rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.module.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.module.ts rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/widgets.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/widgets.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/built-in/widgets.ts rename to web/projects/ui/src/app/apps/ui/pages/widgets/built-in/widgets.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/widgets.module.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/widgets.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/widgets.module.ts rename to web/projects/ui/src/app/apps/ui/pages/widgets/widgets.module.ts diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.html b/web/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.html similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.html rename to web/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.html diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.scss b/web/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.scss similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.scss rename to web/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.scss diff --git a/frontend/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.ts rename to web/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.ts diff --git a/frontend/projects/ui/src/app/apps/ui/ui.module.ts b/web/projects/ui/src/app/apps/ui/ui.module.ts similarity index 100% rename from frontend/projects/ui/src/app/apps/ui/ui.module.ts rename to web/projects/ui/src/app/apps/ui/ui.module.ts diff --git a/frontend/projects/ui/src/app/common/badge-menu-button/badge-menu.component.html b/web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/badge-menu-button/badge-menu.component.html rename to web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.html diff --git a/frontend/projects/ui/src/app/common/badge-menu-button/badge-menu.component.module.ts b/web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.module.ts similarity index 100% rename from frontend/projects/ui/src/app/common/badge-menu-button/badge-menu.component.module.ts rename to web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.module.ts diff --git a/frontend/projects/ui/src/app/common/badge-menu-button/badge-menu.component.scss b/web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.scss similarity index 100% rename from frontend/projects/ui/src/app/common/badge-menu-button/badge-menu.component.scss rename to web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.scss diff --git a/frontend/projects/ui/src/app/common/badge-menu-button/badge-menu.component.ts b/web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/badge-menu-button/badge-menu.component.ts rename to web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.ts diff --git a/frontend/projects/ui/src/app/common/form/control.directive.ts b/web/projects/ui/src/app/common/form/control.directive.ts similarity index 100% rename from frontend/projects/ui/src/app/common/form/control.directive.ts rename to web/projects/ui/src/app/common/form/control.directive.ts diff --git a/frontend/projects/ui/src/app/common/form/control.ts b/web/projects/ui/src/app/common/form/control.ts similarity index 100% rename from frontend/projects/ui/src/app/common/form/control.ts rename to web/projects/ui/src/app/common/form/control.ts diff --git a/frontend/projects/ui/src/app/common/form/form-array/form-array.component.html b/web/projects/ui/src/app/common/form/form-array/form-array.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-array/form-array.component.html rename to web/projects/ui/src/app/common/form/form-array/form-array.component.html diff --git a/frontend/projects/ui/src/app/common/form/form-array/form-array.component.scss b/web/projects/ui/src/app/common/form/form-array/form-array.component.scss similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-array/form-array.component.scss rename to web/projects/ui/src/app/common/form/form-array/form-array.component.scss diff --git a/frontend/projects/ui/src/app/common/form/form-array/form-array.component.ts b/web/projects/ui/src/app/common/form/form-array/form-array.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-array/form-array.component.ts rename to web/projects/ui/src/app/common/form/form-array/form-array.component.ts diff --git a/frontend/projects/ui/src/app/common/form/form-color/form-color.component.html b/web/projects/ui/src/app/common/form/form-color/form-color.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-color/form-color.component.html rename to web/projects/ui/src/app/common/form/form-color/form-color.component.html diff --git a/frontend/projects/ui/src/app/common/form/form-color/form-color.component.scss b/web/projects/ui/src/app/common/form/form-color/form-color.component.scss similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-color/form-color.component.scss rename to web/projects/ui/src/app/common/form/form-color/form-color.component.scss diff --git a/frontend/projects/ui/src/app/common/form/form-color/form-color.component.ts b/web/projects/ui/src/app/common/form/form-color/form-color.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-color/form-color.component.ts rename to web/projects/ui/src/app/common/form/form-color/form-color.component.ts diff --git a/frontend/projects/ui/src/app/common/form/form-control/form-control.component.html b/web/projects/ui/src/app/common/form/form-control/form-control.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-control/form-control.component.html rename to web/projects/ui/src/app/common/form/form-control/form-control.component.html diff --git a/frontend/projects/ui/src/app/common/form/form-control/form-control.component.scss b/web/projects/ui/src/app/common/form/form-control/form-control.component.scss similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-control/form-control.component.scss rename to web/projects/ui/src/app/common/form/form-control/form-control.component.scss diff --git a/frontend/projects/ui/src/app/common/form/form-control/form-control.component.ts b/web/projects/ui/src/app/common/form/form-control/form-control.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-control/form-control.component.ts rename to web/projects/ui/src/app/common/form/form-control/form-control.component.ts diff --git a/frontend/projects/ui/src/app/common/form/form-control/form-control.providers.ts b/web/projects/ui/src/app/common/form/form-control/form-control.providers.ts similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-control/form-control.providers.ts rename to web/projects/ui/src/app/common/form/form-control/form-control.providers.ts diff --git a/frontend/projects/ui/src/app/common/form/form-datetime/form-datetime.component.html b/web/projects/ui/src/app/common/form/form-datetime/form-datetime.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-datetime/form-datetime.component.html rename to web/projects/ui/src/app/common/form/form-datetime/form-datetime.component.html diff --git a/frontend/projects/ui/src/app/common/form/form-datetime/form-datetime.component.ts b/web/projects/ui/src/app/common/form/form-datetime/form-datetime.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-datetime/form-datetime.component.ts rename to web/projects/ui/src/app/common/form/form-datetime/form-datetime.component.ts diff --git a/frontend/projects/ui/src/app/common/form/form-file/form-file.component.html b/web/projects/ui/src/app/common/form/form-file/form-file.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-file/form-file.component.html rename to web/projects/ui/src/app/common/form/form-file/form-file.component.html diff --git a/frontend/projects/ui/src/app/common/form/form-file/form-file.component.scss b/web/projects/ui/src/app/common/form/form-file/form-file.component.scss similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-file/form-file.component.scss rename to web/projects/ui/src/app/common/form/form-file/form-file.component.scss diff --git a/frontend/projects/ui/src/app/common/form/form-file/form-file.component.ts b/web/projects/ui/src/app/common/form/form-file/form-file.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-file/form-file.component.ts rename to web/projects/ui/src/app/common/form/form-file/form-file.component.ts diff --git a/frontend/projects/ui/src/app/common/form/form-group/form-group.component.html b/web/projects/ui/src/app/common/form/form-group/form-group.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-group/form-group.component.html rename to web/projects/ui/src/app/common/form/form-group/form-group.component.html diff --git a/frontend/projects/ui/src/app/common/form/form-group/form-group.component.scss b/web/projects/ui/src/app/common/form/form-group/form-group.component.scss similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-group/form-group.component.scss rename to web/projects/ui/src/app/common/form/form-group/form-group.component.scss diff --git a/frontend/projects/ui/src/app/common/form/form-group/form-group.component.ts b/web/projects/ui/src/app/common/form/form-group/form-group.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-group/form-group.component.ts rename to web/projects/ui/src/app/common/form/form-group/form-group.component.ts diff --git a/frontend/projects/ui/src/app/common/form/form-group/form-group.providers.ts b/web/projects/ui/src/app/common/form/form-group/form-group.providers.ts similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-group/form-group.providers.ts rename to web/projects/ui/src/app/common/form/form-group/form-group.providers.ts diff --git a/frontend/projects/ui/src/app/common/form/form-multiselect/form-multiselect.component.html b/web/projects/ui/src/app/common/form/form-multiselect/form-multiselect.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-multiselect/form-multiselect.component.html rename to web/projects/ui/src/app/common/form/form-multiselect/form-multiselect.component.html diff --git a/frontend/projects/ui/src/app/common/form/form-multiselect/form-multiselect.component.ts b/web/projects/ui/src/app/common/form/form-multiselect/form-multiselect.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-multiselect/form-multiselect.component.ts rename to web/projects/ui/src/app/common/form/form-multiselect/form-multiselect.component.ts diff --git a/frontend/projects/ui/src/app/common/form/form-number/form-number.component.html b/web/projects/ui/src/app/common/form/form-number/form-number.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-number/form-number.component.html rename to web/projects/ui/src/app/common/form/form-number/form-number.component.html diff --git a/frontend/projects/ui/src/app/common/form/form-number/form-number.component.ts b/web/projects/ui/src/app/common/form/form-number/form-number.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-number/form-number.component.ts rename to web/projects/ui/src/app/common/form/form-number/form-number.component.ts diff --git a/frontend/projects/ui/src/app/common/form/form-object/form-object.component.html b/web/projects/ui/src/app/common/form/form-object/form-object.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-object/form-object.component.html rename to web/projects/ui/src/app/common/form/form-object/form-object.component.html diff --git a/frontend/projects/ui/src/app/common/form/form-object/form-object.component.scss b/web/projects/ui/src/app/common/form/form-object/form-object.component.scss similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-object/form-object.component.scss rename to web/projects/ui/src/app/common/form/form-object/form-object.component.scss diff --git a/frontend/projects/ui/src/app/common/form/form-object/form-object.component.ts b/web/projects/ui/src/app/common/form/form-object/form-object.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-object/form-object.component.ts rename to web/projects/ui/src/app/common/form/form-object/form-object.component.ts diff --git a/frontend/projects/ui/src/app/common/form/form-select/form-select.component.html b/web/projects/ui/src/app/common/form/form-select/form-select.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-select/form-select.component.html rename to web/projects/ui/src/app/common/form/form-select/form-select.component.html diff --git a/frontend/projects/ui/src/app/common/form/form-select/form-select.component.ts b/web/projects/ui/src/app/common/form/form-select/form-select.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-select/form-select.component.ts rename to web/projects/ui/src/app/common/form/form-select/form-select.component.ts diff --git a/frontend/projects/ui/src/app/common/form/form-text/form-text.component.html b/web/projects/ui/src/app/common/form/form-text/form-text.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-text/form-text.component.html rename to web/projects/ui/src/app/common/form/form-text/form-text.component.html diff --git a/frontend/projects/ui/src/app/common/form/form-text/form-text.component.scss b/web/projects/ui/src/app/common/form/form-text/form-text.component.scss similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-text/form-text.component.scss rename to web/projects/ui/src/app/common/form/form-text/form-text.component.scss diff --git a/frontend/projects/ui/src/app/common/form/form-text/form-text.component.ts b/web/projects/ui/src/app/common/form/form-text/form-text.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-text/form-text.component.ts rename to web/projects/ui/src/app/common/form/form-text/form-text.component.ts diff --git a/frontend/projects/ui/src/app/common/form/form-textarea/form-textarea.component.html b/web/projects/ui/src/app/common/form/form-textarea/form-textarea.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-textarea/form-textarea.component.html rename to web/projects/ui/src/app/common/form/form-textarea/form-textarea.component.html diff --git a/frontend/projects/ui/src/app/common/form/form-textarea/form-textarea.component.ts b/web/projects/ui/src/app/common/form/form-textarea/form-textarea.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-textarea/form-textarea.component.ts rename to web/projects/ui/src/app/common/form/form-textarea/form-textarea.component.ts diff --git a/frontend/projects/ui/src/app/common/form/form-toggle/form-toggle.component.html b/web/projects/ui/src/app/common/form/form-toggle/form-toggle.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-toggle/form-toggle.component.html rename to web/projects/ui/src/app/common/form/form-toggle/form-toggle.component.html diff --git a/frontend/projects/ui/src/app/common/form/form-toggle/form-toggle.component.ts b/web/projects/ui/src/app/common/form/form-toggle/form-toggle.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-toggle/form-toggle.component.ts rename to web/projects/ui/src/app/common/form/form-toggle/form-toggle.component.ts diff --git a/frontend/projects/ui/src/app/common/form/form-union/form-union.component.html b/web/projects/ui/src/app/common/form/form-union/form-union.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-union/form-union.component.html rename to web/projects/ui/src/app/common/form/form-union/form-union.component.html diff --git a/frontend/projects/ui/src/app/common/form/form-union/form-union.component.scss b/web/projects/ui/src/app/common/form/form-union/form-union.component.scss similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-union/form-union.component.scss rename to web/projects/ui/src/app/common/form/form-union/form-union.component.scss diff --git a/frontend/projects/ui/src/app/common/form/form-union/form-union.component.ts b/web/projects/ui/src/app/common/form/form-union/form-union.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/form/form-union/form-union.component.ts rename to web/projects/ui/src/app/common/form/form-union/form-union.component.ts diff --git a/frontend/projects/ui/src/app/common/form/form.module.ts b/web/projects/ui/src/app/common/form/form.module.ts similarity index 100% rename from frontend/projects/ui/src/app/common/form/form.module.ts rename to web/projects/ui/src/app/common/form/form.module.ts diff --git a/frontend/projects/ui/src/app/common/form/hint.pipe.ts b/web/projects/ui/src/app/common/form/hint.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/common/form/hint.pipe.ts rename to web/projects/ui/src/app/common/form/hint.pipe.ts diff --git a/frontend/projects/ui/src/app/common/form/invalid.service.ts b/web/projects/ui/src/app/common/form/invalid.service.ts similarity index 100% rename from frontend/projects/ui/src/app/common/form/invalid.service.ts rename to web/projects/ui/src/app/common/form/invalid.service.ts diff --git a/frontend/projects/ui/src/app/common/form/mustache.pipe.ts b/web/projects/ui/src/app/common/form/mustache.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/common/form/mustache.pipe.ts rename to web/projects/ui/src/app/common/form/mustache.pipe.ts diff --git a/frontend/projects/ui/src/app/common/insecure-warning/insecure-warning.component.html b/web/projects/ui/src/app/common/insecure-warning/insecure-warning.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/insecure-warning/insecure-warning.component.html rename to web/projects/ui/src/app/common/insecure-warning/insecure-warning.component.html diff --git a/frontend/projects/ui/src/app/common/insecure-warning/insecure-warning.component.scss b/web/projects/ui/src/app/common/insecure-warning/insecure-warning.component.scss similarity index 100% rename from frontend/projects/ui/src/app/common/insecure-warning/insecure-warning.component.scss rename to web/projects/ui/src/app/common/insecure-warning/insecure-warning.component.scss diff --git a/frontend/projects/ui/src/app/common/insecure-warning/insecure-warning.component.ts b/web/projects/ui/src/app/common/insecure-warning/insecure-warning.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/insecure-warning/insecure-warning.component.ts rename to web/projects/ui/src/app/common/insecure-warning/insecure-warning.component.ts diff --git a/frontend/projects/ui/src/app/common/insecure-warning/insecure-warning.module.ts b/web/projects/ui/src/app/common/insecure-warning/insecure-warning.module.ts similarity index 100% rename from frontend/projects/ui/src/app/common/insecure-warning/insecure-warning.module.ts rename to web/projects/ui/src/app/common/insecure-warning/insecure-warning.module.ts diff --git a/frontend/projects/ui/src/app/common/install-progress/install-progress.module.ts b/web/projects/ui/src/app/common/install-progress/install-progress.module.ts similarity index 100% rename from frontend/projects/ui/src/app/common/install-progress/install-progress.module.ts rename to web/projects/ui/src/app/common/install-progress/install-progress.module.ts diff --git a/frontend/projects/ui/src/app/common/install-progress/install-progress.pipe.ts b/web/projects/ui/src/app/common/install-progress/install-progress.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/common/install-progress/install-progress.pipe.ts rename to web/projects/ui/src/app/common/install-progress/install-progress.pipe.ts diff --git a/frontend/projects/ui/src/app/common/interface-addresses/interface-addresses-item.component.html b/web/projects/ui/src/app/common/interface-addresses/interface-addresses-item.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/interface-addresses/interface-addresses-item.component.html rename to web/projects/ui/src/app/common/interface-addresses/interface-addresses-item.component.html diff --git a/frontend/projects/ui/src/app/common/interface-addresses/interface-addresses.component.html b/web/projects/ui/src/app/common/interface-addresses/interface-addresses.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/interface-addresses/interface-addresses.component.html rename to web/projects/ui/src/app/common/interface-addresses/interface-addresses.component.html diff --git a/frontend/projects/ui/src/app/common/interface-addresses/interface-addresses.component.scss b/web/projects/ui/src/app/common/interface-addresses/interface-addresses.component.scss similarity index 100% rename from frontend/projects/ui/src/app/common/interface-addresses/interface-addresses.component.scss rename to web/projects/ui/src/app/common/interface-addresses/interface-addresses.component.scss diff --git a/frontend/projects/ui/src/app/common/interface-addresses/interface-addresses.component.ts b/web/projects/ui/src/app/common/interface-addresses/interface-addresses.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/interface-addresses/interface-addresses.component.ts rename to web/projects/ui/src/app/common/interface-addresses/interface-addresses.component.ts diff --git a/frontend/projects/ui/src/app/common/interface-addresses/interface-addresses.module.ts b/web/projects/ui/src/app/common/interface-addresses/interface-addresses.module.ts similarity index 100% rename from frontend/projects/ui/src/app/common/interface-addresses/interface-addresses.module.ts rename to web/projects/ui/src/app/common/interface-addresses/interface-addresses.module.ts diff --git a/frontend/projects/ui/src/app/common/logs/logs.component.html b/web/projects/ui/src/app/common/logs/logs.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/logs/logs.component.html rename to web/projects/ui/src/app/common/logs/logs.component.html diff --git a/frontend/projects/ui/src/app/common/logs/logs.component.module.ts b/web/projects/ui/src/app/common/logs/logs.component.module.ts similarity index 100% rename from frontend/projects/ui/src/app/common/logs/logs.component.module.ts rename to web/projects/ui/src/app/common/logs/logs.component.module.ts diff --git a/frontend/projects/ui/src/app/common/logs/logs.component.scss b/web/projects/ui/src/app/common/logs/logs.component.scss similarity index 100% rename from frontend/projects/ui/src/app/common/logs/logs.component.scss rename to web/projects/ui/src/app/common/logs/logs.component.scss diff --git a/frontend/projects/ui/src/app/common/logs/logs.component.ts b/web/projects/ui/src/app/common/logs/logs.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/logs/logs.component.ts rename to web/projects/ui/src/app/common/logs/logs.component.ts diff --git a/frontend/projects/ui/src/app/common/os-welcome/os-welcome.module.ts b/web/projects/ui/src/app/common/os-welcome/os-welcome.module.ts similarity index 100% rename from frontend/projects/ui/src/app/common/os-welcome/os-welcome.module.ts rename to web/projects/ui/src/app/common/os-welcome/os-welcome.module.ts diff --git a/frontend/projects/ui/src/app/common/os-welcome/os-welcome.page.html b/web/projects/ui/src/app/common/os-welcome/os-welcome.page.html similarity index 100% rename from frontend/projects/ui/src/app/common/os-welcome/os-welcome.page.html rename to web/projects/ui/src/app/common/os-welcome/os-welcome.page.html diff --git a/frontend/projects/ui/src/app/common/os-welcome/os-welcome.page.scss b/web/projects/ui/src/app/common/os-welcome/os-welcome.page.scss similarity index 100% rename from frontend/projects/ui/src/app/common/os-welcome/os-welcome.page.scss rename to web/projects/ui/src/app/common/os-welcome/os-welcome.page.scss diff --git a/frontend/projects/ui/src/app/common/os-welcome/os-welcome.page.ts b/web/projects/ui/src/app/common/os-welcome/os-welcome.page.ts similarity index 100% rename from frontend/projects/ui/src/app/common/os-welcome/os-welcome.page.ts rename to web/projects/ui/src/app/common/os-welcome/os-welcome.page.ts diff --git a/frontend/projects/ui/src/app/common/primary-ip/primary-ip.module.ts b/web/projects/ui/src/app/common/primary-ip/primary-ip.module.ts similarity index 100% rename from frontend/projects/ui/src/app/common/primary-ip/primary-ip.module.ts rename to web/projects/ui/src/app/common/primary-ip/primary-ip.module.ts diff --git a/frontend/projects/ui/src/app/common/primary-ip/primary-ip.pipe.ts b/web/projects/ui/src/app/common/primary-ip/primary-ip.pipe.ts similarity index 100% rename from frontend/projects/ui/src/app/common/primary-ip/primary-ip.pipe.ts rename to web/projects/ui/src/app/common/primary-ip/primary-ip.pipe.ts diff --git a/frontend/projects/ui/src/app/common/qr/qr.component.ts b/web/projects/ui/src/app/common/qr/qr.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/qr/qr.component.ts rename to web/projects/ui/src/app/common/qr/qr.component.ts diff --git a/frontend/projects/ui/src/app/common/qr/qr.module.ts b/web/projects/ui/src/app/common/qr/qr.module.ts similarity index 100% rename from frontend/projects/ui/src/app/common/qr/qr.module.ts rename to web/projects/ui/src/app/common/qr/qr.module.ts diff --git a/frontend/projects/ui/src/app/common/skeleton-list/skeleton-list.component.html b/web/projects/ui/src/app/common/skeleton-list/skeleton-list.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/skeleton-list/skeleton-list.component.html rename to web/projects/ui/src/app/common/skeleton-list/skeleton-list.component.html diff --git a/frontend/projects/ui/src/app/common/skeleton-list/skeleton-list.component.module.ts b/web/projects/ui/src/app/common/skeleton-list/skeleton-list.component.module.ts similarity index 100% rename from frontend/projects/ui/src/app/common/skeleton-list/skeleton-list.component.module.ts rename to web/projects/ui/src/app/common/skeleton-list/skeleton-list.component.module.ts diff --git a/frontend/projects/ui/src/app/common/skeleton-list/skeleton-list.component.ts b/web/projects/ui/src/app/common/skeleton-list/skeleton-list.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/skeleton-list/skeleton-list.component.ts rename to web/projects/ui/src/app/common/skeleton-list/skeleton-list.component.ts diff --git a/frontend/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.component.html b/web/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.component.html rename to web/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.component.html diff --git a/frontend/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.component.ts b/web/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.component.ts rename to web/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.component.ts diff --git a/frontend/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.service.ts b/web/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.service.ts similarity index 100% rename from frontend/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.service.ts rename to web/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.service.ts diff --git a/frontend/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.html b/web/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.html rename to web/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.html diff --git a/frontend/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.ts b/web/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.ts rename to web/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.ts diff --git a/frontend/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.service.ts b/web/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.service.ts similarity index 100% rename from frontend/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.service.ts rename to web/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.service.ts diff --git a/frontend/projects/ui/src/app/common/toast-container/toast-container.component.html b/web/projects/ui/src/app/common/toast-container/toast-container.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/toast-container/toast-container.component.html rename to web/projects/ui/src/app/common/toast-container/toast-container.component.html diff --git a/frontend/projects/ui/src/app/common/toast-container/toast-container.component.ts b/web/projects/ui/src/app/common/toast-container/toast-container.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/toast-container/toast-container.component.ts rename to web/projects/ui/src/app/common/toast-container/toast-container.component.ts diff --git a/frontend/projects/ui/src/app/common/toast-container/toast-container.module.ts b/web/projects/ui/src/app/common/toast-container/toast-container.module.ts similarity index 100% rename from frontend/projects/ui/src/app/common/toast-container/toast-container.module.ts rename to web/projects/ui/src/app/common/toast-container/toast-container.module.ts diff --git a/frontend/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.html b/web/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.html rename to web/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.html diff --git a/frontend/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.ts b/web/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.ts rename to web/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.ts diff --git a/frontend/projects/ui/src/app/common/toast-container/update-toast/update-toast.service.ts b/web/projects/ui/src/app/common/toast-container/update-toast/update-toast.service.ts similarity index 100% rename from frontend/projects/ui/src/app/common/toast-container/update-toast/update-toast.service.ts rename to web/projects/ui/src/app/common/toast-container/update-toast/update-toast.service.ts diff --git a/frontend/projects/ui/src/app/common/widget-list/any-link/any-link.component.html b/web/projects/ui/src/app/common/widget-list/any-link/any-link.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/widget-list/any-link/any-link.component.html rename to web/projects/ui/src/app/common/widget-list/any-link/any-link.component.html diff --git a/frontend/projects/ui/src/app/common/widget-list/any-link/any-link.component.scss b/web/projects/ui/src/app/common/widget-list/any-link/any-link.component.scss similarity index 100% rename from frontend/projects/ui/src/app/common/widget-list/any-link/any-link.component.scss rename to web/projects/ui/src/app/common/widget-list/any-link/any-link.component.scss diff --git a/frontend/projects/ui/src/app/common/widget-list/any-link/any-link.component.ts b/web/projects/ui/src/app/common/widget-list/any-link/any-link.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/widget-list/any-link/any-link.component.ts rename to web/projects/ui/src/app/common/widget-list/any-link/any-link.component.ts diff --git a/frontend/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.html b/web/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.html rename to web/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.html diff --git a/frontend/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.scss b/web/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.scss similarity index 100% rename from frontend/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.scss rename to web/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.scss diff --git a/frontend/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.ts b/web/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.ts rename to web/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.ts diff --git a/frontend/projects/ui/src/app/common/widget-list/widget-list.component.html b/web/projects/ui/src/app/common/widget-list/widget-list.component.html similarity index 100% rename from frontend/projects/ui/src/app/common/widget-list/widget-list.component.html rename to web/projects/ui/src/app/common/widget-list/widget-list.component.html diff --git a/frontend/projects/ui/src/app/common/widget-list/widget-list.component.module.ts b/web/projects/ui/src/app/common/widget-list/widget-list.component.module.ts similarity index 100% rename from frontend/projects/ui/src/app/common/widget-list/widget-list.component.module.ts rename to web/projects/ui/src/app/common/widget-list/widget-list.component.module.ts diff --git a/frontend/projects/ui/src/app/common/widget-list/widget-list.component.scss b/web/projects/ui/src/app/common/widget-list/widget-list.component.scss similarity index 100% rename from frontend/projects/ui/src/app/common/widget-list/widget-list.component.scss rename to web/projects/ui/src/app/common/widget-list/widget-list.component.scss diff --git a/frontend/projects/ui/src/app/common/widget-list/widget-list.component.ts b/web/projects/ui/src/app/common/widget-list/widget-list.component.ts similarity index 100% rename from frontend/projects/ui/src/app/common/widget-list/widget-list.component.ts rename to web/projects/ui/src/app/common/widget-list/widget-list.component.ts diff --git a/frontend/projects/ui/src/app/guards/auth.guard.ts b/web/projects/ui/src/app/guards/auth.guard.ts similarity index 100% rename from frontend/projects/ui/src/app/guards/auth.guard.ts rename to web/projects/ui/src/app/guards/auth.guard.ts diff --git a/frontend/projects/ui/src/app/guards/unauth.guard.ts b/web/projects/ui/src/app/guards/unauth.guard.ts similarity index 100% rename from frontend/projects/ui/src/app/guards/unauth.guard.ts rename to web/projects/ui/src/app/guards/unauth.guard.ts diff --git a/frontend/projects/ui/src/app/routing.module.ts b/web/projects/ui/src/app/routing.module.ts similarity index 100% rename from frontend/projects/ui/src/app/routing.module.ts rename to web/projects/ui/src/app/routing.module.ts diff --git a/frontend/projects/ui/src/app/services/api/api-icons.ts b/web/projects/ui/src/app/services/api/api-icons.ts similarity index 100% rename from frontend/projects/ui/src/app/services/api/api-icons.ts rename to web/projects/ui/src/app/services/api/api-icons.ts diff --git a/frontend/projects/ui/src/app/services/api/api.fixures.ts b/web/projects/ui/src/app/services/api/api.fixures.ts similarity index 100% rename from frontend/projects/ui/src/app/services/api/api.fixures.ts rename to web/projects/ui/src/app/services/api/api.fixures.ts diff --git a/frontend/projects/ui/src/app/services/api/api.types.ts b/web/projects/ui/src/app/services/api/api.types.ts similarity index 100% rename from frontend/projects/ui/src/app/services/api/api.types.ts rename to web/projects/ui/src/app/services/api/api.types.ts diff --git a/frontend/projects/ui/src/app/services/api/embassy-api.service.ts b/web/projects/ui/src/app/services/api/embassy-api.service.ts similarity index 100% rename from frontend/projects/ui/src/app/services/api/embassy-api.service.ts rename to web/projects/ui/src/app/services/api/embassy-api.service.ts diff --git a/frontend/projects/ui/src/app/services/api/embassy-live-api.service.ts b/web/projects/ui/src/app/services/api/embassy-live-api.service.ts similarity index 100% rename from frontend/projects/ui/src/app/services/api/embassy-live-api.service.ts rename to web/projects/ui/src/app/services/api/embassy-live-api.service.ts diff --git a/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts b/web/projects/ui/src/app/services/api/embassy-mock-api.service.ts similarity index 100% rename from frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts rename to web/projects/ui/src/app/services/api/embassy-mock-api.service.ts diff --git a/frontend/projects/ui/src/app/services/api/mock-patch.ts b/web/projects/ui/src/app/services/api/mock-patch.ts similarity index 100% rename from frontend/projects/ui/src/app/services/api/mock-patch.ts rename to web/projects/ui/src/app/services/api/mock-patch.ts diff --git a/frontend/projects/ui/src/app/services/auth.service.ts b/web/projects/ui/src/app/services/auth.service.ts similarity index 100% rename from frontend/projects/ui/src/app/services/auth.service.ts rename to web/projects/ui/src/app/services/auth.service.ts diff --git a/frontend/projects/ui/src/app/services/client-storage.service.ts b/web/projects/ui/src/app/services/client-storage.service.ts similarity index 100% rename from frontend/projects/ui/src/app/services/client-storage.service.ts rename to web/projects/ui/src/app/services/client-storage.service.ts diff --git a/frontend/projects/ui/src/app/services/config.service.ts b/web/projects/ui/src/app/services/config.service.ts similarity index 100% rename from frontend/projects/ui/src/app/services/config.service.ts rename to web/projects/ui/src/app/services/config.service.ts diff --git a/frontend/projects/ui/src/app/services/connection.service.ts b/web/projects/ui/src/app/services/connection.service.ts similarity index 100% rename from frontend/projects/ui/src/app/services/connection.service.ts rename to web/projects/ui/src/app/services/connection.service.ts diff --git a/frontend/projects/ui/src/app/services/date-transformer.service.ts b/web/projects/ui/src/app/services/date-transformer.service.ts similarity index 100% rename from frontend/projects/ui/src/app/services/date-transformer.service.ts rename to web/projects/ui/src/app/services/date-transformer.service.ts diff --git a/frontend/projects/ui/src/app/services/datetime-transformer.service.ts b/web/projects/ui/src/app/services/datetime-transformer.service.ts similarity index 100% rename from frontend/projects/ui/src/app/services/datetime-transformer.service.ts rename to web/projects/ui/src/app/services/datetime-transformer.service.ts diff --git a/frontend/projects/ui/src/app/services/dep-error.service.ts b/web/projects/ui/src/app/services/dep-error.service.ts similarity index 100% rename from frontend/projects/ui/src/app/services/dep-error.service.ts rename to web/projects/ui/src/app/services/dep-error.service.ts diff --git a/frontend/projects/ui/src/app/services/eos.service.ts b/web/projects/ui/src/app/services/eos.service.ts similarity index 100% rename from frontend/projects/ui/src/app/services/eos.service.ts rename to web/projects/ui/src/app/services/eos.service.ts diff --git a/frontend/projects/ui/src/app/services/form-dialog.service.ts b/web/projects/ui/src/app/services/form-dialog.service.ts similarity index 100% rename from frontend/projects/ui/src/app/services/form-dialog.service.ts rename to web/projects/ui/src/app/services/form-dialog.service.ts diff --git a/frontend/projects/ui/src/app/services/form.service.ts b/web/projects/ui/src/app/services/form.service.ts similarity index 100% rename from frontend/projects/ui/src/app/services/form.service.ts rename to web/projects/ui/src/app/services/form.service.ts diff --git a/frontend/projects/ui/src/app/services/marketplace.service.ts b/web/projects/ui/src/app/services/marketplace.service.ts similarity index 100% rename from frontend/projects/ui/src/app/services/marketplace.service.ts rename to web/projects/ui/src/app/services/marketplace.service.ts diff --git a/frontend/projects/ui/src/app/services/patch-data.service.ts b/web/projects/ui/src/app/services/patch-data.service.ts similarity index 100% rename from frontend/projects/ui/src/app/services/patch-data.service.ts rename to web/projects/ui/src/app/services/patch-data.service.ts diff --git a/frontend/projects/ui/src/app/services/patch-db/data-model.ts b/web/projects/ui/src/app/services/patch-db/data-model.ts similarity index 100% rename from frontend/projects/ui/src/app/services/patch-db/data-model.ts rename to web/projects/ui/src/app/services/patch-db/data-model.ts diff --git a/frontend/projects/ui/src/app/services/patch-db/local-storage-bootstrap.ts b/web/projects/ui/src/app/services/patch-db/local-storage-bootstrap.ts similarity index 100% rename from frontend/projects/ui/src/app/services/patch-db/local-storage-bootstrap.ts rename to web/projects/ui/src/app/services/patch-db/local-storage-bootstrap.ts diff --git a/frontend/projects/ui/src/app/services/patch-db/patch-db.factory.ts b/web/projects/ui/src/app/services/patch-db/patch-db.factory.ts similarity index 100% rename from frontend/projects/ui/src/app/services/patch-db/patch-db.factory.ts rename to web/projects/ui/src/app/services/patch-db/patch-db.factory.ts diff --git a/frontend/projects/ui/src/app/services/patch-db/patch-db.module.ts b/web/projects/ui/src/app/services/patch-db/patch-db.module.ts similarity index 100% rename from frontend/projects/ui/src/app/services/patch-db/patch-db.module.ts rename to web/projects/ui/src/app/services/patch-db/patch-db.module.ts diff --git a/frontend/projects/ui/src/app/services/patch-monitor.service.ts b/web/projects/ui/src/app/services/patch-monitor.service.ts similarity index 100% rename from frontend/projects/ui/src/app/services/patch-monitor.service.ts rename to web/projects/ui/src/app/services/patch-monitor.service.ts diff --git a/frontend/projects/ui/src/app/services/pkg-status-rendering.service.ts b/web/projects/ui/src/app/services/pkg-status-rendering.service.ts similarity index 100% rename from frontend/projects/ui/src/app/services/pkg-status-rendering.service.ts rename to web/projects/ui/src/app/services/pkg-status-rendering.service.ts diff --git a/frontend/projects/ui/src/app/services/proxy.service.ts b/web/projects/ui/src/app/services/proxy.service.ts similarity index 100% rename from frontend/projects/ui/src/app/services/proxy.service.ts rename to web/projects/ui/src/app/services/proxy.service.ts diff --git a/frontend/projects/ui/src/app/services/split-pane.service.ts b/web/projects/ui/src/app/services/split-pane.service.ts similarity index 100% rename from frontend/projects/ui/src/app/services/split-pane.service.ts rename to web/projects/ui/src/app/services/split-pane.service.ts diff --git a/frontend/projects/ui/src/app/services/storage.service.ts b/web/projects/ui/src/app/services/storage.service.ts similarity index 100% rename from frontend/projects/ui/src/app/services/storage.service.ts rename to web/projects/ui/src/app/services/storage.service.ts diff --git a/frontend/projects/ui/src/app/services/theme-switcher.service.ts b/web/projects/ui/src/app/services/theme-switcher.service.ts similarity index 100% rename from frontend/projects/ui/src/app/services/theme-switcher.service.ts rename to web/projects/ui/src/app/services/theme-switcher.service.ts diff --git a/frontend/projects/ui/src/app/services/time-service.ts b/web/projects/ui/src/app/services/time-service.ts similarity index 100% rename from frontend/projects/ui/src/app/services/time-service.ts rename to web/projects/ui/src/app/services/time-service.ts diff --git a/frontend/projects/ui/src/app/types/dependent-info.ts b/web/projects/ui/src/app/types/dependent-info.ts similarity index 100% rename from frontend/projects/ui/src/app/types/dependent-info.ts rename to web/projects/ui/src/app/types/dependent-info.ts diff --git a/frontend/projects/ui/src/app/types/pkg-info.ts b/web/projects/ui/src/app/types/pkg-info.ts similarity index 100% rename from frontend/projects/ui/src/app/types/pkg-info.ts rename to web/projects/ui/src/app/types/pkg-info.ts diff --git a/frontend/projects/ui/src/app/types/progress-data.ts b/web/projects/ui/src/app/types/progress-data.ts similarity index 100% rename from frontend/projects/ui/src/app/types/progress-data.ts rename to web/projects/ui/src/app/types/progress-data.ts diff --git a/frontend/projects/ui/src/app/util/animations.ts b/web/projects/ui/src/app/util/animations.ts similarity index 100% rename from frontend/projects/ui/src/app/util/animations.ts rename to web/projects/ui/src/app/util/animations.ts diff --git a/frontend/projects/ui/src/app/util/clearnetAddress.ts b/web/projects/ui/src/app/util/clearnetAddress.ts similarity index 100% rename from frontend/projects/ui/src/app/util/clearnetAddress.ts rename to web/projects/ui/src/app/util/clearnetAddress.ts diff --git a/frontend/projects/ui/src/app/util/config-utilities.ts b/web/projects/ui/src/app/util/config-utilities.ts similarity index 100% rename from frontend/projects/ui/src/app/util/config-utilities.ts rename to web/projects/ui/src/app/util/config-utilities.ts diff --git a/frontend/projects/ui/src/app/util/configBuilderToSpec.ts b/web/projects/ui/src/app/util/configBuilderToSpec.ts similarity index 100% rename from frontend/projects/ui/src/app/util/configBuilderToSpec.ts rename to web/projects/ui/src/app/util/configBuilderToSpec.ts diff --git a/frontend/projects/ui/src/app/util/countries.json b/web/projects/ui/src/app/util/countries.json similarity index 100% rename from frontend/projects/ui/src/app/util/countries.json rename to web/projects/ui/src/app/util/countries.json diff --git a/frontend/projects/ui/src/app/util/dry-update.ts b/web/projects/ui/src/app/util/dry-update.ts similarity index 100% rename from frontend/projects/ui/src/app/util/dry-update.ts rename to web/projects/ui/src/app/util/dry-update.ts diff --git a/frontend/projects/ui/src/app/util/get-package-data.ts b/web/projects/ui/src/app/util/get-package-data.ts similarity index 100% rename from frontend/projects/ui/src/app/util/get-package-data.ts rename to web/projects/ui/src/app/util/get-package-data.ts diff --git a/frontend/projects/ui/src/app/util/get-package-info.ts b/web/projects/ui/src/app/util/get-package-info.ts similarity index 100% rename from frontend/projects/ui/src/app/util/get-package-info.ts rename to web/projects/ui/src/app/util/get-package-info.ts diff --git a/frontend/projects/ui/src/app/util/get-project-id.ts b/web/projects/ui/src/app/util/get-project-id.ts similarity index 100% rename from frontend/projects/ui/src/app/util/get-project-id.ts rename to web/projects/ui/src/app/util/get-project-id.ts diff --git a/frontend/projects/ui/src/app/util/get-server-info.ts b/web/projects/ui/src/app/util/get-server-info.ts similarity index 100% rename from frontend/projects/ui/src/app/util/get-server-info.ts rename to web/projects/ui/src/app/util/get-server-info.ts diff --git a/frontend/projects/ui/src/app/util/has-deps.ts b/web/projects/ui/src/app/util/has-deps.ts similarity index 100% rename from frontend/projects/ui/src/app/util/has-deps.ts rename to web/projects/ui/src/app/util/has-deps.ts diff --git a/frontend/projects/ui/src/app/util/mask.ts b/web/projects/ui/src/app/util/mask.ts similarity index 100% rename from frontend/projects/ui/src/app/util/mask.ts rename to web/projects/ui/src/app/util/mask.ts diff --git a/frontend/projects/ui/src/app/util/package-loading-progress.ts b/web/projects/ui/src/app/util/package-loading-progress.ts similarity index 100% rename from frontend/projects/ui/src/app/util/package-loading-progress.ts rename to web/projects/ui/src/app/util/package-loading-progress.ts diff --git a/frontend/projects/ui/src/app/util/rxjs.util.ts b/web/projects/ui/src/app/util/rxjs.util.ts similarity index 100% rename from frontend/projects/ui/src/app/util/rxjs.util.ts rename to web/projects/ui/src/app/util/rxjs.util.ts diff --git a/frontend/projects/ui/src/app/util/web.util.ts b/web/projects/ui/src/app/util/web.util.ts similarity index 100% rename from frontend/projects/ui/src/app/util/web.util.ts rename to web/projects/ui/src/app/util/web.util.ts diff --git a/frontend/projects/ui/src/environments/environment.prod.ts b/web/projects/ui/src/environments/environment.prod.ts similarity index 100% rename from frontend/projects/ui/src/environments/environment.prod.ts rename to web/projects/ui/src/environments/environment.prod.ts diff --git a/frontend/projects/ui/src/environments/environment.ts b/web/projects/ui/src/environments/environment.ts similarity index 100% rename from frontend/projects/ui/src/environments/environment.ts rename to web/projects/ui/src/environments/environment.ts diff --git a/frontend/projects/ui/src/globals.d.ts b/web/projects/ui/src/globals.d.ts similarity index 100% rename from frontend/projects/ui/src/globals.d.ts rename to web/projects/ui/src/globals.d.ts diff --git a/frontend/projects/ui/src/index.html b/web/projects/ui/src/index.html similarity index 100% rename from frontend/projects/ui/src/index.html rename to web/projects/ui/src/index.html diff --git a/frontend/projects/ui/src/main.ts b/web/projects/ui/src/main.ts similarity index 100% rename from frontend/projects/ui/src/main.ts rename to web/projects/ui/src/main.ts diff --git a/frontend/projects/ui/src/manifest.webmanifest b/web/projects/ui/src/manifest.webmanifest similarity index 100% rename from frontend/projects/ui/src/manifest.webmanifest rename to web/projects/ui/src/manifest.webmanifest diff --git a/frontend/projects/ui/src/polyfills.ts b/web/projects/ui/src/polyfills.ts similarity index 100% rename from frontend/projects/ui/src/polyfills.ts rename to web/projects/ui/src/polyfills.ts diff --git a/frontend/projects/ui/src/styles.scss b/web/projects/ui/src/styles.scss similarity index 100% rename from frontend/projects/ui/src/styles.scss rename to web/projects/ui/src/styles.scss diff --git a/frontend/projects/ui/src/zone-flags.ts b/web/projects/ui/src/zone-flags.ts similarity index 100% rename from frontend/projects/ui/src/zone-flags.ts rename to web/projects/ui/src/zone-flags.ts diff --git a/frontend/projects/ui/tsconfig.json b/web/projects/ui/tsconfig.json similarity index 100% rename from frontend/projects/ui/tsconfig.json rename to web/projects/ui/tsconfig.json diff --git a/frontend/proxy.conf-sample.json b/web/proxy.conf-sample.json similarity index 100% rename from frontend/proxy.conf-sample.json rename to web/proxy.conf-sample.json diff --git a/frontend/tsconfig.json b/web/tsconfig.json similarity index 100% rename from frontend/tsconfig.json rename to web/tsconfig.json diff --git a/frontend/tsconfig.lib.json b/web/tsconfig.lib.json similarity index 100% rename from frontend/tsconfig.lib.json rename to web/tsconfig.lib.json diff --git a/frontend/tslint.json b/web/tslint.json similarity index 100% rename from frontend/tslint.json rename to web/tslint.json From 0ae3e83ce41a387bba2804e13ba509c051cb91d2 Mon Sep 17 00:00:00 2001 From: Matt Hill Date: Mon, 13 Nov 2023 16:21:14 -0700 Subject: [PATCH 034/169] fix makefile --- Makefile | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 6e5108d9e..72c546790 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ PLATFORM := $(shell if [ -f ./PLATFORM.txt ]; then cat ./PLATFORM.txt; else echo ARCH := $(shell if [ "$(PLATFORM)" = "raspberrypi" ]; then echo aarch64; else echo $(PLATFORM) | sed 's/-nonfree$$//g'; fi) IMAGE_TYPE=$(shell if [ "$(PLATFORM)" = raspberrypi ]; then echo img; else echo iso; fi) BINS := core/target/$(ARCH)-unknown-linux-gnu/release/startbox core/target/aarch64-unknown-linux-musl/release/container-init core/target/x86_64-unknown-linux-musl/release/container-init -WEB_UIS := web/dist/raw/ui web/dist/raw/setup-wizard web/dist/raw/diagnostic-ui web/dist/raw/install-wizard +WEB_UIS := web/dist/raw/ui web/dist/raw/setup-wizard web/dist/raw/install-wizard BUILD_SRC := $(shell git ls-files build) build/lib/depends build/lib/conflicts DEBIAN_SRC := $(shell git ls-files debian/) IMAGE_RECIPE_SRC := $(shell git ls-files image-recipe/) @@ -19,7 +19,6 @@ CORE_SRC := $(shell git ls-files core) $(shell git ls-files --recurse-submodules WEB_SHARED_SRC := $(shell git ls-files web/projects/shared) $(shell ls -p web/ | grep -v / | sed 's/^/web\//g') web/node_modules web/config.json patch-db/client/dist web/patchdb-ui-seed.json WEB_UI_SRC := $(shell git ls-files web/projects/ui) WEB_SETUP_WIZARD_SRC := $(shell git ls-files web/projects/setup-wizard) -WEB_DIAGNOSTIC_UI_SRC := $(shell git ls-files web/projects/diagnostic-ui) WEB_INSTALL_WIZARD_SRC := $(shell git ls-files web/projects/install-wizard) PATCH_DB_CLIENT_SRC := $(shell git ls-files --recurse-submodules patch-db/client) GZIP_BIN := $(shell which pigz || which gzip) @@ -192,9 +191,6 @@ web/dist/raw/ui: $(WEB_UI_SRC) $(WEB_SHARED_SRC) web/dist/raw/setup-wizard: $(WEB_SETUP_WIZARD_SRC) $(WEB_SHARED_SRC) npm --prefix web run build:setup -web/dist/raw/diagnostic-ui: $(WEB_DIAGNOSTIC_UI_SRC) $(WEB_SHARED_SRC) - npm --prefix web run build:dui - web/dist/raw/install-wizard: $(WEB_INSTALL_WIZARD_SRC) $(WEB_SHARED_SRC) npm --prefix web run build:install From 0e2fc07881847157599127858304ee325bc561b0 Mon Sep 17 00:00:00 2001 From: Aiden McClelland Date: Mon, 13 Nov 2023 16:22:35 -0700 Subject: [PATCH 035/169] remove js-engine --- core/Cargo.lock | 22 - core/Cargo.toml | 9 +- core/js-engine/Cargo.toml | 23 - .../src/artifacts/JS_SNAPSHOT.aarch64.bin | Bin 547549 -> 0 bytes .../src/artifacts/JS_SNAPSHOT.x86_64.bin | Bin 493225 -> 0 bytes core/js-engine/src/artifacts/loadModule.js | 242 ---- core/js-engine/src/lib.rs | 1219 ----------------- core/startos/Cargo.toml | 3 +- core/startos/src/bins/mod.rs | 4 - core/startos/src/procedure/js_scripts.rs | 43 - core/startos/src/procedure/mod.rs | 6 - core/startos/src/s9pk/builder.rs | 145 -- core/startos/src/s9pk/docker.rs | 95 -- core/startos/src/s9pk/git_hash.rs | 41 - core/startos/src/s9pk/header.rs | 187 --- core/startos/src/s9pk/manifest.rs | 211 --- core/startos/src/s9pk/reader.rs | 406 ------ core/startos/src/s9pk/specv2.md | 28 - core/startos/src/s9pk/v1/reader.rs | 10 - 19 files changed, 2 insertions(+), 2692 deletions(-) delete mode 100644 core/js-engine/Cargo.toml delete mode 100644 core/js-engine/src/artifacts/JS_SNAPSHOT.aarch64.bin delete mode 100644 core/js-engine/src/artifacts/JS_SNAPSHOT.x86_64.bin delete mode 100644 core/js-engine/src/artifacts/loadModule.js delete mode 100644 core/js-engine/src/lib.rs delete mode 100644 core/startos/src/s9pk/builder.rs delete mode 100644 core/startos/src/s9pk/docker.rs delete mode 100644 core/startos/src/s9pk/git_hash.rs delete mode 100644 core/startos/src/s9pk/header.rs delete mode 100644 core/startos/src/s9pk/manifest.rs delete mode 100644 core/startos/src/s9pk/reader.rs delete mode 100644 core/startos/src/s9pk/specv2.md diff --git a/core/Cargo.lock b/core/Cargo.lock index 8a6c1dd5c..3c3b693a2 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -2560,27 +2560,6 @@ dependencies = [ "time", ] -[[package]] -name = "js-engine" -version = "0.1.0" -dependencies = [ - "async-trait", - "container-init", - "dashmap", - "deno_ast", - "deno_core", - "helpers", - "itertools 0.11.0", - "lazy_static", - "models", - "reqwest", - "serde", - "serde_json", - "sha2 0.10.8", - "tokio", - "tracing", -] - [[package]] name = "js-sys" version = "0.3.65" @@ -4995,7 +4974,6 @@ dependencies = [ "jaq-core", "jaq-std", "josekit", - "js-engine", "jsonpath_lib", "lazy_static", "libc", diff --git a/core/Cargo.toml b/core/Cargo.toml index 894362522..143a830fc 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -1,10 +1,3 @@ [workspace] -members = [ - "container-init", - "helpers", - "js-engine", - "models", - "snapshot-creator", - "startos", -] +members = ["container-init", "helpers", "models", "snapshot-creator", "startos"] diff --git a/core/js-engine/Cargo.toml b/core/js-engine/Cargo.toml deleted file mode 100644 index 14205109b..000000000 --- a/core/js-engine/Cargo.toml +++ /dev/null @@ -1,23 +0,0 @@ -[package] -name = "js-engine" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -async-trait = "0.1.74" -dashmap = "5.5.3" -deno_core = "=0.222.0" -deno_ast = { version = "=0.29.5", features = ["transpiling"] } -container-init = { path = "../container-init" } -reqwest = { version = "0.11.22" } -sha2 = "0.10.8" -itertools = "0.11.0" -lazy_static = "1.4.0" -models = { path = "../models" } -helpers = { path = "../helpers" } -serde = { version = "1.0", features = ["derive", "rc"] } -serde_json = "1.0" -tokio = { version = "1", features = ["full"] } -tracing = "0.1" diff --git a/core/js-engine/src/artifacts/JS_SNAPSHOT.aarch64.bin b/core/js-engine/src/artifacts/JS_SNAPSHOT.aarch64.bin deleted file mode 100644 index 305aa2d4cb7922ecf830fd7131b70087418bebd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 547549 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%0AGZyhwiB{T=s#RV`58P! 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 Um+J;v_1sa6xN@WfdoK9-A1@}8+W-In diff --git a/core/js-engine/src/artifacts/JS_SNAPSHOT.x86_64.bin b/core/js-engine/src/artifacts/JS_SNAPSHOT.x86_64.bin deleted file mode 100644 index 7f7d106897416a1875ee2ab96c7a5ea07f5d9871..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 493225 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 z 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 Deno.core.opAsync("write_file", volumeId, path, toWrite); - -const readFile = ( - { volumeId = requireParam("volumeId"), path = requireParam("path") } = requireParam("options"), -) => Deno.core.opAsync("read_file", volumeId, path); - - - -const runDaemon = ( - { command = requireParam("command"), args = [] } = requireParam("options"), -) => { - let id = Deno.core.opAsync("start_command", command, args, "inherit", null); - let processId = id.then(x => x.processId) - let waitPromise = null; - return { - processId, - async wait() { - waitPromise = waitPromise || Deno.core.opAsync("wait_command", await processId) - return waitPromise - }, - async term(signal = 15) { - return Deno.core.opAsync("send_signal", await processId, 15) - } - } -}; -const runCommand = async ( - { command = requireParam("command"), args = [], timeoutMillis = 30000 } = requireParam("options"), -) => { - let id = Deno.core.opAsync("start_command", command, args, "collect", timeoutMillis); - let pid = id.then(x => x.processId) - return Deno.core.opAsync("wait_command", await pid) -}; -const signalGroup = async ( - { gid = requireParam("gid"), signal = requireParam("signal") } = requireParam("gid and signal") -) => { - return Deno.core.opAsync("signal_group", gid, signal); -}; -const sleep = (timeMs = requireParam("timeMs"), -) => Deno.core.opAsync("sleep", timeMs); - -const rename = ( - { - srcVolume = requireParam("srcVolume"), - dstVolume = requirePapram("dstVolume"), - srcPath = requireParam("srcPath"), - dstPath = requireParam("dstPath"), - } = requireParam("options"), -) => Deno.core.opAsync("rename", srcVolume, srcPath, dstVolume, dstPath); -const metadata = async ( - { volumeId = requireParam("volumeId"), path = requireParam("path") } = requireParam("options"), -) => { - const data = await Deno.core.opAsync("metadata", volumeId, path); - return { - ...data, - modified: maybeDate(data.modified), - created: maybeDate(data.created), - accessed: maybeDate(data.accessed), - }; -}; -const removeFile = ( - { volumeId = requireParam("volumeId"), path = requireParam("path") } = requireParam("options"), -) => Deno.core.opAsync("remove_file", volumeId, path); -const isSandboxed = () => Deno.core.ops["is_sandboxed"](); - -const writeJsonFile = ( - { - volumeId = requireParam("volumeId"), - path = requireParam("path"), - toWrite = requireParam("toWrite"), - } = requireParam("options"), -) => - writeFile({ - volumeId, - path, - toWrite: JSON.stringify(toWrite), - }); - -const chown = async ( - { - volumeId = requireParam("volumeId"), - path = requireParam("path"), - uid = requireParam("uid"), - } = requireParam("options"), -) => { - return await Deno.core.opAsync("chown", volumeId, path, uid); -}; - -const chmod = async ( - { - volumeId = requireParam("volumeId"), - path = requireParam("path"), - mode = requireParam("mode"), - } = requireParam("options"), -) => { - return await Deno.core.opAsync("chmod", volumeId, path, mode); -}; -const readJsonFile = async ( - { volumeId = requireParam("volumeId"), path = requireParam("path") } = requireParam("options"), -) => JSON.parse(await readFile({ volumeId, path })); -const createDir = ( - { volumeId = requireParam("volumeId"), path = requireParam("path") } = requireParam("options"), -) => Deno.core.opAsync("create_dir", volumeId, path); - -const readDir = ( - { volumeId = requireParam("volumeId"), path = requireParam("path") } = requireParam("options"), -) => Deno.core.opAsync("read_dir", volumeId, path); -const removeDir = ( - { volumeId = requireParam("volumeId"), path = requireParam("path") } = requireParam("options"), -) => Deno.core.opAsync("remove_dir", volumeId, path); -const trace = (whatToTrace = requireParam('whatToTrace')) => Deno.core.opAsync("log_trace", whatToTrace); -const warn = (whatToTrace = requireParam('whatToTrace')) => Deno.core.opAsync("log_warn", whatToTrace); -const error = (whatToTrace = requireParam('whatToTrace')) => Deno.core.opAsync("log_error", whatToTrace); -const debug = (whatToTrace = requireParam('whatToTrace')) => Deno.core.opAsync("log_debug", whatToTrace); -const info = (whatToTrace = requireParam('whatToTrace')) => Deno.core.opAsync("log_info", whatToTrace); -const fetch = async (url = requireParam ('url'), options = null) => { - const { body, ...response } = await Deno.core.opAsync("fetch", url, options); - const textValue = Promise.resolve(body); - return { - ...response, - text() { - return textValue; - }, - json() { - return textValue.then((x) => JSON.parse(x)); - }, - }; -}; - -const runRsync = ( - { - srcVolume = requireParam("srcVolume"), - dstVolume = requireParam("dstVolume"), - srcPath = requireParam("srcPath"), - dstPath = requireParam("dstPath"), - options = requireParam("options"), - } = requireParam("options"), -) => { - let id = Deno.core.opAsync("rsync", srcVolume, srcPath, dstVolume, dstPath, options); - let waitPromise = null; - return { - async id() { - return id - }, - async wait() { - waitPromise = waitPromise || Deno.core.opAsync("rsync_wait", await id) - return waitPromise - }, - async progress() { - return Deno.core.opAsync("rsync_progress", await id) - } - } -}; - -const diskUsage = async ({ - volumeId = requireParam("volumeId"), - path = requireParam("path"), -} = { volumeId: null, path: null }) => { - const [used, total] = await Deno.core.opAsync("disk_usage", volumeId, path); - return { used, total } -} - -const currentFunction = Deno.core.ops.current_function(); -const input = Deno.core.ops.get_input(); -const variable_args = Deno.core.ops.get_variable_args(); -const setState = (x) => Deno.core.ops.set_value(x); -const effects = { - chmod, - chown, - writeFile, - readFile, - writeJsonFile, - readJsonFile, - error, - warn, - debug, - trace, - info, - isSandboxed, - fetch, - removeFile, - createDir, - removeDir, - metadata, - rename, - runCommand, - sleep, - runDaemon, - signalGroup, - runRsync, - readDir, - diskUsage, -}; - -const defaults = { - "handleSignal": (effects, { gid, signal }) => { - return effects.signalGroup({ gid, signal }) - } -} - -const runFunction = jsonPointerValue(mainModule, currentFunction) || jsonPointerValue(defaults, currentFunction); -(async () => { - if (typeof runFunction !== "function") { - error(`Expecting ${currentFunction} to be a function`); - throw new Error(`Expecting ${currentFunction} to be a function`); - } - const answer = await runFunction(effects, input, ...variable_args); - setState(answer); -})(); diff --git a/core/js-engine/src/lib.rs b/core/js-engine/src/lib.rs deleted file mode 100644 index b0b9bea37..000000000 --- a/core/js-engine/src/lib.rs +++ /dev/null @@ -1,1219 +0,0 @@ -use std::collections::BTreeMap; -use std::path::{Path, PathBuf}; -use std::pin::Pin; -use std::sync::Arc; -use std::time::SystemTime; - -use deno_core::anyhow::{anyhow, bail}; -use deno_core::error::AnyError; -use deno_core::{ - resolve_import, Extension, FastString, JsRuntime, ModuleLoader, ModuleSource, - ModuleSourceFuture, ModuleSpecifier, ModuleType, OpDecl, ResolutionKind, RuntimeOptions, - Snapshot, -}; -use helpers::{script_dir, spawn_local, Rsync}; -use models::{PackageId, ProcedureName, Version, VolumeId}; -use serde::{Deserialize, Serialize}; -use serde_json::Value; -use tokio::io::AsyncReadExt; -use tokio::sync::Mutex; - -lazy_static::lazy_static! { - static ref DENO_GLOBAL_JS: ModuleSpecifier = "file:///deno_global.js".parse().unwrap(); - static ref LOAD_MODULE_JS: ModuleSpecifier = "file:///loadModule.js".parse().unwrap(); - static ref EMBASSY_JS: ModuleSpecifier = "file:///embassy.js".parse().unwrap(); -} - -pub trait PathForVolumeId: Send + Sync { - fn path_for( - &self, - data_dir: &Path, - package_id: &PackageId, - version: &Version, - volume_id: &VolumeId, - ) -> Option; - fn readonly(&self, volume_id: &VolumeId) -> bool; -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct JsCode(Arc); - -#[derive(Debug, Clone, Copy)] -pub enum JsError { - Unknown, - Javascript, - Engine, - BoundryLayerSerDe, - Tokio, - FileSystem, - Code(i32), - Timeout, - NotValidProcedureName, -} - -impl JsError { - pub fn as_code_num(&self) -> i32 { - match self { - JsError::Unknown => 1, - JsError::Javascript => 2, - JsError::Engine => 3, - JsError::BoundryLayerSerDe => 4, - JsError::Tokio => 5, - JsError::FileSystem => 6, - JsError::NotValidProcedureName => 7, - JsError::Code(code) => *code, - JsError::Timeout => 143, - } - } -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct MetadataJs { - file_type: String, - is_dir: bool, - is_file: bool, - is_symlink: bool, - len: u64, - modified: Option, - accessed: Option, - created: Option, - readonly: bool, - gid: u32, - mode: u32, - uid: u32, -} - -#[cfg(target_arch = "x86_64")] -const SNAPSHOT_BYTES: &[u8] = include_bytes!("./artifacts/JS_SNAPSHOT.x86_64.bin"); - -#[cfg(target_arch = "aarch64")] -const SNAPSHOT_BYTES: &[u8] = include_bytes!("./artifacts/JS_SNAPSHOT.aarch64.bin"); - -#[derive(Clone)] -struct JsContext { - sandboxed: bool, - datadir: PathBuf, - run_function: String, - version: Version, - package_id: PackageId, - volumes: Arc, - input: Value, - variable_args: Vec, - rsyncs: Arc)>>, -} -#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] -#[serde(rename_all = "kebab-case")] -enum ResultType { - Error(String), - ErrorCode(i32, String), - Result(serde_json::Value), -} -#[derive(Clone, Default)] -struct AnswerState(std::sync::Arc>); - -#[derive(Clone, Debug)] -struct ModsLoader { - code: JsCode, -} - -impl ModuleLoader for ModsLoader { - fn resolve( - &self, - specifier: &str, - referrer: &str, - _is_main: ResolutionKind, - ) -> Result { - if referrer.contains("embassy") { - bail!("Embassy.js cannot import anything else"); - } - let s = resolve_import(specifier, referrer).unwrap(); - Ok(s) - } - - fn load( - &self, - module_specifier: &ModuleSpecifier, - maybe_referrer: Option<&ModuleSpecifier>, - is_dyn_import: bool, - ) -> Pin> { - let module_specifier = module_specifier.as_str().to_owned(); - let module = match &*module_specifier { - "file:///deno_global.js" => Ok(ModuleSource::new( - ModuleType::JavaScript, - FastString::Static("const old_deno = Deno; Deno = null; export default old_deno"), - &DENO_GLOBAL_JS, - )), - "file:///loadModule.js" => Ok(ModuleSource::new( - ModuleType::JavaScript, - FastString::Static(include_str!("./artifacts/loadModule.js")), - &LOAD_MODULE_JS, - )), - "file:///embassy.js" => Ok(ModuleSource::new( - ModuleType::JavaScript, - self.code.0.clone().into(), - &EMBASSY_JS, - )), - - x => Err(anyhow!("Not allowed to import: {}", x)), - }; - let module = module.and_then(|m| { - if is_dyn_import { - bail!("Will not import dynamic"); - } - match &maybe_referrer { - Some(x) if x.as_str() == "file:///embassy.js" => { - bail!("StartJS is not allowed to import") - } - _ => (), - } - Ok(m) - }); - Box::pin(async move { module }) - } -} - -pub struct JsExecutionEnvironment { - sandboxed: bool, - base_directory: PathBuf, - module_loader: ModsLoader, - package_id: PackageId, - version: Version, - volumes: Arc, -} - -impl JsExecutionEnvironment { - pub async fn load_from_package( - data_directory: impl AsRef, - package_id: &PackageId, - version: &Version, - volumes: Box, - ) -> Result { - let data_dir = data_directory.as_ref(); - let base_directory = data_dir; - let js_code = JsCode({ - let file_path = script_dir(data_dir, package_id, version).join("embassy.js"); - let mut file = match tokio::fs::File::open(file_path.clone()).await { - Ok(x) => x, - Err(e) => { - tracing::debug!("path: {:?}", file_path); - tracing::debug!("{:?}", e); - return Err(( - JsError::FileSystem, - format!("The file opening '{:?}' created error: {}", file_path, e), - )); - } - }; - let mut buffer = Default::default(); - if let Err(err) = file.read_to_string(&mut buffer).await { - tracing::debug!("{:?}", err); - return Err(( - JsError::FileSystem, - format!("The file reading created error: {}", err), - )); - }; - buffer.into() - }); - Ok(JsExecutionEnvironment { - base_directory: base_directory.to_owned(), - module_loader: ModsLoader { code: js_code }, - package_id: package_id.clone(), - version: version.clone(), - volumes: volumes.into(), - sandboxed: false, - }) - } - pub fn read_only_effects(mut self) -> Self { - self.sandboxed = true; - self - } - - pub async fn run_action Deserialize<'de>>( - self, - procedure_name: ProcedureName, - input: Option, - variable_args: Vec, - ) -> Result { - let input = match serde_json::to_value(input) { - Ok(a) => a, - Err(err) => { - tracing::error!("{}", err); - tracing::debug!("{:?}", err); - return Err(( - JsError::BoundryLayerSerDe, - "Couldn't convert input".to_string(), - )); - } - }; - let safer_handle = spawn_local(|| self.execute(procedure_name, input, variable_args)).await; - let output = safer_handle.await.unwrap()?; - match serde_json::from_value(output.clone()) { - Ok(x) => Ok(x), - Err(err) => { - tracing::error!("{}", err); - tracing::debug!("{:?}", err); - Err(( - JsError::BoundryLayerSerDe, - format!( - "Couldn't convert output = {:#?} to the correct type", - serde_json::to_string_pretty(&output).unwrap_or_default() - ), - )) - } - } - } - fn declarations() -> Vec { - vec![ - fns::chown::decl(), - fns::chmod::decl(), - fns::fetch::decl(), - fns::read_file::decl(), - fns::metadata::decl(), - fns::write_file::decl(), - fns::rename::decl(), - fns::remove_file::decl(), - fns::create_dir::decl(), - fns::remove_dir::decl(), - fns::read_dir::decl(), - fns::disk_usage::decl(), - fns::current_function::decl(), - fns::log_trace::decl(), - fns::log_warn::decl(), - fns::log_error::decl(), - fns::log_debug::decl(), - fns::log_info::decl(), - fns::get_input::decl(), - fns::get_variable_args::decl(), - fns::set_value::decl(), - fns::is_sandboxed::decl(), - fns::sleep::decl(), - fns::rsync::decl(), - fns::rsync_wait::decl(), - fns::rsync_progress::decl(), - ] - } - - async fn execute( - self, - procedure_name: ProcedureName, - input: Value, - variable_args: Vec, - ) -> Result { - let base_directory = self.base_directory.clone(); - let answer_state = AnswerState::default(); - let ext_answer_state = answer_state.clone(); - let js_ctx = JsContext { - datadir: base_directory, - run_function: procedure_name - .js_function_name() - .map(Ok) - .unwrap_or_else(|| { - Err(( - JsError::NotValidProcedureName, - format!("procedure is not value: {:?}", procedure_name), - )) - })?, - package_id: self.package_id.clone(), - volumes: self.volumes.clone(), - version: self.version.clone(), - sandboxed: self.sandboxed, - input, - variable_args, - rsyncs: Default::default(), - }; - let ext = Extension::builder("embassy") - .ops(Self::declarations()) - .state(move |state| { - state.put(ext_answer_state.clone()); - state.put(js_ctx); - }) - .build(); - - let loader = std::rc::Rc::new(self.module_loader.clone()); - let runtime_options = RuntimeOptions { - module_loader: Some(loader), - extensions: vec![ext], - startup_snapshot: Some(Snapshot::Static(SNAPSHOT_BYTES)), - ..Default::default() - }; - let mut runtime = JsRuntime::new(runtime_options); - - let future = async move { - let mod_id = runtime - .load_main_module(&"file:///loadModule.js".parse().unwrap(), None) - .await?; - let evaluated = runtime.mod_evaluate(mod_id); - let res = runtime.run_event_loop(false).await; - res?; - evaluated.await??; - Ok::<_, AnyError>(()) - }; - - future.await.map_err(|e| { - tracing::debug!("{:?}", e); - (JsError::Javascript, format!("{}", e)) - })?; - - let answer = answer_state.0.lock().clone(); - Ok(answer) - } -} - -/// Note: Make sure that we have the assumption that all these methods are callable at any time, and all call restrictions should be in rust -mod fns { - use std::cell::RefCell; - use std::collections::BTreeMap; - use std::convert::TryFrom; - use std::fs::Permissions; - use std::os::unix::fs::MetadataExt; - use std::os::unix::prelude::PermissionsExt; - use std::path::{Path, PathBuf}; - use std::rc::Rc; - use std::time::Duration; - - use container_init::ProcessId; - use deno_core::anyhow::{anyhow, bail}; - use deno_core::error::AnyError; - use deno_core::*; - use helpers::{to_tmp_path, AtomicFile, Rsync, RsyncOptions}; - use itertools::Itertools; - use models::VolumeId; - use serde::{Deserialize, Serialize}; - use serde_json::Value; - use tokio::io::AsyncWriteExt; - use tokio::process::Command; - - use super::{AnswerState, JsContext}; - use crate::{system_time_as_unix_ms, MetadataJs}; - - #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, Default)] - struct FetchOptions { - method: Option, - headers: Option>, - body: Option, - } - #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, Default)] - struct FetchResponse { - method: String, - ok: bool, - status: u32, - headers: BTreeMap, - body: Option, - } - #[op] - async fn fetch( - state: Rc>, - url: url::Url, - options: Option, - ) -> Result { - let sandboxed = { - let state = state.borrow(); - let ctx: &JsContext = state.borrow(); - ctx.sandboxed - }; - - if sandboxed { - bail!("Will not run fetch in sandboxed mode"); - } - - let client = reqwest::Client::new(); - let options = options.unwrap_or_default(); - let method = options - .method - .unwrap_or_else(|| "GET".to_string()) - .to_uppercase(); - let mut request_builder = match &*method { - "GET" => client.get(url), - "POST" => client.post(url), - "PUT" => client.put(url), - "DELETE" => client.delete(url), - "HEAD" => client.head(url), - "PATCH" => client.patch(url), - x => bail!("Unsupported method: {}", x), - }; - if let Some(headers) = options.headers { - for (key, value) in headers { - request_builder = request_builder.header(key, value); - } - } - if let Some(body) = options.body { - request_builder = request_builder.body(body); - } - let response = request_builder.send().await?; - - let fetch_response = FetchResponse { - method, - ok: response.status().is_success(), - status: response.status().as_u16() as u32, - headers: response - .headers() - .iter() - .filter_map(|(head, value)| { - Some((format!("{}", head), value.to_str().ok()?.to_string())) - }) - .collect(), - body: response.text().await.ok(), - }; - - Ok(fetch_response) - } - - #[op] - async fn read_file( - state: Rc>, - volume_id: VolumeId, - path_in: PathBuf, - ) -> Result { - let volume_path = { - let state = state.borrow(); - let ctx: &JsContext = state.borrow(); - ctx.volumes - .path_for(&ctx.datadir, &ctx.package_id, &ctx.version, &volume_id) - .ok_or_else(|| anyhow!("There is no {} in volumes", volume_id))? - }; - //get_path_for in volume.rs - let path_in = path_in.strip_prefix("/").unwrap_or(&path_in); - let new_file = volume_path.join(path_in); - if !is_subset(&volume_path, &new_file).await? { - bail!( - "Path '{}' has broken away from parent '{}'", - new_file.to_string_lossy(), - volume_path.to_string_lossy(), - ); - } - let answer = tokio::fs::read_to_string(new_file).await?; - Ok(answer) - } - #[op] - async fn metadata( - state: Rc>, - volume_id: VolumeId, - path_in: PathBuf, - ) -> Result { - let volume_path = { - let state = state.borrow(); - let ctx: &JsContext = state.borrow(); - ctx.volumes - .path_for(&ctx.datadir, &ctx.package_id, &ctx.version, &volume_id) - .ok_or_else(|| anyhow!("There is no {} in volumes", volume_id))? - }; - //get_path_for in volume.rs - let path_in = path_in.strip_prefix("/").unwrap_or(&path_in); - let new_file = volume_path.join(path_in); - if !is_subset(&volume_path, &new_file).await? { - bail!( - "Path '{}' has broken away from parent '{}'", - new_file.to_string_lossy(), - volume_path.to_string_lossy(), - ); - } - let answer = tokio::fs::metadata(new_file).await?; - let metadata_js = MetadataJs { - file_type: format!("{:?}", answer.file_type()), - is_dir: answer.is_dir(), - is_file: answer.is_file(), - is_symlink: answer.is_symlink(), - len: answer.len(), - modified: answer - .modified() - .ok() - .as_ref() - .and_then(system_time_as_unix_ms), - accessed: answer - .accessed() - .ok() - .as_ref() - .and_then(system_time_as_unix_ms), - created: answer - .created() - .ok() - .as_ref() - .and_then(system_time_as_unix_ms), - readonly: answer.permissions().readonly(), - gid: answer.gid(), - mode: answer.mode(), - uid: answer.uid(), - }; - - Ok(metadata_js) - } - #[op] - async fn write_file( - state: Rc>, - volume_id: VolumeId, - path_in: PathBuf, - write: String, - ) -> Result<(), AnyError> { - let (volumes, volume_path) = { - let state = state.borrow(); - let ctx: &JsContext = state.borrow(); - let volume_path = ctx - .volumes - .path_for(&ctx.datadir, &ctx.package_id, &ctx.version, &volume_id) - .ok_or_else(|| anyhow!("There is no {} in volumes", volume_id))?; - (ctx.volumes.clone(), volume_path) - }; - if volumes.readonly(&volume_id) { - bail!("Volume {} is readonly", volume_id); - } - - let path_in = path_in.strip_prefix("/").unwrap_or(&path_in); - let new_file = volume_path.join(path_in); - let parent_new_file = new_file - .parent() - .ok_or_else(|| anyhow!("Expecting that file is not root"))?; - // With the volume check - if !is_subset(&volume_path, &parent_new_file).await? { - bail!( - "Path '{}' has broken away from parent '{}'", - new_file.to_string_lossy(), - volume_path.to_string_lossy(), - ); - } - let new_volume_tmp = to_tmp_path(&volume_path).map_err(|e| anyhow!("{}", e))?; - let hashed_name = { - use std::os::unix::ffi::OsStrExt; - - use sha2::{Digest, Sha256}; - let mut hasher = Sha256::new(); - - hasher.update(path_in.as_os_str().as_bytes()); - let result = hasher.finalize(); - format!("{:X}", result) - }; - let temp_file = new_volume_tmp.join(&hashed_name); - let mut file = AtomicFile::new(&new_file, Some(&temp_file)) - .await - .map_err(|e| anyhow!("{}", e))?; - file.write_all(write.as_bytes()).await?; - file.save().await.map_err(|e| anyhow!("{}", e))?; - Ok(()) - } - #[op] - async fn rename( - state: Rc>, - src_volume: VolumeId, - src_path: PathBuf, - dst_volume: VolumeId, - dst_path: PathBuf, - ) -> Result<(), AnyError> { - let (volumes, volume_path, volume_path_out) = { - let state = state.borrow(); - let ctx: &JsContext = state.borrow(); - let volume_path = ctx - .volumes - .path_for(&ctx.datadir, &ctx.package_id, &ctx.version, &src_volume) - .ok_or_else(|| anyhow!("There is no {} in volumes", src_volume))?; - let volume_path_out = ctx - .volumes - .path_for(&ctx.datadir, &ctx.package_id, &ctx.version, &dst_volume) - .ok_or_else(|| anyhow!("There is no {} in volumes", dst_volume))?; - (ctx.volumes.clone(), volume_path, volume_path_out) - }; - if volumes.readonly(&dst_volume) { - bail!("Volume {} is readonly", dst_volume); - } - - let src_path = src_path.strip_prefix("/").unwrap_or(&src_path); - let old_file = volume_path.join(src_path); - let parent_old_file = old_file - .parent() - .ok_or_else(|| anyhow!("Expecting that file is not root"))?; - // With the volume check - if !is_subset(&volume_path, &parent_old_file).await? { - bail!( - "Path '{}' has broken away from parent '{}'", - old_file.to_string_lossy(), - volume_path.to_string_lossy(), - ); - } - - let dst_path = dst_path.strip_prefix("/").unwrap_or(&dst_path); - let new_file = volume_path_out.join(dst_path); - let parent_new_file = new_file - .parent() - .ok_or_else(|| anyhow!("Expecting that file is not root"))?; - // With the volume check - if !is_subset(&volume_path_out, &parent_new_file).await? { - bail!( - "Path '{}' has broken away from parent '{}'", - new_file.to_string_lossy(), - volume_path_out.to_string_lossy(), - ); - } - tokio::fs::rename(old_file, new_file).await?; - Ok(()) - } - - #[op] - async fn rsync( - state: Rc>, - src_volume: VolumeId, - src_path: PathBuf, - dst_volume: VolumeId, - dst_path: PathBuf, - options: RsyncOptions, - ) -> Result { - let (volumes, volume_path, volume_path_out, rsyncs) = { - let state = state.borrow(); - let ctx: &JsContext = state.borrow(); - let volume_path = ctx - .volumes - .path_for(&ctx.datadir, &ctx.package_id, &ctx.version, &src_volume) - .ok_or_else(|| anyhow!("There is no {} in volumes", src_volume))?; - let volume_path_out = ctx - .volumes - .path_for(&ctx.datadir, &ctx.package_id, &ctx.version, &dst_volume) - .ok_or_else(|| anyhow!("There is no {} in volumes", dst_volume))?; - ( - ctx.volumes.clone(), - volume_path, - volume_path_out, - ctx.rsyncs.clone(), - ) - }; - if volumes.readonly(&dst_volume) { - bail!("Volume {} is readonly", dst_volume); - } - - let src_path = src_path.strip_prefix("/").unwrap_or(&src_path); - let src = volume_path.join(src_path); - // With the volume check - if !is_subset(&volume_path, &src).await? { - bail!( - "Path '{}' has broken away from parent '{}'", - src.to_string_lossy(), - volume_path.to_string_lossy(), - ); - } - if tokio::fs::metadata(&src).await.is_err() { - bail!("Source at {} does not exists", src.to_string_lossy()); - } - - let dst_path = src_path.strip_prefix("/").unwrap_or(&dst_path); - let dst = volume_path_out.join(dst_path); - // With the volume check - if !is_subset(&volume_path_out, &dst).await? { - bail!( - "Path '{}' has broken away from parent '{}'", - dst.to_string_lossy(), - volume_path_out.to_string_lossy(), - ); - } - - let running_rsync = Rsync::new(src, dst, options) - .await - .map_err(|e| anyhow::anyhow!("{:?}", e.source))?; - let insert_id = { - let mut rsyncs = rsyncs.lock().await; - let next = rsyncs.0 + 1; - rsyncs.0 = next; - rsyncs.1.insert(next, running_rsync); - next - }; - Ok(insert_id) - } - - #[op] - async fn rsync_wait(state: Rc>, id: usize) -> Result<(), AnyError> { - let rsyncs = { - let state = state.borrow(); - let ctx: &JsContext = state.borrow(); - ctx.rsyncs.clone() - }; - let running_rsync = match rsyncs.lock().await.1.remove(&id) { - Some(a) => a, - None => bail!("Couldn't find rsync at id {id}"), - }; - running_rsync - .wait() - .await - .map_err(|x| anyhow::anyhow!("{}", x.source))?; - Ok(()) - } - #[op] - async fn rsync_progress(state: Rc>, id: usize) -> Result { - use futures::StreamExt; - let rsyncs = { - let state = state.borrow(); - let ctx: &JsContext = state.borrow(); - ctx.rsyncs.clone() - }; - let mut running_rsync = match rsyncs.lock().await.1.remove(&id) { - Some(a) => a, - None => bail!("Couldn't find rsync at id {id}"), - }; - let progress = running_rsync.progress.next().await.unwrap_or_default(); - rsyncs.lock().await.1.insert(id, running_rsync); - Ok(progress) - } - #[op] - async fn remove_file( - state: Rc>, - volume_id: VolumeId, - path_in: PathBuf, - ) -> Result<(), AnyError> { - let (volumes, volume_path) = { - let state = state.borrow(); - let ctx: &JsContext = state.borrow(); - let volume_path = ctx - .volumes - .path_for(&ctx.datadir, &ctx.package_id, &ctx.version, &volume_id) - .ok_or_else(|| anyhow!("There is no {} in volumes", volume_id))?; - (ctx.volumes.clone(), volume_path) - }; - if volumes.readonly(&volume_id) { - bail!("Volume {} is readonly", volume_id); - } - let path_in = path_in.strip_prefix("/").unwrap_or(&path_in); - let new_file = volume_path.join(path_in); - // With the volume check - if !is_subset(&volume_path, &new_file).await? { - bail!( - "Path '{}' has broken away from parent '{}'", - new_file.to_string_lossy(), - volume_path.to_string_lossy(), - ); - } - tokio::fs::remove_file(new_file).await?; - Ok(()) - } - #[op] - async fn remove_dir( - state: Rc>, - volume_id: VolumeId, - path_in: PathBuf, - ) -> Result<(), AnyError> { - let (volumes, volume_path) = { - let state = state.borrow(); - let ctx: &JsContext = state.borrow(); - let volume_path = ctx - .volumes - .path_for(&ctx.datadir, &ctx.package_id, &ctx.version, &volume_id) - .ok_or_else(|| anyhow!("There is no {} in volumes", volume_id))?; - (ctx.volumes.clone(), volume_path) - }; - if volumes.readonly(&volume_id) { - bail!("Volume {} is readonly", volume_id); - } - let path_in = path_in.strip_prefix("/").unwrap_or(&path_in); - let new_file = volume_path.join(path_in); - // With the volume check - if !is_subset(&volume_path, &new_file).await? { - bail!( - "Path '{}' has broken away from parent '{}'", - new_file.to_string_lossy(), - volume_path.to_string_lossy(), - ); - } - tokio::fs::remove_dir_all(new_file).await?; - Ok(()) - } - #[op] - async fn create_dir( - state: Rc>, - volume_id: VolumeId, - path_in: PathBuf, - ) -> Result<(), AnyError> { - let (volumes, volume_path) = { - let state = state.borrow(); - let ctx: &JsContext = state.borrow(); - let volume_path = ctx - .volumes - .path_for(&ctx.datadir, &ctx.package_id, &ctx.version, &volume_id) - .ok_or_else(|| anyhow!("There is no {} in volumes", volume_id))?; - (ctx.volumes.clone(), volume_path) - }; - if volumes.readonly(&volume_id) { - bail!("Volume {} is readonly", volume_id); - } - let path_in = path_in.strip_prefix("/").unwrap_or(&path_in); - let new_file = volume_path.join(path_in); - - // With the volume check - if !is_subset(&volume_path, &new_file).await? { - bail!( - "Path '{}' has broken away from parent '{}'", - new_file.to_string_lossy(), - volume_path.to_string_lossy(), - ); - } - tokio::fs::create_dir_all(new_file).await?; - Ok(()) - } - #[op] - async fn read_dir( - state: Rc>, - volume_id: VolumeId, - path_in: PathBuf, - ) -> Result, AnyError> { - let volume_path = { - let state = state.borrow(); - let ctx: &JsContext = state.borrow(); - ctx.volumes - .path_for(&ctx.datadir, &ctx.package_id, &ctx.version, &volume_id) - .ok_or_else(|| anyhow!("There is no {} in volumes", volume_id))? - }; - let path_in = path_in.strip_prefix("/").unwrap_or(&path_in); - let new_file = volume_path.join(path_in); - - // With the volume check - if !is_subset(&volume_path, &new_file).await? { - bail!( - "Path '{}' has broken away from parent '{}'", - new_file.to_string_lossy(), - volume_path.to_string_lossy(), - ); - } - let mut reader = tokio::fs::read_dir(&new_file).await?; - let mut paths: Vec = Vec::new(); - let origin_path = format!("{}/", new_file.to_str().unwrap_or_default()); - let remove_new_file = |other_path: String| other_path.replacen(&origin_path, "", 1); - let has_origin_path = |other_path: &String| other_path.starts_with(&origin_path); - while let Some(entry) = reader.next_entry().await? { - entry - .path() - .to_str() - .into_iter() - .map(ToString::to_string) - .filter(&has_origin_path) - .map(&remove_new_file) - .for_each(|x| paths.push(x)); - } - paths.sort(); - Ok(paths) - } - - #[op] - async fn disk_usage( - state: Rc>, - volume_id: Option, - path_in: Option, - ) -> Result<(u64, u64), AnyError> { - let (base_path, volume_path) = { - let state = state.borrow(); - let ctx: &JsContext = state.borrow(); - let volume_path = if let Some(volume_id) = volume_id { - Some( - ctx.volumes - .path_for(&ctx.datadir, &ctx.package_id, &ctx.version, &volume_id) - .ok_or_else(|| anyhow!("There is no {} in volumes", volume_id))?, - ) - } else { - None - }; - (ctx.datadir.join("package-data"), volume_path) - }; - let path = if let (Some(volume_path), Some(path_in)) = (volume_path, path_in) { - let path_in = path_in.strip_prefix("/").unwrap_or(&path_in); - Some(volume_path.join(path_in)) - } else { - None - }; - - if let Some(path) = path { - let size = String::from_utf8( - Command::new("df") - .arg("--output=size") - .arg("--block-size=1") - .arg(&base_path) - .stdout(std::process::Stdio::piped()) - .output() - .await? - .stdout, - )? - .lines() - .nth(1) - .unwrap_or_default() - .parse()?; - let used = String::from_utf8( - Command::new("du") - .arg("-s") - .arg("--block-size=1") - .arg(path) - .stdout(std::process::Stdio::piped()) - .output() - .await? - .stdout, - )? - .split_ascii_whitespace() - .next() - .unwrap_or_default() - .parse()?; - Ok((used, size)) - } else { - String::from_utf8( - Command::new("df") - .arg("--output=used,size") - .arg("--block-size=1") - .arg(&base_path) - .stdout(std::process::Stdio::piped()) - .output() - .await? - .stdout, - )? - .lines() - .nth(1) - .unwrap_or_default() - .split_ascii_whitespace() - .next_tuple() - .and_then(|(used, size)| Some((used.parse().ok()?, size.parse().ok()?))) - .ok_or_else(|| anyhow!("invalid output from df")) - } - } - - #[op] - fn current_function(state: &mut OpState) -> Result { - let ctx = state.borrow::(); - Ok(ctx.run_function.clone()) - } - - #[op] - async fn log_trace(state: Rc>, input: String) -> Result<(), AnyError> { - let ctx = { - let state = state.borrow(); - state.borrow::().clone() - }; - tracing::trace!( - package_id = tracing::field::display(&ctx.package_id), - run_function = tracing::field::display(&ctx.run_function), - "{}", - input - ); - Ok(()) - } - #[op] - async fn log_warn(state: Rc>, input: String) -> Result<(), AnyError> { - let ctx = { - let state = state.borrow(); - state.borrow::().clone() - }; - tracing::warn!( - package_id = tracing::field::display(&ctx.package_id), - run_function = tracing::field::display(&ctx.run_function), - "{}", - input - ); - Ok(()) - } - #[op] - async fn log_error(state: Rc>, input: String) -> Result<(), AnyError> { - let ctx = { - let state = state.borrow(); - state.borrow::().clone() - }; - tracing::error!( - package_id = tracing::field::display(&ctx.package_id), - run_function = tracing::field::display(&ctx.run_function), - "{}", - input - ); - Ok(()) - } - #[op] - async fn log_debug(state: Rc>, input: String) -> Result<(), AnyError> { - let ctx = { - let state = state.borrow(); - state.borrow::().clone() - }; - tracing::debug!( - package_id = tracing::field::display(&ctx.package_id), - run_function = tracing::field::display(&ctx.run_function), - "{}", - input - ); - Ok(()) - } - #[op] - async fn log_info(state: Rc>, input: String) -> Result<(), AnyError> { - let (package_id, run_function) = { - let state = state.borrow(); - let ctx: JsContext = state.borrow::().clone(); - (ctx.package_id, ctx.run_function) - }; - tracing::info!( - package_id = tracing::field::display(&package_id), - run_function = tracing::field::display(&run_function), - "{}", - input - ); - Ok(()) - } - - #[op] - fn get_input(state: &mut OpState) -> Result { - let ctx = state.borrow::(); - Ok(ctx.input.clone()) - } - #[op] - fn get_variable_args(state: &mut OpState) -> Result, AnyError> { - let ctx = state.borrow::(); - Ok(ctx.variable_args.clone()) - } - #[op] - fn set_value(state: &mut OpState, value: Value) -> Result<(), AnyError> { - let mut answer = state.borrow::().0.lock(); - *answer = value; - Ok(()) - } - #[op] - fn is_sandboxed(state: &mut OpState) -> Result { - let ctx = state.borrow::(); - Ok(ctx.sandboxed) - } - - #[derive(Debug, Clone, Serialize, Deserialize)] - #[serde(rename_all = "camelCase")] - pub struct StartCommand { - process_id: ProcessId, - } - - #[op] - async fn sleep(time_ms: u64) -> Result<(), AnyError> { - tokio::time::sleep(Duration::from_millis(time_ms)).await; - - Ok(()) - } - - #[op] - async fn chown( - state: Rc>, - volume_id: VolumeId, - path_in: PathBuf, - ownership: u32, - ) -> Result<(), AnyError> { - let sandboxed = { - let state = state.borrow(); - let ctx: &JsContext = state.borrow(); - ctx.sandboxed - }; - - if sandboxed { - bail!("Will not run chown in sandboxed mode"); - } - - let (volumes, volume_path) = { - let state = state.borrow(); - let ctx: &JsContext = state.borrow(); - let volume_path = ctx - .volumes - .path_for(&ctx.datadir, &ctx.package_id, &ctx.version, &volume_id) - .ok_or_else(|| anyhow!("There is no {} in volumes", volume_id))?; - (ctx.volumes.clone(), volume_path) - }; - if volumes.readonly(&volume_id) { - bail!("Volume {} is readonly", volume_id); - } - let path_in = path_in.strip_prefix("/").unwrap_or(&path_in); - let new_file = volume_path.join(path_in); - // With the volume check - if !is_subset(&volume_path, &new_file).await? { - bail!( - "Path '{}' has broken away from parent '{}'", - new_file.to_string_lossy(), - volume_path.to_string_lossy(), - ); - } - let output = tokio::process::Command::new("chown") - .arg("--recursive") - .arg(format!("{ownership}")) - .arg(new_file.as_os_str()) - .output() - .await?; - if !output.status.success() { - return Err(anyhow!("Chown Error")); - } - Ok(()) - } - #[op] - async fn chmod( - state: Rc>, - volume_id: VolumeId, - path_in: PathBuf, - mode: u32, - ) -> Result<(), AnyError> { - let sandboxed = { - let state = state.borrow(); - let ctx: &JsContext = state.borrow(); - ctx.sandboxed - }; - - if sandboxed { - bail!("Will not run chmod in sandboxed mode"); - } - - let (volumes, volume_path) = { - let state = state.borrow(); - let ctx: &JsContext = state.borrow(); - let volume_path = ctx - .volumes - .path_for(&ctx.datadir, &ctx.package_id, &ctx.version, &volume_id) - .ok_or_else(|| anyhow!("There is no {} in volumes", volume_id))?; - (ctx.volumes.clone(), volume_path) - }; - if volumes.readonly(&volume_id) { - bail!("Volume {} is readonly", volume_id); - } - let path_in = path_in.strip_prefix("/").unwrap_or(&path_in); - let new_file = volume_path.join(path_in); - // With the volume check - if !is_subset(&volume_path, &new_file).await? { - bail!( - "Path '{}' has broken away from parent '{}'", - new_file.to_string_lossy(), - volume_path.to_string_lossy(), - ); - } - tokio::fs::set_permissions(new_file, Permissions::from_mode(mode)).await?; - Ok(()) - } - /// We need to make sure that during the file accessing, we don't reach beyond our scope of control - async fn is_subset( - parent: impl AsRef, - child: impl AsRef, - ) -> Result { - let child = { - let mut child_count = 0; - let mut child = child.as_ref(); - loop { - if child.ends_with("..") { - child_count += 1; - } else if child_count > 0 { - child_count -= 1; - } else { - let meta = tokio::fs::metadata(child).await; - if meta.is_ok() { - break; - } - } - child = match child.parent() { - Some(child) => child, - None => { - return Ok(false); - } - }; - } - tokio::fs::canonicalize(child).await? - }; - let parent = tokio::fs::canonicalize(parent).await?; - Ok(child.starts_with(parent)) - } - - #[tokio::test] - async fn test_is_subset() { - let home = std::env::var("HOME").unwrap(); - let home = Path::new(&home); - assert!(!is_subset(home, &home.join("code/fakedir/../../..")) - .await - .unwrap()) - } -} - -fn system_time_as_unix_ms(system_time: &SystemTime) -> Option { - system_time - .duration_since(SystemTime::UNIX_EPOCH) - .ok()? - .as_millis() - .try_into() - .ok() -} diff --git a/core/startos/Cargo.toml b/core/startos/Cargo.toml index bd1beba64..bad982996 100644 --- a/core/startos/Cargo.toml +++ b/core/startos/Cargo.toml @@ -30,7 +30,7 @@ avahi = ["avahi-sys"] avahi-alias = ["avahi"] cli = [] daemon = [] -default = ["cli", "sdk", "daemon", "js-engine"] +default = ["cli", "sdk", "daemon"] dev = [] docker = [] sdk = [] @@ -98,7 +98,6 @@ itertools = "0.11.0" jaq-core = "0.10.1" jaq-std = "0.10.0" josekit = "0.8.4" -js-engine = { path = '../js-engine', optional = true } jsonpath_lib = { git = "https://github.com/Start9Labs/jsonpath.git" } lazy_static = "1.4.0" libc = "0.2.149" diff --git a/core/startos/src/bins/mod.rs b/core/startos/src/bins/mod.rs index c391338fe..76329e094 100644 --- a/core/startos/src/bins/mod.rs +++ b/core/startos/src/bins/mod.rs @@ -5,8 +5,6 @@ pub mod avahi_alias; pub mod deprecated; #[cfg(feature = "cli")] pub mod start_cli; -#[cfg(feature = "js-engine")] -pub mod start_deno; #[cfg(feature = "daemon")] pub mod start_init; #[cfg(feature = "sdk")] @@ -18,8 +16,6 @@ fn select_executable(name: &str) -> Option { match name { #[cfg(feature = "avahi-alias")] "avahi-alias" => Some(avahi_alias::main), - #[cfg(feature = "js_engine")] - "start-deno" => Some(start_deno::main), #[cfg(feature = "cli")] "start-cli" => Some(start_cli::main), #[cfg(feature = "sdk")] diff --git a/core/startos/src/procedure/js_scripts.rs b/core/startos/src/procedure/js_scripts.rs index 88f240e4f..131ceef84 100644 --- a/core/startos/src/procedure/js_scripts.rs +++ b/core/startos/src/procedure/js_scripts.rs @@ -4,8 +4,6 @@ use std::time::Duration; use container_init::ProcessGroupId; use helpers::UnixRpcClient; -pub use js_engine::JsError; -use js_engine::{JsExecutionEnvironment, PathForVolumeId}; use models::VolumeId; use serde::de::DeserializeOwned; use serde::{Deserialize, Serialize}; @@ -28,23 +26,6 @@ enum ErrorValue { Result(serde_json::Value), } -impl PathForVolumeId for Volumes { - fn path_for( - &self, - data_dir: &Path, - package_id: &PackageId, - version: &Version, - volume_id: &VolumeId, - ) -> Option { - let volume = self.get(volume_id)?; - Some(volume.path_for(data_dir, package_id, version, volume_id)) - } - - fn readonly(&self, volume_id: &VolumeId) -> bool { - self.get(volume_id).map(|x| x.readonly()).unwrap_or(false) - } -} - #[derive(Clone, Debug, Deserialize, Serialize)] pub struct ExecuteArgs { pub procedure: JsProcedure, @@ -68,27 +49,3 @@ impl JsProcedure { Ok(()) } } - -fn unwrap_known_error( - error_value: Option, -) -> Result { - let error_value = error_value.unwrap_or_else(|| ErrorValue::Result(serde_json::Value::Null)); - match error_value { - ErrorValue::Error(error) => Err((JsError::Javascript, error)), - ErrorValue::ErrorCode((code, message)) => Err((JsError::Code(code), message)), - ErrorValue::Result(ref value) => match serde_json::from_value(value.clone()) { - Ok(a) => Ok(a), - Err(err) => { - tracing::error!("{}", err); - tracing::debug!("{:?}", err); - Err(( - JsError::BoundryLayerSerDe, - format!( - "Couldn't convert output = {:#?} to the correct type", - serde_json::to_string_pretty(&error_value).unwrap_or_default() - ), - )) - } - }, - } -} diff --git a/core/startos/src/procedure/mod.rs b/core/startos/src/procedure/mod.rs index be074c2b5..aa3d4092d 100644 --- a/core/startos/src/procedure/mod.rs +++ b/core/startos/src/procedure/mod.rs @@ -17,7 +17,6 @@ use crate::volume::Volumes; use crate::{Error, ErrorKind}; pub mod docker; -#[cfg(feature = "js-engine")] pub mod js_scripts; pub use models::ProcedureName; @@ -27,15 +26,12 @@ pub use models::ProcedureName; #[model = "Model"] pub enum PackageProcedure { Docker(DockerProcedure), - - #[cfg(feature = "js-engine")] Script(js_scripts::JsProcedure), } impl PackageProcedure { pub fn is_script(&self) -> bool { match self { - #[cfg(feature = "js-engine")] Self::Script(_) => true, _ => false, } @@ -52,7 +48,6 @@ impl PackageProcedure { PackageProcedure::Docker(action) => { action.validate(eos_version, volumes, image_ids, expected_io) } - #[cfg(feature = "js-engine")] PackageProcedure::Script(action) => action.validate(volumes), } } @@ -116,7 +111,6 @@ impl std::fmt::Display for PackageProcedure { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { PackageProcedure::Docker(_) => write!(f, "Docker")?, - #[cfg(feature = "js-engine")] PackageProcedure::Script(_) => write!(f, "JS")?, } Ok(()) diff --git a/core/startos/src/s9pk/builder.rs b/core/startos/src/s9pk/builder.rs deleted file mode 100644 index 199742439..000000000 --- a/core/startos/src/s9pk/builder.rs +++ /dev/null @@ -1,145 +0,0 @@ -use sha2::{Digest, Sha512}; -use tokio::io::{AsyncReadExt, AsyncSeekExt, AsyncWriteExt, SeekFrom}; -use tracing::instrument; -use typed_builder::TypedBuilder; - -use super::header::{FileSection, Header}; -use super::manifest::Manifest; -use super::SIG_CONTEXT; -use crate::util::io::to_cbor_async_writer; -use crate::util::HashWriter; -use crate::{Error, ResultExt}; - -#[derive(TypedBuilder)] -pub struct S9pkPacker< - 'a, - W: AsyncWriteExt + AsyncSeekExt, - RLicense: AsyncReadExt + Unpin, - RInstructions: AsyncReadExt + Unpin, - RIcon: AsyncReadExt + Unpin, - RDockerImages: AsyncReadExt + Unpin, - RAssets: AsyncReadExt + Unpin, - RScripts: AsyncReadExt + Unpin, -> { - writer: W, - manifest: &'a Manifest, - license: RLicense, - instructions: RInstructions, - icon: RIcon, - docker_images: RDockerImages, - assets: RAssets, - scripts: Option, -} -impl< - 'a, - W: AsyncWriteExt + AsyncSeekExt + Unpin, - RLicense: AsyncReadExt + Unpin, - RInstructions: AsyncReadExt + Unpin, - RIcon: AsyncReadExt + Unpin, - RDockerImages: AsyncReadExt + Unpin, - RAssets: AsyncReadExt + Unpin, - RScripts: AsyncReadExt + Unpin, - > S9pkPacker<'a, W, RLicense, RInstructions, RIcon, RDockerImages, RAssets, RScripts> -{ - /// BLOCKING - #[instrument(skip_all)] - pub async fn pack(mut self, key: &ed25519_dalek::SigningKey) -> Result<(), Error> { - let header_pos = self.writer.stream_position().await?; - if header_pos != 0 { - tracing::warn!("Appending to non-empty file."); - } - let mut header = Header::placeholder(); - header.serialize(&mut self.writer).await.with_ctx(|_| { - ( - crate::ErrorKind::Serialization, - "Writing Placeholder Header", - ) - })?; - let mut position = self.writer.stream_position().await?; - - let mut writer = HashWriter::new(Sha512::new(), &mut self.writer); - // manifest - to_cbor_async_writer(&mut writer, self.manifest).await?; - let new_pos = writer.inner_mut().stream_position().await?; - header.table_of_contents.manifest = FileSection { - position, - length: new_pos - position, - }; - position = new_pos; - // license - tokio::io::copy(&mut self.license, &mut writer) - .await - .with_ctx(|_| (crate::ErrorKind::Filesystem, "Copying License"))?; - let new_pos = writer.inner_mut().stream_position().await?; - header.table_of_contents.license = FileSection { - position, - length: new_pos - position, - }; - position = new_pos; - // instructions - tokio::io::copy(&mut self.instructions, &mut writer) - .await - .with_ctx(|_| (crate::ErrorKind::Filesystem, "Copying Instructions"))?; - let new_pos = writer.inner_mut().stream_position().await?; - header.table_of_contents.instructions = FileSection { - position, - length: new_pos - position, - }; - position = new_pos; - // icon - tokio::io::copy(&mut self.icon, &mut writer) - .await - .with_ctx(|_| (crate::ErrorKind::Filesystem, "Copying Icon"))?; - let new_pos = writer.inner_mut().stream_position().await?; - header.table_of_contents.icon = FileSection { - position, - length: new_pos - position, - }; - position = new_pos; - // docker_images - tokio::io::copy(&mut self.docker_images, &mut writer) - .await - .with_ctx(|_| (crate::ErrorKind::Filesystem, "Copying Docker Images"))?; - let new_pos = writer.inner_mut().stream_position().await?; - header.table_of_contents.docker_images = FileSection { - position, - length: new_pos - position, - }; - position = new_pos; - // assets - tokio::io::copy(&mut self.assets, &mut writer) - .await - .with_ctx(|_| (crate::ErrorKind::Filesystem, "Copying Assets"))?; - let new_pos = writer.inner_mut().stream_position().await?; - header.table_of_contents.assets = FileSection { - position, - length: new_pos - position, - }; - position = new_pos; - // scripts - if let Some(mut scripts) = self.scripts { - tokio::io::copy(&mut scripts, &mut writer) - .await - .with_ctx(|_| (crate::ErrorKind::Filesystem, "Copying Scripts"))?; - let new_pos = writer.inner_mut().stream_position().await?; - header.table_of_contents.scripts = Some(FileSection { - position, - length: new_pos - position, - }); - position = new_pos; - } - - // header - let (hash, _) = writer.finish(); - self.writer.seek(SeekFrom::Start(header_pos)).await?; - header.pubkey = key.into(); - header.signature = key.sign_prehashed(hash, Some(SIG_CONTEXT))?; - header - .serialize(&mut self.writer) - .await - .with_ctx(|_| (crate::ErrorKind::Serialization, "Writing Header"))?; - self.writer.seek(SeekFrom::Start(position)).await?; - - Ok(()) - } -} diff --git a/core/startos/src/s9pk/docker.rs b/core/startos/src/s9pk/docker.rs deleted file mode 100644 index be93905fb..000000000 --- a/core/startos/src/s9pk/docker.rs +++ /dev/null @@ -1,95 +0,0 @@ -use std::borrow::Cow; -use std::collections::BTreeSet; -use std::io::SeekFrom; -use std::path::Path; - -use color_eyre::eyre::eyre; -use futures::{FutureExt, TryStreamExt}; -use serde::{Deserialize, Serialize}; -use tokio::io::{AsyncRead, AsyncSeek, AsyncSeekExt}; -use tokio_tar::{Archive, Entry}; - -use crate::util::io::from_cbor_async_reader; -use crate::{Error, ErrorKind, ARCH}; - -#[derive(Default, Deserialize, Serialize)] -#[serde(rename_all = "kebab-case")] -pub struct DockerMultiArch { - pub default: String, - pub available: BTreeSet, -} - -#[pin_project::pin_project(project = DockerReaderProject)] -#[derive(Debug)] -pub enum DockerReader { - SingleArch(#[pin] R), - MultiArch(#[pin] Entry>), -} -impl DockerReader { - pub async fn new(mut rdr: R) -> Result { - let arch = if let Some(multiarch) = tokio_tar::Archive::new(&mut rdr) - .entries()? - .try_filter_map(|e| { - async move { - Ok(if &*e.path()? == Path::new("multiarch.cbor") { - Some(e) - } else { - None - }) - } - .boxed() - }) - .try_next() - .await? - { - let multiarch: DockerMultiArch = from_cbor_async_reader(multiarch).await?; - Some(if multiarch.available.contains(&**ARCH) { - Cow::Borrowed(&**ARCH) - } else { - Cow::Owned(multiarch.default) - }) - } else { - None - }; - rdr.seek(SeekFrom::Start(0)).await?; - if let Some(arch) = arch { - if let Some(image) = tokio_tar::Archive::new(rdr) - .entries()? - .try_filter_map(|e| { - let arch = arch.clone(); - async move { - Ok(if &*e.path()? == Path::new(&format!("{}.tar", arch)) { - Some(e) - } else { - None - }) - } - .boxed() - }) - .try_next() - .await? - { - Ok(Self::MultiArch(image)) - } else { - Err(Error::new( - eyre!("Docker image section does not contain tarball for architecture"), - ErrorKind::ParseS9pk, - )) - } - } else { - Ok(Self::SingleArch(rdr)) - } - } -} -impl AsyncRead for DockerReader { - fn poll_read( - self: std::pin::Pin<&mut Self>, - cx: &mut std::task::Context<'_>, - buf: &mut tokio::io::ReadBuf<'_>, - ) -> std::task::Poll> { - match self.project() { - DockerReaderProject::SingleArch(r) => r.poll_read(cx, buf), - DockerReaderProject::MultiArch(r) => r.poll_read(cx, buf), - } - } -} diff --git a/core/startos/src/s9pk/git_hash.rs b/core/startos/src/s9pk/git_hash.rs deleted file mode 100644 index b2990a111..000000000 --- a/core/startos/src/s9pk/git_hash.rs +++ /dev/null @@ -1,41 +0,0 @@ -use std::path::Path; - -use crate::Error; - -#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] -pub struct GitHash(String); - -impl GitHash { - pub async fn from_path(path: impl AsRef) -> Result { - let hash = tokio::process::Command::new("git") - .args(["describe", "--always", "--abbrev=40", "--dirty=-modified"]) - .current_dir(path) - .output() - .await?; - if !hash.status.success() { - return Err(Error::new( - color_eyre::eyre::eyre!("Could not get hash: {}", String::from_utf8(hash.stderr)?), - crate::ErrorKind::Filesystem, - )); - } - Ok(GitHash(String::from_utf8(hash.stdout)?)) - } -} - -impl AsRef for GitHash { - fn as_ref(&self) -> &str { - &self.0 - } -} - -// #[tokio::test] -// async fn test_githash_for_current() { -// let answer: GitHash = GitHash::from_path(std::env::current_dir().unwrap()) -// .await -// .unwrap(); -// let answer_str: &str = answer.as_ref(); -// assert!( -// !answer_str.is_empty(), -// "Should have a hash for this current working" -// ); -// } diff --git a/core/startos/src/s9pk/header.rs b/core/startos/src/s9pk/header.rs deleted file mode 100644 index 4f77ad855..000000000 --- a/core/startos/src/s9pk/header.rs +++ /dev/null @@ -1,187 +0,0 @@ -use std::collections::BTreeMap; - -use color_eyre::eyre::eyre; -use ed25519_dalek::{Signature, VerifyingKey}; -use tokio::io::{AsyncRead, AsyncReadExt, AsyncWriteExt}; - -use crate::Error; - -pub const MAGIC: [u8; 2] = [59, 59]; -pub const VERSION: u8 = 1; - -#[derive(Debug)] -pub struct Header { - pub pubkey: VerifyingKey, - pub signature: Signature, - pub table_of_contents: TableOfContents, -} -impl Header { - pub fn placeholder() -> Self { - Header { - pubkey: VerifyingKey::default(), - signature: Signature::from_bytes(&[0; 64]), - table_of_contents: Default::default(), - } - } - // MUST BE SAME SIZE REGARDLESS OF DATA - pub async fn serialize(&self, mut writer: W) -> std::io::Result<()> { - writer.write_all(&MAGIC).await?; - writer.write_all(&[VERSION]).await?; - writer.write_all(self.pubkey.as_bytes()).await?; - writer.write_all(&self.signature.to_bytes()).await?; - self.table_of_contents.serialize(writer).await?; - Ok(()) - } - pub async fn deserialize(mut reader: R) -> Result { - let mut magic = [0; 2]; - reader.read_exact(&mut magic).await?; - if magic != MAGIC { - return Err(Error::new( - eyre!("Incorrect Magic: {:?}", magic), - crate::ErrorKind::ParseS9pk, - )); - } - let mut version = [0]; - reader.read_exact(&mut version).await?; - if version[0] != VERSION { - return Err(Error::new( - eyre!("Unknown Version: {}", version[0]), - crate::ErrorKind::ParseS9pk, - )); - } - let mut pubkey_bytes = [0; 32]; - reader.read_exact(&mut pubkey_bytes).await?; - let pubkey = VerifyingKey::from_bytes(&pubkey_bytes) - .map_err(|e| Error::new(e, crate::ErrorKind::ParseS9pk))?; - let mut sig_bytes = [0; 64]; - reader.read_exact(&mut sig_bytes).await?; - let signature = Signature::from_bytes(&sig_bytes); - let table_of_contents = TableOfContents::deserialize(reader).await?; - - Ok(Header { - pubkey, - signature, - table_of_contents, - }) - } -} - -#[derive(Debug, Default)] -pub struct TableOfContents { - pub manifest: FileSection, - pub license: FileSection, - pub instructions: FileSection, - pub icon: FileSection, - pub docker_images: FileSection, - pub assets: FileSection, - pub scripts: Option, -} -impl TableOfContents { - pub async fn serialize(&self, mut writer: W) -> std::io::Result<()> { - let len: u32 = ((1 + "manifest".len() + 16) - + (1 + "license".len() + 16) - + (1 + "instructions".len() + 16) - + (1 + "icon".len() + 16) - + (1 + "docker_images".len() + 16) - + (1 + "assets".len() + 16) - + (1 + "scripts".len() + 16)) as u32; - writer.write_all(&u32::to_be_bytes(len)).await?; - self.manifest - .serialize_entry("manifest", &mut writer) - .await?; - self.license.serialize_entry("license", &mut writer).await?; - self.instructions - .serialize_entry("instructions", &mut writer) - .await?; - self.icon.serialize_entry("icon", &mut writer).await?; - self.docker_images - .serialize_entry("docker_images", &mut writer) - .await?; - self.assets.serialize_entry("assets", &mut writer).await?; - self.scripts - .unwrap_or_default() - .serialize_entry("scripts", &mut writer) - .await?; - Ok(()) - } - pub async fn deserialize(mut reader: R) -> std::io::Result { - let mut toc_len = [0; 4]; - reader.read_exact(&mut toc_len).await?; - let toc_len = u32::from_be_bytes(toc_len); - let mut reader = reader.take(toc_len as u64); - let mut table = BTreeMap::new(); - while let Some((label, section)) = FileSection::deserialize_entry(&mut reader).await? { - table.insert(label, section); - } - fn from_table( - table: &BTreeMap, FileSection>, - label: &str, - ) -> std::io::Result { - table.get(label.as_bytes()).copied().ok_or_else(|| { - std::io::Error::new( - std::io::ErrorKind::UnexpectedEof, - format!("Missing Required Label: {}", label), - ) - }) - } - #[allow(dead_code)] - fn as_opt(fs: FileSection) -> Option { - if fs.position | fs.length == 0 { - // 0/0 is not a valid file section - None - } else { - Some(fs) - } - } - Ok(TableOfContents { - manifest: from_table(&table, "manifest")?, - license: from_table(&table, "license")?, - instructions: from_table(&table, "instructions")?, - icon: from_table(&table, "icon")?, - docker_images: from_table(&table, "docker_images")?, - assets: from_table(&table, "assets")?, - scripts: table.get("scripts".as_bytes()).cloned(), - }) - } -} - -#[derive(Clone, Copy, Debug, Default)] -pub struct FileSection { - pub position: u64, - pub length: u64, -} -impl FileSection { - pub async fn serialize_entry( - self, - label: &str, - mut writer: W, - ) -> std::io::Result<()> { - writer.write_all(&[label.len() as u8]).await?; - writer.write_all(label.as_bytes()).await?; - writer.write_all(&u64::to_be_bytes(self.position)).await?; - writer.write_all(&u64::to_be_bytes(self.length)).await?; - Ok(()) - } - pub async fn deserialize_entry( - mut reader: R, - ) -> std::io::Result, Self)>> { - let mut label_len = [0]; - let read = reader.read(&mut label_len).await?; - if read == 0 { - return Ok(None); - } - let mut label = vec![0; label_len[0] as usize]; - reader.read_exact(&mut label).await?; - let mut pos = [0; 8]; - reader.read_exact(&mut pos).await?; - let mut len = [0; 8]; - reader.read_exact(&mut len).await?; - Ok(Some(( - label, - FileSection { - position: u64::from_be_bytes(pos), - length: u64::from_be_bytes(len), - }, - ))) - } -} diff --git a/core/startos/src/s9pk/manifest.rs b/core/startos/src/s9pk/manifest.rs deleted file mode 100644 index 3eee540ed..000000000 --- a/core/startos/src/s9pk/manifest.rs +++ /dev/null @@ -1,211 +0,0 @@ -use std::collections::BTreeMap; -use std::path::{Path, PathBuf}; - -use color_eyre::eyre::eyre; -pub use models::PackageId; -use serde::{Deserialize, Serialize}; -use url::Url; - -use super::git_hash::GitHash; -use crate::action::Actions; -use crate::backup::BackupActions; -use crate::config::action::ConfigActions; -use crate::dependencies::Dependencies; -use crate::migration::Migrations; -use crate::net::interface::Interfaces; -use crate::prelude::*; -use crate::procedure::docker::DockerContainers; -use crate::procedure::PackageProcedure; -use crate::status::health_check::HealthChecks; -use crate::util::serde::Regex; -use crate::util::Version; -use crate::version::{Current, VersionT}; -use crate::volume::Volumes; -use crate::Error; - -fn current_version() -> Version { - Current::new().semver().into() -} - -#[derive(Clone, Debug, Deserialize, Serialize, HasModel)] -#[serde(rename_all = "kebab-case")] -#[model = "Model"] -pub struct Manifest { - #[serde(default = "current_version")] - pub eos_version: Version, - pub id: PackageId, - #[serde(default)] - pub git_hash: Option, - pub title: String, - pub version: Version, - pub description: Description, - #[serde(default)] - pub assets: Assets, - #[serde(default)] - pub build: Option>, - pub release_notes: String, - pub license: String, // type of license - pub wrapper_repo: Url, - pub upstream_repo: Url, - pub support_site: Option, - pub marketing_site: Option, - pub donation_url: Option, - #[serde(default)] - pub alerts: Alerts, - pub main: PackageProcedure, - pub health_checks: HealthChecks, - pub config: Option, - pub properties: Option, - pub volumes: Volumes, - // #[serde(default)] - pub interfaces: Interfaces, - // #[serde(default)] - pub backup: BackupActions, - #[serde(default)] - pub migrations: Migrations, - #[serde(default)] - pub actions: Actions, - // #[serde(default)] - // pub permissions: Permissions, - #[serde(default)] - pub dependencies: Dependencies, - pub containers: Option, - - #[serde(default)] - pub replaces: Vec, - - #[serde(default)] - pub hardware_requirements: HardwareRequirements, -} - -impl Manifest { - pub fn package_procedures(&self) -> impl Iterator { - use std::iter::once; - let main = once(&self.main); - let cfg_get = self.config.as_ref().map(|a| &a.get).into_iter(); - let cfg_set = self.config.as_ref().map(|a| &a.set).into_iter(); - let props = self.properties.iter(); - let backups = vec![&self.backup.create, &self.backup.restore].into_iter(); - let migrations = self - .migrations - .to - .values() - .chain(self.migrations.from.values()); - let actions = self.actions.0.values().map(|a| &a.implementation); - main.chain(cfg_get) - .chain(cfg_set) - .chain(props) - .chain(backups) - .chain(migrations) - .chain(actions) - } - - pub fn with_git_hash(mut self, git_hash: GitHash) -> Self { - self.git_hash = Some(git_hash); - self - } -} - -#[derive(Clone, Debug, Default, Deserialize, Serialize)] -#[serde(rename_all = "kebab-case")] -pub struct HardwareRequirements { - #[serde(default)] - device: BTreeMap, - ram: Option, - pub arch: Option>, -} - -#[derive(Clone, Debug, Default, Deserialize, Serialize)] -#[serde(rename_all = "kebab-case")] -pub struct Assets { - #[serde(default)] - pub license: Option, - #[serde(default)] - pub instructions: Option, - #[serde(default)] - pub icon: Option, - #[serde(default)] - pub docker_images: Option, - #[serde(default)] - pub assets: Option, - #[serde(default)] - pub scripts: Option, -} -impl Assets { - pub fn license_path(&self) -> &Path { - self.license - .as_ref() - .map(|a| a.as_path()) - .unwrap_or(Path::new("LICENSE.md")) - } - pub fn instructions_path(&self) -> &Path { - self.instructions - .as_ref() - .map(|a| a.as_path()) - .unwrap_or(Path::new("INSTRUCTIONS.md")) - } - pub fn icon_path(&self) -> &Path { - self.icon - .as_ref() - .map(|a| a.as_path()) - .unwrap_or(Path::new("icon.png")) - } - pub fn icon_type(&self) -> &str { - self.icon - .as_ref() - .and_then(|icon| icon.extension()) - .and_then(|ext| ext.to_str()) - .unwrap_or("png") - } - pub fn docker_images_path(&self) -> &Path { - self.docker_images - .as_ref() - .map(|a| a.as_path()) - .unwrap_or(Path::new("docker-images")) - } - pub fn assets_path(&self) -> &Path { - self.assets - .as_ref() - .map(|a| a.as_path()) - .unwrap_or(Path::new("assets")) - } - pub fn scripts_path(&self) -> &Path { - self.scripts - .as_ref() - .map(|a| a.as_path()) - .unwrap_or(Path::new("scripts")) - } -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct Description { - pub short: String, - pub long: String, -} -impl Description { - pub fn validate(&self) -> Result<(), Error> { - if self.short.chars().skip(160).next().is_some() { - return Err(Error::new( - eyre!("Short description must be 160 characters or less."), - crate::ErrorKind::ValidateS9pk, - )); - } - if self.long.chars().skip(5000).next().is_some() { - return Err(Error::new( - eyre!("Long description must be 5000 characters or less."), - crate::ErrorKind::ValidateS9pk, - )); - } - Ok(()) - } -} - -#[derive(Clone, Debug, Default, Deserialize, Serialize)] -#[serde(rename_all = "kebab-case")] -pub struct Alerts { - pub install: Option, - pub uninstall: Option, - pub restore: Option, - pub start: Option, - pub stop: Option, -} diff --git a/core/startos/src/s9pk/reader.rs b/core/startos/src/s9pk/reader.rs deleted file mode 100644 index 61b5e46a8..000000000 --- a/core/startos/src/s9pk/reader.rs +++ /dev/null @@ -1,406 +0,0 @@ -use std::collections::BTreeSet; -use std::io::SeekFrom; -use std::ops::Range; -use std::path::Path; -use std::pin::Pin; -use std::str::FromStr; -use std::task::{Context, Poll}; - -use color_eyre::eyre::eyre; -use digest::Output; -use ed25519_dalek::VerifyingKey; -use futures::TryStreamExt; -use models::ImageId; -use sha2::{Digest, Sha512}; -use tokio::fs::File; -use tokio::io::{AsyncRead, AsyncReadExt, AsyncSeek, AsyncSeekExt, ReadBuf}; -use tracing::instrument; - -use super::header::{FileSection, Header, TableOfContents}; -use super::manifest::{Manifest, PackageId}; -use super::SIG_CONTEXT; -use crate::install::progress::InstallProgressTracker; -use crate::s9pk::docker::DockerReader; -use crate::util::Version; -use crate::{Error, ResultExt}; - -const MAX_REPLACES: usize = 10; -const MAX_TITLE_LEN: usize = 30; - -#[pin_project::pin_project] -#[derive(Debug)] -pub struct ReadHandle<'a, R = File> { - pos: &'a mut u64, - range: Range, - #[pin] - rdr: &'a mut R, -} -impl<'a, R: AsyncRead + Unpin> ReadHandle<'a, R> { - pub async fn to_vec(mut self) -> std::io::Result> { - let mut buf = vec![0; (self.range.end - self.range.start) as usize]; - self.read_exact(&mut buf).await?; - Ok(buf) - } -} -impl<'a, R: AsyncRead + Unpin> AsyncRead for ReadHandle<'a, R> { - fn poll_read( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - buf: &mut ReadBuf<'_>, - ) -> Poll> { - let this = self.project(); - let start = buf.filled().len(); - let mut take_buf = buf.take(this.range.end.saturating_sub(**this.pos) as usize); - let res = AsyncRead::poll_read(this.rdr, cx, &mut take_buf); - let n = take_buf.filled().len(); - unsafe { buf.assume_init(start + n) }; - buf.advance(n); - **this.pos += n as u64; - res - } -} -impl<'a, R: AsyncSeek + Unpin> AsyncSeek for ReadHandle<'a, R> { - fn start_seek(self: Pin<&mut Self>, position: SeekFrom) -> std::io::Result<()> { - let this = self.project(); - AsyncSeek::start_seek( - this.rdr, - match position { - SeekFrom::Current(n) => SeekFrom::Current(n), - SeekFrom::End(n) => SeekFrom::Start((this.range.end as i64 + n) as u64), - SeekFrom::Start(n) => SeekFrom::Start(this.range.start + n), - }, - ) - } - fn poll_complete(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - let this = self.project(); - match AsyncSeek::poll_complete(this.rdr, cx) { - Poll::Ready(Ok(n)) => { - let res = n.saturating_sub(this.range.start); - **this.pos = this.range.start + res; - Poll::Ready(Ok(res)) - } - a => a, - } - } -} - -#[derive(Debug)] -pub struct ImageTag { - pub package_id: PackageId, - pub image_id: ImageId, - pub version: Version, -} -impl ImageTag { - #[instrument(skip_all)] - pub fn validate(&self, id: &PackageId, version: &Version) -> Result<(), Error> { - if id != &self.package_id { - return Err(Error::new( - eyre!( - "Contains image for incorrect package: id {}", - self.package_id, - ), - crate::ErrorKind::ValidateS9pk, - )); - } - if version != &self.version { - return Err(Error::new( - eyre!( - "Contains image with incorrect version: expected {} received {}", - version, - self.version, - ), - crate::ErrorKind::ValidateS9pk, - )); - } - Ok(()) - } -} -impl FromStr for ImageTag { - type Err = Error; - fn from_str(s: &str) -> Result { - let rest = s.strip_prefix("start9/").ok_or_else(|| { - Error::new( - eyre!("Invalid image tag prefix: expected start9/"), - crate::ErrorKind::ValidateS9pk, - ) - })?; - let (package, rest) = rest.split_once("/").ok_or_else(|| { - Error::new( - eyre!("Image tag missing image id"), - crate::ErrorKind::ValidateS9pk, - ) - })?; - let (image, version) = rest.split_once(":").ok_or_else(|| { - Error::new( - eyre!("Image tag missing version"), - crate::ErrorKind::ValidateS9pk, - ) - })?; - Ok(ImageTag { - package_id: package.parse()?, - image_id: image.parse()?, - version: version.parse()?, - }) - } -} - -pub struct S9pkReader { - hash: Option>, - hash_string: Option, - developer_key: VerifyingKey, - toc: TableOfContents, - pos: u64, - rdr: R, -} -impl S9pkReader { - pub async fn open>(path: P, check_sig: bool) -> Result { - let p = path.as_ref(); - let rdr = File::open(p) - .await - .with_ctx(|_| (crate::error::ErrorKind::Filesystem, p.display().to_string()))?; - - Self::from_reader(rdr, check_sig).await - } -} -impl S9pkReader> { - pub fn validated(&mut self) { - self.rdr.validated() - } -} -impl S9pkReader { - #[instrument(skip_all)] - pub async fn validate(&mut self) -> Result<(), Error> { - if self.toc.icon.length > 102_400 { - // 100 KiB - return Err(Error::new( - eyre!("icon must be less than 100KiB"), - crate::ErrorKind::ValidateS9pk, - )); - } - let image_tags = self.image_tags().await?; - let man = self.manifest().await?; - let containers = &man.containers; - let validated_image_ids = image_tags - .into_iter() - .map(|i| i.validate(&man.id, &man.version).map(|_| i.image_id)) - .collect::, _>>()?; - man.description.validate()?; - man.actions.0.iter().try_for_each(|(_, action)| { - action.validate( - containers, - &man.eos_version, - &man.volumes, - &validated_image_ids, - ) - })?; - man.backup.validate( - containers, - &man.eos_version, - &man.volumes, - &validated_image_ids, - )?; - if let Some(cfg) = &man.config { - cfg.validate( - containers, - &man.eos_version, - &man.volumes, - &validated_image_ids, - )?; - } - man.health_checks - .validate(&man.eos_version, &man.volumes, &validated_image_ids)?; - man.interfaces.validate()?; - man.main - .validate(&man.eos_version, &man.volumes, &validated_image_ids, false) - .with_ctx(|_| (crate::ErrorKind::ValidateS9pk, "Main"))?; - man.migrations.validate( - containers, - &man.eos_version, - &man.volumes, - &validated_image_ids, - )?; - - #[cfg(feature = "js-engine")] - if man.containers.is_some() - || matches!(man.main, crate::procedure::PackageProcedure::Script(_)) - { - return Err(Error::new( - eyre!("Right now we don't support the containers and the long running main"), - crate::ErrorKind::ValidateS9pk, - )); - } - - if man.replaces.len() >= MAX_REPLACES { - return Err(Error::new( - eyre!("Cannot have more than {MAX_REPLACES} replaces"), - crate::ErrorKind::ValidateS9pk, - )); - } - if let Some(too_big) = man.replaces.iter().find(|x| x.len() >= MAX_REPLACES) { - return Err(Error::new( - eyre!("We have found a replaces of ({too_big}) that exceeds the max length of {MAX_TITLE_LEN} "), - crate::ErrorKind::ValidateS9pk, - )); - } - if man.title.len() >= MAX_TITLE_LEN { - return Err(Error::new( - eyre!("Cannot have more than a length of {MAX_TITLE_LEN} for title"), - crate::ErrorKind::ValidateS9pk, - )); - } - - if man.containers.is_some() - && matches!(man.main, crate::procedure::PackageProcedure::Docker(_)) - { - return Err(Error::new( - eyre!("Cannot have a main docker and a main in containers"), - crate::ErrorKind::ValidateS9pk, - )); - } - if let Some(props) = &man.properties { - props - .validate(&man.eos_version, &man.volumes, &validated_image_ids, true) - .with_ctx(|_| (crate::ErrorKind::ValidateS9pk, "Properties"))?; - } - man.volumes.validate(&man.interfaces)?; - - Ok(()) - } - #[instrument(skip_all)] - pub async fn image_tags(&mut self) -> Result, Error> { - let mut tar = tokio_tar::Archive::new(self.docker_images().await?); - let mut entries = tar.entries()?; - while let Some(mut entry) = entries.try_next().await? { - if &*entry.path()? != Path::new("manifest.json") { - continue; - } - let mut buf = Vec::with_capacity(entry.header().size()? as usize); - entry.read_to_end(&mut buf).await?; - #[derive(serde::Deserialize)] - struct ManEntry { - #[serde(rename = "RepoTags")] - tags: Vec, - } - let man_entries = serde_json::from_slice::>(&buf) - .with_ctx(|_| (crate::ErrorKind::Deserialization, "manifest.json"))?; - return man_entries - .iter() - .flat_map(|e| &e.tags) - .map(|t| t.parse()) - .collect(); - } - Err(Error::new( - eyre!("image.tar missing manifest.json"), - crate::ErrorKind::ParseS9pk, - )) - } - #[instrument(skip_all)] - pub async fn from_reader(mut rdr: R, check_sig: bool) -> Result { - let header = Header::deserialize(&mut rdr).await?; - - let (hash, hash_string) = if check_sig { - let mut hasher = Sha512::new(); - let mut buf = [0; 1024]; - let mut read; - while { - read = rdr.read(&mut buf).await?; - read != 0 - } { - hasher.update(&buf[0..read]); - } - let hash = hasher.clone().finalize(); - header - .pubkey - .verify_prehashed(hasher, Some(SIG_CONTEXT), &header.signature)?; - ( - Some(hash), - Some(base32::encode( - base32::Alphabet::RFC4648 { padding: false }, - hash.as_slice(), - )), - ) - } else { - (None, None) - }; - - let pos = rdr.stream_position().await?; - - Ok(S9pkReader { - hash_string, - hash, - developer_key: header.pubkey, - toc: header.table_of_contents, - pos, - rdr, - }) - } - - pub fn hash(&self) -> Option<&Output> { - self.hash.as_ref() - } - - pub fn hash_str(&self) -> Option<&str> { - self.hash_string.as_ref().map(|s| s.as_str()) - } - - pub fn developer_key(&self) -> &VerifyingKey { - &self.developer_key - } - - pub async fn reset(&mut self) -> Result<(), Error> { - self.rdr.seek(SeekFrom::Start(0)).await?; - Ok(()) - } - - async fn read_handle<'a>( - &'a mut self, - section: FileSection, - ) -> Result, Error> { - if self.pos != section.position { - self.rdr.seek(SeekFrom::Start(section.position)).await?; - self.pos = section.position; - } - Ok(ReadHandle { - range: self.pos..(self.pos + section.length), - pos: &mut self.pos, - rdr: &mut self.rdr, - }) - } - - pub async fn manifest_raw(&mut self) -> Result, Error> { - self.read_handle(self.toc.manifest).await - } - - pub async fn manifest(&mut self) -> Result { - let slice = self.manifest_raw().await?.to_vec().await?; - serde_cbor::de::from_reader(slice.as_slice()) - .with_ctx(|_| (crate::ErrorKind::ParseS9pk, "Deserializing Manifest (CBOR)")) - } - - pub async fn license(&mut self) -> Result, Error> { - self.read_handle(self.toc.license).await - } - - pub async fn instructions(&mut self) -> Result, Error> { - self.read_handle(self.toc.instructions).await - } - - pub async fn icon(&mut self) -> Result, Error> { - self.read_handle(self.toc.icon).await - } - - pub async fn docker_images(&mut self) -> Result>, Error> { - DockerReader::new(self.read_handle(self.toc.docker_images).await?).await - } - - pub async fn assets(&mut self) -> Result, Error> { - self.read_handle(self.toc.assets).await - } - - pub async fn scripts(&mut self) -> Result>, Error> { - Ok(match self.toc.scripts { - None => None, - Some(a) => Some(self.read_handle(a).await?), - }) - } -} diff --git a/core/startos/src/s9pk/specv2.md b/core/startos/src/s9pk/specv2.md deleted file mode 100644 index 9bf993463..000000000 --- a/core/startos/src/s9pk/specv2.md +++ /dev/null @@ -1,28 +0,0 @@ -## Header - -### Magic - -2B: `0x3b3b` - -### Version - -varint: `0x02` - -### Pubkey - -32B: ed25519 pubkey - -### TOC - -- number of sections (varint) -- FOREACH section - - sig (32B: ed25519 signature of BLAKE-3 of rest of section) - - name (varstring) - - TYPE (varint) - - TYPE=FILE (`0x01`) - - mime (varstring) - - pos (32B: u64 BE) - - len (32B: u64 BE) - - hash (32B: BLAKE-3 of file contents) - - TYPE=TOC (`0x02`) - - recursively defined diff --git a/core/startos/src/s9pk/v1/reader.rs b/core/startos/src/s9pk/v1/reader.rs index 61b5e46a8..e901b1a14 100644 --- a/core/startos/src/s9pk/v1/reader.rs +++ b/core/startos/src/s9pk/v1/reader.rs @@ -220,16 +220,6 @@ impl S9pkReader { &validated_image_ids, )?; - #[cfg(feature = "js-engine")] - if man.containers.is_some() - || matches!(man.main, crate::procedure::PackageProcedure::Script(_)) - { - return Err(Error::new( - eyre!("Right now we don't support the containers and the long running main"), - crate::ErrorKind::ValidateS9pk, - )); - } - if man.replaces.len() >= MAX_REPLACES { return Err(Error::new( eyre!("Cannot have more than {MAX_REPLACES} replaces"), From 7324a4973f3c467dc90e575b4a08f75a51dae1e2 Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Fri, 8 Dec 2023 20:12:03 +0400 Subject: [PATCH 036/169] feat(portal): add notifications sidebar (#2516) * feat(portal): add notifications sidebar * chore: add service * chore: simplify style * chore: fix comments * WIP, moving notifications to patch-db * revamp notifications * chore: small adjustments --------- Co-authored-by: Matt Hill --- web/package-lock.json | 62 ++++++++ web/package.json | 5 +- .../src/app/services/api/api.service.ts | 4 +- .../src/app/services/api/live-api.service.ts | 6 +- .../src/app/services/api/mock-api.service.ts | 9 +- .../shared/src/services/setup-logs.service.ts | 10 +- web/projects/shared/src/types/api.ts | 10 +- web/projects/shared/styles/taiga.scss | 5 + web/projects/ui/src/app/app.component.html | 19 +-- web/projects/ui/src/app/app.module.ts | 2 + .../ui/src/app/app/menu/menu.component.ts | 3 +- .../ui/src/app/app/sidebar-host.component.ts | 35 +++++ .../diagnostic/services/diagnostic.service.ts | 4 +- .../services/live-diagnostic.service.ts | 6 +- .../services/mock-diagnostic.service.ts | 4 +- .../components/drawer/drawer.component.html | 2 +- .../components/drawer/drawer.component.ts | 4 +- .../header/header-menu.component.ts | 109 +++++++++++++ .../header-menu/header-menu.component.html | 56 ------- .../header-menu/header-menu.component.scss | 17 -- .../header-menu/header-menu.component.ts | 32 ---- .../header/header-notification.component.ts | 85 ++++++++++ .../header/header-notifications.component.ts | 145 ++++++++++++++++++ .../components/header/header.component.html | 13 -- .../components/header/header.component.scss | 14 -- .../components/header/header.component.ts | 104 ++++++++++++- .../apps/portal/constants/system-utilities.ts | 4 + .../backups => }/modals/report.component.ts | 0 .../ui/src/app/apps/portal/pipes/to-badge.ts | 15 ++ .../app/apps/portal/pipes/to-notifications.ts | 15 -- .../routes/desktop/desktop.component.html | 2 +- .../portal/routes/desktop/desktop.module.ts | 4 +- .../backups/modals/history.component.ts | 2 +- .../system/notifications/item.component.ts | 91 +++++++++++ .../notifications/notifications.component.ts | 123 +++++++++++++++ .../system/notifications/table.component.ts | 113 ++++++++++++++ .../portal/routes/system/system.module.ts | 9 ++ ...ifications.service.ts => badge.service.ts} | 8 +- .../portal/services/notification.service.ts | 116 ++++++++++++++ .../pages/notifications/notifications.page.ts | 10 +- .../server-metrics/server-metrics.page.ts | 2 +- .../badge-menu-button/badge-menu.component.ts | 3 +- .../ui/src/app/common/logs/logs.component.ts | 10 +- .../notifications-toast.service.ts | 2 +- .../ui/src/app/services/api/api.fixures.ts | 6 +- .../ui/src/app/services/api/api.types.ts | 44 ++++-- .../app/services/api/embassy-api.service.ts | 18 ++- .../services/api/embassy-live-api.service.ts | 26 ++-- .../services/api/embassy-mock-api.service.ts | 35 +++-- .../ui/src/app/services/api/mock-patch.ts | 5 +- .../src/app/services/patch-db/data-model.ts | 7 +- web/projects/ui/src/styles.scss | 1 + 52 files changed, 1181 insertions(+), 255 deletions(-) create mode 100644 web/projects/ui/src/app/app/sidebar-host.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/components/header/header-menu.component.ts delete mode 100644 web/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.html delete mode 100644 web/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.scss delete mode 100644 web/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/components/header/header-notification.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/components/header/header-notifications.component.ts delete mode 100644 web/projects/ui/src/app/apps/portal/components/header/header.component.html delete mode 100644 web/projects/ui/src/app/apps/portal/components/header/header.component.scss rename web/projects/ui/src/app/apps/portal/{routes/system/backups => }/modals/report.component.ts (100%) create mode 100644 web/projects/ui/src/app/apps/portal/pipes/to-badge.ts delete mode 100644 web/projects/ui/src/app/apps/portal/pipes/to-notifications.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/notifications/item.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/notifications/notifications.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/notifications/table.component.ts rename web/projects/ui/src/app/apps/portal/services/{notifications.service.ts => badge.service.ts} (92%) create mode 100644 web/projects/ui/src/app/apps/portal/services/notification.service.ts diff --git a/web/package-lock.json b/web/package-lock.json index 9aa528c56..8ce5b8d52 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -9,6 +9,7 @@ "version": "0.3.5.1", "dependencies": { "@angular/animations": "^16.1.4", + "@angular/cdk": "^16.1.4", "@angular/common": "^16.1.4", "@angular/compiler": "^16.1.4", "@angular/core": "^16.1.4", @@ -24,6 +25,7 @@ "@start9labs/emver": "^0.1.5", "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc8.beta2", "@taiga-ui/addon-charts": "3.53.0", + "@taiga-ui/addon-mobile": "3.53.0", "@taiga-ui/cdk": "3.53.0", "@taiga-ui/core": "3.53.0", "@taiga-ui/experimental": "3.53.0", @@ -31,6 +33,7 @@ "@taiga-ui/kit": "3.53.0", "@taiga-ui/styles": "3.53.0", "@tinkoff/ng-dompurify": "4.0.0", + "@tinkoff/ng-event-plugins": "3.1.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", "cbor": "npm:@jprochazk/cbor@^0.4.9", @@ -440,6 +443,46 @@ "@angular/core": "16.2.12" } }, + "node_modules/@angular/cdk": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-16.2.12.tgz", + "integrity": "sha512-wT8/265zm2WKY0BDaRoYbrAT4kadrmejTRLjuimQIEUKnw4vBsJMWCwQkpFo3s6zr6eznGqYVAFb8KKPVLKGBg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "optionalDependencies": { + "parse5": "^7.1.2" + }, + "peerDependencies": { + "@angular/common": "^16.0.0 || ^17.0.0", + "@angular/core": "^16.0.0 || ^17.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/cdk/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "optional": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@angular/cdk/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "optional": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/@angular/cli": { "version": "16.2.10", "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.2.10.tgz", @@ -4312,6 +4355,25 @@ "rxjs": ">=6.0.0" } }, + "node_modules/@taiga-ui/addon-mobile": { + "version": "3.53.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-mobile/-/addon-mobile-3.53.0.tgz", + "integrity": "sha512-MHfG7I488fyT5NCOvQvCCgCMzIcYFO0MgfNGowcm/nyVaXcTzINF2JWMmdSbMJHCVBFy5xl2CQl0kjOFLYYg9g==", + "dependencies": { + "tslib": ">=2.0.0" + }, + "peerDependencies": { + "@angular/cdk": ">=12.0.0", + "@angular/common": ">=12.0.0", + "@angular/core": ">=12.0.0", + "@ng-web-apis/common": ">=3.0.0", + "@taiga-ui/cdk": ">=3.53.0", + "@taiga-ui/core": ">=3.53.0", + "@taiga-ui/kit": ">=3.53.0", + "@tinkoff/ng-polymorpheus": ">=4.0.0", + "rxjs": ">=6.0.0" + } + }, "node_modules/@taiga-ui/cdk": { "version": "3.53.0", "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.53.0.tgz", diff --git a/web/package.json b/web/package.json index d2219f5bb..8b313ccf1 100644 --- a/web/package.json +++ b/web/package.json @@ -11,7 +11,7 @@ "check:install": "tsc --project projects/install-wizard/tsconfig.json --noEmit --skipLibCheck", "check:setup": "tsc --project projects/setup-wizard/tsconfig.json --noEmit --skipLibCheck", "check:ui": "tsc --project projects/ui/tsconfig.json --noEmit --skipLibCheck", - "build:deps": "rm -rf .angular/cache && cd ../patch-db/client && npm ci && npm run build", + "build:deps": "npx rimraf .angular/cache && cd ../patch-db/client && npm ci && npm run build", "build:install": "ng run install-wizard:build", "build:setup": "ng run setup-wizard:build", "build:ui": "ng run ui:build", @@ -31,6 +31,7 @@ }, "dependencies": { "@angular/animations": "^16.1.4", + "@angular/cdk": "^16.1.4", "@angular/common": "^16.1.4", "@angular/compiler": "^16.1.4", "@angular/core": "^16.1.4", @@ -46,6 +47,7 @@ "@start9labs/emver": "^0.1.5", "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc8.beta2", "@taiga-ui/addon-charts": "3.53.0", + "@taiga-ui/addon-mobile": "3.53.0", "@taiga-ui/cdk": "3.53.0", "@taiga-ui/core": "3.53.0", "@taiga-ui/experimental": "3.53.0", @@ -53,6 +55,7 @@ "@taiga-ui/kit": "3.53.0", "@taiga-ui/styles": "3.53.0", "@tinkoff/ng-dompurify": "4.0.0", + "@tinkoff/ng-event-plugins": "3.1.0", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", "cbor": "npm:@jprochazk/cbor@^0.4.9", diff --git a/web/projects/setup-wizard/src/app/services/api/api.service.ts b/web/projects/setup-wizard/src/app/services/api/api.service.ts index 0b94cd39d..019524eac 100644 --- a/web/projects/setup-wizard/src/app/services/api/api.service.ts +++ b/web/projects/setup-wizard/src/app/services/api/api.service.ts @@ -4,6 +4,8 @@ import { StartOSDiskInfo, Log, SetupStatus, + FollowLogsRes, + FollowLogsReq, } from '@start9labs/shared' import { Observable } from 'rxjs' import { WebSocketSubjectConfig } from 'rxjs/webSocket' @@ -19,7 +21,7 @@ export abstract class ApiService { abstract execute(setupInfo: ExecuteReq): Promise // setup.execute abstract complete(): Promise // setup.complete abstract exit(): Promise // setup.exit - abstract followLogs(): Promise // setup.logs.follow + abstract followServerLogs(params: FollowLogsReq): Promise // setup.logs.follow abstract openLogsWebsocket$( config: WebSocketSubjectConfig, ): Observable diff --git a/web/projects/setup-wizard/src/app/services/api/live-api.service.ts b/web/projects/setup-wizard/src/app/services/api/live-api.service.ts index 808258015..b13967f91 100644 --- a/web/projects/setup-wizard/src/app/services/api/live-api.service.ts +++ b/web/projects/setup-wizard/src/app/services/api/live-api.service.ts @@ -9,6 +9,8 @@ import { RpcError, RPCOptions, SetupStatus, + FollowLogsRes, + FollowLogsReq, } from '@start9labs/shared' import { ApiService, @@ -90,8 +92,8 @@ export class LiveApiService extends ApiService { }) } - async followLogs(): Promise { - return this.rpcRequest({ method: 'setup.logs.follow', params: {} }) + async followServerLogs(params: FollowLogsReq): Promise { + return this.rpcRequest({ method: 'setup.logs.follow', params }) } openLogsWebsocket$({ url }: WebSocketSubjectConfig): Observable { diff --git a/web/projects/setup-wizard/src/app/services/api/mock-api.service.ts b/web/projects/setup-wizard/src/app/services/api/mock-api.service.ts index 375cd2135..e170683eb 100644 --- a/web/projects/setup-wizard/src/app/services/api/mock-api.service.ts +++ b/web/projects/setup-wizard/src/app/services/api/mock-api.service.ts @@ -1,6 +1,8 @@ import { Injectable } from '@angular/core' import { encodeBase64, + FollowLogsReq, + FollowLogsRes, getSetupStatusMock, Log, pauseFor, @@ -134,9 +136,12 @@ export class MockApiService extends ApiService { await pauseFor(1000) } - async followLogs(): Promise { + async followServerLogs(params: FollowLogsReq): Promise { await pauseFor(1000) - return 'fake-guid' + return { + 'start-cursor': 'fakestartcursor', + guid: 'fake-guid', + } } openLogsWebsocket$(config: WebSocketSubjectConfig): Observable { diff --git a/web/projects/shared/src/services/setup-logs.service.ts b/web/projects/shared/src/services/setup-logs.service.ts index 1c3182e29..cf1ce7738 100644 --- a/web/projects/shared/src/services/setup-logs.service.ts +++ b/web/projects/shared/src/services/setup-logs.service.ts @@ -1,11 +1,11 @@ import { StaticClassProvider } from '@angular/core' import { defer, Observable, switchMap } from 'rxjs' import { WebSocketSubjectConfig } from 'rxjs/webSocket' -import { Log } from '../types/api' +import { FollowLogsReq, FollowLogsRes, Log } from '../types/api' import { Constructor } from '../types/constructor' interface Api { - followLogs: () => Promise + followServerLogs: (params: FollowLogsReq) => Promise openLogsWebsocket$: (config: WebSocketSubjectConfig) => Observable } @@ -20,8 +20,10 @@ export function provideSetupLogsService( } export class SetupLogsService extends Observable { - private readonly log$ = defer(() => this.api.followLogs()).pipe( - switchMap(url => this.api.openLogsWebsocket$({ url })), + private readonly log$ = defer(() => this.api.followServerLogs({})).pipe( + switchMap(({ guid }) => + this.api.openLogsWebsocket$({ url: `/rpc/${guid}` }), + ), ) constructor(private readonly api: Api) { diff --git a/web/projects/shared/src/types/api.ts b/web/projects/shared/src/types/api.ts index 419e99a07..895ce2cb2 100644 --- a/web/projects/shared/src/types/api.ts +++ b/web/projects/shared/src/types/api.ts @@ -1,10 +1,16 @@ -export type ServerLogsReq = { +export type FollowLogsReq = {} +export type FollowLogsRes = { + 'start-cursor': string + guid: string +} + +export type FetchLogsReq = { before: boolean cursor?: string limit?: number } -export type LogsRes = { +export type FetchLogsRes = { entries: Log[] 'start-cursor'?: string 'end-cursor'?: string diff --git a/web/projects/shared/styles/taiga.scss b/web/projects/shared/styles/taiga.scss index ea9cd857b..2df7487b8 100644 --- a/web/projects/shared/styles/taiga.scss +++ b/web/projects/shared/styles/taiga.scss @@ -96,3 +96,8 @@ tui-dropdown[data-appearance='start-os'][data-appearance='start-os'] { } } } + +[tuiSidebar] > div.t-wrapper { + backdrop-filter: blur(1rem); + background: rgb(34 34 34 / 80%); +} diff --git a/web/projects/ui/src/app/app.component.html b/web/projects/ui/src/app/app.component.html index ceac3e214..dbb0ae039 100644 --- a/web/projects/ui/src/app/app.component.html +++ b/web/projects/ui/src/app/app.component.html @@ -18,7 +18,7 @@ class="left-menu" > - + @@ -38,7 +38,7 @@ (click)="onResize(drawer)" >
- + - + - + + - - + + - + - - + + diff --git a/web/projects/ui/src/app/app.module.ts b/web/projects/ui/src/app/app.module.ts index 64787ff00..e573debd4 100644 --- a/web/projects/ui/src/app/app.module.ts +++ b/web/projects/ui/src/app/app.module.ts @@ -34,6 +34,7 @@ import { ConnectionBarComponentModule } from './app/connection-bar/connection-ba import { WidgetsPageModule } from 'src/app/apps/ui/pages/widgets/widgets.module' import { ServiceWorkerModule } from '@angular/service-worker' import { environment } from '../environments/environment' +import { SidebarHostComponent } from './app/sidebar-host.component' @NgModule({ declarations: [AppComponent], @@ -72,6 +73,7 @@ import { environment } from '../environments/environment' }), LoadingModule, QRComponentModule, + SidebarHostComponent, ], providers: APP_PROVIDERS, bootstrap: [AppComponent], diff --git a/web/projects/ui/src/app/app/menu/menu.component.ts b/web/projects/ui/src/app/app/menu/menu.component.ts index 39d8900e5..48a2ee6f7 100644 --- a/web/projects/ui/src/app/app/menu/menu.component.ts +++ b/web/projects/ui/src/app/app/menu/menu.component.ts @@ -68,7 +68,8 @@ export class MenuComponent { readonly notificationCount$ = this.patch.watch$( 'server-info', - 'unread-notification-count', + 'unreadNotifications', + 'count', ) readonly snekScore$ = this.patch.watch$('ui', 'gaming', 'snake', 'high-score') diff --git a/web/projects/ui/src/app/app/sidebar-host.component.ts b/web/projects/ui/src/app/app/sidebar-host.component.ts new file mode 100644 index 000000000..b8585d56e --- /dev/null +++ b/web/projects/ui/src/app/app/sidebar-host.component.ts @@ -0,0 +1,35 @@ +import { + ChangeDetectionStrategy, + Component, + Directive, + Injectable, +} from '@angular/core' +import { + AbstractTuiPortalHostComponent, + AbstractTuiPortalService, + TuiDropdownPortalService, +} from '@taiga-ui/cdk' + +@Injectable({ providedIn: `root` }) +export class SidebarService extends AbstractTuiPortalService {} + +@Directive({ + selector: '[tuiSidebar]', + standalone: true, + providers: [ + { provide: TuiDropdownPortalService, useExisting: SidebarService }, + ], +}) +export class SidebarDirective {} + +@Component({ + selector: 'sidebar-host', + template: '', + styles: [':host { position: fixed; top: 0; }'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + providers: [ + { provide: AbstractTuiPortalService, useExisting: SidebarService }, + ], +}) +export class SidebarHostComponent extends AbstractTuiPortalHostComponent {} diff --git a/web/projects/ui/src/app/apps/diagnostic/services/diagnostic.service.ts b/web/projects/ui/src/app/apps/diagnostic/services/diagnostic.service.ts index e8bd20a28..a22ca567d 100644 --- a/web/projects/ui/src/app/apps/diagnostic/services/diagnostic.service.ts +++ b/web/projects/ui/src/app/apps/diagnostic/services/diagnostic.service.ts @@ -1,4 +1,4 @@ -import { LogsRes, ServerLogsReq } from '@start9labs/shared' +import { FetchLogsReq, FetchLogsRes } from '@start9labs/shared' export abstract class DiagnosticService { abstract getError(): Promise @@ -6,7 +6,7 @@ export abstract class DiagnosticService { abstract forgetDrive(): Promise abstract repairDisk(): Promise abstract systemRebuild(): Promise - abstract getLogs(params: ServerLogsReq): Promise + abstract getLogs(params: FetchLogsReq): Promise } export interface GetErrorRes { diff --git a/web/projects/ui/src/app/apps/diagnostic/services/live-diagnostic.service.ts b/web/projects/ui/src/app/apps/diagnostic/services/live-diagnostic.service.ts index dc4d3e9c4..3930abe9e 100644 --- a/web/projects/ui/src/app/apps/diagnostic/services/live-diagnostic.service.ts +++ b/web/projects/ui/src/app/apps/diagnostic/services/live-diagnostic.service.ts @@ -5,7 +5,7 @@ import { RpcError, RPCOptions, } from '@start9labs/shared' -import { LogsRes, ServerLogsReq } from '@start9labs/shared' +import { FetchLogsReq, FetchLogsRes } from '@start9labs/shared' import { DiagnosticService, GetErrorRes } from './diagnostic.service' @Injectable() @@ -47,8 +47,8 @@ export class LiveDiagnosticService implements DiagnosticService { }) } - async getLogs(params: ServerLogsReq): Promise { - return this.rpcRequest({ + async getLogs(params: FetchLogsReq): Promise { + return this.rpcRequest({ method: 'diagnostic.logs', params, }) diff --git a/web/projects/ui/src/app/apps/diagnostic/services/mock-diagnostic.service.ts b/web/projects/ui/src/app/apps/diagnostic/services/mock-diagnostic.service.ts index 4a16f3e58..f7c847a19 100644 --- a/web/projects/ui/src/app/apps/diagnostic/services/mock-diagnostic.service.ts +++ b/web/projects/ui/src/app/apps/diagnostic/services/mock-diagnostic.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core' import { pauseFor } from '@start9labs/shared' -import { LogsRes, ServerLogsReq, Log } from '@start9labs/shared' +import { FetchLogsReq, FetchLogsRes, Log } from '@start9labs/shared' import { DiagnosticService, GetErrorRes } from './diagnostic.service' @Injectable() @@ -30,7 +30,7 @@ export class MockDiagnosticService implements DiagnosticService { await pauseFor(1000) } - async getLogs(params: ServerLogsReq): Promise { + async getLogs(params: FetchLogsReq): Promise { await pauseFor(1000) let entries: Log[] if (Math.random() < 0.2) { diff --git a/web/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html b/web/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html index 8be5ae964..5b1a3c1f7 100644 --- a/web/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html +++ b/web/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html @@ -22,7 +22,7 @@

System Utilities

empty: empty " appCard - [badge]="item.key | toNotifications | async" + [badge]="item.key | toBadge | async" [drawerItem]="item.key" [id]="item.key" [title]="item.value.title" diff --git a/web/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts b/web/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts index 2bf63a14c..9bfca5632 100644 --- a/web/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts +++ b/web/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts @@ -24,7 +24,7 @@ import { ServicesService } from '../../services/services.service' import { toRouterLink } from '../../utils/to-router-link' import { DrawerItemDirective } from './drawer-item.directive' import { SYSTEM_UTILITIES } from '../../constants/system-utilities' -import { ToNotificationsPipe } from '../../pipes/to-notifications' +import { ToBadgePipe } from '../../pipes/to-badge' @Component({ selector: 'app-drawer', @@ -45,7 +45,7 @@ import { ToNotificationsPipe } from '../../pipes/to-notifications' TuiFilterPipeModule, CardComponent, DrawerItemDirective, - ToNotificationsPipe, + ToBadgePipe, ], }) export class DrawerComponent { diff --git a/web/projects/ui/src/app/apps/portal/components/header/header-menu.component.ts b/web/projects/ui/src/app/apps/portal/components/header/header-menu.component.ts new file mode 100644 index 000000000..28f6fad05 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/components/header/header-menu.component.ts @@ -0,0 +1,109 @@ +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { + TuiDataListModule, + TuiHostedDropdownModule, + TuiSvgModule, +} from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { AuthService } from 'src/app/services/auth.service' + +@Component({ + selector: 'header-menu', + template: ` + + + + +

StartOS

+ + + + + + + + + + + + + + +
+
+
+ `, + styles: [ + ` + .item { + justify-content: flex-start; + gap: 0.75rem; + } + + .title { + margin: 0; + padding: 0 0.5rem 0.25rem; + white-space: nowrap; + font: var(--tui-font-text-l); + font-weight: bold; + } + + .external { + margin-left: auto; + padding-left: 0.5rem; + } + `, + ], + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + TuiHostedDropdownModule, + TuiDataListModule, + TuiSvgModule, + TuiButtonModule, + ], +}) +export class HeaderMenuComponent { + private readonly api = inject(ApiService) + private readonly auth = inject(AuthService) + + logout() { + this.api.logout({}).catch(e => console.error('Failed to log out', e)) + this.auth.setUnverified() + } +} diff --git a/web/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.html b/web/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.html deleted file mode 100644 index c6db54658..000000000 --- a/web/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - -

StartOS

- - - - - - - - - - - - - - -
-
-
diff --git a/web/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.scss b/web/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.scss deleted file mode 100644 index 37973ef33..000000000 --- a/web/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.scss +++ /dev/null @@ -1,17 +0,0 @@ -.item { - justify-content: flex-start; - gap: 0.75rem; -} - -.title { - margin: 0; - padding: 0 0.5rem 0.25rem; - white-space: nowrap; - font: var(--tui-font-text-l); - font-weight: bold; -} - -.external { - margin-left: auto; - padding-left: 0.5rem; -} diff --git a/web/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts b/web/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts deleted file mode 100644 index 5a08d4ba9..000000000 --- a/web/projects/ui/src/app/apps/portal/components/header/header-menu/header-menu.component.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { ChangeDetectionStrategy, Component, inject } from '@angular/core' -import { - TuiDataListModule, - TuiHostedDropdownModule, - TuiSvgModule, -} from '@taiga-ui/core' -import { TuiButtonModule } from '@taiga-ui/experimental' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { AuthService } from 'src/app/services/auth.service' - -@Component({ - selector: 'header-menu', - templateUrl: 'header-menu.component.html', - styleUrls: ['header-menu.component.scss'], - standalone: true, - changeDetection: ChangeDetectionStrategy.OnPush, - imports: [ - TuiHostedDropdownModule, - TuiDataListModule, - TuiSvgModule, - TuiButtonModule, - ], -}) -export class HeaderMenuComponent { - private readonly api = inject(ApiService) - private readonly auth = inject(AuthService) - - logout() { - this.api.logout({}).catch(e => console.error('Failed to log out', e)) - this.auth.setUnverified() - } -} diff --git a/web/projects/ui/src/app/apps/portal/components/header/header-notification.component.ts b/web/projects/ui/src/app/apps/portal/components/header/header-notification.component.ts new file mode 100644 index 000000000..fa1e8a4be --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/components/header/header-notification.component.ts @@ -0,0 +1,85 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + inject, + Input, +} from '@angular/core' +import { TuiSvgModule } from '@taiga-ui/core' +import { TuiButtonModule, TuiTitleModule } from '@taiga-ui/experimental' +import { TuiLineClampModule } from '@taiga-ui/kit' +import { ServerNotification } from 'src/app/services/api/api.types' +import { NotificationService } from '../../services/notification.service' + +@Component({ + selector: 'header-notification', + template: ` + +
+
+
+ {{ notification.title }} +
+ +
+ + + + +
+
+ + `, + styles: [':host { box-shadow: 0 1px var(--tui-clear); }'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + TuiSvgModule, + TuiTitleModule, + TuiButtonModule, + TuiLineClampModule, + ], +}) +export class HeaderNotificationComponent { + readonly service = inject(NotificationService) + + @Input({ required: true }) notification!: ServerNotification + + overflow = false + + get color(): string { + return this.service.getColor(this.notification) + } + + get icon(): string { + return this.service.getIcon(this.notification) + } +} diff --git a/web/projects/ui/src/app/apps/portal/components/header/header-notifications.component.ts b/web/projects/ui/src/app/apps/portal/components/header/header-notifications.component.ts new file mode 100644 index 000000000..afe60b05e --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/components/header/header-notifications.component.ts @@ -0,0 +1,145 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + Output, + inject, + EventEmitter, +} from '@angular/core' +import { RouterLink } from '@angular/router' +import { TuiForModule } from '@taiga-ui/cdk' +import { TuiScrollbarModule } from '@taiga-ui/core' +import { + TuiAvatarStackModule, + TuiButtonModule, + TuiCellModule, + TuiTitleModule, +} from '@taiga-ui/experimental' +import { PatchDB } from 'patch-db-client' +import { Subject, first, tap } from 'rxjs' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { HeaderNotificationComponent } from './header-notification.component' +import { toRouterLink } from '../../utils/to-router-link' +import { + ServerNotification, + ServerNotifications, +} from 'src/app/services/api/api.types' +import { NotificationService } from '../../services/notification.service' + +@Component({ + selector: 'header-notifications', + template: ` + +

+ Notifications + + Mark All Seen + +

+ + + + {{ $any(packageData[pkgId])?.manifest.title || pkgId }} + + + + View Service + + + + + View All + +
+ `, + styles: [ + ` + :host { + display: flex; + flex-direction: column; + height: 100%; + width: 22rem; + max-width: 80vw; + } + `, + ], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + RouterLink, + TuiForModule, + TuiScrollbarModule, + TuiButtonModule, + HeaderNotificationComponent, + TuiCellModule, + TuiAvatarStackModule, + TuiTitleModule, + ], +}) +export class HeaderNotificationsComponent { + private readonly patch = inject(PatchDB) + private readonly service = inject(NotificationService) + + readonly packageData$ = this.patch.watch$('package-data').pipe(first()) + + readonly notifications$ = new Subject() + + @Output() onEmpty = new EventEmitter() + + ngAfterViewInit() { + this.patch + .watch$('server-info', 'unreadNotifications', 'recent') + .pipe( + tap(recent => this.notifications$.next(recent)), + first(), + ) + .subscribe() + } + + markSeen( + current: ServerNotifications, + notification: ServerNotification, + ) { + this.notifications$.next(current.filter(c => c.id !== notification.id)) + + if (current.length === 1) this.onEmpty.emit() + + this.service.markSeen([notification]) + } + + markAllSeen(latestId: number) { + this.notifications$.next([]) + + this.service.markSeenAll(latestId) + + this.onEmpty.emit() + } + + getLink(id: string) { + return toRouterLink(id) + } +} diff --git a/web/projects/ui/src/app/apps/portal/components/header/header.component.html b/web/projects/ui/src/app/apps/portal/components/header/header.component.html deleted file mode 100644 index 5a0c60aa5..000000000 --- a/web/projects/ui/src/app/apps/portal/components/header/header.component.html +++ /dev/null @@ -1,13 +0,0 @@ - -
- - - 4 - - - -
diff --git a/web/projects/ui/src/app/apps/portal/components/header/header.component.scss b/web/projects/ui/src/app/apps/portal/components/header/header.component.scss deleted file mode 100644 index 71d68d68f..000000000 --- a/web/projects/ui/src/app/apps/portal/components/header/header.component.scss +++ /dev/null @@ -1,14 +0,0 @@ -:host { - display: flex; - align-items: center; - height: 4.5rem; - padding: 0 1rem 0 2rem; - font-size: 1.5rem; - // TODO: Theme - background: rgb(51 51 51 / 84%); -} - -.toolbar { - display: flex; - margin-left: auto; -} diff --git a/web/projects/ui/src/app/apps/portal/components/header/header.component.ts b/web/projects/ui/src/app/apps/portal/components/header/header.component.ts index 1ef1c3005..3ee4f951f 100644 --- a/web/projects/ui/src/app/apps/portal/components/header/header.component.ts +++ b/web/projects/ui/src/app/apps/portal/components/header/header.component.ts @@ -1,4 +1,15 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' +import { CommonModule } from '@angular/common' +import { Router } from '@angular/router' +import { TuiSidebarModule } from '@taiga-ui/addon-mobile' +import { + ChangeDetectionStrategy, + Component, + ElementRef, + HostListener, + inject, + ViewChild, +} from '@angular/core' +import { tuiContainsOrAfter, tuiIsElement, TuiLetModule } from '@taiga-ui/cdk' import { TuiDataListModule, TuiHostedDropdownModule, @@ -9,22 +20,105 @@ import { TuiBadgeNotificationModule, TuiButtonModule, } from '@taiga-ui/experimental' -import { HeaderMenuComponent } from './header-menu/header-menu.component' +import { Subject } from 'rxjs' +import { SidebarDirective } from '../../../../app/sidebar-host.component' +import { HeaderMenuComponent } from './header-menu.component' +import { HeaderNotificationsComponent } from './header-notifications.component' +import { NotificationService } from '../../services/notification.service' @Component({ selector: 'header[appHeader]', - templateUrl: 'header.component.html', - styleUrls: ['header.component.scss'], + template: ` + + + + + {{ unread }} + + + + + + `, + styles: [ + ` + :host { + display: flex; + align-items: center; + height: 4.5rem; + padding: 0 1rem 0 2rem; + font-size: 1.5rem; + // TODO: Theme + background: rgb(51 51 51 / 84%); + } + `, + ], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [ + CommonModule, TuiBadgedContentModule, TuiBadgeNotificationModule, TuiButtonModule, TuiHostedDropdownModule, TuiDataListModule, TuiSvgModule, + TuiSidebarModule, + SidebarDirective, HeaderMenuComponent, + HeaderNotificationsComponent, + TuiLetModule, ], }) -export class HeaderComponent {} +export class HeaderComponent { + private readonly router = inject(Router) + readonly notificationService = inject(NotificationService) + + @ViewChild(HeaderNotificationsComponent, { read: ElementRef }) + private readonly panel?: ElementRef + + private readonly _ = this.router.events.subscribe(() => { + this.open$.next(false) + }) + + readonly open$ = new Subject() + + @HostListener('document:click.capture', ['$event.target']) + onClick(target: EventTarget | null) { + if ( + tuiIsElement(target) && + this.panel?.nativeElement && + !tuiContainsOrAfter(this.panel.nativeElement, target) + ) { + this.open$.next(false) + } + } + + handleNotificationsClick(unread: number) { + if (unread) { + this.open$.next(true) + } else { + this.router.navigateByUrl('/portal/system/notifications') + } + } +} diff --git a/web/projects/ui/src/app/apps/portal/constants/system-utilities.ts b/web/projects/ui/src/app/apps/portal/constants/system-utilities.ts index 3ddfdd947..c177dff7e 100644 --- a/web/projects/ui/src/app/apps/portal/constants/system-utilities.ts +++ b/web/projects/ui/src/app/apps/portal/constants/system-utilities.ts @@ -16,4 +16,8 @@ export const SYSTEM_UTILITIES: Record = icon: 'assets/img/icon_transparent.png', title: 'Snek', }, + '/portal/system/notifications': { + icon: 'tuiIconBellLarge', + title: 'Notifications', + }, } diff --git a/web/projects/ui/src/app/apps/portal/routes/system/backups/modals/report.component.ts b/web/projects/ui/src/app/apps/portal/modals/report.component.ts similarity index 100% rename from web/projects/ui/src/app/apps/portal/routes/system/backups/modals/report.component.ts rename to web/projects/ui/src/app/apps/portal/modals/report.component.ts diff --git a/web/projects/ui/src/app/apps/portal/pipes/to-badge.ts b/web/projects/ui/src/app/apps/portal/pipes/to-badge.ts new file mode 100644 index 000000000..04aad4ec1 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/pipes/to-badge.ts @@ -0,0 +1,15 @@ +import { inject, Pipe, PipeTransform } from '@angular/core' +import { BadgeService } from '../services/badge.service' +import { Observable } from 'rxjs' + +@Pipe({ + name: 'toBadge', + standalone: true, +}) +export class ToBadgePipe implements PipeTransform { + readonly badge = inject(BadgeService) + + transform(id: string): Observable { + return this.badge.getCount(id) + } +} diff --git a/web/projects/ui/src/app/apps/portal/pipes/to-notifications.ts b/web/projects/ui/src/app/apps/portal/pipes/to-notifications.ts deleted file mode 100644 index fb5add305..000000000 --- a/web/projects/ui/src/app/apps/portal/pipes/to-notifications.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { inject, Pipe, PipeTransform } from '@angular/core' -import { NotificationsService } from '../services/notifications.service' -import { Observable } from 'rxjs' - -@Pipe({ - name: 'toNotifications', - standalone: true, -}) -export class ToNotificationsPipe implements PipeTransform { - readonly notifications = inject(NotificationsService) - - transform(id: string): Observable { - return this.notifications.getNotifications(id) - } -} diff --git a/web/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html b/web/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html index 4b993c6c5..0945fda7e 100644 --- a/web/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html +++ b/web/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.html @@ -33,7 +33,7 @@ appCard @tuiFadeIn [id]="item" - [badge]="item | toNotifications | async" + [badge]="item | toBadge | async" [title]="navigationItem.title" [icon]="navigationItem.icon" [routerLink]="navigationItem.routerLink" diff --git a/web/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts b/web/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts index a68955baf..34932972c 100644 --- a/web/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts +++ b/web/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts @@ -8,7 +8,7 @@ import { TuiTilesModule } from '@taiga-ui/kit' import { DesktopComponent } from './desktop.component' import { CardComponent } from '../../components/card/card.component' import { ToNavigationItemPipe } from '../../pipes/to-navigation-item' -import { ToNotificationsPipe } from '../../pipes/to-notifications' +import { ToBadgePipe } from '../../pipes/to-badge' import { DesktopItemDirective } from './desktop-item.directive' const ROUTES: Routes = [ @@ -30,7 +30,7 @@ const ROUTES: Routes = [ RouterModule.forChild(ROUTES), TuiFadeModule, DragScrollerDirective, - ToNotificationsPipe, + ToBadgePipe, ], declarations: [DesktopComponent], exports: [DesktopComponent], diff --git a/web/projects/ui/src/app/apps/portal/routes/system/backups/modals/history.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/modals/history.component.ts index ad38c6aeb..fd3a59d8d 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/backups/modals/history.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/backups/modals/history.component.ts @@ -14,10 +14,10 @@ import { TuiCheckboxModule } from '@taiga-ui/kit' import { BehaviorSubject } from 'rxjs' import { BackupRun } from 'src/app/services/api/api.types' import { ApiService } from 'src/app/services/api/embassy-api.service' +import { REPORT } from 'src/app/apps/portal/modals/report.component' import { DurationPipe } from '../pipes/duration.pipe' import { HasErrorPipe } from '../pipes/has-error.pipe' import { GetBackupIconPipe } from '../pipes/get-backup-icon.pipe' -import { REPORT } from './report.component' @Component({ template: ` diff --git a/web/projects/ui/src/app/apps/portal/routes/system/notifications/item.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/notifications/item.component.ts new file mode 100644 index 000000000..87c3d1442 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/notifications/item.component.ts @@ -0,0 +1,91 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + Input, + inject, +} from '@angular/core' +import { RouterLink } from '@angular/router' +import { Manifest } from '@start9labs/marketplace' +import { tuiPure } from '@taiga-ui/cdk' +import { TuiSvgModule } from '@taiga-ui/core' +import { TuiLineClampModule } from '@taiga-ui/kit' +import { PatchDB } from 'patch-db-client' +import { Observable, first } from 'rxjs' +import { ServerNotification } from 'src/app/services/api/api.types' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { NotificationService } from '../../../services/notification.service' +import { toRouterLink } from '../../../utils/to-router-link' + +@Component({ + selector: '[notificationItem]', + template: ` + + {{ notificationItem['created-at'] | date : 'MMM d, y, h:mm a' }} + + + {{ notificationItem.title }} + + + + {{ manifest.title }} + + N/A + + + + + View Full + + + View Report + + + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, RouterLink, TuiLineClampModule, TuiSvgModule], +}) +export class NotificationItemComponent { + private readonly patch = inject(PatchDB) + readonly service = inject(NotificationService) + + @Input({ required: true }) notificationItem!: ServerNotification + + overflow = false + + @tuiPure + get manifest$(): Observable { + return this.patch + .watch$( + 'package-data', + this.notificationItem['package-id'] || '', + 'manifest', + ) + .pipe(first()) + } + + get color(): string { + return this.service.getColor(this.notificationItem) + } + + get icon(): string { + return this.service.getIcon(this.notificationItem) + } + + getLink(id: string) { + return toRouterLink(id) + } +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/notifications/notifications.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/notifications/notifications.component.ts new file mode 100644 index 000000000..59a95ce2a --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/notifications/notifications.component.ts @@ -0,0 +1,123 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { Subject } from 'rxjs' +import { RR, ServerNotifications } from 'src/app/services/api/api.types' +import { NotificationService } from '../../../services/notification.service' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { ErrorService } from '@start9labs/shared' +import { TuiLetModule } from '@taiga-ui/cdk' +import { TuiButtonModule } from '@taiga-ui/experimental' +import { TuiDataListModule, TuiHostedDropdownModule } from '@taiga-ui/core' +import { NotificationsTableComponent } from './table.component' + +@Component({ + template: ` + +

+ Notifications + + + + + + + + + + + + +

+
+
+ `, + host: { class: 'g-page' }, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + TuiHostedDropdownModule, + TuiButtonModule, + TuiDataListModule, + NotificationsTableComponent, + TuiLetModule, + ], +}) +export class NotificationsComponent { + readonly service = inject(NotificationService) + readonly api = inject(ApiService) + readonly errorService = inject(ErrorService) + + readonly notifications$ = new Subject() + + open = false + + ngOnInit() { + this.getMore({}) + } + + async getMore(params: RR.GetNotificationsReq) { + try { + this.notifications$.next(null) + this.notifications$.next(await this.api.getNotifications(params)) + } catch (e: any) { + this.errorService.handleError(e) + } + } + + markSeen(current: ServerNotifications, toUpdate: ServerNotifications) { + this.open = false + + this.notifications$.next( + current.map(c => ({ + ...c, + read: toUpdate.some(n => n.id === c.id) || c.read, + })), + ) + + this.service.markSeen(toUpdate) + } + + markUnseen(current: ServerNotifications, toUpdate: ServerNotifications) { + this.open = false + + this.notifications$.next( + current.map(c => ({ + ...c, + read: c.read && !toUpdate.some(n => n.id === c.id), + })), + ) + + this.service.markUnseen(toUpdate) + } + + remove(current: ServerNotifications, toDelete: ServerNotifications) { + this.open = false + + this.notifications$.next( + current.filter(c => !toDelete.some(n => n.id === c.id)), + ) + + this.service.remove(toDelete) + } +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/notifications/table.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/notifications/table.component.ts new file mode 100644 index 000000000..27f97aefd --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/notifications/table.component.ts @@ -0,0 +1,113 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + Input, + OnChanges, +} from '@angular/core' +import { + ServerNotification, + ServerNotifications, +} from 'src/app/services/api/api.types' +import { TuiForModule } from '@taiga-ui/cdk' +import { BehaviorSubject } from 'rxjs' +import { TuiLineClampModule } from '@taiga-ui/kit' +import { FormsModule } from '@angular/forms' +import { NotificationItemComponent } from './item.component' +import { TuiCheckboxModule } from '@taiga-ui/experimental' + +@Component({ + selector: 'table[notifications]', + template: ` + + + + + + Date + Title + Service + Message + + + + + + + + + You have no notifications + + + + +
Loading
+ +
+ + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + TuiForModule, + TuiCheckboxModule, + FormsModule, + TuiLineClampModule, + NotificationItemComponent, + ], +}) +export class NotificationsTableComponent implements OnChanges { + @Input() notifications: ServerNotifications | null = null + + get all(): boolean | null { + if (!this.notifications?.length || !this.selected$.value.length) { + return false + } + + if (this.notifications?.length === this.selected$.value.length) { + return true + } + + return null + } + + readonly selected$ = new BehaviorSubject([]) + + ngOnChanges() { + this.selected$.next([]) + } + + onAll(selected: boolean) { + this.selected$.next((selected && this.notifications) || []) + } + + handleToggle(notification: ServerNotification) { + const selected = this.selected$.value + + if (selected.some(s => s.id === notification.id)) { + this.selected$.next(selected.filter(s => s.id !== notification.id)) + } else { + this.selected$.next([...selected, notification]) + } + } +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/system.module.ts b/web/projects/ui/src/app/apps/portal/routes/system/system.module.ts index cc5638b33..c4e74cd71 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/system.module.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/system.module.ts @@ -11,6 +11,15 @@ const ROUTES: Routes = [ import('./backups/backups.component').then(m => m.BackupsComponent), data: toNavigationItem('/portal/system/backups'), }, + { + title: systemTabResolver, + path: 'notifications', + loadComponent: () => + import('./notifications/notifications.component').then( + m => m.NotificationsComponent, + ), + data: toNavigationItem('/portal/system/notifications'), + }, { title: systemTabResolver, path: 'sideload', diff --git a/web/projects/ui/src/app/apps/portal/services/notifications.service.ts b/web/projects/ui/src/app/apps/portal/services/badge.service.ts similarity index 92% rename from web/projects/ui/src/app/apps/portal/services/notifications.service.ts rename to web/projects/ui/src/app/apps/portal/services/badge.service.ts index 1c8eeb8a0..e8ff3982f 100644 --- a/web/projects/ui/src/app/apps/portal/services/notifications.service.ts +++ b/web/projects/ui/src/app/apps/portal/services/badge.service.ts @@ -20,7 +20,7 @@ import { ConnectionService } from 'src/app/services/connection.service' @Injectable({ providedIn: 'root', }) -export class NotificationsService { +export class BadgeService { private readonly emver = inject(Emver) private readonly patch = inject(PatchDB) private readonly marketplace = inject( @@ -47,7 +47,7 @@ export class NotificationsService { ), ) - private readonly updates$ = combineLatest([ + private readonly updateCount$ = combineLatest([ this.marketplace.getMarketplace$(true), this.local$, ]).pipe( @@ -67,10 +67,10 @@ export class NotificationsService { ), ) - getNotifications(id: string): Observable { + getCount(id: string): Observable { switch (id) { case '/portal/system/updates': - return this.updates$ + return this.updateCount$ default: return EMPTY } diff --git a/web/projects/ui/src/app/apps/portal/services/notification.service.ts b/web/projects/ui/src/app/apps/portal/services/notification.service.ts new file mode 100644 index 000000000..0c17c4f48 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/services/notification.service.ts @@ -0,0 +1,116 @@ +import { inject, Injectable } from '@angular/core' +import { ErrorService } from '@start9labs/shared' +import { TuiDialogService } from '@taiga-ui/core' +import { + NotificationLevel, + ServerNotification, + ServerNotifications, +} from 'src/app/services/api/api.types' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { REPORT } from '../modals/report.component' +import { firstValueFrom, merge, shareReplay, Subject } from 'rxjs' +import { PatchDB } from 'patch-db-client' +import { DataModel } from 'src/app/services/patch-db/data-model' + +@Injectable({ providedIn: 'root' }) +export class NotificationService { + private readonly patch = inject(PatchDB) + private readonly errorService = inject(ErrorService) + private readonly api = inject(ApiService) + private readonly dialogs = inject(TuiDialogService) + private readonly localUnreadCount$ = new Subject() + + readonly unreadCount$ = merge( + this.patch.watch$('server-info', 'unreadNotifications', 'count'), + this.localUnreadCount$, + ).pipe(shareReplay(1)) + + async markSeen(notifications: ServerNotifications) { + const ids = notifications.filter(n => !n.read).map(n => n.id) + + this.updateCount(-ids.length) + + this.api + .markSeenNotifications({ ids }) + .catch(e => this.errorService.handleError(e)) + } + + async markSeenAll(latestId: number) { + this.localUnreadCount$.next(0) + + this.api + .markSeenAllNotifications({ before: latestId }) + .catch(e => this.errorService.handleError(e)) + } + + async markUnseen(notifications: ServerNotifications) { + const ids = notifications.filter(n => n.read).map(n => n.id) + + this.updateCount(ids.length) + + this.api + .markUnseenNotifications({ ids }) + .catch(e => this.errorService.handleError(e)) + } + + async remove(notifications: ServerNotifications): Promise { + this.updateCount(-notifications.filter(n => !n.read).length) + + this.api + .deleteNotifications({ ids: notifications.map(n => n.id) }) + .catch(e => this.errorService.handleError(e)) + } + + getColor(notification: ServerNotification): string { + switch (notification.level) { + case NotificationLevel.Info: + return 'var(--tui-info-fill)' + case NotificationLevel.Success: + return 'var(--tui-success-fill)' + case NotificationLevel.Warning: + return 'var(--tui-warning-fill)' + case NotificationLevel.Error: + return 'var(--tui-error-fill)' + default: + return '' + } + } + + getIcon(notification: ServerNotification): string { + switch (notification.level) { + case NotificationLevel.Info: + return 'tuiIconInfo' + case NotificationLevel.Success: + return 'tuiIconCheckCircle' + case NotificationLevel.Warning: + case NotificationLevel.Error: + return 'tuiIconAlertCircle' + default: + return '' + } + } + + viewFull(notification: ServerNotification) { + this.dialogs + .open(notification.message, { label: notification.title }) + .subscribe() + } + + viewReport(notification: ServerNotification) { + this.dialogs + .open(REPORT, { + label: 'Backup Report', + data: { + report: notification.data, + timestamp: notification['created-at'], + }, + }) + .subscribe() + } + + private async updateCount(toAdjust: number) { + const currentCount = await firstValueFrom(this.unreadCount$) + + this.localUnreadCount$.next(Math.max(currentCount + toAdjust, 0)) + } +} diff --git a/web/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.ts b/web/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.ts index 909ffcc75..a057aaf6d 100644 --- a/web/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.ts +++ b/web/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.ts @@ -73,7 +73,7 @@ export class NotificationsPage { const loader = this.loader.open('Deleting...').subscribe() try { - await this.embassyApi.deleteNotification({ id }) + // await this.embassyApi.deleteNotification({ id }) this.notifications.splice(index, 1) this.beforeCursor = this.notifications[this.notifications.length - 1]?.id } catch (e: any) { @@ -98,7 +98,7 @@ export class NotificationsPage { .subscribe(() => this.deleteAll()) } - async viewBackupReport(notification: ServerNotification<1>) { + async viewBackupReport(notification: ServerNotification) { this.dialogs .open(new PolymorpheusComponent(BackupReportComponent), { label: 'Backup Report', @@ -137,9 +137,9 @@ export class NotificationsPage { const loader = this.loader.open('Deleting...').subscribe() try { - await this.embassyApi.deleteAllNotifications({ - before: this.notifications[0].id + 1, - }) + // await this.embassyApi.deleteAllNotifications({ + // before: this.notifications[0].id + 1, + // }) this.notifications = [] this.beforeCursor = undefined } catch (e: any) { diff --git a/web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.ts index 2c41ef6fb..5209ee91e 100644 --- a/web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.ts +++ b/web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.ts @@ -25,7 +25,7 @@ export class ServerMetricsPage { constructor( private readonly api: ApiService, - readonly timeService: TimeService, + private readonly timeService: TimeService, private readonly connectionService: ConnectionService, ) {} diff --git a/web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.ts b/web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.ts index b66d721ae..6e3406375 100644 --- a/web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.ts +++ b/web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.ts @@ -22,7 +22,8 @@ const { enableWidgets } = export class BadgeMenuComponent { readonly unreadCount$ = this.patch.watch$( 'server-info', - 'unread-notification-count', + 'unreadNotifications', + 'count', ) readonly sidebarOpen$ = this.splitPane.sidebarOpen$ readonly widgetDrawer$ = this.clientStorageService.widgetDrawer$ diff --git a/web/projects/ui/src/app/common/logs/logs.component.ts b/web/projects/ui/src/app/common/logs/logs.component.ts index 776d6fa1c..701d09fb4 100644 --- a/web/projects/ui/src/app/common/logs/logs.component.ts +++ b/web/projects/ui/src/app/common/logs/logs.component.ts @@ -13,8 +13,8 @@ import { } from 'rxjs' import { WebSocketSubjectConfig } from 'rxjs/webSocket' import { - LogsRes, - ServerLogsReq, + FetchLogsReq, + FetchLogsRes, toLocalIsoString, Log, DownloadHTMLService, @@ -50,8 +50,8 @@ export class LogsComponent { params: RR.FollowServerLogsReq, ) => Promise @Input({ required: true }) fetchLogs!: ( - params: ServerLogsReq, - ) => Promise + params: FetchLogsReq, + ) => Promise @Input({ required: true }) context!: string @Input() defaultBack = '' @Input() pageTitle = '' @@ -205,7 +205,7 @@ export class LogsComponent { } } - private processRes(res: LogsRes) { + private processRes(res: FetchLogsRes) { const { entries, 'start-cursor': startCursor } = res if (!entries.length) return diff --git a/web/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.service.ts b/web/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.service.ts index f5f88bb08..9dd3671f7 100644 --- a/web/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.service.ts +++ b/web/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.service.ts @@ -6,7 +6,7 @@ import { DataModel } from 'src/app/services/patch-db/data-model' @Injectable({ providedIn: 'root' }) export class NotificationsToastService extends Observable { private readonly stream$ = this.patch - .watch$('server-info', 'unread-notification-count') + .watch$('server-info', 'unreadNotifications', 'count') .pipe( pairwise(), map(([prev, cur]) => cur > prev), diff --git a/web/projects/ui/src/app/services/api/api.fixures.ts b/web/projects/ui/src/app/services/api/api.fixures.ts index e5cb10eec..8a2893b6c 100644 --- a/web/projects/ui/src/app/services/api/api.fixures.ts +++ b/web/projects/ui/src/app/services/api/api.fixures.ts @@ -339,6 +339,7 @@ export module Mock { }, }, }, + read: false, }, { id: 2, @@ -349,6 +350,7 @@ export module Mock { title: 'SSH Key Added', message: 'A new SSH key was added. If you did not do this, shit is bad.', data: null, + read: false, }, { id: 3, @@ -359,6 +361,7 @@ export module Mock { title: 'SSH Key Removed', message: 'A SSH key was removed.', data: null, + read: false, }, { id: 4, @@ -367,7 +370,7 @@ export module Mock { code: 4, level: NotificationLevel.Error, title: 'Service Crashed', - message: new Array(40) + message: new Array(3) .fill( `2021-11-27T18:36:30.451064Z 2021-11-27T18:36:30Z tor: Thread interrupt 2021-11-27T18:36:30.452833Z 2021-11-27T18:36:30Z Shutdown: In progress... @@ -376,6 +379,7 @@ export module Mock { ) .join(''), data: null, + read: false, }, ] diff --git a/web/projects/ui/src/app/services/api/api.types.ts b/web/projects/ui/src/app/services/api/api.types.ts index 8aa790aa9..a4986857a 100644 --- a/web/projects/ui/src/app/services/api/api.types.ts +++ b/web/projects/ui/src/app/services/api/api.types.ts @@ -9,7 +9,13 @@ import { ServiceOutboundProxy, HealthCheckResult, } from 'src/app/services/patch-db/data-model' -import { StartOSDiskInfo, LogsRes, ServerLogsReq } from '@start9labs/shared' +import { + StartOSDiskInfo, + FetchLogsReq, + FetchLogsRes, + FollowLogsRes, + FollowLogsReq, +} from '@start9labs/shared' import { customSmtp } from '@start9labs/start-sdk/lib/config/configConstants' export module RR { @@ -50,14 +56,11 @@ export module RR { uptime: number // seconds } - export type GetServerLogsReq = ServerLogsReq // server.logs & server.kernel-logs - export type GetServerLogsRes = LogsRes + export type GetServerLogsReq = FetchLogsReq // server.logs & server.kernel-logs & server.tor-logs + export type GetServerLogsRes = FetchLogsRes - export type FollowServerLogsReq = { limit?: number } // server.logs.follow & server.kernel-logs.follow - export type FollowServerLogsRes = { - 'start-cursor': string - guid: string - } + export type FollowServerLogsReq = FollowLogsReq & { limit?: number } // server.logs.follow & server.kernel-logs.follow & server.tor-logs.follow + export type FollowServerLogsRes = FollowLogsRes export type GetServerMetricsReq = {} // server.metrics export type GetServerMetricsRes = { @@ -109,17 +112,29 @@ export module RR { // notification + export type FollowNotificationsReq = {} + export type FollowNotificationsRes = { + notifications: ServerNotifications + guid: string + } + export type GetNotificationsReq = { before?: number limit?: number } // notification.list export type GetNotificationsRes = ServerNotification[] - export type DeleteNotificationReq = { id: number } // notification.delete + export type DeleteNotificationReq = { ids: number[] } // notification.delete export type DeleteNotificationRes = null - export type DeleteAllNotificationsReq = { before: number } // notification.delete-before - export type DeleteAllNotificationsRes = null + export type MarkSeenNotificationReq = DeleteNotificationReq // notification.mark-seen + export type MarkSeenNotificationRes = null + + export type MarkSeenAllNotificationsReq = { before: number } // notification.mark-seen-before + export type MarkSeenAllNotificationsRes = null + + export type MarkUnseenNotificationReq = DeleteNotificationReq // notification.mark-unseen + export type MarkUnseenNotificationRes = null // network @@ -298,8 +313,8 @@ export module RR { export type GetPackageCredentialsReq = { id: string } // package.credentials export type GetPackageCredentialsRes = Record - export type GetPackageLogsReq = ServerLogsReq & { id: string } // package.logs - export type GetPackageLogsRes = LogsRes + export type GetPackageLogsReq = FetchLogsReq & { id: string } // package.logs + export type GetPackageLogsRes = FetchLogsRes export type FollowPackageLogsReq = FollowServerLogsReq & { id: string } // package.logs.follow export type FollowPackageLogsRes = FollowServerLogsRes @@ -562,7 +577,7 @@ export interface SSHKey { fingerprint: string } -export type ServerNotifications = ServerNotification[] +export type ServerNotifications = ServerNotification[] export interface ServerNotification { id: number @@ -573,6 +588,7 @@ export interface ServerNotification { title: string message: string data: NotificationData + read: boolean } export enum NotificationLevel { diff --git a/web/projects/ui/src/app/services/api/embassy-api.service.ts b/web/projects/ui/src/app/services/api/embassy-api.service.ts index e63c1d64a..0bf947848 100644 --- a/web/projects/ui/src/app/services/api/embassy-api.service.ts +++ b/web/projects/ui/src/app/services/api/embassy-api.service.ts @@ -125,13 +125,21 @@ export abstract class ApiService { params: RR.GetNotificationsReq, ): Promise - abstract deleteNotification( + abstract markSeenNotifications( + params: RR.MarkSeenNotificationReq, + ): Promise + + abstract markSeenAllNotifications( + params: RR.MarkSeenAllNotificationsReq, + ): Promise + + abstract markUnseenNotifications( params: RR.DeleteNotificationReq, ): Promise - abstract deleteAllNotifications( - params: RR.DeleteAllNotificationsReq, - ): Promise + abstract deleteNotifications( + params: RR.DeleteNotificationReq, + ): Promise // network @@ -308,8 +316,6 @@ export abstract class ApiService { abstract getSetupStatus(): Promise - abstract followLogs(): Promise - abstract setInterfaceClearnetAddress( params: RR.SetInterfaceClearnetAddressReq, ): Promise diff --git a/web/projects/ui/src/app/services/api/embassy-live-api.service.ts b/web/projects/ui/src/app/services/api/embassy-live-api.service.ts index 247ce986a..873b8efdf 100644 --- a/web/projects/ui/src/app/services/api/embassy-live-api.service.ts +++ b/web/projects/ui/src/app/services/api/embassy-live-api.service.ts @@ -117,10 +117,6 @@ export class LiveApiService extends ApiService { return this.openWebsocket(config) } - async followLogs(): Promise { - return this.rpcRequest({ method: 'setup.logs.follow', params: {} }) - } - openLogsWebsocket$(config: WebSocketSubjectConfig): Observable { return this.openWebsocket(config) } @@ -259,21 +255,33 @@ export class LiveApiService extends ApiService { return this.rpcRequest({ method: 'notification.list', params }) } - async deleteNotification( + async deleteNotifications( params: RR.DeleteNotificationReq, ): Promise { return this.rpcRequest({ method: 'notification.delete', params }) } - async deleteAllNotifications( - params: RR.DeleteAllNotificationsReq, - ): Promise { + async markSeenNotifications( + params: RR.MarkSeenNotificationReq, + ): Promise { + return this.rpcRequest({ method: 'notification.mark-seen', params }) + } + + async markSeenAllNotifications( + params: RR.MarkSeenAllNotificationsReq, + ): Promise { return this.rpcRequest({ - method: 'notification.delete-before', + method: 'notification.mark-seen-before', params, }) } + async markUnseenNotifications( + params: RR.MarkUnseenNotificationReq, + ): Promise { + return this.rpcRequest({ method: 'notification.mark-unseen', params }) + } + // network async addProxy(params: RR.AddProxyReq): Promise { diff --git a/web/projects/ui/src/app/services/api/embassy-mock-api.service.ts b/web/projects/ui/src/app/services/api/embassy-mock-api.service.ts index 3fadcd504..842e3b4a2 100644 --- a/web/projects/ui/src/app/services/api/embassy-mock-api.service.ts +++ b/web/projects/ui/src/app/services/api/embassy-mock-api.service.ts @@ -473,28 +473,34 @@ export class MockApiService extends ApiService { params: RR.GetNotificationsReq, ): Promise { await pauseFor(2000) - const patch = [ - { - op: PatchOp.REPLACE, - path: '/server-info/unread-notification-count', - value: 0, - }, - ] - this.mockRevision(patch) return Mock.Notifications } - async deleteNotification( + async deleteNotifications( params: RR.DeleteNotificationReq, ): Promise { await pauseFor(2000) return null } - async deleteAllNotifications( - params: RR.DeleteAllNotificationsReq, - ): Promise { + async markSeenNotifications( + params: RR.MarkSeenNotificationReq, + ): Promise { + await pauseFor(2000) + return null + } + + async markSeenAllNotifications( + params: RR.MarkSeenAllNotificationsReq, + ): Promise { + await pauseFor(2000) + return null + } + + async markUnseenNotifications( + params: RR.MarkUnseenNotificationReq, + ): Promise { await pauseFor(2000) return null } @@ -1244,11 +1250,6 @@ export class MockApiService extends ApiService { return getSetupStatusMock() } - async followLogs(): Promise { - await pauseFor(1000) - return 'fake-guid' - } - async setInterfaceClearnetAddress( params: RR.SetInterfaceClearnetAddressReq, ): Promise { diff --git a/web/projects/ui/src/app/services/api/mock-patch.ts b/web/projects/ui/src/app/services/api/mock-patch.ts index 5b7855ccb..663496214 100644 --- a/web/projects/ui/src/app/services/api/mock-patch.ts +++ b/web/projects/ui/src/app/services/api/mock-patch.ts @@ -88,7 +88,10 @@ export const mockPatchData: DataModel = { outboundProxy: null, }, 'last-backup': new Date(new Date().valueOf() - 604800001).toISOString(), - 'unread-notification-count': 4, + unreadNotifications: { + count: 4, + recent: Mock.Notifications, + }, 'eos-version-compat': '>=0.3.0 <=0.3.0.1', 'status-info': { 'current-backup': null, diff --git a/web/projects/ui/src/app/services/patch-db/data-model.ts b/web/projects/ui/src/app/services/patch-db/data-model.ts index 837459ea2..2a151612b 100644 --- a/web/projects/ui/src/app/services/patch-db/data-model.ts +++ b/web/projects/ui/src/app/services/patch-db/data-model.ts @@ -1,7 +1,7 @@ import { InputSpec } from '@start9labs/start-sdk/lib/config/configTypes' import { Url } from '@start9labs/shared' import { Manifest } from '@start9labs/marketplace' -import { BackupJob } from '../api/api.types' +import { BackupJob, ServerNotifications } from '../api/api.types' import { customSmtp } from '@start9labs/start-sdk/lib/config/configConstants' import { NetworkInterfaceType } from '@start9labs/start-sdk/lib/util/utils' import { DependencyInfo } from 'src/app/apps/portal/routes/service/types/dependency-info' @@ -61,7 +61,10 @@ export interface ServerInfo { ui: AddressInfo network: NetworkInfo 'last-backup': string | null - 'unread-notification-count': number + unreadNotifications: { + count: number + recent: ServerNotifications + } 'status-info': ServerStatusInfo 'eos-version-compat': string pubkey: string diff --git a/web/projects/ui/src/styles.scss b/web/projects/ui/src/styles.scss index 255b86188..c573cdcaa 100644 --- a/web/projects/ui/src/styles.scss +++ b/web/projects/ui/src/styles.scss @@ -411,6 +411,7 @@ ul { text-transform: uppercase; font-weight: bold; font-size: 1rem; + line-height: 1.5rem; margin: 2rem 0 1rem; color: var(--tui-text-02); } From ad13b5eb4ea0161d485dfbe0ccd80ac459444102 Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Fri, 8 Dec 2023 23:19:33 +0400 Subject: [PATCH 037/169] feat(portal): refactor settings (#2536) * feat(portal): refactor settings * chore: refactor * small updates --------- Co-authored-by: Matt Hill --- web/package-lock.json | 8686 ++++++++--------- web/package.json | 16 +- web/projects/shared/styles/taiga.scss | 26 +- web/projects/ui/src/app/app.component.html | 1 + web/projects/ui/src/app/app.providers.ts | 6 +- .../components/header/about.component.ts | 70 + .../header/header-menu.component.ts | 9 +- .../components/header/header.component.ts | 4 +- .../apps/portal/constants/system-utilities.ts | 4 + .../src/app/apps/portal/portal.component.html | 4 +- .../routes/service/routes/outlet.component.ts | 8 +- .../settings/components/button.component.ts | 50 + .../settings/components/http.component.ts | 43 + .../settings/components/menu.component.ts | 140 + .../settings/components/sync.component.ts | 43 + .../settings/components/update.component.ts | 102 + .../settings/modals/update.component.ts | 81 + .../settings/routes/domains/constants.ts | 152 + .../routes/domains/domains.component.ts | 213 + .../settings/routes/domains/info.component.ts | 22 + .../routes/domains/table.component.ts | 91 + .../settings/routes/email/email.component.ts | 134 + .../settings/routes/email/info.component.ts | 23 + .../experimental/experimental.component.ts | 142 + .../routes/interfaces/interfaces.component.ts | 22 + .../settings/routes/proxies/constants.ts | 34 + .../settings/routes/proxies/info.component.ts | 40 + .../settings/routes/proxies/menu.component.ts | 137 + .../routes/proxies/proxies.component.ts | 77 + .../routes/proxies/table.component.ts | 98 + .../settings/routes/router/info.component.ts | 53 + .../routes/router/router.component.ts | 69 + .../settings/routes/router/table.component.ts | 139 + .../routes/sessions/platform-info.pipe.ts | 38 + .../routes/sessions/sessions.component.ts | 90 + .../routes/sessions/table.component.ts | 130 + .../settings/routes/ssh/info.component.ts | 23 + .../settings/routes/ssh/ssh.component.ts | 41 + .../settings/routes/ssh/table.component.ts | 127 + .../settings/routes/wifi/info.component.ts | 24 + .../settings/routes/wifi/table.component.ts | 148 + .../system/settings/routes/wifi/utils.ts | 78 + .../settings/routes/wifi/wifi.component.ts | 254 + .../system/settings/settings.component.ts | 59 + .../routes/system/settings/settings.routes.ts | 75 + .../system/settings/settings.service.ts | 240 + .../routes/system/settings/settings.types.ts | 37 + .../portal/routes/system/system.module.ts | 7 + .../services/routing-strategy.service.ts | 32 +- .../form/form-file/form-file.component.scss | 5 +- .../interface-addresses.component.html | 6 +- .../update-toast/update-toast.component.html | 20 +- .../ui/src/app/services/proxy.service.ts | 2 +- web/projects/ui/src/styles.scss | 5 +- 54 files changed, 7640 insertions(+), 4540 deletions(-) create mode 100644 web/projects/ui/src/app/apps/portal/components/header/about.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/components/button.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/components/http.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/components/menu.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/components/sync.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/components/update.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/modals/update.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/domains/constants.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/domains/domains.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/domains/info.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/domains/table.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/email/email.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/email/info.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/experimental/experimental.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/interfaces/interfaces.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/constants.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/info.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/menu.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/proxies.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/table.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/router/info.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/router/router.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/router/table.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/sessions/platform-info.pipe.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/sessions/sessions.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/sessions/table.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/ssh/info.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/ssh/ssh.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/ssh/table.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/info.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/table.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/utils.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/wifi.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/settings.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/settings.routes.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/settings.service.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/settings.types.ts diff --git a/web/package-lock.json b/web/package-lock.json index 8ce5b8d52..e35fab672 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -24,14 +24,14 @@ "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc8.beta2", - "@taiga-ui/addon-charts": "3.53.0", - "@taiga-ui/addon-mobile": "3.53.0", - "@taiga-ui/cdk": "3.53.0", - "@taiga-ui/core": "3.53.0", - "@taiga-ui/experimental": "3.53.0", - "@taiga-ui/icons": "3.53.0", - "@taiga-ui/kit": "3.53.0", - "@taiga-ui/styles": "3.53.0", + "@taiga-ui/addon-charts": "3.56.0", + "@taiga-ui/addon-mobile": "3.56.0", + "@taiga-ui/cdk": "3.56.0", + "@taiga-ui/core": "3.56.0", + "@taiga-ui/experimental": "3.56.0", + "@taiga-ui/icons": "3.56.0", + "@taiga-ui/kit": "3.56.0", + "@taiga-ui/styles": "3.56.0", "@tinkoff/ng-dompurify": "4.0.0", "@tinkoff/ng-event-plugins": "3.1.0", "ansi-to-html": "^0.7.2", @@ -109,11 +109,1875 @@ "rxjs": ">=7.0.0" } }, + "../patch-db/client/node_modules/@babel/code-frame": { + "version": "7.21.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../patch-db/client/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "../patch-db/client/node_modules/@babel/highlight": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../patch-db/client/node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "../patch-db/client/node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "../patch-db/client/node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "../patch-db/client/node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../patch-db/client/node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "../patch-db/client/node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "../patch-db/client/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "../patch-db/client/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "../patch-db/client/node_modules/@tsconfig/node10": { + "version": "1.0.9", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/@tsconfig/node12": { + "version": "1.0.11", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/@tsconfig/node14": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/@tsconfig/node16": { + "version": "1.0.4", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/@types/node": { + "version": "18.15.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/@types/parse-json": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/@types/uuid": { + "version": "8.3.1", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/acorn": { + "version": "8.8.2", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../patch-db/client/node_modules/acorn-walk": { + "version": "8.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../patch-db/client/node_modules/aggregate-error": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/ansi-escapes": { + "version": "4.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "../patch-db/client/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../patch-db/client/node_modules/arg": { + "version": "4.1.3", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "../patch-db/client/node_modules/astral-regex": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../patch-db/client/node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/builtin-modules": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../patch-db/client/node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../patch-db/client/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "../patch-db/client/node_modules/ci-info": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/clean-stack": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../patch-db/client/node_modules/cli-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/cli-truncate": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "../patch-db/client/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/colorette": { + "version": "2.0.20", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/commander": { + "version": "10.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "../patch-db/client/node_modules/compare-versions": { + "version": "3.6.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/cosmiconfig": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "../patch-db/client/node_modules/create-require": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "../patch-db/client/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "../patch-db/client/node_modules/diff": { + "version": "4.0.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "../patch-db/client/node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/error-ex": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "../patch-db/client/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "../patch-db/client/node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "../patch-db/client/node_modules/execa": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "../patch-db/client/node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/find-versions": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver-regex": "^3.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "../patch-db/client/node_modules/function-bind": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../patch-db/client/node_modules/has": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "../patch-db/client/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/human-signals": { + "version": "4.3.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14.18.0" + } + }, + "../patch-db/client/node_modules/husky": { + "version": "4.3.8", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^7.0.0", + "find-versions": "^4.0.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^5.0.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "bin": { + "husky-run": "bin/run.js", + "husky-upgrade": "lib/upgrader/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/husky" + } + }, + "../patch-db/client/node_modules/import-fresh": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "../patch-db/client/node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "../patch-db/client/node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/is-core-module": { + "version": "2.12.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../patch-db/client/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "../patch-db/client/node_modules/is-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "../patch-db/client/node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "../patch-db/client/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/lilconfig": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "../patch-db/client/node_modules/lines-and-columns": { + "version": "1.2.4", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/lint-staged": { + "version": "13.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "5.2.0", + "cli-truncate": "^3.1.0", + "commander": "^10.0.0", + "debug": "^4.3.4", + "execa": "^7.0.0", + "lilconfig": "2.1.0", + "listr2": "^5.0.7", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-inspect": "^1.12.3", + "pidtree": "^0.6.0", + "string-argv": "^0.3.1", + "yaml": "^2.2.2" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "../patch-db/client/node_modules/lint-staged/node_modules/chalk": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "../patch-db/client/node_modules/lint-staged/node_modules/yaml": { + "version": "2.3.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 14" + } + }, + "../patch-db/client/node_modules/listr2": { + "version": "5.0.8", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "../patch-db/client/node_modules/listr2/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/listr2/node_modules/cli-truncate": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/listr2/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/listr2/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/listr2/node_modules/slice-ansi": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/listr2/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/listr2/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/log-update": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/log-update/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/log-update/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "../patch-db/client/node_modules/log-update/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/log-update/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/make-error": { + "version": "1.3.6", + "dev": true, + "license": "ISC" + }, + "../patch-db/client/node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "../patch-db/client/node_modules/mimic-fn": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../patch-db/client/node_modules/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../patch-db/client/node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "../patch-db/client/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../patch-db/client/node_modules/npm-run-path": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/object-inspect": { + "version": "1.12.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../patch-db/client/node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "../patch-db/client/node_modules/onetime": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/opencollective-postinstall": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "bin": { + "opencollective-postinstall": "index.js" + } + }, + "../patch-db/client/node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/p-map": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../patch-db/client/node_modules/parse-json": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../patch-db/client/node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/path-type": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "../patch-db/client/node_modules/pidtree": { + "version": "0.6.0", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "../patch-db/client/node_modules/pkg-dir": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "../patch-db/client/node_modules/please-upgrade-node": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver-compare": "^1.0.0" + } + }, + "../patch-db/client/node_modules/prettier": { + "version": "2.8.8", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "../patch-db/client/node_modules/resolve": { + "version": "1.22.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../patch-db/client/node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../patch-db/client/node_modules/restore-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../patch-db/client/node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/rfdc": { + "version": "1.3.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/rxjs": { + "version": "7.8.1", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "../patch-db/client/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "../patch-db/client/node_modules/semver-compare": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/semver-regex": { + "version": "3.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "../patch-db/client/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/slice-ansi": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "../patch-db/client/node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../patch-db/client/node_modules/sorted-btree": { + "version": "1.5.0", + "license": "MIT" + }, + "../patch-db/client/node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "../patch-db/client/node_modules/string-argv": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "../patch-db/client/node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "../patch-db/client/node_modules/strip-final-newline": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../patch-db/client/node_modules/through": { + "version": "2.3.8", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "../patch-db/client/node_modules/ts-node": { + "version": "10.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "../patch-db/client/node_modules/tslib": { + "version": "2.5.3", + "license": "0BSD" + }, + "../patch-db/client/node_modules/tslint": { + "version": "6.1.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.13.0", + "tsutils": "^2.29.0" + }, + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + }, + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" + } + }, + "../patch-db/client/node_modules/tslint/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "../patch-db/client/node_modules/tslint/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "../patch-db/client/node_modules/tslint/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "../patch-db/client/node_modules/tslint/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/tslint/node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/tslint/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../patch-db/client/node_modules/tslint/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "../patch-db/client/node_modules/tslint/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "../patch-db/client/node_modules/tsutils": { + "version": "2.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + } + }, + "../patch-db/client/node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "../patch-db/client/node_modules/type-fest": { + "version": "0.21.3", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/typescript": { + "version": "4.9.5", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "../patch-db/client/node_modules/uuid": { + "version": "8.3.2", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "../patch-db/client/node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "../patch-db/client/node_modules/which-pm-runs": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../patch-db/client/node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "../patch-db/client/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "../patch-db/client/node_modules/yaml": { + "version": "1.10.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "../patch-db/client/node_modules/yn": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../patch-db/client/node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@ampproject/remapping": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -124,9 +1988,8 @@ }, "node_modules/@angular-devkit/architect": { "version": "0.1602.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.10.tgz", - "integrity": "sha512-FwemQXh3edqA/S6zPpsqKei5v7gt0R0WpjJoAJaz+FOpfDwij1fwnKr88XINY8xcefTcQaTDQxJZheJShA/hHw==", "devOptional": true, + "license": "MIT", "dependencies": { "@angular-devkit/core": "16.2.10", "rxjs": "7.8.1" @@ -139,9 +2002,8 @@ }, "node_modules/@angular-devkit/build-angular": { "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.10.tgz", - "integrity": "sha512-msB/qjIsAOySDxdU5DpcX2sWGUEJOFIO03O9+HbtLwf3NDfe74mFfejxuKlHJXIJdgpM2Zc948M6+618QKpUYA==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "2.2.1", "@angular-devkit/architect": "0.1602.10", @@ -261,15 +2123,13 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/@types/estree": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@angular-devkit/build-angular/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -283,24 +2143,21 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/@angular-devkit/build-angular/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@angular-devkit/build-angular/node_modules/schema-utils": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -316,15 +2173,13 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/tslib": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/@angular-devkit/build-angular/node_modules/webpack": { "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -369,9 +2224,8 @@ }, "node_modules/@angular-devkit/build-webpack": { "version": "0.1602.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.10.tgz", - "integrity": "sha512-H7HiFKbZl/xVxpr1RH05SGawTpA1417wvr2nFGRu2OiePd0lPr6pIhcq8F8gt7JcA8yZKKaqjn2gU+6um2MFLg==", "dev": true, + "license": "MIT", "dependencies": { "@angular-devkit/architect": "0.1602.10", "rxjs": "7.8.1" @@ -388,8 +2242,7 @@ }, "node_modules/@angular-devkit/core": { "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.10.tgz", - "integrity": "sha512-eo7suLDjyu5bSlEr4TluYkFm4v2PVLSAPgnau8XHHlN5Yg4P/BZ00ve7LA7C9S1gzRSCrxQhK5ki4rnoFTo5zg==", + "license": "MIT", "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", @@ -414,8 +2267,7 @@ }, "node_modules/@angular-devkit/schematics": { "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.2.10.tgz", - "integrity": "sha512-UCfPJKVNekb21bWRbzyx81tfHN3x8vU4ZMX/VA6xALg//QalMB7NOkkXBAssthnLastkyzkUtlvApTp2+R+EkQ==", + "license": "MIT", "dependencies": { "@angular-devkit/core": "16.2.10", "jsonc-parser": "3.2.0", @@ -431,8 +2283,7 @@ }, "node_modules/@angular/animations": { "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.2.12.tgz", - "integrity": "sha512-MD0ElviEfAJY8qMOd6/jjSSvtqER2RDAi0lxe6EtUacC1DHCYkaPrKW4vLqY+tmZBg1yf+6n+uS77pXcHHcA3w==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -445,8 +2296,7 @@ }, "node_modules/@angular/cdk": { "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-16.2.12.tgz", - "integrity": "sha512-wT8/265zm2WKY0BDaRoYbrAT4kadrmejTRLjuimQIEUKnw4vBsJMWCwQkpFo3s6zr6eznGqYVAFb8KKPVLKGBg==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -461,8 +2311,7 @@ }, "node_modules/@angular/cdk/node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", "optional": true, "engines": { "node": ">=0.12" @@ -473,8 +2322,7 @@ }, "node_modules/@angular/cdk/node_modules/parse5": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "license": "MIT", "optional": true, "dependencies": { "entities": "^4.4.0" @@ -485,9 +2333,8 @@ }, "node_modules/@angular/cli": { "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.2.10.tgz", - "integrity": "sha512-zDqlD+rXFuYZP169c2v35HkMbkchVCft5sS+VpoCCgYTk2rwxpeYkjJ8DQZztZJZRXQ+EMpkv/TubswmDro2zA==", "devOptional": true, + "license": "MIT", "dependencies": { "@angular-devkit/architect": "0.1602.10", "@angular-devkit/core": "16.2.10", @@ -519,8 +2366,7 @@ }, "node_modules/@angular/common": { "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.2.12.tgz", - "integrity": "sha512-B+WY/cT2VgEaz9HfJitBmgdk4I333XG/ybC98CMC4Wz8E49T8yzivmmxXB3OD6qvjcOB6ftuicl6WBqLbZNg2w==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -534,8 +2380,7 @@ }, "node_modules/@angular/compiler": { "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.2.12.tgz", - "integrity": "sha512-6SMXUgSVekGM7R6l1Z9rCtUGtlg58GFmgbpMCsGf+VXxP468Njw8rjT2YZkf5aEPxEuRpSHhDYjqz7n14cwCXQ==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -553,9 +2398,8 @@ }, "node_modules/@angular/compiler-cli": { "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.2.12.tgz", - "integrity": "sha512-pWSrr152562ujh6lsFZR8NfNc5Ljj+zSTQO44DsuB0tZjwEpnRcjJEgzuhGXr+CoiBf+jTSPZKemtSktDk5aaA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "7.23.2", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -581,9 +2425,8 @@ }, "node_modules/@angular/compiler-cli/node_modules/@babel/core": { "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", @@ -611,24 +2454,21 @@ }, "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@angular/compiler-cli/node_modules/@babel/generator": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", - "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.23.3", "@jridgewell/gen-mapping": "^0.3.2", @@ -641,9 +2481,8 @@ }, "node_modules/@angular/compiler-cli/node_modules/@babel/template": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", @@ -655,8 +2494,7 @@ }, "node_modules/@angular/core": { "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.2.12.tgz", - "integrity": "sha512-GLLlDeke/NjroaLYOks0uyzFVo6HyLl7VOm0K1QpLXnYvW63W9Ql/T3yguRZa7tRkOAeFZ3jw+1wnBD4O8MoUA==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -670,8 +2508,7 @@ }, "node_modules/@angular/forms": { "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.2.12.tgz", - "integrity": "sha512-1Eao89hlBgLR3v8tU91vccn21BBKL06WWxl7zLpQmG6Hun+2jrThgOE4Pf3os4fkkbH4Apj0tWL2fNIWe/blbw==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -687,17 +2524,15 @@ }, "node_modules/@angular/language-service": { "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-16.2.12.tgz", - "integrity": "sha512-sZwB+ZEjChx9EYcqPaS4OnhC/q5RcedZjIdM9mCxuU/MtseURRYRI/8Hnm1RHo9qyc5PmsQpg7p9Vp/5hXLUjw==", "dev": true, + "license": "MIT", "engines": { "node": "^16.14.0 || >=18.10.0" } }, "node_modules/@angular/platform-browser": { "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.2.12.tgz", - "integrity": "sha512-NnH7ju1iirmVEsUq432DTm0nZBGQsBrU40M3ZeVHMQ2subnGiyUs3QyzDz8+VWLL/T5xTxWLt9BkDn65vgzlIQ==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -717,8 +2552,7 @@ }, "node_modules/@angular/platform-browser-dynamic": { "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.2.12.tgz", - "integrity": "sha512-ya54jerNgreCVAR278wZavwjrUWImMr2F8yM5n9HBvsMBbFaAQ83anwbOEiHEF2BlR+gJiEBLfpuPRMw20pHqw==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -734,8 +2568,7 @@ }, "node_modules/@angular/pwa": { "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@angular/pwa/-/pwa-16.2.10.tgz", - "integrity": "sha512-qZFXdm8oTnH58A3ONXJ63G3rkgvBu+wSRhE/q4luickTLHrDp9P1YbvBdplJduhFHIh7tg6oFNd7ps0NuFklYg==", + "license": "MIT", "dependencies": { "@angular-devkit/schematics": "16.2.10", "@schematics/angular": "16.2.10", @@ -757,8 +2590,7 @@ }, "node_modules/@angular/router": { "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.2.12.tgz", - "integrity": "sha512-aU6QnYSza005V9P3W6PpkieL56O0IHps96DjqI1RS8yOJUl3THmokqYN4Fm5+HXy4f390FN9i6ftadYQDKeWmA==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -774,8 +2606,7 @@ }, "node_modules/@angular/service-worker": { "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-16.2.12.tgz", - "integrity": "sha512-o0z0s4c76NmRASa+mUHn/q6vUKQNa06mGmLBDKm84vRQ1sQ2TJv+R1p8K9WkiM5mGy6tjQCDOgaz13TcxMFWOQ==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -792,15 +2623,13 @@ }, "node_modules/@assemblyscript/loader": { "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", - "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/@babel/code-frame": { "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" @@ -811,18 +2640,16 @@ }, "node_modules/@babel/compat-data": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", - "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", - "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.5", @@ -850,18 +2677,16 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", - "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", @@ -874,9 +2699,8 @@ }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -886,9 +2710,8 @@ }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.15" }, @@ -898,9 +2721,8 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.9", "@babel/helper-validator-option": "^7.22.15", @@ -914,18 +2736,16 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", @@ -946,18 +2766,16 @@ }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "regexpu-core": "^5.3.1", @@ -972,18 +2790,16 @@ }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", - "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -997,18 +2813,16 @@ }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" @@ -1019,9 +2833,8 @@ }, "node_modules/@babel/helper-function-name/node_modules/@babel/template": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", @@ -1033,9 +2846,8 @@ }, "node_modules/@babel/helper-hoist-variables": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -1045,9 +2857,8 @@ }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.23.0" }, @@ -1057,9 +2868,8 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.15" }, @@ -1069,9 +2879,8 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-module-imports": "^7.22.15", @@ -1088,9 +2897,8 @@ }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -1100,18 +2908,16 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20", @@ -1126,9 +2932,8 @@ }, "node_modules/@babel/helper-replace-supers": { "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-member-expression-to-functions": "^7.22.15", @@ -1143,9 +2948,8 @@ }, "node_modules/@babel/helper-simple-access": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -1155,9 +2959,8 @@ }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -1167,9 +2970,8 @@ }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -1179,36 +2981,32 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-function-name": "^7.22.5", "@babel/template": "^7.22.15", @@ -1220,9 +3018,8 @@ }, "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", @@ -1234,9 +3031,8 @@ }, "node_modules/@babel/helpers": { "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.22.15", "@babel/traverse": "^7.23.2", @@ -1248,9 +3044,8 @@ }, "node_modules/@babel/helpers/node_modules/@babel/template": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", @@ -1262,9 +3057,8 @@ }, "node_modules/@babel/highlight": { "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -1276,9 +3070,8 @@ }, "node_modules/@babel/parser": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", - "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", "dev": true, + "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, @@ -1288,9 +3081,8 @@ }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1303,9 +3095,8 @@ }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", @@ -1320,10 +3111,8 @@ }, "node_modules/@babel/plugin-proposal-async-generator-functions": { "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-plugin-utils": "^7.20.2", @@ -1339,9 +3128,8 @@ }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" }, @@ -1351,10 +3139,8 @@ }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1368,9 +3154,8 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1380,9 +3165,8 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -1392,9 +3176,8 @@ }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1407,9 +3190,8 @@ }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1419,9 +3201,8 @@ }, "node_modules/@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, @@ -1431,9 +3212,8 @@ }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1446,9 +3226,8 @@ }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1461,9 +3240,8 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1473,9 +3251,8 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1485,9 +3262,8 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1497,9 +3273,8 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1509,9 +3284,8 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1521,9 +3295,8 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1533,9 +3306,8 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1545,9 +3317,8 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1557,9 +3328,8 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1572,9 +3342,8 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1587,9 +3356,8 @@ }, "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1603,9 +3371,8 @@ }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1618,9 +3385,8 @@ }, "node_modules/@babel/plugin-transform-async-generator-functions": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.3.tgz", - "integrity": "sha512-59GsVNavGxAXCDDbakWSMJhajASb4kBCqDjqJsv+p5nKdbz7istmZ3HrX3L2LuiI80+zsOADCvooqQH3qGCucQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-plugin-utils": "^7.22.5", @@ -1636,9 +3402,8 @@ }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", @@ -1653,9 +3418,8 @@ }, "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1668,9 +3432,8 @@ }, "node_modules/@babel/plugin-transform-block-scoping": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.3.tgz", - "integrity": "sha512-QPZxHrThbQia7UdvfpaRRlq/J9ciz1J4go0k+lPBXbgaNeY7IQrBj/9ceWjvMMI07/ZBzHl/F0R/2K0qH7jCVw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1683,9 +3446,8 @@ }, "node_modules/@babel/plugin-transform-class-properties": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" @@ -1699,9 +3461,8 @@ }, "node_modules/@babel/plugin-transform-class-static-block": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.3.tgz", - "integrity": "sha512-PENDVxdr7ZxKPyi5Ffc0LjXdnJyrJxyqF5T5YjlVg4a0VFfQHW0r8iAtRiDXkfHlu1wwcvdtnndGYIeJLSuRMQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", @@ -1716,9 +3477,8 @@ }, "node_modules/@babel/plugin-transform-classes": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", - "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.22.15", @@ -1739,9 +3499,8 @@ }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/template": "^7.22.15" @@ -1755,9 +3514,8 @@ }, "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/template": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", @@ -1769,9 +3527,8 @@ }, "node_modules/@babel/plugin-transform-destructuring": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1784,9 +3541,8 @@ }, "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" @@ -1800,9 +3556,8 @@ }, "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1815,9 +3570,8 @@ }, "node_modules/@babel/plugin-transform-dynamic-import": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.3.tgz", - "integrity": "sha512-vTG+cTGxPFou12Rj7ll+eD5yWeNl5/8xvQvF08y5Gv3v4mZQoyFf8/n9zg4q5vvCWt5jmgymfzMAldO7orBn7A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -1831,9 +3585,8 @@ }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" @@ -1847,9 +3600,8 @@ }, "node_modules/@babel/plugin-transform-export-namespace-from": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.3.tgz", - "integrity": "sha512-yCLhW34wpJWRdTxxWtFZASJisihrfyMOTOQexhVzA78jlU+dH7Dw+zQgcPepQ5F3C6bAIiblZZ+qBggJdHiBAg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -1863,9 +3615,8 @@ }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", - "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1878,9 +3629,8 @@ }, "node_modules/@babel/plugin-transform-function-name": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-function-name": "^7.23.0", @@ -1895,9 +3645,8 @@ }, "node_modules/@babel/plugin-transform-json-strings": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.3.tgz", - "integrity": "sha512-H9Ej2OiISIZowZHaBwF0tsJOih1PftXJtE8EWqlEIwpc7LMTGq0rPOrywKLQ4nefzx8/HMR0D3JGXoMHYvhi0A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -1911,9 +3660,8 @@ }, "node_modules/@babel/plugin-transform-literals": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1926,9 +3674,8 @@ }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.3.tgz", - "integrity": "sha512-+pD5ZbxofyOygEp+zZAfujY2ShNCXRpDRIPOiBmTO693hhyOEteZgl876Xs9SAHPQpcV0vz8LvA/T+w8AzyX8A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -1942,9 +3689,8 @@ }, "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1957,9 +3703,8 @@ }, "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5" @@ -1973,9 +3718,8 @@ }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5", @@ -1990,9 +3734,8 @@ }, "node_modules/@babel/plugin-transform-modules-systemjs": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", - "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-module-transforms": "^7.23.3", @@ -2008,9 +3751,8 @@ }, "node_modules/@babel/plugin-transform-modules-umd": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5" @@ -2024,9 +3766,8 @@ }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -2040,9 +3781,8 @@ }, "node_modules/@babel/plugin-transform-new-target": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2055,9 +3795,8 @@ }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.3.tgz", - "integrity": "sha512-xzg24Lnld4DYIdysyf07zJ1P+iIfJpxtVFOzX4g+bsJ3Ng5Le7rXx9KwqKzuyaUeRnt+I1EICwQITqc0E2PmpA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -2071,9 +3810,8 @@ }, "node_modules/@babel/plugin-transform-numeric-separator": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.3.tgz", - "integrity": "sha512-s9GO7fIBi/BLsZ0v3Rftr6Oe4t0ctJ8h4CCXfPoEJwmvAPMyNrfkOOJzm6b9PX9YXcCJWWQd/sBF/N26eBiMVw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -2087,9 +3825,8 @@ }, "node_modules/@babel/plugin-transform-object-rest-spread": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.3.tgz", - "integrity": "sha512-VxHt0ANkDmu8TANdE9Kc0rndo/ccsmfe2Cx2y5sI4hu3AukHQ5wAu4cM7j3ba8B9548ijVyclBU+nuDQftZsog==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.23.3", "@babel/helper-compilation-targets": "^7.22.15", @@ -2106,9 +3843,8 @@ }, "node_modules/@babel/plugin-transform-object-super": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-replace-supers": "^7.22.20" @@ -2122,9 +3858,8 @@ }, "node_modules/@babel/plugin-transform-optional-catch-binding": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.3.tgz", - "integrity": "sha512-LxYSb0iLjUamfm7f1D7GpiS4j0UAC8AOiehnsGAP8BEsIX8EOi3qV6bbctw8M7ZvLtcoZfZX5Z7rN9PlWk0m5A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -2138,9 +3873,8 @@ }, "node_modules/@babel/plugin-transform-optional-chaining": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.3.tgz", - "integrity": "sha512-zvL8vIfIUgMccIAK1lxjvNv572JHFJIKb4MWBz5OGdBQA0fB0Xluix5rmOby48exiJc987neOmP/m9Fnpkz3Tg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", @@ -2155,9 +3889,8 @@ }, "node_modules/@babel/plugin-transform-parameters": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2170,9 +3903,8 @@ }, "node_modules/@babel/plugin-transform-private-methods": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" @@ -2186,9 +3918,8 @@ }, "node_modules/@babel/plugin-transform-private-property-in-object": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.3.tgz", - "integrity": "sha512-a5m2oLNFyje2e/rGKjVfAELTVI5mbA0FeZpBnkOWWV7eSmKQ+T/XW0Vf+29ScLzSxX+rnsarvU0oie/4m6hkxA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-create-class-features-plugin": "^7.22.15", @@ -2204,9 +3935,8 @@ }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2219,9 +3949,8 @@ }, "node_modules/@babel/plugin-transform-regenerator": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "regenerator-transform": "^0.15.2" @@ -2235,9 +3964,8 @@ }, "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2250,9 +3978,8 @@ }, "node_modules/@babel/plugin-transform-runtime": { "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", - "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", @@ -2270,18 +3997,16 @@ }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2294,9 +4019,8 @@ }, "node_modules/@babel/plugin-transform-spread": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" @@ -2310,9 +4034,8 @@ }, "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2325,9 +4048,8 @@ }, "node_modules/@babel/plugin-transform-template-literals": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2340,9 +4062,8 @@ }, "node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2355,9 +4076,8 @@ }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2370,9 +4090,8 @@ }, "node_modules/@babel/plugin-transform-unicode-property-regex": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" @@ -2386,9 +4105,8 @@ }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" @@ -2402,9 +4120,8 @@ }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" @@ -2418,9 +4135,8 @@ }, "node_modules/@babel/preset-env": { "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", - "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.9", "@babel/helper-compilation-targets": "^7.22.9", @@ -2512,18 +4228,16 @@ }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/preset-modules": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", - "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -2537,15 +4251,13 @@ }, "node_modules/@babel/regjsgen": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@babel/runtime": { "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dev": true, + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -2555,446 +4267,102 @@ }, "node_modules/@babel/template": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.22.5", "@babel/parser": "^7.22.5", "@babel/types": "^7.22.5" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", - "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@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.3", - "@babel/types": "^7.23.3", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", - "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", - "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", - "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", - "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz", - "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", - "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", - "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", - "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", - "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", - "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", - "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", - "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", - "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", - "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", - "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", - "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", - "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", - "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", - "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", - "cpu": [ - "x64" - ], + "node_modules/@babel/traverse": { + "version": "7.23.3", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@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.3", + "@babel/types": "^7.23.3", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", - "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", - "cpu": [ - "x64" - ], + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.23.3", "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "license": "MIT", + "dependencies": { + "@babel/types": "^7.23.3", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", - "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", - "cpu": [ - "x64" - ], + "node_modules/@babel/types": { + "version": "7.23.3", "dev": true, - "optional": true, - "os": [ - "sunos" - ], + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", - "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", - "cpu": [ - "arm64" - ], + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, "engines": { "node": ">=12" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", - "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", - "cpu": [ - "ia32" - ], + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=10.0.0" } }, - "node_modules/@esbuild/win32-x64": { + "node_modules/@esbuild/darwin-arm64": { "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", - "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", "cpu": [ - "x64" + "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ], "engines": { "node": ">=12" @@ -3002,19 +4370,16 @@ }, "node_modules/@gar/promisify": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/@iarna/toml": { "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" + "license": "ISC" }, "node_modules/@ionic/angular": { "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.7.5.tgz", - "integrity": "sha512-nV8HP7RedjYkIAT8nVr5ifHNT0D3XzA74RPG3/WCCFJKunERNJ9SBiNkCTWhUpSkqsYYwEB4+SOOHz+R5NLk/w==", + "license": "MIT", "dependencies": { "@ionic/core": "6.7.5", "ionicons": "^6.1.3", @@ -3031,9 +4396,8 @@ }, "node_modules/@ionic/cli": { "version": "6.20.9", - "resolved": "https://registry.npmjs.org/@ionic/cli/-/cli-6.20.9.tgz", - "integrity": "sha512-sItLCi7zXq1zARWIpZDinHhK8hvy+wzOx176QMOJV90BjDybkjGYu3rGu5TBjoqn104dRIZTC8rtCsnD/P3cQw==", "dev": true, + "license": "MIT", "dependencies": { "@ionic/cli-framework": "5.1.3", "@ionic/cli-framework-output": "2.2.5", @@ -3071,9 +4435,8 @@ }, "node_modules/@ionic/cli-framework": { "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@ionic/cli-framework/-/cli-framework-5.1.3.tgz", - "integrity": "sha512-T2KN/TurzNoAcc3iDt1KHU6GeEa7x9kXngMnu5xs+DzJv5HhBKjVOoo74b8rgVxdPx+dLOV8aLrorlyvsHR/tQ==", "dev": true, + "license": "MIT", "dependencies": { "@ionic/cli-framework-output": "2.2.5", "@ionic/utils-array": "2.1.5", @@ -3097,9 +4460,8 @@ }, "node_modules/@ionic/cli-framework-output": { "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.5.tgz", - "integrity": "sha512-YeDLTnTaE6V4IDUxT8GDIep0GuRIFaR7YZDLANMuuWJZDmnTku6DP+MmQoltBeLmVvz1BAAZgk41xzxdq6H2FQ==", "dev": true, + "license": "MIT", "dependencies": { "@ionic/utils-terminal": "2.3.3", "debug": "^4.0.0", @@ -3111,9 +4473,8 @@ }, "node_modules/@ionic/cli-framework-prompts": { "version": "2.1.10", - "resolved": "https://registry.npmjs.org/@ionic/cli-framework-prompts/-/cli-framework-prompts-2.1.10.tgz", - "integrity": "sha512-h8HbA0teR0vWtGKB3ahzRbDq4yYaxfukgbOqhu9CAEJHosoFlBmDB8PbPnGFYxUg2J1MuCqeiN2ftJQYV/BO1w==", "dev": true, + "license": "MIT", "dependencies": { "@ionic/utils-terminal": "2.3.3", "debug": "^4.0.0", @@ -3126,9 +4487,8 @@ }, "node_modules/@ionic/cli-framework-prompts/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -3141,9 +4501,8 @@ }, "node_modules/@ionic/cli-framework-prompts/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3157,9 +4516,8 @@ }, "node_modules/@ionic/cli-framework-prompts/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -3169,24 +4527,21 @@ }, "node_modules/@ionic/cli-framework-prompts/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@ionic/cli-framework-prompts/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@ionic/cli-framework-prompts/node_modules/inquirer": { "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.0", @@ -3208,9 +4563,8 @@ }, "node_modules/@ionic/cli-framework-prompts/node_modules/rxjs": { "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" }, @@ -3220,15 +4574,13 @@ }, "node_modules/@ionic/cli-framework-prompts/node_modules/rxjs/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/@ionic/cli-framework-prompts/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -3238,9 +4590,8 @@ }, "node_modules/@ionic/cli-framework/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -3253,9 +4604,8 @@ }, "node_modules/@ionic/cli-framework/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3269,9 +4619,8 @@ }, "node_modules/@ionic/cli-framework/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -3281,24 +4630,21 @@ }, "node_modules/@ionic/cli-framework/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@ionic/cli-framework/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@ionic/cli-framework/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -3308,9 +4654,8 @@ }, "node_modules/@ionic/cli/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -3323,9 +4668,8 @@ }, "node_modules/@ionic/cli/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3339,9 +4683,8 @@ }, "node_modules/@ionic/cli/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -3351,24 +4694,21 @@ }, "node_modules/@ionic/cli/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@ionic/cli/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@ionic/cli/node_modules/open": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, + "license": "MIT", "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -3382,9 +4722,8 @@ }, "node_modules/@ionic/cli/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -3394,8 +4733,7 @@ }, "node_modules/@ionic/core": { "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.7.5.tgz", - "integrity": "sha512-zRkRn+h/Vs3xt/EVgBdShMKDyeGOM4RU31NPF2icfu3CUTH+VrMV569MUnNjYvd1Lu2xK90pYy4TaicSWmC1Pw==", + "license": "MIT", "dependencies": { "@stencil/core": "^2.18.0", "ionicons": "^6.1.3", @@ -3404,9 +4742,8 @@ }, "node_modules/@ionic/utils-array": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.5.tgz", - "integrity": "sha512-HD72a71IQVBmQckDwmA8RxNVMTbxnaLbgFOl+dO5tbvW9CkkSFCv41h6fUuNsSEVgngfkn0i98HDuZC8mk+lTA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.0.0", "tslib": "^2.0.1" @@ -3417,9 +4754,8 @@ }, "node_modules/@ionic/utils-fs": { "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.6.tgz", - "integrity": "sha512-eikrNkK89CfGPmexjTfSWl4EYqsPSBh0Ka7by4F0PLc1hJZYtJxUZV3X4r5ecA8ikjicUmcbU7zJmAjmqutG/w==", "dev": true, + "license": "MIT", "dependencies": { "@types/fs-extra": "^8.0.0", "debug": "^4.0.0", @@ -3432,9 +4768,8 @@ }, "node_modules/@ionic/utils-network": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@ionic/utils-network/-/utils-network-2.1.5.tgz", - "integrity": "sha512-HUQ1Ec4Mh2MXzzKdbbbDS6xYKwpFJ2XRY7SYXbaZT8+jiNahfHbsOfe62/p8bk41Yil7E9EagzGC2JvIFJh01w==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.0.0", "tslib": "^2.0.1" @@ -3445,9 +4780,8 @@ }, "node_modules/@ionic/utils-object": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.5.tgz", - "integrity": "sha512-XnYNSwfewUqxq+yjER1hxTKggftpNjFLJH0s37jcrNDwbzmbpFTQTVAp4ikNK4rd9DOebX/jbeZb8jfD86IYxw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.0.0", "tslib": "^2.0.1" @@ -3458,9 +4792,8 @@ }, "node_modules/@ionic/utils-process": { "version": "2.1.10", - "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.10.tgz", - "integrity": "sha512-mZ7JEowcuGQK+SKsJXi0liYTcXd2bNMR3nE0CyTROpMECUpJeAvvaBaPGZf5ERQUPeWBVuwqAqjUmIdxhz5bxw==", "dev": true, + "license": "MIT", "dependencies": { "@ionic/utils-object": "2.1.5", "@ionic/utils-terminal": "2.3.3", @@ -3475,9 +4808,8 @@ }, "node_modules/@ionic/utils-stream": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.5.tgz", - "integrity": "sha512-hkm46uHvEC05X/8PHgdJi4l4zv9VQDELZTM+Kz69odtO9zZYfnt8DkfXHJqJ+PxmtiE5mk/ehJWLnn/XAczTUw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.0.0", "tslib": "^2.0.1" @@ -3488,9 +4820,8 @@ }, "node_modules/@ionic/utils-subprocess": { "version": "2.1.11", - "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.11.tgz", - "integrity": "sha512-6zCDixNmZCbMCy5np8klSxOZF85kuDyzZSTTQKQP90ZtYNCcPYmuFSzaqDwApJT4r5L3MY3JrqK1gLkc6xiUPw==", "dev": true, + "license": "MIT", "dependencies": { "@ionic/utils-array": "2.1.5", "@ionic/utils-fs": "3.1.6", @@ -3507,9 +4838,8 @@ }, "node_modules/@ionic/utils-terminal": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.3.tgz", - "integrity": "sha512-RnuSfNZ5fLEyX3R5mtcMY97cGD1A0NVBbarsSQ6yMMfRJ5YHU7hHVyUfvZeClbqkBC/pAqI/rYJuXKCT9YeMCQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/slice-ansi": "^4.0.0", "debug": "^4.0.0", @@ -3527,9 +4857,8 @@ }, "node_modules/@isaacs/cliui": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "devOptional": true, + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -3544,9 +4873,8 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -3556,9 +4884,8 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -3568,15 +4895,13 @@ }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "devOptional": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -3591,9 +4916,8 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "devOptional": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -3606,9 +4930,8 @@ }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "devOptional": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -3623,9 +4946,8 @@ }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -3639,18 +4961,16 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -3661,18 +4981,16 @@ }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -3684,27 +5002,24 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -3712,14 +5027,12 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -3727,14 +5040,12 @@ }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@maskito/angular": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-1.8.1.tgz", - "integrity": "sha512-iT9/YK+lTRd8ofU1Qd2pJHofshi/QnSGXS9MBIjt8Mk034pLCYutB5ua+2kiZYMdPk7kyuaSXYZOSL/Pt5cBuA==", + "version": "1.9.0", + "license": "Apache-2.0", "dependencies": { "tslib": "2.6.2" }, @@ -3742,27 +5053,24 @@ "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@angular/forms": ">=12.0.0", - "@maskito/core": "^1.8.1", + "@maskito/core": "^1.9.0", "rxjs": ">=6.0.0" } }, "node_modules/@maskito/core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@maskito/core/-/core-1.8.1.tgz", - "integrity": "sha512-h9+Z91WASHQ6z6kDP7uIHyMUPxNwA1mOIPsFxdg2MHq1RASFUNKHj66uU5xuR0OJu17qcCCzUu7ixZ43QQ/HYg==" + "version": "1.9.0", + "license": "Apache-2.0" }, "node_modules/@maskito/kit": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-1.8.1.tgz", - "integrity": "sha512-eevH2iyqRjxw8kzt7gmLETrlkPTj4Mq1mbIOOD2VQ+O33ocNFl1a87s02mRQGk6UmSJBmHLT/2EaVfUEswBmWA==", + "version": "1.9.0", + "license": "Apache-2.0", "peerDependencies": { - "@maskito/core": "^1.8.1" + "@maskito/core": "^1.9.0" } }, "node_modules/@materia-ui/ngx-monaco-editor": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@materia-ui/ngx-monaco-editor/-/ngx-monaco-editor-6.0.0.tgz", - "integrity": "sha512-gTqNQjOGznZxOC0NlmKdKSGCJuTts8YmK4dsTQAGc5IgIV7cZdQWiW6AL742h0ruED6q0cAunEYjXT6jzHBoIQ==", + "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -3773,8 +5081,7 @@ }, "node_modules/@ng-web-apis/common": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@ng-web-apis/common/-/common-3.0.6.tgz", - "integrity": "sha512-ral+lzGpFS3aOCFB5DcHOI4lZhhp8GH4BnjSbngH2Xk8J0FKYdxRzvcPQVy7hS+TPUu0tW9uFVp6cC7odu3iyQ==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.2.0" }, @@ -3786,8 +5093,7 @@ }, "node_modules/@ng-web-apis/intersection-observer": { "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@ng-web-apis/intersection-observer/-/intersection-observer-3.1.6.tgz", - "integrity": "sha512-Pzk0ycnYpq+EUf60kz+/A7nvCmhYzThc4ArwONwZzJqRF5xOS97CVWObs8hesorXxQdqlsrDNiu+JWuGxEvpzQ==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.2.0" }, @@ -3798,8 +5104,7 @@ }, "node_modules/@ng-web-apis/mutation-observer": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-3.0.6.tgz", - "integrity": "sha512-UW1qoUi2whH0uWkVz5qpdYCLs1u2T0E0QoCMQKZfLEkBpsWRTkT0PTCa9WWX/BhehaSPg23nZZm8BEixd6PI9w==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.2.0" }, @@ -3810,8 +5115,7 @@ }, "node_modules/@ng-web-apis/resize-observer": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@ng-web-apis/resize-observer/-/resize-observer-3.0.6.tgz", - "integrity": "sha512-QdGYdEdC0AzFonLfNOnyYyeCwnvK9jlskoeefvJN3Yyvds3ivBrrTjpeDOdiLsQpCPBp9/673imgq7355vkQow==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.2.0" }, @@ -3822,9 +5126,8 @@ }, "node_modules/@ngtools/webpack": { "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.10.tgz", - "integrity": "sha512-XAVn59zP3ztuKDtw92Xc9+64RK4u4c9g8y5GgtjIWeOwgNXl8bYhAo3uTZzrSrOu96DFZGjsmghFab/7/C2pDg==", "dev": true, + "license": "MIT", "engines": { "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", @@ -3838,9 +5141,8 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "devOptional": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -3851,18 +5153,16 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "devOptional": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "devOptional": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -3873,9 +5173,8 @@ }, "node_modules/@npmcli/fs": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", "devOptional": true, + "license": "ISC", "dependencies": { "semver": "^7.3.5" }, @@ -3885,9 +5184,8 @@ }, "node_modules/@npmcli/git": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", - "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", "devOptional": true, + "license": "ISC", "dependencies": { "@npmcli/promise-spawn": "^6.0.0", "lru-cache": "^7.4.4", @@ -3904,18 +5202,16 @@ }, "node_modules/@npmcli/git/node_modules/lru-cache": { "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/@npmcli/git/node_modules/which": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "devOptional": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -3928,9 +5224,8 @@ }, "node_modules/@npmcli/installed-package-contents": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", - "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", "devOptional": true, + "license": "ISC", "dependencies": { "npm-bundled": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" @@ -3944,10 +5239,8 @@ }, "node_modules/@npmcli/move-file": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", "devOptional": true, + "license": "MIT", "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" @@ -3958,18 +5251,16 @@ }, "node_modules/@npmcli/node-gyp": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", "devOptional": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/promise-spawn": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", - "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", "devOptional": true, + "license": "ISC", "dependencies": { "which": "^3.0.0" }, @@ -3979,9 +5270,8 @@ }, "node_modules/@npmcli/promise-spawn/node_modules/which": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "devOptional": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -3994,9 +5284,8 @@ }, "node_modules/@npmcli/run-script": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", - "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", "devOptional": true, + "license": "ISC", "dependencies": { "@npmcli/node-gyp": "^3.0.0", "@npmcli/promise-spawn": "^6.0.0", @@ -4010,9 +5299,8 @@ }, "node_modules/@npmcli/run-script/node_modules/which": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "devOptional": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -4025,9 +5313,8 @@ }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -4035,15 +5322,13 @@ }, "node_modules/@polka/url": { "version": "1.0.0-next.23", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.23.tgz", - "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@rollup/plugin-json": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.0.1.tgz", - "integrity": "sha512-RgVfl5hWMkxN1h/uZj8FVESvPuBJ/uf6ly6GTj0GONnkfoBN5KC0MSz+PN2OLDgYXMhtG0mWpTrkiOjoxAIevw==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1" }, @@ -4061,9 +5346,8 @@ }, "node_modules/@rollup/plugin-node-resolve": { "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", - "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", @@ -4086,9 +5370,8 @@ }, "node_modules/@rollup/pluginutils": { "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.5.tgz", - "integrity": "sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", @@ -4108,14 +5391,12 @@ }, "node_modules/@rollup/pluginutils/node_modules/@types/estree": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@schematics/angular": { "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.10.tgz", - "integrity": "sha512-PXmoswvN7qknTsXDmEvhZ9UG+awwWnQ/1Jd/eqqQx08iAaAT81OsXj1bN7eSs6tEGBKGjPb6q2xzuiECAdymzg==", + "license": "MIT", "dependencies": { "@angular-devkit/core": "16.2.10", "@angular-devkit/schematics": "16.2.10", @@ -4129,9 +5410,8 @@ }, "node_modules/@sigstore/bundle": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", - "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", "devOptional": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.2.0" }, @@ -4141,18 +5421,16 @@ }, "node_modules/@sigstore/protobuf-specs": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", - "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", "devOptional": true, + "license": "Apache-2.0", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@sigstore/sign": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", - "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", "devOptional": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^1.1.0", "@sigstore/protobuf-specs": "^0.2.0", @@ -4164,18 +5442,16 @@ }, "node_modules/@sigstore/sign/node_modules/@tootallnate/once": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "devOptional": true, + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/@sigstore/sign/node_modules/cacache": { "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "devOptional": true, + "license": "ISC", "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", @@ -4196,9 +5472,8 @@ }, "node_modules/@sigstore/sign/node_modules/http-proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "devOptional": true, + "license": "MIT", "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -4210,18 +5485,16 @@ }, "node_modules/@sigstore/sign/node_modules/lru-cache": { "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/@sigstore/sign/node_modules/make-fetch-happen": { "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "devOptional": true, + "license": "ISC", "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^17.0.0", @@ -4245,18 +5518,16 @@ }, "node_modules/@sigstore/sign/node_modules/make-fetch-happen/node_modules/minipass": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=8" } }, "node_modules/@sigstore/sign/node_modules/minipass-fetch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "devOptional": true, + "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", @@ -4271,9 +5542,8 @@ }, "node_modules/@sigstore/tuf": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", - "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", "devOptional": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.2.0", "tuf-js": "^1.1.7" @@ -4283,19 +5553,15 @@ } }, "node_modules/@start9labs/argon2": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@start9labs/argon2/-/argon2-0.1.0.tgz", - "integrity": "sha512-Ng9Ibuj0p2drQRW013AkUz6TqWysXw/9OyoEoXQZL7kfac0LrxWIDj+xvg+orqQMxcvClWgzeQY/c+IgJtcevA==" + "version": "0.1.0" }, "node_modules/@start9labs/emver": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@start9labs/emver/-/emver-0.1.5.tgz", - "integrity": "sha512-1dhiG03VkfEwSLx/JPKVms6srAbYFQgwfSGhwpUKMDliMXuAHGVaueStmqzVxn3JpH/HEVz0QW8w/PXHqjdiIg==" + "license": "MIT" }, "node_modules/@start9labs/start-sdk": { "version": "0.4.0-rev0.lib0.rc8.beta2", - "resolved": "https://registry.npmjs.org/@start9labs/start-sdk/-/start-sdk-0.4.0-rev0.lib0.rc8.beta2.tgz", - "integrity": "sha512-2jo8gF/lOvzuOKKntPuQyejwDAY6Uxaz4KKqm2awoYN6Ycn1TrYud0KAdSjKFYDCKmJI/guQNej0XGVJe0B1XQ==", + "license": "MIT", "dependencies": { "@iarna/toml": "^2.2.5", "isomorphic-fetch": "^3.0.0", @@ -4305,8 +5571,7 @@ }, "node_modules/@stencil/core": { "version": "2.22.3", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.22.3.tgz", - "integrity": "sha512-kmVA0M/HojwsfkeHsifvHVIYe4l5tin7J5+DLgtl8h6WWfiMClND5K3ifCXXI2ETDNKiEk21p6jql3Fx9o2rng==", + "license": "MIT", "bin": { "stencil": "bin/stencil" }, @@ -4316,28 +5581,26 @@ } }, "node_modules/@taiga-ui/addon-charts": { - "version": "3.53.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.53.0.tgz", - "integrity": "sha512-hmZVovX7Pg9lwz33lzITVRCWDB1SzA68KFxxrVAgkRIw05il9pv7XUuCE9hv/Yb7F7w7LEZoz0+TohB09FW/EQ==", + "version": "3.56.0", + "license": "Apache-2.0", "dependencies": { - "tslib": ">=2.0.0" + "tslib": ">=2.6.2" }, "peerDependencies": { "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", - "@ng-web-apis/common": ">=3.0.0", - "@taiga-ui/cdk": ">=3.53.0", - "@taiga-ui/core": ">=3.53.0", - "@tinkoff/ng-polymorpheus": ">=4.0.0" + "@ng-web-apis/common": ">=3.0.6", + "@taiga-ui/cdk": ">=3.56.0", + "@taiga-ui/core": ">=3.56.0", + "@tinkoff/ng-polymorpheus": ">=4.3.0" } }, "node_modules/@taiga-ui/addon-commerce": { - "version": "3.53.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-commerce/-/addon-commerce-3.53.0.tgz", - "integrity": "sha512-iRzMEZKJg90FyP15eHvy12aD3YG0fmzP2ejBrm1L7GmJksaibsM8B2Foo7nA8PPsHsoRWBDJCVTfnLcc9ulDDg==", + "version": "3.56.0", + "license": "Apache-2.0", "peer": true, "dependencies": { - "tslib": ">=2.0.0" + "tslib": ">=2.6.2" }, "peerDependencies": { "@angular/common": ">=12.0.0", @@ -4346,48 +5609,46 @@ "@maskito/angular": ">=1.3.0", "@maskito/core": ">=1.3.0", "@maskito/kit": ">=1.3.0", - "@ng-web-apis/common": ">=3.0.0", - "@taiga-ui/cdk": ">=3.53.0", - "@taiga-ui/core": ">=3.53.0", - "@taiga-ui/i18n": ">=3.53.0", - "@taiga-ui/kit": ">=3.53.0", - "@tinkoff/ng-polymorpheus": ">=4.0.0", + "@ng-web-apis/common": ">=3.0.6", + "@taiga-ui/cdk": ">=3.56.0", + "@taiga-ui/core": ">=3.56.0", + "@taiga-ui/i18n": ">=3.56.0", + "@taiga-ui/kit": ">=3.56.0", + "@tinkoff/ng-polymorpheus": ">=4.3.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/addon-mobile": { - "version": "3.53.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-mobile/-/addon-mobile-3.53.0.tgz", - "integrity": "sha512-MHfG7I488fyT5NCOvQvCCgCMzIcYFO0MgfNGowcm/nyVaXcTzINF2JWMmdSbMJHCVBFy5xl2CQl0kjOFLYYg9g==", + "version": "3.56.0", + "license": "Apache-2.0", "dependencies": { - "tslib": ">=2.0.0" + "tslib": ">=2.6.2" }, "peerDependencies": { "@angular/cdk": ">=12.0.0", "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", - "@ng-web-apis/common": ">=3.0.0", - "@taiga-ui/cdk": ">=3.53.0", - "@taiga-ui/core": ">=3.53.0", - "@taiga-ui/kit": ">=3.53.0", - "@tinkoff/ng-polymorpheus": ">=4.0.0", + "@ng-web-apis/common": ">=3.0.6", + "@taiga-ui/cdk": ">=3.56.0", + "@taiga-ui/core": ">=3.56.0", + "@taiga-ui/kit": ">=3.56.0", + "@tinkoff/ng-polymorpheus": ">=4.3.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/cdk": { - "version": "3.53.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.53.0.tgz", - "integrity": "sha512-/+knIWNVxywdxxq3MwYGMSGBcc+bJ0PLc9Qnn2KyhxhQylWx9OD1O3gO64BE+pdmcCaLH0bye5j52wy+4bpowg==", + "version": "3.56.0", + "license": "Apache-2.0", "dependencies": { "@ng-web-apis/common": "3.0.6", "@ng-web-apis/mutation-observer": "3.0.6", "@ng-web-apis/resize-observer": "3.0.6", "@tinkoff/ng-event-plugins": "3.1.0", - "@tinkoff/ng-polymorpheus": "4.2.0", + "@tinkoff/ng-polymorpheus": "4.3.0", "tslib": "2.6.2" }, "optionalDependencies": { - "ng-morph": "4.0.0", + "ng-morph": "4.0.3", "parse5": "6.0.1" }, "peerDependencies": { @@ -4399,12 +5660,11 @@ } }, "node_modules/@taiga-ui/core": { - "version": "3.53.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.53.0.tgz", - "integrity": "sha512-3YgkJbnXeZ4FzDdoRl9XOD0r+1RpMwjXSku/fbAt78X8+uRCWMJl9dVJzhTwhcD5HmwmNOjANAr2DtqAikfcOg==", + "version": "3.56.0", + "license": "Apache-2.0", "dependencies": { - "@taiga-ui/i18n": "^3.53.0", - "tslib": ">=2.0.0" + "@taiga-ui/i18n": "^3.56.0", + "tslib": ">=2.6.2" }, "peerDependencies": { "@angular/animations": ">=12.0.0", @@ -4413,97 +5673,90 @@ "@angular/forms": ">=12.0.0", "@angular/platform-browser": ">=12.0.0", "@angular/router": ">=12.0.0", - "@ng-web-apis/common": ">=3.0.0", - "@ng-web-apis/mutation-observer": ">=3.0.0", - "@taiga-ui/cdk": ">=3.53.0", - "@taiga-ui/i18n": ">=3.53.0", + "@ng-web-apis/common": ">=3.0.6", + "@ng-web-apis/mutation-observer": ">=3.0.6", + "@taiga-ui/cdk": ">=3.56.0", + "@taiga-ui/i18n": ">=3.56.0", "@tinkoff/ng-event-plugins": ">=3.1.0", - "@tinkoff/ng-polymorpheus": ">=4.0.0", + "@tinkoff/ng-polymorpheus": ">=4.3.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/experimental": { - "version": "3.53.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/experimental/-/experimental-3.53.0.tgz", - "integrity": "sha512-oAeID9MGt5AwMDNFJWixbBf00ZnclZmBRjRX+wAIr9KqlNUGzKU0BuyW/WaS+HwMMZlUzoE+P0lS1w+YJ6aaIg==", + "version": "3.56.0", + "license": "Apache-2.0", "dependencies": { - "tslib": ">=2.0.0" + "tslib": ">=2.6.2" }, "peerDependencies": { "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", - "@taiga-ui/addon-commerce": ">=3.53.0", - "@taiga-ui/cdk": ">=3.53.0", - "@taiga-ui/core": ">=3.53.0", - "@taiga-ui/kit": ">=3.53.0", - "@tinkoff/ng-polymorpheus": ">=4.0.0", + "@taiga-ui/addon-commerce": ">=3.56.0", + "@taiga-ui/cdk": ">=3.56.0", + "@taiga-ui/core": ">=3.56.0", + "@taiga-ui/kit": ">=3.56.0", + "@tinkoff/ng-polymorpheus": ">=4.3.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/i18n": { - "version": "3.53.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.53.0.tgz", - "integrity": "sha512-/SfafSmWOejCyLab9OViMa/EZy4zC7bHFHxsVOnLwtowu1d8KiQFce6IyMZUryX07LZSrZwA1qNvhZNyfifGaw==", + "version": "3.56.0", + "license": "Apache-2.0", "dependencies": { - "tslib": ">=2.0.0" + "tslib": ">=2.6.2" }, "peerDependencies": { "@angular/core": ">=12.0.0", - "@ng-web-apis/common": ">=3.0.0", + "@ng-web-apis/common": ">=3.0.6", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/icons": { - "version": "3.53.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.53.0.tgz", - "integrity": "sha512-rQhLE4Z27r/OUmZHp3R9KXnz3TDQbzPTqoLuwNKAjrJuZ0NqnCJ74hm50RaiWAs5cO5tLZPjt0QSEi+NnM9qNg==", + "version": "3.56.0", + "license": "Apache-2.0", "dependencies": { - "tslib": ">=2.0.0" + "tslib": ">=2.6.2" }, "peerDependencies": { - "@taiga-ui/cdk": ">=3.53.0" + "@taiga-ui/cdk": ">=3.56.0" } }, "node_modules/@taiga-ui/kit": { - "version": "3.53.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.53.0.tgz", - "integrity": "sha512-ZKWRc5aBDPZ+9L+tlWVi9kNV1PEraCmjn4QSykxtz+gyZZU19sTwwpjitFujAVFeH7fI48W+pW64pn4s7GtFAg==", + "version": "3.56.0", + "license": "Apache-2.0", "dependencies": { - "@maskito/angular": "1.8.1", - "@maskito/core": "1.8.1", - "@maskito/kit": "1.8.1", + "@maskito/angular": "1.9.0", + "@maskito/core": "1.9.0", + "@maskito/kit": "1.9.0", "@ng-web-apis/intersection-observer": "3.1.6", "text-mask-core": "5.1.2", - "tslib": ">=2.0.0" + "tslib": ">=2.6.2" }, "peerDependencies": { "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@angular/forms": ">=12.0.0", "@angular/router": ">=12.0.0", - "@ng-web-apis/common": ">=3.0.0", - "@ng-web-apis/mutation-observer": ">=3.0.0", - "@ng-web-apis/resize-observer": ">=3.0.0", - "@taiga-ui/cdk": ">=3.53.0", - "@taiga-ui/core": ">=3.53.0", - "@taiga-ui/i18n": ">=3.53.0", - "@tinkoff/ng-polymorpheus": ">=4.0.0", + "@ng-web-apis/common": ">=3.0.6", + "@ng-web-apis/mutation-observer": ">=3.0.6", + "@ng-web-apis/resize-observer": ">=3.0.6", + "@taiga-ui/cdk": ">=3.56.0", + "@taiga-ui/core": ">=3.56.0", + "@taiga-ui/i18n": ">=3.56.0", + "@tinkoff/ng-polymorpheus": ">=4.3.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/styles": { - "version": "3.53.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/styles/-/styles-3.53.0.tgz", - "integrity": "sha512-KGyWsrq9aGMM7yV5clIsM31/Wz3j+5egO3wP+yWWUGlr6NI+RYlNsl5tJKya5rNG9AA0Pmrv2q+yU3UAcgsyFg==", + "version": "3.56.0", "peerDependencies": { - "@taiga-ui/cdk": ">=3.53.0", - "tslib": ">=2.0.0" + "@taiga-ui/cdk": ">=3.56.0", + "tslib": ">=2.6.2" } }, "node_modules/@tinkoff/ng-dompurify": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@tinkoff/ng-dompurify/-/ng-dompurify-4.0.0.tgz", - "integrity": "sha512-BjKUweWLrOx8UOZw+Tl+Dae5keYuSbeMkppcXQdsvwASMrPfmP7d3Q206Q6HDqOV2WnpnFqGUB95IMbLAeRRuw==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.0.0" }, @@ -4516,8 +5769,7 @@ }, "node_modules/@tinkoff/ng-event-plugins": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@tinkoff/ng-event-plugins/-/ng-event-plugins-3.1.0.tgz", - "integrity": "sha512-HqLBes/3MV469L1S08uBqmPUIwihx43py+8Lee1Me9jMFM1ZMuAC3NcS/njUFI1OzXU2kIPyUDEw2jmVbg8mWQ==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.2.0" }, @@ -4528,9 +5780,8 @@ } }, "node_modules/@tinkoff/ng-polymorpheus": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@tinkoff/ng-polymorpheus/-/ng-polymorpheus-4.2.0.tgz", - "integrity": "sha512-DBjAXyfYq5PUuJSZK42TSJXqgAFkinavUdHy9bPSy88tLl0ZH3h+JK1EQSYqRP0WJzBe4lXywwDyH4HjagK7sg==", + "version": "4.3.0", + "license": "Apache-2.0", "dependencies": { "tslib": "2.6.2" }, @@ -4541,17 +5792,15 @@ }, "node_modules/@tootallnate/once": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/@ts-morph/common": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.20.0.tgz", - "integrity": "sha512-7uKjByfbPpwuzkstL3L5MQyuXPSKdoNG93Fmi2JoDcTf3pEP731JdRFAduRVkOs8oqxPsXKA+ScrWkdQ8t/I+Q==", + "version": "0.21.0", + "license": "MIT", "optional": true, "dependencies": { "fast-glob": "^3.2.12", @@ -4562,8 +5811,7 @@ }, "node_modules/@ts-morph/common/node_modules/minimatch": { "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "license": "ISC", "optional": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -4577,8 +5825,7 @@ }, "node_modules/@ts-morph/common/node_modules/mkdirp": { "version": "2.1.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", - "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "license": "MIT", "optional": true, "bin": { "mkdirp": "dist/cjs/src/bin.js" @@ -4592,42 +5839,36 @@ }, "node_modules/@tsconfig/node10": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tufjs/canonical-json": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", - "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", "devOptional": true, + "license": "MIT", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@tufjs/models": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", - "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", "devOptional": true, + "license": "MIT", "dependencies": { "@tufjs/canonical-json": "1.0.0", "minimatch": "^9.0.0" @@ -4638,9 +5879,8 @@ }, "node_modules/@types/body-parser": { "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, + "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -4648,27 +5888,24 @@ }, "node_modules/@types/bonjour": { "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect": { "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.3.tgz", - "integrity": "sha512-6mfQ6iNvhSKCZJoY6sIG3m0pKkdUcweVNOLuBBKvoWGzl2yRxOJcYOTRyLKt3nxXvBLJWa6QkW//tgbIwJehmA==", "dev": true, + "license": "MIT", "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" @@ -4676,17 +5913,15 @@ }, "node_modules/@types/dompurify": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-2.4.0.tgz", - "integrity": "sha512-IDBwO5IZhrKvHFUl+clZxgf3hn2b/lU6H1KaBShPkQyGJUQ0xwebezIPSuiyGwfz1UzJWQl4M7BDxtHtCCPlTg==", + "license": "MIT", "dependencies": { "@types/trusted-types": "*" } }, "node_modules/@types/eslint": { "version": "8.44.7", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.7.tgz", - "integrity": "sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -4694,9 +5929,8 @@ }, "node_modules/@types/eslint-scope": { "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -4704,15 +5938,13 @@ }, "node_modules/@types/estree": { "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/express": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -4722,9 +5954,8 @@ }, "node_modules/@types/express-serve-static-core": { "version": "4.17.41", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", - "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -4734,140 +5965,120 @@ }, "node_modules/@types/fs-extra": { "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", - "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/http-errors": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/http-proxy": { "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/js-yaml": { "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", - "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/luxon": { "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.4.tgz", - "integrity": "sha512-H9OXxv4EzJwE75aTPKpiGXJq+y4LFxjpsdgKwSmr503P5DkWc3AG7VAFYrFNVvqemT5DfgZJV9itYhqBHSGujA==" + "license": "MIT" }, "node_modules/@types/marked": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.2.tgz", - "integrity": "sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mime": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/minimatch": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "license": "MIT", "optional": true }, "node_modules/@types/mustache": { "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@types/mustache/-/mustache-4.2.5.tgz", - "integrity": "sha512-PLwiVvTBg59tGFL/8VpcGvqOu3L4OuveNvPi0EYbWchRdEVP++yRUXJPFl+CApKEq13017/4Nf7aQ5lTtHUNsA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { "version": "18.18.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.9.tgz", - "integrity": "sha512-0f5klcuImLnG4Qreu9hPj/rEfFq6YRc5n2mAjSsH+ec/mJL+3voBH0+8T7o8RpFjH7ovc+TRsL/c7OYIQsPTfQ==", "dev": true, + "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/node-forge": { "version": "1.3.9", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.9.tgz", - "integrity": "sha512-meK88cx/sTalPSLSoCzkiUB4VPIFHmxtXm5FaaqRDqBX2i/Sy8bJ4odsan0b20RBjPh06dAQ+OTTdnyQyhJZyQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/node-jose": { "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@types/node-jose/-/node-jose-1.1.13.tgz", - "integrity": "sha512-QjMd4yhwy1EvSToQn0YI3cD29YhyfxFwj7NecuymjLys2/P0FwxWnkgBlFxCai6Y3aBCe7rbwmqwJJawxlgcXw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/parse-json": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/pbkdf2": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/qs": { "version": "6.9.10", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", - "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/resolve": { "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/retry": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/send": { "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, + "license": "MIT", "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -4875,18 +6086,16 @@ }, "node_modules/@types/serve-index": { "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, + "license": "MIT", "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/mime": "*", @@ -4895,44 +6104,38 @@ }, "node_modules/@types/slice-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/sockjs": { "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/trusted-types": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.6.tgz", - "integrity": "sha512-HYtNooPvUY9WAVRBr4u+4Qa9fYD1ze2IUlAD3HoA6oehn1taGwBx3Oa52U4mTslTS+GAExKpaFu39Y5xUEwfjg==" + "license": "MIT" }, "node_modules/@types/uuid": { "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/ws": { "version": "8.5.9", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz", - "integrity": "sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@vitejs/plugin-basic-ssl": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", - "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.6.0" }, @@ -4942,9 +6145,8 @@ }, "node_modules/@webassemblyjs/ast": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -4952,27 +6154,23 @@ }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -4981,15 +6179,13 @@ }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -4999,33 +6195,29 @@ }, "node_modules/@webassemblyjs/ieee754": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -5039,9 +6231,8 @@ }, "node_modules/@webassemblyjs/wasm-gen": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -5052,9 +6243,8 @@ }, "node_modules/@webassemblyjs/wasm-opt": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -5064,9 +6254,8 @@ }, "node_modules/@webassemblyjs/wasm-parser": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -5078,9 +6267,8 @@ }, "node_modules/@webassemblyjs/wast-printer": { "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" @@ -5088,10 +6276,8 @@ }, "node_modules/@wessberg/ts-evaluator": { "version": "0.0.27", - "resolved": "https://registry.npmjs.org/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz", - "integrity": "sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==", - "deprecated": "this package has been renamed to ts-evaluator. Please install ts-evaluator instead", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "jsdom": "^16.4.0", @@ -5111,9 +6297,8 @@ }, "node_modules/@wessberg/ts-evaluator/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -5126,9 +6311,8 @@ }, "node_modules/@wessberg/ts-evaluator/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5142,9 +6326,8 @@ }, "node_modules/@wessberg/ts-evaluator/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -5154,24 +6337,21 @@ }, "node_modules/@wessberg/ts-evaluator/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@wessberg/ts-evaluator/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@wessberg/ts-evaluator/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -5181,39 +6361,33 @@ }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "devOptional": true + "devOptional": true, + "license": "BSD-2-Clause" }, "node_modules/abab": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/abbrev": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/accepts": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, + "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -5224,9 +6398,8 @@ }, "node_modules/acorn": { "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -5236,9 +6409,8 @@ }, "node_modules/acorn-globals": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" @@ -5246,9 +6418,8 @@ }, "node_modules/acorn-globals/node_modules/acorn": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -5258,27 +6429,24 @@ }, "node_modules/acorn-import-assertions": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^8" } }, "node_modules/acorn-walk": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/adjust-sourcemap-loader": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", "dev": true, + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "regex-parser": "^2.2.11" @@ -5289,9 +6457,8 @@ }, "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -5303,9 +6470,8 @@ }, "node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "devOptional": true, + "license": "MIT", "dependencies": { "debug": "4" }, @@ -5315,9 +6481,8 @@ }, "node_modules/agentkeepalive": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", "devOptional": true, + "license": "MIT", "dependencies": { "humanize-ms": "^1.2.1" }, @@ -5327,9 +6492,8 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "devOptional": true, + "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -5340,8 +6504,7 @@ }, "node_modules/ajv": { "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -5355,8 +6518,7 @@ }, "node_modules/ajv-formats": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -5371,9 +6533,8 @@ }, "node_modules/ajv-keywords": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -5383,18 +6544,16 @@ }, "node_modules/ansi-colors": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "devOptional": true, + "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -5407,29 +6566,26 @@ }, "node_modules/ansi-html-community": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true, "engines": [ "node >= 0.8.0" ], + "license": "Apache-2.0", "bin": { "ansi-html": "bin/ansi-html" } }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -5439,8 +6595,7 @@ }, "node_modules/ansi-to-html": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.7.2.tgz", - "integrity": "sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==", + "license": "MIT", "dependencies": { "entities": "^2.2.0" }, @@ -5453,9 +6608,8 @@ }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "devOptional": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -5466,15 +6620,13 @@ }, "node_modules/aproba": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/are-we-there-yet": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", "devOptional": true, + "license": "ISC", "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -5485,19 +6637,16 @@ }, "node_modules/arg": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "license": "Python-2.0" }, "node_modules/array-differ": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "license": "MIT", "optional": true, "engines": { "node": ">=8" @@ -5505,14 +6654,12 @@ }, "node_modules/array-flatten": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", "optional": true, "engines": { "node": ">=8" @@ -5520,8 +6667,7 @@ }, "node_modules/arrify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "license": "MIT", "optional": true, "engines": { "node": ">=8" @@ -5529,9 +6675,8 @@ }, "node_modules/ast-types": { "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.1" }, @@ -5541,32 +6686,27 @@ }, "node_modules/astral-regex": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/at-least-node": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 4.0.0" } }, "node_modules/autoprefixer": { "version": "10.4.14", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "dev": true, "funding": [ { @@ -5578,6 +6718,7 @@ "url": "https://tidelift.com/funding/github/npm/autoprefixer" } ], + "license": "MIT", "dependencies": { "browserslist": "^4.21.5", "caniuse-lite": "^1.0.30001464", @@ -5598,9 +6739,8 @@ }, "node_modules/babel-loader": { "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", "dev": true, + "license": "MIT", "dependencies": { "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" @@ -5615,9 +6755,8 @@ }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -5631,9 +6770,8 @@ }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", - "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.6", "@babel/helper-define-polyfill-provider": "^0.4.3", @@ -5645,18 +6783,16 @@ }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.8.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", - "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.4.3", "core-js-compat": "^3.33.1" @@ -5667,9 +6803,8 @@ }, "node_modules/babel-plugin-polyfill-regenerator": { "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", - "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.4.3" }, @@ -5679,14 +6814,11 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -5700,44 +6832,40 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/base64url": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", - "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/batch": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/big.js": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/binary-extensions": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/bl": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -5746,8 +6874,6 @@ }, "node_modules/bl/node_modules/buffer": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -5762,6 +6888,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -5769,9 +6896,8 @@ }, "node_modules/body-parser": { "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -5793,24 +6919,21 @@ }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/body-parser/node_modules/qs": { "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, @@ -5823,9 +6946,8 @@ }, "node_modules/body-parser/node_modules/raw-body": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -5838,9 +6960,8 @@ }, "node_modules/bonjour-service": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", "dev": true, + "license": "MIT", "dependencies": { "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", @@ -5850,24 +6971,21 @@ }, "node_modules/boolbase": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "devOptional": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/braces": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "devOptional": true, + "license": "MIT", "dependencies": { "fill-range": "^7.0.1" }, @@ -5877,14 +6995,11 @@ }, "node_modules/browser-process-hrtime": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/browserslist": { "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "funding": [ { @@ -5900,6 +7015,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001541", "electron-to-chromium": "^1.4.535", @@ -5915,8 +7031,6 @@ }, "node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -5931,6 +7045,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -5938,15 +7053,13 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/builtin-modules": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -5956,27 +7069,24 @@ }, "node_modules/builtins": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "devOptional": true, + "license": "MIT", "dependencies": { "semver": "^7.0.0" } }, "node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/cacache": { "version": "18.0.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.0.tgz", - "integrity": "sha512-I7mVOPl3PUCeRub1U8YoGz2Lqv9WOBpobZ8RyWFXmReuILz+3OAyTa5oH3QPdtKZD7N0Yk00aLfzn0qvp8dZ1w==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", @@ -5997,18 +7107,16 @@ }, "node_modules/cacache/node_modules/lru-cache": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", "dev": true, + "license": "ISC", "engines": { "node": "14 || >=16.14" } }, "node_modules/call-bind": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2", "get-intrinsic": "^1.2.1", @@ -6020,25 +7128,21 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camelcase": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { "version": "1.0.30001561", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", - "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", "dev": true, "funding": [ { @@ -6053,27 +7157,25 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/cbor": { "name": "@jprochazk/cbor", "version": "0.4.9", - "resolved": "https://registry.npmjs.org/@jprochazk/cbor/-/cbor-0.4.9.tgz", - "integrity": "sha512-FWNnkOtWrFOLXKG2nzOHR/EnCCGZZPvatAvWXDmkTDxgjj9JHDK3DkMUHcFCY3a9weylMCSO/nLOUM170NAO0Q==" + "license": "MIT" }, "node_modules/cbor-web": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cbor-web/-/cbor-web-8.1.0.tgz", - "integrity": "sha512-2hWHHMVrfffgoEmsAUh8vCxHoLa1vgodtC73+C5cSarkJlwTapnqAzcHINlP6Ej0DXuP4OmmJ9LF+JaNM5Lj/g==", + "license": "MIT", "engines": { "node": ">=12.19" } }, "node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -6085,14 +7187,11 @@ }, "node_modules/chardet": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/chokidar": { "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "devOptional": true, "funding": [ { @@ -6100,6 +7199,7 @@ "url": "https://paulmillr.com/funding/" } ], + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -6118,32 +7218,28 @@ }, "node_modules/chownr": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/chrome-trace-event": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0" } }, "node_modules/ci-info": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cipher-base": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -6151,17 +7247,15 @@ }, "node_modules/clean-stack": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/cli-cursor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -6171,8 +7265,7 @@ }, "node_modules/cli-spinners": { "version": "2.9.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", - "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==", + "license": "MIT", "engines": { "node": ">=6" }, @@ -6182,9 +7275,8 @@ }, "node_modules/cli-truncate": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, + "license": "MIT", "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^5.0.0" @@ -6198,9 +7290,8 @@ }, "node_modules/cli-truncate/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -6210,9 +7301,8 @@ }, "node_modules/cli-truncate/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -6222,15 +7312,13 @@ }, "node_modules/cli-truncate/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -6240,9 +7328,8 @@ }, "node_modules/cli-truncate/node_modules/slice-ansi": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" @@ -6256,9 +7343,8 @@ }, "node_modules/cli-truncate/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -6273,9 +7359,8 @@ }, "node_modules/cli-truncate/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -6288,18 +7373,16 @@ }, "node_modules/cli-width": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "devOptional": true, + "license": "ISC", "engines": { "node": ">= 10" } }, "node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "devOptional": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -6311,17 +7394,15 @@ }, "node_modules/clone": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/clone-deep": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -6333,9 +7414,8 @@ }, "node_modules/clone-deep/node_modules/is-plain-object": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -6345,45 +7425,39 @@ }, "node_modules/code-block-writer": { "version": "12.0.0", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-12.0.0.tgz", - "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==", + "license": "MIT", "optional": true }, "node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/color-support": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "devOptional": true, + "license": "ISC", "bin": { "color-support": "bin.js" } }, "node_modules/colorette": { "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -6393,42 +7467,36 @@ }, "node_modules/commander": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" } }, "node_modules/common-path-prefix": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/commondir": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/compare-versions": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/component-emitter": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/compressible": { "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -6438,9 +7506,8 @@ }, "node_modules/compression": { "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -6456,60 +7523,52 @@ }, "node_modules/compression/node_modules/bytes": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/compression/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/compression/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/content-disposition": { "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -6519,45 +7578,39 @@ }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cookie": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cookiejar": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/copy-anything": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", "dev": true, + "license": "MIT", "dependencies": { "is-what": "^3.14.1" }, @@ -6567,9 +7620,8 @@ }, "node_modules/copy-webpack-plugin": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, + "license": "MIT", "dependencies": { "fast-glob": "^3.2.11", "glob-parent": "^6.0.1", @@ -6591,9 +7643,8 @@ }, "node_modules/copy-webpack-plugin/node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -6603,9 +7654,8 @@ }, "node_modules/core-js": { "version": "3.33.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.2.tgz", - "integrity": "sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==", "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" @@ -6613,9 +7663,8 @@ }, "node_modules/core-js-compat": { "version": "3.33.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz", - "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.22.1" }, @@ -6626,15 +7675,13 @@ }, "node_modules/core-util-is": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cosmiconfig": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dev": true, + "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -6648,17 +7695,15 @@ }, "node_modules/cosmiconfig/node_modules/yaml": { "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 6" } }, "node_modules/create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -6669,8 +7714,7 @@ }, "node_modules/create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "license": "MIT", "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -6682,15 +7726,13 @@ }, "node_modules/create-require": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/critters": { "version": "0.0.20", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", - "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "chalk": "^4.1.0", "css-select": "^5.1.0", @@ -6703,9 +7745,8 @@ }, "node_modules/critters/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -6718,9 +7759,8 @@ }, "node_modules/critters/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6734,9 +7774,8 @@ }, "node_modules/critters/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -6746,24 +7785,21 @@ }, "node_modules/critters/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/critters/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/critters/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -6773,8 +7809,7 @@ }, "node_modules/cron": { "version": "2.4.4", - "resolved": "https://registry.npmjs.org/cron/-/cron-2.4.4.tgz", - "integrity": "sha512-MHlPImXJj3K7x7lyUHjtKEOl69CSlTOWxS89jiFgNkzXfvhVjhMz/nc7/EIfN9vgooZp8XTtXJ1FREdmbyXOiQ==", + "license": "MIT", "dependencies": { "@types/luxon": "~3.3.0", "luxon": "~3.3.0" @@ -6782,17 +7817,15 @@ }, "node_modules/cronstrue": { "version": "2.41.0", - "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.41.0.tgz", - "integrity": "sha512-3ZS3eMJaxMRBGmDauKCKbyIRgVcph6uSpkhSbbZvvJWkelHiSTzGJbBqmu8io7Hspd2F45bQKnC1kzoNvtku2g==", + "license": "MIT", "bin": { "cronstrue": "bin/cli.js" } }, "node_modules/cross-spawn": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "devOptional": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -6804,9 +7837,8 @@ }, "node_modules/css-loader": { "version": "6.8.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", - "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", "dev": true, + "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.21", @@ -6830,9 +7862,8 @@ }, "node_modules/css-select": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", @@ -6846,9 +7877,8 @@ }, "node_modules/css-what": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -6858,9 +7888,8 @@ }, "node_modules/cssesc": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -6870,15 +7899,13 @@ }, "node_modules/cssom": { "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cssstyle": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "dev": true, + "license": "MIT", "dependencies": { "cssom": "~0.3.6" }, @@ -6888,30 +7915,26 @@ }, "node_modules/cssstyle/node_modules/cssom": { "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cuint": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/data-uri-to-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", - "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/data-urls": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", "dev": true, + "license": "MIT", "dependencies": { "abab": "^2.0.3", "whatwg-mimetype": "^2.3.0", @@ -6923,9 +7946,8 @@ }, "node_modules/debug": { "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "devOptional": true, + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -6940,38 +7962,33 @@ }, "node_modules/decamelize": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/decimal.js": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/default-gateway": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "execa": "^5.0.0" }, @@ -6981,9 +7998,8 @@ }, "node_modules/default-gateway/node_modules/execa": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -7004,18 +8020,16 @@ }, "node_modules/default-gateway/node_modules/human-signals": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } }, "node_modules/default-gateway/node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -7025,18 +8039,16 @@ }, "node_modules/default-gateway/node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/default-gateway/node_modules/npm-run-path": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -7046,9 +8058,8 @@ }, "node_modules/default-gateway/node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -7061,17 +8072,15 @@ }, "node_modules/default-gateway/node_modules/strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/defaults": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "license": "MIT", "dependencies": { "clone": "^1.0.2" }, @@ -7081,9 +8090,8 @@ }, "node_modules/define-data-property": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.1", "gopd": "^1.0.1", @@ -7095,18 +8103,16 @@ }, "node_modules/define-lazy-prop": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/degenerator": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.4.tgz", - "integrity": "sha512-Z66uPeBfHZAHVmue3HPfyKu2Q0rC2cRxbTOsvmU/po5fvvcx27W4mIu9n0PUlQih4oUYvcG1BsbtVv8x7KDOSw==", "dev": true, + "license": "MIT", "dependencies": { "ast-types": "^0.13.2", "escodegen": "^1.8.1", @@ -7119,9 +8125,8 @@ }, "node_modules/degenerator/node_modules/escodegen": { "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^4.2.0", @@ -7141,18 +8146,16 @@ }, "node_modules/degenerator/node_modules/estraverse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/degenerator/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" @@ -7160,42 +8163,37 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/dependency-graph": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6.0" } }, "node_modules/destroy": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -7203,29 +8201,25 @@ }, "node_modules/detect-node": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/diff": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/dijkstrajs": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", - "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==" + "license": "MIT" }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -7235,15 +8229,13 @@ }, "node_modules/dns-equal": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/dns-packet": { "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, + "license": "MIT", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -7253,9 +8245,8 @@ }, "node_modules/dom-serializer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, + "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -7267,9 +8258,8 @@ }, "node_modules/dom-serializer/node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -7279,29 +8269,26 @@ }, "node_modules/dom7": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/dom7/-/dom7-4.0.6.tgz", - "integrity": "sha512-emjdpPLhpNubapLFdjNL9tP06Sr+GZkrIHEXLWvOGsytACUrkbeIdjO5g77m00BrHTznnlcNqgmn7pCN192TBA==", + "license": "MIT", "dependencies": { "ssr-window": "^4.0.0" } }, "node_modules/domelementtype": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } - ] + ], + "license": "BSD-2-Clause" }, "node_modules/domexception": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", "dev": true, + "license": "MIT", "dependencies": { "webidl-conversions": "^5.0.0" }, @@ -7311,18 +8298,16 @@ }, "node_modules/domexception/node_modules/webidl-conversions": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=8" } }, "node_modules/domhandler": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" }, @@ -7335,14 +8320,12 @@ }, "node_modules/dompurify": { "version": "2.4.7", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.7.tgz", - "integrity": "sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ==" + "license": "(MPL-2.0 OR Apache-2.0)" }, "node_modules/domutils": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -7354,24 +8337,21 @@ }, "node_modules/duplexer": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/duplexer2": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "readable-stream": "^2.0.2" } }, "node_modules/duplexer2/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -7384,42 +8364,36 @@ }, "node_modules/duplexer2/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/duplexer2/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/eastasianwidth": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/electron-to-chromium": { "version": "1.4.580", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.580.tgz", - "integrity": "sha512-T5q3pjQon853xxxHUq3ZP68ZpvJHuSMY2+BZaW3QzjS4HvNuvsMmZ/+lU+nCrftre1jFZ+OSlExynXWBihnXzw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/elementtree": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", - "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "sax": "1.1.4" }, @@ -7429,36 +8403,31 @@ }, "node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "license": "MIT" }, "node_modules/emojis-list": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/encode-utf8": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", - "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" + "license": "MIT" }, "node_modules/encodeurl": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/encoding": { "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "license": "MIT", "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -7466,8 +8435,7 @@ }, "node_modules/encoding/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -7478,18 +8446,16 @@ }, "node_modules/end-of-stream": { "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, + "license": "MIT", "dependencies": { "once": "^1.4.0" } }, "node_modules/enhanced-resolve": { "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -7500,32 +8466,28 @@ }, "node_modules/entities": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/env-paths": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/err-code": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/errno": { "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "prr": "~1.0.1" @@ -7536,30 +8498,26 @@ }, "node_modules/error-ex": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-module-lexer": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", - "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/es6-promise": { "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + "license": "MIT" }, "node_modules/esbuild": { "version": "0.18.17", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", - "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -7593,9 +8551,8 @@ }, "node_modules/esbuild-wasm": { "version": "0.18.17", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz", - "integrity": "sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==", "dev": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -7605,33 +8562,29 @@ }, "node_modules/escalade": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/escodegen": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -7650,9 +8603,8 @@ }, "node_modules/escodegen/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" @@ -7660,9 +8612,8 @@ }, "node_modules/eslint-scope": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -7673,18 +8624,16 @@ }, "node_modules/eslint-scope/node_modules/estraverse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -7695,9 +8644,8 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -7707,63 +8655,55 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/estree-walker": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/eventemitter-asyncresource": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", - "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eventemitter3": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/events": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.x" } }, "node_modules/execa": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", @@ -7784,15 +8724,13 @@ }, "node_modules/exponential-backoff": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "devOptional": true + "devOptional": true, + "license": "Apache-2.0" }, "node_modules/express": { "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -7832,30 +8770,26 @@ }, "node_modules/express/node_modules/array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/express/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/express/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/express/node_modules/qs": { "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, @@ -7868,9 +8802,8 @@ }, "node_modules/external-editor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "devOptional": true, + "license": "MIT", "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -7882,14 +8815,12 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "devOptional": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -7903,41 +8834,35 @@ }, "node_modules/fast-json-patch": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", - "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" + "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-safe-stringify": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fastq": { "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "devOptional": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/faye-websocket": { "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, + "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -7947,9 +8872,8 @@ }, "node_modules/figures": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "devOptional": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -7962,18 +8886,16 @@ }, "node_modules/file-uri-to-path": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", - "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/fill-range": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "devOptional": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -7983,9 +8905,8 @@ }, "node_modules/finalhandler": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -8001,24 +8922,21 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/find-cache-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dev": true, + "license": "MIT", "dependencies": { "common-path-prefix": "^3.0.0", "pkg-dir": "^7.0.0" @@ -8032,8 +8950,7 @@ }, "node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -8044,9 +8961,8 @@ }, "node_modules/find-versions": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", - "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", "dev": true, + "license": "MIT", "dependencies": { "semver-regex": "^3.1.2" }, @@ -8059,8 +8975,6 @@ }, "node_modules/follow-redirects": { "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "dev": true, "funding": [ { @@ -8068,6 +8982,7 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -8079,9 +8994,8 @@ }, "node_modules/foreground-child": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", "devOptional": true, + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -8095,9 +9009,8 @@ }, "node_modules/foreground-child/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -8107,9 +9020,8 @@ }, "node_modules/form-data": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -8121,28 +9033,24 @@ }, "node_modules/formidable": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", - "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", - "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", "dev": true, + "license": "MIT", "funding": { "url": "https://ko-fi.com/tunnckoCore/commissions" } }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fraction.js": { "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, + "license": "MIT", "engines": { "node": "*" }, @@ -8153,18 +9061,16 @@ }, "node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -8177,9 +9083,8 @@ }, "node_modules/fs-minipass": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "devOptional": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -8189,22 +9094,18 @@ }, "node_modules/fs-monkey": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", - "dev": true + "dev": true, + "license": "Unlicense" }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -8215,8 +9116,6 @@ }, "node_modules/ftp": { "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", "dev": true, "dependencies": { "readable-stream": "1.1.x", @@ -8228,15 +9127,13 @@ }, "node_modules/ftp/node_modules/isarray": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ftp/node_modules/readable-stream": { "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -8246,32 +9143,28 @@ }, "node_modules/ftp/node_modules/string_decoder": { "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "devOptional": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/fuse.js": { "version": "6.6.2", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.6.2.tgz", - "integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==", + "license": "Apache-2.0", "engines": { "node": ">=10" } }, "node_modules/gauge": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "devOptional": true, + "license": "ISC", "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", @@ -8288,26 +9181,23 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2", "has-proto": "^1.0.1", @@ -8320,18 +9210,16 @@ }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/get-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -8341,9 +9229,8 @@ }, "node_modules/get-uri": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", - "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", "dev": true, + "license": "MIT", "dependencies": { "@tootallnate/once": "1", "data-uri-to-buffer": "3", @@ -8358,9 +9245,8 @@ }, "node_modules/get-uri/node_modules/fs-extra": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -8372,27 +9258,24 @@ }, "node_modules/get-uri/node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/get-uri/node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/glob": { "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "devOptional": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.5", @@ -8412,9 +9295,8 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "devOptional": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -8424,24 +9306,21 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/globals": { "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/globby": { "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, + "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.3.0", @@ -8458,9 +9337,8 @@ }, "node_modules/gopd": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -8470,15 +9348,13 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/guess-parser": { "version": "0.4.22", - "resolved": "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz", - "integrity": "sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==", "dev": true, + "license": "MIT", "dependencies": { "@wessberg/ts-evaluator": "0.0.27" }, @@ -8488,9 +9364,8 @@ }, "node_modules/gzip-size": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "dev": true, + "license": "MIT", "dependencies": { "duplexer": "^0.1.2" }, @@ -8503,24 +9378,21 @@ }, "node_modules/handle-thing": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/has-property-descriptors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.2" }, @@ -8530,9 +9402,8 @@ }, "node_modules/has-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8542,9 +9413,8 @@ }, "node_modules/has-symbols": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8554,14 +9424,12 @@ }, "node_modules/has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/hash-base": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -8573,9 +9441,8 @@ }, "node_modules/hasown": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", "devOptional": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -8585,9 +9452,8 @@ }, "node_modules/hdr-histogram-js": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", - "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", "dev": true, + "license": "BSD", "dependencies": { "@assemblyscript/loader": "^0.10.1", "base64-js": "^1.2.0", @@ -8596,30 +9462,26 @@ }, "node_modules/hdr-histogram-js/node_modules/pako": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true + "dev": true, + "license": "(MIT AND Zlib)" }, "node_modules/hdr-histogram-percentiles-obj": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", - "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/he": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, + "license": "MIT", "bin": { "he": "bin/he" } }, "node_modules/hosted-git-info": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", "devOptional": true, + "license": "ISC", "dependencies": { "lru-cache": "^7.5.1" }, @@ -8629,18 +9491,16 @@ }, "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/hpack.js": { "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -8650,9 +9510,8 @@ }, "node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -8665,24 +9524,21 @@ }, "node_modules/hpack.js/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/html-encoding-sniffer": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-encoding": "^1.0.5" }, @@ -8692,8 +9548,6 @@ }, "node_modules/html-entities": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", "dev": true, "funding": [ { @@ -8704,12 +9558,11 @@ "type": "patreon", "url": "https://patreon.com/mdevils" } - ] + ], + "license": "MIT" }, "node_modules/htmlparser2": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -8718,6 +9571,7 @@ "url": "https://github.com/sponsors/fb55" } ], + "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -8727,9 +9581,8 @@ }, "node_modules/htmlparser2/node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -8739,21 +9592,18 @@ }, "node_modules/http-cache-semantics": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "devOptional": true + "devOptional": true, + "license": "BSD-2-Clause" }, "node_modules/http-deceiver": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/http-errors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -8767,15 +9617,13 @@ }, "node_modules/http-parser-js": { "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/http-proxy": { "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, + "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -8787,9 +9635,8 @@ }, "node_modules/http-proxy-agent": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, + "license": "MIT", "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -8801,9 +9648,8 @@ }, "node_modules/http-proxy-middleware": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -8825,15 +9671,13 @@ }, "node_modules/http-proxy/node_modules/eventemitter3": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/https-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "devOptional": true, + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -8844,28 +9688,25 @@ }, "node_modules/human-signals": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=14.18.0" } }, "node_modules/humanize-ms": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "devOptional": true, + "license": "MIT", "dependencies": { "ms": "^2.0.0" } }, "node_modules/husky": { "version": "4.3.8", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.8.tgz", - "integrity": "sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow==", "dev": true, "hasInstallScript": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "ci-info": "^2.0.0", @@ -8892,9 +9733,8 @@ }, "node_modules/husky/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8907,9 +9747,8 @@ }, "node_modules/husky/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8923,9 +9762,8 @@ }, "node_modules/husky/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -8935,15 +9773,13 @@ }, "node_modules/husky/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/husky/node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -8957,18 +9793,16 @@ }, "node_modules/husky/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/husky/node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -8981,9 +9815,8 @@ }, "node_modules/husky/node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -8996,9 +9829,8 @@ }, "node_modules/husky/node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -9011,9 +9843,8 @@ }, "node_modules/husky/node_modules/pkg-dir": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^5.0.0" }, @@ -9023,18 +9854,16 @@ }, "node_modules/husky/node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/husky/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9044,9 +9873,8 @@ }, "node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "devOptional": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -9056,9 +9884,8 @@ }, "node_modules/icss-utils": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -9068,8 +9895,6 @@ }, "node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -9083,22 +9908,21 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/ignore": { "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/ignore-walk": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", - "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", "devOptional": true, + "license": "ISC", "dependencies": { "minimatch": "^9.0.0" }, @@ -9108,9 +9932,8 @@ }, "node_modules/image-size": { "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "dev": true, + "license": "MIT", "optional": true, "bin": { "image-size": "bin/image-size.js" @@ -9121,15 +9944,13 @@ }, "node_modules/immutable": { "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -9143,42 +9964,37 @@ }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/infer-owner": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "devOptional": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -9186,32 +10002,28 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "license": "ISC" }, "node_modules/ini": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", "devOptional": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/injection-js": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.4.0.tgz", - "integrity": "sha512-6jiJt0tCAo9zjHbcwLiPL+IuNe9SQ6a9g0PEzafThW3fOQi0mrmiJGBJvDD6tmhPh8cQHIQtCOrJuBfQME4kPA==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.0" } }, "node_modules/inquirer": { "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", "devOptional": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", @@ -9235,9 +10047,8 @@ }, "node_modules/inquirer/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "devOptional": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9250,9 +10061,8 @@ }, "node_modules/inquirer/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "devOptional": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9266,9 +10076,8 @@ }, "node_modules/inquirer/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "devOptional": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9278,24 +10087,21 @@ }, "node_modules/inquirer/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/inquirer/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/inquirer/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "devOptional": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9305,38 +10111,33 @@ }, "node_modules/ionicons": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-6.1.3.tgz", - "integrity": "sha512-ptzz38dd/Yq+PgjhXegh7yhb/SLIk1bvL9vQDtLv1aoSc7alO6mX2DIMgcKYzt9vrNWkRu1f9Jr78zIFFyOXqw==", + "license": "MIT", "dependencies": { "@stencil/core": "^2.18.0" } }, "node_modules/ip": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/ipaddr.js": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "devOptional": true, + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -9346,9 +10147,8 @@ }, "node_modules/is-builtin-module": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, + "license": "MIT", "dependencies": { "builtin-modules": "^3.3.0" }, @@ -9361,9 +10161,8 @@ }, "node_modules/is-core-module": { "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "devOptional": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.0" }, @@ -9373,9 +10172,8 @@ }, "node_modules/is-docker": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "devOptional": true, + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -9388,26 +10186,23 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "devOptional": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -9417,38 +10212,33 @@ }, "node_modules/is-interactive": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-lambda": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/is-module": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-plain-obj": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -9458,24 +10248,21 @@ }, "node_modules/is-plain-object": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -9485,14 +10272,12 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-unicode-supported": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -9502,15 +10287,13 @@ }, "node_modules/is-what": { "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-wsl": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "devOptional": true, + "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -9520,29 +10303,25 @@ }, "node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/isomorphic-fetch": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", - "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", + "license": "MIT", "dependencies": { "node-fetch": "^2.6.1", "whatwg-fetch": "^3.4.1" @@ -9550,18 +10329,16 @@ }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -9575,18 +10352,16 @@ }, "node_modules/istanbul-lib-instrument/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/jackspeak": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "devOptional": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -9602,9 +10377,8 @@ }, "node_modules/jest-worker": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -9616,18 +10390,16 @@ }, "node_modules/jest-worker/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9640,31 +10412,27 @@ }, "node_modules/jiti": { "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", "dev": true, + "license": "MIT", "bin": { "jiti": "bin/jiti.js" } }, "node_modules/jose": { "version": "4.15.4", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.4.tgz", - "integrity": "sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" } }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -9674,9 +10442,8 @@ }, "node_modules/jsdom": { "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", "dev": true, + "license": "MIT", "dependencies": { "abab": "^2.0.5", "acorn": "^8.2.4", @@ -9720,9 +10487,8 @@ }, "node_modules/jsesc": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -9732,20 +10498,17 @@ }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -9755,14 +10518,12 @@ }, "node_modules/jsonc-parser": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + "license": "MIT" }, "node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -9772,45 +10533,40 @@ }, "node_modules/jsonparse": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "devOptional": true, "engines": [ "node >= 0.2.0" - ] + ], + "license": "MIT" }, "node_modules/karma-source-map-support": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", "dev": true, + "license": "MIT", "dependencies": { "source-map-support": "^0.5.5" } }, "node_modules/kind-of": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/klona": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/launch-editor": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", "dev": true, + "license": "MIT", "dependencies": { "picocolors": "^1.0.0", "shell-quote": "^1.8.1" @@ -9818,9 +10574,8 @@ }, "node_modules/leek": { "version": "0.0.24", - "resolved": "https://registry.npmjs.org/leek/-/leek-0.0.24.tgz", - "integrity": "sha512-6PVFIYXxlYF0o6hrAsHtGpTmi06otkwNrMcmQ0K96SeSRHPREPa9J3nJZ1frliVH7XT0XFswoJFQoXsDukzGNQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^2.1.0", "lodash.assign": "^3.2.0", @@ -9829,24 +10584,21 @@ }, "node_modules/leek/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/leek/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/less": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", - "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "copy-anything": "^2.0.1", "parse-node-version": "^1.0.1", @@ -9870,9 +10622,8 @@ }, "node_modules/less-loader": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", - "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", "dev": true, + "license": "MIT", "dependencies": { "klona": "^2.0.4" }, @@ -9890,9 +10641,8 @@ }, "node_modules/less/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" @@ -9900,9 +10650,8 @@ }, "node_modules/levn": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -9913,9 +10662,8 @@ }, "node_modules/license-webpack-plugin": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", - "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", "dev": true, + "license": "ISC", "dependencies": { "webpack-sources": "^3.0.0" }, @@ -9930,24 +10678,21 @@ }, "node_modules/lilconfig": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/lines-and-columns": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lint-staged": { "version": "13.3.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.3.0.tgz", - "integrity": "sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "5.3.0", "commander": "11.0.0", @@ -9972,9 +10717,8 @@ }, "node_modules/lint-staged/node_modules/chalk": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -9984,18 +10728,16 @@ }, "node_modules/lint-staged/node_modules/yaml": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", "dev": true, + "license": "ISC", "engines": { "node": ">= 14" } }, "node_modules/listr2": { "version": "6.6.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", - "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", "dev": true, + "license": "MIT", "dependencies": { "cli-truncate": "^3.1.0", "colorette": "^2.0.20", @@ -10018,9 +10760,8 @@ }, "node_modules/listr2/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -10030,9 +10771,8 @@ }, "node_modules/listr2/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -10042,15 +10782,13 @@ }, "node_modules/listr2/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/listr2/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -10065,9 +10803,8 @@ }, "node_modules/listr2/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -10080,9 +10817,8 @@ }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -10097,26 +10833,23 @@ }, "node_modules/loader-runner": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.11.5" } }, "node_modules/loader-utils": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12.13.0" } }, "node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -10126,14 +10859,12 @@ }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "license": "MIT" }, "node_modules/lodash._baseassign": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==", "dev": true, + "license": "MIT", "dependencies": { "lodash._basecopy": "^3.0.0", "lodash.keys": "^3.0.0" @@ -10141,21 +10872,18 @@ }, "node_modules/lodash._basecopy": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash._bindcallback": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash._createassigner": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha512-LziVL7IDnJjQeeV95Wvhw6G28Z8Q6da87LWKOPWmzBLv4u6FAT/x5v00pyGW0u38UoogNF2JnD3bGgZZDaNEBw==", "dev": true, + "license": "MIT", "dependencies": { "lodash._bindcallback": "^3.0.0", "lodash._isiterateecall": "^3.0.0", @@ -10164,21 +10892,18 @@ }, "node_modules/lodash._getnative": { "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash._isiterateecall": { "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.assign": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", - "integrity": "sha512-/VVxzgGBmbphasTg51FrztxQJ/VgAUpol6zmJuSVSGcNg4g7FA4z7rQV8Ovr9V3vFBNWZhvKWHfpAytjTVUfFA==", "dev": true, + "license": "MIT", "dependencies": { "lodash._baseassign": "^3.0.0", "lodash._createassigner": "^3.0.0", @@ -10187,899 +10912,530 @@ }, "node_modules/lodash.debounce": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.escape": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", - "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.flatten": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.invokemap": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz", - "integrity": "sha512-CfkycNtMqgUlfjfdh2BhKO/ZXrP8ePOX5lEU/g0R3ItJcnuxWDwokMGKx1hWcfOikmyOVx6X9IwWnDGlgKl61w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.isarguments": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.isarray": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.keys": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", "dev": true, + "license": "MIT", "dependencies": { "lodash._getnative": "^3.0.0", "lodash.isarguments": "^3.0.0", "lodash.isarray": "^3.0.0" } }, - "node_modules/lodash.pullall": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.pullall/-/lodash.pullall-4.2.0.tgz", - "integrity": "sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg==", - "dev": true - }, - "node_modules/lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==", - "dev": true - }, - "node_modules/lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-update": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", - "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", - "dev": true, - "dependencies": { - "ansi-escapes": "^5.0.0", - "cli-cursor": "^4.0.0", - "slice-ansi": "^5.0.0", - "strip-ansi": "^7.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", - "dev": true, - "dependencies": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dev": true, - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/lodash.pullall": { + "version": "4.2.0", "dev": true, - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/log-update/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/lodash.restparam": { + "version": "3.6.1", "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, - "node_modules/log-update/node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "node_modules/lodash.uniqby": { + "version": "4.7.0", "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/log-update/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "color-name": "~1.1.4" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=7.0.0" } }, - "node_modules/log-update/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=8" } }, - "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/log-update": { + "version": "5.0.1", "dev": true, + "license": "MIT", "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/luxon": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", - "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/macos-release": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", - "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", - "dev": true, + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" + }, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/magic-string": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", - "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "5.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "type-fest": "^1.0.2" }, "engines": { "node": ">=12" - } - }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "optional": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", "dev": true, - "optional": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "devOptional": true, - "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" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "devOptional": true, - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "devOptional": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/make-fetch-happen/node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "devOptional": true, - "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" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "devOptional": true, - "dependencies": { - "minipass": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">= 8" - } - }, - "node_modules/make-fetch-happen/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "devOptional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "node": ">=12" }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "devOptional": true, + "node_modules/log-update/node_modules/cli-cursor": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "devOptional": true, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-fetch-happen/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "devOptional": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, + "node_modules/log-update/node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/make-fetch-happen/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "devOptional": true, + "node_modules/log-update/node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-fetch-happen/node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "devOptional": true, + "node_modules/log-update/node_modules/restore-cursor": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "minipass": "^3.1.1" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-fetch-happen/node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "devOptional": true, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "5.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "unique-slug": "^3.0.0" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/make-fetch-happen/node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "devOptional": true, + "node_modules/log-update/node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "bin": { - "marked": "bin/marked.js" + "node": ">=12" }, - "engines": { - "node": ">= 12" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "node_modules/log-update/node_modules/type-fest": { + "version": "1.4.0", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">= 0.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "8.1.0", "dev": true, + "license": "MIT", "dependencies": { - "fs-monkey": "^1.0.4" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">= 4.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "devOptional": true, - "engines": { - "node": ">= 8" - } + "node_modules/long": { + "version": "5.2.3", + "license": "Apache-2.0" }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "node_modules/lru-cache": { + "version": "5.1.1", "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "devOptional": true, + "license": "ISC", "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" + "yallist": "^3.0.2" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, + "node_modules/luxon": { + "version": "3.3.0", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/macos-release": { + "version": "2.5.1", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, + "node_modules/magic-string": { + "version": "0.30.1", + "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "@jridgewell/sourcemap-codec": "^1.4.15" }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mini-css-extract-plugin": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", - "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "node_modules/make-dir": { + "version": "2.1.0", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "schema-utils": "^4.0.0" + "pify": "^4.0.1", + "semver": "^5.6.0" }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "node_modules/make-error": { + "version": "1.3.6", + "dev": true, + "license": "ISC" }, - "node_modules/minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "node_modules/make-fetch-happen": { + "version": "10.2.1", "devOptional": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "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" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { + "version": "2.1.2", + "devOptional": true, + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { + "version": "2.0.0", "devOptional": true, + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 10" } }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "node_modules/make-fetch-happen/node_modules/cacache": { + "version": "16.1.3", "devOptional": true, + "license": "ISC", "dependencies": { - "minipass": "^3.0.0" + "@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" }, "engines": { - "node": ">= 8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/make-fetch-happen/node_modules/fs-minipass": { + "version": "2.1.0", "devOptional": true, + "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "minipass": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/minipass-collect/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true - }, - "node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "node_modules/make-fetch-happen/node_modules/glob": { + "version": "8.1.0", "devOptional": true, + "license": "ISC", "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=12" }, - "optionalDependencies": { - "encoding": "^0.1.13" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minipass-fetch/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { + "version": "5.0.0", "devOptional": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/minipass-fetch/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "devOptional": true, + "license": "ISC", + "engines": { + "node": ">=12" + } }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "node_modules/make-fetch-happen/node_modules/minimatch": { + "version": "5.1.6", "devOptional": true, + "license": "ISC", "dependencies": { - "minipass": "^3.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 8" + "node": ">=10" } }, - "node_modules/minipass-flush/node_modules/minipass": { + "node_modules/make-fetch-happen/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "devOptional": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -11087,771 +11443,656 @@ "node": ">=8" } }, - "node_modules/minipass-flush/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true - }, - "node_modules/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "node_modules/make-fetch-happen/node_modules/ssri": { + "version": "9.0.1", "devOptional": true, + "license": "ISC", "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/make-fetch-happen/node_modules/unique-filename": { + "version": "2.0.1", "devOptional": true, + "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "unique-slug": "^3.0.0" }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/minipass-json-stream/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "node_modules/make-fetch-happen/node_modules/unique-slug": { + "version": "3.0.0", "devOptional": true, + "license": "ISC", "dependencies": { - "minipass": "^3.0.0" + "imurmurhash": "^0.1.4" }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/make-fetch-happen/node_modules/yallist": { + "version": "4.0.0", "devOptional": true, - "dependencies": { - "yallist": "^4.0.0" + "license": "ISC" + }, + "node_modules/marked": { + "version": "4.3.0", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" }, "engines": { - "node": ">=8" + "node": ">= 12" } }, - "node_modules/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "devOptional": true, + "node_modules/md5.js": { + "version": "1.3.5", + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" - }, + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "devOptional": true, + "node_modules/memfs": { + "version": "3.5.3", + "dev": true, + "license": "Unlicense", "dependencies": { - "yallist": "^4.0.0" + "fs-monkey": "^1.0.4" }, "engines": { - "node": ">=8" + "node": ">= 4.0.0" } }, - "node_modules/minipass-sized/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true + "node_modules/merge-descriptors": { + "version": "1.0.1", + "dev": true, + "license": "MIT" }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", "devOptional": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, + "license": "MIT", "engines": { "node": ">= 8" } }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/methods": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", "devOptional": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=8" + "node": ">=8.6" } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "devOptional": true, + }, + "node_modules/mime": { + "version": "1.6.0", + "dev": true, + "license": "MIT", "bin": { - "mkdirp": "bin/cmd.js" + "mime": "cli.js" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/monaco-editor": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.33.0.tgz", - "integrity": "sha512-VcRWPSLIUEgQJQIE0pVT8FcGBIgFoxz7jtqctE+IiCxWugD0DwgyQBcZBhdSrdMC84eumoqMZsGl2GTreOzwqw==" - }, - "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "node_modules/mime-db": { + "version": "1.52.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.6" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "devOptional": true - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "node_modules/mime-types": { + "version": "2.1.35", "dev": true, + "license": "MIT", "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" + "mime-db": "1.52.0" }, - "bin": { - "multicast-dns": "cli.js" + "engines": { + "node": ">= 0.6" } }, - "node_modules/multimatch": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", - "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", - "optional": true, - "dependencies": { - "@types/minimatch": "^3.0.3", - "array-differ": "^3.0.0", - "array-union": "^2.1.0", - "arrify": "^2.0.1", - "minimatch": "^3.0.4" - }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/multimatch/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "optional": true, + "node_modules/mini-css-extract-plugin": { + "version": "2.7.6", + "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, - "node_modules/multimatch/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "optional": true, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "9.0.3", + "devOptional": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "bin": { - "mustache": "bin/mustache" + "node_modules/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "devOptional": true - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, + "node_modules/minipass": { + "version": "7.0.4", + "devOptional": true, + "license": "ISC", "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/needle": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", - "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", - "dev": true, - "optional": true, + "node_modules/minipass-collect": { + "version": "1.0.2", + "devOptional": true, + "license": "ISC", "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" + "minipass": "^3.0.0" }, "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/needle/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "optional": true, - "dependencies": { - "ms": "^2.1.1" + "node": ">= 8" } }, - "node_modules/needle/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "devOptional": true, + "license": "ISC", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/needle/node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", - "dev": true, - "optional": true + "node_modules/minipass-collect/node_modules/yallist": { + "version": "4.0.0", + "devOptional": true, + "license": "ISC" }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "node_modules/minipass-fetch": { + "version": "2.1.2", "devOptional": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, "engines": { - "node": ">= 0.6" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "dev": true, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "3.3.6", + "devOptional": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">= 0.4.0" + "node": ">=8" } }, - "node_modules/ng-morph": { + "node_modules/minipass-fetch/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ng-morph/-/ng-morph-4.0.0.tgz", - "integrity": "sha512-+opfMF/33fMQRt38oSPT+fnexZm8c635LaTDKOlAnkaDGRWcOM4EllqLf73m+5+D8gurwYXOkimIzj6Jmpx1cA==", - "optional": true, - "dependencies": { - "jsonc-parser": "3.2.0", - "minimatch": "9.0.1", - "multimatch": "5.0.0", - "semver": "7.4.0", - "ts-morph": "19.0.0" - }, - "peerDependencies": { - "@angular-devkit/core": ">=11.0.0", - "@angular-devkit/schematics": ">=11.0.0", - "tslib": "2.5.3" - } + "devOptional": true, + "license": "ISC" }, - "node_modules/ng-morph/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "optional": true, + "node_modules/minipass-flush": { + "version": "1.0.5", + "devOptional": true, + "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "minipass": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">= 8" } }, - "node_modules/ng-morph/node_modules/semver": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz", - "integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==", - "optional": true, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "devOptional": true, + "license": "ISC", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "yallist": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/ng-morph/node_modules/yallist": { + "node_modules/minipass-flush/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true + "devOptional": true, + "license": "ISC" }, - "node_modules/ng-packagr": { - "version": "16.2.3", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-16.2.3.tgz", - "integrity": "sha512-VTJ7Qtge52+1subkhmF5nOqLNbVutA8/igJ0A5vH6Mgpb8Z/3HeZomtD1SHzZF5Dqp+p+QPHE548FWYu1MdMSQ==", - "dev": true, + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "devOptional": true, + "license": "MIT", "dependencies": { - "@rollup/plugin-json": "^6.0.0", - "@rollup/plugin-node-resolve": "^15.0.0", - "ajv": "^8.11.0", - "ansi-colors": "^4.1.3", - "autoprefixer": "^10.4.12", - "browserslist": "^4.21.4", - "cacache": "^18.0.0", - "chokidar": "^3.5.3", - "commander": "^11.0.0", - "convert-source-map": "^2.0.0", - "dependency-graph": "^0.11.0", - "esbuild-wasm": "^0.19.0", - "fast-glob": "^3.2.12", - "find-cache-dir": "^3.3.2", - "injection-js": "^2.4.0", - "jsonc-parser": "^3.2.0", - "less": "^4.1.3", - "ora": "^5.1.0", - "piscina": "^4.0.0", - "postcss": "^8.4.16", - "postcss-url": "^10.1.3", - "rollup": "^3.0.0", - "rxjs": "^7.5.6", - "sass": "^1.55.0" - }, - "bin": { - "ng-packagr": "cli/main.js" + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "devOptional": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" - }, - "optionalDependencies": { - "esbuild": "^0.19.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^16.0.0 || ^16.2.0-next.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "tslib": "^2.3.0", - "typescript": ">=4.9.3 <5.2" - }, - "peerDependenciesMeta": { - "tailwindcss": { - "optional": true - } + "node": ">=8" } }, - "node_modules/ng-packagr/node_modules/@esbuild/android-arm": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz", - "integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], + "node_modules/minipass-json-stream/node_modules/yallist": { + "version": "4.0.0", + "devOptional": true, + "license": "ISC" + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "devOptional": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/ng-packagr/node_modules/@esbuild/android-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz", - "integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "devOptional": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/ng-packagr/node_modules/@esbuild/android-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz", - "integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "devOptional": true, + "license": "ISC" + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "devOptional": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/ng-packagr/node_modules/@esbuild/darwin-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz", - "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "devOptional": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/ng-packagr/node_modules/@esbuild/darwin-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz", - "integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "devOptional": true, + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "devOptional": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/ng-packagr/node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz", - "integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "devOptional": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/ng-packagr/node_modules/@esbuild/freebsd-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz", - "integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "devOptional": true, + "license": "ISC" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "devOptional": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, "engines": { - "node": ">=12" + "node": ">=10" } }, - "node_modules/ng-packagr/node_modules/@esbuild/linux-arm": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz", - "integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==", - "cpu": [ - "arm" - ], + "node_modules/monaco-editor": { + "version": "0.33.0", + "license": "MIT" + }, + "node_modules/mrmime": { + "version": "1.0.1", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=10" } }, - "node_modules/ng-packagr/node_modules/@esbuild/linux-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz", - "integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==", - "cpu": [ - "arm64" - ], + "node_modules/ms": { + "version": "2.1.2", + "devOptional": true, + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" } }, - "node_modules/ng-packagr/node_modules/@esbuild/linux-ia32": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz", - "integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/multimatch": { + "version": "5.0.0", + "license": "MIT", "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ng-packagr/node_modules/@esbuild/linux-loong64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz", - "integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==", - "cpu": [ - "loong64" - ], - "dev": true, + "node_modules/multimatch/node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/ng-packagr/node_modules/@esbuild/linux-mips64el": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz", - "integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==", - "cpu": [ - "mips64el" - ], - "dev": true, + "node_modules/multimatch/node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=12" + "node": "*" } }, - "node_modules/ng-packagr/node_modules/@esbuild/linux-ppc64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz", - "integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "node_modules/mustache": { + "version": "4.2.0", + "license": "MIT", + "bin": { + "mustache": "bin/mustache" } }, - "node_modules/ng-packagr/node_modules/@esbuild/linux-riscv64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz", - "integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==", - "cpu": [ - "riscv64" - ], + "node_modules/mute-stream": { + "version": "0.0.8", + "devOptional": true, + "license": "ISC" + }, + "node_modules/nanoid": { + "version": "3.3.7", "dev": true, - "optional": true, - "os": [ - "linux" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, "engines": { - "node": ">=12" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/ng-packagr/node_modules/@esbuild/linux-s390x": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz", - "integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==", - "cpu": [ - "s390x" - ], + "node_modules/needle": { + "version": "3.2.0", "dev": true, + "license": "MIT", "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, "engines": { - "node": ">=12" + "node": ">= 4.4.x" } }, - "node_modules/ng-packagr/node_modules/@esbuild/linux-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz", - "integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==", - "cpu": [ - "x64" - ], + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", "dev": true, + "license": "MIT", "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/ng-packagr/node_modules/@esbuild/netbsd-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz", - "integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==", - "cpu": [ - "x64" - ], + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.6.3", "dev": true, + "license": "MIT", "optional": true, - "os": [ - "netbsd" - ], + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/ng-packagr/node_modules/@esbuild/openbsd-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz", - "integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==", - "cpu": [ - "x64" - ], + "node_modules/needle/node_modules/sax": { + "version": "1.3.0", "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "license": "ISC", + "optional": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "devOptional": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.6" } }, - "node_modules/ng-packagr/node_modules/@esbuild/sunos-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz", - "integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==", - "cpu": [ - "x64" - ], + "node_modules/neo-async": { + "version": "2.6.2", "dev": true, - "optional": true, - "os": [ - "sunos" - ], + "license": "MIT" + }, + "node_modules/netmask": { + "version": "2.0.2", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.4.0" } }, - "node_modules/ng-packagr/node_modules/@esbuild/win32-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz", - "integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/ng-morph": { + "version": "4.0.3", + "license": "Apache-2.0", "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "dependencies": { + "jsonc-parser": "3.2.0", + "minimatch": "9.0.3", + "multimatch": "5.0.0", + "ts-morph": "20.0.0", + "tslib": "2.6.2" + }, + "peerDependencies": { + "@angular-devkit/core": ">=11.0.0", + "@angular-devkit/schematics": ">=11.0.0" } }, - "node_modules/ng-packagr/node_modules/@esbuild/win32-ia32": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz", - "integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==", - "cpu": [ - "ia32" - ], + "node_modules/ng-packagr": { + "version": "16.2.3", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "license": "MIT", + "dependencies": { + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^15.0.0", + "ajv": "^8.11.0", + "ansi-colors": "^4.1.3", + "autoprefixer": "^10.4.12", + "browserslist": "^4.21.4", + "cacache": "^18.0.0", + "chokidar": "^3.5.3", + "commander": "^11.0.0", + "convert-source-map": "^2.0.0", + "dependency-graph": "^0.11.0", + "esbuild-wasm": "^0.19.0", + "fast-glob": "^3.2.12", + "find-cache-dir": "^3.3.2", + "injection-js": "^2.4.0", + "jsonc-parser": "^3.2.0", + "less": "^4.1.3", + "ora": "^5.1.0", + "piscina": "^4.0.0", + "postcss": "^8.4.16", + "postcss-url": "^10.1.3", + "rollup": "^3.0.0", + "rxjs": "^7.5.6", + "sass": "^1.55.0" + }, + "bin": { + "ng-packagr": "cli/main.js" + }, "engines": { - "node": ">=12" + "node": "^16.14.0 || >=18.10.0" + }, + "optionalDependencies": { + "esbuild": "^0.19.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^16.0.0 || ^16.2.0-next.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "tslib": "^2.3.0", + "typescript": ">=4.9.3 <5.2" + }, + "peerDependenciesMeta": { + "tailwindcss": { + "optional": true + } } }, - "node_modules/ng-packagr/node_modules/@esbuild/win32-x64": { + "node_modules/ng-packagr/node_modules/@esbuild/darwin-arm64": { "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz", - "integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==", "cpu": [ - "x64" + "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ], "engines": { "node": ">=12" @@ -11859,16 +12100,14 @@ }, "node_modules/ng-packagr/node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ng-packagr/node_modules/esbuild": { "version": "0.19.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz", - "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "bin": { "esbuild": "bin/esbuild" @@ -11903,9 +12142,8 @@ }, "node_modules/ng-packagr/node_modules/esbuild-wasm": { "version": "0.19.5", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.19.5.tgz", - "integrity": "sha512-7zmLLn2QCj93XfMmHtzrDJ1UBuOHB2CZz1ghoCEZiRajxjUvHsF40PnbzFIY/pmesqPRaEtEWii0uzsTbnAgrA==", "dev": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -11915,9 +12153,8 @@ }, "node_modules/ng-packagr/node_modules/find-cache-dir": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, + "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -11932,9 +12169,8 @@ }, "node_modules/ng-packagr/node_modules/make-dir": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -11947,9 +12183,8 @@ }, "node_modules/ng-packagr/node_modules/pkg-dir": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -11959,17 +12194,15 @@ }, "node_modules/ng-packagr/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/ng-qrcode": { "version": "16.0.0", - "resolved": "https://registry.npmjs.org/ng-qrcode/-/ng-qrcode-16.0.0.tgz", - "integrity": "sha512-AVp3Tw1bAwqiHzt57x1Rp7YrnzkMUNlww1+ypjGvgbMPRYmy//cHOzMYsH3HPkFDDmPHwGerdAElmIA/X4SBiQ==", + "license": "MIT", "dependencies": { "qrcode": "^1.5.1", "tslib": "^2.4.0" @@ -11981,10 +12214,9 @@ }, "node_modules/nice-napi": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", - "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "!win32" @@ -11996,15 +12228,13 @@ }, "node_modules/node-addon-api": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/node-fetch": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -12022,18 +12252,15 @@ }, "node_modules/node-fetch/node_modules/tr46": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "license": "MIT" }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "license": "BSD-2-Clause" }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -12041,17 +12268,15 @@ }, "node_modules/node-forge": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } }, "node_modules/node-gyp": { "version": "9.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", - "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", "devOptional": true, + "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", @@ -12074,9 +12299,8 @@ }, "node_modules/node-gyp-build": { "version": "4.6.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", - "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", "dev": true, + "license": "MIT", "optional": true, "bin": { "node-gyp-build": "bin.js", @@ -12086,9 +12310,8 @@ }, "node_modules/node-gyp/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "devOptional": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -12096,9 +12319,8 @@ }, "node_modules/node-gyp/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "devOptional": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -12116,9 +12338,8 @@ }, "node_modules/node-gyp/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "devOptional": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -12128,9 +12349,8 @@ }, "node_modules/node-html-parser": { "version": "5.4.2", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", - "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", "dev": true, + "license": "MIT", "dependencies": { "css-select": "^4.2.1", "he": "1.2.0" @@ -12138,9 +12358,8 @@ }, "node_modules/node-html-parser/node_modules/css-select": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", @@ -12154,9 +12373,8 @@ }, "node_modules/node-html-parser/node_modules/dom-serializer": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, + "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -12168,9 +12386,8 @@ }, "node_modules/node-html-parser/node_modules/domhandler": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" }, @@ -12183,9 +12400,8 @@ }, "node_modules/node-html-parser/node_modules/domutils": { "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -12197,8 +12413,7 @@ }, "node_modules/node-jose": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-jose/-/node-jose-2.2.0.tgz", - "integrity": "sha512-XPCvJRr94SjLrSIm4pbYHKLEaOsDvJCpyFw/6V/KK/IXmyZ6SFBzAUDO9HQf4DB/nTEFcRGH87mNciOP23kFjw==", + "license": "Apache-2.0", "dependencies": { "base64url": "^3.0.1", "buffer": "^6.0.3", @@ -12213,27 +12428,24 @@ }, "node_modules/node-jose/node_modules/uuid": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/node-releases": { "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nopt": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "devOptional": true, + "license": "ISC", "dependencies": { "abbrev": "^1.0.0" }, @@ -12246,9 +12458,8 @@ }, "node_modules/normalize-package-data": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", "devOptional": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^6.0.0", "is-core-module": "^2.8.1", @@ -12261,27 +12472,24 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-range": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/npm-bundled": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", "devOptional": true, + "license": "ISC", "dependencies": { "npm-normalize-package-bin": "^3.0.0" }, @@ -12291,9 +12499,8 @@ }, "node_modules/npm-install-checks": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", - "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", "devOptional": true, + "license": "BSD-2-Clause", "dependencies": { "semver": "^7.1.1" }, @@ -12303,18 +12510,16 @@ }, "node_modules/npm-normalize-package-bin": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "devOptional": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-package-arg": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", "devOptional": true, + "license": "ISC", "dependencies": { "hosted-git-info": "^6.0.0", "proc-log": "^3.0.0", @@ -12327,9 +12532,8 @@ }, "node_modules/npm-packlist": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", - "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", "devOptional": true, + "license": "ISC", "dependencies": { "ignore-walk": "^6.0.0" }, @@ -12339,9 +12543,8 @@ }, "node_modules/npm-pick-manifest": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", - "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", "devOptional": true, + "license": "ISC", "dependencies": { "npm-install-checks": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", @@ -12354,9 +12557,8 @@ }, "node_modules/npm-registry-fetch": { "version": "14.0.5", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", - "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", "devOptional": true, + "license": "ISC", "dependencies": { "make-fetch-happen": "^11.0.0", "minipass": "^5.0.0", @@ -12372,18 +12574,16 @@ }, "node_modules/npm-registry-fetch/node_modules/@tootallnate/once": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "devOptional": true, + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/npm-registry-fetch/node_modules/cacache": { "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "devOptional": true, + "license": "ISC", "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", @@ -12404,18 +12604,16 @@ }, "node_modules/npm-registry-fetch/node_modules/cacache/node_modules/minipass": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/npm-registry-fetch/node_modules/http-proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "devOptional": true, + "license": "MIT", "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -12427,18 +12625,16 @@ }, "node_modules/npm-registry-fetch/node_modules/lru-cache": { "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "devOptional": true, + "license": "ISC", "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^17.0.0", @@ -12462,18 +12658,16 @@ }, "node_modules/npm-registry-fetch/node_modules/minipass": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=8" } }, "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "devOptional": true, + "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", @@ -12488,18 +12682,16 @@ }, "node_modules/npm-registry-fetch/node_modules/minipass-fetch/node_modules/minipass": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/npm-run-path": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -12512,9 +12704,8 @@ }, "node_modules/npm-run-path/node_modules/path-key": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -12524,9 +12715,8 @@ }, "node_modules/npmlog": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "devOptional": true, + "license": "ISC", "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", @@ -12539,9 +12729,8 @@ }, "node_modules/nth-check": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -12551,39 +12740,34 @@ }, "node_modules/nwsapi": { "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/object-inspect": { "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-path": { "version": "0.11.8", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", - "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.12.0" } }, "node_modules/obuf": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/on-finished": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -12593,27 +12777,24 @@ }, "node_modules/on-headers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "devOptional": true, + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -12626,9 +12807,8 @@ }, "node_modules/open": { "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "devOptional": true, + "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -12643,27 +12823,24 @@ }, "node_modules/opencollective-postinstall": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", - "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", "dev": true, + "license": "MIT", "bin": { "opencollective-postinstall": "index.js" } }, "node_modules/opener": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true, + "license": "(WTFPL OR MIT)", "bin": { "opener": "bin/opener-bin.js" } }, "node_modules/optionator": { "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", @@ -12678,8 +12855,7 @@ }, "node_modules/ora": { "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "license": "MIT", "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -12700,8 +12876,7 @@ }, "node_modules/ora/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -12714,8 +12889,7 @@ }, "node_modules/ora/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12729,8 +12903,7 @@ }, "node_modules/ora/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -12740,21 +12913,18 @@ }, "node_modules/ora/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/ora/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ora/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -12764,9 +12934,8 @@ }, "node_modules/os-name": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", - "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", "dev": true, + "license": "MIT", "dependencies": { "macos-release": "^2.5.0", "windows-release": "^4.0.0" @@ -12780,17 +12949,15 @@ }, "node_modules/os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -12803,8 +12970,7 @@ }, "node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -12814,9 +12980,8 @@ }, "node_modules/p-map": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "devOptional": true, + "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -12829,9 +12994,8 @@ }, "node_modules/p-retry": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" @@ -12842,26 +13006,23 @@ }, "node_modules/p-retry/node_modules/retry": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/pac-proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", - "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", "dev": true, + "license": "MIT", "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -12879,9 +13040,8 @@ }, "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", - "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^6.0.2", "debug": "4", @@ -12893,9 +13053,8 @@ }, "node_modules/pac-resolver": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", - "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", "dev": true, + "license": "MIT", "dependencies": { "degenerator": "^3.0.2", "ip": "^1.1.5", @@ -12907,15 +13066,13 @@ }, "node_modules/pac-resolver/node_modules/ip": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/pacote": { "version": "15.2.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", - "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", "devOptional": true, + "license": "ISC", "dependencies": { "@npmcli/git": "^4.0.0", "@npmcli/installed-package-contents": "^2.0.1", @@ -12945,9 +13102,8 @@ }, "node_modules/pacote/node_modules/cacache": { "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "devOptional": true, + "license": "ISC", "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", @@ -12968,41 +13124,36 @@ }, "node_modules/pacote/node_modules/cacache/node_modules/minipass": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/pacote/node_modules/lru-cache": { "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/pacote/node_modules/minipass": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=8" } }, "node_modules/pako": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + "license": "(MIT AND Zlib)" }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -13012,9 +13163,8 @@ }, "node_modules/parse-json": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -13030,23 +13180,20 @@ }, "node_modules/parse-node-version": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/parse5": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/parse5-html-rewriting-stream": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", - "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", + "license": "MIT", "dependencies": { "entities": "^4.3.0", "parse5": "^7.0.0", @@ -13058,8 +13205,7 @@ }, "node_modules/parse5-html-rewriting-stream/node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -13069,8 +13215,7 @@ }, "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "license": "MIT", "dependencies": { "entities": "^4.4.0" }, @@ -13080,8 +13225,7 @@ }, "node_modules/parse5-sax-parser": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", - "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "license": "MIT", "dependencies": { "parse5": "^7.0.0" }, @@ -13091,8 +13235,7 @@ }, "node_modules/parse5-sax-parser/node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -13102,8 +13245,7 @@ }, "node_modules/parse5-sax-parser/node_modules/parse5": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "license": "MIT", "dependencies": { "entities": "^4.4.0" }, @@ -13113,9 +13255,8 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -13126,47 +13267,41 @@ }, "node_modules/path-browserify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT", "optional": true }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/path-scurry": { "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "devOptional": true, + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^9.1.1 || ^10.0.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -13180,32 +13315,28 @@ }, "node_modules/path-scurry/node_modules/lru-cache": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", "devOptional": true, + "license": "ISC", "engines": { "node": "14 || >=16.14" } }, "node_modules/path-to-regexp": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/pbkdf2": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "license": "MIT", "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -13219,14 +13350,12 @@ }, "node_modules/picocolors": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -13236,9 +13365,8 @@ }, "node_modules/pidtree": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true, + "license": "MIT", "bin": { "pidtree": "bin/pidtree.js" }, @@ -13248,9 +13376,8 @@ }, "node_modules/pify": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=6" @@ -13258,9 +13385,8 @@ }, "node_modules/piscina": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.0.0.tgz", - "integrity": "sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==", "dev": true, + "license": "MIT", "dependencies": { "eventemitter-asyncresource": "^1.0.0", "hdr-histogram-js": "^2.0.1", @@ -13272,9 +13398,8 @@ }, "node_modules/pkg-dir": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^6.3.0" }, @@ -13287,9 +13412,8 @@ }, "node_modules/pkg-dir/node_modules/find-up": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -13303,9 +13427,8 @@ }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^6.0.0" }, @@ -13318,9 +13441,8 @@ }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^1.0.0" }, @@ -13333,9 +13455,8 @@ }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^4.0.0" }, @@ -13348,18 +13469,16 @@ }, "node_modules/pkg-dir/node_modules/path-exists": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/pkg-dir/node_modules/yocto-queue": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" }, @@ -13369,25 +13488,21 @@ }, "node_modules/please-upgrade-node": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", "dev": true, + "license": "MIT", "dependencies": { "semver-compare": "^1.0.0" } }, "node_modules/pngjs": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", - "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "license": "MIT", "engines": { "node": ">=10.13.0" } }, "node_modules/postcss": { "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "funding": [ { @@ -13403,6 +13518,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", @@ -13414,9 +13530,8 @@ }, "node_modules/postcss-loader": { "version": "7.3.3", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", - "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", "dev": true, + "license": "MIT", "dependencies": { "cosmiconfig": "^8.2.0", "jiti": "^1.18.2", @@ -13436,9 +13551,8 @@ }, "node_modules/postcss-loader/node_modules/cosmiconfig": { "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, + "license": "MIT", "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", @@ -13462,9 +13576,8 @@ }, "node_modules/postcss-modules-extract-imports": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", "dev": true, + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -13474,9 +13587,8 @@ }, "node_modules/postcss-modules-local-by-default": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", "dev": true, + "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -13491,9 +13603,8 @@ }, "node_modules/postcss-modules-scope": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "dev": true, + "license": "ISC", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -13506,9 +13617,8 @@ }, "node_modules/postcss-modules-values": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, + "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" }, @@ -13521,9 +13631,8 @@ }, "node_modules/postcss-selector-parser": { "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -13534,9 +13643,8 @@ }, "node_modules/postcss-url": { "version": "10.1.3", - "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-10.1.3.tgz", - "integrity": "sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==", "dev": true, + "license": "MIT", "dependencies": { "make-dir": "~3.1.0", "mime": "~2.5.2", @@ -13552,9 +13660,8 @@ }, "node_modules/postcss-url/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -13562,9 +13669,8 @@ }, "node_modules/postcss-url/node_modules/make-dir": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -13577,9 +13683,8 @@ }, "node_modules/postcss-url/node_modules/mime": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -13589,9 +13694,8 @@ }, "node_modules/postcss-url/node_modules/minimatch": { "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -13601,23 +13705,19 @@ }, "node_modules/postcss-url/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/postcss-value-parser": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/prelude-ls": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -13625,9 +13725,8 @@ }, "node_modules/prettier": { "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin-prettier.js" }, @@ -13640,9 +13739,8 @@ }, "node_modules/pretty-bytes": { "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -13652,38 +13750,33 @@ }, "node_modules/proc-log": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", "devOptional": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/process": { "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", "engines": { "node": ">= 0.6.0" } }, "node_modules/process-nextick-args": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/promise-inflight": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/promise-retry": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "devOptional": true, + "license": "MIT", "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -13694,9 +13787,8 @@ }, "node_modules/proxy-addr": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -13707,18 +13799,16 @@ }, "node_modules/proxy-addr/node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", - "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^6.0.0", "debug": "4", @@ -13735,9 +13825,8 @@ }, "node_modules/proxy-agent/node_modules/socks-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", - "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^6.0.2", "debug": "4", @@ -13749,28 +13838,24 @@ }, "node_modules/proxy-from-env": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/prr": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/psl": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/pump": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -13778,16 +13863,14 @@ }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/qrcode": { "version": "1.5.3", - "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz", - "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==", + "license": "MIT", "dependencies": { "dijkstrajs": "^1.0.1", "encode-utf8": "^1.0.3", @@ -13803,8 +13886,7 @@ }, "node_modules/qrcode/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -13817,8 +13899,7 @@ }, "node_modules/qrcode/node_modules/cliui": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -13827,8 +13908,7 @@ }, "node_modules/qrcode/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -13838,13 +13918,11 @@ }, "node_modules/qrcode/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/qrcode/node_modules/wrap-ansi": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -13856,13 +13934,11 @@ }, "node_modules/qrcode/node_modules/y18n": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + "license": "ISC" }, "node_modules/qrcode/node_modules/yargs": { "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "license": "MIT", "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -13882,8 +13958,7 @@ }, "node_modules/qrcode/node_modules/yargs-parser": { "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "license": "ISC", "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -13894,9 +13969,8 @@ }, "node_modules/qs": { "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, @@ -13909,14 +13983,11 @@ }, "node_modules/querystringify": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "devOptional": true, "funding": [ { @@ -13931,31 +14002,29 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/randombytes": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -13968,9 +14037,8 @@ }, "node_modules/raw-loader": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", - "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", "dev": true, + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -13988,9 +14056,8 @@ }, "node_modules/raw-loader/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -14004,24 +14071,21 @@ }, "node_modules/raw-loader/node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/raw-loader/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/raw-loader/node_modules/loader-utils": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -14033,9 +14097,8 @@ }, "node_modules/raw-loader/node_modules/schema-utils": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -14051,9 +14114,8 @@ }, "node_modules/read-package-json": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", - "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", "devOptional": true, + "license": "ISC", "dependencies": { "glob": "^10.2.2", "json-parse-even-better-errors": "^3.0.0", @@ -14066,9 +14128,8 @@ }, "node_modules/read-package-json-fast": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", "devOptional": true, + "license": "ISC", "dependencies": { "json-parse-even-better-errors": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" @@ -14079,26 +14140,23 @@ }, "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", "devOptional": true, + "license": "MIT", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", "devOptional": true, + "license": "MIT", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -14110,9 +14168,8 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "devOptional": true, + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -14122,21 +14179,18 @@ }, "node_modules/reflect-metadata": { "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/regenerate": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regenerate-unicode-properties": { "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, + "license": "MIT", "dependencies": { "regenerate": "^1.4.2" }, @@ -14146,30 +14200,26 @@ }, "node_modules/regenerator-runtime": { "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regenerator-transform": { "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.4" } }, "node_modules/regex-parser": { "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regexpu-core": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", @@ -14184,9 +14234,8 @@ }, "node_modules/regjsparser": { "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "jsesc": "~0.5.0" }, @@ -14196,8 +14245,6 @@ }, "node_modules/regjsparser/node_modules/jsesc": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true, "bin": { "jsesc": "bin/jsesc" @@ -14205,36 +14252,31 @@ }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/require-main-filename": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + "license": "ISC" }, "node_modules/requires-port": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/resolve": { "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "devOptional": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.11.0", "path-parse": "^1.0.7", @@ -14249,18 +14291,16 @@ }, "node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/resolve-url-loader": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", - "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", "dev": true, + "license": "MIT", "dependencies": { "adjust-sourcemap-loader": "^4.0.0", "convert-source-map": "^1.7.0", @@ -14274,9 +14314,8 @@ }, "node_modules/resolve-url-loader/node_modules/loader-utils": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -14288,17 +14327,15 @@ }, "node_modules/resolve-url-loader/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/restore-cursor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -14309,16 +14346,14 @@ }, "node_modules/restore-cursor/node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/restore-cursor/node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -14331,18 +14366,16 @@ }, "node_modules/retry": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "devOptional": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/reusify": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "devOptional": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -14350,15 +14383,13 @@ }, "node_modules/rfdc": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "devOptional": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -14371,9 +14402,8 @@ }, "node_modules/rimraf/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "devOptional": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -14381,9 +14411,8 @@ }, "node_modules/rimraf/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "devOptional": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -14401,9 +14430,8 @@ }, "node_modules/rimraf/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "devOptional": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -14413,8 +14441,7 @@ }, "node_modules/ripemd160": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -14422,9 +14449,8 @@ }, "node_modules/rollup": { "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", "dev": true, + "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -14438,26 +14464,22 @@ }, "node_modules/rsvp": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", "dev": true, + "license": "MIT", "engines": { "node": "0.12.* || 4.* || 6.* || >= 7.*" } }, "node_modules/run-async": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "devOptional": true, "funding": [ { @@ -14473,22 +14495,20 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/rxjs": { "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -14502,19 +14522,18 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/sass": { "version": "1.64.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", - "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", "dev": true, + "license": "MIT", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -14529,9 +14548,8 @@ }, "node_modules/sass-loader": { "version": "13.3.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", - "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", "dev": true, + "license": "MIT", "dependencies": { "neo-async": "^2.6.2" }, @@ -14566,15 +14584,13 @@ }, "node_modules/sax": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", - "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/saxes": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", "dev": true, + "license": "ISC", "dependencies": { "xmlchars": "^2.2.0" }, @@ -14584,9 +14600,8 @@ }, "node_modules/schema-utils": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -14603,15 +14618,13 @@ }, "node_modules/select-hose": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/selfsigned": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/node-forge": "^1.3.0", "node-forge": "^1" @@ -14622,9 +14635,8 @@ }, "node_modules/semver": { "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "devOptional": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -14637,15 +14649,13 @@ }, "node_modules/semver-compare": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/semver-regex": { "version": "3.1.4", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", - "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -14655,9 +14665,8 @@ }, "node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "devOptional": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -14667,15 +14676,13 @@ }, "node_modules/semver/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/send": { "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -14697,39 +14704,34 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/send/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/serialize-javascript": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/serve-index": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -14745,27 +14747,24 @@ }, "node_modules/serve-index/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/serve-index/node_modules/depd": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, + "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -14778,36 +14777,31 @@ }, "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serve-static": { "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, + "license": "MIT", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -14820,14 +14814,12 @@ }, "node_modules/set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + "license": "ISC" }, "node_modules/set-function-length": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.1", "get-intrinsic": "^1.2.1", @@ -14840,14 +14832,12 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -14858,9 +14848,8 @@ }, "node_modules/shallow-clone": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, + "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -14870,9 +14859,8 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "devOptional": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -14882,27 +14870,24 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/shell-quote": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/side-channel": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -14914,14 +14899,12 @@ }, "node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "license": "ISC" }, "node_modules/sigstore": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", - "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", "devOptional": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^1.1.0", "@sigstore/protobuf-specs": "^0.2.0", @@ -14938,18 +14921,16 @@ }, "node_modules/sigstore/node_modules/@tootallnate/once": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "devOptional": true, + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/sigstore/node_modules/cacache": { "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "devOptional": true, + "license": "ISC", "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", @@ -14970,9 +14951,8 @@ }, "node_modules/sigstore/node_modules/http-proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "devOptional": true, + "license": "MIT", "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -14984,18 +14964,16 @@ }, "node_modules/sigstore/node_modules/lru-cache": { "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/sigstore/node_modules/make-fetch-happen": { "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "devOptional": true, + "license": "ISC", "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^17.0.0", @@ -15019,18 +14997,16 @@ }, "node_modules/sigstore/node_modules/make-fetch-happen/node_modules/minipass": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=8" } }, "node_modules/sigstore/node_modules/minipass-fetch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "devOptional": true, + "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", @@ -15045,9 +15021,8 @@ }, "node_modules/sirv": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", - "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", "dev": true, + "license": "MIT", "dependencies": { "@polka/url": "^1.0.0-next.20", "mrmime": "^1.0.0", @@ -15059,9 +15034,8 @@ }, "node_modules/slash": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -15071,9 +15045,8 @@ }, "node_modules/slice-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -15088,9 +15061,8 @@ }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -15103,9 +15075,8 @@ }, "node_modules/slice-ansi/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -15115,15 +15086,13 @@ }, "node_modules/slice-ansi/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/smart-buffer": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "devOptional": true, + "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -15131,9 +15100,8 @@ }, "node_modules/sockjs": { "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, + "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", @@ -15142,9 +15110,8 @@ }, "node_modules/socks": { "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "devOptional": true, + "license": "MIT", "dependencies": { "ip": "^2.0.0", "smart-buffer": "^4.2.0" @@ -15156,9 +15123,8 @@ }, "node_modules/socks-proxy-agent": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "devOptional": true, + "license": "MIT", "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.3", @@ -15170,26 +15136,23 @@ }, "node_modules/source-map": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/source-map-js": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-loader": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", - "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", "dev": true, + "license": "MIT", "dependencies": { "abab": "^2.0.6", "iconv-lite": "^0.6.3", @@ -15208,9 +15171,8 @@ }, "node_modules/source-map-loader/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -15220,9 +15182,8 @@ }, "node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -15230,18 +15191,16 @@ }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/spdx-correct": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "devOptional": true, + "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -15249,15 +15208,13 @@ }, "node_modules/spdx-exceptions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "devOptional": true + "devOptional": true, + "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "devOptional": true, + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -15265,15 +15222,13 @@ }, "node_modules/spdx-license-ids": { "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", - "devOptional": true + "devOptional": true, + "license": "CC0-1.0" }, "node_modules/spdy": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -15287,9 +15242,8 @@ }, "node_modules/spdy-transport": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -15301,35 +15255,30 @@ }, "node_modules/split2": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dev": true, + "license": "ISC", "dependencies": { "readable-stream": "^3.0.0" } }, "node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/ssh-config": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/ssh-config/-/ssh-config-1.1.6.tgz", - "integrity": "sha512-ZPO9rECxzs5JIQ6G/2EfL1I9ho/BVZkx9HRKn8+0af7QgwAmumQ7XBFP1ggMyPMo+/tUbmv0HFdv4qifdO/9JA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ssr-window": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-4.0.2.tgz", - "integrity": "sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ==" + "license": "MIT" }, "node_modules/ssri": { "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", "devOptional": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -15339,18 +15288,16 @@ }, "node_modules/statuses": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/stream-combiner2": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", "dev": true, + "license": "MIT", "dependencies": { "duplexer2": "~0.1.0", "readable-stream": "^2.0.2" @@ -15358,9 +15305,8 @@ }, "node_modules/stream-combiner2/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -15373,40 +15319,35 @@ }, "node_modules/stream-combiner2/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/stream-combiner2/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string-argv": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6.19" } }, "node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15419,9 +15360,8 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "devOptional": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15433,8 +15373,7 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -15445,9 +15384,8 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "devOptional": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -15457,9 +15395,8 @@ }, "node_modules/strip-final-newline": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -15469,10 +15406,8 @@ }, "node_modules/superagent": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.3.1.tgz", - "integrity": "sha512-wjJ/MoTid2/RuGCOFtlacyGNxN9QLMgcpYLDQlWFIhhdJ93kNscFonGvrpAHSCVjRVj++DGCglocF7Aej1KHvQ==", - "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", "dev": true, + "license": "MIT", "dependencies": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.2", @@ -15492,9 +15427,8 @@ }, "node_modules/superagent-proxy": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-3.0.0.tgz", - "integrity": "sha512-wAlRInOeDFyd9pyonrkJspdRAxdLrcsZ6aSnS+8+nu4x1aXbz6FWSTT9M6Ibze+eG60szlL7JA8wEIV7bPWuyQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.2", "proxy-agent": "^5.0.0" @@ -15508,9 +15442,8 @@ }, "node_modules/superagent/node_modules/mime": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -15520,9 +15453,8 @@ }, "node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -15532,9 +15464,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "devOptional": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -15544,8 +15475,6 @@ }, "node_modules/swiper": { "version": "8.4.7", - "resolved": "https://registry.npmjs.org/swiper/-/swiper-8.4.7.tgz", - "integrity": "sha512-VwO/KU3i9IV2Sf+W2NqyzwWob4yX9Qdedq6vBtS0rFqJ6Fa5iLUJwxQkuD4I38w0WDJwmFl8ojkdcRFPHWD+2g==", "funding": [ { "type": "patreon", @@ -15557,6 +15486,7 @@ } ], "hasInstallScript": true, + "license": "MIT", "dependencies": { "dom7": "^4.0.4", "ssr-window": "^4.0.2" @@ -15567,33 +15497,29 @@ }, "node_modules/symbol-observable": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/symbol-tree": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tapable": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tar": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "devOptional": true, + "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -15608,9 +15534,8 @@ }, "node_modules/tar/node_modules/fs-minipass": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "devOptional": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -15620,9 +15545,8 @@ }, "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "devOptional": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -15632,24 +15556,21 @@ }, "node_modules/tar/node_modules/minipass": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=8" } }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/terser": { "version": "5.19.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", - "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -15665,9 +15586,8 @@ }, "node_modules/terser-webpack-plugin": { "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", @@ -15699,9 +15619,8 @@ }, "node_modules/terser-webpack-plugin/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -15715,24 +15634,21 @@ }, "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -15748,15 +15664,13 @@ }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/test-exclude": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -15768,9 +15682,8 @@ }, "node_modules/test-exclude/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -15778,9 +15691,8 @@ }, "node_modules/test-exclude/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -15798,9 +15710,8 @@ }, "node_modules/test-exclude/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -15810,32 +15721,27 @@ }, "node_modules/text-mask-core": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/text-mask-core/-/text-mask-core-5.1.2.tgz", - "integrity": "sha512-VfkCMdmRRZqXgQZFlDMiavm3hzsMzBM23CxHZsaeAYg66ZhXCNJWrFmnJwNy8KF9f74YvAUAuQenxsMCfuvhUw==" + "license": "Unlicense" }, "node_modules/text-table": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/thunky": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tmp": { "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "devOptional": true, + "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -15845,18 +15751,16 @@ }, "node_modules/to-fast-properties": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "devOptional": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -15866,27 +15770,24 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/totalist": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tough-cookie": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -15899,18 +15800,16 @@ }, "node_modules/tough-cookie/node_modules/universalify": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/tr46": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "dev": true, + "license": "MIT", "dependencies": { "punycode": "^2.1.1" }, @@ -15920,33 +15819,29 @@ }, "node_modules/tree-kill": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, + "license": "MIT", "bin": { "tree-kill": "cli.js" } }, "node_modules/ts-matches": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ts-matches/-/ts-matches-5.4.1.tgz", - "integrity": "sha512-kXrY75F0s0WD15N2bWKDScKlKgwnusN6dTRzGs1N7LlxQRnazrsBISC1HL4sy2adsyk65Zbx3Ui3IGN8leAFOQ==" + "version": "v5.4.1", + "license": "MIT" }, "node_modules/ts-morph": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-19.0.0.tgz", - "integrity": "sha512-D6qcpiJdn46tUqV45vr5UGM2dnIEuTGNxVhg0sk5NX11orcouwj6i1bMqZIz2mZTZB1Hcgy7C3oEVhAT+f6mbQ==", + "version": "20.0.0", + "license": "MIT", "optional": true, "dependencies": { - "@ts-morph/common": "~0.20.0", + "@ts-morph/common": "~0.21.0", "code-block-writer": "^12.0.0" } }, "node_modules/ts-node": { "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, + "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -15987,24 +15882,20 @@ }, "node_modules/ts-node/node_modules/acorn-walk": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", - "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/tslib": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "license": "0BSD" }, "node_modules/tslint": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", "dev": true, + "license": "Apache-2.0", "dependencies": { "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", @@ -16032,18 +15923,16 @@ }, "node_modules/tslint/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/tslint/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -16051,24 +15940,21 @@ }, "node_modules/tslint/node_modules/builtin-modules": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/tslint/node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tslint/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -16086,9 +15972,8 @@ }, "node_modules/tslint/node_modules/js-yaml": { "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -16099,9 +15984,8 @@ }, "node_modules/tslint/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -16111,9 +15995,8 @@ }, "node_modules/tslint/node_modules/mkdirp": { "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -16123,24 +16006,21 @@ }, "node_modules/tslint/node_modules/semver": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/tslint/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/tsutils": { "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -16150,15 +16030,13 @@ }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/tuf-js": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", - "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", "devOptional": true, + "license": "MIT", "dependencies": { "@tufjs/models": "1.0.4", "debug": "^4.3.4", @@ -16170,18 +16048,16 @@ }, "node_modules/tuf-js/node_modules/@tootallnate/once": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "devOptional": true, + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/tuf-js/node_modules/cacache": { "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "devOptional": true, + "license": "ISC", "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", @@ -16202,9 +16078,8 @@ }, "node_modules/tuf-js/node_modules/http-proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "devOptional": true, + "license": "MIT", "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -16216,18 +16091,16 @@ }, "node_modules/tuf-js/node_modules/lru-cache": { "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/tuf-js/node_modules/make-fetch-happen": { "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "devOptional": true, + "license": "ISC", "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^17.0.0", @@ -16251,18 +16124,16 @@ }, "node_modules/tuf-js/node_modules/make-fetch-happen/node_modules/minipass": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=8" } }, "node_modules/tuf-js/node_modules/minipass-fetch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "devOptional": true, + "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", @@ -16277,9 +16148,8 @@ }, "node_modules/type-check": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "~1.1.2" }, @@ -16289,9 +16159,8 @@ }, "node_modules/type-fest": { "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "devOptional": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -16301,9 +16170,8 @@ }, "node_modules/type-is": { "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -16314,24 +16182,21 @@ }, "node_modules/typed-assert": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", - "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, + "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" } }, "node_modules/typescript": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -16342,24 +16207,21 @@ }, "node_modules/undici-types": { "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, + "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -16370,27 +16232,24 @@ }, "node_modules/unicode-match-property-value-ecmascript": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unique-filename": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "devOptional": true, + "license": "ISC", "dependencies": { "unique-slug": "^4.0.0" }, @@ -16400,9 +16259,8 @@ }, "node_modules/unique-slug": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "devOptional": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" }, @@ -16412,35 +16270,30 @@ }, "node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/untildify": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/update-browserslist-db": { "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -16456,6 +16309,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -16469,17 +16323,15 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/url-parse": { "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, + "license": "MIT", "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -16487,37 +16339,32 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "license": "MIT" }, "node_modules/utils-merge": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4.0" } }, "node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/validate-npm-package-license": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "devOptional": true, + "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -16525,9 +16372,8 @@ }, "node_modules/validate-npm-package-name": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", "devOptional": true, + "license": "ISC", "dependencies": { "builtins": "^5.0.0" }, @@ -16537,18 +16383,16 @@ }, "node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/vite": { "version": "4.4.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.7.tgz", - "integrity": "sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.26", @@ -16601,10 +16445,8 @@ }, "node_modules/vm2": { "version": "3.9.19", - "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.19.tgz", - "integrity": "sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==", - "deprecated": "The library contains critical security issues and should not be used for production! The maintenance of the project has been discontinued. Consider migrating your code to isolated-vm.", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.7.0", "acorn-walk": "^8.2.0" @@ -16618,28 +16460,24 @@ }, "node_modules/vm2/node_modules/acorn-walk": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", - "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/w3c-hr-time": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", "dev": true, + "license": "MIT", "dependencies": { "browser-process-hrtime": "^1.0.0" } }, "node_modules/w3c-xmlserializer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", "dev": true, + "license": "MIT", "dependencies": { "xml-name-validator": "^3.0.0" }, @@ -16649,9 +16487,8 @@ }, "node_modules/watchpack": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -16662,35 +16499,31 @@ }, "node_modules/wbuf": { "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, + "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" } }, "node_modules/wcwidth": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "license": "MIT", "dependencies": { "defaults": "^1.0.3" } }, "node_modules/webidl-conversions": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=10.4" } }, "node_modules/webpack": { "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -16736,9 +16569,8 @@ }, "node_modules/webpack-bundle-analyzer": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.1.tgz", - "integrity": "sha512-jnd6EoYrf9yMxCyYDPj8eutJvtjQNp8PHmni/e/ulydHBWhT5J3menXt3HEkScsu9YqMAcG4CfFjs3rj5pVU1w==", "dev": true, + "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "0.5.7", "acorn": "^8.0.4", @@ -16767,27 +16599,24 @@ }, "node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", - "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/webpack-bundle-analyzer/node_modules/commander": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/webpack-bundle-analyzer/node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -16797,9 +16626,8 @@ }, "node_modules/webpack-dev-middleware": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", - "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", "dev": true, + "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.12", @@ -16825,9 +16653,8 @@ }, "node_modules/webpack-dev-server": { "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dev": true, + "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -16884,9 +16711,8 @@ }, "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "dev": true, + "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", @@ -16907,9 +16733,8 @@ }, "node_modules/webpack-dev-server/node_modules/ws": { "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -16928,9 +16753,8 @@ }, "node_modules/webpack-merge": { "version": "5.9.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", - "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", "dev": true, + "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", "wildcard": "^2.0.0" @@ -16941,18 +16765,16 @@ }, "node_modules/webpack-sources": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } }, "node_modules/webpack-subresource-integrity": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", - "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", "dev": true, + "license": "MIT", "dependencies": { "typed-assert": "^1.0.8" }, @@ -16971,16 +16793,14 @@ }, "node_modules/webpack/node_modules/@types/estree": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/webpack/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -16995,9 +16815,8 @@ }, "node_modules/webpack/node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, + "license": "MIT", "peer": true, "peerDependencies": { "ajv": "^6.9.1" @@ -17005,16 +16824,14 @@ }, "node_modules/webpack/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/webpack/node_modules/schema-utils": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -17031,9 +16848,8 @@ }, "node_modules/websocket-driver": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -17045,38 +16861,33 @@ }, "node_modules/websocket-extensions": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=0.8.0" } }, "node_modules/whatwg-encoding": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "dev": true, + "license": "MIT", "dependencies": { "iconv-lite": "0.4.24" } }, "node_modules/whatwg-fetch": { "version": "3.6.19", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", - "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==" + "license": "MIT" }, "node_modules/whatwg-mimetype": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/whatwg-url": { "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "dev": true, + "license": "MIT", "dependencies": { "lodash": "^4.7.0", "tr46": "^2.1.0", @@ -17088,9 +16899,8 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "devOptional": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -17103,38 +16913,33 @@ }, "node_modules/which-module": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" + "license": "ISC" }, "node_modules/which-pm-runs": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", - "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/wide-align": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "devOptional": true, + "license": "ISC", "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "node_modules/wildcard": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/windows-release": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", - "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", "dev": true, + "license": "MIT", "dependencies": { "execa": "^4.0.2" }, @@ -17147,9 +16952,8 @@ }, "node_modules/windows-release/node_modules/execa": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", @@ -17170,9 +16974,8 @@ }, "node_modules/windows-release/node_modules/get-stream": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, + "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -17185,18 +16988,16 @@ }, "node_modules/windows-release/node_modules/human-signals": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=8.12.0" } }, "node_modules/windows-release/node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -17206,18 +17007,16 @@ }, "node_modules/windows-release/node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/windows-release/node_modules/npm-run-path": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -17227,9 +17026,8 @@ }, "node_modules/windows-release/node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -17242,27 +17040,24 @@ }, "node_modules/windows-release/node_modules/strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/word-wrap": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "devOptional": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -17278,9 +17073,8 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "devOptional": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -17295,9 +17089,8 @@ }, "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "devOptional": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -17310,9 +17103,8 @@ }, "node_modules/wrap-ansi-cjs/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "devOptional": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -17322,15 +17114,13 @@ }, "node_modules/wrap-ansi-cjs/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "devOptional": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -17343,9 +17133,8 @@ }, "node_modules/wrap-ansi/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "devOptional": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -17355,21 +17144,18 @@ }, "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/write-file-atomic": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -17379,9 +17165,8 @@ }, "node_modules/ws": { "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -17400,62 +17185,51 @@ }, "node_modules/xml-name-validator": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/xmlchars": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/xregexp": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", "dev": true, - "engines": { - "node": "*" - } + "license": "MIT" }, "node_modules/xxhashjs": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", - "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", "dev": true, + "license": "MIT", "dependencies": { "cuint": "^0.2.2" } }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yaml": { "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "license": "ISC", "engines": { "node": ">= 14" } }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "devOptional": true, + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -17471,27 +17245,24 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/yn": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -17501,8 +17272,7 @@ }, "node_modules/zone.js": { "version": "0.13.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.3.tgz", - "integrity": "sha512-MKPbmZie6fASC/ps4dkmIhaT5eonHkEt6eAy80K42tAm0G2W+AahLJjbfi6X9NPdciOE9GRFTTM8u2IiF6O3ww==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" } diff --git a/web/package.json b/web/package.json index 8b313ccf1..d7ed7e661 100644 --- a/web/package.json +++ b/web/package.json @@ -46,14 +46,14 @@ "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc8.beta2", - "@taiga-ui/addon-charts": "3.53.0", - "@taiga-ui/addon-mobile": "3.53.0", - "@taiga-ui/cdk": "3.53.0", - "@taiga-ui/core": "3.53.0", - "@taiga-ui/experimental": "3.53.0", - "@taiga-ui/icons": "3.53.0", - "@taiga-ui/kit": "3.53.0", - "@taiga-ui/styles": "3.53.0", + "@taiga-ui/addon-charts": "3.56.0", + "@taiga-ui/addon-mobile": "3.56.0", + "@taiga-ui/cdk": "3.56.0", + "@taiga-ui/core": "3.56.0", + "@taiga-ui/experimental": "3.56.0", + "@taiga-ui/icons": "3.56.0", + "@taiga-ui/kit": "3.56.0", + "@taiga-ui/styles": "3.56.0", "@tinkoff/ng-dompurify": "4.0.0", "@tinkoff/ng-event-plugins": "3.1.0", "ansi-to-html": "^0.7.2", diff --git a/web/projects/shared/styles/taiga.scss b/web/projects/shared/styles/taiga.scss index 2df7487b8..1e51e2719 100644 --- a/web/projects/shared/styles/taiga.scss +++ b/web/projects/shared/styles/taiga.scss @@ -1,23 +1,10 @@ @import '@taiga-ui/core/styles/taiga-ui-local'; /* stylelint-disable order/order */ -[tuiWrapper][data-appearance='secondary-warning'] { +[tuiAppearance][data-appearance='secondary-warning'] { background: var(--tui-warning-bg); color: var(--tui-warning-fill); - &[data-mode='onDark'] { - background: var(--tui-warning-bg-night); - color: var(--tui-warning-fill-night); - - @include wrapper-hover { - background: var(--tui-warning-bg-night-hover); - } - - @include wrapper-active { - background: var(--tui-warning-bg-night-hover); - } - } - @include wrapper-hover { background: var(--tui-warning-bg-hover); } @@ -27,18 +14,23 @@ } } -[tuiWrapper][data-appearance='success'] { +[tuiAppearance][data-appearance='icon-success'] { color: var(--tui-success-fill); } -[tuiWrapper][data-appearance='warning'] { +[tuiAppearance][data-appearance='icon-warning'] { color: var(--tui-warning-fill); } -[tuiWrapper][data-appearance='error'] { +[tuiAppearance][data-appearance='icon-error'] { color: var(--tui-error-fill); } +[tuiAppearance][data-appearance='flat'], +[tuiAppearance][data-appearance='outline'] { + color: var(--tui-text-01); +} + [tuiWrapper][data-appearance='input-file'] { &:hover, &:active { diff --git a/web/projects/ui/src/app/app.component.html b/web/projects/ui/src/app/app.component.html index dbb0ae039..9c4a8f685 100644 --- a/web/projects/ui/src/app/app.component.html +++ b/web/projects/ui/src/app/app.component.html @@ -1,5 +1,6 @@ diff --git a/web/projects/ui/src/app/app.providers.ts b/web/projects/ui/src/app/app.providers.ts index e6b52a1f6..cb165b85a 100644 --- a/web/projects/ui/src/app/app.providers.ts +++ b/web/projects/ui/src/app/app.providers.ts @@ -1,7 +1,7 @@ import { APP_INITIALIZER, Provider } from '@angular/core' import { UntypedFormBuilder } from '@angular/forms' import { Router, RouteReuseStrategy } from '@angular/router' -import { IonicRouteStrategy, IonNav } from '@ionic/angular' +import { IonNav } from '@ionic/angular' import { TUI_DATE_FORMAT, TUI_DATE_SEPARATOR } from '@taiga-ui/cdk' import { tuiNumberFormatProvider, @@ -54,10 +54,6 @@ export const APP_PROVIDERS: Provider[] = [ provide: TUI_DATE_TIME_VALUE_TRANSFORMER, useClass: DatetimeTransformerService, }, - { - provide: RouteReuseStrategy, - useClass: IonicRouteStrategy, - }, { provide: ApiService, useClass: useMocks ? MockApiService : LiveApiService, diff --git a/web/projects/ui/src/app/apps/portal/components/header/about.component.ts b/web/projects/ui/src/app/apps/portal/components/header/about.component.ts new file mode 100644 index 000000000..7d5aa2369 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/components/header/about.component.ts @@ -0,0 +1,70 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { CopyService, EmverPipesModule } from '@start9labs/shared' +import { + TuiButtonModule, + TuiCellModule, + TuiTitleModule, +} from '@taiga-ui/experimental' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' +import { PatchDB } from 'patch-db-client' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { ConfigService } from 'src/app/services/config.service' + +@Component({ + template: ` + +
+
+ Version +
{{ server.version | displayEmver }}
+
+
+
+
+ Git Hash +
{{ gitHash }}
+
+ +
+
+
+ CA fingerprint +
{{ server['ca-fingerprint'] }}
+
+ +
+
+ `, + styles: ['[tuiCell] { padding-inline: 0 }'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + EmverPipesModule, + TuiTitleModule, + TuiButtonModule, + TuiCellModule, + ], +}) +export class AboutComponent { + readonly server$ = inject(PatchDB).watch$('server-info') + readonly copyService = inject(CopyService) + readonly gitHash = inject(ConfigService).gitHash +} + +export const ABOUT = new PolymorpheusComponent(AboutComponent) diff --git a/web/projects/ui/src/app/apps/portal/components/header/header-menu.component.ts b/web/projects/ui/src/app/apps/portal/components/header/header-menu.component.ts index 28f6fad05..f7154028c 100644 --- a/web/projects/ui/src/app/apps/portal/components/header/header-menu.component.ts +++ b/web/projects/ui/src/app/apps/portal/components/header/header-menu.component.ts @@ -1,12 +1,14 @@ import { ChangeDetectionStrategy, Component, inject } from '@angular/core' import { TuiDataListModule, + TuiDialogService, TuiHostedDropdownModule, TuiSvgModule, } from '@taiga-ui/core' import { TuiButtonModule } from '@taiga-ui/experimental' import { ApiService } from 'src/app/services/api/embassy-api.service' import { AuthService } from 'src/app/services/auth.service' +import { ABOUT } from './about.component' @Component({ selector: 'header-menu', @@ -23,7 +25,7 @@ import { AuthService } from 'src/app/services/auth.service'

StartOS

- @@ -101,6 +103,11 @@ import { AuthService } from 'src/app/services/auth.service' export class HeaderMenuComponent { private readonly api = inject(ApiService) private readonly auth = inject(AuthService) + private readonly dialogs = inject(TuiDialogService) + + about() { + this.dialogs.open(ABOUT, { label: 'About this server' }).subscribe() + } logout() { this.api.logout({}).catch(e => console.error('Failed to log out', e)) diff --git a/web/projects/ui/src/app/apps/portal/components/header/header.component.ts b/web/projects/ui/src/app/apps/portal/components/header/header.component.ts index 3ee4f951f..eb9e1fe8b 100644 --- a/web/projects/ui/src/app/apps/portal/components/header/header.component.ts +++ b/web/projects/ui/src/app/apps/portal/components/header/header.component.ts @@ -33,7 +33,7 @@ import { NotificationService } from '../../services/notification.service' + + + + + + + + +
+ {{ button.title }} +
{{ button.description }}
+ +
+ + +
+ `, + styles: [ + ':host:not(:last-child) { display: block; box-shadow: 0 1px var(--tui-clear); }', + ], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, TuiIconModule, TuiTitleModule, RouterLink], +}) +export class SettingsButtonComponent { + @Input({ required: true }) + button!: SettingBtn +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/components/http.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/components/http.component.ts new file mode 100644 index 000000000..515cab2fa --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/components/http.component.ts @@ -0,0 +1,43 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core' +import { TuiNotificationModule } from '@taiga-ui/core' +import { + TuiButtonModule, + TuiCellModule, + TuiTitleModule, +} from '@taiga-ui/experimental' + +@Component({ + selector: 'settings-http', + template: ` + +
+
+ Http detected +
+
+ Tor is faster over https. + + Download and trust your server's Root CA + + , then switch to https. +
+
+
+ +
+
+ `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + TuiButtonModule, + TuiCellModule, + TuiNotificationModule, + TuiTitleModule, + ], +}) +export class SettingsHttpsComponent {} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/components/menu.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/components/menu.component.ts new file mode 100644 index 000000000..d49b9ad1b --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/components/menu.component.ts @@ -0,0 +1,140 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { TuiAlertService, TuiLoaderModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' +import { PatchDB } from 'patch-db-client' +import { ConfigService } from 'src/app/services/config.service' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { ClientStorageService } from 'src/app/services/client-storage.service' +import { SettingsService } from '../settings.service' +import { SettingsSyncComponent } from './sync.component' +import { SettingsHttpsComponent } from './http.component' +import { SettingsButtonComponent } from './button.component' +import { SettingsUpdateComponent } from './update.component' + +@Component({ + selector: 'settings-menu', + template: ` + + + + + Open Https + + +
+

{{ cat.key }}

+ + +
+ {{ + !server.network.outboundProxy + ? 'None' + : server.network.outboundProxy === 'primary' + ? 'System Primary' + : server.network.outboundProxy.proxyId + }} +
+
+ +
+
+
+ + + + `, + styles: [ + ` + :host { + display: flex; + flex-direction: column; + gap: 1rem; + padding-top: 1rem; + } + `, + ], + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + CommonModule, + TuiLoaderModule, + TuiButtonModule, + SettingsSyncComponent, + SettingsHttpsComponent, + SettingsButtonComponent, + SettingsUpdateComponent, + ], +}) +export class SettingsMenuComponent { + private readonly clientStorageService = inject(ClientStorageService) + private readonly alerts = inject(TuiAlertService) + + readonly isTorHttp = inject(ConfigService).isTorHttp() + readonly server$ = inject(PatchDB).watch$('server-info') + readonly service = inject(SettingsService) + + manageClicks = 0 + powerClicks = 0 + + addClick(title: string) { + switch (title) { + case 'Security': + this.addSecurityClick() + break + case 'Power': + this.addPowerClick() + break + default: + return + } + } + + asIsOrder() { + return 0 + } + + private addSecurityClick() { + this.manageClicks++ + + if (this.manageClicks === 5) { + this.manageClicks = 0 + this.alerts + .open( + this.clientStorageService.toggleShowDevTools() + ? 'Dev tools unlocked' + : 'Dev tools hidden', + ) + .subscribe() + } + } + + private addPowerClick() { + this.powerClicks++ + if (this.powerClicks === 5) { + this.powerClicks = 0 + this.clientStorageService.toggleShowDiskRepair() + } + } +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/components/sync.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/components/sync.component.ts new file mode 100644 index 000000000..3c066a4ad --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/components/sync.component.ts @@ -0,0 +1,43 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core' +import { TuiNotificationModule } from '@taiga-ui/core' +import { + TuiButtonModule, + TuiCellModule, + TuiTitleModule, +} from '@taiga-ui/experimental' + +@Component({ + selector: 'settings-sync', + template: ` + +
+
+ Clock sync failure +
+ This will cause connectivity issues. Refer to the StartOS docs to + resolve the issue. +
+
+ + Open Docs + +
+
+ `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + TuiButtonModule, + TuiCellModule, + TuiNotificationModule, + TuiTitleModule, + ], +}) +export class SettingsSyncComponent {} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/components/update.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/components/update.component.ts new file mode 100644 index 000000000..411682708 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/components/update.component.ts @@ -0,0 +1,102 @@ +import { + ChangeDetectionStrategy, + Component, + inject, + Input, +} from '@angular/core' +import { CommonModule } from '@angular/common' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { TuiIconModule, TuiTitleModule } from '@taiga-ui/experimental' +import { TuiDialogService } from '@taiga-ui/core' +import { EOSService } from 'src/app/services/eos.service' +import { UPDATE } from '../modals/update.component' + +@Component({ + selector: 'settings-update', + template: ` + + `, + styles: [ + ':host { display: block; box-shadow: 0 1px var(--tui-clear); }', + '.small { width: 1rem; height: 1rem; }', + ], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, TuiIconModule, TuiTitleModule], +}) +export class SettingsUpdateComponent { + private readonly dialogs = inject(TuiDialogService) + private readonly loader = inject(LoadingService) + private readonly errorService = inject(ErrorService) + + readonly service = inject(EOSService) + + @Input() + updated = false + + onClick() { + this.service.updateAvailable$.value ? this.update() : this.check() + } + + private update() { + this.dialogs.open(UPDATE).subscribe() + } + + private async check(): Promise { + const loader = this.loader.open('Checking for updates').subscribe() + + try { + await this.service.loadEos() + + if (this.service.updateAvailable$.value) { + this.update() + } else { + this.showLatest() + } + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } + + private showLatest() { + this.dialogs + .open('You are on the latest version of StartOS.', { + label: 'Up to date!', + size: 's', + }) + .subscribe() + } +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/modals/update.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/modals/update.component.ts new file mode 100644 index 000000000..f300c5b6e --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/modals/update.component.ts @@ -0,0 +1,81 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, Inject } from '@angular/core' +import { + ErrorService, + LoadingService, + MarkdownPipeModule, + SafeLinksDirective, +} from '@start9labs/shared' +import { + POLYMORPHEUS_CONTEXT, + PolymorpheusComponent, +} from '@tinkoff/ng-polymorpheus' +import { TuiAutoFocusModule } from '@taiga-ui/cdk' +import { TuiDialogContext, TuiScrollbarModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' +import { NgDompurifyModule } from '@tinkoff/ng-dompurify' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { EOSService } from 'src/app/services/eos.service' + +@Component({ + template: ` +

StartOS {{ versions[0].version }}

+

+ Release Notes +

+ + +

+ {{ v.version }} +

+
+
+
+ + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + MarkdownPipeModule, + NgDompurifyModule, + SafeLinksDirective, + TuiAutoFocusModule, + TuiButtonModule, + TuiScrollbarModule, + ], +}) +export class SettingsUpdateModal { + readonly versions = Object.entries(this.eosService.eos?.['release-notes']!) + .sort(([a], [b]) => a.localeCompare(b)) + .reverse() + .map(([version, notes]) => ({ + version, + notes, + })) + + constructor( + @Inject(POLYMORPHEUS_CONTEXT) private readonly context: TuiDialogContext, + private readonly loader: LoadingService, + private readonly errorService: ErrorService, + private readonly embassyApi: ApiService, + private readonly eosService: EOSService, + ) {} + + async update() { + const loader = this.loader.open('Beginning update...').subscribe() + + try { + await this.embassyApi.updateServer() + this.context.$implicit.complete() + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } +} + +export const UPDATE = new PolymorpheusComponent(SettingsUpdateModal) diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/domains/constants.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/domains/constants.ts new file mode 100644 index 000000000..2d93ab758 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/domains/constants.ts @@ -0,0 +1,152 @@ +import { Config } from '@start9labs/start-sdk/lib/config/builder/config' +import { Value } from '@start9labs/start-sdk/lib/config/builder/value' +import { Variants } from '@start9labs/start-sdk/lib/config/builder/variants' +import { Proxy } from 'src/app/services/patch-db/data-model' +import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' + +const auth = Config.of({ + username: Value.text({ + name: 'Username', + required: { default: null }, + }), + password: Value.text({ + name: 'Password', + required: { default: null }, + masked: true, + }), +}) + +function getStrategyUnion(proxies: Proxy[]) { + const inboundProxies = proxies + .filter(p => p.type === 'inbound-outbound') + .reduce((prev, curr) => { + return { + [curr.id]: curr.name, + ...prev, + } + }, {}) + + return Value.union( + { + name: 'Networking Strategy', + required: { default: null }, + description: `
Local
Select this option if you do not mind exposing your home/business IP address to the Internet. This option requires configuring router settings, which StartOS can do automatically if you have an OpenWRT router +
Proxy
Select this option is you prefer to hide your home/business IP address from the Internet. This option requires running your own Virtual Private Server (VPS) or paying service provider such as Static Wire +`, + }, + Variants.of({ + local: { + name: 'Local', + spec: Config.of({ + ipStrategy: Value.select({ + name: 'IP Strategy', + description: `
IPv6 Only (recommended)
Requirements:
  1. ISP IPv6 support
  2. OpenWRT (recommended) or Linksys router
Pros: Ready for IPv6 Internet. Enhanced privacy. Run multiple clearnet servers from the same network +Cons: Interfaces using this domain will only be accessible to people whose ISP supports IPv6 +
IPv6 and IPv4
Pros: Ready for IPv6 Internet. Accessible by anyone +Cons: Less private, as IPv4 addresses are closely correlated with geographic areas. Cannot run multiple clearnet servers from the same network +
IPv4 Only
Pros: Accessible by anyone +Cons: Less private, as IPv4 addresses are closely correlated with geographic areas. Cannot run multiple clearnet servers from the same network +`, + required: { default: 'ipv6' }, + values: { + ipv6: 'IPv6 Only', + ipv4: 'IPv4 Only', + dualstack: 'IPv6 and IPv4', + }, + }), + }), + }, + proxy: { + name: 'Proxy', + spec: Config.of({ + proxyStrategy: Value.union( + { + name: 'Proxy Strategy', + required: { default: 'primary' }, + description: `
Primary
Use the Primary Inbound proxy from your proxy settings. If you do not have any inbound proxies, no proxy will be used +
Other
Use a specific proxy from your proxy settings +`, + }, + Variants.of({ + primary: { + name: 'Primary', + spec: Config.of({}), + }, + other: { + name: 'Specific', + spec: Config.of({ + proxyId: Value.select({ + name: 'Select Proxy', + required: { default: null }, + values: inboundProxies, + }), + }), + }, + }), + ), + }), + }, + }), + ) +} + +export async function getStart9ToSpec(proxies: Proxy[]) { + return configBuilderToSpec( + Config.of({ + strategy: getStrategyUnion(proxies), + }), + ) +} + +export async function getCustomSpec(proxies: Proxy[]) { + return configBuilderToSpec( + Config.of({ + hostname: Value.text({ + name: 'Hostname', + required: { default: null }, + placeholder: 'yourdomain.com', + }), + provider: Value.union( + { + name: 'Dynamic DNS Provider', + required: { default: 'start9' }, + }, + Variants.of({ + start9: { + name: 'Start9', + spec: Config.of({}), + }, + njalla: { + name: 'Njalla', + spec: auth, + }, + duckdns: { + name: 'Duck DNS', + spec: auth, + }, + dyn: { + name: 'DynDNS', + spec: auth, + }, + easydns: { + name: 'easyDNS', + spec: auth, + }, + zoneedit: { + name: 'Zoneedit', + spec: auth, + }, + googledomains: { + name: 'Google Domains (IPv4 or IPv6)', + spec: auth, + }, + namecheap: { + name: 'Namecheap (IPv4 only)', + spec: auth, + }, + }), + ), + strategy: getStrategyUnion(proxies), + }), + ) +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/domains/domains.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/domains/domains.component.ts new file mode 100644 index 000000000..9bff2a680 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/domains/domains.component.ts @@ -0,0 +1,213 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { TuiDialogOptions, TuiDialogService } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' +import { TUI_PROMPT } from '@taiga-ui/kit' +import { PatchDB } from 'patch-db-client' +import { filter, firstValueFrom, map } from 'rxjs' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { FormContext, FormPage } from 'src/app/apps/ui/modals/form/form.page' +import { FormDialogService } from 'src/app/services/form-dialog.service' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { getCustomSpec } from 'src/app/apps/ui/pages/system/domains/domain.const' +import { getStart9ToSpec } from './constants' +import { DomainsTableComponent } from './table.component' +import { DomainsInfoComponent } from './info.component' + +@Component({ + template: ` + + +

+ Start9.to + +

+
+ +

+ Custom Domains + +

+
+
+ `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + TuiButtonModule, + DomainsTableComponent, + DomainsInfoComponent, + ], +}) +export class SettingsDomainsComponent { + private readonly loader = inject(LoadingService) + private readonly errorService = inject(ErrorService) + private readonly formDialog = inject(FormDialogService) + private readonly patch = inject(PatchDB) + private readonly api = inject(ApiService) + private readonly dialogs = inject(TuiDialogService) + + readonly domains$ = this.patch.watch$('server-info', 'network').pipe( + map(network => { + const start9ToSubdomain = network.start9ToSubdomain + const start9To = !start9ToSubdomain + ? [] + : [ + { + ...start9ToSubdomain, + value: `${start9ToSubdomain.value}.start9.to`, + provider: 'Start9', + }, + ] + + return { start9To, custom: network.domains } + }), + ) + + delete(hostname?: string) { + this.dialogs + .open(TUI_PROMPT, { + label: 'Confirm', + size: 's', + data: { + content: `Delete ${hostname || 'start9.to'} domain?`, + yes: 'Delete', + no: 'Cancel', + }, + }) + .pipe(filter(Boolean)) + .subscribe(() => this.deleteDomain(hostname)) + } + + async add() { + const proxies = await firstValueFrom( + this.patch.watch$('server-info', 'network', 'proxies'), + ) + + const options: Partial>> = { + label: 'Custom Domain', + data: { + spec: await getCustomSpec(proxies), + buttons: [ + { + text: 'Manage proxies', + link: '/portal/system/settings/proxies', + }, + { + text: 'Save', + handler: async value => this.save(value), + }, + ], + }, + } + + this.formDialog.open(FormPage, options) + } + + async claim() { + const proxies = await firstValueFrom( + this.patch.watch$('server-info', 'network', 'proxies'), + ) + + const options: Partial>> = { + label: 'start9.to', + data: { + spec: await getStart9ToSpec(proxies), + buttons: [ + { + text: 'Manage proxies', + link: '/portal/system/settings/proxies', + }, + { + text: 'Save', + handler: async value => this.claimDomain(value), + }, + ], + }, + } + + this.formDialog.open(FormPage, options) + } + + private getNetworkStrategy(strategy: any) { + const { ipStrategy, proxyStrategy = {} } = strategy.unionValueKey + const { unionSelectKey, unionValueKey = {} } = proxyStrategy + const proxyId = unionSelectKey === 'primary' ? null : unionValueKey.proxyId + + return strategy.unionSelectKey === 'local' ? { ipStrategy } : { proxyId } + } + + private async deleteDomain(hostname?: string) { + const loader = this.loader.open('Deleting...').subscribe() + + try { + if (hostname) { + await this.api.deleteDomain({ hostname }) + } else { + await this.api.deleteStart9ToDomain({}) + } + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } + + private async claimDomain({ strategy }: any): Promise { + const loader = this.loader.open('Saving...').subscribe() + const networkStrategy = this.getNetworkStrategy(strategy) + + try { + await this.api.claimStart9ToDomain({ networkStrategy }) + return true + } catch (e: any) { + this.errorService.handleError(e) + return false + } finally { + loader.unsubscribe() + } + } + + private async save({ provider, strategy, hostname }: any): Promise { + const loader = this.loader.open('Saving...').subscribe() + const name = provider.unionSelectKey + + try { + await this.api.addDomain({ + hostname, + networkStrategy: this.getNetworkStrategy(strategy), + provider: { + name, + username: name === 'start9' ? null : provider.unionValueKey.username, + password: name === 'start9' ? null : provider.unionValueKey.password, + }, + }) + return true + } catch (e: any) { + this.errorService.handleError(e) + return false + } finally { + loader.unsubscribe() + } + } +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/domains/info.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/domains/info.component.ts new file mode 100644 index 000000000..ee788140b --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/domains/info.component.ts @@ -0,0 +1,22 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core' +import { TuiNotificationModule } from '@taiga-ui/core' + +@Component({ + selector: 'domains-info', + template: ` + + Adding domains permits accessing your server and services over clearnet. + + View instructions + + + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [TuiNotificationModule], +}) +export class DomainsInfoComponent {} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/domains/table.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/domains/table.component.ts new file mode 100644 index 000000000..b19667868 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/domains/table.component.ts @@ -0,0 +1,91 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + EventEmitter, + inject, + Input, + Output, +} from '@angular/core' +import { TuiDialogService, TuiLinkModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' +import { Domain } from 'src/app/services/patch-db/data-model' + +@Component({ + selector: 'table[domains]', + template: ` + + + Domain + Added + DDNS Provider + Network Strategy + Used By + + + + + + {{ domain.value }} + {{ domain.createdAt | date : 'short' }} + {{ domain.provider }} + {{ getStrategy(domain) }} + + + N/A + + + + + + + `, + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [CommonModule, TuiButtonModule, TuiLinkModule], +}) +export class DomainsTableComponent { + private readonly dialogs = inject(TuiDialogService) + + @Input() + domains: readonly Domain[] = [] + + @Output() + readonly delete = new EventEmitter() + + getStrategy(domain: any) { + return ( + domain.networkStrategy.ipStrategy || + domain.networkStrategy.proxyId || + 'Primary Proxy' + ) + } + + onUsedBy({ value, usedBy }: Domain) { + const interfaces = usedBy.map(u => + u.interfaces.map(i => `
  • ${u.service.title} - ${i.title}
  • `), + ) + + this.dialogs + .open(`${value} is currently being used by:
      ${interfaces}
    `, { + label: 'Used by', + size: 's', + }) + .subscribe() + } +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/email/email.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/email/email.component.ts new file mode 100644 index 000000000..4a006e165 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/email/email.component.ts @@ -0,0 +1,134 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { + FormsModule, + ReactiveFormsModule, + UntypedFormGroup, +} from '@angular/forms' +import { TuiDialogService } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' +import { TuiInputModule } from '@taiga-ui/kit' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { InputSpec } from '@start9labs/start-sdk/lib/config/configTypes' +import { customSmtp } from '@start9labs/start-sdk/lib/config/configConstants' +import { PatchDB } from 'patch-db-client' +import { switchMap } from 'rxjs' +import { FormModule } from 'src/app/common/form/form.module' +import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { FormService } from 'src/app/services/form.service' +import { EmailInfoComponent } from './info.component' + +@Component({ + template: ` + + +
    +

    SMTP Credentials

    + +
    + +
    +
    +
    +

    Test Email

    + + Firstname Lastname <email@example.com> + + +
    + +
    +
    +
    + `, + styles: ['form { margin: auto; max-width: 30rem; }'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + FormModule, + TuiButtonModule, + TuiInputModule, + EmailInfoComponent, + ], +}) +export class SettingsEmailComponent { + private readonly dialogs = inject(TuiDialogService) + private readonly loader = inject(LoadingService) + private readonly errorService = inject(ErrorService) + private readonly formService = inject(FormService) + private readonly patch = inject(PatchDB) + private readonly api = inject(ApiService) + + testAddress = '' + readonly spec: Promise = configBuilderToSpec(customSmtp) + readonly form$ = this.patch + .watch$('server-info', 'smtp') + .pipe( + switchMap(async value => + this.formService.createForm(await this.spec, value), + ), + ) + + async save(value: unknown): Promise { + const loader = this.loader.open('Saving...').subscribe() + + try { + await this.api.configureEmail(customSmtp.validator.unsafeCast(value)) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } + + async sendTestEmail(form: UntypedFormGroup) { + const loader = this.loader.open('Sending...').subscribe() + + try { + await this.api.testEmail({ + to: this.testAddress, + ...form.value, + }) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + + this.dialogs + .open( + `A test email has been sent to ${this.testAddress}.

    Check your spam folder and mark as not spam`, + { + label: 'Success', + size: 's', + }, + ) + .subscribe() + } +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/email/info.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/email/info.component.ts new file mode 100644 index 000000000..f38e883fc --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/email/info.component.ts @@ -0,0 +1,23 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core' +import { TuiNotificationModule } from '@taiga-ui/core' + +@Component({ + selector: 'email-info', + template: ` + + Adding SMTP credentials to StartOS enables StartOS and some services to + send you emails. + + View instructions + + + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [TuiNotificationModule], +}) +export class EmailInfoComponent {} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/experimental/experimental.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/experimental/experimental.component.ts new file mode 100644 index 000000000..e70b1b875 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/experimental/experimental.component.ts @@ -0,0 +1,142 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + inject, + TemplateRef, +} from '@angular/core' +import { FormsModule } from '@angular/forms' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { TuiAlertService, TuiDialogService } from '@taiga-ui/core' +import { TuiIconModule, TuiTitleModule } from '@taiga-ui/experimental' +import { TUI_PROMPT, TuiCheckboxLabeledModule } from '@taiga-ui/kit' +import { PatchDB } from 'patch-db-client' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { ConfigService } from 'src/app/services/config.service' +import { filter } from 'rxjs' +import { ApiService } from 'src/app/services/api/embassy-api.service' + +@Component({ + template: ` + + + + + + +

    + You are currently connected over Tor. If you reset the Tor daemon, you + will lose connectivity until it comes back online. +

    +

    Reset Tor?

    +

    + Optionally wipe state to forcibly acquire new guard nodes. It is + recommended to try without wiping state first. +

    + + Wipe state + +
    + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + FormsModule, + TuiTitleModule, + TuiIconModule, + TuiCheckboxLabeledModule, + ], +}) +export class SettingsExperimentalComponent { + private readonly loader = inject(LoadingService) + private readonly errorService = inject(ErrorService) + private readonly api = inject(ApiService) + private readonly dialogs = inject(TuiDialogService) + private readonly alerts = inject(TuiAlertService) + + readonly server$ = inject(PatchDB).watch$('server-info') + readonly isTor = inject(ConfigService).isTor() + + wipe = false + + reset(content: TemplateRef) { + this.wipe = false + this.dialogs + .open(TUI_PROMPT, { + label: this.isTor ? 'Warning' : 'Confirm', + data: { + content, + yes: 'Reset', + no: 'Cancel', + }, + }) + .pipe(filter(Boolean)) + .subscribe(() => this.resetTor(this.wipe)) + } + + zram(enabled: boolean) { + this.dialogs + .open(TUI_PROMPT, { + label: 'Confirm', + data: { + content: enabled + ? 'Are you sure you want to disable zram? It provides significant performance benefits on low RAM devices.' + : 'Enable zram? It will only make a difference on lower RAM devices.', + yes: enabled ? 'Disable' : 'Enable', + no: 'Cancel', + }, + }) + .pipe(filter(Boolean)) + .subscribe(() => this.toggleZram(enabled)) + } + + private async toggleZram(enabled: boolean) { + const loader = this.loader + .open(enabled ? 'Disabling zram...' : 'Enabling zram...') + .subscribe() + + try { + await this.api.toggleZram({ enable: !enabled }) + this.alerts.open(`Zram ${enabled ? 'disabled' : 'enabled'}`).subscribe() + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } + + private async resetTor(wipeState: boolean) { + const loader = this.loader.open('Resetting Tor...').subscribe() + + try { + await this.api.resetTor({ + 'wipe-state': wipeState, + reason: 'User triggered', + }) + this.alerts.open('Tor reset in progress').subscribe() + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/interfaces/interfaces.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/interfaces/interfaces.component.ts new file mode 100644 index 000000000..e2595a4d1 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/interfaces/interfaces.component.ts @@ -0,0 +1,22 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { PatchDB } from 'patch-db-client' +import { InterfaceAddressesComponentModule } from 'src/app/common/interface-addresses/interface-addresses.module' +import { DataModel } from 'src/app/services/patch-db/data-model' + +@Component({ + template: ` + + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, InterfaceAddressesComponentModule], +}) +export class SettingsInterfacesComponent { + readonly ui$ = inject(PatchDB).watch$('server-info', 'ui') +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/constants.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/constants.ts new file mode 100644 index 000000000..c2149c963 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/constants.ts @@ -0,0 +1,34 @@ +import { Config } from '@start9labs/start-sdk/lib/config/builder/config' +import { Value } from '@start9labs/start-sdk/lib/config/builder/value' +import { TuiDialogOptions } from '@taiga-ui/core' +import { TuiPromptData } from '@taiga-ui/kit' + +export const DELETE_OPTIONS: Partial> = { + label: 'Confirm', + size: 's', + data: { + content: 'Delete proxy? This action cannot be undone.', + yes: 'Delete', + no: 'Cancel', + }, +} + +export const wireguardSpec = Config.of({ + name: Value.text({ + name: 'Name', + description: 'A friendly name to help you remember and identify this proxy', + required: { default: null }, + }), + config: Value.file({ + name: 'Wiregaurd Config', + required: { default: null }, + extensions: ['.conf'], + }), +}) + +export type WireguardSpec = typeof wireguardSpec.validator._TYPE +export type ProxyUpdate = Partial<{ + name: string + primaryInbound: true + primaryOutbound: true +}> diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/info.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/info.component.ts new file mode 100644 index 000000000..36c181f30 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/info.component.ts @@ -0,0 +1,40 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core' +import { TuiNotificationModule } from '@taiga-ui/core' + +@Component({ + selector: 'proxies-info', + template: ` + + Currently, StartOS only supports Wireguard proxies, which can be used for: +
      +
    1. + Proxying + outbound + traffic to mask your home/business IP from other servers accessed by + your server/services +
    2. +
    3. + Proxying + inbound + traffic to mask your home/business IP from anyone accessing your + server/services over clearnet +
    4. +
    5. + Creating a Virtual Local Area Network (VLAN) to enable private, remote + VPN access to your server/services +
    6. +
    + + View instructions + +
    + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [TuiNotificationModule], +}) +export class ProxiesInfoComponent {} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/menu.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/menu.component.ts new file mode 100644 index 000000000..66f7b2474 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/menu.component.ts @@ -0,0 +1,137 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + inject, + Input, +} from '@angular/core' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { Value } from '@start9labs/start-sdk/lib/config/builder/value' +import { TuiButtonModule } from '@taiga-ui/experimental' +import { + TuiDataListModule, + TuiDialogOptions, + TuiDialogService, + TuiDropdownModule, + TuiHostedDropdownModule, +} from '@taiga-ui/core' +import { TUI_PROMPT } from '@taiga-ui/kit' +import { filter } from 'rxjs' +import { Proxy } from 'src/app/services/patch-db/data-model' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { FormContext, FormPage } from 'src/app/apps/ui/modals/form/form.page' +import { FormDialogService } from 'src/app/services/form-dialog.service' +import { DELETE_OPTIONS, ProxyUpdate } from './constants' + +@Component({ + selector: 'proxies-menu', + template: ` + + + + + + + + + + + + + + `, + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + CommonModule, + TuiButtonModule, + TuiDataListModule, + TuiDropdownModule, + TuiHostedDropdownModule, + ], +}) +export class ProxiesMenuComponent { + private readonly dialogs = inject(TuiDialogService) + private readonly loader = inject(LoadingService) + private readonly errorService = inject(ErrorService) + private readonly api = inject(ApiService) + private readonly formDialog = inject(FormDialogService) + + @Input({ required: true }) proxy!: Proxy + + delete() { + this.dialogs + .open(TUI_PROMPT, DELETE_OPTIONS) + .pipe(filter(Boolean)) + .subscribe(async () => { + const loader = this.loader.open('Deleting...').subscribe() + + try { + await this.api.deleteProxy({ id: this.proxy.id }) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + }) + } + + async update(value: ProxyUpdate): Promise { + const loader = this.loader.open('Saving...').subscribe() + + try { + await this.api.updateProxy(value) + return true + } catch (e: any) { + this.errorService.handleError(e) + return false + } finally { + loader.unsubscribe() + } + } + + async rename() { + const spec = { name: 'Name', required: { default: this.proxy.name } } + const name = await Value.text(spec).build({} as any) + const options: Partial>> = { + label: `Rename ${this.proxy.name}`, + data: { + spec: { name }, + buttons: [ + { + text: 'Save', + handler: value => this.update(value), + }, + ], + }, + } + + this.formDialog.open(FormPage, options) + } +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/proxies.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/proxies.component.ts new file mode 100644 index 000000000..6ca2f6595 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/proxies.component.ts @@ -0,0 +1,77 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { TuiDialogOptions, TuiDialogService } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' +import { PatchDB } from 'patch-db-client' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { FormContext, FormPage } from 'src/app/apps/ui/modals/form/form.page' +import { FormDialogService } from 'src/app/services/form-dialog.service' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { ProxiesTableComponent } from './table.component' +import { ProxiesInfoComponent } from './info.component' +import { wireguardSpec, WireguardSpec } from './constants' + +@Component({ + template: ` + +

    + Proxies + +

    +
    + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + TuiButtonModule, + ProxiesInfoComponent, + ProxiesTableComponent, + ], +}) +export class SettingsProxiesComponent { + private readonly loader = inject(LoadingService) + private readonly errorService = inject(ErrorService) + private readonly api = inject(ApiService) + private readonly formDialog = inject(FormDialogService) + + readonly proxies$ = inject(PatchDB).watch$( + 'server-info', + 'network', + 'proxies', + ) + + async add() { + const options: Partial>> = { + label: 'Add Proxy', + data: { + spec: await wireguardSpec.build({} as any), + buttons: [ + { + text: 'Save', + handler: value => this.save(value).then(() => true), + }, + ], + }, + } + + this.formDialog.open(FormPage, options) + } + + private async save({ name, config }: WireguardSpec): Promise { + const loader = this.loader.open('Saving...').subscribe() + + try { + await this.api.addProxy({ name, config: config?.filePath || '' }) + return true + } catch (e: any) { + this.errorService.handleError(e) + return false + } finally { + loader.unsubscribe() + } + } +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/table.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/table.component.ts new file mode 100644 index 000000000..de31f515e --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/table.component.ts @@ -0,0 +1,98 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + EventEmitter, + inject, + Input, + Output, +} from '@angular/core' +import { TuiDialogService, TuiLinkModule } from '@taiga-ui/core' +import { TuiBadgeModule, TuiButtonModule } from '@taiga-ui/experimental' +import { Proxy } from 'src/app/services/patch-db/data-model' +import { ProxiesMenuComponent } from './menu.component' + +@Component({ + selector: 'table[proxies]', + template: ` + + + Name + Created + Type + Primary + Used By + + + + + + {{ proxy.name }} + {{ proxy.createdAt | date : 'short' }} + {{ proxy.type }} + + + Inbound + + + Outbound + + + + + N/A + + + + + `, + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + CommonModule, + TuiButtonModule, + TuiBadgeModule, + TuiLinkModule, + ProxiesMenuComponent, + ], +}) +export class ProxiesTableComponent { + private readonly dialogs = inject(TuiDialogService) + + @Input() + proxies: readonly Proxy[] = [] + + @Output() + readonly delete = new EventEmitter() + + getLength({ usedBy }: Proxy) { + return usedBy.domains.length + usedBy.services.length + } + + onUsedBy({ name, usedBy }: Proxy) { + let message = `Proxy "${name}" is currently used by:` + const domains = usedBy.domains.map(d => `
  • ${d}
  • `) + const services = usedBy.services.map(s => `
  • ${s.title}
  • `) + + if (usedBy.domains.length) { + message = `${message}

    Domains (inbound)

      ${domains}
    ` + } + + if (usedBy.services.length) { + message = `${message}

    Services (outbound)

    ${services}` + } + + this.dialogs.open(message, { label: 'Used by', size: 's' }).subscribe() + } +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/router/info.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/router/info.component.ts new file mode 100644 index 000000000..de821d556 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/router/info.component.ts @@ -0,0 +1,53 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core' +import { TuiNotificationModule } from '@taiga-ui/core' +import { CommonModule } from '@angular/common' + +@Component({ + selector: 'router-info', + template: ` + + + UPnP Enabled! +

    + The ports below have been + automatically + forwarded in your router. +

    + If you are running multiple servers, you may want to override specific + ports to suite your needs. + + View instructions + +
    + + UPnP Disabled +

    + Below are a list of ports that must be + manually + forwarded in your router in order to enable clearnet access. +

    + Alternatively, you can enable UPnP in your router for automatic + configuration. + + View instructions + +
    +
    + `, + styles: ['strong { font-size: 1rem }'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, TuiNotificationModule], +}) +export class RouterInfoComponent { + @Input() + enabled = false +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/router/router.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/router/router.component.ts new file mode 100644 index 000000000..0fe99fe61 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/router/router.component.ts @@ -0,0 +1,69 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { TuiTextfieldControllerModule } from '@taiga-ui/core' +import { PatchDB } from 'patch-db-client' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { PrimaryIpPipeModule } from 'src/app/common/primary-ip/primary-ip.module' +import { RouterInfoComponent } from './info.component' +import { RouterPortComponent } from './table.component' + +@Component({ + template: ` + + + + + + + + + + + + + + +
    +
    Port
    +
    +
    Target
    +
    +
    + `, + changeDetection: ChangeDetectionStrategy.OnPush, + styles: [ + ` + table { + width: 100%; + min-width: 30rem; + max-width: 40rem; + table-layout: fixed; + background: var(--tui-base-02); + border-radius: 0.75rem; + font-size: 1rem; + margin: 2rem 0; + box-shadow: 0 1rem var(--tui-base-02); + } + `, + ], + standalone: true, + imports: [ + CommonModule, + PrimaryIpPipeModule, + RouterInfoComponent, + RouterPortComponent, + TuiTextfieldControllerModule, + ], +}) +export class SettingsRouterComponent { + readonly server$ = inject(PatchDB).watch$('server-info') +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/router/table.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/router/table.component.ts new file mode 100644 index 000000000..b7934b8de --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/router/table.component.ts @@ -0,0 +1,139 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + inject, + Input, + OnChanges, + SimpleChanges, +} from '@angular/core' +import { FormsModule } from '@angular/forms' +import { CopyService, ErrorService, LoadingService } from '@start9labs/shared' +import { TuiTextfieldControllerModule } from '@taiga-ui/core' +import { TuiButtonModule, TuiIconModule } from '@taiga-ui/experimental' +import { TuiInputModule, TuiInputNumberModule } from '@taiga-ui/kit' +import { PortForward } from 'src/app/services/patch-db/data-model' +import { ApiService } from 'src/app/services/api/embassy-api.service' + +@Component({ + selector: 'tr[portForward]', + template: ` + + + + + + + + + + + + + + + + + + + {{ ip }}:{{ portForward.target }} + + + + `, + styles: ['button { pointer-events: auto }'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + FormsModule, + TuiIconModule, + TuiInputModule, + TuiButtonModule, + TuiInputNumberModule, + TuiTextfieldControllerModule, + ], +}) +export class RouterPortComponent implements OnChanges { + private readonly loader = inject(LoadingService) + private readonly errorService = inject(ErrorService) + private readonly api = inject(ApiService) + readonly copyService = inject(CopyService) + + @Input({ required: true }) + portForward!: PortForward + + @Input() + ip = '' + + value = NaN + editing = false + + ngOnChanges() { + this.value = this.portForward.override || this.portForward.assigned + } + + toggle(editing: boolean) { + this.editing = editing + this.value = this.portForward.override || this.portForward.assigned + } + + async save() { + const loader = this.loader.open('Saving...').subscribe() + const { target } = this.portForward + + try { + await this.api.overridePortForward({ target, port: this.value }) + this.portForward.override = this.value + this.editing = false + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/sessions/platform-info.pipe.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/sessions/platform-info.pipe.ts new file mode 100644 index 000000000..da11bf2f7 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/sessions/platform-info.pipe.ts @@ -0,0 +1,38 @@ +import { Pipe, PipeTransform } from '@angular/core' +import { PlatformType } from 'src/app/services/api/api.types' + +@Pipe({ + name: 'platformInfo', + standalone: true, +}) +export class PlatformInfoPipe implements PipeTransform { + transform(platforms: readonly PlatformType[]): { + name: string + icon: string + } { + const info = { + name: '', + icon: 'tuiIconSmartphone', + } + + if (platforms.includes('cli')) { + info.name = 'CLI' + info.icon = 'tuiIconTerminal' + } else if (platforms.includes('desktop')) { + info.name = 'Desktop/Laptop' + info.icon = 'tuiIconMonitor' + } else if (platforms.includes('android')) { + info.name = 'Android Device' + } else if (platforms.includes('iphone')) { + info.name = 'iPhone' + } else if (platforms.includes('ipad')) { + info.name = 'iPad' + } else if (platforms.includes('ios')) { + info.name = 'iOS Device' + } else { + info.name = 'Unknown Device' + } + + return info + } +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/sessions/sessions.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/sessions/sessions.component.ts new file mode 100644 index 000000000..33b2507e7 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/sessions/sessions.component.ts @@ -0,0 +1,90 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { TuiButtonModule } from '@taiga-ui/experimental' +import { from, map, merge, Observable, Subject } from 'rxjs' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { Session } from 'src/app/services/api/api.types' +import { SSHTableComponent } from './table.component' +import { TuiLetModule } from '@taiga-ui/cdk' + +@Component({ + template: ` +

    Current session

    +
    + + +

    + Other sessions + +

    +
    +
    + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, TuiButtonModule, SSHTableComponent, TuiLetModule], +}) +export class SettingsSessionsComponent { + private readonly loader = inject(LoadingService) + private readonly errorService = inject(ErrorService) + private readonly api = inject(ApiService) + private readonly sessions$ = from(this.api.getSessions({})) + private readonly local$ = new Subject() + + readonly current$ = this.sessions$.pipe(map(s => [s.sessions[s.current]])) + readonly other$: Observable = merge( + this.local$, + this.sessions$.pipe( + map(s => + Object.entries(s.sessions) + .filter(([id, _]) => id !== s.current) + .map(([id, session]) => ({ + id, + ...session, + })) + .sort( + (a, b) => + new Date(b['last-active']).valueOf() - + new Date(a['last-active']).valueOf(), + ), + ), + ), + ) + + async terminate( + sessions: readonly SessionWithId[], + all: readonly SessionWithId[], + ) { + const ids = sessions.map(s => s.id) + const loader = this.loader + .open(`Terminating session${ids.length > 1 ? 's' : ''}...`) + .subscribe() + + try { + await this.api.killSessions({ ids }) + this.local$.next(all.filter(s => !ids.includes(s.id))) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } +} + +interface SessionWithId extends Session { + id: string +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/sessions/table.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/sessions/table.component.ts new file mode 100644 index 000000000..97491217e --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/sessions/table.component.ts @@ -0,0 +1,130 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + Input, + OnChanges, +} from '@angular/core' +import { TuiLinkModule } from '@taiga-ui/core' +import { + TuiButtonModule, + TuiCheckboxModule, + TuiIconModule, +} from '@taiga-ui/experimental' +import { BehaviorSubject } from 'rxjs' +import { TuiForModule } from '@taiga-ui/cdk' +import { Session } from 'src/app/services/api/api.types' +import { PlatformInfoPipe } from './platform-info.pipe' +import { FormsModule } from '@angular/forms' + +@Component({ + selector: 'table[sessions]', + template: ` + + + + + User Agent + + Platform + Last Active + + + + + + + {{ session['user-agent'] }} + + + + {{ info.name }} + + {{ session['last-active'] }} + + + + +
    Loading
    + + +
    + + `, + styles: [ + ` + input { + position: absolute; + top: 50%; + left: 0.5rem; + transform: translateY(-50%); + } + `, + ], + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + CommonModule, + TuiForModule, + TuiButtonModule, + TuiLinkModule, + PlatformInfoPipe, + TuiIconModule, + TuiCheckboxModule, + FormsModule, + ], +}) +export class SSHTableComponent implements OnChanges { + readonly selected$ = new BehaviorSubject([]) + + @Input() + sessions: readonly T[] | null = null + + @Input() + single = false + + get all(): boolean | null { + if (!this.sessions?.length || !this.selected$.value.length) { + return false + } + + if (this.sessions?.length === this.selected$.value.length) { + return true + } + + return null + } + + ngOnChanges() { + this.selected$.next([]) + } + + onAll(selected: boolean) { + this.selected$.next((selected && this.sessions) || []) + } + + onToggle(session: T) { + const selected = this.selected$.value + + if (selected.includes(session)) { + this.selected$.next(selected.filter(s => s !== session)) + } else { + this.selected$.next([...selected, session]) + } + } +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/ssh/info.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/ssh/info.component.ts new file mode 100644 index 000000000..c5544b1ff --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/ssh/info.component.ts @@ -0,0 +1,23 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core' +import { TuiNotificationModule } from '@taiga-ui/core' + +@Component({ + selector: 'ssh-info', + template: ` + + Adding domains to StartOS enables you to access your server and service + interfaces over clearnet. + + View instructions + + + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [TuiNotificationModule], +}) +export class SSHInfoComponent {} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/ssh/ssh.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/ssh/ssh.component.ts new file mode 100644 index 000000000..a191ac4eb --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/ssh/ssh.component.ts @@ -0,0 +1,41 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { ErrorService } from '@start9labs/shared' +import { TuiButtonModule } from '@taiga-ui/experimental' +import { catchError, defer, of } from 'rxjs' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { SSHInfoComponent } from './info.component' +import { SSHTableComponent } from './table.component' + +@Component({ + template: ` + +

    + Saved Keys + +

    +
    + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, TuiButtonModule, SSHTableComponent, SSHInfoComponent], +}) +export class SettingsSSHComponent { + private readonly errorService = inject(ErrorService) + private readonly api = inject(ApiService) + + readonly keys$ = defer(() => this.api.getSshKeys({})).pipe( + catchError(e => { + this.errorService.handleError(e) + + return of([]) + }), + ) +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/ssh/table.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/ssh/table.component.ts new file mode 100644 index 000000000..e9195ccb6 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/ssh/table.component.ts @@ -0,0 +1,127 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + inject, + Input, +} from '@angular/core' +import { + TuiDialogOptions, + TuiDialogService, + TuiLinkModule, +} from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' +import { SSHKey } from 'src/app/services/api/api.types' +import { PROMPT } from '../../../../../../ui/modals/prompt/prompt.component' +import { filter, take } from 'rxjs' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { ApiService } from '../../../../../../../services/api/embassy-api.service' +import { TUI_PROMPT, TuiPromptData } from '@taiga-ui/kit' +import { TuiForModule } from '@taiga-ui/cdk' + +@Component({ + selector: 'table[keys]', + template: ` + + + Hostname + Created At + Algorithm + Fingerprint + + + + + + {{ key.hostname }} + {{ key['created-at'] | date : 'medium' }} + {{ key.alg }} + {{ key.fingerprint }} + + + + + + +
    Loading
    + +
    + + `, + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [CommonModule, TuiForModule, TuiButtonModule, TuiLinkModule], +}) +export class SSHTableComponent { + private readonly loader = inject(LoadingService) + private readonly errorService = inject(ErrorService) + private readonly api = inject(ApiService) + private readonly dialogs = inject(TuiDialogService) + private readonly cdr = inject(ChangeDetectorRef) + + @Input() + keys: SSHKey[] | null = null + + add() { + this.dialogs + .open(PROMPT, ADD_OPTIONS) + .pipe(take(1)) + .subscribe(async key => { + const loader = this.loader.open('Saving...').subscribe() + + try { + this.keys?.push(await this.api.addSshKey({ key })) + } finally { + loader.unsubscribe() + this.cdr.markForCheck() + } + }) + } + + delete(key: SSHKey) { + this.dialogs + .open(TUI_PROMPT, DELETE_OPTIONS) + .pipe(filter(Boolean)) + .subscribe(async () => { + const loader = this.loader.open('Deleting...').subscribe() + + try { + await this.api.deleteSshKey({ fingerprint: key.fingerprint }) + this.keys?.splice(this.keys?.indexOf(key), 1) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + this.cdr.markForCheck() + } + }) + } +} + +const ADD_OPTIONS: Partial> = { + label: 'SSH Key', + data: { + message: + 'Enter the SSH public key you would like to authorize for root access to your Embassy.', + }, +} + +const DELETE_OPTIONS: Partial> = { + label: 'Confirm', + size: 's', + data: { + content: 'Delete key? This action cannot be undone.', + yes: 'Delete', + no: 'Cancel', + }, +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/info.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/info.component.ts new file mode 100644 index 000000000..99cc01289 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/info.component.ts @@ -0,0 +1,24 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core' +import { TuiNotificationModule } from '@taiga-ui/core' + +@Component({ + selector: 'wifi-info', + template: ` + + Adding WiFi credentials to StartOS allows you to remove the Ethernet cable + and move the device anywhere you want. StartOS will automatically connect + to available networks. + + View instructions + + + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [TuiNotificationModule], +}) +export class WifiInfoComponent {} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/table.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/table.component.ts new file mode 100644 index 000000000..8e9e0cd16 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/table.component.ts @@ -0,0 +1,148 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + inject, + Input, +} from '@angular/core' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { TuiDialogOptions } from '@taiga-ui/core' +import { + TuiBadgeModule, + TuiButtonModule, + TuiCellModule, + TuiIconModule, + TuiTitleModule, +} from '@taiga-ui/experimental' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { FormDialogService } from 'src/app/services/form-dialog.service' +import { FormContext, FormPage } from 'src/app/apps/ui/modals/form/form.page' +import { Wifi, WiFiForm, wifiSpec } from './utils' +import { SettingsWifiComponent } from './wifi.component' + +@Component({ + selector: '[wifi]', + template: ` + +
    +
    + + {{ network.ssid }} + + Connected + + +
    + + + + + + Signal Strength: {{ network.strength }} +
    +
    + `, + host: { style: 'align-items: stretch' }, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + TuiCellModule, + TuiTitleModule, + TuiBadgeModule, + TuiButtonModule, + TuiIconModule, + ], +}) +export class WifiTableComponent { + private readonly loader = inject(LoadingService) + private readonly errorService = inject(ErrorService) + private readonly api = inject(ApiService) + private readonly formDialog = inject(FormDialogService) + private readonly component = inject(SettingsWifiComponent) + private readonly cdr = inject(ChangeDetectorRef) + + @Input() + wifi: readonly Wifi[] = [] + + getSignal(signal: number): string { + if (signal < 5) { + return 'assets/img/icons/wifi-0.png' + } + + if (signal >= 5 && signal < 50) { + return 'assets/img/icons/wifi-1.png' + } + + if (signal >= 50 && signal < 90) { + return 'assets/img/icons/wifi-2.png' + } + + return 'assets/img/icons/wifi-3.png' + } + + async forget({ ssid }: Wifi): Promise { + const loader = this.loader.open('Deleting...').subscribe() + + try { + await this.api.deleteWifi({ ssid }) + this.wifi = this.wifi.filter(network => network.ssid !== ssid) + this.cdr.markForCheck() + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } + + async prompt(network: Wifi): Promise { + if (!network.security.length) { + await this.component.saveAndConnect(network.ssid) + } else { + const options: Partial>> = { + label: 'Password Needed', + data: { + spec: wifiSpec.spec, + buttons: [ + { + text: 'Connect', + handler: async ({ ssid, password }) => + this.component.saveAndConnect(ssid, password), + }, + ], + }, + } + + this.formDialog.open(FormPage, options) + } + } +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/utils.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/utils.ts new file mode 100644 index 000000000..81c7e1f24 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/utils.ts @@ -0,0 +1,78 @@ +import { ValueSpecObject } from '@start9labs/start-sdk/lib/config/configTypes' +import { AvailableWifi } from 'src/app/services/api/api.types' +import { RR } from 'src/app/services/api/api.types' + +export interface WiFiForm { + ssid: string + password: string +} + +export interface Wifi extends AvailableWifi { + readonly connected?: boolean +} + +export interface WifiData { + known: readonly Wifi[] + available: readonly Wifi[] +} + +export function parseWifi(res: RR.GetWifiRes): WifiData { + return { + available: res['available-wifi'], + known: Object.entries(res.ssids).map(([ssid, strength]) => ({ + ssid, + strength, + security: [], + connected: ssid === res.connected, + })), + } +} + +export const wifiSpec: ValueSpecObject = { + type: 'object', + name: 'WiFi Credentials', + description: + 'Enter the network SSID and password. You can connect now or save the network for later.', + warning: null, + spec: { + ssid: { + type: 'text', + minLength: null, + maxLength: null, + patterns: [], + name: 'Network SSID', + description: null, + inputmode: 'text', + placeholder: null, + required: true, + masked: false, + default: null, + warning: null, + disabled: false, + immutable: false, + generate: null, + }, + password: { + type: 'text', + minLength: null, + maxLength: null, + patterns: [ + { + regex: '^.{8,}$', + description: 'Must be longer than 8 characters', + }, + ], + name: 'Password', + description: null, + inputmode: 'text', + placeholder: null, + required: true, + masked: true, + default: null, + warning: null, + disabled: false, + immutable: false, + generate: null, + }, + }, +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/wifi.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/wifi.component.ts new file mode 100644 index 000000000..53c7ee378 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/wifi.component.ts @@ -0,0 +1,254 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + inject, +} from '@angular/core' +import { FormsModule } from '@angular/forms' +import { + ErrorService, + LoadingService, + pauseFor, + SharedPipesModule, +} from '@start9labs/shared' +import { TuiLetModule } from '@taiga-ui/cdk' +import { + TuiAlertService, + TuiDialogOptions, + TuiLoaderModule, +} from '@taiga-ui/core' +import { + TuiButtonModule, + TuiCardModule, + TuiToggleModule, +} from '@taiga-ui/experimental' +import { PatchDB } from 'patch-db-client' +import { catchError, defer, merge, Observable, of, Subject, map } from 'rxjs' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { WifiInfoComponent } from './info.component' +import { WifiTableComponent } from './table.component' +import { parseWifi, WifiData, WiFiForm } from './utils' +import { RR } from '../../../../../../../services/api/api.types' +import { + FormContext, + FormPage, +} from '../../../../../../ui/modals/form/form.page' +import { wifiSpec } from '../../../../../../ui/pages/system/wifi/wifi.const' +import { FormDialogService } from '../../../../../../../services/form-dialog.service' + +@Component({ + template: ` + + +

    + Wi-Fi + +

    + + + + +

    Known Networks

    +
    +
    + +

    Other Networks

    +
    +
    +

    + +

    +
    + +
    +
    + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + FormsModule, + TuiButtonModule, + TuiToggleModule, + TuiLetModule, + TuiCardModule, + TuiLoaderModule, + SharedPipesModule, + WifiInfoComponent, + WifiTableComponent, + ], +}) +export class SettingsWifiComponent { + private readonly loader = inject(LoadingService) + private readonly errorService = inject(ErrorService) + private readonly api = inject(ApiService) + private readonly alerts = inject(TuiAlertService) + private readonly update$ = new Subject() + private readonly formDialog = inject(FormDialogService) + private readonly cdr = inject(ChangeDetectorRef) + + readonly wifi$ = merge(this.getWifi$(), this.update$) + readonly enabled$ = inject(PatchDB).watch$( + 'server-info', + 'network', + 'wifi', + 'enabled', + ) + + async onToggle(enable: boolean) { + const loader = this.loader + .open(enable ? 'Enabling Wifi' : 'Disabling WiFi') + .subscribe() + + try { + await this.api.enableWifi({ enable }) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } + + other(wifi: WifiData) { + const options: Partial>> = { + label: wifiSpec.name, + data: { + spec: wifiSpec.spec, + buttons: [ + { + text: 'Save for Later', + handler: async ({ ssid, password }) => + this.save(ssid, password, wifi), + }, + { + text: 'Save and Connect', + handler: async ({ ssid, password }) => + this.saveAndConnect(ssid, password), + }, + ], + }, + } + + this.formDialog.open(FormPage, options) + } + + async saveAndConnect(ssid: string, password?: string): Promise { + const loader = this.loader + .open('Connecting. This could take a while...') + .subscribe() + + try { + if (password) { + await this.api.addWifi({ + ssid, + password, + priority: 0, + connect: true, + }) + } else { + await this.api.connectWifi({ ssid }) + } + + await this.confirmWifi(ssid) + return true + } catch (e: any) { + this.errorService.handleError(e) + return false + } finally { + loader.unsubscribe() + } + } + + private async confirmWifi(ssid: string): Promise { + const maxAttempts = 5 + let attempts = 0 + + while (true) { + if (attempts > maxAttempts) { + this.alerts + .open('Check credentials and try again', { + label: 'Failed to connect', + status: 'warning', + }) + .subscribe() + break + } + + try { + const start = new Date().valueOf() + const newWifi = await this.api.getWifi({}, 10000) + const end = new Date().valueOf() + if (newWifi.connected === ssid) { + this.update$.next(parseWifi(newWifi)) + this.alerts + .open('Connection successful!', { status: 'success' }) + .subscribe() + break + } else { + attempts++ + const diff = end - start + // depending on the response time, wait a min of 1000 ms, and a max of 4000 ms in between retries. Both 1000 and 4000 are arbitrary + await pauseFor(Math.max(1000, 4000 - diff)) + } + } catch (e) { + attempts++ + console.warn(e) + } + } + } + + private getWifi$(): Observable { + return defer(() => this.api.getWifi({}, 10000)).pipe( + map(res => parseWifi(res)), + catchError((e: any) => { + this.errorService.handleError(e) + return of({ known: [], available: [] }) + }), + ) + } + + private async save( + ssid: string, + password: string, + wifi: WifiData, + ): Promise { + const loader = this.loader.open('Saving...').subscribe() + + try { + await this.api.addWifi({ + ssid, + password, + priority: 0, + connect: false, + }) + wifi.known = wifi.known.concat({ + ssid, + strength: 0, + security: [], + connected: false, + }) + this.cdr.markForCheck() + + return true + } catch (e: any) { + this.errorService.handleError(e) + return false + } finally { + loader.unsubscribe() + } + } +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.component.ts new file mode 100644 index 000000000..0a696d1df --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.component.ts @@ -0,0 +1,59 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core' +import { RouterModule } from '@angular/router' +import { TuiIconModule } from '@taiga-ui/experimental' +import { SettingsMenuComponent } from './components/menu.component' + +@Component({ + template: ` + + + Settings + + + + `, + styles: [ + ` + :host { + ::ng-deep tui-notification { + position: sticky; + left: 0; + } + } + + a { + position: sticky; + left: 0; + display: inline-flex; + align-items: center; + gap: 0.5rem; + margin: 1rem 0; + font-size: 1rem; + color: var(--tui-text-01); + } + + ._current { + display: none; + } + + .page { + display: none; + } + + ._current + .page { + display: flex; + max-width: 45rem; + margin: 0 auto; + } + `, + ], + host: { class: 'g-page' }, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [RouterModule, TuiIconModule, SettingsMenuComponent], +}) +export class SettingsComponent {} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.routes.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.routes.ts new file mode 100644 index 000000000..cdab4fd56 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.routes.ts @@ -0,0 +1,75 @@ +import { Routes } from '@angular/router' + +import { SettingsComponent } from './settings.component' + +export const SETTINGS_ROUTES: Routes = [ + { + path: '', + component: SettingsComponent, + children: [ + { + path: 'email', + loadComponent: () => + import('./routes/email/email.component').then( + m => m.SettingsEmailComponent, + ), + }, + { + path: 'experimental', + loadComponent: () => + import('./routes/experimental/experimental.component').then( + m => m.SettingsExperimentalComponent, + ), + }, + { + path: 'domains', + loadComponent: () => + import('./routes/domains/domains.component').then( + m => m.SettingsDomainsComponent, + ), + }, + { + path: 'proxies', + loadComponent: () => + import('./routes/proxies/proxies.component').then( + m => m.SettingsProxiesComponent, + ), + }, + { + path: 'router', + loadComponent: () => + import('./routes/router/router.component').then( + m => m.SettingsRouterComponent, + ), + }, + { + path: 'wifi', + loadComponent: () => + import('./routes/wifi/wifi.component').then( + m => m.SettingsWifiComponent, + ), + }, + { + path: 'interfaces', + loadComponent: () => + import('./routes/interfaces/interfaces.component').then( + m => m.SettingsInterfacesComponent, + ), + }, + { + path: 'ssh', + loadComponent: () => + import('./routes/ssh/ssh.component').then( + m => m.SettingsSSHComponent, + ), + }, + { + path: 'sessions', + loadComponent: () => + import('./routes/sessions/sessions.component').then( + m => m.SettingsSessionsComponent, + ), + }, + ], + }, +] diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.service.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.service.ts new file mode 100644 index 000000000..a5dc9634c --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.service.ts @@ -0,0 +1,240 @@ +import { inject, Injectable } from '@angular/core' +import { TuiAlertService, TuiDialogService } from '@taiga-ui/core' +import * as argon2 from '@start9labs/argon2' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { TUI_PROMPT } from '@taiga-ui/kit' +import { PatchDB } from 'patch-db-client' +import { filter, from, take } from 'rxjs' +import { switchMap } from 'rxjs/operators' +import { ProxyService } from 'src/app/services/proxy.service' +import { FormPage } from 'src/app/apps/ui/modals/form/form.page' +import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' +import { getServerInfo } from 'src/app/util/get-server-info' +import { FormDialogService } from 'src/app/services/form-dialog.service' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { PROMPT } from 'src/app/apps/ui/modals/prompt/prompt.component' + +import { passwordSpec, PasswordSpec, SettingBtn } from './settings.types' + +@Injectable({ providedIn: 'root' }) +export class SettingsService { + private readonly alerts = inject(TuiAlertService) + private readonly dialogs = inject(TuiDialogService) + private readonly proxyService = inject(ProxyService) + private readonly loader = inject(LoadingService) + private readonly errorService = inject(ErrorService) + private readonly formDialog = inject(FormDialogService) + private readonly patch = inject(PatchDB) + private readonly api = inject(ApiService) + + readonly settings: Record = { + General: [ + { + title: 'Email', + description: + 'Connect to an external SMTP server to send yourself emails', + icon: 'tuiIconMail', + routerLink: 'email', + }, + { + title: 'Change Master Password', + description: `Change your StartOS master password`, + icon: 'tuiIconKey', + action: () => this.promptNewPassword(), + }, + { + title: 'Experimental Features', + description: 'Try out new and potentially unstable new features', + icon: 'tuiIconThermometer', + routerLink: 'experimental', + }, + ], + Network: [ + { + title: 'Domains', + description: 'Manage domains for clearnet connectivity', + icon: 'tuiIconGlobe', + routerLink: 'domains', + }, + { + title: 'Proxies', + description: 'Manage proxies for inbound and outbound connections', + icon: 'tuiIconShuffle', + routerLink: 'proxies', + }, + { + title: 'Router Config', + description: 'Connect or configure your router for clearnet', + icon: 'tuiIconRadio', + routerLink: 'router', + }, + { + title: 'WiFi', + description: 'Add or remove WiFi networks', + icon: 'tuiIconWifi', + routerLink: 'wifi', + }, + ], + 'User Interface': [ + { + title: 'Browser Tab Title', + description: `Customize the display name of your browser tab`, + icon: 'tuiIconTag', + action: () => this.setBrowserTab(), + }, + { + title: 'Web Addresses', + description: 'View and manage web addresses for accessing this UI', + icon: 'tuiIconMonitor', + routerLink: 'interfaces', + }, + ], + 'Privacy and Security': [ + { + title: 'Outbound Proxy', + description: 'Proxy outbound traffic from the StartOS main process', + icon: 'tuiIconShield', + action: () => this.proxyService.presentModalSetOutboundProxy(), + }, + { + title: 'SSH', + description: + 'Manage your SSH keys to access your server from the command line', + icon: 'tuiIconTerminal', + routerLink: 'ssh', + }, + { + title: 'Active Sessions', + description: 'View and manage device access', + icon: 'tuiIconClock', + routerLink: 'sessions', + }, + ], + Support: [ + { + title: 'User Manual', + description: 'Discover what StartOS can do', + icon: 'tuiIconMap', + href: 'https://docs.start9.com/0.3.5.x/user-manual', + }, + { + title: 'Contact Support', + description: 'Get help from the Start9 team and community', + icon: 'tuiIconMessageSquare', + href: 'https://start9.com/contact', + }, + { + title: 'Donate to Start9', + description: `Support StartOS development`, + icon: 'tuiIconDollarSign', + href: 'https://donate.start9.com', + }, + ], + } + + private async setBrowserTab(): Promise { + this.patch + .watch$('ui', 'name') + .pipe( + switchMap(initialValue => + this.dialogs.open(PROMPT, { + label: 'Browser Tab Title', + data: { + message: `This value will be displayed as the title of your browser tab.`, + label: 'Device Name', + placeholder: 'StartOS', + required: false, + buttonText: 'Save', + initialValue, + }, + }), + ), + take(1), + ) + .subscribe(async name => { + const loader = this.loader.open('Saving...').subscribe() + + try { + await this.api.setDbValue(['name'], name || null) + } finally { + loader.unsubscribe() + } + }) + } + + private promptNewPassword() { + this.dialogs + .open(TUI_PROMPT, { + label: 'Warning', + size: 's', + data: { + content: + 'You will still need your current password to decrypt existing backups!', + yes: 'Continue', + no: 'Cancel', + }, + }) + .pipe( + filter(Boolean), + switchMap(() => from(configBuilderToSpec(passwordSpec))), + ) + .subscribe(spec => { + this.formDialog.open(FormPage, { + label: 'Change Master Password', + data: { + spec, + buttons: [ + { + text: 'Save', + handler: (value: PasswordSpec) => this.resetPassword(value), + }, + ], + }, + }) + }) + } + + private async resetPassword(value: PasswordSpec): Promise { + let err = '' + + if (value.newPassword1 !== value.newPassword2) { + err = 'New passwords do not match' + } else if (value.newPassword1.length < 12) { + err = 'New password must be 12 characters or greater' + } else if (value.newPassword1.length > 64) { + err = 'New password must be less than 65 characters' + } + + // confirm current password is correct + const { 'password-hash': passwordHash } = await getServerInfo(this.patch) + try { + argon2.verify(passwordHash, value.currentPassword) + } catch (e) { + err = 'Current password is invalid' + } + + if (err) { + this.errorService.handleError(err) + return false + } + + const loader = this.loader.open('Saving...').subscribe() + + try { + await this.api.resetPassword({ + 'old-password': value.currentPassword, + 'new-password': value.newPassword1, + }) + + this.alerts.open('Password changed!').subscribe() + + return true + } catch (e: any) { + this.errorService.handleError(e) + return false + } finally { + loader.unsubscribe() + } + } +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.types.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.types.ts new file mode 100644 index 000000000..9f3474208 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.types.ts @@ -0,0 +1,37 @@ +import { Config } from '@start9labs/start-sdk/lib/config/builder/config' +import { Value } from '@start9labs/start-sdk/lib/config/builder/value' + +export interface SettingBtn { + title: string + description: string + icon: string + action?: Function + href?: string + routerLink?: string +} + +export const passwordSpec = Config.of({ + currentPassword: Value.text({ + name: 'Current Password', + required: { + default: null, + }, + masked: true, + }), + newPassword1: Value.text({ + name: 'New Password', + required: { + default: null, + }, + masked: true, + }), + newPassword2: Value.text({ + name: 'Retype New Password', + required: { + default: null, + }, + masked: true, + }), +}) + +export type PasswordSpec = typeof passwordSpec.validator._TYPE diff --git a/web/projects/ui/src/app/apps/portal/routes/system/system.module.ts b/web/projects/ui/src/app/apps/portal/routes/system/system.module.ts index c4e74cd71..dc6f224ad 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/system.module.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/system.module.ts @@ -11,6 +11,13 @@ const ROUTES: Routes = [ import('./backups/backups.component').then(m => m.BackupsComponent), data: toNavigationItem('/portal/system/backups'), }, + { + title: systemTabResolver, + path: 'settings', + loadChildren: () => + import('./settings/settings.routes').then(m => m.SETTINGS_ROUTES), + data: toNavigationItem('/portal/system/settings'), + }, { title: systemTabResolver, path: 'notifications', diff --git a/web/projects/ui/src/app/apps/portal/services/routing-strategy.service.ts b/web/projects/ui/src/app/apps/portal/services/routing-strategy.service.ts index 2d0c40e56..aa1778667 100644 --- a/web/projects/ui/src/app/apps/portal/services/routing-strategy.service.ts +++ b/web/projects/ui/src/app/apps/portal/services/routing-strategy.service.ts @@ -22,7 +22,7 @@ export class RoutingStrategyService extends BaseRouteReuseStrategy { if (!store) this.handlers.delete(path) - return store + return store && path.startsWith('/portal/service') } override store( @@ -41,30 +41,14 @@ export class RoutingStrategyService extends BaseRouteReuseStrategy { } override shouldReuseRoute( - future: ActivatedRouteSnapshot, - curr: ActivatedRouteSnapshot, + { routeConfig, params }: ActivatedRouteSnapshot, + current: ActivatedRouteSnapshot, ): boolean { - // return future.routeConfig === curr.routeConfig - // TODO: Copied from ionic for backwards compatibility, remove later - if (future.routeConfig !== curr.routeConfig) { - return false - } - - // checking router params - const futureParams = future.params - const currentParams = curr.params - const keysA = Object.keys(futureParams) - const keysB = Object.keys(currentParams) - if (keysA.length !== keysB.length) { - return false - } - // Test for A's keys different from B. - for (const key of keysA) { - if (currentParams[key] !== futureParams[key]) { - return false - } - } - return true + return ( + routeConfig === current.routeConfig && + Object.keys(params).length === Object.keys(current.params).length && + Object.keys(params).every(key => current.params[key] === params[key]) + ) } private getPath(route: ActivatedRouteSnapshot): string { diff --git a/web/projects/ui/src/app/common/form/form-file/form-file.component.scss b/web/projects/ui/src/app/common/form/form-file/form-file.component.scss index f4abf6232..2e314972d 100644 --- a/web/projects/ui/src/app/common/form/form-file/form-file.component.scss +++ b/web/projects/ui/src/app/common/form/form-file/form-file.component.scss @@ -3,10 +3,11 @@ .template { @include transition(opacity); + width: 100%; display: flex; align-items: center; padding: 0 0.5rem; - font: var(--tui-font-text-l); + font: var(--tui-font-text-m); font-weight: bold; &_hidden { @@ -41,5 +42,5 @@ small { tui-tag { z-index: 1; - margin: 0 -0.25rem 0 auto; + margin: -0.25rem -0.25rem -0.25rem auto; } diff --git a/web/projects/ui/src/app/common/interface-addresses/interface-addresses.component.html b/web/projects/ui/src/app/common/interface-addresses/interface-addresses.component.html index 74a32d577..3e80a3c8c 100644 --- a/web/projects/ui/src/app/common/interface-addresses/interface-addresses.component.html +++ b/web/projects/ui/src/app/common/interface-addresses/interface-addresses.component.html @@ -1,6 +1,6 @@ - Clearnet +

    Clearnet

    @@ -47,7 +47,7 @@

    - Tor +

    Tor

    @@ -72,7 +72,7 @@

    - Local +

    Local

    diff --git a/web/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.html b/web/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.html index 350b0fff9..8cd93b647 100644 --- a/web/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.html +++ b/web/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.html @@ -9,13 +9,15 @@ > Restart your server for these updates to take effect. It can take several minutes to come back online. - +
    + +
    diff --git a/web/projects/ui/src/app/services/proxy.service.ts b/web/projects/ui/src/app/services/proxy.service.ts index bffe20f82..be9349689 100644 --- a/web/projects/ui/src/app/services/proxy.service.ts +++ b/web/projects/ui/src/app/services/proxy.service.ts @@ -117,7 +117,7 @@ export class ProxyService { buttons: [ { text: 'Manage proxies', - link: '/system/proxies', + link: '/portal/system/settings/proxies', }, { text: 'Save', diff --git a/web/projects/ui/src/styles.scss b/web/projects/ui/src/styles.scss index c573cdcaa..d7f728578 100644 --- a/web/projects/ui/src/styles.scss +++ b/web/projects/ui/src/styles.scss @@ -387,6 +387,7 @@ ul { td, th { + position: relative; font: var(--tui-font-text-s); text-align: left; height: 2rem; @@ -476,10 +477,6 @@ button.g-action { overflow: auto !important; } -p { - font-size: 1rem; -} - svg:not(:root) { overflow: auto; } From 0469aab4333b675fac1475d28d40a63dd33a6e05 Mon Sep 17 00:00:00 2001 From: Lucy <12953208+elvece@users.noreply.github.com> Date: Fri, 8 Dec 2023 15:12:38 -0500 Subject: [PATCH 038/169] Feature/marketplace redesign (#2395) * wip * update marketplace categories styling * update logo icons * add sort pipe * update search component styling * clean up categories component * cleanup and remove unnecessary sort pipe * query packages in selected category * fix search styling * add reg icon and font, adjust category styles * fix build from rebasing integration/refactors * adjust marketplace types for icon with store data, plus formatting * formatting * update categories and search * hover styling for categories * category styling * refactor for category as a behavior subject * more category styling * base functionality with new marketplace components * styling cleanup * misc style fixes and fix category selection from package page * fixes from review feedback * add and style additional details * implement release notes modal * fix menu when on service show page mobile to display change marketplace * style and responsiveness fixes * rename header to sidebar * input icon config to sidebar * add mime type pipe and type fn * review feedback fixes * skeleton text, more abstraction * reorder categories, clean up a little * audit sidebar, categories, store-icon, marketplace-sidebar, search * finish code cleanup and fix few bugs * misc fixes and cleanup * fix broken styles and markdown * bump shared marketplace version * more cleanup * sync package lock * rename sidebar component to menu * wip preview sidebar * sync package lock * breakout package show elements into components * link to brochure in preview; custom taiga button styles * move marketplace preview component into ui; open preview when viewing service in marketplace * sync changes post file struture rename * further cleanup * create service for sidebar toggle and cleanup marketplace components * bump shared marketplace version * bump shared for new images needed for brochure marketplace * cleanup --------- Co-authored-by: Matt Hill --- web/angular.json | 2 +- web/package-lock.json | 9042 +++++++++-------- web/package.json | 19 +- web/projects/marketplace/index.ts | 1 + web/projects/marketplace/package.json | 5 +- .../src/components/menu/menu.component.html | 145 + .../components/menu/menu.component.module.ts | 30 + .../src/components/menu/menu.component.scss | 0 .../src/components/menu/menu.component.ts | 89 + .../store-icon/store-icon.component.html | 1 + .../list/categories/categories.component.html | 33 +- .../list/categories/categories.component.scss | 20 +- .../list/categories/categories.component.ts | 32 +- .../src/pages/list/item/item.component.html | 45 +- .../src/pages/list/item/item.module.ts | 10 +- .../pages/list/search/search.component.html | 34 +- .../pages/list/search/search.component.scss | 8 - .../src/pages/list/search/search.component.ts | 2 +- .../src/pages/list/search/search.module.ts | 14 +- .../list/skeleton/skeleton.component.html | 38 +- .../release-notes.component.html | 75 +- .../release-notes.component.scss | 23 - .../release-notes/release-notes.component.ts | 42 +- .../release-notes/release-notes.module.ts | 19 +- .../src/pages/show/about/about.component.html | 47 +- .../src/pages/show/about/about.module.ts | 23 +- .../additional-link.component.html | 12 + .../additional-link.component.module.ts | 12 + .../additional-link.component.scss | 0 .../additional-link.component.ts | 16 + .../show/additional/additional.component.html | 255 +- .../show/additional/additional.component.scss | 10 - .../show/additional/additional.component.ts | 3 +- .../show/additional/additional.module.ts | 21 +- .../dependencies/dependencies.component.html | 65 +- .../dependencies/dependencies.component.scss | 0 .../dependencies/dependencies.component.ts | 16 +- .../show/dependencies/dependencies.module.ts | 15 +- .../src/pages/show/hero/hero.component.ts | 55 + .../pages/show/package/package.component.html | 9 - .../pages/show/package/package.component.scss | 48 - .../pages/show/package/package.component.ts | 13 - .../src/pages/show/package/package.module.ts | 25 - .../show/screenshots/screenshots.component.ts | 97 + .../src/pipes/filter-packages.pipe.ts | 7 +- web/projects/marketplace/src/public-api.ts | 9 +- .../src/services/category.service.ts | 16 + .../src/services/marketplace.service.ts | 10 +- web/projects/marketplace/src/types.ts | 3 + web/projects/marketplace/tailwind.config.js | 11 + .../LeagueSpartan-VariableFont_wght.ttf | Bin 0 -> 88760 bytes web/projects/shared/assets/img/background.png | Bin 0 -> 432435 bytes .../shared/assets/img/icon_transparent.png | Bin 0 -> 53685 bytes .../shared/assets/img/icon_transparent.svg | 5 + web/projects/shared/assets/img/temp/one.png | Bin 0 -> 288550 bytes web/projects/shared/assets/img/temp/three.png | Bin 0 -> 336622 bytes web/projects/shared/assets/img/temp/two.png | Bin 0 -> 1741287 bytes web/projects/shared/package.json | 8 +- .../shared/src/pipes/shared/sort.pipe.ts | 34 + web/projects/shared/styles/taiga.scss | 137 + web/projects/ui/src/app/app.component.scss | 1 + web/projects/ui/src/app/app.component.ts | 4 +- web/projects/ui/src/app/app.providers.ts | 10 +- .../routes/service/pipes/to-menu.pipe.ts | 7 +- .../system/sideload/dependencies.component.ts | 58 - .../system/sideload/package.component.ts | 65 +- .../system/sideload/sideload.component.ts | 1 + .../updates/components/item.component.ts | 4 +- .../marketplace-item-toggle.component.ts | 134 + .../marketplace-menu.component.html | 29 + .../marketplace-menu.component.scss | 0 .../marketplace-menu.component.ts | 31 + .../marketplace-menu.module.ts | 11 + .../marketplace-list.module.ts | 38 +- .../marketplace-list.page.html | 202 +- .../marketplace-list.page.scss | 42 +- .../marketplace-list/marketplace-list.page.ts | 100 +- .../marketplace-settings.page.ts | 24 +- .../marketplace-show-controls.component.ts | 113 +- .../marketplace-show-preview.component.html | 47 + .../marketplace-show-preview.component.scss | 0 .../marketplace-show-preview.component.ts | 59 + .../marketplace-show-preview.module.ts | 35 + .../marketplace-show-components.module.ts | 46 - .../marketplace-show-controls.component.html | 46 - .../marketplace-show-controls.page.scss | 19 - .../marketplace-show-dependent.component.html | 30 - .../marketplace-show-dependent.component.scss | 17 - .../marketplace-show-dependent.component.ts | 33 - .../marketplace-show-header.component.html | 8 - .../marketplace-show-header.component.ts | 8 - .../marketplace-show.module.ts | 46 - .../marketplace-show.page.html | 50 - .../marketplace-show.page.scss | 3 - .../marketplace-show/marketplace-show.page.ts | 36 - .../pages/marketplace/marketplace.module.ts | 16 +- .../release-notes/release-notes.module.ts | 20 - .../release-notes/release-notes.page.html | 10 - .../release-notes/release-notes.page.ts | 13 - .../app-list-pkg/app-list-pkg.component.scss | 3 + .../services/app-list/app-list.page.scss | 2 +- .../app-show-dependencies.component.scss | 4 + .../app-show-header.component.scss | 4 + .../app-show-menu.component.html | 2 +- .../pages/system/sideload/sideload.module.ts | 10 +- .../pages/system/sideload/sideload.page.html | 30 +- .../apps/ui/pages/updates/updates.page.html | 2 +- web/projects/ui/src/app/route-animation.ts | 33 + .../ui/src/app/services/api/api.fixures.ts | 12 +- .../ui/src/app/services/category.service.ts | 26 + .../src/app/services/marketplace.service.ts | 41 +- .../ui/src/app/services/sidebar.service.ts | 21 + web/projects/ui/src/styles.scss | 15 +- web/projects/ui/tailwind.config.js | 25 + web/tsconfig.json | 2 +- 115 files changed, 6871 insertions(+), 5488 deletions(-) create mode 100644 web/projects/marketplace/index.ts create mode 100644 web/projects/marketplace/src/components/menu/menu.component.html create mode 100644 web/projects/marketplace/src/components/menu/menu.component.module.ts create mode 100644 web/projects/marketplace/src/components/menu/menu.component.scss create mode 100644 web/projects/marketplace/src/components/menu/menu.component.ts create mode 100644 web/projects/marketplace/src/pages/show/additional/additional-link/additional-link.component.html create mode 100644 web/projects/marketplace/src/pages/show/additional/additional-link/additional-link.component.module.ts create mode 100644 web/projects/marketplace/src/pages/show/additional/additional-link/additional-link.component.scss create mode 100644 web/projects/marketplace/src/pages/show/additional/additional-link/additional-link.component.ts create mode 100644 web/projects/marketplace/src/pages/show/dependencies/dependencies.component.scss create mode 100644 web/projects/marketplace/src/pages/show/hero/hero.component.ts delete mode 100644 web/projects/marketplace/src/pages/show/package/package.component.html delete mode 100644 web/projects/marketplace/src/pages/show/package/package.component.scss delete mode 100644 web/projects/marketplace/src/pages/show/package/package.component.ts delete mode 100644 web/projects/marketplace/src/pages/show/package/package.module.ts create mode 100644 web/projects/marketplace/src/pages/show/screenshots/screenshots.component.ts create mode 100644 web/projects/marketplace/src/services/category.service.ts create mode 100644 web/projects/marketplace/tailwind.config.js create mode 100644 web/projects/shared/assets/fonts/League_Spartan/LeagueSpartan-VariableFont_wght.ttf create mode 100644 web/projects/shared/assets/img/background.png create mode 100644 web/projects/shared/assets/img/icon_transparent.png create mode 100644 web/projects/shared/assets/img/icon_transparent.svg create mode 100644 web/projects/shared/assets/img/temp/one.png create mode 100644 web/projects/shared/assets/img/temp/three.png create mode 100644 web/projects/shared/assets/img/temp/two.png create mode 100644 web/projects/shared/src/pipes/shared/sort.pipe.ts delete mode 100644 web/projects/ui/src/app/apps/portal/routes/system/sideload/dependencies.component.ts create mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-item-toggle.component.ts create mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-menu/marketplace-menu.component.html create mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-menu/marketplace-menu.component.scss create mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-menu/marketplace-menu.component.ts create mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-menu/marketplace-menu.module.ts rename web/projects/ui/src/app/apps/ui/pages/marketplace/{marketplace-show/components/marketplace-show-controls => marketplace-show-preview/components}/marketplace-show-controls.component.ts (66%) create mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.component.html create mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.component.scss create mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.component.ts create mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-components.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-header/marketplace-show-header.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-header/marketplace-show-header.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.page.ts create mode 100644 web/projects/ui/src/app/route-animation.ts create mode 100644 web/projects/ui/src/app/services/category.service.ts create mode 100644 web/projects/ui/src/app/services/sidebar.service.ts create mode 100644 web/projects/ui/tailwind.config.js diff --git a/web/angular.json b/web/angular.json index 95cb07ade..ab9777774 100644 --- a/web/angular.json +++ b/web/angular.json @@ -28,7 +28,7 @@ }, { "glob": "**/*.svg", - "input": "node_modules/ionicons/dist/ionicons/svg", + "input": "node_modules/ionicons/dist/svg", "output": "./svg" }, { diff --git a/web/package-lock.json b/web/package-lock.json index e35fab672..2994ceaf4 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -24,14 +24,14 @@ "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc8.beta2", - "@taiga-ui/addon-charts": "3.56.0", - "@taiga-ui/addon-mobile": "3.56.0", - "@taiga-ui/cdk": "3.56.0", - "@taiga-ui/core": "3.56.0", - "@taiga-ui/experimental": "3.56.0", - "@taiga-ui/icons": "3.56.0", - "@taiga-ui/kit": "3.56.0", - "@taiga-ui/styles": "3.56.0", + "@taiga-ui/addon-charts": "3.57.0", + "@taiga-ui/addon-mobile": "3.57.0", + "@taiga-ui/cdk": "3.57.0", + "@taiga-ui/core": "3.57.0", + "@taiga-ui/experimental": "3.57.0", + "@taiga-ui/icons": "3.57.0", + "@taiga-ui/kit": "3.57.0", + "@taiga-ui/styles": "3.57.0", "@tinkoff/ng-dompurify": "4.0.0", "@tinkoff/ng-event-plugins": "3.1.0", "ansi-to-html": "^0.7.2", @@ -55,6 +55,7 @@ "pbkdf2": "^3.1.2", "rxjs": "^7.5.6", "swiper": "^8.2.4", + "tailwindcss": "^3.3.3", "ts-matches": "^5.2.1", "tslib": "^2.3.0", "uuid": "^8.3.2", @@ -75,10 +76,12 @@ "@types/node-jose": "^1.1.10", "@types/pbkdf2": "^3.1.0", "@types/uuid": "^8.3.1", + "autoprefixer": "^10.4.14", "husky": "^4.3.8", "lint-staged": "^13.2.0", "ng-packagr": "^16.1.0", "node-html-parser": "^5.3.3", + "postcss": "^8.4.21", "prettier": "^2.6.1", "raw-loader": "^4.0.2", "ts-node": "^10.7.0", @@ -109,2077 +112,294 @@ "rxjs": ">=7.0.0" } }, - "../patch-db/client/node_modules/@babel/code-frame": { - "version": "7.21.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../patch-db/client/node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "dev": true, - "license": "MIT", + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", "engines": { - "node": ">=6.9.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "../patch-db/client/node_modules/@babel/highlight": { - "version": "7.18.6", + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "../patch-db/client/node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", + "node_modules/@angular-devkit/architect": { + "version": "0.1602.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.10.tgz", + "integrity": "sha512-FwemQXh3edqA/S6zPpsqKei5v7gt0R0WpjJoAJaz+FOpfDwij1fwnKr88XINY8xcefTcQaTDQxJZheJShA/hHw==", + "devOptional": true, "dependencies": { - "color-convert": "^1.9.0" + "@angular-devkit/core": "16.2.10", + "rxjs": "7.8.1" }, "engines": { - "node": ">=4" + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "../patch-db/client/node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", + "node_modules/@angular-devkit/build-angular": { + "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.10.tgz", + "integrity": "sha512-msB/qjIsAOySDxdU5DpcX2sWGUEJOFIO03O9+HbtLwf3NDfe74mFfejxuKlHJXIJdgpM2Zc948M6+618QKpUYA==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@ampproject/remapping": "2.2.1", + "@angular-devkit/architect": "0.1602.10", + "@angular-devkit/build-webpack": "0.1602.10", + "@angular-devkit/core": "16.2.10", + "@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.10", + "@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.4.7", + "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" }, "engines": { - "node": ">=4" + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.18.17" + }, + "peerDependencies": { + "@angular/compiler-cli": "^16.0.0", + "@angular/localize": "^16.0.0", + "@angular/platform-server": "^16.0.0", + "@angular/service-worker": "^16.0.0", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", + "karma": "^6.3.0", + "ng-packagr": "^16.0.0", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=4.9.3 <5.2" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + } } }, - "../patch-db/client/node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", + "node_modules/@angular-devkit/build-angular/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "../patch-db/client/node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", + "node_modules/@angular-devkit/build-angular/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" + "peerDependencies": { + "ajv": "^6.9.1" } }, - "../patch-db/client/node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", + "node_modules/@angular-devkit/build-angular/node_modules/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], "dependencies": { - "has-flag": "^3.0.0" + "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" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" }, "engines": { - "node": ">=4" + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "../patch-db/client/node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", + "node_modules/@angular-devkit/build-angular/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, "engines": { - "node": ">=12" + "node": "^10 || ^12 || >=14" } }, - "../patch-db/client/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", + "node_modules/@angular-devkit/build-angular/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, - "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, "engines": { - "node": ">=6.0.0" - } - }, - "../patch-db/client/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "../patch-db/client/node_modules/@tsconfig/node10": { - "version": "1.0.9", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/@tsconfig/node12": { - "version": "1.0.11", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/@tsconfig/node14": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/@tsconfig/node16": { - "version": "1.0.4", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/@types/node": { - "version": "18.15.0", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/@types/parse-json": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/@types/uuid": { - "version": "8.3.1", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/acorn": { - "version": "8.8.2", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "../patch-db/client/node_modules/acorn-walk": { - "version": "8.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "../patch-db/client/node_modules/aggregate-error": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/ansi-escapes": { - "version": "4.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "../patch-db/client/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "../patch-db/client/node_modules/arg": { - "version": "4.1.3", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/argparse": { - "version": "1.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "../patch-db/client/node_modules/astral-regex": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "../patch-db/client/node_modules/braces": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/builtin-modules": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "../patch-db/client/node_modules/callsites": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../patch-db/client/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "../patch-db/client/node_modules/ci-info": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/clean-stack": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../patch-db/client/node_modules/cli-cursor": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/cli-truncate": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "../patch-db/client/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/colorette": { - "version": "2.0.20", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/commander": { - "version": "10.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "../patch-db/client/node_modules/compare-versions": { - "version": "3.6.0", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/cosmiconfig": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "../patch-db/client/node_modules/create-require": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/cross-spawn": { - "version": "7.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "../patch-db/client/node_modules/debug": { - "version": "4.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "../patch-db/client/node_modules/diff": { - "version": "4.0.2", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "../patch-db/client/node_modules/eastasianwidth": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/emoji-regex": { - "version": "9.2.2", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/error-ex": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "../patch-db/client/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "../patch-db/client/node_modules/esprima": { - "version": "4.0.1", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "../patch-db/client/node_modules/execa": { - "version": "7.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "../patch-db/client/node_modules/fill-range": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/find-up": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/find-versions": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver-regex": "^3.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "../patch-db/client/node_modules/function-bind": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/get-stream": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../patch-db/client/node_modules/has": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "../patch-db/client/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/human-signals": { - "version": "4.3.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14.18.0" - } - }, - "../patch-db/client/node_modules/husky": { - "version": "4.3.8", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "compare-versions": "^3.6.0", - "cosmiconfig": "^7.0.0", - "find-versions": "^4.0.0", - "opencollective-postinstall": "^2.0.2", - "pkg-dir": "^5.0.0", - "please-upgrade-node": "^3.2.0", - "slash": "^3.0.0", - "which-pm-runs": "^1.0.0" - }, - "bin": { - "husky-run": "bin/run.js", - "husky-upgrade": "lib/upgrader/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/husky" - } - }, - "../patch-db/client/node_modules/import-fresh": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/indent-string": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "../patch-db/client/node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "license": "ISC" - }, - "../patch-db/client/node_modules/is-arrayish": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/is-core-module": { - "version": "2.12.1", - "dev": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../patch-db/client/node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/is-number": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "../patch-db/client/node_modules/is-stream": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "../patch-db/client/node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/js-yaml": { - "version": "3.14.1", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "../patch-db/client/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/lilconfig": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "../patch-db/client/node_modules/lines-and-columns": { - "version": "1.2.4", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/lint-staged": { - "version": "13.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "5.2.0", - "cli-truncate": "^3.1.0", - "commander": "^10.0.0", - "debug": "^4.3.4", - "execa": "^7.0.0", - "lilconfig": "2.1.0", - "listr2": "^5.0.7", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.3", - "pidtree": "^0.6.0", - "string-argv": "^0.3.1", - "yaml": "^2.2.2" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" - } - }, - "../patch-db/client/node_modules/lint-staged/node_modules/chalk": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "../patch-db/client/node_modules/lint-staged/node_modules/yaml": { - "version": "2.3.1", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 14" - } - }, - "../patch-db/client/node_modules/listr2": { - "version": "5.0.8", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, - "../patch-db/client/node_modules/listr2/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/listr2/node_modules/cli-truncate": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/listr2/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/listr2/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/listr2/node_modules/slice-ansi": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/listr2/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/listr2/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/locate-path": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/log-update": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/log-update/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/log-update/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "../patch-db/client/node_modules/log-update/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/log-update/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/make-error": { - "version": "1.3.6", - "dev": true, - "license": "ISC" - }, - "../patch-db/client/node_modules/merge-stream": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/micromatch": { - "version": "4.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "../patch-db/client/node_modules/mimic-fn": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "../patch-db/client/node_modules/minimist": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../patch-db/client/node_modules/mkdirp": { - "version": "0.5.6", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "../patch-db/client/node_modules/ms": { - "version": "2.1.2", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/normalize-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "../patch-db/client/node_modules/npm-run-path": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/object-inspect": { - "version": "1.12.3", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../patch-db/client/node_modules/once": { - "version": "1.4.0", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "../patch-db/client/node_modules/onetime": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/opencollective-postinstall": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "bin": { - "opencollective-postinstall": "index.js" - } - }, - "../patch-db/client/node_modules/p-limit": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/p-locate": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/p-map": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/parent-module": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "../patch-db/client/node_modules/parse-json": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "../patch-db/client/node_modules/path-key": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/path-parse": { - "version": "1.0.7", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/path-type": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/picomatch": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "../patch-db/client/node_modules/pidtree": { - "version": "0.6.0", - "dev": true, - "license": "MIT", - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "../patch-db/client/node_modules/pkg-dir": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "../patch-db/client/node_modules/please-upgrade-node": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver-compare": "^1.0.0" - } - }, - "../patch-db/client/node_modules/prettier": { - "version": "2.8.8", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "../patch-db/client/node_modules/resolve": { - "version": "1.22.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../patch-db/client/node_modules/resolve-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../patch-db/client/node_modules/restore-cursor": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../patch-db/client/node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/rfdc": { - "version": "1.3.0", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/rxjs": { - "version": "7.8.1", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "../patch-db/client/node_modules/semver": { - "version": "5.7.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "../patch-db/client/node_modules/semver-compare": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/semver-regex": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/shebang-command": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/shebang-regex": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "../patch-db/client/node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/slice-ansi": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "../patch-db/client/node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "../patch-db/client/node_modules/sorted-btree": { - "version": "1.5.0", - "license": "MIT" - }, - "../patch-db/client/node_modules/sprintf-js": { - "version": "1.0.3", - "dev": true, - "license": "BSD-3-Clause" - }, - "../patch-db/client/node_modules/string-argv": { - "version": "0.3.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.19" - } - }, - "../patch-db/client/node_modules/string-width": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "../patch-db/client/node_modules/strip-final-newline": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../patch-db/client/node_modules/through": { - "version": "2.3.8", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/to-regex-range": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "../patch-db/client/node_modules/ts-node": { - "version": "10.9.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "../patch-db/client/node_modules/tslib": { - "version": "2.5.3", - "license": "0BSD" - }, - "../patch-db/client/node_modules/tslint": { - "version": "6.1.3", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "bin": { - "tslint": "bin/tslint" - }, - "engines": { - "node": ">=4.8.0" - }, - "peerDependencies": { - "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" - } - }, - "../patch-db/client/node_modules/tslint/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "../patch-db/client/node_modules/tslint/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "../patch-db/client/node_modules/tslint/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "../patch-db/client/node_modules/tslint/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/tslint/node_modules/commander": { - "version": "2.20.3", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/tslint/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../patch-db/client/node_modules/tslint/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "../patch-db/client/node_modules/tslint/node_modules/tslib": { - "version": "1.14.1", - "dev": true, - "license": "0BSD" - }, - "../patch-db/client/node_modules/tsutils": { - "version": "2.29.0", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^1.8.1" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" - } - }, - "../patch-db/client/node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "dev": true, - "license": "0BSD" - }, - "../patch-db/client/node_modules/type-fest": { - "version": "0.21.3", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../patch-db/client/node_modules/typescript": { - "version": "4.9.5", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "../patch-db/client/node_modules/uuid": { - "version": "8.3.2", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "../patch-db/client/node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/which": { - "version": "2.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "../patch-db/client/node_modules/which-pm-runs": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../patch-db/client/node_modules/wrap-ansi": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "../patch-db/client/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "../patch-db/client/node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../patch-db/client/node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "license": "ISC" - }, - "../patch-db/client/node_modules/yaml": { - "version": "1.10.2", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "../patch-db/client/node_modules/yn": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../patch-db/client/node_modules/yocto-queue": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@angular-devkit/architect": { - "version": "0.1602.10", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "16.2.10", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/build-angular": { - "version": "16.2.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1602.10", - "@angular-devkit/build-webpack": "0.1602.10", - "@angular-devkit/core": "16.2.10", - "@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.10", - "@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.4.7", - "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" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "optionalDependencies": { - "esbuild": "0.18.17" - }, - "peerDependencies": { - "@angular/compiler-cli": "^16.0.0", - "@angular/localize": "^16.0.0", - "@angular/platform-server": "^16.0.0", - "@angular/service-worker": "^16.0.0", - "jest": "^29.5.0", - "jest-environment-jsdom": "^29.5.0", - "karma": "^6.3.0", - "ng-packagr": "^16.0.0", - "protractor": "^7.0.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=4.9.3 <5.2" - }, - "peerDependenciesMeta": { - "@angular/localize": { - "optional": true - }, - "@angular/platform-server": { - "optional": true - }, - "@angular/service-worker": { - "optional": true - }, - "jest": { - "optional": true - }, - "jest-environment-jsdom": { - "optional": true - }, - "karma": { - "optional": true - }, - "ng-packagr": { - "optional": true - }, - "protractor": { - "optional": true - }, - "tailwindcss": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@types/estree": { - "version": "1.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular-devkit/build-angular/node_modules/ajv": { - "version": "6.12.6", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/ajv-keywords": { - "version": "3.5.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular-devkit/build-angular/node_modules/schema-utils": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/@angular-devkit/build-angular/node_modules/tslib": { "version": "2.6.1", - "dev": true, - "license": "0BSD" + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "dev": true }, "node_modules/@angular-devkit/build-angular/node_modules/webpack": { "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -2224,8 +444,9 @@ }, "node_modules/@angular-devkit/build-webpack": { "version": "0.1602.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.10.tgz", + "integrity": "sha512-H7HiFKbZl/xVxpr1RH05SGawTpA1417wvr2nFGRu2OiePd0lPr6pIhcq8F8gt7JcA8yZKKaqjn2gU+6um2MFLg==", "dev": true, - "license": "MIT", "dependencies": { "@angular-devkit/architect": "0.1602.10", "rxjs": "7.8.1" @@ -2242,7 +463,8 @@ }, "node_modules/@angular-devkit/core": { "version": "16.2.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.10.tgz", + "integrity": "sha512-eo7suLDjyu5bSlEr4TluYkFm4v2PVLSAPgnau8XHHlN5Yg4P/BZ00ve7LA7C9S1gzRSCrxQhK5ki4rnoFTo5zg==", "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", @@ -2267,7 +489,8 @@ }, "node_modules/@angular-devkit/schematics": { "version": "16.2.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.2.10.tgz", + "integrity": "sha512-UCfPJKVNekb21bWRbzyx81tfHN3x8vU4ZMX/VA6xALg//QalMB7NOkkXBAssthnLastkyzkUtlvApTp2+R+EkQ==", "dependencies": { "@angular-devkit/core": "16.2.10", "jsonc-parser": "3.2.0", @@ -2283,7 +506,8 @@ }, "node_modules/@angular/animations": { "version": "16.2.12", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.2.12.tgz", + "integrity": "sha512-MD0ElviEfAJY8qMOd6/jjSSvtqER2RDAi0lxe6EtUacC1DHCYkaPrKW4vLqY+tmZBg1yf+6n+uS77pXcHHcA3w==", "dependencies": { "tslib": "^2.3.0" }, @@ -2296,7 +520,8 @@ }, "node_modules/@angular/cdk": { "version": "16.2.12", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-16.2.12.tgz", + "integrity": "sha512-wT8/265zm2WKY0BDaRoYbrAT4kadrmejTRLjuimQIEUKnw4vBsJMWCwQkpFo3s6zr6eznGqYVAFb8KKPVLKGBg==", "dependencies": { "tslib": "^2.3.0" }, @@ -2309,32 +534,11 @@ "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@angular/cdk/node_modules/entities": { - "version": "4.5.0", - "license": "BSD-2-Clause", - "optional": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/@angular/cdk/node_modules/parse5": { - "version": "7.1.2", - "license": "MIT", - "optional": true, - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/@angular/cli": { "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.2.10.tgz", + "integrity": "sha512-zDqlD+rXFuYZP169c2v35HkMbkchVCft5sS+VpoCCgYTk2rwxpeYkjJ8DQZztZJZRXQ+EMpkv/TubswmDro2zA==", "devOptional": true, - "license": "MIT", "dependencies": { "@angular-devkit/architect": "0.1602.10", "@angular-devkit/core": "16.2.10", @@ -2366,7 +570,8 @@ }, "node_modules/@angular/common": { "version": "16.2.12", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.2.12.tgz", + "integrity": "sha512-B+WY/cT2VgEaz9HfJitBmgdk4I333XG/ybC98CMC4Wz8E49T8yzivmmxXB3OD6qvjcOB6ftuicl6WBqLbZNg2w==", "dependencies": { "tslib": "^2.3.0" }, @@ -2380,7 +585,8 @@ }, "node_modules/@angular/compiler": { "version": "16.2.12", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.2.12.tgz", + "integrity": "sha512-6SMXUgSVekGM7R6l1Z9rCtUGtlg58GFmgbpMCsGf+VXxP468Njw8rjT2YZkf5aEPxEuRpSHhDYjqz7n14cwCXQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -2398,8 +604,9 @@ }, "node_modules/@angular/compiler-cli": { "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.2.12.tgz", + "integrity": "sha512-pWSrr152562ujh6lsFZR8NfNc5Ljj+zSTQO44DsuB0tZjwEpnRcjJEgzuhGXr+CoiBf+jTSPZKemtSktDk5aaA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "7.23.2", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -2425,8 +632,9 @@ }, "node_modules/@angular/compiler-cli/node_modules/@babel/core": { "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", "dev": true, - "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", @@ -2454,23 +662,26 @@ }, "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true }, "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@angular/compiler-cli/node_modules/@babel/generator": { - "version": "7.23.3", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", + "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.23.3", + "@babel/types": "^7.23.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -2481,8 +692,9 @@ }, "node_modules/@angular/compiler-cli/node_modules/@babel/template": { "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", @@ -2494,7 +706,8 @@ }, "node_modules/@angular/core": { "version": "16.2.12", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.2.12.tgz", + "integrity": "sha512-GLLlDeke/NjroaLYOks0uyzFVo6HyLl7VOm0K1QpLXnYvW63W9Ql/T3yguRZa7tRkOAeFZ3jw+1wnBD4O8MoUA==", "dependencies": { "tslib": "^2.3.0" }, @@ -2508,7 +721,8 @@ }, "node_modules/@angular/forms": { "version": "16.2.12", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.2.12.tgz", + "integrity": "sha512-1Eao89hlBgLR3v8tU91vccn21BBKL06WWxl7zLpQmG6Hun+2jrThgOE4Pf3os4fkkbH4Apj0tWL2fNIWe/blbw==", "dependencies": { "tslib": "^2.3.0" }, @@ -2524,15 +738,17 @@ }, "node_modules/@angular/language-service": { "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-16.2.12.tgz", + "integrity": "sha512-sZwB+ZEjChx9EYcqPaS4OnhC/q5RcedZjIdM9mCxuU/MtseURRYRI/8Hnm1RHo9qyc5PmsQpg7p9Vp/5hXLUjw==", "dev": true, - "license": "MIT", "engines": { "node": "^16.14.0 || >=18.10.0" } }, "node_modules/@angular/platform-browser": { "version": "16.2.12", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.2.12.tgz", + "integrity": "sha512-NnH7ju1iirmVEsUq432DTm0nZBGQsBrU40M3ZeVHMQ2subnGiyUs3QyzDz8+VWLL/T5xTxWLt9BkDn65vgzlIQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -2552,7 +768,8 @@ }, "node_modules/@angular/platform-browser-dynamic": { "version": "16.2.12", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.2.12.tgz", + "integrity": "sha512-ya54jerNgreCVAR278wZavwjrUWImMr2F8yM5n9HBvsMBbFaAQ83anwbOEiHEF2BlR+gJiEBLfpuPRMw20pHqw==", "dependencies": { "tslib": "^2.3.0" }, @@ -2568,7 +785,8 @@ }, "node_modules/@angular/pwa": { "version": "16.2.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@angular/pwa/-/pwa-16.2.10.tgz", + "integrity": "sha512-qZFXdm8oTnH58A3ONXJ63G3rkgvBu+wSRhE/q4luickTLHrDp9P1YbvBdplJduhFHIh7tg6oFNd7ps0NuFklYg==", "dependencies": { "@angular-devkit/schematics": "16.2.10", "@schematics/angular": "16.2.10", @@ -2590,7 +808,8 @@ }, "node_modules/@angular/router": { "version": "16.2.12", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.2.12.tgz", + "integrity": "sha512-aU6QnYSza005V9P3W6PpkieL56O0IHps96DjqI1RS8yOJUl3THmokqYN4Fm5+HXy4f390FN9i6ftadYQDKeWmA==", "dependencies": { "tslib": "^2.3.0" }, @@ -2606,7 +825,8 @@ }, "node_modules/@angular/service-worker": { "version": "16.2.12", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-16.2.12.tgz", + "integrity": "sha512-o0z0s4c76NmRASa+mUHn/q6vUKQNa06mGmLBDKm84vRQ1sQ2TJv+R1p8K9WkiM5mGy6tjQCDOgaz13TcxMFWOQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -2623,15 +843,17 @@ }, "node_modules/@assemblyscript/loader": { "version": "0.10.1", - "dev": true, - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", + "dev": true }, "node_modules/@babel/code-frame": { - "version": "7.22.13", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/highlight": "^7.22.13", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" }, "engines": { @@ -2639,17 +861,19 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.23.3", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", "dev": true, - "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.5", @@ -2677,16 +901,18 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", @@ -2699,8 +925,9 @@ }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -2710,8 +937,9 @@ }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.22.15" }, @@ -2721,8 +949,9 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.9", "@babel/helper-validator-option": "^7.22.15", @@ -2736,23 +965,25 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.15", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.5.tgz", + "integrity": "sha512-QELlRWxSpgdwdJzSJn4WAhKC+hvw/AtHbbrIoncKHkhKKR/luAlKkgBDcri1EzWAo8f8VvYVryEHN4tax/V67A==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-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.9", + "@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" @@ -2766,16 +997,18 @@ }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "regexpu-core": "^5.3.1", @@ -2790,16 +1023,18 @@ }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", + "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -2813,16 +1048,18 @@ }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" @@ -2833,8 +1070,9 @@ }, "node_modules/@babel/helper-function-name/node_modules/@babel/template": { "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", @@ -2846,8 +1084,9 @@ }, "node_modules/@babel/helper-hoist-variables": { "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -2857,8 +1096,9 @@ }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.23.0" }, @@ -2868,8 +1108,9 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.22.15" }, @@ -2879,8 +1120,9 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-module-imports": "^7.22.15", @@ -2897,8 +1139,9 @@ }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -2908,16 +1151,18 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20", @@ -2932,8 +1177,9 @@ }, "node_modules/@babel/helper-replace-supers": { "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-member-expression-to-functions": "^7.22.15", @@ -2948,8 +1194,9 @@ }, "node_modules/@babel/helper-simple-access": { "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -2959,8 +1206,9 @@ }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -2970,8 +1218,9 @@ }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -2980,33 +1229,37 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-function-name": "^7.22.5", "@babel/template": "^7.22.15", @@ -3018,8 +1271,9 @@ }, "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", @@ -3030,13 +1284,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.2", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.5.tgz", + "integrity": "sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.23.5", + "@babel/types": "^7.23.5" }, "engines": { "node": ">=6.9.0" @@ -3044,8 +1299,9 @@ }, "node_modules/@babel/helpers/node_modules/@babel/template": { "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", @@ -3056,9 +1312,10 @@ } }, "node_modules/@babel/highlight": { - "version": "7.22.20", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -3069,9 +1326,10 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.3", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", + "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", "dev": true, - "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, @@ -3081,8 +1339,9 @@ }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -3095,8 +1354,9 @@ }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", @@ -3111,8 +1371,10 @@ }, "node_modules/@babel/plugin-proposal-async-generator-functions": { "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-plugin-utils": "^7.20.2", @@ -3128,8 +1390,9 @@ }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" }, @@ -3139,8 +1402,10 @@ }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -3154,8 +1419,9 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -3165,8 +1431,9 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -3176,8 +1443,9 @@ }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -3190,8 +1458,9 @@ }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -3201,8 +1470,9 @@ }, "node_modules/@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, @@ -3212,8 +1482,9 @@ }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -3226,8 +1497,9 @@ }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -3240,8 +1512,9 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -3251,8 +1524,9 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -3262,8 +1536,9 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -3273,8 +1548,9 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -3284,8 +1560,9 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -3295,8 +1572,9 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -3306,8 +1584,9 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -3317,8 +1596,9 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -3328,8 +1608,9 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -3342,8 +1623,9 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -3356,8 +1638,9 @@ }, "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -3371,8 +1654,9 @@ }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -3384,9 +1668,10 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.3", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz", + "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-plugin-utils": "^7.22.5", @@ -3402,8 +1687,9 @@ }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", @@ -3418,8 +1704,9 @@ }, "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -3431,9 +1718,10 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.3", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -3446,8 +1734,9 @@ }, "node_modules/@babel/plugin-transform-class-properties": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" @@ -3460,9 +1749,10 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.3", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", @@ -3476,9 +1766,10 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.3", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz", + "integrity": "sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.22.15", @@ -3499,8 +1790,9 @@ }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/template": "^7.22.15" @@ -3514,8 +1806,9 @@ }, "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/template": { "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", @@ -3527,8 +1820,9 @@ }, "node_modules/@babel/plugin-transform-destructuring": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -3541,8 +1835,9 @@ }, "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" @@ -3556,8 +1851,9 @@ }, "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -3569,9 +1865,10 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.3", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -3585,8 +1882,9 @@ }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" @@ -3599,9 +1897,10 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.3", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -3615,8 +1914,9 @@ }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", + "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -3629,8 +1929,9 @@ }, "node_modules/@babel/plugin-transform-function-name": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-function-name": "^7.23.0", @@ -3644,9 +1945,10 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.3", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -3660,8 +1962,9 @@ }, "node_modules/@babel/plugin-transform-literals": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -3673,9 +1976,10 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.3", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -3689,8 +1993,9 @@ }, "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -3703,8 +2008,9 @@ }, "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5" @@ -3718,8 +2024,9 @@ }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5", @@ -3734,8 +2041,9 @@ }, "node_modules/@babel/plugin-transform-modules-systemjs": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-module-transforms": "^7.23.3", @@ -3751,8 +2059,9 @@ }, "node_modules/@babel/plugin-transform-modules-umd": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5" @@ -3766,8 +2075,9 @@ }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -3781,8 +2091,9 @@ }, "node_modules/@babel/plugin-transform-new-target": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -3794,9 +2105,10 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.3", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -3809,9 +2121,10 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.3", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -3824,9 +2137,10 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.23.3", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", "dev": true, - "license": "MIT", "dependencies": { "@babel/compat-data": "^7.23.3", "@babel/helper-compilation-targets": "^7.22.15", @@ -3843,8 +2157,9 @@ }, "node_modules/@babel/plugin-transform-object-super": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-replace-supers": "^7.22.20" @@ -3857,9 +2172,10 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.3", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -3872,9 +2188,10 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.3", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", @@ -3889,8 +2206,9 @@ }, "node_modules/@babel/plugin-transform-parameters": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -3903,8 +2221,9 @@ }, "node_modules/@babel/plugin-transform-private-methods": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" @@ -3917,9 +2236,10 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.3", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-create-class-features-plugin": "^7.22.15", @@ -3935,8 +2255,9 @@ }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -3949,8 +2270,9 @@ }, "node_modules/@babel/plugin-transform-regenerator": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "regenerator-transform": "^0.15.2" @@ -3964,8 +2286,9 @@ }, "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -3978,8 +2301,9 @@ }, "node_modules/@babel/plugin-transform-runtime": { "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", + "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", @@ -3997,16 +2321,18 @@ }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -4019,8 +2345,9 @@ }, "node_modules/@babel/plugin-transform-spread": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" @@ -4034,8 +2361,9 @@ }, "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -4048,8 +2376,9 @@ }, "node_modules/@babel/plugin-transform-template-literals": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -4062,8 +2391,9 @@ }, "node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -4076,8 +2406,9 @@ }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -4090,8 +2421,9 @@ }, "node_modules/@babel/plugin-transform-unicode-property-regex": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" @@ -4105,8 +2437,9 @@ }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" @@ -4120,8 +2453,9 @@ }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" @@ -4135,8 +2469,9 @@ }, "node_modules/@babel/preset-env": { "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", + "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", "dev": true, - "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.9", "@babel/helper-compilation-targets": "^7.22.9", @@ -4220,149 +2555,497 @@ "semver": "^6.3.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", + "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", + "dev": true, + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", + "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.5", + "@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.5", + "@babel/types": "^7.23.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", + "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", + "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "devOptional": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "devOptional": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", + "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", + "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz", + "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", + "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", + "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", + "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "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" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", + "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@babel/runtime": { - "version": "7.22.6", + "node_modules/@esbuild/linux-arm": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", + "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/template": { - "version": "7.22.5", + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", + "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/traverse": { - "version": "7.23.3", + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", + "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@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.3", - "@babel/types": "^7.23.3", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.23.3", + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", + "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", + "cpu": [ + "loong64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.23.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/types": { - "version": "7.23.3", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", + "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", + "cpu": [ + "mips64el" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", + "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=12" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", + "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", + "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", + "cpu": [ + "s390x" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10.0.0" + "node": ">=12" } }, - "node_modules/@esbuild/darwin-arm64": { + "node_modules/@esbuild/linux-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", + "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", + "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", + "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", + "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", + "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", + "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", + "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" ], "engines": { "node": ">=12" @@ -4370,16 +3053,19 @@ }, "node_modules/@gar/promisify": { "version": "1.1.3", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "devOptional": true }, "node_modules/@iarna/toml": { "version": "2.2.5", - "license": "ISC" + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" }, "node_modules/@ionic/angular": { "version": "6.7.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.7.5.tgz", + "integrity": "sha512-nV8HP7RedjYkIAT8nVr5ifHNT0D3XzA74RPG3/WCCFJKunERNJ9SBiNkCTWhUpSkqsYYwEB4+SOOHz+R5NLk/w==", "dependencies": { "@ionic/core": "6.7.5", "ionicons": "^6.1.3", @@ -4396,8 +3082,9 @@ }, "node_modules/@ionic/cli": { "version": "6.20.9", + "resolved": "https://registry.npmjs.org/@ionic/cli/-/cli-6.20.9.tgz", + "integrity": "sha512-sItLCi7zXq1zARWIpZDinHhK8hvy+wzOx176QMOJV90BjDybkjGYu3rGu5TBjoqn104dRIZTC8rtCsnD/P3cQw==", "dev": true, - "license": "MIT", "dependencies": { "@ionic/cli-framework": "5.1.3", "@ionic/cli-framework-output": "2.2.5", @@ -4435,8 +3122,9 @@ }, "node_modules/@ionic/cli-framework": { "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework/-/cli-framework-5.1.3.tgz", + "integrity": "sha512-T2KN/TurzNoAcc3iDt1KHU6GeEa7x9kXngMnu5xs+DzJv5HhBKjVOoo74b8rgVxdPx+dLOV8aLrorlyvsHR/tQ==", "dev": true, - "license": "MIT", "dependencies": { "@ionic/cli-framework-output": "2.2.5", "@ionic/utils-array": "2.1.5", @@ -4460,8 +3148,9 @@ }, "node_modules/@ionic/cli-framework-output": { "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.5.tgz", + "integrity": "sha512-YeDLTnTaE6V4IDUxT8GDIep0GuRIFaR7YZDLANMuuWJZDmnTku6DP+MmQoltBeLmVvz1BAAZgk41xzxdq6H2FQ==", "dev": true, - "license": "MIT", "dependencies": { "@ionic/utils-terminal": "2.3.3", "debug": "^4.0.0", @@ -4473,8 +3162,9 @@ }, "node_modules/@ionic/cli-framework-prompts": { "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework-prompts/-/cli-framework-prompts-2.1.10.tgz", + "integrity": "sha512-h8HbA0teR0vWtGKB3ahzRbDq4yYaxfukgbOqhu9CAEJHosoFlBmDB8PbPnGFYxUg2J1MuCqeiN2ftJQYV/BO1w==", "dev": true, - "license": "MIT", "dependencies": { "@ionic/utils-terminal": "2.3.3", "debug": "^4.0.0", @@ -4487,8 +3177,9 @@ }, "node_modules/@ionic/cli-framework-prompts/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -4501,8 +3192,9 @@ }, "node_modules/@ionic/cli-framework-prompts/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4516,8 +3208,9 @@ }, "node_modules/@ionic/cli-framework-prompts/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -4527,21 +3220,24 @@ }, "node_modules/@ionic/cli-framework-prompts/node_modules/color-name": { "version": "1.1.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/@ionic/cli-framework-prompts/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@ionic/cli-framework-prompts/node_modules/inquirer": { "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.0", @@ -4563,8 +3259,9 @@ }, "node_modules/@ionic/cli-framework-prompts/node_modules/rxjs": { "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" }, @@ -4574,13 +3271,15 @@ }, "node_modules/@ionic/cli-framework-prompts/node_modules/rxjs/node_modules/tslib": { "version": "1.14.1", - "dev": true, - "license": "0BSD" + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true }, "node_modules/@ionic/cli-framework-prompts/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -4590,8 +3289,9 @@ }, "node_modules/@ionic/cli-framework/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -4604,8 +3304,9 @@ }, "node_modules/@ionic/cli-framework/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4619,8 +3320,9 @@ }, "node_modules/@ionic/cli-framework/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -4630,21 +3332,24 @@ }, "node_modules/@ionic/cli-framework/node_modules/color-name": { "version": "1.1.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/@ionic/cli-framework/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@ionic/cli-framework/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -4654,8 +3359,9 @@ }, "node_modules/@ionic/cli/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -4668,8 +3374,9 @@ }, "node_modules/@ionic/cli/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4683,8 +3390,9 @@ }, "node_modules/@ionic/cli/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -4694,21 +3402,24 @@ }, "node_modules/@ionic/cli/node_modules/color-name": { "version": "1.1.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/@ionic/cli/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@ionic/cli/node_modules/open": { "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, - "license": "MIT", "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -4722,8 +3433,9 @@ }, "node_modules/@ionic/cli/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -4733,7 +3445,8 @@ }, "node_modules/@ionic/core": { "version": "6.7.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.7.5.tgz", + "integrity": "sha512-zRkRn+h/Vs3xt/EVgBdShMKDyeGOM4RU31NPF2icfu3CUTH+VrMV569MUnNjYvd1Lu2xK90pYy4TaicSWmC1Pw==", "dependencies": { "@stencil/core": "^2.18.0", "ionicons": "^6.1.3", @@ -4742,8 +3455,9 @@ }, "node_modules/@ionic/utils-array": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.5.tgz", + "integrity": "sha512-HD72a71IQVBmQckDwmA8RxNVMTbxnaLbgFOl+dO5tbvW9CkkSFCv41h6fUuNsSEVgngfkn0i98HDuZC8mk+lTA==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.0.0", "tslib": "^2.0.1" @@ -4754,8 +3468,9 @@ }, "node_modules/@ionic/utils-fs": { "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.6.tgz", + "integrity": "sha512-eikrNkK89CfGPmexjTfSWl4EYqsPSBh0Ka7by4F0PLc1hJZYtJxUZV3X4r5ecA8ikjicUmcbU7zJmAjmqutG/w==", "dev": true, - "license": "MIT", "dependencies": { "@types/fs-extra": "^8.0.0", "debug": "^4.0.0", @@ -4768,8 +3483,9 @@ }, "node_modules/@ionic/utils-network": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-network/-/utils-network-2.1.5.tgz", + "integrity": "sha512-HUQ1Ec4Mh2MXzzKdbbbDS6xYKwpFJ2XRY7SYXbaZT8+jiNahfHbsOfe62/p8bk41Yil7E9EagzGC2JvIFJh01w==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.0.0", "tslib": "^2.0.1" @@ -4780,8 +3496,9 @@ }, "node_modules/@ionic/utils-object": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.5.tgz", + "integrity": "sha512-XnYNSwfewUqxq+yjER1hxTKggftpNjFLJH0s37jcrNDwbzmbpFTQTVAp4ikNK4rd9DOebX/jbeZb8jfD86IYxw==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.0.0", "tslib": "^2.0.1" @@ -4792,8 +3509,9 @@ }, "node_modules/@ionic/utils-process": { "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.10.tgz", + "integrity": "sha512-mZ7JEowcuGQK+SKsJXi0liYTcXd2bNMR3nE0CyTROpMECUpJeAvvaBaPGZf5ERQUPeWBVuwqAqjUmIdxhz5bxw==", "dev": true, - "license": "MIT", "dependencies": { "@ionic/utils-object": "2.1.5", "@ionic/utils-terminal": "2.3.3", @@ -4808,8 +3526,9 @@ }, "node_modules/@ionic/utils-stream": { "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.5.tgz", + "integrity": "sha512-hkm46uHvEC05X/8PHgdJi4l4zv9VQDELZTM+Kz69odtO9zZYfnt8DkfXHJqJ+PxmtiE5mk/ehJWLnn/XAczTUw==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.0.0", "tslib": "^2.0.1" @@ -4820,8 +3539,9 @@ }, "node_modules/@ionic/utils-subprocess": { "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.11.tgz", + "integrity": "sha512-6zCDixNmZCbMCy5np8klSxOZF85kuDyzZSTTQKQP90ZtYNCcPYmuFSzaqDwApJT4r5L3MY3JrqK1gLkc6xiUPw==", "dev": true, - "license": "MIT", "dependencies": { "@ionic/utils-array": "2.1.5", "@ionic/utils-fs": "3.1.6", @@ -4838,8 +3558,9 @@ }, "node_modules/@ionic/utils-terminal": { "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.3.tgz", + "integrity": "sha512-RnuSfNZ5fLEyX3R5mtcMY97cGD1A0NVBbarsSQ6yMMfRJ5YHU7hHVyUfvZeClbqkBC/pAqI/rYJuXKCT9YeMCQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/slice-ansi": "^4.0.0", "debug": "^4.0.0", @@ -4857,8 +3578,9 @@ }, "node_modules/@isaacs/cliui": { "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "devOptional": true, - "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -4873,8 +3595,9 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -4884,8 +3607,9 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -4895,13 +3619,15 @@ }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "devOptional": true }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "devOptional": true, - "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -4916,8 +3642,9 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "devOptional": true, - "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -4930,8 +3657,9 @@ }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "devOptional": true, - "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -4946,8 +3674,9 @@ }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -4961,16 +3690,18 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -4981,16 +3712,17 @@ }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", - "dev": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -5002,24 +3734,25 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.1", - "dev": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.1.2", - "dev": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -5027,12 +3760,13 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.20", - "dev": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -5040,12 +3774,14 @@ }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true }, "node_modules/@maskito/angular": { "version": "1.9.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-1.9.0.tgz", + "integrity": "sha512-Wa/9nM9Nv0oieVZ6yxQNXfDRA4obFDR15xO16o1GKF8i9W1IdQQn+tuMRjkmx6HhJDN9+x3k8OTJ1f80BIrhjA==", "dependencies": { "tslib": "2.6.2" }, @@ -5059,18 +3795,21 @@ }, "node_modules/@maskito/core": { "version": "1.9.0", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@maskito/core/-/core-1.9.0.tgz", + "integrity": "sha512-WQIUrwkdIUg6PzAb4Apa0RjTPHB0EqZLc9/7kWCKVIixhkITRFXFg2BhiDVSRv0mIKVlAEJcOvvjHK5T3UaIig==" }, "node_modules/@maskito/kit": { "version": "1.9.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@maskito/kit/-/kit-1.9.0.tgz", + "integrity": "sha512-LNNgOJ0tAfrPoPehvoP+ZyYF9giOYL02sOMKyDC3IcqDNA8BAU0PARmS7TNsVEBpvSuJhU6xVt40nxJaONgUdw==", "peerDependencies": { "@maskito/core": "^1.9.0" } }, "node_modules/@materia-ui/ngx-monaco-editor": { "version": "6.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@materia-ui/ngx-monaco-editor/-/ngx-monaco-editor-6.0.0.tgz", + "integrity": "sha512-gTqNQjOGznZxOC0NlmKdKSGCJuTts8YmK4dsTQAGc5IgIV7cZdQWiW6AL742h0ruED6q0cAunEYjXT6jzHBoIQ==", "dependencies": { "tslib": "^2.0.0" }, @@ -5081,7 +3820,8 @@ }, "node_modules/@ng-web-apis/common": { "version": "3.0.6", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@ng-web-apis/common/-/common-3.0.6.tgz", + "integrity": "sha512-ral+lzGpFS3aOCFB5DcHOI4lZhhp8GH4BnjSbngH2Xk8J0FKYdxRzvcPQVy7hS+TPUu0tW9uFVp6cC7odu3iyQ==", "dependencies": { "tslib": "^2.2.0" }, @@ -5093,7 +3833,8 @@ }, "node_modules/@ng-web-apis/intersection-observer": { "version": "3.1.6", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@ng-web-apis/intersection-observer/-/intersection-observer-3.1.6.tgz", + "integrity": "sha512-Pzk0ycnYpq+EUf60kz+/A7nvCmhYzThc4ArwONwZzJqRF5xOS97CVWObs8hesorXxQdqlsrDNiu+JWuGxEvpzQ==", "dependencies": { "tslib": "^2.2.0" }, @@ -5104,7 +3845,8 @@ }, "node_modules/@ng-web-apis/mutation-observer": { "version": "3.0.6", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-3.0.6.tgz", + "integrity": "sha512-UW1qoUi2whH0uWkVz5qpdYCLs1u2T0E0QoCMQKZfLEkBpsWRTkT0PTCa9WWX/BhehaSPg23nZZm8BEixd6PI9w==", "dependencies": { "tslib": "^2.2.0" }, @@ -5115,7 +3857,8 @@ }, "node_modules/@ng-web-apis/resize-observer": { "version": "3.0.6", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@ng-web-apis/resize-observer/-/resize-observer-3.0.6.tgz", + "integrity": "sha512-QdGYdEdC0AzFonLfNOnyYyeCwnvK9jlskoeefvJN3Yyvds3ivBrrTjpeDOdiLsQpCPBp9/673imgq7355vkQow==", "dependencies": { "tslib": "^2.2.0" }, @@ -5126,8 +3869,9 @@ }, "node_modules/@ngtools/webpack": { "version": "16.2.10", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.10.tgz", + "integrity": "sha512-XAVn59zP3ztuKDtw92Xc9+64RK4u4c9g8y5GgtjIWeOwgNXl8bYhAo3uTZzrSrOu96DFZGjsmghFab/7/C2pDg==", "dev": true, - "license": "MIT", "engines": { "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", @@ -5141,8 +3885,8 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -5153,16 +3897,16 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -5173,8 +3917,9 @@ }, "node_modules/@npmcli/fs": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", "devOptional": true, - "license": "ISC", "dependencies": { "semver": "^7.3.5" }, @@ -5184,8 +3929,9 @@ }, "node_modules/@npmcli/git": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", "devOptional": true, - "license": "ISC", "dependencies": { "@npmcli/promise-spawn": "^6.0.0", "lru-cache": "^7.4.4", @@ -5202,16 +3948,18 @@ }, "node_modules/@npmcli/git/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "devOptional": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/@npmcli/git/node_modules/which": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "devOptional": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -5224,8 +3972,9 @@ }, "node_modules/@npmcli/installed-package-contents": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", "devOptional": true, - "license": "ISC", "dependencies": { "npm-bundled": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" @@ -5239,8 +3988,10 @@ }, "node_modules/@npmcli/move-file": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", "devOptional": true, - "license": "MIT", "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" @@ -5251,16 +4002,18 @@ }, "node_modules/@npmcli/node-gyp": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", "devOptional": true, - "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/promise-spawn": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", "devOptional": true, - "license": "ISC", "dependencies": { "which": "^3.0.0" }, @@ -5270,8 +4023,9 @@ }, "node_modules/@npmcli/promise-spawn/node_modules/which": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "devOptional": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -5284,8 +4038,9 @@ }, "node_modules/@npmcli/run-script": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", "devOptional": true, - "license": "ISC", "dependencies": { "@npmcli/node-gyp": "^3.0.0", "@npmcli/promise-spawn": "^6.0.0", @@ -5299,8 +4054,9 @@ }, "node_modules/@npmcli/run-script/node_modules/which": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "devOptional": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -5313,22 +4069,25 @@ }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": ">=14" } }, "node_modules/@polka/url": { - "version": "1.0.0-next.23", - "dev": true, - "license": "MIT" + "version": "1.0.0-next.24", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz", + "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==", + "dev": true }, "node_modules/@rollup/plugin-json": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.0.1.tgz", + "integrity": "sha512-RgVfl5hWMkxN1h/uZj8FVESvPuBJ/uf6ly6GTj0GONnkfoBN5KC0MSz+PN2OLDgYXMhtG0mWpTrkiOjoxAIevw==", "dev": true, - "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1" }, @@ -5346,8 +4105,9 @@ }, "node_modules/@rollup/plugin-node-resolve": { "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", + "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", "dev": true, - "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", @@ -5369,9 +4129,10 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.0.5", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", @@ -5391,12 +4152,14 @@ }, "node_modules/@rollup/pluginutils/node_modules/@types/estree": { "version": "1.0.5", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true }, "node_modules/@schematics/angular": { "version": "16.2.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.10.tgz", + "integrity": "sha512-PXmoswvN7qknTsXDmEvhZ9UG+awwWnQ/1Jd/eqqQx08iAaAT81OsXj1bN7eSs6tEGBKGjPb6q2xzuiECAdymzg==", "dependencies": { "@angular-devkit/core": "16.2.10", "@angular-devkit/schematics": "16.2.10", @@ -5410,8 +4173,9 @@ }, "node_modules/@sigstore/bundle": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", + "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", "devOptional": true, - "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.2.0" }, @@ -5421,16 +4185,18 @@ }, "node_modules/@sigstore/protobuf-specs": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", + "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", "devOptional": true, - "license": "Apache-2.0", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@sigstore/sign": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", + "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", "devOptional": true, - "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^1.1.0", "@sigstore/protobuf-specs": "^0.2.0", @@ -5442,16 +4208,18 @@ }, "node_modules/@sigstore/sign/node_modules/@tootallnate/once": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "devOptional": true, - "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/@sigstore/sign/node_modules/cacache": { "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "devOptional": true, - "license": "ISC", "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", @@ -5472,8 +4240,9 @@ }, "node_modules/@sigstore/sign/node_modules/http-proxy-agent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "devOptional": true, - "license": "MIT", "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -5485,16 +4254,18 @@ }, "node_modules/@sigstore/sign/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "devOptional": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/@sigstore/sign/node_modules/make-fetch-happen": { "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "devOptional": true, - "license": "ISC", "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^17.0.0", @@ -5518,16 +4289,42 @@ }, "node_modules/@sigstore/sign/node_modules/make-fetch-happen/node_modules/minipass": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sigstore/sign/node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "devOptional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@sigstore/sign/node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "devOptional": true, - "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { "node": ">=8" } }, "node_modules/@sigstore/sign/node_modules/minipass-fetch": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "devOptional": true, - "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", @@ -5540,10 +4337,17 @@ "encoding": "^0.1.13" } }, + "node_modules/@sigstore/sign/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + }, "node_modules/@sigstore/tuf": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", + "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", "devOptional": true, - "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.2.0", "tuf-js": "^1.1.7" @@ -5553,15 +4357,19 @@ } }, "node_modules/@start9labs/argon2": { - "version": "0.1.0" + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@start9labs/argon2/-/argon2-0.1.0.tgz", + "integrity": "sha512-Ng9Ibuj0p2drQRW013AkUz6TqWysXw/9OyoEoXQZL7kfac0LrxWIDj+xvg+orqQMxcvClWgzeQY/c+IgJtcevA==" }, "node_modules/@start9labs/emver": { "version": "0.1.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@start9labs/emver/-/emver-0.1.5.tgz", + "integrity": "sha512-1dhiG03VkfEwSLx/JPKVms6srAbYFQgwfSGhwpUKMDliMXuAHGVaueStmqzVxn3JpH/HEVz0QW8w/PXHqjdiIg==" }, "node_modules/@start9labs/start-sdk": { "version": "0.4.0-rev0.lib0.rc8.beta2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@start9labs/start-sdk/-/start-sdk-0.4.0-rev0.lib0.rc8.beta2.tgz", + "integrity": "sha512-2jo8gF/lOvzuOKKntPuQyejwDAY6Uxaz4KKqm2awoYN6Ycn1TrYud0KAdSjKFYDCKmJI/guQNej0XGVJe0B1XQ==", "dependencies": { "@iarna/toml": "^2.2.5", "isomorphic-fetch": "^3.0.0", @@ -5571,7 +4379,8 @@ }, "node_modules/@stencil/core": { "version": "2.22.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.22.3.tgz", + "integrity": "sha512-kmVA0M/HojwsfkeHsifvHVIYe4l5tin7J5+DLgtl8h6WWfiMClND5K3ifCXXI2ETDNKiEk21p6jql3Fx9o2rng==", "bin": { "stencil": "bin/stencil" }, @@ -5581,64 +4390,68 @@ } }, "node_modules/@taiga-ui/addon-charts": { - "version": "3.56.0", - "license": "Apache-2.0", + "version": "3.57.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.57.0.tgz", + "integrity": "sha512-/x/yVHafSmNA3GSR9cSo6KSkzDNzDGew0JCD5cCNOb6vRZOe1QiXUQwMHvdj9eZlrjZzbV67eiV13NNvWolGwg==", "dependencies": { - "tslib": ">=2.6.2" + "tslib": "2.6.2" }, "peerDependencies": { "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", - "@ng-web-apis/common": ">=3.0.6", - "@taiga-ui/cdk": ">=3.56.0", - "@taiga-ui/core": ">=3.56.0", - "@tinkoff/ng-polymorpheus": ">=4.3.0" + "@ng-web-apis/common": "3.0.6", + "@taiga-ui/cdk": ">=3.57.0", + "@taiga-ui/core": ">=3.57.0", + "@tinkoff/ng-polymorpheus": "4.3.0" } }, "node_modules/@taiga-ui/addon-commerce": { - "version": "3.56.0", - "license": "Apache-2.0", + "version": "3.57.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-commerce/-/addon-commerce-3.57.0.tgz", + "integrity": "sha512-9msjwr/8tzlmbcv6MDxZTYvW9+sbURAq2Olrs4zJhHvw69tA3XYt2MCrDYUSrej/oj5jE2GFjtyio7wqQviLzA==", "peer": true, "dependencies": { - "tslib": ">=2.6.2" + "tslib": "2.6.2" }, "peerDependencies": { "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@angular/forms": ">=12.0.0", - "@maskito/angular": ">=1.3.0", - "@maskito/core": ">=1.3.0", - "@maskito/kit": ">=1.3.0", - "@ng-web-apis/common": ">=3.0.6", - "@taiga-ui/cdk": ">=3.56.0", - "@taiga-ui/core": ">=3.56.0", - "@taiga-ui/i18n": ">=3.56.0", - "@taiga-ui/kit": ">=3.56.0", - "@tinkoff/ng-polymorpheus": ">=4.3.0", + "@maskito/angular": "1.9.0", + "@maskito/core": "1.9.0", + "@maskito/kit": "1.9.0", + "@ng-web-apis/common": "3.0.6", + "@taiga-ui/cdk": ">=3.57.0", + "@taiga-ui/core": ">=3.57.0", + "@taiga-ui/i18n": ">=3.57.0", + "@taiga-ui/kit": ">=3.57.0", + "@tinkoff/ng-polymorpheus": "4.3.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/addon-mobile": { - "version": "3.56.0", - "license": "Apache-2.0", + "version": "3.57.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-mobile/-/addon-mobile-3.57.0.tgz", + "integrity": "sha512-fxtmOqf8qcWbDeKKHukP+Iw0Ida8onKlg0L4UkeqF5AHT1f9QnpDtIQxyEUw4DXwUQdFhMT+64FWeA4acwa+kA==", "dependencies": { - "tslib": ">=2.6.2" + "tslib": "2.6.2" }, "peerDependencies": { "@angular/cdk": ">=12.0.0", "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", - "@ng-web-apis/common": ">=3.0.6", - "@taiga-ui/cdk": ">=3.56.0", - "@taiga-ui/core": ">=3.56.0", - "@taiga-ui/kit": ">=3.56.0", - "@tinkoff/ng-polymorpheus": ">=4.3.0", + "@ng-web-apis/common": "3.0.6", + "@taiga-ui/cdk": ">=3.57.0", + "@taiga-ui/core": ">=3.57.0", + "@taiga-ui/kit": ">=3.57.0", + "@tinkoff/ng-polymorpheus": "4.3.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/cdk": { - "version": "3.56.0", - "license": "Apache-2.0", + "version": "3.57.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.57.0.tgz", + "integrity": "sha512-igfgPZh7sUaElX4dehDPkbPL66LFc6qmirfEQ6f2deNnezYm4EZTTIdHebU1ibiKTqWBxWVTHKC2pQ3nxhwkNA==", "dependencies": { "@ng-web-apis/common": "3.0.6", "@ng-web-apis/mutation-observer": "3.0.6", @@ -5659,12 +4472,19 @@ "rxjs": ">=6.0.0" } }, + "node_modules/@taiga-ui/cdk/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "optional": true + }, "node_modules/@taiga-ui/core": { - "version": "3.56.0", - "license": "Apache-2.0", + "version": "3.57.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.57.0.tgz", + "integrity": "sha512-RUO//9C9+CdEPX1nV0hKRhKu3vmuAx+miszZHv5LAITK3jpTJKpd2jQ2Ib2z5O20v5vKrwkJ0DawT7EWU2v2TA==", "dependencies": { - "@taiga-ui/i18n": "^3.56.0", - "tslib": ">=2.6.2" + "@taiga-ui/i18n": "^3.57.0", + "tslib": "2.6.2" }, "peerDependencies": { "@angular/animations": ">=12.0.0", @@ -5673,90 +4493,97 @@ "@angular/forms": ">=12.0.0", "@angular/platform-browser": ">=12.0.0", "@angular/router": ">=12.0.0", - "@ng-web-apis/common": ">=3.0.6", - "@ng-web-apis/mutation-observer": ">=3.0.6", - "@taiga-ui/cdk": ">=3.56.0", - "@taiga-ui/i18n": ">=3.56.0", - "@tinkoff/ng-event-plugins": ">=3.1.0", - "@tinkoff/ng-polymorpheus": ">=4.3.0", + "@ng-web-apis/common": "3.0.6", + "@ng-web-apis/mutation-observer": "3.0.6", + "@taiga-ui/cdk": ">=3.57.0", + "@taiga-ui/i18n": ">=3.57.0", + "@tinkoff/ng-event-plugins": "3.1.0", + "@tinkoff/ng-polymorpheus": "4.3.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/experimental": { - "version": "3.56.0", - "license": "Apache-2.0", + "version": "3.57.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/experimental/-/experimental-3.57.0.tgz", + "integrity": "sha512-A0u/Cn0tHUjl6sTSfF6G9YvzuEJafBoVbHuDpw1mnSOw/TkWLXpkoYzeyJ6U9+nBIFBOSl4o+14olrYvsUg9CA==", "dependencies": { - "tslib": ">=2.6.2" + "tslib": "2.6.2" }, "peerDependencies": { "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", - "@taiga-ui/addon-commerce": ">=3.56.0", - "@taiga-ui/cdk": ">=3.56.0", - "@taiga-ui/core": ">=3.56.0", - "@taiga-ui/kit": ">=3.56.0", - "@tinkoff/ng-polymorpheus": ">=4.3.0", + "@taiga-ui/addon-commerce": ">=3.57.0", + "@taiga-ui/cdk": ">=3.57.0", + "@taiga-ui/core": ">=3.57.0", + "@taiga-ui/kit": ">=3.57.0", + "@tinkoff/ng-polymorpheus": "4.3.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/i18n": { - "version": "3.56.0", - "license": "Apache-2.0", + "version": "3.57.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.57.0.tgz", + "integrity": "sha512-FhE3eMD5g+i0/SbRgq4zoA7pBVY1mw4/gwndOJvCFkcWhjYxOJXJ4g/sjTyQmZ4QXmONM0OeIOMBxuMMCeJkGQ==", "dependencies": { - "tslib": ">=2.6.2" + "tslib": "2.6.2" }, "peerDependencies": { "@angular/core": ">=12.0.0", - "@ng-web-apis/common": ">=3.0.6", + "@ng-web-apis/common": "3.0.6", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/icons": { - "version": "3.56.0", - "license": "Apache-2.0", + "version": "3.57.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.57.0.tgz", + "integrity": "sha512-uXch0AX8DQMCrv2ldQIYmUUjMmhP2tgOLxX08GrPZCWsz6zHq8stgUJR6kgvZYwO1JZSFlwvCgv/32MoDEdI3w==", "dependencies": { - "tslib": ">=2.6.2" + "tslib": "2.6.2" }, "peerDependencies": { - "@taiga-ui/cdk": ">=3.56.0" + "@taiga-ui/cdk": ">=3.57.0" } }, "node_modules/@taiga-ui/kit": { - "version": "3.56.0", - "license": "Apache-2.0", + "version": "3.57.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.57.0.tgz", + "integrity": "sha512-vZNMKlPku5E1wCiPdRV3GbNKba4molyd6F2Zc4EMJvHAlWybFpVPQOw67Z7VsSLGwWpzZXBC+5M5Ov3UNOUSJQ==", "dependencies": { "@maskito/angular": "1.9.0", "@maskito/core": "1.9.0", "@maskito/kit": "1.9.0", "@ng-web-apis/intersection-observer": "3.1.6", "text-mask-core": "5.1.2", - "tslib": ">=2.6.2" + "tslib": "2.6.2" }, "peerDependencies": { "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@angular/forms": ">=12.0.0", "@angular/router": ">=12.0.0", - "@ng-web-apis/common": ">=3.0.6", - "@ng-web-apis/mutation-observer": ">=3.0.6", - "@ng-web-apis/resize-observer": ">=3.0.6", - "@taiga-ui/cdk": ">=3.56.0", - "@taiga-ui/core": ">=3.56.0", - "@taiga-ui/i18n": ">=3.56.0", - "@tinkoff/ng-polymorpheus": ">=4.3.0", + "@ng-web-apis/common": "3.0.6", + "@ng-web-apis/mutation-observer": "3.0.6", + "@ng-web-apis/resize-observer": "3.0.6", + "@taiga-ui/cdk": ">=3.57.0", + "@taiga-ui/core": ">=3.57.0", + "@taiga-ui/i18n": ">=3.57.0", + "@tinkoff/ng-polymorpheus": "4.3.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/styles": { - "version": "3.56.0", + "version": "3.57.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/styles/-/styles-3.57.0.tgz", + "integrity": "sha512-jxSAZHL+QrjTHH5tEQ2EJXmNpRvKUN/8fHh5Fw+O71Y50I9IENN2CVXdB01YmjtNvn0tQE2sUy1RFausIQLyBA==", "peerDependencies": { - "@taiga-ui/cdk": ">=3.56.0", - "tslib": ">=2.6.2" + "@taiga-ui/cdk": ">=3.57.0", + "tslib": "2.6.2" } }, "node_modules/@tinkoff/ng-dompurify": { "version": "4.0.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@tinkoff/ng-dompurify/-/ng-dompurify-4.0.0.tgz", + "integrity": "sha512-BjKUweWLrOx8UOZw+Tl+Dae5keYuSbeMkppcXQdsvwASMrPfmP7d3Q206Q6HDqOV2WnpnFqGUB95IMbLAeRRuw==", "dependencies": { "tslib": "^2.0.0" }, @@ -5769,7 +4596,8 @@ }, "node_modules/@tinkoff/ng-event-plugins": { "version": "3.1.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@tinkoff/ng-event-plugins/-/ng-event-plugins-3.1.0.tgz", + "integrity": "sha512-HqLBes/3MV469L1S08uBqmPUIwihx43py+8Lee1Me9jMFM1ZMuAC3NcS/njUFI1OzXU2kIPyUDEw2jmVbg8mWQ==", "dependencies": { "tslib": "^2.2.0" }, @@ -5781,7 +4609,8 @@ }, "node_modules/@tinkoff/ng-polymorpheus": { "version": "4.3.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@tinkoff/ng-polymorpheus/-/ng-polymorpheus-4.3.0.tgz", + "integrity": "sha512-Ck/XCLuBwlUgvK22PxTlLTZhGG6I32kLqLYtDQh8N/QZZhs40+hb/78/ElFGzD567CCvrzNnueFkaOoXhuEVrw==", "dependencies": { "tslib": "2.6.2" }, @@ -5792,15 +4621,17 @@ }, "node_modules/@tootallnate/once": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/@ts-morph/common": { "version": "0.21.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.21.0.tgz", + "integrity": "sha512-ES110Mmne5Vi4ypUKrtVQfXFDtCsDXiUiGxF6ILVlE90dDD4fdpC1LSjydl/ml7xJWKSDZwUYD2zkOePMSrPBA==", "optional": true, "dependencies": { "fast-glob": "^3.2.12", @@ -5811,7 +4642,8 @@ }, "node_modules/@ts-morph/common/node_modules/minimatch": { "version": "7.4.6", - "license": "ISC", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", "optional": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -5825,7 +4657,8 @@ }, "node_modules/@ts-morph/common/node_modules/mkdirp": { "version": "2.1.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", + "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", "optional": true, "bin": { "mkdirp": "dist/cjs/src/bin.js" @@ -5839,36 +4672,42 @@ }, "node_modules/@tsconfig/node10": { "version": "1.0.9", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "devOptional": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "devOptional": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "devOptional": true }, "node_modules/@tsconfig/node16": { "version": "1.0.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "devOptional": true }, "node_modules/@tufjs/canonical-json": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", "devOptional": true, - "license": "MIT", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@tufjs/models": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", "devOptional": true, - "license": "MIT", "dependencies": { "@tufjs/canonical-json": "1.0.0", "minimatch": "^9.0.0" @@ -5879,8 +4718,9 @@ }, "node_modules/@types/body-parser": { "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, - "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -5888,24 +4728,27 @@ }, "node_modules/@types/bonjour": { "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect": { "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.3", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dev": true, - "license": "MIT", "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" @@ -5913,15 +4756,17 @@ }, "node_modules/@types/dompurify": { "version": "2.4.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-2.4.0.tgz", + "integrity": "sha512-IDBwO5IZhrKvHFUl+clZxgf3hn2b/lU6H1KaBShPkQyGJUQ0xwebezIPSuiyGwfz1UzJWQl4M7BDxtHtCCPlTg==", "dependencies": { "@types/trusted-types": "*" } }, "node_modules/@types/eslint": { - "version": "8.44.7", + "version": "8.44.8", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.8.tgz", + "integrity": "sha512-4K8GavROwhrYl2QXDXm0Rv9epkA8GBFu0EI+XrrnnuCl7u8CWBRusX7fXJfanhZTDWSAL24gDI/UqXyUM0Injw==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -5929,8 +4774,9 @@ }, "node_modules/@types/eslint-scope": { "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, - "license": "MIT", "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -5938,13 +4784,15 @@ }, "node_modules/@types/estree": { "version": "0.0.51", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true }, "node_modules/@types/express": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -5954,8 +4802,9 @@ }, "node_modules/@types/express-serve-static-core": { "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -5965,120 +4814,140 @@ }, "node_modules/@types/fs-extra": { "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", + "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/http-errors": { "version": "2.0.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true }, "node_modules/@types/http-proxy": { "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/js-yaml": { "version": "4.0.9", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true }, "node_modules/@types/json-schema": { "version": "7.0.15", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true }, "node_modules/@types/luxon": { - "version": "3.3.4", - "license": "MIT" + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.7.tgz", + "integrity": "sha512-gKc9P2d4g5uYwmy4s/MO/yOVPmvHyvzka1YH6i5dM03UrFofHSmgc0D0ymbDRStFWHusk6cwwF6nhLm/ckBbbQ==" }, "node_modules/@types/marked": { "version": "4.3.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.2.tgz", + "integrity": "sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==", + "dev": true }, "node_modules/@types/mime": { "version": "1.3.5", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true }, "node_modules/@types/minimatch": { "version": "3.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "optional": true }, "node_modules/@types/mustache": { "version": "4.2.5", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/mustache/-/mustache-4.2.5.tgz", + "integrity": "sha512-PLwiVvTBg59tGFL/8VpcGvqOu3L4OuveNvPi0EYbWchRdEVP++yRUXJPFl+CApKEq13017/4Nf7aQ5lTtHUNsA==", + "dev": true }, "node_modules/@types/node": { - "version": "18.18.9", - "dev": true, - "license": "MIT", + "version": "18.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.3.tgz", + "integrity": "sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg==", + "devOptional": true, "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/node-forge": { - "version": "1.3.9", + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.10.tgz", + "integrity": "sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/node-jose": { "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@types/node-jose/-/node-jose-1.1.13.tgz", + "integrity": "sha512-QjMd4yhwy1EvSToQn0YI3cD29YhyfxFwj7NecuymjLys2/P0FwxWnkgBlFxCai6Y3aBCe7rbwmqwJJawxlgcXw==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/parse-json": { "version": "4.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "dev": true }, "node_modules/@types/pbkdf2": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/qs": { "version": "6.9.10", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", + "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", + "dev": true }, "node_modules/@types/range-parser": { "version": "1.2.7", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true }, "node_modules/@types/resolve": { "version": "1.20.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true }, "node_modules/@types/retry": { "version": "0.12.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true }, "node_modules/@types/send": { "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, - "license": "MIT", "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -6086,16 +4955,18 @@ }, "node_modules/@types/serve-index": { "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, - "license": "MIT", "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/mime": "*", @@ -6104,38 +4975,44 @@ }, "node_modules/@types/slice-ansi": { "version": "4.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", + "dev": true }, "node_modules/@types/sockjs": { "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/trusted-types": { - "version": "2.0.6", - "license": "MIT" + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" }, "node_modules/@types/uuid": { "version": "8.3.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "dev": true }, "node_modules/@types/ws": { - "version": "8.5.9", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@vitejs/plugin-basic-ssl": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", + "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.6.0" }, @@ -6145,8 +5022,9 @@ }, "node_modules/@webassemblyjs/ast": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -6154,23 +5032,27 @@ }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -6179,13 +5061,15 @@ }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -6195,29 +5079,33 @@ }, "node_modules/@webassemblyjs/ieee754": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, - "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { "version": "1.11.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -6231,8 +5119,9 @@ }, "node_modules/@webassemblyjs/wasm-gen": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -6243,8 +5132,9 @@ }, "node_modules/@webassemblyjs/wasm-opt": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -6254,8 +5144,9 @@ }, "node_modules/@webassemblyjs/wasm-parser": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -6267,8 +5158,9 @@ }, "node_modules/@webassemblyjs/wast-printer": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" @@ -6276,8 +5168,10 @@ }, "node_modules/@wessberg/ts-evaluator": { "version": "0.0.27", + "resolved": "https://registry.npmjs.org/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz", + "integrity": "sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==", + "deprecated": "this package has been renamed to ts-evaluator. Please install ts-evaluator instead", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.1.0", "jsdom": "^16.4.0", @@ -6297,8 +5191,9 @@ }, "node_modules/@wessberg/ts-evaluator/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -6311,8 +5206,9 @@ }, "node_modules/@wessberg/ts-evaluator/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6326,8 +5222,9 @@ }, "node_modules/@wessberg/ts-evaluator/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -6337,21 +5234,24 @@ }, "node_modules/@wessberg/ts-evaluator/node_modules/color-name": { "version": "1.1.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/@wessberg/ts-evaluator/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@wessberg/ts-evaluator/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -6361,33 +5261,40 @@ }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true }, "node_modules/@xtuc/long": { "version": "4.2.2", - "dev": true, - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", - "devOptional": true, - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "devOptional": true }, "node_modules/abab": { "version": "2.0.6", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true }, "node_modules/abbrev": { "version": "1.1.1", - "devOptional": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "devOptional": true }, "node_modules/accepts": { "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, - "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -6398,8 +5305,9 @@ }, "node_modules/acorn": { "version": "8.11.2", - "dev": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "devOptional": true, "bin": { "acorn": "bin/acorn" }, @@ -6409,8 +5317,9 @@ }, "node_modules/acorn-globals": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dev": true, - "license": "MIT", "dependencies": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" @@ -6418,8 +5327,9 @@ }, "node_modules/acorn-globals/node_modules/acorn": { "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -6429,24 +5339,27 @@ }, "node_modules/acorn-import-assertions": { "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, - "license": "MIT", "peerDependencies": { "acorn": "^8" } }, "node_modules/acorn-walk": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/adjust-sourcemap-loader": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", "dev": true, - "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "regex-parser": "^2.2.11" @@ -6457,8 +5370,9 @@ }, "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, - "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -6470,8 +5384,9 @@ }, "node_modules/agent-base": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "devOptional": true, - "license": "MIT", "dependencies": { "debug": "4" }, @@ -6481,8 +5396,9 @@ }, "node_modules/agentkeepalive": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", "devOptional": true, - "license": "MIT", "dependencies": { "humanize-ms": "^1.2.1" }, @@ -6492,8 +5408,9 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "devOptional": true, - "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -6504,7 +5421,8 @@ }, "node_modules/ajv": { "version": "8.12.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -6518,7 +5436,8 @@ }, "node_modules/ajv-formats": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dependencies": { "ajv": "^8.0.0" }, @@ -6533,8 +5452,9 @@ }, "node_modules/ajv-keywords": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -6544,16 +5464,18 @@ }, "node_modules/ansi-colors": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/ansi-escapes": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "devOptional": true, - "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -6566,26 +5488,29 @@ }, "node_modules/ansi-html-community": { "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true, "engines": [ "node >= 0.8.0" ], - "license": "Apache-2.0", "bin": { "ansi-html": "bin/ansi-html" } }, "node_modules/ansi-regex": { "version": "5.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -6595,7 +5520,8 @@ }, "node_modules/ansi-to-html": { "version": "0.7.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.7.2.tgz", + "integrity": "sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==", "dependencies": { "entities": "^2.2.0" }, @@ -6606,10 +5532,15 @@ "node": ">=8.0.0" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, "node_modules/anymatch": { "version": "3.1.3", - "devOptional": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -6620,13 +5551,15 @@ }, "node_modules/aproba": { "version": "2.0.0", - "devOptional": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "devOptional": true }, "node_modules/are-we-there-yet": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", "devOptional": true, - "license": "ISC", "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -6636,17 +5569,19 @@ } }, "node_modules/arg": { - "version": "4.1.3", - "dev": true, - "license": "MIT" + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "node_modules/argparse": { "version": "2.0.1", - "license": "Python-2.0" + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/array-differ": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", "optional": true, "engines": { "node": ">=8" @@ -6654,12 +5589,14 @@ }, "node_modules/array-flatten": { "version": "2.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true }, "node_modules/array-union": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "optional": true, "engines": { "node": ">=8" @@ -6667,7 +5604,8 @@ }, "node_modules/arrify": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "optional": true, "engines": { "node": ">=8" @@ -6675,8 +5613,9 @@ }, "node_modules/ast-types": { "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", "dev": true, - "license": "MIT", "dependencies": { "tslib": "^2.0.1" }, @@ -6686,27 +5625,32 @@ }, "node_modules/astral-regex": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/asynckit": { "version": "0.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true }, "node_modules/at-least-node": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, - "license": "ISC", "engines": { "node": ">= 4.0.0" } }, "node_modules/autoprefixer": { - "version": "10.4.14", + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", "dev": true, "funding": [ { @@ -6716,13 +5660,16 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "fraction.js": "^4.2.0", + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -6739,8 +5686,9 @@ }, "node_modules/babel-loader": { "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", "dev": true, - "license": "MIT", "dependencies": { "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" @@ -6755,8 +5703,9 @@ }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -6770,8 +5719,9 @@ }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", + "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", "dev": true, - "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.6", "@babel/helper-define-polyfill-provider": "^0.4.3", @@ -6783,16 +5733,18 @@ }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.8.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", + "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.4.3", "core-js-compat": "^3.33.1" @@ -6803,8 +5755,9 @@ }, "node_modules/babel-plugin-polyfill-regenerator": { "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", + "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.4.3" }, @@ -6814,11 +5767,13 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base64-js": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -6832,40 +5787,43 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/base64url": { "version": "3.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", "engines": { "node": ">=6.0.0" } }, "node_modules/batch": { "version": "0.6.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true }, "node_modules/big.js": { "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true, - "license": "MIT", "engines": { "node": "*" } }, "node_modules/binary-extensions": { "version": "2.2.0", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "engines": { "node": ">=8" } }, "node_modules/bl": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -6874,6 +5832,8 @@ }, "node_modules/bl/node_modules/buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -6888,7 +5848,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -6896,8 +5855,9 @@ }, "node_modules/body-parser": { "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dev": true, - "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -6919,21 +5879,24 @@ }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/body-parser/node_modules/qs": { "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, @@ -6946,8 +5909,9 @@ }, "node_modules/body-parser/node_modules/raw-body": { "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, - "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -6960,8 +5924,9 @@ }, "node_modules/bonjour-service": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", "dev": true, - "license": "MIT", "dependencies": { "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", @@ -6971,21 +5936,23 @@ }, "node_modules/boolbase": { "version": "1.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true }, "node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "devOptional": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/braces": { "version": "3.0.2", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { "fill-range": "^7.0.1" }, @@ -6995,11 +5962,14 @@ }, "node_modules/browser-process-hrtime": { "version": "1.0.0", - "dev": true, - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true }, "node_modules/browserslist": { - "version": "4.22.1", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", "dev": true, "funding": [ { @@ -7015,11 +5985,10 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, "bin": { @@ -7031,6 +6000,8 @@ }, "node_modules/buffer": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -7045,7 +6016,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -7053,13 +6023,15 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true }, "node_modules/builtin-modules": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" }, @@ -7069,31 +6041,34 @@ }, "node_modules/builtins": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "devOptional": true, - "license": "MIT", "dependencies": { "semver": "^7.0.0" } }, "node_modules/bytes": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/cacache": { - "version": "18.0.0", + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.1.tgz", + "integrity": "sha512-g4Uf2CFZPaxtJKre6qr4zqLDOOPU7bNVhWjlNhvzc51xaTOx2noMOLhfFkTAqwtrAZAKQUuDfyjitzilpA8WsQ==", "dev": true, - "license": "ISC", "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^10.0.1", "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", + "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", @@ -7106,17 +6081,19 @@ } }, "node_modules/cacache/node_modules/lru-cache": { - "version": "10.0.1", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", "dev": true, - "license": "ISC", "engines": { "node": "14 || >=16.14" } }, "node_modules/call-bind": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, - "license": "MIT", "dependencies": { "function-bind": "^1.1.2", "get-intrinsic": "^1.2.1", @@ -7128,21 +6105,33 @@ }, "node_modules/callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camelcase": { "version": "5.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "engines": { "node": ">=6" } }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, "node_modules/caniuse-lite": { - "version": "1.0.30001561", + "version": "1.0.30001566", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz", + "integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==", "dev": true, "funding": [ { @@ -7157,25 +6146,27 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/cbor": { "name": "@jprochazk/cbor", "version": "0.4.9", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@jprochazk/cbor/-/cbor-0.4.9.tgz", + "integrity": "sha512-FWNnkOtWrFOLXKG2nzOHR/EnCCGZZPvatAvWXDmkTDxgjj9JHDK3DkMUHcFCY3a9weylMCSO/nLOUM170NAO0Q==" }, "node_modules/cbor-web": { "version": "8.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cbor-web/-/cbor-web-8.1.0.tgz", + "integrity": "sha512-2hWHHMVrfffgoEmsAUh8vCxHoLa1vgodtC73+C5cSarkJlwTapnqAzcHINlP6Ej0DXuP4OmmJ9LF+JaNM5Lj/g==", "engines": { "node": ">=12.19" } }, "node_modules/chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -7187,19 +6178,20 @@ }, "node_modules/chardet": { "version": "0.7.0", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "devOptional": true }, "node_modules/chokidar": { "version": "3.5.3", - "devOptional": true, + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], - "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -7218,28 +6210,32 @@ }, "node_modules/chownr": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "devOptional": true, - "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/chrome-trace-event": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.0" } }, "node_modules/ci-info": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true }, "node_modules/cipher-base": { "version": "1.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -7247,15 +6243,17 @@ }, "node_modules/clean-stack": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/cli-cursor": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -7264,8 +6262,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.9.1", - "license": "MIT", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "engines": { "node": ">=6" }, @@ -7275,8 +6274,9 @@ }, "node_modules/cli-truncate": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, - "license": "MIT", "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^5.0.0" @@ -7290,8 +6290,9 @@ }, "node_modules/cli-truncate/node_modules/ansi-regex": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -7301,8 +6302,9 @@ }, "node_modules/cli-truncate/node_modules/ansi-styles": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -7312,13 +6314,15 @@ }, "node_modules/cli-truncate/node_modules/emoji-regex": { "version": "9.2.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true }, "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -7328,8 +6332,9 @@ }, "node_modules/cli-truncate/node_modules/slice-ansi": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" @@ -7343,8 +6348,9 @@ }, "node_modules/cli-truncate/node_modules/string-width": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, - "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -7359,8 +6365,9 @@ }, "node_modules/cli-truncate/node_modules/strip-ansi": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -7373,16 +6380,18 @@ }, "node_modules/cli-width": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "devOptional": true, - "license": "ISC", "engines": { "node": ">= 10" } }, "node_modules/cliui": { "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "devOptional": true, - "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -7394,15 +6403,17 @@ }, "node_modules/clone": { "version": "1.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "engines": { "node": ">=0.8" } }, "node_modules/clone-deep": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, - "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -7414,8 +6425,9 @@ }, "node_modules/clone-deep/node_modules/is-plain-object": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, - "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -7425,39 +6437,45 @@ }, "node_modules/code-block-writer": { "version": "12.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-12.0.0.tgz", + "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==", "optional": true }, "node_modules/color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/color-name": { "version": "1.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "node_modules/color-support": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "devOptional": true, - "license": "ISC", "bin": { "color-support": "bin.js" } }, "node_modules/colorette": { "version": "2.0.20", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true }, "node_modules/combined-stream": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, - "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -7467,36 +6485,45 @@ }, "node_modules/commander": { "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=16" } }, "node_modules/common-path-prefix": { "version": "3.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true }, "node_modules/commondir": { "version": "1.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true }, "node_modules/compare-versions": { "version": "3.6.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true }, "node_modules/component-emitter": { - "version": "1.3.0", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", "dev": true, - "license": "MIT" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/compressible": { "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, - "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -7506,8 +6533,9 @@ }, "node_modules/compression": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, - "license": "MIT", "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -7523,52 +6551,59 @@ }, "node_modules/compression/node_modules/bytes": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/compression/node_modules/ms": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/compression/node_modules/safe-buffer": { "version": "5.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/concat-map": { "version": "0.0.1", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/console-control-strings": { "version": "1.1.0", - "devOptional": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "devOptional": true }, "node_modules/content-disposition": { "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, - "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -7578,39 +6613,45 @@ }, "node_modules/content-type": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { "version": "1.9.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true }, "node_modules/cookie": { "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { "version": "1.0.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true }, "node_modules/cookiejar": { "version": "2.1.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true }, "node_modules/copy-anything": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", "dev": true, - "license": "MIT", "dependencies": { "is-what": "^3.14.1" }, @@ -7620,8 +6661,9 @@ }, "node_modules/copy-webpack-plugin": { "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, - "license": "MIT", "dependencies": { "fast-glob": "^3.2.11", "glob-parent": "^6.0.1", @@ -7643,8 +6685,9 @@ }, "node_modules/copy-webpack-plugin/node_modules/glob-parent": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -7653,20 +6696,22 @@ } }, "node_modules/core-js": { - "version": "3.33.2", + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.34.0.tgz", + "integrity": "sha512-aDdvlDder8QmY91H88GzNi9EtQi2TjvQhpCX6B1v/dAZHU1AuLgHvRh54RiOerpEhEW46Tkf+vgAViB/CWC0ag==", "hasInstallScript": true, - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/core-js-compat": { - "version": "3.33.2", + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.34.0.tgz", + "integrity": "sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA==", "dev": true, - "license": "MIT", "dependencies": { - "browserslist": "^4.22.1" + "browserslist": "^4.22.2" }, "funding": { "type": "opencollective", @@ -7675,13 +6720,15 @@ }, "node_modules/core-util-is": { "version": "1.0.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true }, "node_modules/cosmiconfig": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dev": true, - "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -7695,15 +6742,17 @@ }, "node_modules/cosmiconfig/node_modules/yaml": { "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true, - "license": "ISC", "engines": { "node": ">= 6" } }, "node_modules/create-hash": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -7714,7 +6763,8 @@ }, "node_modules/create-hmac": { "version": "1.1.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -7726,13 +6776,15 @@ }, "node_modules/create-require": { "version": "1.1.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "devOptional": true }, "node_modules/critters": { "version": "0.0.20", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", + "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "chalk": "^4.1.0", "css-select": "^5.1.0", @@ -7745,8 +6797,9 @@ }, "node_modules/critters/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -7759,8 +6812,9 @@ }, "node_modules/critters/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -7774,8 +6828,9 @@ }, "node_modules/critters/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -7785,21 +6840,24 @@ }, "node_modules/critters/node_modules/color-name": { "version": "1.1.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/critters/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/critters/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -7809,23 +6867,26 @@ }, "node_modules/cron": { "version": "2.4.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cron/-/cron-2.4.4.tgz", + "integrity": "sha512-MHlPImXJj3K7x7lyUHjtKEOl69CSlTOWxS89jiFgNkzXfvhVjhMz/nc7/EIfN9vgooZp8XTtXJ1FREdmbyXOiQ==", "dependencies": { "@types/luxon": "~3.3.0", "luxon": "~3.3.0" } }, "node_modules/cronstrue": { - "version": "2.41.0", - "license": "MIT", + "version": "2.47.0", + "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.47.0.tgz", + "integrity": "sha512-fnFwJy7zslTEz6h7O7BkwgHNBvuuPmkhAYKqPDxK5mBQLz2nG08T9afbnjm+yrvcc/wxrd+otaVSnoXT9ulUOw==", "bin": { "cronstrue": "bin/cli.js" } }, "node_modules/cross-spawn": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "devOptional": true, - "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -7837,8 +6898,9 @@ }, "node_modules/css-loader": { "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", "dev": true, - "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.21", @@ -7862,8 +6924,9 @@ }, "node_modules/css-select": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", @@ -7877,8 +6940,9 @@ }, "node_modules/css-what": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -7888,8 +6952,8 @@ }, "node_modules/cssesc": { "version": "3.0.0", - "dev": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "bin": { "cssesc": "bin/cssesc" }, @@ -7899,13 +6963,15 @@ }, "node_modules/cssom": { "version": "0.4.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true }, "node_modules/cssstyle": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "dev": true, - "license": "MIT", "dependencies": { "cssom": "~0.3.6" }, @@ -7915,26 +6981,30 @@ }, "node_modules/cssstyle/node_modules/cssom": { "version": "0.3.8", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true }, "node_modules/cuint": { "version": "0.2.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==", + "dev": true }, "node_modules/data-uri-to-buffer": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/data-urls": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", "dev": true, - "license": "MIT", "dependencies": { "abab": "^2.0.3", "whatwg-mimetype": "^2.3.0", @@ -7944,10 +7014,17 @@ "node": ">=10" } }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true + }, "node_modules/debug": { "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "devOptional": true, - "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -7962,33 +7039,38 @@ }, "node_modules/decamelize": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "engines": { "node": ">=0.10.0" } }, "node_modules/decimal.js": { "version": "10.4.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true }, "node_modules/deep-is": { "version": "0.1.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true }, "node_modules/deepmerge": { "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/default-gateway": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "execa": "^5.0.0" }, @@ -7998,8 +7080,9 @@ }, "node_modules/default-gateway/node_modules/execa": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -8020,16 +7103,18 @@ }, "node_modules/default-gateway/node_modules/human-signals": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } }, "node_modules/default-gateway/node_modules/is-stream": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -8039,16 +7124,18 @@ }, "node_modules/default-gateway/node_modules/mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/default-gateway/node_modules/npm-run-path": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -8058,8 +7145,9 @@ }, "node_modules/default-gateway/node_modules/onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -8072,15 +7160,17 @@ }, "node_modules/default-gateway/node_modules/strip-final-newline": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/defaults": { "version": "1.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dependencies": { "clone": "^1.0.2" }, @@ -8090,8 +7180,9 @@ }, "node_modules/define-data-property": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.1", "gopd": "^1.0.1", @@ -8103,16 +7194,18 @@ }, "node_modules/define-lazy-prop": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/degenerator": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.4.tgz", + "integrity": "sha512-Z66uPeBfHZAHVmue3HPfyKu2Q0rC2cRxbTOsvmU/po5fvvcx27W4mIu9n0PUlQih4oUYvcG1BsbtVv8x7KDOSw==", "dev": true, - "license": "MIT", "dependencies": { "ast-types": "^0.13.2", "escodegen": "^1.8.1", @@ -8125,8 +7218,9 @@ }, "node_modules/degenerator/node_modules/escodegen": { "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^4.2.0", @@ -8146,16 +7240,18 @@ }, "node_modules/degenerator/node_modules/estraverse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/degenerator/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" @@ -8163,37 +7259,42 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/delegates": { "version": "1.0.0", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "devOptional": true }, "node_modules/depd": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/dependency-graph": { "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6.0" } }, "node_modules/destroy": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -8201,25 +7302,34 @@ }, "node_modules/detect-node": { "version": "2.1.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "node_modules/diff": { "version": "4.0.2", - "dev": true, - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "devOptional": true, "engines": { "node": ">=0.3.1" } }, "node_modules/dijkstrajs": { "version": "1.0.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", + "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==" }, "node_modules/dir-glob": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -8227,15 +7337,22 @@ "node": ">=8" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, "node_modules/dns-equal": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true }, "node_modules/dns-packet": { "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, - "license": "MIT", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -8245,8 +7362,9 @@ }, "node_modules/dom-serializer": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, - "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -8258,8 +7376,9 @@ }, "node_modules/dom-serializer/node_modules/entities": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -8269,26 +7388,30 @@ }, "node_modules/dom7": { "version": "4.0.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/dom7/-/dom7-4.0.6.tgz", + "integrity": "sha512-emjdpPLhpNubapLFdjNL9tP06Sr+GZkrIHEXLWvOGsytACUrkbeIdjO5g77m00BrHTznnlcNqgmn7pCN192TBA==", "dependencies": { "ssr-window": "^4.0.0" } }, "node_modules/domelementtype": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } - ], - "license": "BSD-2-Clause" + ] }, "node_modules/domexception": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "deprecated": "Use your platform's native DOMException instead", "dev": true, - "license": "MIT", "dependencies": { "webidl-conversions": "^5.0.0" }, @@ -8298,16 +7421,18 @@ }, "node_modules/domexception/node_modules/webidl-conversions": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=8" } }, "node_modules/domhandler": { "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" }, @@ -8320,12 +7445,14 @@ }, "node_modules/dompurify": { "version": "2.4.7", - "license": "(MPL-2.0 OR Apache-2.0)" + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.7.tgz", + "integrity": "sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ==" }, "node_modules/domutils": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -8337,21 +7464,24 @@ }, "node_modules/duplexer": { "version": "0.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true }, "node_modules/duplexer2": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "readable-stream": "^2.0.2" } }, "node_modules/duplexer2/node_modules/readable-stream": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -8364,36 +7494,42 @@ }, "node_modules/duplexer2/node_modules/safe-buffer": { "version": "5.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/duplexer2/node_modules/string_decoder": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/eastasianwidth": { "version": "0.2.0", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "devOptional": true }, "node_modules/ee-first": { "version": "1.1.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.580", - "dev": true, - "license": "ISC" + "version": "1.4.609", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.609.tgz", + "integrity": "sha512-ihiCP7PJmjoGNuLpl7TjNA8pCQWu09vGyjlPYw1Rqww4gvNuCcmvl+44G+2QyJ6S2K4o+wbTS++Xz0YN8Q9ERw==", + "dev": true }, "node_modules/elementtree": { "version": "0.1.7", + "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", + "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "sax": "1.1.4" }, @@ -8403,31 +7539,36 @@ }, "node_modules/emoji-regex": { "version": "8.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/emojis-list": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/encode-utf8": { "version": "1.0.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" }, "node_modules/encodeurl": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/encoding": { "version": "0.1.13", - "license": "MIT", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -8435,7 +7576,8 @@ }, "node_modules/encoding/node_modules/iconv-lite": { "version": "0.6.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -8446,16 +7588,18 @@ }, "node_modules/end-of-stream": { "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, - "license": "MIT", "dependencies": { "once": "^1.4.0" } }, "node_modules/enhanced-resolve": { "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -8466,28 +7610,32 @@ }, "node_modules/entities": { "version": "2.2.0", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/env-paths": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/err-code": { "version": "2.0.3", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "devOptional": true }, "node_modules/errno": { "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "prr": "~1.0.1" @@ -8498,26 +7646,30 @@ }, "node_modules/error-ex": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-module-lexer": { - "version": "1.3.1", - "dev": true, - "license": "MIT" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true }, "node_modules/es6-promise": { "version": "4.2.8", - "license": "MIT" + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, "node_modules/esbuild": { "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", + "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", "dev": true, "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -8551,8 +7703,9 @@ }, "node_modules/esbuild-wasm": { "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz", + "integrity": "sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==", "dev": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -8562,29 +7715,33 @@ }, "node_modules/escalade": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-html": { "version": "1.0.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true }, "node_modules/escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/escodegen": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -8603,8 +7760,9 @@ }, "node_modules/escodegen/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" @@ -8612,8 +7770,9 @@ }, "node_modules/eslint-scope": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -8624,16 +7783,18 @@ }, "node_modules/eslint-scope/node_modules/estraverse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esprima": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -8644,8 +7805,9 @@ }, "node_modules/esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -8655,55 +7817,63 @@ }, "node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/estree-walker": { "version": "2.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/etag": { "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/eventemitter-asyncresource": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", + "dev": true }, "node_modules/eventemitter3": { "version": "5.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true }, "node_modules/events": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.x" } }, "node_modules/execa": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", @@ -8724,13 +7894,15 @@ }, "node_modules/exponential-backoff": { "version": "3.1.1", - "devOptional": true, - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "devOptional": true }, "node_modules/express": { "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dev": true, - "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -8770,26 +7942,30 @@ }, "node_modules/express/node_modules/array-flatten": { "version": "1.1.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true }, "node_modules/express/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/express/node_modules/ms": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/express/node_modules/qs": { "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, @@ -8802,8 +7978,9 @@ }, "node_modules/external-editor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "devOptional": true, - "license": "MIT", "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -8815,12 +7992,13 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { "version": "3.3.1", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -8834,35 +8012,40 @@ }, "node_modules/fast-json-patch": { "version": "3.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true }, "node_modules/fast-safe-stringify": { "version": "2.1.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true }, "node_modules/fastq": { "version": "1.15.0", - "devOptional": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/faye-websocket": { "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, - "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -8872,8 +8055,9 @@ }, "node_modules/figures": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "devOptional": true, - "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -8886,16 +8070,17 @@ }, "node_modules/file-uri-to-path": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/fill-range": { "version": "7.0.1", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -8905,8 +8090,9 @@ }, "node_modules/finalhandler": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, - "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -8922,21 +8108,24 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/find-cache-dir": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dev": true, - "license": "MIT", "dependencies": { "common-path-prefix": "^3.0.0", "pkg-dir": "^7.0.0" @@ -8950,7 +8139,8 @@ }, "node_modules/find-up": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -8961,8 +8151,9 @@ }, "node_modules/find-versions": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", + "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", "dev": true, - "license": "MIT", "dependencies": { "semver-regex": "^3.1.2" }, @@ -8975,6 +8166,8 @@ }, "node_modules/follow-redirects": { "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "dev": true, "funding": [ { @@ -8982,7 +8175,6 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -8994,8 +8186,9 @@ }, "node_modules/foreground-child": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", "devOptional": true, - "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -9009,8 +8202,9 @@ }, "node_modules/foreground-child/node_modules/signal-exit": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "devOptional": true, - "license": "ISC", "engines": { "node": ">=14" }, @@ -9020,8 +8214,9 @@ }, "node_modules/form-data": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, - "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -9033,24 +8228,28 @@ }, "node_modules/formidable": { "version": "1.2.6", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", + "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", + "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", "dev": true, - "license": "MIT", "funding": { "url": "https://ko-fi.com/tunnckoCore/commissions" } }, "node_modules/forwarded": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fraction.js": { "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, - "license": "MIT", "engines": { "node": "*" }, @@ -9061,16 +8260,18 @@ }, "node_modules/fresh": { "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -9083,8 +8284,9 @@ }, "node_modules/fs-minipass": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "devOptional": true, - "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -9094,18 +8296,20 @@ }, "node_modules/fs-monkey": { "version": "1.0.5", - "dev": true, - "license": "Unlicense" + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", + "dev": true }, "node_modules/fs.realpath": { "version": "1.0.0", - "devOptional": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.3", - "dev": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, "optional": true, "os": [ "darwin" @@ -9116,6 +8320,8 @@ }, "node_modules/ftp": { "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", "dev": true, "dependencies": { "readable-stream": "1.1.x", @@ -9127,13 +8333,15 @@ }, "node_modules/ftp/node_modules/isarray": { "version": "0.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true }, "node_modules/ftp/node_modules/readable-stream": { "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "dev": true, - "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -9143,28 +8351,31 @@ }, "node_modules/ftp/node_modules/string_decoder": { "version": "0.10.31", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true }, "node_modules/function-bind": { "version": "1.1.2", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/fuse.js": { "version": "6.6.2", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.6.2.tgz", + "integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==", "engines": { "node": ">=10" } }, "node_modules/gauge": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "devOptional": true, - "license": "ISC", "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", @@ -9181,23 +8392,26 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", - "license": "ISC", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, - "license": "MIT", "dependencies": { "function-bind": "^1.1.2", "has-proto": "^1.0.1", @@ -9210,16 +8424,18 @@ }, "node_modules/get-package-type": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/get-stream": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -9229,8 +8445,9 @@ }, "node_modules/get-uri": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", "dev": true, - "license": "MIT", "dependencies": { "@tootallnate/once": "1", "data-uri-to-buffer": "3", @@ -9245,8 +8462,9 @@ }, "node_modules/get-uri/node_modules/fs-extra": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -9258,24 +8476,27 @@ }, "node_modules/get-uri/node_modules/jsonfile": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/get-uri/node_modules/universalify": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/glob": { "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "devOptional": true, - "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.5", @@ -9295,8 +8516,8 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "devOptional": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { "is-glob": "^4.0.1" }, @@ -9306,21 +8527,24 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", - "dev": true, - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true }, "node_modules/globals": { "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/globby": { "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, - "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.3.0", @@ -9337,8 +8561,9 @@ }, "node_modules/gopd": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -9348,13 +8573,15 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "devOptional": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "devOptional": true }, "node_modules/guess-parser": { "version": "0.4.22", + "resolved": "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz", + "integrity": "sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==", "dev": true, - "license": "MIT", "dependencies": { "@wessberg/ts-evaluator": "0.0.27" }, @@ -9364,8 +8591,9 @@ }, "node_modules/gzip-size": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "dev": true, - "license": "MIT", "dependencies": { "duplexer": "^0.1.2" }, @@ -9378,21 +8606,24 @@ }, "node_modules/handle-thing": { "version": "2.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true }, "node_modules/has-flag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/has-property-descriptors": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.2" }, @@ -9402,8 +8633,9 @@ }, "node_modules/has-proto": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9413,8 +8645,9 @@ }, "node_modules/has-symbols": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9424,12 +8657,14 @@ }, "node_modules/has-unicode": { "version": "2.0.1", - "devOptional": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "devOptional": true }, "node_modules/hash-base": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -9441,8 +8676,8 @@ }, "node_modules/hasown": { "version": "2.0.0", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", "dependencies": { "function-bind": "^1.1.2" }, @@ -9452,8 +8687,9 @@ }, "node_modules/hdr-histogram-js": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", "dev": true, - "license": "BSD", "dependencies": { "@assemblyscript/loader": "^0.10.1", "base64-js": "^1.2.0", @@ -9462,26 +8698,30 @@ }, "node_modules/hdr-histogram-js/node_modules/pako": { "version": "1.0.11", - "dev": true, - "license": "(MIT AND Zlib)" + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true }, "node_modules/hdr-histogram-percentiles-obj": { "version": "3.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", + "dev": true }, "node_modules/he": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, - "license": "MIT", "bin": { "he": "bin/he" } }, "node_modules/hosted-git-info": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", "devOptional": true, - "license": "ISC", "dependencies": { "lru-cache": "^7.5.1" }, @@ -9491,16 +8731,18 @@ }, "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "devOptional": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/hpack.js": { "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, - "license": "MIT", "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -9510,8 +8752,9 @@ }, "node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -9524,21 +8767,24 @@ }, "node_modules/hpack.js/node_modules/safe-buffer": { "version": "5.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/html-encoding-sniffer": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "dev": true, - "license": "MIT", "dependencies": { "whatwg-encoding": "^1.0.5" }, @@ -9548,6 +8794,8 @@ }, "node_modules/html-entities": { "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", "dev": true, "funding": [ { @@ -9558,11 +8806,18 @@ "type": "patreon", "url": "https://patreon.com/mdevils" } - ], - "license": "MIT" + ] + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true }, "node_modules/htmlparser2": { "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -9571,7 +8826,6 @@ "url": "https://github.com/sponsors/fb55" } ], - "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -9581,8 +8835,9 @@ }, "node_modules/htmlparser2/node_modules/entities": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -9592,18 +8847,21 @@ }, "node_modules/http-cache-semantics": { "version": "4.1.1", - "devOptional": true, - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "devOptional": true }, "node_modules/http-deceiver": { "version": "1.2.7", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true }, "node_modules/http-errors": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, - "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -9617,13 +8875,15 @@ }, "node_modules/http-parser-js": { "version": "0.5.8", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true }, "node_modules/http-proxy": { "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, - "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -9635,8 +8895,9 @@ }, "node_modules/http-proxy-agent": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, - "license": "MIT", "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -9648,8 +8909,9 @@ }, "node_modules/http-proxy-middleware": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, - "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -9671,13 +8933,15 @@ }, "node_modules/http-proxy/node_modules/eventemitter3": { "version": "4.0.7", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true }, "node_modules/https-proxy-agent": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "devOptional": true, - "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -9688,25 +8952,28 @@ }, "node_modules/human-signals": { "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=14.18.0" } }, "node_modules/humanize-ms": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "devOptional": true, - "license": "MIT", "dependencies": { "ms": "^2.0.0" } }, "node_modules/husky": { "version": "4.3.8", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.8.tgz", + "integrity": "sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow==", "dev": true, "hasInstallScript": true, - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "ci-info": "^2.0.0", @@ -9733,8 +9000,9 @@ }, "node_modules/husky/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9747,8 +9015,9 @@ }, "node_modules/husky/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9762,8 +9031,9 @@ }, "node_modules/husky/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9773,13 +9043,15 @@ }, "node_modules/husky/node_modules/color-name": { "version": "1.1.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/husky/node_modules/find-up": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -9793,16 +9065,18 @@ }, "node_modules/husky/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/husky/node_modules/locate-path": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -9815,8 +9089,9 @@ }, "node_modules/husky/node_modules/p-limit": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -9829,8 +9104,9 @@ }, "node_modules/husky/node_modules/p-locate": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -9843,8 +9119,9 @@ }, "node_modules/husky/node_modules/pkg-dir": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^5.0.0" }, @@ -9854,16 +9131,18 @@ }, "node_modules/husky/node_modules/slash": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/husky/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9873,8 +9152,9 @@ }, "node_modules/iconv-lite": { "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "devOptional": true, - "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -9884,8 +9164,9 @@ }, "node_modules/icss-utils": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, - "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -9895,6 +9176,8 @@ }, "node_modules/ieee754": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -9908,21 +9191,22 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "BSD-3-Clause" + ] }, "node_modules/ignore": { - "version": "5.2.4", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/ignore-walk": { - "version": "6.0.3", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz", + "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==", "devOptional": true, - "license": "ISC", "dependencies": { "minimatch": "^9.0.0" }, @@ -9932,8 +9216,9 @@ }, "node_modules/image-size": { "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "dev": true, - "license": "MIT", "optional": true, "bin": { "image-size": "bin/image-size.js" @@ -9944,13 +9229,15 @@ }, "node_modules/immutable": { "version": "4.3.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "dev": true }, "node_modules/import-fresh": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -9964,37 +9251,41 @@ }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/infer-owner": { "version": "1.0.4", - "devOptional": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "devOptional": true }, "node_modules/inflight": { "version": "1.0.6", - "devOptional": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -10002,28 +9293,32 @@ }, "node_modules/inherits": { "version": "2.0.4", - "license": "ISC" + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", "devOptional": true, - "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/injection-js": { "version": "2.4.0", + "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.4.0.tgz", + "integrity": "sha512-6jiJt0tCAo9zjHbcwLiPL+IuNe9SQ6a9g0PEzafThW3fOQi0mrmiJGBJvDD6tmhPh8cQHIQtCOrJuBfQME4kPA==", "dev": true, - "license": "MIT", "dependencies": { "tslib": "^2.0.0" } }, "node_modules/inquirer": { "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", "devOptional": true, - "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", @@ -10047,8 +9342,9 @@ }, "node_modules/inquirer/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "devOptional": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -10061,8 +9357,9 @@ }, "node_modules/inquirer/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "devOptional": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -10076,8 +9373,9 @@ }, "node_modules/inquirer/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "devOptional": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -10087,21 +9385,24 @@ }, "node_modules/inquirer/node_modules/color-name": { "version": "1.1.4", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "devOptional": true }, "node_modules/inquirer/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/inquirer/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "devOptional": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -10111,33 +9412,37 @@ }, "node_modules/ionicons": { "version": "6.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-6.1.3.tgz", + "integrity": "sha512-ptzz38dd/Yq+PgjhXegh7yhb/SLIk1bvL9vQDtLv1aoSc7alO6mX2DIMgcKYzt9vrNWkRu1f9Jr78zIFFyOXqw==", "dependencies": { "@stencil/core": "^2.18.0" } }, "node_modules/ip": { "version": "2.0.0", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "devOptional": true }, "node_modules/ipaddr.js": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/is-arrayish": { "version": "0.2.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true }, "node_modules/is-binary-path": { "version": "2.1.0", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -10147,8 +9452,9 @@ }, "node_modules/is-builtin-module": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, - "license": "MIT", "dependencies": { "builtin-modules": "^3.3.0" }, @@ -10161,8 +9467,8 @@ }, "node_modules/is-core-module": { "version": "2.13.1", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dependencies": { "hasown": "^2.0.0" }, @@ -10172,8 +9478,9 @@ }, "node_modules/is-docker": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "devOptional": true, - "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -10186,23 +9493,24 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { "node": ">=8" } }, "node_modules/is-glob": { "version": "4.0.3", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, @@ -10212,33 +9520,37 @@ }, "node_modules/is-interactive": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "engines": { "node": ">=8" } }, "node_modules/is-lambda": { "version": "1.0.1", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "devOptional": true }, "node_modules/is-module": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true }, "node_modules/is-number": { "version": "7.0.0", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "engines": { "node": ">=0.12.0" } }, "node_modules/is-plain-obj": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -10248,21 +9560,24 @@ }, "node_modules/is-plain-object": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true }, "node_modules/is-stream": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -10272,12 +9587,14 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true }, "node_modules/is-unicode-supported": { "version": "0.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "engines": { "node": ">=10" }, @@ -10287,13 +9604,15 @@ }, "node_modules/is-what": { "version": "3.14.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true }, "node_modules/is-wsl": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "devOptional": true, - "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -10303,25 +9622,29 @@ }, "node_modules/isarray": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/isexe": { "version": "2.0.0", - "devOptional": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "devOptional": true }, "node_modules/isobject": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/isomorphic-fetch": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", "dependencies": { "node-fetch": "^2.6.1", "whatwg-fetch": "^3.4.1" @@ -10329,16 +9652,18 @@ }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -10352,16 +9677,18 @@ }, "node_modules/istanbul-lib-instrument/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/jackspeak": { "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "devOptional": true, - "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -10377,8 +9704,9 @@ }, "node_modules/jest-worker": { "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -10390,16 +9718,18 @@ }, "node_modules/jest-worker/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -10412,27 +9742,30 @@ }, "node_modules/jiti": { "version": "1.21.0", - "dev": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", "bin": { "jiti": "bin/jiti.js" } }, "node_modules/jose": { "version": "4.15.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.4.tgz", + "integrity": "sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==", "funding": { "url": "https://github.com/sponsors/panva" } }, "node_modules/js-tokens": { "version": "4.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "node_modules/js-yaml": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { "argparse": "^2.0.1" }, @@ -10442,8 +9775,9 @@ }, "node_modules/jsdom": { "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", "dev": true, - "license": "MIT", "dependencies": { "abab": "^2.0.5", "acorn": "^8.2.4", @@ -10485,10 +9819,17 @@ } } }, + "node_modules/jsdom/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, "node_modules/jsesc": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, - "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -10498,17 +9839,20 @@ }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true }, "node_modules/json-schema-traverse": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/json5": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -10518,12 +9862,14 @@ }, "node_modules/jsonc-parser": { "version": "3.2.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" }, "node_modules/jsonfile": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -10533,40 +9879,45 @@ }, "node_modules/jsonparse": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "devOptional": true, "engines": [ "node >= 0.2.0" - ], - "license": "MIT" + ] }, "node_modules/karma-source-map-support": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", "dev": true, - "license": "MIT", "dependencies": { "source-map-support": "^0.5.5" } }, "node_modules/kind-of": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/klona": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/launch-editor": { "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", "dev": true, - "license": "MIT", "dependencies": { "picocolors": "^1.0.0", "shell-quote": "^1.8.1" @@ -10574,8 +9925,9 @@ }, "node_modules/leek": { "version": "0.0.24", + "resolved": "https://registry.npmjs.org/leek/-/leek-0.0.24.tgz", + "integrity": "sha512-6PVFIYXxlYF0o6hrAsHtGpTmi06otkwNrMcmQ0K96SeSRHPREPa9J3nJZ1frliVH7XT0XFswoJFQoXsDukzGNQ==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^2.1.0", "lodash.assign": "^3.2.0", @@ -10584,21 +9936,24 @@ }, "node_modules/leek/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/leek/node_modules/ms": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/less": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "copy-anything": "^2.0.1", "parse-node-version": "^1.0.1", @@ -10622,8 +9977,9 @@ }, "node_modules/less-loader": { "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", "dev": true, - "license": "MIT", "dependencies": { "klona": "^2.0.4" }, @@ -10641,8 +9997,9 @@ }, "node_modules/less/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" @@ -10650,8 +10007,9 @@ }, "node_modules/levn": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -10662,8 +10020,9 @@ }, "node_modules/license-webpack-plugin": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", "dev": true, - "license": "ISC", "dependencies": { "webpack-sources": "^3.0.0" }, @@ -10678,21 +10037,22 @@ }, "node_modules/lilconfig": { "version": "2.1.0", - "dev": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "engines": { "node": ">=10" } }, "node_modules/lines-and-columns": { "version": "1.2.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/lint-staged": { "version": "13.3.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.3.0.tgz", + "integrity": "sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "5.3.0", "commander": "11.0.0", @@ -10717,8 +10077,9 @@ }, "node_modules/lint-staged/node_modules/chalk": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, - "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -10728,16 +10089,18 @@ }, "node_modules/lint-staged/node_modules/yaml": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", "dev": true, - "license": "ISC", "engines": { "node": ">= 14" } }, "node_modules/listr2": { "version": "6.6.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", + "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", "dev": true, - "license": "MIT", "dependencies": { "cli-truncate": "^3.1.0", "colorette": "^2.0.20", @@ -10760,8 +10123,9 @@ }, "node_modules/listr2/node_modules/ansi-regex": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -10771,8 +10135,9 @@ }, "node_modules/listr2/node_modules/ansi-styles": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -10782,13 +10147,15 @@ }, "node_modules/listr2/node_modules/emoji-regex": { "version": "9.2.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true }, "node_modules/listr2/node_modules/string-width": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, - "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -10803,8 +10170,9 @@ }, "node_modules/listr2/node_modules/strip-ansi": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -10817,8 +10185,9 @@ }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -10833,23 +10202,26 @@ }, "node_modules/loader-runner": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.11.5" } }, "node_modules/loader-utils": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 12.13.0" } }, "node_modules/locate-path": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dependencies": { "p-locate": "^4.1.0" }, @@ -10859,12 +10231,14 @@ }, "node_modules/lodash": { "version": "4.17.21", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash._baseassign": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==", "dev": true, - "license": "MIT", "dependencies": { "lodash._basecopy": "^3.0.0", "lodash.keys": "^3.0.0" @@ -10872,18 +10246,21 @@ }, "node_modules/lodash._basecopy": { "version": "3.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", + "dev": true }, "node_modules/lodash._bindcallback": { "version": "3.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==", + "dev": true }, "node_modules/lodash._createassigner": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", + "integrity": "sha512-LziVL7IDnJjQeeV95Wvhw6G28Z8Q6da87LWKOPWmzBLv4u6FAT/x5v00pyGW0u38UoogNF2JnD3bGgZZDaNEBw==", "dev": true, - "license": "MIT", "dependencies": { "lodash._bindcallback": "^3.0.0", "lodash._isiterateecall": "^3.0.0", @@ -10892,18 +10269,21 @@ }, "node_modules/lodash._getnative": { "version": "3.9.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", + "dev": true }, "node_modules/lodash._isiterateecall": { "version": "3.0.9", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==", + "dev": true }, "node_modules/lodash.assign": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", + "integrity": "sha512-/VVxzgGBmbphasTg51FrztxQJ/VgAUpol6zmJuSVSGcNg4g7FA4z7rQV8Ovr9V3vFBNWZhvKWHfpAytjTVUfFA==", "dev": true, - "license": "MIT", "dependencies": { "lodash._baseassign": "^3.0.0", "lodash._createassigner": "^3.0.0", @@ -10912,62 +10292,43 @@ }, "node_modules/lodash.debounce": { "version": "4.0.8", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.escape": { - "version": "4.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.invokemap": { - "version": "4.6.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true }, "node_modules/lodash.isarguments": { "version": "3.1.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "dev": true }, "node_modules/lodash.isarray": { "version": "3.0.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", + "dev": true }, "node_modules/lodash.keys": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", "dev": true, - "license": "MIT", "dependencies": { "lodash._getnative": "^3.0.0", "lodash.isarguments": "^3.0.0", "lodash.isarray": "^3.0.0" } }, - "node_modules/lodash.pullall": { - "version": "4.2.0", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.restparam": { "version": "3.6.1", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.uniqby": { - "version": "4.7.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==", + "dev": true }, "node_modules/log-symbols": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -10981,7 +10342,8 @@ }, "node_modules/log-symbols/node_modules/ansi-styles": { "version": "4.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, @@ -10994,7 +10356,8 @@ }, "node_modules/log-symbols/node_modules/chalk": { "version": "4.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11008,7 +10371,8 @@ }, "node_modules/log-symbols/node_modules/color-convert": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { "color-name": "~1.1.4" }, @@ -11018,18 +10382,21 @@ }, "node_modules/log-symbols/node_modules/color-name": { "version": "1.1.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/log-symbols/node_modules/has-flag": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { "node": ">=8" } }, "node_modules/log-symbols/node_modules/supports-color": { "version": "7.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, @@ -11039,8 +10406,9 @@ }, "node_modules/log-update": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", "dev": true, - "license": "MIT", "dependencies": { "ansi-escapes": "^5.0.0", "cli-cursor": "^4.0.0", @@ -11057,8 +10425,9 @@ }, "node_modules/log-update/node_modules/ansi-escapes": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^1.0.2" }, @@ -11071,8 +10440,9 @@ }, "node_modules/log-update/node_modules/ansi-regex": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -11082,8 +10452,9 @@ }, "node_modules/log-update/node_modules/ansi-styles": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -11093,8 +10464,9 @@ }, "node_modules/log-update/node_modules/cli-cursor": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, - "license": "MIT", "dependencies": { "restore-cursor": "^4.0.0" }, @@ -11107,13 +10479,15 @@ }, "node_modules/log-update/node_modules/emoji-regex": { "version": "9.2.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true }, "node_modules/log-update/node_modules/is-fullwidth-code-point": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -11123,16 +10497,18 @@ }, "node_modules/log-update/node_modules/mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/log-update/node_modules/onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -11145,8 +10521,9 @@ }, "node_modules/log-update/node_modules/restore-cursor": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, - "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -11160,8 +10537,9 @@ }, "node_modules/log-update/node_modules/slice-ansi": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" @@ -11175,8 +10553,9 @@ }, "node_modules/log-update/node_modules/string-width": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, - "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -11191,8 +10570,9 @@ }, "node_modules/log-update/node_modules/strip-ansi": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -11205,8 +10585,9 @@ }, "node_modules/log-update/node_modules/type-fest": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -11216,8 +10597,9 @@ }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -11232,27 +10614,31 @@ }, "node_modules/long": { "version": "5.2.3", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, "node_modules/lru-cache": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, "node_modules/luxon": { "version": "3.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", + "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==", "engines": { "node": ">=12" } }, "node_modules/macos-release": { "version": "2.5.1", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", + "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" }, @@ -11262,7 +10648,8 @@ }, "node_modules/magic-string": { "version": "0.30.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, @@ -11272,8 +10659,9 @@ }, "node_modules/make-dir": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "pify": "^4.0.1", @@ -11285,8 +10673,9 @@ }, "node_modules/make-dir/node_modules/semver": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "ISC", "optional": true, "bin": { "semver": "bin/semver" @@ -11294,13 +10683,15 @@ }, "node_modules/make-error": { "version": "1.3.6", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "devOptional": true }, "node_modules/make-fetch-happen": { "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", "devOptional": true, - "license": "ISC", "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^16.1.0", @@ -11325,8 +10716,9 @@ }, "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "devOptional": true, - "license": "ISC", "dependencies": { "@gar/promisify": "^1.1.3", "semver": "^7.3.5" @@ -11337,16 +10729,18 @@ }, "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "devOptional": true, - "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/make-fetch-happen/node_modules/cacache": { "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", "devOptional": true, - "license": "ISC", "dependencies": { "@npmcli/fs": "^2.1.0", "@npmcli/move-file": "^2.0.0", @@ -11373,8 +10767,9 @@ }, "node_modules/make-fetch-happen/node_modules/fs-minipass": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "devOptional": true, - "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -11384,8 +10779,9 @@ }, "node_modules/make-fetch-happen/node_modules/glob": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "devOptional": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -11402,8 +10798,9 @@ }, "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "devOptional": true, - "license": "MIT", "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -11415,16 +10812,18 @@ }, "node_modules/make-fetch-happen/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "devOptional": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/make-fetch-happen/node_modules/minimatch": { "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "devOptional": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -11434,8 +10833,9 @@ }, "node_modules/make-fetch-happen/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "devOptional": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -11443,10 +10843,23 @@ "node": ">=8" } }, + "node_modules/make-fetch-happen/node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "devOptional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/make-fetch-happen/node_modules/ssri": { "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "devOptional": true, - "license": "ISC", "dependencies": { "minipass": "^3.1.1" }, @@ -11456,8 +10869,9 @@ }, "node_modules/make-fetch-happen/node_modules/unique-filename": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", "devOptional": true, - "license": "ISC", "dependencies": { "unique-slug": "^3.0.0" }, @@ -11467,8 +10881,9 @@ }, "node_modules/make-fetch-happen/node_modules/unique-slug": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", "devOptional": true, - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" }, @@ -11478,12 +10893,14 @@ }, "node_modules/make-fetch-happen/node_modules/yallist": { "version": "4.0.0", - "devOptional": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true }, "node_modules/marked": { "version": "4.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "bin": { "marked": "bin/marked.js" }, @@ -11493,7 +10910,8 @@ }, "node_modules/md5.js": { "version": "1.3.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -11502,16 +10920,18 @@ }, "node_modules/media-typer": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/memfs": { "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, - "license": "Unlicense", "dependencies": { "fs-monkey": "^1.0.4" }, @@ -11521,34 +10941,37 @@ }, "node_modules/merge-descriptors": { "version": "1.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true }, "node_modules/merge-stream": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "node_modules/merge2": { "version": "1.4.1", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "engines": { "node": ">= 8" } }, "node_modules/methods": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/micromatch": { "version": "4.0.5", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -11559,8 +10982,9 @@ }, "node_modules/mime": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, - "license": "MIT", "bin": { "mime": "cli.js" }, @@ -11570,16 +10994,18 @@ }, "node_modules/mime-db": { "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -11589,8 +11015,9 @@ }, "node_modules/mimic-fn": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -11600,8 +11027,9 @@ }, "node_modules/mini-css-extract-plugin": { "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", "dev": true, - "license": "MIT", "dependencies": { "schema-utils": "^4.0.0" }, @@ -11618,13 +11046,15 @@ }, "node_modules/minimalistic-assert": { "version": "1.0.1", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true }, "node_modules/minimatch": { "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "devOptional": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -11637,35 +11067,144 @@ }, "node_modules/minimist": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "7.0.4", + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "devOptional": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "devOptional": true, + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "devOptional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "devOptional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "devOptional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + }, + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "devOptional": true, + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "devOptional": true, - "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=8" } }, - "node_modules/minipass-collect": { - "version": "1.0.2", + "node_modules/minipass-json-stream/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "devOptional": true, - "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/minipass-collect/node_modules/minipass": { + "node_modules/minipass-pipeline/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "devOptional": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -11673,31 +11212,29 @@ "node": ">=8" } }, - "node_modules/minipass-collect/node_modules/yallist": { + "node_modules/minipass-pipeline/node_modules/yallist": { "version": "4.0.0", - "devOptional": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true }, - "node_modules/minipass-fetch": { - "version": "2.1.2", + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "devOptional": true, - "license": "MIT", "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "minipass": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" + "node": ">=8" } }, - "node_modules/minipass-fetch/node_modules/minipass": { + "node_modules/minipass-sized/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "devOptional": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -11705,26 +11242,30 @@ "node": ">=8" } }, - "node_modules/minipass-fetch/node_modules/yallist": { + "node_modules/minipass-sized/node_modules/yallist": { "version": "4.0.0", - "devOptional": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true }, - "node_modules/minipass-flush": { - "version": "1.0.5", + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "devOptional": true, - "license": "ISC", "dependencies": { - "minipass": "^3.0.0" + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, "engines": { "node": ">= 8" } }, - "node_modules/minipass-flush/node_modules/minipass": { + "node_modules/minizlib/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "devOptional": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -11732,367 +11273,616 @@ "node": ">=8" } }, - "node_modules/minipass-flush/node_modules/yallist": { + "node_modules/minizlib/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "devOptional": true, - "license": "ISC" + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/minipass-json-stream": { + "node_modules/monaco-editor": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.33.0.tgz", + "integrity": "sha512-VcRWPSLIUEgQJQIE0pVT8FcGBIgFoxz7jtqctE+IiCxWugD0DwgyQBcZBhdSrdMC84eumoqMZsGl2GTreOzwqw==" + }, + "node_modules/mrmime": { "version": "1.0.1", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "devOptional": true + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" } }, - "node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "devOptional": true, - "license": "ISC", + "node_modules/multimatch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "optional": true, "dependencies": { - "yallist": "^4.0.0" + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/minipass-json-stream/node_modules/yallist": { - "version": "4.0.0", - "devOptional": true, - "license": "ISC" + "node_modules/multimatch/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", + "node_modules/multimatch/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "optional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "devOptional": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/needle": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.0.tgz", + "integrity": "sha512-Kaq820952NOrLY/LVbIhPZeXtCGDBAPVgT0BYnoT3p/Nr3nkGXdvWXXA3zgy7wpAgqRULu9p/NvKiFo6f/12fw==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/needle/node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "dev": true, + "optional": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "devOptional": true, - "license": "ISC", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/ng-morph": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/ng-morph/-/ng-morph-4.0.3.tgz", + "integrity": "sha512-4voBApzsUs0/1zJsV2sSVPoOKxWt0gBd+3yqE/q8oYOX87RN3HwcJmqQLtWEU4tbmhk11gSRIFIl61+z32cnNw==", + "optional": true, "dependencies": { - "minipass": "^3.0.0" + "jsonc-parser": "3.2.0", + "minimatch": "9.0.3", + "multimatch": "5.0.0", + "ts-morph": "20.0.0", + "tslib": "2.6.2" + }, + "peerDependencies": { + "@angular-devkit/core": ">=11.0.0", + "@angular-devkit/schematics": ">=11.0.0" + } + }, + "node_modules/ng-packagr": { + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-16.2.3.tgz", + "integrity": "sha512-VTJ7Qtge52+1subkhmF5nOqLNbVutA8/igJ0A5vH6Mgpb8Z/3HeZomtD1SHzZF5Dqp+p+QPHE548FWYu1MdMSQ==", + "dev": true, + "dependencies": { + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^15.0.0", + "ajv": "^8.11.0", + "ansi-colors": "^4.1.3", + "autoprefixer": "^10.4.12", + "browserslist": "^4.21.4", + "cacache": "^18.0.0", + "chokidar": "^3.5.3", + "commander": "^11.0.0", + "convert-source-map": "^2.0.0", + "dependency-graph": "^0.11.0", + "esbuild-wasm": "^0.19.0", + "fast-glob": "^3.2.12", + "find-cache-dir": "^3.3.2", + "injection-js": "^2.4.0", + "jsonc-parser": "^3.2.0", + "less": "^4.1.3", + "ora": "^5.1.0", + "piscina": "^4.0.0", + "postcss": "^8.4.16", + "postcss-url": "^10.1.3", + "rollup": "^3.0.0", + "rxjs": "^7.5.6", + "sass": "^1.55.0" + }, + "bin": { + "ng-packagr": "cli/main.js" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0" + }, + "optionalDependencies": { + "esbuild": "^0.19.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^16.0.0 || ^16.2.0-next.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "tslib": "^2.3.0", + "typescript": ">=4.9.3 <5.2" }, - "engines": { - "node": ">=8" + "peerDependenciesMeta": { + "tailwindcss": { + "optional": true + } } }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "devOptional": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, + "node_modules/ng-packagr/node_modules/@esbuild/android-arm": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.8.tgz", + "integrity": "sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", - "devOptional": true, - "license": "ISC" - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "devOptional": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, + "node_modules/ng-packagr/node_modules/@esbuild/android-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.8.tgz", + "integrity": "sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "devOptional": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, + "node_modules/ng-packagr/node_modules/@esbuild/android-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.8.tgz", + "integrity": "sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/minipass-sized/node_modules/yallist": { - "version": "4.0.0", - "devOptional": true, - "license": "ISC" - }, - "node_modules/minizlib": { - "version": "2.1.2", - "devOptional": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, + "node_modules/ng-packagr/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.8.tgz", + "integrity": "sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "devOptional": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, + "node_modules/ng-packagr/node_modules/@esbuild/darwin-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.8.tgz", + "integrity": "sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "devOptional": true, - "license": "ISC" - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "devOptional": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, + "node_modules/ng-packagr/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.8.tgz", + "integrity": "sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/monaco-editor": { - "version": "0.33.0", - "license": "MIT" - }, - "node_modules/mrmime": { - "version": "1.0.1", + "node_modules/ng-packagr/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.8.tgz", + "integrity": "sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/ms": { - "version": "2.1.2", - "devOptional": true, - "license": "MIT" - }, - "node_modules/multicast-dns": { - "version": "7.2.5", + "node_modules/ng-packagr/node_modules/@esbuild/linux-arm": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.8.tgz", + "integrity": "sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/multimatch": { - "version": "5.0.0", - "license": "MIT", + "node_modules/ng-packagr/node_modules/@esbuild/linux-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.8.tgz", + "integrity": "sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==", + "cpu": [ + "arm64" + ], + "dev": true, "optional": true, - "dependencies": { - "@types/minimatch": "^3.0.3", - "array-differ": "^3.0.0", - "array-union": "^2.1.0", - "arrify": "^2.0.1", - "minimatch": "^3.0.4" - }, + "os": [ + "linux" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/multimatch/node_modules/brace-expansion": { - "version": "1.1.11", - "license": "MIT", + "node_modules/ng-packagr/node_modules/@esbuild/linux-ia32": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.8.tgz", + "integrity": "sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==", + "cpu": [ + "ia32" + ], + "dev": true, "optional": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/multimatch/node_modules/minimatch": { - "version": "3.1.2", - "license": "ISC", + "node_modules/ng-packagr/node_modules/@esbuild/linux-loong64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.8.tgz", + "integrity": "sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==", + "cpu": [ + "loong64" + ], + "dev": true, "optional": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "os": [ + "linux" + ], "engines": { - "node": "*" + "node": ">=12" } }, - "node_modules/mustache": { - "version": "4.2.0", - "license": "MIT", - "bin": { - "mustache": "bin/mustache" + "node_modules/ng-packagr/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.8.tgz", + "integrity": "sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/mute-stream": { - "version": "0.0.8", - "devOptional": true, - "license": "ISC" + "node_modules/ng-packagr/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.8.tgz", + "integrity": "sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/nanoid": { - "version": "3.3.7", + "node_modules/ng-packagr/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.8.tgz", + "integrity": "sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==", + "cpu": [ + "riscv64" + ], "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "optional": true, + "os": [ + "linux" ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=12" } }, - "node_modules/needle": { - "version": "3.2.0", + "node_modules/ng-packagr/node_modules/@esbuild/linux-s390x": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.8.tgz", + "integrity": "sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==", + "cpu": [ + "s390x" + ], "dev": true, - "license": "MIT", "optional": true, - "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, + "os": [ + "linux" + ], "engines": { - "node": ">= 4.4.x" + "node": ">=12" } }, - "node_modules/needle/node_modules/debug": { - "version": "3.2.7", + "node_modules/ng-packagr/node_modules/@esbuild/linux-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.8.tgz", + "integrity": "sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", "optional": true, - "dependencies": { - "ms": "^2.1.1" + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/needle/node_modules/iconv-lite": { - "version": "0.6.3", + "node_modules/ng-packagr/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.8.tgz", + "integrity": "sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, + "os": [ + "netbsd" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/needle/node_modules/sax": { - "version": "1.3.0", + "node_modules/ng-packagr/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.8.tgz", + "integrity": "sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "devOptional": true, - "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/netmask": { - "version": "2.0.2", + "node_modules/ng-packagr/node_modules/@esbuild/sunos-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.8.tgz", + "integrity": "sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">= 0.4.0" + "node": ">=12" } }, - "node_modules/ng-morph": { - "version": "4.0.3", - "license": "Apache-2.0", + "node_modules/ng-packagr/node_modules/@esbuild/win32-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.8.tgz", + "integrity": "sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==", + "cpu": [ + "arm64" + ], + "dev": true, "optional": true, - "dependencies": { - "jsonc-parser": "3.2.0", - "minimatch": "9.0.3", - "multimatch": "5.0.0", - "ts-morph": "20.0.0", - "tslib": "2.6.2" - }, - "peerDependencies": { - "@angular-devkit/core": ">=11.0.0", - "@angular-devkit/schematics": ">=11.0.0" + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/ng-packagr": { - "version": "16.2.3", + "node_modules/ng-packagr/node_modules/@esbuild/win32-ia32": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.8.tgz", + "integrity": "sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/plugin-json": "^6.0.0", - "@rollup/plugin-node-resolve": "^15.0.0", - "ajv": "^8.11.0", - "ansi-colors": "^4.1.3", - "autoprefixer": "^10.4.12", - "browserslist": "^4.21.4", - "cacache": "^18.0.0", - "chokidar": "^3.5.3", - "commander": "^11.0.0", - "convert-source-map": "^2.0.0", - "dependency-graph": "^0.11.0", - "esbuild-wasm": "^0.19.0", - "fast-glob": "^3.2.12", - "find-cache-dir": "^3.3.2", - "injection-js": "^2.4.0", - "jsonc-parser": "^3.2.0", - "less": "^4.1.3", - "ora": "^5.1.0", - "piscina": "^4.0.0", - "postcss": "^8.4.16", - "postcss-url": "^10.1.3", - "rollup": "^3.0.0", - "rxjs": "^7.5.6", - "sass": "^1.55.0" - }, - "bin": { - "ng-packagr": "cli/main.js" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^16.14.0 || >=18.10.0" - }, - "optionalDependencies": { - "esbuild": "^0.19.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^16.0.0 || ^16.2.0-next.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "tslib": "^2.3.0", - "typescript": ">=4.9.3 <5.2" - }, - "peerDependenciesMeta": { - "tailwindcss": { - "optional": true - } + "node": ">=12" } }, - "node_modules/ng-packagr/node_modules/@esbuild/darwin-arm64": { - "version": "0.19.5", + "node_modules/ng-packagr/node_modules/@esbuild/win32-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.8.tgz", + "integrity": "sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==", "cpu": [ - "arm64" + "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { "node": ">=12" @@ -12100,14 +11890,16 @@ }, "node_modules/ng-packagr/node_modules/convert-source-map": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true }, "node_modules/ng-packagr/node_modules/esbuild": { - "version": "0.19.5", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.8.tgz", + "integrity": "sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "bin": { "esbuild": "bin/esbuild" @@ -12116,34 +11908,35 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.19.5", - "@esbuild/android-arm64": "0.19.5", - "@esbuild/android-x64": "0.19.5", - "@esbuild/darwin-arm64": "0.19.5", - "@esbuild/darwin-x64": "0.19.5", - "@esbuild/freebsd-arm64": "0.19.5", - "@esbuild/freebsd-x64": "0.19.5", - "@esbuild/linux-arm": "0.19.5", - "@esbuild/linux-arm64": "0.19.5", - "@esbuild/linux-ia32": "0.19.5", - "@esbuild/linux-loong64": "0.19.5", - "@esbuild/linux-mips64el": "0.19.5", - "@esbuild/linux-ppc64": "0.19.5", - "@esbuild/linux-riscv64": "0.19.5", - "@esbuild/linux-s390x": "0.19.5", - "@esbuild/linux-x64": "0.19.5", - "@esbuild/netbsd-x64": "0.19.5", - "@esbuild/openbsd-x64": "0.19.5", - "@esbuild/sunos-x64": "0.19.5", - "@esbuild/win32-arm64": "0.19.5", - "@esbuild/win32-ia32": "0.19.5", - "@esbuild/win32-x64": "0.19.5" + "@esbuild/android-arm": "0.19.8", + "@esbuild/android-arm64": "0.19.8", + "@esbuild/android-x64": "0.19.8", + "@esbuild/darwin-arm64": "0.19.8", + "@esbuild/darwin-x64": "0.19.8", + "@esbuild/freebsd-arm64": "0.19.8", + "@esbuild/freebsd-x64": "0.19.8", + "@esbuild/linux-arm": "0.19.8", + "@esbuild/linux-arm64": "0.19.8", + "@esbuild/linux-ia32": "0.19.8", + "@esbuild/linux-loong64": "0.19.8", + "@esbuild/linux-mips64el": "0.19.8", + "@esbuild/linux-ppc64": "0.19.8", + "@esbuild/linux-riscv64": "0.19.8", + "@esbuild/linux-s390x": "0.19.8", + "@esbuild/linux-x64": "0.19.8", + "@esbuild/netbsd-x64": "0.19.8", + "@esbuild/openbsd-x64": "0.19.8", + "@esbuild/sunos-x64": "0.19.8", + "@esbuild/win32-arm64": "0.19.8", + "@esbuild/win32-ia32": "0.19.8", + "@esbuild/win32-x64": "0.19.8" } }, "node_modules/ng-packagr/node_modules/esbuild-wasm": { - "version": "0.19.5", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.19.8.tgz", + "integrity": "sha512-+5BhFGjW0+3cC5BEcujYfNaslSEBjF+zFHj4a7xff2LLByCJGok3iCyV9/oHpN8OlZrGlnjSduhY1t1QqU1YBQ==", "dev": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -12153,8 +11946,9 @@ }, "node_modules/ng-packagr/node_modules/find-cache-dir": { "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, - "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -12169,8 +11963,9 @@ }, "node_modules/ng-packagr/node_modules/make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -12183,8 +11978,9 @@ }, "node_modules/ng-packagr/node_modules/pkg-dir": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -12194,15 +11990,17 @@ }, "node_modules/ng-packagr/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/ng-qrcode": { "version": "16.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ng-qrcode/-/ng-qrcode-16.0.0.tgz", + "integrity": "sha512-AVp3Tw1bAwqiHzt57x1Rp7YrnzkMUNlww1+ypjGvgbMPRYmy//cHOzMYsH3HPkFDDmPHwGerdAElmIA/X4SBiQ==", "dependencies": { "qrcode": "^1.5.1", "tslib": "^2.4.0" @@ -12214,9 +12012,10 @@ }, "node_modules/nice-napi": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "!win32" @@ -12228,13 +12027,15 @@ }, "node_modules/node-addon-api": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/node-fetch": { "version": "2.7.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -12252,15 +12053,18 @@ }, "node_modules/node-fetch/node_modules/tr46": { "version": "0.0.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -12268,15 +12072,17 @@ }, "node_modules/node-forge": { "version": "1.3.1", - "license": "(BSD-3-Clause OR GPL-2.0)", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "engines": { "node": ">= 6.13.0" } }, "node_modules/node-gyp": { "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", "devOptional": true, - "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", @@ -12298,9 +12104,10 @@ } }, "node_modules/node-gyp-build": { - "version": "4.6.1", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.7.1.tgz", + "integrity": "sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==", "dev": true, - "license": "MIT", "optional": true, "bin": { "node-gyp-build": "bin.js", @@ -12310,8 +12117,9 @@ }, "node_modules/node-gyp/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "devOptional": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -12319,8 +12127,9 @@ }, "node_modules/node-gyp/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "devOptional": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -12338,8 +12147,9 @@ }, "node_modules/node-gyp/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "devOptional": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -12349,8 +12159,9 @@ }, "node_modules/node-html-parser": { "version": "5.4.2", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", + "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", "dev": true, - "license": "MIT", "dependencies": { "css-select": "^4.2.1", "he": "1.2.0" @@ -12358,8 +12169,9 @@ }, "node_modules/node-html-parser/node_modules/css-select": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", @@ -12373,8 +12185,9 @@ }, "node_modules/node-html-parser/node_modules/dom-serializer": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, - "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -12386,8 +12199,9 @@ }, "node_modules/node-html-parser/node_modules/domhandler": { "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" }, @@ -12400,8 +12214,9 @@ }, "node_modules/node-html-parser/node_modules/domutils": { "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -12413,7 +12228,8 @@ }, "node_modules/node-jose": { "version": "2.2.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/node-jose/-/node-jose-2.2.0.tgz", + "integrity": "sha512-XPCvJRr94SjLrSIm4pbYHKLEaOsDvJCpyFw/6V/KK/IXmyZ6SFBzAUDO9HQf4DB/nTEFcRGH87mNciOP23kFjw==", "dependencies": { "base64url": "^3.0.1", "buffer": "^6.0.3", @@ -12428,24 +12244,27 @@ }, "node_modules/node-jose/node_modules/uuid": { "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/node-releases": { - "version": "2.0.13", - "dev": true, - "license": "MIT" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true }, "node_modules/nopt": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "devOptional": true, - "license": "ISC", "dependencies": { "abbrev": "^1.0.0" }, @@ -12458,8 +12277,9 @@ }, "node_modules/normalize-package-data": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", "devOptional": true, - "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^6.0.0", "is-core-module": "^2.8.1", @@ -12472,24 +12292,26 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-range": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/npm-bundled": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", "devOptional": true, - "license": "ISC", "dependencies": { "npm-normalize-package-bin": "^3.0.0" }, @@ -12499,8 +12321,9 @@ }, "node_modules/npm-install-checks": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", "devOptional": true, - "license": "BSD-2-Clause", "dependencies": { "semver": "^7.1.1" }, @@ -12510,16 +12333,18 @@ }, "node_modules/npm-normalize-package-bin": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "devOptional": true, - "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-package-arg": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", "devOptional": true, - "license": "ISC", "dependencies": { "hosted-git-info": "^6.0.0", "proc-log": "^3.0.0", @@ -12532,8 +12357,9 @@ }, "node_modules/npm-packlist": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", "devOptional": true, - "license": "ISC", "dependencies": { "ignore-walk": "^6.0.0" }, @@ -12543,8 +12369,9 @@ }, "node_modules/npm-pick-manifest": { "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", + "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", "devOptional": true, - "license": "ISC", "dependencies": { "npm-install-checks": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", @@ -12557,8 +12384,9 @@ }, "node_modules/npm-registry-fetch": { "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", "devOptional": true, - "license": "ISC", "dependencies": { "make-fetch-happen": "^11.0.0", "minipass": "^5.0.0", @@ -12574,16 +12402,18 @@ }, "node_modules/npm-registry-fetch/node_modules/@tootallnate/once": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "devOptional": true, - "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/npm-registry-fetch/node_modules/cacache": { "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "devOptional": true, - "license": "ISC", "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", @@ -12604,16 +12434,18 @@ }, "node_modules/npm-registry-fetch/node_modules/cacache/node_modules/minipass": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "devOptional": true, - "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/npm-registry-fetch/node_modules/http-proxy-agent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "devOptional": true, - "license": "MIT", "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -12625,16 +12457,18 @@ }, "node_modules/npm-registry-fetch/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "devOptional": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "devOptional": true, - "license": "ISC", "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^17.0.0", @@ -12658,16 +12492,42 @@ }, "node_modules/npm-registry-fetch/node_modules/minipass": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-registry-fetch/node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "devOptional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm-registry-fetch/node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "devOptional": true, - "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { "node": ">=8" } }, "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "devOptional": true, - "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", @@ -12682,16 +12542,24 @@ }, "node_modules/npm-registry-fetch/node_modules/minipass-fetch/node_modules/minipass": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "devOptional": true, - "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, + "node_modules/npm-registry-fetch/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + }, "node_modules/npm-run-path": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -12704,8 +12572,9 @@ }, "node_modules/npm-run-path/node_modules/path-key": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -12715,8 +12584,9 @@ }, "node_modules/npmlog": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "devOptional": true, - "license": "ISC", "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", @@ -12729,8 +12599,9 @@ }, "node_modules/nth-check": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -12740,34 +12611,55 @@ }, "node_modules/nwsapi": { "version": "2.2.7", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } }, "node_modules/object-inspect": { "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-path": { "version": "0.11.8", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", + "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10.12.0" } }, "node_modules/obuf": { "version": "1.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true }, "node_modules/on-finished": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, - "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -12777,24 +12669,26 @@ }, "node_modules/on-headers": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/once": { "version": "1.4.0", - "devOptional": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, - "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -12807,8 +12701,9 @@ }, "node_modules/open": { "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "devOptional": true, - "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -12823,24 +12718,27 @@ }, "node_modules/opencollective-postinstall": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", "dev": true, - "license": "MIT", "bin": { "opencollective-postinstall": "index.js" } }, "node_modules/opener": { "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true, - "license": "(WTFPL OR MIT)", "bin": { "opener": "bin/opener-bin.js" } }, "node_modules/optionator": { "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, - "license": "MIT", "dependencies": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", @@ -12855,7 +12753,8 @@ }, "node_modules/ora": { "version": "5.4.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -12876,7 +12775,8 @@ }, "node_modules/ora/node_modules/ansi-styles": { "version": "4.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, @@ -12889,7 +12789,8 @@ }, "node_modules/ora/node_modules/chalk": { "version": "4.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12903,7 +12804,8 @@ }, "node_modules/ora/node_modules/color-convert": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { "color-name": "~1.1.4" }, @@ -12913,18 +12815,21 @@ }, "node_modules/ora/node_modules/color-name": { "version": "1.1.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/ora/node_modules/has-flag": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { "node": ">=8" } }, "node_modules/ora/node_modules/supports-color": { "version": "7.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, @@ -12934,8 +12839,9 @@ }, "node_modules/os-name": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", + "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", "dev": true, - "license": "MIT", "dependencies": { "macos-release": "^2.5.0", "windows-release": "^4.0.0" @@ -12949,15 +12855,17 @@ }, "node_modules/os-tmpdir": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/p-limit": { "version": "2.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dependencies": { "p-try": "^2.0.0" }, @@ -12970,7 +12878,8 @@ }, "node_modules/p-locate": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dependencies": { "p-limit": "^2.2.0" }, @@ -12980,8 +12889,9 @@ }, "node_modules/p-map": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "devOptional": true, - "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -12994,8 +12904,9 @@ }, "node_modules/p-retry": { "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" @@ -13006,23 +12917,26 @@ }, "node_modules/p-retry/node_modules/retry": { "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/p-try": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "engines": { "node": ">=6" } }, "node_modules/pac-proxy-agent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", "dev": true, - "license": "MIT", "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -13040,8 +12954,9 @@ }, "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", "dev": true, - "license": "MIT", "dependencies": { "agent-base": "^6.0.2", "debug": "4", @@ -13053,8 +12968,9 @@ }, "node_modules/pac-resolver": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", + "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", "dev": true, - "license": "MIT", "dependencies": { "degenerator": "^3.0.2", "ip": "^1.1.5", @@ -13066,13 +12982,15 @@ }, "node_modules/pac-resolver/node_modules/ip": { "version": "1.1.8", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true }, "node_modules/pacote": { "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", "devOptional": true, - "license": "ISC", "dependencies": { "@npmcli/git": "^4.0.0", "@npmcli/installed-package-contents": "^2.0.1", @@ -13102,8 +13020,9 @@ }, "node_modules/pacote/node_modules/cacache": { "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "devOptional": true, - "license": "ISC", "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", @@ -13124,36 +13043,71 @@ }, "node_modules/pacote/node_modules/cacache/node_modules/minipass": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "devOptional": true, - "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/pacote/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "devOptional": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/pacote/node_modules/minipass": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pacote/node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "devOptional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/pacote/node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "devOptional": true, - "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { "node": ">=8" } }, + "node_modules/pacote/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + }, "node_modules/pako": { "version": "2.1.0", - "license": "(MIT AND Zlib)" + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -13163,8 +13117,9 @@ }, "node_modules/parse-json": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -13180,20 +13135,28 @@ }, "node_modules/parse-node-version": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/parse5": { - "version": "6.0.1", - "devOptional": true, - "license": "MIT" + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } }, "node_modules/parse5-html-rewriting-stream": { "version": "7.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", "dependencies": { "entities": "^4.3.0", "parse5": "^7.0.0", @@ -13205,7 +13168,8 @@ }, "node_modules/parse5-html-rewriting-stream/node_modules/entities": { "version": "4.5.0", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "engines": { "node": ">=0.12" }, @@ -13213,19 +13177,10 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { - "version": "7.1.2", - "license": "MIT", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/parse5-sax-parser": { "version": "7.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", "dependencies": { "parse5": "^7.0.0" }, @@ -13233,30 +13188,22 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-sax-parser/node_modules/entities": { + "node_modules/parse5/node_modules/entities": { "version": "4.5.0", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "engines": { "node": ">=0.12" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/parse5-sax-parser/node_modules/parse5": { - "version": "7.1.2", - "license": "MIT", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/parseurl": { "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -13267,41 +13214,45 @@ }, "node_modules/path-browserify": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "optional": true }, "node_modules/path-exists": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "devOptional": true, - "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^9.1.1 || ^10.0.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -13314,29 +13265,33 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.1", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", "devOptional": true, - "license": "ISC", "engines": { "node": "14 || >=16.14" } }, "node_modules/path-to-regexp": { "version": "0.1.7", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true }, "node_modules/path-type": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/pbkdf2": { "version": "3.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -13350,12 +13305,13 @@ }, "node_modules/picocolors": { "version": "1.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "2.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { "node": ">=8.6" }, @@ -13365,8 +13321,9 @@ }, "node_modules/pidtree": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true, - "license": "MIT", "bin": { "pidtree": "bin/pidtree.js" }, @@ -13376,17 +13333,27 @@ }, "node_modules/pify": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": ">=6" } }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, "node_modules/piscina": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.0.0.tgz", + "integrity": "sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==", "dev": true, - "license": "MIT", "dependencies": { "eventemitter-asyncresource": "^1.0.0", "hdr-histogram-js": "^2.0.1", @@ -13398,8 +13365,9 @@ }, "node_modules/pkg-dir": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^6.3.0" }, @@ -13412,8 +13380,9 @@ }, "node_modules/pkg-dir/node_modules/find-up": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -13427,8 +13396,9 @@ }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^6.0.0" }, @@ -13441,8 +13411,9 @@ }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, - "license": "MIT", "dependencies": { "yocto-queue": "^1.0.0" }, @@ -13455,8 +13426,9 @@ }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^4.0.0" }, @@ -13469,16 +13441,18 @@ }, "node_modules/pkg-dir/node_modules/path-exists": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/pkg-dir/node_modules/yocto-queue": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true, - "license": "MIT", "engines": { "node": ">=12.20" }, @@ -13488,22 +13462,25 @@ }, "node_modules/please-upgrade-node": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", "dev": true, - "license": "MIT", "dependencies": { "semver-compare": "^1.0.0" } }, "node_modules/pngjs": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", "engines": { "node": ">=10.13.0" } }, "node_modules/postcss": { - "version": "8.4.31", - "dev": true, + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", "funding": [ { "type": "opencollective", @@ -13518,9 +13495,8 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "nanoid": "^3.3.6", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -13528,10 +13504,87 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "engines": { + "node": ">=14" + } + }, "node_modules/postcss-loader": { "version": "7.3.3", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", + "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", "dev": true, - "license": "MIT", "dependencies": { "cosmiconfig": "^8.2.0", "jiti": "^1.18.2", @@ -13551,8 +13604,9 @@ }, "node_modules/postcss-loader/node_modules/cosmiconfig": { "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, - "license": "MIT", "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", @@ -13576,8 +13630,9 @@ }, "node_modules/postcss-modules-extract-imports": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", "dev": true, - "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -13587,8 +13642,9 @@ }, "node_modules/postcss-modules-local-by-default": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", "dev": true, - "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -13603,8 +13659,9 @@ }, "node_modules/postcss-modules-scope": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "dev": true, - "license": "ISC", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -13617,8 +13674,9 @@ }, "node_modules/postcss-modules-values": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, - "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" }, @@ -13629,10 +13687,28 @@ "postcss": "^8.1.0" } }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, "node_modules/postcss-selector-parser": { "version": "6.0.13", - "dev": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -13643,8 +13719,9 @@ }, "node_modules/postcss-url": { "version": "10.1.3", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-10.1.3.tgz", + "integrity": "sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==", "dev": true, - "license": "MIT", "dependencies": { "make-dir": "~3.1.0", "mime": "~2.5.2", @@ -13660,8 +13737,9 @@ }, "node_modules/postcss-url/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -13669,8 +13747,9 @@ }, "node_modules/postcss-url/node_modules/make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -13683,8 +13762,9 @@ }, "node_modules/postcss-url/node_modules/mime": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", "dev": true, - "license": "MIT", "bin": { "mime": "cli.js" }, @@ -13694,8 +13774,9 @@ }, "node_modules/postcss-url/node_modules/minimatch": { "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -13705,19 +13786,22 @@ }, "node_modules/postcss-url/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/postcss-value-parser": { "version": "4.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/prelude-ls": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -13725,8 +13809,9 @@ }, "node_modules/prettier": { "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, - "license": "MIT", "bin": { "prettier": "bin-prettier.js" }, @@ -13739,8 +13824,9 @@ }, "node_modules/pretty-bytes": { "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" }, @@ -13750,33 +13836,38 @@ }, "node_modules/proc-log": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", "devOptional": true, - "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/process": { "version": "0.11.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "engines": { "node": ">= 0.6.0" } }, "node_modules/process-nextick-args": { "version": "2.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true }, "node_modules/promise-inflight": { "version": "1.0.1", - "devOptional": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "devOptional": true }, "node_modules/promise-retry": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "devOptional": true, - "license": "MIT", "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -13787,8 +13878,9 @@ }, "node_modules/proxy-addr": { "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, - "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -13799,16 +13891,18 @@ }, "node_modules/proxy-addr/node_modules/ipaddr.js": { "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/proxy-agent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", "dev": true, - "license": "MIT", "dependencies": { "agent-base": "^6.0.0", "debug": "4", @@ -13825,8 +13919,9 @@ }, "node_modules/proxy-agent/node_modules/socks-proxy-agent": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", "dev": true, - "license": "MIT", "dependencies": { "agent-base": "^6.0.2", "debug": "4", @@ -13838,24 +13933,28 @@ }, "node_modules/proxy-from-env": { "version": "1.1.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true }, "node_modules/prr": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/psl": { "version": "1.9.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true }, "node_modules/pump": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, - "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -13863,14 +13962,16 @@ }, "node_modules/punycode": { "version": "2.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } }, "node_modules/qrcode": { "version": "1.5.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz", + "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==", "dependencies": { "dijkstrajs": "^1.0.1", "encode-utf8": "^1.0.3", @@ -13886,7 +13987,8 @@ }, "node_modules/qrcode/node_modules/ansi-styles": { "version": "4.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, @@ -13899,7 +14001,8 @@ }, "node_modules/qrcode/node_modules/cliui": { "version": "6.0.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -13908,7 +14011,8 @@ }, "node_modules/qrcode/node_modules/color-convert": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { "color-name": "~1.1.4" }, @@ -13918,11 +14022,13 @@ }, "node_modules/qrcode/node_modules/color-name": { "version": "1.1.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/qrcode/node_modules/wrap-ansi": { "version": "6.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -13934,11 +14040,13 @@ }, "node_modules/qrcode/node_modules/y18n": { "version": "4.0.3", - "license": "ISC" + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, "node_modules/qrcode/node_modules/yargs": { "version": "15.4.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -13958,7 +14066,8 @@ }, "node_modules/qrcode/node_modules/yargs-parser": { "version": "18.1.3", - "license": "ISC", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -13969,8 +14078,9 @@ }, "node_modules/qs": { "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, @@ -13983,12 +14093,14 @@ }, "node_modules/querystringify": { "version": "2.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true }, "node_modules/queue-microtask": { "version": "1.2.3", - "devOptional": true, + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -14002,29 +14114,31 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/randombytes": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, - "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/range-parser": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, - "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -14037,8 +14151,9 @@ }, "node_modules/raw-loader": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", "dev": true, - "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -14056,8 +14171,9 @@ }, "node_modules/raw-loader/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -14071,21 +14187,24 @@ }, "node_modules/raw-loader/node_modules/ajv-keywords": { "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/raw-loader/node_modules/json-schema-traverse": { "version": "0.4.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/raw-loader/node_modules/loader-utils": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, - "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -14097,8 +14216,9 @@ }, "node_modules/raw-loader/node_modules/schema-utils": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -14112,10 +14232,27 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/read-package-json": { "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", "devOptional": true, - "license": "ISC", "dependencies": { "glob": "^10.2.2", "json-parse-even-better-errors": "^3.0.0", @@ -14128,8 +14265,9 @@ }, "node_modules/read-package-json-fast": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", "devOptional": true, - "license": "ISC", "dependencies": { "json-parse-even-better-errors": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" @@ -14139,24 +14277,27 @@ } }, "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", "devOptional": true, - "license": "MIT", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", "devOptional": true, - "license": "MIT", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/readable-stream": { "version": "3.6.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -14168,8 +14309,8 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { "picomatch": "^2.2.1" }, @@ -14178,19 +14319,22 @@ } }, "node_modules/reflect-metadata": { - "version": "0.1.13", - "dev": true, - "license": "Apache-2.0" + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", + "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==", + "dev": true }, "node_modules/regenerate": { "version": "1.4.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true }, "node_modules/regenerate-unicode-properties": { "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, - "license": "MIT", "dependencies": { "regenerate": "^1.4.2" }, @@ -14200,26 +14344,30 @@ }, "node_modules/regenerator-runtime": { "version": "0.13.11", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true }, "node_modules/regenerator-transform": { "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.4" } }, "node_modules/regex-parser": { "version": "2.2.11", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", + "dev": true }, "node_modules/regexpu-core": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", @@ -14234,8 +14382,9 @@ }, "node_modules/regjsparser": { "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "jsesc": "~0.5.0" }, @@ -14245,6 +14394,8 @@ }, "node_modules/regjsparser/node_modules/jsesc": { "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true, "bin": { "jsesc": "bin/jsesc" @@ -14252,31 +14403,35 @@ }, "node_modules/require-directory": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "engines": { "node": ">=0.10.0" } }, "node_modules/require-from-string": { "version": "2.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "engines": { "node": ">=0.10.0" } }, "node_modules/require-main-filename": { "version": "2.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, "node_modules/requires-port": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true }, "node_modules/resolve": { "version": "1.22.2", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dependencies": { "is-core-module": "^2.11.0", "path-parse": "^1.0.7", @@ -14291,16 +14446,18 @@ }, "node_modules/resolve-from": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/resolve-url-loader": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", "dev": true, - "license": "MIT", "dependencies": { "adjust-sourcemap-loader": "^4.0.0", "convert-source-map": "^1.7.0", @@ -14314,8 +14471,9 @@ }, "node_modules/resolve-url-loader/node_modules/loader-utils": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, - "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -14327,15 +14485,17 @@ }, "node_modules/resolve-url-loader/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/restore-cursor": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -14346,14 +14506,16 @@ }, "node_modules/restore-cursor/node_modules/mimic-fn": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "engines": { "node": ">=6" } }, "node_modules/restore-cursor/node_modules/onetime": { "version": "5.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -14366,16 +14528,17 @@ }, "node_modules/retry": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "devOptional": true, - "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/reusify": { "version": "1.0.4", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -14383,13 +14546,15 @@ }, "node_modules/rfdc": { "version": "1.3.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true }, "node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "devOptional": true, - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -14402,8 +14567,9 @@ }, "node_modules/rimraf/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "devOptional": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -14411,8 +14577,9 @@ }, "node_modules/rimraf/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "devOptional": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -14430,8 +14597,9 @@ }, "node_modules/rimraf/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "devOptional": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -14441,7 +14609,8 @@ }, "node_modules/ripemd160": { "version": "2.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -14449,8 +14618,9 @@ }, "node_modules/rollup": { "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", "dev": true, - "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -14464,23 +14634,26 @@ }, "node_modules/rsvp": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", "dev": true, - "license": "MIT", "engines": { "node": "0.12.* || 4.* || 6.* || >= 7.*" } }, "node_modules/run-async": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/run-parallel": { "version": "1.2.0", - "devOptional": true, + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "funding": [ { "type": "github", @@ -14495,20 +14668,22 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/rxjs": { "version": "7.8.1", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -14522,18 +14697,19 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/safer-buffer": { "version": "2.1.2", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "devOptional": true }, "node_modules/sass": { "version": "1.64.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", + "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", "dev": true, - "license": "MIT", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -14548,8 +14724,9 @@ }, "node_modules/sass-loader": { "version": "13.3.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", + "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", "dev": true, - "license": "MIT", "dependencies": { "neo-async": "^2.6.2" }, @@ -14584,13 +14761,15 @@ }, "node_modules/sax": { "version": "1.1.4", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", + "dev": true }, "node_modules/saxes": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", "dev": true, - "license": "ISC", "dependencies": { "xmlchars": "^2.2.0" }, @@ -14600,8 +14779,9 @@ }, "node_modules/schema-utils": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -14618,13 +14798,15 @@ }, "node_modules/select-hose": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true }, "node_modules/selfsigned": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, - "license": "MIT", "dependencies": { "@types/node-forge": "^1.3.0", "node-forge": "^1" @@ -14635,8 +14817,9 @@ }, "node_modules/semver": { "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "devOptional": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -14649,13 +14832,15 @@ }, "node_modules/semver-compare": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true }, "node_modules/semver-regex": { "version": "3.1.4", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", + "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -14665,8 +14850,9 @@ }, "node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "devOptional": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -14676,13 +14862,15 @@ }, "node_modules/semver/node_modules/yallist": { "version": "4.0.0", - "devOptional": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true }, "node_modules/send": { "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, - "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -14704,34 +14892,39 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/send/node_modules/ms": { "version": "2.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, "node_modules/serialize-javascript": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/serve-index": { "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, - "license": "MIT", "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -14747,24 +14940,27 @@ }, "node_modules/serve-index/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/serve-index/node_modules/depd": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, - "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -14777,31 +14973,36 @@ }, "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serve-static": { "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, - "license": "MIT", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -14814,12 +15015,14 @@ }, "node_modules/set-blocking": { "version": "2.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "node_modules/set-function-length": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.1.1", "get-intrinsic": "^1.2.1", @@ -14832,12 +15035,14 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true }, "node_modules/sha.js": { "version": "2.4.11", - "license": "(MIT AND BSD-3-Clause)", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -14848,8 +15053,9 @@ }, "node_modules/shallow-clone": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, - "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -14859,8 +15065,9 @@ }, "node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "devOptional": true, - "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -14870,24 +15077,27 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/shell-quote": { "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/side-channel": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -14899,12 +15109,14 @@ }, "node_modules/signal-exit": { "version": "3.0.7", - "license": "ISC" + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/sigstore": { "version": "1.9.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", + "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", "devOptional": true, - "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^1.1.0", "@sigstore/protobuf-specs": "^0.2.0", @@ -14921,16 +15133,18 @@ }, "node_modules/sigstore/node_modules/@tootallnate/once": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "devOptional": true, - "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/sigstore/node_modules/cacache": { "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "devOptional": true, - "license": "ISC", "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", @@ -14951,8 +15165,9 @@ }, "node_modules/sigstore/node_modules/http-proxy-agent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "devOptional": true, - "license": "MIT", "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -14964,16 +15179,18 @@ }, "node_modules/sigstore/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "devOptional": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/sigstore/node_modules/make-fetch-happen": { "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "devOptional": true, - "license": "ISC", "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^17.0.0", @@ -14997,16 +15214,42 @@ }, "node_modules/sigstore/node_modules/make-fetch-happen/node_modules/minipass": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sigstore/node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "devOptional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/sigstore/node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "devOptional": true, - "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { "node": ">=8" } }, "node_modules/sigstore/node_modules/minipass-fetch": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "devOptional": true, - "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", @@ -15019,10 +15262,17 @@ "encoding": "^0.1.13" } }, + "node_modules/sigstore/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + }, "node_modules/sirv": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", + "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", "dev": true, - "license": "MIT", "dependencies": { "@polka/url": "^1.0.0-next.20", "mrmime": "^1.0.0", @@ -15034,8 +15284,9 @@ }, "node_modules/slash": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -15045,8 +15296,9 @@ }, "node_modules/slice-ansi": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -15061,8 +15313,9 @@ }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -15075,8 +15328,9 @@ }, "node_modules/slice-ansi/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -15086,13 +15340,15 @@ }, "node_modules/slice-ansi/node_modules/color-name": { "version": "1.1.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/smart-buffer": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "devOptional": true, - "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -15100,8 +15356,9 @@ }, "node_modules/sockjs": { "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, - "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", @@ -15110,8 +15367,9 @@ }, "node_modules/socks": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "devOptional": true, - "license": "MIT", "dependencies": { "ip": "^2.0.0", "smart-buffer": "^4.2.0" @@ -15123,8 +15381,9 @@ }, "node_modules/socks-proxy-agent": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "devOptional": true, - "license": "MIT", "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.3", @@ -15136,23 +15395,25 @@ }, "node_modules/source-map": { "version": "0.7.4", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "engines": { "node": ">= 8" } }, "node_modules/source-map-js": { "version": "1.0.2", - "dev": true, - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-loader": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", + "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", "dev": true, - "license": "MIT", "dependencies": { "abab": "^2.0.6", "iconv-lite": "^0.6.3", @@ -15171,8 +15432,9 @@ }, "node_modules/source-map-loader/node_modules/iconv-lite": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, - "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -15182,8 +15444,9 @@ }, "node_modules/source-map-support": { "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, - "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -15191,16 +15454,18 @@ }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/spdx-correct": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "devOptional": true, - "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -15208,13 +15473,15 @@ }, "node_modules/spdx-exceptions": { "version": "2.3.0", - "devOptional": true, - "license": "CC-BY-3.0" + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "devOptional": true }, "node_modules/spdx-expression-parse": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "devOptional": true, - "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -15222,13 +15489,15 @@ }, "node_modules/spdx-license-ids": { "version": "3.0.16", - "devOptional": true, - "license": "CC0-1.0" + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "devOptional": true }, "node_modules/spdy": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -15242,8 +15511,9 @@ }, "node_modules/spdy-transport": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -15255,30 +15525,35 @@ }, "node_modules/split2": { "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dev": true, - "license": "ISC", "dependencies": { "readable-stream": "^3.0.0" } }, "node_modules/sprintf-js": { "version": "1.0.3", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true }, "node_modules/ssh-config": { "version": "1.1.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ssh-config/-/ssh-config-1.1.6.tgz", + "integrity": "sha512-ZPO9rECxzs5JIQ6G/2EfL1I9ho/BVZkx9HRKn8+0af7QgwAmumQ7XBFP1ggMyPMo+/tUbmv0HFdv4qifdO/9JA==", + "dev": true }, "node_modules/ssr-window": { "version": "4.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-4.0.2.tgz", + "integrity": "sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ==" }, "node_modules/ssri": { "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", "devOptional": true, - "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -15288,16 +15563,18 @@ }, "node_modules/statuses": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/stream-combiner2": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", "dev": true, - "license": "MIT", "dependencies": { "duplexer2": "~0.1.0", "readable-stream": "^2.0.2" @@ -15305,8 +15582,9 @@ }, "node_modules/stream-combiner2/node_modules/readable-stream": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -15319,35 +15597,40 @@ }, "node_modules/stream-combiner2/node_modules/safe-buffer": { "version": "5.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/stream-combiner2/node_modules/string_decoder": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/string_decoder": { "version": "1.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string-argv": { "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.6.19" } }, "node_modules/string-width": { "version": "4.2.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15360,8 +15643,9 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "devOptional": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15373,7 +15657,8 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -15384,8 +15669,9 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "devOptional": true, - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -15395,8 +15681,9 @@ }, "node_modules/strip-final-newline": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -15404,10 +15691,80 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/superagent": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.3.1.tgz", + "integrity": "sha512-wjJ/MoTid2/RuGCOFtlacyGNxN9QLMgcpYLDQlWFIhhdJ93kNscFonGvrpAHSCVjRVj++DGCglocF7Aej1KHvQ==", + "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", "dev": true, - "license": "MIT", "dependencies": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.2", @@ -15427,8 +15784,9 @@ }, "node_modules/superagent-proxy": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-3.0.0.tgz", + "integrity": "sha512-wAlRInOeDFyd9pyonrkJspdRAxdLrcsZ6aSnS+8+nu4x1aXbz6FWSTT9M6Ibze+eG60szlL7JA8wEIV7bPWuyQ==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.3.2", "proxy-agent": "^5.0.0" @@ -15442,8 +15800,9 @@ }, "node_modules/superagent/node_modules/mime": { "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, - "license": "MIT", "bin": { "mime": "cli.js" }, @@ -15453,8 +15812,9 @@ }, "node_modules/supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -15464,8 +15824,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "engines": { "node": ">= 0.4" }, @@ -15475,6 +15835,8 @@ }, "node_modules/swiper": { "version": "8.4.7", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-8.4.7.tgz", + "integrity": "sha512-VwO/KU3i9IV2Sf+W2NqyzwWob4yX9Qdedq6vBtS0rFqJ6Fa5iLUJwxQkuD4I38w0WDJwmFl8ojkdcRFPHWD+2g==", "funding": [ { "type": "patreon", @@ -15486,7 +15848,6 @@ } ], "hasInstallScript": true, - "license": "MIT", "dependencies": { "dom7": "^4.0.4", "ssr-window": "^4.0.2" @@ -15497,29 +15858,80 @@ }, "node_modules/symbol-observable": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/symbol-tree": { "version": "3.2.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/tailwindcss": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.6.tgz", + "integrity": "sha512-AKjF7qbbLvLaPieoKeTjG1+FyNZT6KaJMJPFeQyLfIp7l82ggH1fbHJSsYIvnbTFQOlkh+gBYpyby5GT1LIdLw==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.19.1", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } }, "node_modules/tapable": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tar": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "devOptional": true, - "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -15534,8 +15946,9 @@ }, "node_modules/tar/node_modules/fs-minipass": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "devOptional": true, - "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -15545,8 +15958,9 @@ }, "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "devOptional": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -15556,21 +15970,24 @@ }, "node_modules/tar/node_modules/minipass": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "devOptional": true, - "license": "ISC", "engines": { "node": ">=8" } }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", - "devOptional": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true }, "node_modules/terser": { "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -15586,8 +16003,9 @@ }, "node_modules/terser-webpack-plugin": { "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", @@ -15619,8 +16037,9 @@ }, "node_modules/terser-webpack-plugin/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -15634,21 +16053,24 @@ }, "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { "version": "0.4.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -15664,13 +16086,15 @@ }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true }, "node_modules/test-exclude": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -15682,8 +16106,9 @@ }, "node_modules/test-exclude/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -15691,8 +16116,9 @@ }, "node_modules/test-exclude/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -15710,8 +16136,9 @@ }, "node_modules/test-exclude/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -15721,27 +16148,51 @@ }, "node_modules/text-mask-core": { "version": "5.1.2", - "license": "Unlicense" + "resolved": "https://registry.npmjs.org/text-mask-core/-/text-mask-core-5.1.2.tgz", + "integrity": "sha512-VfkCMdmRRZqXgQZFlDMiavm3hzsMzBM23CxHZsaeAYg66ZhXCNJWrFmnJwNy8KF9f74YvAUAuQenxsMCfuvhUw==" }, "node_modules/text-table": { "version": "0.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } }, "node_modules/through": { "version": "2.3.8", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "devOptional": true }, "node_modules/thunky": { "version": "1.1.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true }, "node_modules/tmp": { "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "devOptional": true, - "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -15751,16 +16202,17 @@ }, "node_modules/to-fast-properties": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/to-regex-range": { "version": "5.0.1", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dependencies": { "is-number": "^7.0.0" }, @@ -15770,24 +16222,27 @@ }, "node_modules/toidentifier": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/totalist": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tough-cookie": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -15800,16 +16255,18 @@ }, "node_modules/tough-cookie/node_modules/universalify": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/tr46": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "dev": true, - "license": "MIT", "dependencies": { "punycode": "^2.1.1" }, @@ -15819,19 +16276,27 @@ }, "node_modules/tree-kill": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, - "license": "MIT", "bin": { "tree-kill": "cli.js" } }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, "node_modules/ts-matches": { - "version": "v5.4.1", - "license": "MIT" + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ts-matches/-/ts-matches-5.4.1.tgz", + "integrity": "sha512-kXrY75F0s0WD15N2bWKDScKlKgwnusN6dTRzGs1N7LlxQRnazrsBISC1HL4sy2adsyk65Zbx3Ui3IGN8leAFOQ==" }, "node_modules/ts-morph": { "version": "20.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-20.0.0.tgz", + "integrity": "sha512-JVmEJy2Wow5n/84I3igthL9sudQ8qzjh/6i4tmYCm6IqYyKFlNbJZi7oBdjyqcWSWYRu3CtL0xbT6fS03ESZIg==", "optional": true, "dependencies": { "@ts-morph/common": "~0.21.0", @@ -15839,9 +16304,10 @@ } }, "node_modules/ts-node": { - "version": "10.9.1", - "dev": true, - "license": "MIT", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "devOptional": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -15881,21 +16347,31 @@ } }, "node_modules/ts-node/node_modules/acorn-walk": { - "version": "8.3.0", - "dev": true, - "license": "MIT", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", + "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", + "devOptional": true, "engines": { "node": ">=0.4.0" } }, + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "devOptional": true + }, "node_modules/tslib": { "version": "2.6.2", - "license": "0BSD" + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tslint": { "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", "dev": true, - "license": "Apache-2.0", "dependencies": { "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", @@ -15923,16 +16399,18 @@ }, "node_modules/tslint/node_modules/argparse": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/tslint/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -15940,21 +16418,24 @@ }, "node_modules/tslint/node_modules/builtin-modules": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/tslint/node_modules/commander": { "version": "2.20.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true }, "node_modules/tslint/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -15972,8 +16453,9 @@ }, "node_modules/tslint/node_modules/js-yaml": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -15984,8 +16466,9 @@ }, "node_modules/tslint/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -15995,8 +16478,9 @@ }, "node_modules/tslint/node_modules/mkdirp": { "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, - "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -16006,21 +16490,24 @@ }, "node_modules/tslint/node_modules/semver": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/tslint/node_modules/tslib": { "version": "1.14.1", - "dev": true, - "license": "0BSD" + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true }, "node_modules/tsutils": { "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, - "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -16030,13 +16517,15 @@ }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", - "dev": true, - "license": "0BSD" + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true }, "node_modules/tuf-js": { "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", "devOptional": true, - "license": "MIT", "dependencies": { "@tufjs/models": "1.0.4", "debug": "^4.3.4", @@ -16048,16 +16537,18 @@ }, "node_modules/tuf-js/node_modules/@tootallnate/once": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "devOptional": true, - "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/tuf-js/node_modules/cacache": { "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "devOptional": true, - "license": "ISC", "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", @@ -16078,8 +16569,9 @@ }, "node_modules/tuf-js/node_modules/http-proxy-agent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "devOptional": true, - "license": "MIT", "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -16091,16 +16583,18 @@ }, "node_modules/tuf-js/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "devOptional": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/tuf-js/node_modules/make-fetch-happen": { "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "devOptional": true, - "license": "ISC", "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^17.0.0", @@ -16124,16 +16618,42 @@ }, "node_modules/tuf-js/node_modules/make-fetch-happen/node_modules/minipass": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tuf-js/node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "devOptional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tuf-js/node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "devOptional": true, - "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { "node": ">=8" } }, "node_modules/tuf-js/node_modules/minipass-fetch": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "devOptional": true, - "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", @@ -16146,10 +16666,17 @@ "encoding": "^0.1.13" } }, + "node_modules/tuf-js/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + }, "node_modules/type-check": { "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "~1.1.2" }, @@ -16159,8 +16686,9 @@ }, "node_modules/type-fest": { "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "devOptional": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -16170,8 +16698,9 @@ }, "node_modules/type-is": { "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, - "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -16182,21 +16711,24 @@ }, "node_modules/typed-assert": { "version": "1.0.9", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, - "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" } }, "node_modules/typescript": { "version": "5.1.6", - "dev": true, - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -16207,21 +16739,24 @@ }, "node_modules/undici-types": { "version": "5.26.5", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "devOptional": true }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, - "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -16232,24 +16767,27 @@ }, "node_modules/unicode-match-property-value-ecmascript": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unique-filename": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "devOptional": true, - "license": "ISC", "dependencies": { "unique-slug": "^4.0.0" }, @@ -16259,8 +16797,9 @@ }, "node_modules/unique-slug": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "devOptional": true, - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" }, @@ -16270,30 +16809,35 @@ }, "node_modules/universalify": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/unpipe": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/untildify": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/update-browserslist-db": { "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -16309,7 +16853,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -16323,15 +16866,17 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/url-parse": { "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, - "license": "MIT", "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -16339,32 +16884,37 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/utils-merge": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4.0" } }, "node_modules/uuid": { "version": "8.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "devOptional": true }, "node_modules/validate-npm-package-license": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "devOptional": true, - "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -16372,8 +16922,9 @@ }, "node_modules/validate-npm-package-name": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", "devOptional": true, - "license": "ISC", "dependencies": { "builtins": "^5.0.0" }, @@ -16383,16 +16934,18 @@ }, "node_modules/vary": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/vite": { "version": "4.4.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.7.tgz", + "integrity": "sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw==", "dev": true, - "license": "MIT", "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.26", @@ -16445,8 +16998,10 @@ }, "node_modules/vm2": { "version": "3.9.19", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.19.tgz", + "integrity": "sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==", + "deprecated": "The library contains critical security issues and should not be used for production! The maintenance of the project has been discontinued. Consider migrating your code to isolated-vm.", "dev": true, - "license": "MIT", "dependencies": { "acorn": "^8.7.0", "acorn-walk": "^8.2.0" @@ -16459,25 +17014,29 @@ } }, "node_modules/vm2/node_modules/acorn-walk": { - "version": "8.3.0", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", + "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/w3c-hr-time": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", "dev": true, - "license": "MIT", "dependencies": { "browser-process-hrtime": "^1.0.0" } }, "node_modules/w3c-xmlserializer": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", "dev": true, - "license": "MIT", "dependencies": { "xml-name-validator": "^3.0.0" }, @@ -16487,8 +17046,9 @@ }, "node_modules/watchpack": { "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, - "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -16499,31 +17059,35 @@ }, "node_modules/wbuf": { "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, - "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" } }, "node_modules/wcwidth": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dependencies": { "defaults": "^1.0.3" } }, "node_modules/webidl-conversions": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=10.4" } }, "node_modules/webpack": { "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -16568,23 +17132,20 @@ } }, "node_modules/webpack-bundle-analyzer": { - "version": "4.9.1", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz", + "integrity": "sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==", "dev": true, - "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "0.5.7", "acorn": "^8.0.4", "acorn-walk": "^8.0.0", "commander": "^7.2.0", + "debounce": "^1.2.1", "escape-string-regexp": "^4.0.0", "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", "is-plain-object": "^5.0.0", - "lodash.debounce": "^4.0.8", - "lodash.escape": "^4.0.1", - "lodash.flatten": "^4.4.0", - "lodash.invokemap": "^4.6.0", - "lodash.pullall": "^4.2.0", - "lodash.uniqby": "^4.7.0", "opener": "^1.5.2", "picocolors": "^1.0.0", "sirv": "^2.0.3", @@ -16598,25 +17159,28 @@ } }, "node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { - "version": "8.3.0", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", + "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/webpack-bundle-analyzer/node_modules/commander": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/webpack-bundle-analyzer/node_modules/escape-string-regexp": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -16626,8 +17190,9 @@ }, "node_modules/webpack-dev-middleware": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", + "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", "dev": true, - "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.12", @@ -16653,8 +17218,9 @@ }, "node_modules/webpack-dev-server": { "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dev": true, - "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -16711,8 +17277,9 @@ }, "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "dev": true, - "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", @@ -16733,8 +17300,9 @@ }, "node_modules/webpack-dev-server/node_modules/ws": { "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", "dev": true, - "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -16753,8 +17321,9 @@ }, "node_modules/webpack-merge": { "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", "dev": true, - "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", "wildcard": "^2.0.0" @@ -16765,16 +17334,18 @@ }, "node_modules/webpack-sources": { "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, - "license": "MIT", "engines": { "node": ">=10.13.0" } }, "node_modules/webpack-subresource-integrity": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", "dev": true, - "license": "MIT", "dependencies": { "typed-assert": "^1.0.8" }, @@ -16793,14 +17364,16 @@ }, "node_modules/webpack/node_modules/@types/estree": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/webpack/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -16815,8 +17388,9 @@ }, "node_modules/webpack/node_modules/ajv-keywords": { "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "license": "MIT", "peer": true, "peerDependencies": { "ajv": "^6.9.1" @@ -16824,14 +17398,16 @@ }, "node_modules/webpack/node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/webpack/node_modules/schema-utils": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -16848,8 +17424,9 @@ }, "node_modules/websocket-driver": { "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -16861,33 +17438,38 @@ }, "node_modules/websocket-extensions": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=0.8.0" } }, "node_modules/whatwg-encoding": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "dev": true, - "license": "MIT", "dependencies": { "iconv-lite": "0.4.24" } }, "node_modules/whatwg-fetch": { "version": "3.6.19", - "license": "MIT" + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", + "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==" }, "node_modules/whatwg-mimetype": { "version": "2.3.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true }, "node_modules/whatwg-url": { "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "dev": true, - "license": "MIT", "dependencies": { "lodash": "^4.7.0", "tr46": "^2.1.0", @@ -16899,8 +17481,9 @@ }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "devOptional": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -16913,33 +17496,38 @@ }, "node_modules/which-module": { "version": "2.0.1", - "license": "ISC" + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" }, "node_modules/which-pm-runs": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/wide-align": { "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "devOptional": true, - "license": "ISC", "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "node_modules/wildcard": { "version": "2.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true }, "node_modules/windows-release": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", + "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", "dev": true, - "license": "MIT", "dependencies": { "execa": "^4.0.2" }, @@ -16952,8 +17540,9 @@ }, "node_modules/windows-release/node_modules/execa": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", @@ -16974,8 +17563,9 @@ }, "node_modules/windows-release/node_modules/get-stream": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, - "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -16988,16 +17578,18 @@ }, "node_modules/windows-release/node_modules/human-signals": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=8.12.0" } }, "node_modules/windows-release/node_modules/is-stream": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -17007,16 +17599,18 @@ }, "node_modules/windows-release/node_modules/mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/windows-release/node_modules/npm-run-path": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -17026,8 +17620,9 @@ }, "node_modules/windows-release/node_modules/onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -17040,24 +17635,27 @@ }, "node_modules/windows-release/node_modules/strip-final-newline": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/word-wrap": { "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/wrap-ansi": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "devOptional": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -17073,8 +17671,9 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "devOptional": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -17089,8 +17688,9 @@ }, "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "devOptional": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -17103,8 +17703,9 @@ }, "node_modules/wrap-ansi-cjs/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "devOptional": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -17114,13 +17715,15 @@ }, "node_modules/wrap-ansi-cjs/node_modules/color-name": { "version": "1.1.4", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "devOptional": true }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "devOptional": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -17133,8 +17736,9 @@ }, "node_modules/wrap-ansi/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "devOptional": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -17144,18 +17748,20 @@ }, "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "devOptional": true }, "node_modules/wrappy": { "version": "1.0.2", - "devOptional": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -17165,8 +17771,9 @@ }, "node_modules/ws": { "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -17185,51 +17792,62 @@ }, "node_modules/xml-name-validator": { "version": "3.0.0", - "dev": true, - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true }, "node_modules/xmlchars": { "version": "2.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true }, "node_modules/xregexp": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", "dev": true, - "license": "MIT" + "engines": { + "node": "*" + } }, "node_modules/xxhashjs": { "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", + "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", "dev": true, - "license": "MIT", "dependencies": { "cuint": "^0.2.2" } }, "node_modules/y18n": { "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "devOptional": true, - "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yallist": { "version": "3.1.1", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true }, "node_modules/yaml": { "version": "2.3.4", - "license": "ISC", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", "engines": { "node": ">= 14" } }, "node_modules/yargs": { "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "devOptional": true, - "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -17245,24 +17863,27 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "devOptional": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/yn": { "version": "3.1.1", - "dev": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "devOptional": true, "engines": { "node": ">=6" } }, "node_modules/yocto-queue": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -17272,7 +17893,8 @@ }, "node_modules/zone.js": { "version": "0.13.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.3.tgz", + "integrity": "sha512-MKPbmZie6fASC/ps4dkmIhaT5eonHkEt6eAy80K42tAm0G2W+AahLJjbfi6X9NPdciOE9GRFTTM8u2IiF6O3ww==", "dependencies": { "tslib": "^2.3.0" } diff --git a/web/package.json b/web/package.json index d7ed7e661..c82dc774e 100644 --- a/web/package.json +++ b/web/package.json @@ -46,14 +46,14 @@ "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc8.beta2", - "@taiga-ui/addon-charts": "3.56.0", - "@taiga-ui/addon-mobile": "3.56.0", - "@taiga-ui/cdk": "3.56.0", - "@taiga-ui/core": "3.56.0", - "@taiga-ui/experimental": "3.56.0", - "@taiga-ui/icons": "3.56.0", - "@taiga-ui/kit": "3.56.0", - "@taiga-ui/styles": "3.56.0", + "@taiga-ui/addon-charts": "3.57.0", + "@taiga-ui/addon-mobile": "3.57.0", + "@taiga-ui/cdk": "3.57.0", + "@taiga-ui/core": "3.57.0", + "@taiga-ui/experimental": "3.57.0", + "@taiga-ui/icons": "3.57.0", + "@taiga-ui/kit": "3.57.0", + "@taiga-ui/styles": "3.57.0", "@tinkoff/ng-dompurify": "4.0.0", "@tinkoff/ng-event-plugins": "3.1.0", "ansi-to-html": "^0.7.2", @@ -77,6 +77,7 @@ "pbkdf2": "^3.1.2", "rxjs": "^7.5.6", "swiper": "^8.2.4", + "tailwindcss": "^3.3.3", "ts-matches": "^5.2.1", "tslib": "^2.3.0", "uuid": "^8.3.2", @@ -97,10 +98,12 @@ "@types/node-jose": "^1.1.10", "@types/pbkdf2": "^3.1.0", "@types/uuid": "^8.3.1", + "autoprefixer": "^10.4.14", "husky": "^4.3.8", "lint-staged": "^13.2.0", "ng-packagr": "^16.1.0", "node-html-parser": "^5.3.3", + "postcss": "^8.4.21", "prettier": "^2.6.1", "raw-loader": "^4.0.2", "ts-node": "^10.7.0", diff --git a/web/projects/marketplace/index.ts b/web/projects/marketplace/index.ts new file mode 100644 index 000000000..fc9746eab --- /dev/null +++ b/web/projects/marketplace/index.ts @@ -0,0 +1 @@ +export * from './src/public-api' diff --git a/web/projects/marketplace/package.json b/web/projects/marketplace/package.json index 85ef8b4db..87d7c574d 100644 --- a/web/projects/marketplace/package.json +++ b/web/projects/marketplace/package.json @@ -1,13 +1,14 @@ { "name": "@start9labs/marketplace", - "version": "0.3.12", + "version": "0.3.16", "peerDependencies": { "@angular/common": ">=13.2.0", "@angular/core": ">=13.2.0", "@ionic/angular": ">=6.0.0", - "@start9labs/shared": ">=0.3.0", + "@start9labs/shared": ">=0.3.2", "@taiga-ui/cdk": ">=3.0.0", "@tinkoff/ng-dompurify": ">=4.0.0", + "tailwindcss": "^3.3.2", "fuse.js": "^6.4.6" }, "dependencies": { diff --git a/web/projects/marketplace/src/components/menu/menu.component.html b/web/projects/marketplace/src/components/menu/menu.component.html new file mode 100644 index 000000000..d1a8bac4e --- /dev/null +++ b/web/projects/marketplace/src/components/menu/menu.component.html @@ -0,0 +1,145 @@ +
    + + + +
    +
    + + + +
    + + + +
    + + +
    +
    + + + + diff --git a/web/projects/marketplace/src/components/menu/menu.component.module.ts b/web/projects/marketplace/src/components/menu/menu.component.module.ts new file mode 100644 index 000000000..c5c9b1361 --- /dev/null +++ b/web/projects/marketplace/src/components/menu/menu.component.module.ts @@ -0,0 +1,30 @@ +import { CommonModule } from '@angular/common' +import { NgModule } from '@angular/core' +import { SharedPipesModule } from '@start9labs/shared' + +import { MenuComponent } from './menu.component' +import { TuiButtonModule, TuiLoaderModule } from '@taiga-ui/core' +import { TuiActiveZoneModule, TuiLetModule } from '@taiga-ui/cdk' +import { TuiSidebarModule } from '@taiga-ui/addon-mobile' +import { SearchModule } from '../../pages/list/search/search.module' +import { CategoriesModule } from '../../pages/list/categories/categories.module' +import { StoreIconComponentModule } from '../store-icon/store-icon.component.module' + +@NgModule({ + imports: [ + CommonModule, + SharedPipesModule, + SearchModule, + CategoriesModule, + TuiActiveZoneModule, + TuiSidebarModule, + TuiLoaderModule, + TuiButtonModule, + CategoriesModule, + StoreIconComponentModule, + TuiLetModule, + ], + declarations: [MenuComponent], + exports: [MenuComponent], +}) +export class MenuModule {} diff --git a/web/projects/marketplace/src/components/menu/menu.component.scss b/web/projects/marketplace/src/components/menu/menu.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/web/projects/marketplace/src/components/menu/menu.component.ts b/web/projects/marketplace/src/components/menu/menu.component.ts new file mode 100644 index 000000000..15bde3510 --- /dev/null +++ b/web/projects/marketplace/src/components/menu/menu.component.ts @@ -0,0 +1,89 @@ +import { + ChangeDetectionStrategy, + Component, + inject, + Input, + OnDestroy, +} from '@angular/core' +import { combineLatest, map, Subject, takeUntil } from 'rxjs' +import { StoreIdentity } from '../../types' +import { AbstractMarketplaceService } from '../../services/marketplace.service' +import { AbstractCategoryService } from '../../services/category.service' +import { Router } from '@angular/router' +import { MarketplaceConfig } from '@start9labs/shared' + +@Component({ + selector: 'menu', + templateUrl: './menu.component.html', + styleUrls: ['./menu.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class MenuComponent implements OnDestroy { + @Input({ required: true }) + iconConfig!: MarketplaceConfig + + constructor(private readonly router: Router) {} + + private destroy$ = new Subject() + private readonly marketplaceService = inject(AbstractMarketplaceService) + private readonly categoryService = inject(AbstractCategoryService) + readonly store$ = this.marketplaceService.getSelectedStoreWithCategories$() + readonly alt$ = combineLatest([ + this.marketplaceService.getKnownHosts$(), + this.marketplaceService.getSelectedHost$(), + ]).pipe( + map(([stores, selected]) => + stores.filter(({ url }) => url != selected.url), + ), + ) + private hosts?: StoreIdentity[] + category = '' + query = '' + open = false + + ngOnInit() { + this.categoryService + .getQuery$() + .pipe(takeUntil(this.destroy$)) + .subscribe(val => { + this.query = val + }) + + this.categoryService + .getCategory$() + .pipe(takeUntil(this.destroy$)) + .subscribe(val => { + this.category = val + }) + + this.marketplaceService + .getKnownHosts$() + .pipe(takeUntil(this.destroy$)) + .subscribe(hosts => { + this.hosts = hosts + }) + } + + onCategoryChange(category: string): void { + this.category = category + this.query = '' + this.categoryService.resetQuery() + this.categoryService.changeCategory(category) + this.router.navigate(['/marketplace'], { replaceUrl: true }) + } + + onQueryChange(query: string): void { + this.query = query + this.categoryService.setQuery(query) + this.router.navigate(['/marketplace'], { replaceUrl: true }) + } + + toggleMenu(open: boolean): void { + this.open = open + } + + ngOnDestroy(): void { + this.destroy$.next() + this.destroy$.complete() + } +} diff --git a/web/projects/marketplace/src/components/store-icon/store-icon.component.html b/web/projects/marketplace/src/components/store-icon/store-icon.component.html index 76638337e..2000f287d 100644 --- a/web/projects/marketplace/src/components/store-icon/store-icon.component.html +++ b/web/projects/marketplace/src/components/store-icon/store-icon.component.html @@ -1,5 +1,6 @@ Service Icon - {{ cat }} - +
    + Category Icon +
    + + {{ (cat | titlecase) || 'loading category...' }} + + diff --git a/web/projects/marketplace/src/pages/list/categories/categories.component.scss b/web/projects/marketplace/src/pages/list/categories/categories.component.scss index f558e8c32..7850ab3e4 100644 --- a/web/projects/marketplace/src/pages/list/categories/categories.component.scss +++ b/web/projects/marketplace/src/pages/list/categories/categories.component.scss @@ -1,14 +1,12 @@ -:host { - display: block; +.category_selected { + font-weight: bold; } -.category { - font-weight: 300; - color: var(--ion-color-dark-shade); - - &_selected { - font-weight: bold; - font-size: 17px; - color: var(--color); +@media (min-width: 600px) { + .category_selected { + border-top-left-radius: 0.5rem; + border-bottom-left-radius: 0.5rem; + background-color: #222428; + opacity: 90; } -} +} \ No newline at end of file diff --git a/web/projects/marketplace/src/pages/list/categories/categories.component.ts b/web/projects/marketplace/src/pages/list/categories/categories.component.ts index b34761079..761ffa386 100644 --- a/web/projects/marketplace/src/pages/list/categories/categories.component.ts +++ b/web/projects/marketplace/src/pages/list/categories/categories.component.ts @@ -10,14 +10,11 @@ import { selector: 'marketplace-categories', templateUrl: 'categories.component.html', styleUrls: ['categories.component.scss'], - host: { - class: 'hidden-scrollbar ion-text-center', - }, changeDetection: ChangeDetectionStrategy.OnPush, }) export class CategoriesComponent { @Input() - categories: readonly string[] = [] + categories?: string[] @Input() category = '' @@ -29,4 +26,31 @@ export class CategoriesComponent { this.category = category this.categoryChange.emit(category) } + + determineIcon(category: string): string { + switch (category.toLowerCase()) { + case 'all': + return 'apps-outline' + case 'bitcoin': + return 'logo-bitcoin' + case 'communications': + return 'chatbubbles-outline' + case 'data': + return 'document-outline' + case 'developer tools': + return 'code-slash-outline' + case 'featured': + return 'star-outline' + case 'lightning': + return 'flash-outline' + case 'media': + return 'play-outline' + case 'networking': + return 'globe-outline' + case 'social': + return 'people-outline' + default: + return 'cube-outline' + } + } } diff --git a/web/projects/marketplace/src/pages/list/item/item.component.html b/web/projects/marketplace/src/pages/list/item/item.component.html index 0220a0a0c..f3b507125 100644 --- a/web/projects/marketplace/src/pages/list/item/item.component.html +++ b/web/projects/marketplace/src/pages/list/item/item.component.html @@ -1,12 +1,33 @@ - - - - - -

    - {{ pkg.manifest.title }} -

    -

    {{ pkg.manifest.description.short }}

    - -
    -
    +
    + +
    + {{ pkg.manifest.title }} Icon +
    + +
    + + {{ pkg.manifest.title }} Icon +
    + + {{ pkg.manifest.title }} + + + {{ pkg.manifest.description.short }} + +
    +
    diff --git a/web/projects/marketplace/src/pages/list/item/item.module.ts b/web/projects/marketplace/src/pages/list/item/item.module.ts index dd157174e..c466ac2af 100644 --- a/web/projects/marketplace/src/pages/list/item/item.module.ts +++ b/web/projects/marketplace/src/pages/list/item/item.module.ts @@ -1,20 +1,12 @@ import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' -import { IonicModule } from '@ionic/angular' import { RouterModule } from '@angular/router' import { SharedPipesModule } from '@start9labs/shared' import { ItemComponent } from './item.component' -import { MimeTypePipeModule } from '../../../pipes/mime-type.pipe' @NgModule({ declarations: [ItemComponent], exports: [ItemComponent], - imports: [ - CommonModule, - IonicModule, - RouterModule, - SharedPipesModule, - MimeTypePipeModule, - ], + imports: [CommonModule, RouterModule, SharedPipesModule], }) export class ItemModule {} diff --git a/web/projects/marketplace/src/pages/list/search/search.component.html b/web/projects/marketplace/src/pages/list/search/search.component.html index 1b19c8ec0..93e70f791 100644 --- a/web/projects/marketplace/src/pages/list/search/search.component.html +++ b/web/projects/marketplace/src/pages/list/search/search.component.html @@ -1,14 +1,20 @@ - - - - - - - - - +
    +
    + Search icon + +
    +
    diff --git a/web/projects/marketplace/src/pages/list/search/search.component.scss b/web/projects/marketplace/src/pages/list/search/search.component.scss index b81945ce0..e69de29bb 100644 --- a/web/projects/marketplace/src/pages/list/search/search.component.scss +++ b/web/projects/marketplace/src/pages/list/search/search.component.scss @@ -1,8 +0,0 @@ -:host { - display: block; - padding-bottom: 32px; -} - -.column { - margin: 0 auto; -} diff --git a/web/projects/marketplace/src/pages/list/search/search.component.ts b/web/projects/marketplace/src/pages/list/search/search.component.ts index 94f27eeb1..26dfd3998 100644 --- a/web/projects/marketplace/src/pages/list/search/search.component.ts +++ b/web/projects/marketplace/src/pages/list/search/search.component.ts @@ -16,7 +16,7 @@ import { THEME } from '@start9labs/shared' }) export class SearchComponent { @Input() - query = '' + query?: string | null = '' @Output() readonly queryChange = new EventEmitter() diff --git a/web/projects/marketplace/src/pages/list/search/search.module.ts b/web/projects/marketplace/src/pages/list/search/search.module.ts index d0072bc02..2da2a8e50 100644 --- a/web/projects/marketplace/src/pages/list/search/search.module.ts +++ b/web/projects/marketplace/src/pages/list/search/search.module.ts @@ -1,13 +1,11 @@ -import { CommonModule } from '@angular/common' -import { NgModule } from '@angular/core' -import { FormsModule } from '@angular/forms' -import { IonicModule } from '@ionic/angular' -import { ResponsiveColDirective } from '@start9labs/shared' - -import { SearchComponent } from './search.component' +import { CommonModule } from "@angular/common"; +import { NgModule } from "@angular/core"; +import { FormsModule } from "@angular/forms"; +import { ResponsiveColDirective } from "@start9labs/shared"; +import { SearchComponent } from "./search.component"; @NgModule({ - imports: [IonicModule, FormsModule, CommonModule, ResponsiveColDirective], + imports: [FormsModule, CommonModule, ResponsiveColDirective], declarations: [SearchComponent], exports: [SearchComponent], }) diff --git a/web/projects/marketplace/src/pages/list/skeleton/skeleton.component.html b/web/projects/marketplace/src/pages/list/skeleton/skeleton.component.html index 8cdce3d16..0e8fdfa2a 100644 --- a/web/projects/marketplace/src/pages/list/skeleton/skeleton.component.html +++ b/web/projects/marketplace/src/pages/list/skeleton/skeleton.component.html @@ -1,4 +1,4 @@ -
    +
    + + + + + + + + + + + + + - + diff --git a/web/projects/marketplace/src/pages/release-notes/release-notes.component.html b/web/projects/marketplace/src/pages/release-notes/release-notes.component.html index 7cb79764b..bb9e750e1 100644 --- a/web/projects/marketplace/src/pages/release-notes/release-notes.component.html +++ b/web/projects/marketplace/src/pages/release-notes/release-notes.component.html @@ -1,33 +1,58 @@ - - -
    - -

    {{ note.key | displayEmver }}

    -
    - +
    +
    +

    What's new

    +

    - Latest Release +  -  + {{ published | date : 'medium' }} +

    +
    +
    +
    +

    Version {{ pkg.manifest.version }}

    +

    - + class="flex-wrap mt-1" + [innerHTML]="pkg.manifest['release-notes'] | markdown | dompurify" + >

    +
    +
    +
    +
    + + + + + + {{ note.key | displayEmver }} + +

    +
    +
    +
    -
    + diff --git a/web/projects/marketplace/src/pages/release-notes/release-notes.component.scss b/web/projects/marketplace/src/pages/release-notes/release-notes.component.scss index cd74c7a04..e69de29bb 100644 --- a/web/projects/marketplace/src/pages/release-notes/release-notes.component.scss +++ b/web/projects/marketplace/src/pages/release-notes/release-notes.component.scss @@ -1,23 +0,0 @@ -:host { - flex: 1 1 0; -} - -.panel { - margin: 0; - padding: 0 24px; - transition: max-height 0.2s ease-out; -} - -.active { - border: 5px solid #4d4d4d; -} - -.version-button { - height: 50px; - margin: 1px; -} - -.version { - position: absolute; - left: 10px; -} diff --git a/web/projects/marketplace/src/pages/release-notes/release-notes.component.ts b/web/projects/marketplace/src/pages/release-notes/release-notes.component.ts index c075d09ea..763fa3916 100644 --- a/web/projects/marketplace/src/pages/release-notes/release-notes.component.ts +++ b/web/projects/marketplace/src/pages/release-notes/release-notes.component.ts @@ -1,7 +1,15 @@ -import { ChangeDetectionStrategy, Component, ElementRef } from '@angular/core' +import { + ChangeDetectionStrategy, + Component, + Inject, + Input, +} from '@angular/core' import { ActivatedRoute } from '@angular/router' -import { getPkgId } from '@start9labs/shared' import { AbstractMarketplaceService } from '../../services/marketplace.service' +import { PolymorpheusContent } from '@tinkoff/ng-polymorpheus' +import { TuiDialogContext, TuiDialogService } from '@taiga-ui/core' +import { MarketplacePkg } from '../../types' +import { Observable } from 'rxjs' @Component({ selector: 'release-notes', @@ -13,27 +21,29 @@ export class ReleaseNotesComponent { constructor( private readonly route: ActivatedRoute, private readonly marketplaceService: AbstractMarketplaceService, + @Inject(TuiDialogService) private readonly dialogs: TuiDialogService, ) {} - private readonly pkgId = getPkgId(this.route) + @Input({ required: true }) + pkg!: MarketplacePkg - private selected: string | null = null + notes$!: Observable> - readonly notes$ = this.marketplaceService.fetchReleaseNotes$(this.pkgId) - - isSelected(key: string): boolean { - return this.selected === key - } - - setSelected(selected: string) { - this.selected = this.isSelected(selected) ? null : selected - } - - getDocSize(key: string, { nativeElement }: ElementRef) { - return this.isSelected(key) ? nativeElement.scrollHeight : 0 + ngOnChanges() { + this.notes$ = this.marketplaceService.fetchReleaseNotes$( + this.pkg.manifest.id, + ) } asIsOrder(a: any, b: any) { return 0 } + + async showReleaseNotes(content: PolymorpheusContent) { + this.dialogs + .open(content, { + label: 'Previous Release Notes', + }) + .subscribe() + } } diff --git a/web/projects/marketplace/src/pages/release-notes/release-notes.module.ts b/web/projects/marketplace/src/pages/release-notes/release-notes.module.ts index ae554f156..88d5b074e 100644 --- a/web/projects/marketplace/src/pages/release-notes/release-notes.module.ts +++ b/web/projects/marketplace/src/pages/release-notes/release-notes.module.ts @@ -1,27 +1,26 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' +import { NgModule } from "@angular/core"; +import { CommonModule } from "@angular/common"; import { EmverPipesModule, MarkdownPipeModule, SafeLinksDirective, TextSpinnerComponentModule, -} from '@start9labs/shared' -import { TuiElementModule } from '@taiga-ui/cdk' -import { NgDompurifyModule } from '@tinkoff/ng-dompurify' - -import { ReleaseNotesComponent } from './release-notes.component' +} from "@start9labs/shared"; +import { NgDompurifyModule } from "@tinkoff/ng-dompurify"; +import { ReleaseNotesComponent } from "./release-notes.component"; +import { TuiButtonModule } from "@taiga-ui/core"; +import { TuiAccordionModule } from "@taiga-ui/kit"; @NgModule({ imports: [ CommonModule, - IonicModule, TextSpinnerComponentModule, EmverPipesModule, MarkdownPipeModule, - TuiElementModule, NgDompurifyModule, SafeLinksDirective, + TuiButtonModule, + TuiAccordionModule, ], declarations: [ReleaseNotesComponent], exports: [ReleaseNotesComponent], diff --git a/web/projects/marketplace/src/pages/show/about/about.component.html b/web/projects/marketplace/src/pages/show/about/about.component.html index bf8495095..0096aeb9c 100644 --- a/web/projects/marketplace/src/pages/show/about/about.component.html +++ b/web/projects/marketplace/src/pages/show/about/about.component.html @@ -1,32 +1,21 @@ - - - New in {{ pkg.manifest.version | displayEmver }} - - - -
    -
    -
    - - Past Release Notes - - - -Description - - -

    {{ pkg.manifest.description.long }}

    -
    -
    - - View website - - +
    +

    Description

    +

    + {{ pkg.manifest.description.long }} +

    + +
    +

    Intended to replace

    + +
    +
    +
    diff --git a/web/projects/marketplace/src/pages/show/about/about.module.ts b/web/projects/marketplace/src/pages/show/about/about.module.ts index 24ff139ed..e18075019 100644 --- a/web/projects/marketplace/src/pages/show/about/about.module.ts +++ b/web/projects/marketplace/src/pages/show/about/about.module.ts @@ -1,23 +1,16 @@ -import { CommonModule } from '@angular/common' -import { NgModule } from '@angular/core' -import { RouterModule } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { - EmverPipesModule, - MarkdownPipeModule, - SafeLinksDirective, -} from '@start9labs/shared' -import { NgDompurifyModule } from '@tinkoff/ng-dompurify' - -import { AboutComponent } from './about.component' +import { CommonModule } from "@angular/common"; +import { NgModule } from "@angular/core"; +import { RouterModule } from "@angular/router"; +import { AboutComponent } from "./about.component"; +import { TuiTagModule } from "@taiga-ui/kit"; +import { NgDompurifyModule } from "@tinkoff/ng-dompurify"; +import { SafeLinksDirective } from "@start9labs/shared"; @NgModule({ imports: [ CommonModule, RouterModule, - IonicModule, - MarkdownPipeModule, - EmverPipesModule, + TuiTagModule, NgDompurifyModule, SafeLinksDirective, ], diff --git a/web/projects/marketplace/src/pages/show/additional/additional-link/additional-link.component.html b/web/projects/marketplace/src/pages/show/additional/additional-link/additional-link.component.html new file mode 100644 index 000000000..a38949a00 --- /dev/null +++ b/web/projects/marketplace/src/pages/show/additional/additional-link/additional-link.component.html @@ -0,0 +1,12 @@ + +
    + + Open Icon +
    +
    diff --git a/web/projects/marketplace/src/pages/show/additional/additional-link/additional-link.component.module.ts b/web/projects/marketplace/src/pages/show/additional/additional-link/additional-link.component.module.ts new file mode 100644 index 000000000..2e1257040 --- /dev/null +++ b/web/projects/marketplace/src/pages/show/additional/additional-link/additional-link.component.module.ts @@ -0,0 +1,12 @@ +import { CommonModule } from '@angular/common' +import { NgModule } from '@angular/core' +import { AdditionalLinkComponent } from './additional-link.component' +import { TuiLabelModule } from '@taiga-ui/core' +import { TuiLineClampModule } from '@taiga-ui/kit' + +@NgModule({ + imports: [CommonModule, TuiLabelModule, TuiLineClampModule], + declarations: [AdditionalLinkComponent], + exports: [AdditionalLinkComponent], +}) +export class AdditionalLinkModule {} diff --git a/web/projects/marketplace/src/pages/show/additional/additional-link/additional-link.component.scss b/web/projects/marketplace/src/pages/show/additional/additional-link/additional-link.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/web/projects/marketplace/src/pages/show/additional/additional-link/additional-link.component.ts b/web/projects/marketplace/src/pages/show/additional/additional-link/additional-link.component.ts new file mode 100644 index 000000000..6c87ea81c --- /dev/null +++ b/web/projects/marketplace/src/pages/show/additional/additional-link/additional-link.component.ts @@ -0,0 +1,16 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core' +import { Url } from '@start9labs/shared' + +@Component({ + selector: 'marketplace-additional-link', + templateUrl: 'additional-link.component.html', + styleUrls: ['additional-link.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AdditionalLinkComponent { + @Input({ required: true }) + url!: Url + + @Input({ required: true }) + label!: string +} diff --git a/web/projects/marketplace/src/pages/show/additional/additional.component.html b/web/projects/marketplace/src/pages/show/additional/additional.component.html index a639cb994..14a6cbba3 100644 --- a/web/projects/marketplace/src/pages/show/additional/additional.component.html +++ b/web/projects/marketplace/src/pages/show/additional/additional.component.html @@ -1,131 +1,128 @@ - -
    - Intended to replace -
      -
    • - {{ app }} -
    • -
    -
    -
    +
    +
    +

    Information

    +
    + +
    + + Copy Icon +
    + +
    + +
    +
    + +
    +
    + + Open Icon +
    +
    + +
    +
    + + Open Icon +
    +
    -Additional Info - - - - - - -

    Git Hash

    -

    {{ gitHash }}

    -
    - -
    - - - -

    Git Hash

    -

    Unknown

    -
    -
    + +
    +
    + + Open Icon +
    + + +
    + + +
    - - -

    Other Versions

    -

    Click to view other versions

    -
    - - - -
    - - -
    -
    -
    - - -

    License

    -

    {{ manifest.license }}

    -
    - -
    - - -

    Instructions

    -

    Click to view instructions

    -
    - -
    - - - - - - -

    Source Repository

    -

    {{ manifest['upstream-repo'] }}

    -
    - -
    - - -

    Wrapper Repository

    -

    {{ manifest['wrapper-repo'] }}

    -
    - -
    - - -

    Support Site

    -

    {{ manifest['support-site'] || 'Not provided' }}

    -
    - -
    -
    -
    - - +
    + + + + + +
    +
    +
    diff --git a/web/projects/marketplace/src/pages/show/additional/additional.component.scss b/web/projects/marketplace/src/pages/show/additional/additional.component.scss index 8508da686..e69de29bb 100644 --- a/web/projects/marketplace/src/pages/show/additional/additional.component.scss +++ b/web/projects/marketplace/src/pages/show/additional/additional.component.scss @@ -1,10 +0,0 @@ -.radio { - display: block; - margin: 1rem 0; -} - -.buttons { - display: flex; - justify-content: flex-end; - gap: 1rem; -} diff --git a/web/projects/marketplace/src/pages/show/additional/additional.component.ts b/web/projects/marketplace/src/pages/show/additional/additional.component.ts index 4a19abb2c..3a152b8ce 100644 --- a/web/projects/marketplace/src/pages/show/additional/additional.component.ts +++ b/web/projects/marketplace/src/pages/show/additional/additional.component.ts @@ -2,6 +2,7 @@ import { ChangeDetectionStrategy, Component, EventEmitter, + inject, Input, Output, TemplateRef, @@ -38,13 +39,13 @@ export class AdditionalComponent { version = new EventEmitter() readonly displayEmver = displayEmver + private readonly marketplaceService = inject(AbstractMarketplaceService) constructor( readonly copyService: CopyService, private readonly alerts: TuiAlertService, private readonly dialogs: TuiDialogService, private readonly emver: Emver, - private readonly marketplaceService: AbstractMarketplaceService, private readonly route: ActivatedRoute, ) {} diff --git a/web/projects/marketplace/src/pages/show/additional/additional.module.ts b/web/projects/marketplace/src/pages/show/additional/additional.module.ts index 208175eb3..13e353291 100644 --- a/web/projects/marketplace/src/pages/show/additional/additional.module.ts +++ b/web/projects/marketplace/src/pages/show/additional/additional.module.ts @@ -1,26 +1,25 @@ -import { CommonModule } from '@angular/common' -import { NgModule } from '@angular/core' -import { IonicModule } from '@ionic/angular' -import { MarkdownModule, ResponsiveColDirective } from '@start9labs/shared' - -import { AdditionalComponent } from './additional.component' +import { CommonModule } from "@angular/common"; +import { NgModule } from "@angular/core"; +import { AdditionalComponent } from "./additional.component"; import { TuiRadioListModule, TuiStringifyContentPipeModule, -} from '@taiga-ui/kit' -import { FormsModule } from '@angular/forms' -import { TuiButtonModule } from '@taiga-ui/core' +} from "@taiga-ui/kit"; +import { FormsModule } from "@angular/forms"; +import { TuiButtonModule, TuiLabelModule } from "@taiga-ui/core"; +import { AdditionalLinkModule } from "./additional-link/additional-link.component.module"; +import { ResponsiveColDirective } from "@start9labs/shared"; @NgModule({ imports: [ CommonModule, - IonicModule, - MarkdownModule, ResponsiveColDirective, TuiRadioListModule, FormsModule, TuiStringifyContentPipeModule, TuiButtonModule, + TuiLabelModule, + AdditionalLinkModule, ], declarations: [AdditionalComponent], exports: [AdditionalComponent], diff --git a/web/projects/marketplace/src/pages/show/dependencies/dependencies.component.html b/web/projects/marketplace/src/pages/show/dependencies/dependencies.component.html index 87b902603..d2b86b1c1 100644 --- a/web/projects/marketplace/src/pages/show/dependencies/dependencies.component.html +++ b/web/projects/marketplace/src/pages/show/dependencies/dependencies.component.html @@ -1,35 +1,30 @@ -Dependencies - - - - - - - - -

    - {{ pkg['dependency-metadata'][dep.key].title }} - - (required) - (required by default) - (optional) - -

    -

    - {{ dep.value.version | displayEmver }} -

    -

    {{ dep.value.description }}

    -
    -
    -
    -
    -
    +
    +
    + +
    +
    + + {{ getTitle(dep.key) }} + +

    + + (required) + (required by default) + (optional) + +

    +
    + + {{ dep.value.version | displayEmver }} + + + {{ dep.value.description }} + +
    +
    +
    diff --git a/web/projects/marketplace/src/pages/show/dependencies/dependencies.component.scss b/web/projects/marketplace/src/pages/show/dependencies/dependencies.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/web/projects/marketplace/src/pages/show/dependencies/dependencies.component.ts b/web/projects/marketplace/src/pages/show/dependencies/dependencies.component.ts index 40e7c3ff0..3b48f468e 100644 --- a/web/projects/marketplace/src/pages/show/dependencies/dependencies.component.ts +++ b/web/projects/marketplace/src/pages/show/dependencies/dependencies.component.ts @@ -1,17 +1,27 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core' -import { MarketplacePkg } from '../../../types' +import { Dependency, MarketplacePkg } from '../../../types' +import { KeyValue } from '@angular/common' @Component({ selector: 'marketplace-dependencies', templateUrl: 'dependencies.component.html', + styleUrls: ['./dependencies.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) export class DependenciesComponent { @Input({ required: true }) pkg!: MarketplacePkg - getImg(key: string): string { + @Input({ required: true }) + dep!: KeyValue + + getImage(key: string): string { + const icon = this.pkg['dependency-metadata'][key]?.icon // @TODO fix when registry api is updated to include mimetype in icon url - return 'data:image/png;base64,' + this.pkg['dependency-metadata'][key].icon + return icon ? `data:image/png;base64,${icon}` : key.substring(0, 2) + } + + getTitle(key: string): string { + return this.pkg['dependency-metadata'][key]?.title || key } } diff --git a/web/projects/marketplace/src/pages/show/dependencies/dependencies.module.ts b/web/projects/marketplace/src/pages/show/dependencies/dependencies.module.ts index 1d8e403c8..168fe663f 100644 --- a/web/projects/marketplace/src/pages/show/dependencies/dependencies.module.ts +++ b/web/projects/marketplace/src/pages/show/dependencies/dependencies.module.ts @@ -1,23 +1,16 @@ import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' import { RouterModule } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { - EmverPipesModule, - ResponsiveColDirective, - SharedPipesModule, -} from '@start9labs/shared' - +import { EmverPipesModule, ResponsiveColDirective } from '@start9labs/shared' import { DependenciesComponent } from './dependencies.component' - +import { TuiAvatarModule } from '@taiga-ui/experimental' @NgModule({ imports: [ CommonModule, RouterModule, - IonicModule, - SharedPipesModule, - EmverPipesModule, ResponsiveColDirective, + TuiAvatarModule, + EmverPipesModule, ], declarations: [DependenciesComponent], exports: [DependenciesComponent], diff --git a/web/projects/marketplace/src/pages/show/hero/hero.component.ts b/web/projects/marketplace/src/pages/show/hero/hero.component.ts new file mode 100644 index 000000000..dfc9e1398 --- /dev/null +++ b/web/projects/marketplace/src/pages/show/hero/hero.component.ts @@ -0,0 +1,55 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, Input } from '@angular/core' +import { SharedPipesModule } from '@start9labs/shared' +import { MarketplacePkg } from '../../../types' +import { MimeTypePipeModule } from '../../../pipes/mime-type.pipe' + +@Component({ + selector: 'marketplace-package-hero', + template: ` +
    +
    + + {{ pkg.manifest.title }} Icon + +
    + {{ pkg.manifest.title }} background image +
    + +
    +
    +

    + {{ pkg.manifest.title }} +

    +

    + {{ pkg.manifest.description.short }} +

    +
    + + +
    +
    + `, + styles: [], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, SharedPipesModule, MimeTypePipeModule], +}) +export class MarketplacePackageHeroComponent { + @Input({ required: true }) + pkg!: MarketplacePkg +} diff --git a/web/projects/marketplace/src/pages/show/package/package.component.html b/web/projects/marketplace/src/pages/show/package/package.component.html deleted file mode 100644 index cec0c1f95..000000000 --- a/web/projects/marketplace/src/pages/show/package/package.component.html +++ /dev/null @@ -1,9 +0,0 @@ - -
    -

    {{ pkg.manifest.title }}

    -

    {{ pkg.manifest.version | displayEmver }}

    -

    - Released: {{ published | date : 'medium' }} -

    - -
    diff --git a/web/projects/marketplace/src/pages/show/package/package.component.scss b/web/projects/marketplace/src/pages/show/package/package.component.scss deleted file mode 100644 index 52859a076..000000000 --- a/web/projects/marketplace/src/pages/show/package/package.component.scss +++ /dev/null @@ -1,48 +0,0 @@ -:host { - display: flex; - align-items: flex-start; - padding: 16px; - line-height: 2; -} - -.text { - display: inline-block; - vertical-align: top; - overflow: hidden; -} - -.logo { - width: 80px; - margin-right: 16px; - border-radius: 100%; -} - -.title { - margin: 0 0 0 -2px; - font-size: 36px; -} - -.version { - margin: 0; - font-size: 18px; -} - -.published { - margin: 0; - padding: 4px 0 12px 0; - font-style: italic; -} - -@media (min-width: 1000px) { - .logo { - width: 140px; - } - - .title { - font-size: 64px; - } - - .version { - font-size: 32px; - } -} diff --git a/web/projects/marketplace/src/pages/show/package/package.component.ts b/web/projects/marketplace/src/pages/show/package/package.component.ts deleted file mode 100644 index 8b8ebc591..000000000 --- a/web/projects/marketplace/src/pages/show/package/package.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ChangeDetectionStrategy, Component, Input } from '@angular/core' -import { MarketplacePkg } from '../../../types' - -@Component({ - selector: 'marketplace-package', - templateUrl: 'package.component.html', - styleUrls: ['package.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class PackageComponent { - @Input({ required: true }) - pkg!: MarketplacePkg -} diff --git a/web/projects/marketplace/src/pages/show/package/package.module.ts b/web/projects/marketplace/src/pages/show/package/package.module.ts deleted file mode 100644 index 665e146b5..000000000 --- a/web/projects/marketplace/src/pages/show/package/package.module.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { CommonModule } from '@angular/common' -import { NgModule } from '@angular/core' -import { IonicModule } from '@ionic/angular' -import { - EmverPipesModule, - SharedPipesModule, - TickerModule, -} from '@start9labs/shared' - -import { PackageComponent } from './package.component' -import { MimeTypePipeModule } from '../../../pipes/mime-type.pipe' - -@NgModule({ - declarations: [PackageComponent], - exports: [PackageComponent], - imports: [ - CommonModule, - IonicModule, - SharedPipesModule, - EmverPipesModule, - TickerModule, - MimeTypePipeModule, - ], -}) -export class PackageModule {} diff --git a/web/projects/marketplace/src/pages/show/screenshots/screenshots.component.ts b/web/projects/marketplace/src/pages/show/screenshots/screenshots.component.ts new file mode 100644 index 000000000..28d748f8e --- /dev/null +++ b/web/projects/marketplace/src/pages/show/screenshots/screenshots.component.ts @@ -0,0 +1,97 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + Inject, + Input, +} from '@angular/core' +import { + TuiButtonModule, + TuiDialogContext, + TuiDialogService, +} from '@taiga-ui/core' +import { TuiCarouselModule } from '@taiga-ui/kit' +import { MarketplacePkg } from '../../../types' +import { PolymorpheusContent } from '@tinkoff/ng-polymorpheus' +import { isPlatform } from '@ionic/angular' + +@Component({ + selector: 'marketplace-package-screenshots', + template: ` +
    + + + +
    + Service screenshot + + Service screenshot + +
    +
    +
    + +
    + `, + styles: [], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, TuiCarouselModule, TuiButtonModule], +}) +export class MarketplacePackageScreenshotComponent { + @Input({ required: true }) + pkg!: MarketplacePkg + + constructor( + @Inject(TuiDialogService) private readonly dialogs: TuiDialogService, + ) {} + index = 0 + + isMobile = isPlatform(window, 'ios') || isPlatform(window, 'android') + + presentModalImg(content: PolymorpheusContent) { + this.dialogs + .open(content, { + size: 'l', + }) + .subscribe() + } +} diff --git a/web/projects/marketplace/src/pipes/filter-packages.pipe.ts b/web/projects/marketplace/src/pipes/filter-packages.pipe.ts index 5b0bb52b1..9137392c3 100644 --- a/web/projects/marketplace/src/pipes/filter-packages.pipe.ts +++ b/web/projects/marketplace/src/pipes/filter-packages.pipe.ts @@ -8,8 +8,8 @@ import Fuse from 'fuse.js' export class FilterPackagesPipe implements PipeTransform { transform( packages: MarketplacePkg[], - query: string, - category: string, + query: string | null, + category: string | null, ): MarketplacePkg[] { // query if (query) { @@ -68,13 +68,14 @@ export class FilterPackagesPipe implements PipeTransform { // category return packages - .filter(p => category === 'all' || p.categories.includes(category)) + .filter(p => category === 'all' || p.categories.includes(category!)) .sort((a, b) => { return ( new Date(b['published-at']).valueOf() - new Date(a['published-at']).valueOf() ) }) + .map(a => ({ ...a })) } } diff --git a/web/projects/marketplace/src/public-api.ts b/web/projects/marketplace/src/public-api.ts index e554361aa..dc3b71918 100644 --- a/web/projects/marketplace/src/public-api.ts +++ b/web/projects/marketplace/src/public-api.ts @@ -8,8 +8,6 @@ export * from './pages/list/item/item.component' export * from './pages/list/item/item.module' export * from './pages/list/search/search.component' export * from './pages/list/search/search.module' -export * from './pages/list/skeleton/skeleton.component' -export * from './pages/list/skeleton/skeleton.module' export * from './pages/release-notes/release-notes.component' export * from './pages/release-notes/release-notes.module' export * from './pages/show/about/about.component' @@ -18,8 +16,8 @@ export * from './pages/show/additional/additional.component' export * from './pages/show/additional/additional.module' export * from './pages/show/dependencies/dependencies.component' export * from './pages/show/dependencies/dependencies.module' -export * from './pages/show/package/package.component' -export * from './pages/show/package/package.module' +export * from './pages/show/screenshots/screenshots.component' +export * from './pages/show/hero/hero.component' export * from './pipes/filter-packages.pipe' export * from './pipes/mime-type.pipe' @@ -27,7 +25,10 @@ export * from './pipes/mime-type.pipe' export * from './components/store-icon/store-icon.component' export * from './components/store-icon/store-icon.component.module' export * from './components/store-icon/store-icon.component' +export * from './components/menu/menu.component.module' +export * from './components/menu/menu.component' export * from './services/marketplace.service' +export * from './services/category.service' export * from './types' diff --git a/web/projects/marketplace/src/services/category.service.ts b/web/projects/marketplace/src/services/category.service.ts new file mode 100644 index 000000000..f9b0bc1e2 --- /dev/null +++ b/web/projects/marketplace/src/services/category.service.ts @@ -0,0 +1,16 @@ +import { BehaviorSubject, Observable } from 'rxjs' + +export abstract class AbstractCategoryService { + readonly category$ = new BehaviorSubject('all') + readonly query$ = new BehaviorSubject('') + + abstract getCategory$(): Observable + + abstract changeCategory(category: string): void + + abstract setQuery(query: string): void + + abstract getQuery$(): Observable + + abstract resetQuery(): void +} diff --git a/web/projects/marketplace/src/services/marketplace.service.ts b/web/projects/marketplace/src/services/marketplace.service.ts index af1b473d5..266b4d0df 100644 --- a/web/projects/marketplace/src/services/marketplace.service.ts +++ b/web/projects/marketplace/src/services/marketplace.service.ts @@ -1,5 +1,11 @@ import { Observable } from 'rxjs' -import { MarketplacePkg, Marketplace, StoreData, StoreIdentity } from '../types' +import { + Marketplace, + MarketplacePkg, + StoreData, + StoreIdentity, + StoreIdentityWithData, +} from '../types' export abstract class AbstractMarketplaceService { abstract getKnownHosts$(): Observable @@ -10,6 +16,8 @@ export abstract class AbstractMarketplaceService { abstract getSelectedStore$(): Observable + abstract getSelectedStoreWithCategories$(): Observable + abstract getPackage$( id: string, version: string, diff --git a/web/projects/marketplace/src/types.ts b/web/projects/marketplace/src/types.ts index 7ea64c967..2e4a2dfb4 100644 --- a/web/projects/marketplace/src/types.ts +++ b/web/projects/marketplace/src/types.ts @@ -19,9 +19,12 @@ export interface StoreInfo { categories: string[] } +export type StoreIdentityWithData = StoreData & StoreIdentity + export interface MarketplacePkg { icon: Url license: Url + screenshots?: string[] instructions: Url manifest: Manifest categories: string[] diff --git a/web/projects/marketplace/tailwind.config.js b/web/projects/marketplace/tailwind.config.js new file mode 100644 index 000000000..470fb582e --- /dev/null +++ b/web/projects/marketplace/tailwind.config.js @@ -0,0 +1,11 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ['./src/**/*.{html,ts}'], + theme: { + extend: {}, + fontFamily: { + sans: ['Montserrat', 'sans-serif'], + }, + }, + plugins: [], +} diff --git a/web/projects/shared/assets/fonts/League_Spartan/LeagueSpartan-VariableFont_wght.ttf b/web/projects/shared/assets/fonts/League_Spartan/LeagueSpartan-VariableFont_wght.ttf new file mode 100644 index 0000000000000000000000000000000000000000..413ec1e409446acbebdf96418aca271cc12756c9 GIT binary patch literal 88760 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 Il01k0A3t$mod5s; literal 0 HcmV?d00001 diff --git a/web/projects/shared/assets/img/background.png b/web/projects/shared/assets/img/background.png new file mode 100644 index 0000000000000000000000000000000000000000..1ec5f84745afbe495fdb114b585bd496f5d708b6 GIT binary patch literal 432435 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

    IAEjG1p4?Q3FILAdM?FuHotNQ>t`*5j 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

    LEh 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 literal 0 HcmV?d00001 diff --git a/web/projects/shared/assets/img/icon_transparent.png b/web/projects/shared/assets/img/icon_transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..f0aafd15de4c965ad7238b6d89dde4c1124c986f GIT binary patch literal 53685 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

    Zb}SFh5?>QaG-qYO`kM}CLNkCD_iBL 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 K9l#MLAz8BRh_ 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 h|8m*Tn!WYe*h^_s|)}D literal 0 HcmV?d00001 diff --git a/web/projects/shared/assets/img/icon_transparent.svg b/web/projects/shared/assets/img/icon_transparent.svg new file mode 100644 index 000000000..93d58edf3 --- /dev/null +++ b/web/projects/shared/assets/img/icon_transparent.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/web/projects/shared/assets/img/temp/one.png b/web/projects/shared/assets/img/temp/one.png new file mode 100644 index 0000000000000000000000000000000000000000..c7e9a4398080c253e987b3616e3e65ae8fbab597 GIT binary patch literal 288550 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

    8paCH5{lDD7BE&w0eM`n)M#r;4@^uVGE>RPRH zIJ*{IAcQhWeF8!L=l+8<)uUOD1+l(Y(V=jOAeqgeLbVnhiawkIr$NoRx)muPNqOww z2FuPrQ`Q;+Dq&=^0AitxS*f#hR(&oT4pynRv7d?U?~gP|{UCiyB7;<;Atfn0D;5EA zvRpdc?Lr4Lo5w#f04o8y|D~XU8h|%u2g*z+40^JQ4!ch-07P5lgm5??4gtaORZc)V z2${80%_mx5Is;yxO>O&0TkW}Q9oSE9g>19^2eT+6=9(D3FaGb_ zByg1U+9BcxlmIbAN1^K(bA!O1JAf5lHQ}h;1?l=PeLbda@lz(JY?3M12fCCVfqnb$ zf$8r?lhlvh{{GB;#D6LGRg%LV=KvydR~77oX^A-axh7!nvORr{2md{$)Z_w>W}?2L z6u&Pu<|m(bfH2n!&}{%eR|zC2oIhlA7uF67hM$O=oj;T*_#9X(O^Q2z*NKh#$>%C? zI(f^7u1o&Chmwt_RQmFy{)dnZ7P(YU8=tV>e%oq4aEY~WaRgVimMgeF79>;&Q}E@f zU2q@$C6qTD`A@}Y9$cczw+W(Ew`n4}&t8hRpUoF<8br1owFv^Bjvdd6-9nz{V0C2e)w8e>SH|;}=ufeV#jsSlhjM*9IT7Gr&Iy7PrTPh7_j{oK$RxCk7<@jj~%MAT@-fEFx#1^Kb9F zY(A(J)m2G)M-f~%dtb(wYlKtR-cbc;gRT4UFlIL{FhCi+&`UL-mX^nR3_RzyEu*9a zdr8=L_g7L(etBf{T76&r2fZ3ecw~M+T1K3Rr&;O2EK0T!%D{C(l^tg4=>2?_@T?&% z(y2ZTiDk@tE585WVX(<3f3n|A`?BU~Ao<62!C#WV-M)Jv@Z|H%(`|2kdCT7<2+zG= zTzfZTTq^!?{iMb5J7%!dN6nR;6|E7Sgo&{kW4O&ctGmNjumN12RCf+P`^p_V{)#sC zPLm(^eK&}!=j8UHNjqZrjo+-Y2SeMLM4(lAb}B)HJ|X_sSNQ%DaK|Qdt5=Q zL6F$bOwB%>CCxOUvErrqw&D?Oe(e5hG9#yK`?fRlJuCbpA`wFANK)W!HK=&iM~{K! z8E=;dPErJ?64F}CjOSwLM-jUw%GeoiRN>lC}%W$e2ti1h2n+{&pB9{L8E25 zPB|wVCFf{Q*BTF=T_MRv2bkX-*D9e=AsKl#J}-_mv;3~c*Fo}eMnF7Fl7sad>#&}(7? z+@C+V&5tb*N5>uZ)5-_SsH)pS_)|A+hPyMyLba#x*q*l z51X4}9~u8~qq3@Qf`Rqig6Qy>Y~)Jq%!8`DPr*K-R+l|C4K#x2rj0uE!d1#bZ2Ny6 zaF^Inp6;y}Un?ZH!vgOy7&1!D70dg3u~ssM1H=8P;%cwk!#Cn5ZkxC$HzbYDND-gD zIhi0*3E_z}?qZ50KShyTCl)WnjHQYSHS{5i1l)$Ym-hl!TZ!=G_<3gd!LOoFuVr-^5`2D`y zz0?|hsiG_F&)IB5XX`YG-)Ms)gVOR}PMEqZ-0w17J?I%@g0bi?kbq1FRbfp3k;w367JoZZ0kBK|3S#E_+E?n z9Ok{PQI%OwUkxoQk>}h;^NE+eC=D;g)soVNcaL4?gx00HLr-cWCsXe)M-XX7E)Lug zL6e~MTO&-iNF<-G$@Wx*2?qNgCRNip-XTX-SeRD=#}JsB{*y-IS(aEq&De3YjPt)D#7!k5Qk*9 zV{JJ5_SgD#KUdXvC#zkJoB{+Ay|=kz#tt13t}mIbTql^v+Y`bYBhVLaG?_~*-ZQZ2 zWSJ+|ADSD_lL-4zc>&mkg_Ayik8@-n>QL~-Ws0*7Oom6i?A9^1S5@^QWt+`P$efZg zQ(HQ5jm0_yT92&eib*V1;gMN!>_j;9JU3Q>usmshH;}mVI0re}d!LlJlV9@1_k9Zo z!PiB{#L;uabc4y_Bs^>_gkMvD!u6fjxtIEA2kcUnW(I%0?Ot)3W1UB zlVM~2)1?h0Vz_Ty152tp*~@=@OfTbGIFc71G)$?@9N%oI3|Jcq`+ood1u}unHHWu(4n|Hi0zj4phr_L zWv&CTv106Tu}TYe1IZ0$Qo)$3$K~#1#JSn1N^A%h&aY}H^o41h?E2X>RSxURJIyI! zl^BKzg)d-bXa*y{E&;?C+zzSMfUOMaY{J)@HWosCGml7QUAh$?WSja3!zAcnKN6`w zmLY?EW1R=$9QSHD>_S<4U4u-|8O-+JX2r_d@gywgY+phtzVW@^Zo zIe0hBA7N+owB5>gt+d%9MjKOWpFBH@U`S;fzP%eHBI`~;B9g!29HVAA>@42hKvlm$ zgGY*hslT@Jg`G(yMEr!7XiE%Jv-;MpTY4@(6)a8-Pbdpazi7YRfF{;w<$G6Y8alCA zg@}7u;$U99gL#|sIUD#ydctVBB+$-D`*SM%B-fOh)%T;W_t?~i3IoiA+5?2~RC|}HWM+mVEjTxu76qCsG=6%kPqZ^D%<5Q51;`R{@Q}4UE~_YZkmZ zQO3;A&RK=Pts>)1*DBeA>83p|iQ6GPy2lq~%K+dm)4HU87e#|giN`3_*0jfB81Y-5 zQ`egqhRjAWcU()^@t}ga!o@TVv<|3-$CETlOCdp=pTfU$t`{tuNOH7jCQuGX?X?Rp#4CUI-1 zv`=velK-~t2s_iuTlfnppj&njV%)O*{fOxXS6g7)?UMnUh%lN#nJ47AEAqH3sV>mW zqKLv()fb_pnWW~fmpQN!E=z@geb#8f$n9_tJTRqpriTUU%Y!b?OE^E}liqyWSm

    z;W@kV5?^L?R2w!e)7y{|d_3{FaZOGJf7CFne>Sh1U!v@ax~H=vk9#_oH!-%YVlutW zl6^az#Ll`5%>nIpJQj&VXIzIz=w!&Sx+>qqn1f9j8trxNiLBlaCyQ8bh{<7nent>q zbib^+yc^E>ay~dY-;7@Ztt@LPrT9b#9i5VMOJh+E^QSv2YF#=v7E?N1de~D)8lnpA zF{LTmOtvBLOYYOF|{x6>vza=_H7k<5H) zX?+?Qp$Hh3y3-x=@{-r(%faBG?&lPTnvZD2p7X%fg-j1yu#CuR6zEP2?k$5{ zX8~;BUTq7gX7U%h9S(BOtr?jSJgi>VimTi2a}O7{}zBiCSYpB zX85{ZyV8OBnSoGvhu)~9mja)$o23~DD|7&$6nppzkWcFa+X6drh{JsPS0Q1M!wU*lE+eJbCniFCEVD-Epi z^Sz#iP8X|$@+FBcW~{hREYJ-yv;iFz<##h~*_=6I_Aebh3ujt#cbMBJFm5tJ+pI3b z4QKQCI8nJB)D7{FcN+GBm>9Lg%VzY8gy4~qu`r8Q^XwOYNlh6|A_MkdY8t&oVMJ6+unsEVWH@-tT}Ba@Us zhSwZ~jp?#rt7&i{!wK)wzL674*goL~bqUdLuKb4V<>(ljdr~jVc;v7Hjq1Y`B`zQC zrYk48FA~qWJL$|9nDMpU$hH0c+#P@$b)67sk`f+4>9M)9n^b)hWs=n>g}egL7ZOg!?bL8@Q4QfNcuO z+2Pv9%X=ELh1=Y2>ptX1o^}{m!wVwl_bfGkaBU+myRS5M_nl)0f%-kktzh!1OM_6Ub|#^{EGl!D$)ZZXIjD#1yG2C36s76)2vc ziK{^jODJS`(YsU||4KZ}8_l6C6rjf$*3`DvBT-xp^8=OZEnGt%iydc-MZw%tFAtp} z0pbRO>RXxZ8bQ8It65~fz_VB2>0F7;>n)%uvmK3Is>Pq|PxFwSW|y#b$az4!p-Ft6 zwQWnmwEq*gMwkL4enzZ=qnvyF%qGPczHJWSnRTtY<*=#c4=l*msqMTH3$&+=2C6FP z4~N7`icNVE96Oi#s!V%CcZvb50~$9L)xjc%eLIS0PgMsh@S`$L@w}4Pue4xMZEcFX zt8TyR7Ax~uN@CQxoycn9I~6~5kfQ=-zMQx-H=!i0w)EPuNPZH$aXY45U}UR3Y}rd@ z{qy3S+czyW`!1H4@f^V+)1|S5Giwe5H1qfOEawFe$<<1zo0Yx2y`E1kL0RskmwX@* zPzmHi!#pp#SJvJ=VBgZrS)Xw4ELmc!}*8#!ec?O)v9 zg!33IF^qHcRxu=1wXILyPTNOx7)Y-nos`3pnOX7=Ws2%o?B?$CPjR4LNzmq37>^J; zn3;i?brzU>6L|U_ zXt_mlE}Zg{VJQM8CPXN<8oY8?7!grWVC@8Fab`~E>(iPMUBDyo`g(bGTboSE{jN>j zhMw5@#zIRiSI;ejm#{>Udm+%lRYT9U>XF6eIwa2texjO9ZJnh{YJwCOl_s!oGCRtO zhK@ZQRS+VqVQ9x*d%jddK5k>QYzB)p5iAPXRI>5+2n6ZaJ^G3N)cCM9lT(5k62iTJ zCA+_ZV7E91noZFaJ;PCix2UjJPJFsX&qfO*Of&{vja6j`tewRU&OAHa(|#vF2xY-H zz-i5)glPPvV%!bW!>aJl2B^ToS(kZdAIr+^pg%SDOh4BPuvEmZMuX#KgpmD|H;j_- zl~o=OMPnZ;VyC9w=*V0Xa~ZzEFddI(YnK#U$Mutrh{kX@!&is`4Z;l+Mr5#bz$*iP zC1>lk^5<=S7@xX!@Ws@GwNUfevRT+s&~(=C#;b(r{7SbAN?CT2l0y5J1W*FGfkd)W z4ss=72C!H&#$`W4b#sFf%E|!kE5TfbzN#N2&cn%G0&^PPD8Fw%a_F>C+P*rU$7UeF zCQ&>r6D1BDgkdbJ*5EVMJIOPiGo3TuPn3lKLKebRn+eGf#RN9$jwphV_?<9j$9{@t z;6?WVJ?5C~Kne)E$N7vn6y zC~-6K9(>E;ks{XLd+@Y|l$hsH_tuyMx0x@du@t(}V}9V2D`tRBLvn=HT9->kxvIY2 zumydcp$gx5s-e32N*8P94vA%MWua@yg7pFb07ADsr{W?g(N+x+{lyi{HgA;K{J^68 z+gKfXDUkYIB6sA%XX3H{L8Sag&YsI>+@rpub}?9}9m5rqP^{u4wRVd~f|N7L5?ti6 zIfP-f+6f$j7;HXXZs-CLW+5&zQei6)7Ic|Be#I7<{8$oXWHUB?a-G}PSuv;HdCgHF z`35|a573wFfom5ZqrGc$y(VixaBwoC*lO-zrf4qlb2*(07vG0qXNFlHQh?|OBgXcJ z)1kgzC<|9~?s;`U3~b~1#mCC^oamkPj%qW|(b$Lih9kFMuYDYpBC5aWY7nWzwc7?X zhWTeLi_V2jiH>wIMVbsUHAkLc@5b${D!uHcUb79*A-ijPUSaCMpRvEpr~#H5(9gOVkFXIJOwLr! zq8j>ZJAw&0#;mq_q-4|c*knwO?=LJ%^PE`kh`O7(W85=Soz8J94rnLB2;}U#&_Sq0 zXK3nqELriA>qp!UTi-#f96+CJx}E3#E|UbPy&gdF#TP12D2?A!+lpv=<{%2^aQRj0 zmTQNMs?=SQd8E^EW;hNLY`y=W2#84`CC_gESMB1jMc03PtR^K3a@+v?{UMKPhI1=G zXZm4zPTZ%~Jeigf_jwTzE45pnb`@Px0zKap5MBPB@E$C3iu27vjaPbzoFzp1W}s4b z)O&8909~FTpxP~7IdvCh1kYueC`Rzq|M!{Jf70=weCD5Y{J)9xKTXH~BP9R76B56Z z+Qe_Xe&<3vUsC#30@QwdX2}aOeA91XSo$#&=)xEd;eUr=zTU`kEMAT57>JK=? zw}q~u-6RbK%&P5TK7PRiD$1+}=zFGVeFFoOBhLf4L-GFaF*dp(njzvUno|4rn}I9^ zTXx(u=>2mB##rA(ZhRLNh26fCprH2(x02WR7yiKdI}qwv0R>PC)14@*x4a~_UT@9m zq}U58>zaeBd6}7+=T2e*j-HCr^ugisD#o%%T&r86$v+vZ@4`tGG*T?@r{Wi{7^HT7 z^rx9WRp1BSh~t{LkKa&l{T$h0{MBKq;u@GAJ5*UU7T!F=nNH~&yMC}Y$LoeS4E+{t zSTp0t-E;^2tFq_&7{{Z*3NC2Z*9k7E#KO6RCAh8Y_nF(2pH<*`)~OTRAa;`X+^LH# zbk5qdt&8B{D{Gtg=ZjEt{`C`-#`|$PxAo4%dLv?jR5Av+)b?fN@7?~s{iT$Kq!-Rt zX=u~;VONtUhS99lPg(+YVu&w(uNGaavI_*&u>pqi^2?fhRA(>njpw9vz_mNB8^R4*A#rlBG}SbW#5KhVnF} zym0&rrMwWkPvhGUUz#(VkFYaA!8mxNQ6`t^qv|l(_+zOcg@sG@2+QOEj2p$A6}yzI7G zl?*(!b`exIqBmAV*WA6UpREm_UQMSI(E8F>cyAQjW2IoqE=lUOC{XPv#kG^Vlj+Nv zd1Q-RirZl?Bt-BtL$#lRm%p~(r%r`@RusL4%i16ZKKvf@_Z5CXtSRGXj?x!gREn1j z^ZgWNvf)Vdy+(*`ACMs14Y4YAq)izjd`c3hBoD?whH&DtdQBo;C4qUh`BanSF^cKP}@ zQvJ0@XOh%|Mz$_0q2sr2;q$uDM(9HPYP9`W?@*nb<5aymuTF}+P8zEpW4S4)*wahm z-UyK#EEBOaUb8VQT5qiIA~acA^330ik7Ma7abiy8Ye^=Wj(a6n7fpwHgTm`!QJ2Bd zdyTkmzi-`FBmk#nW_~2yb^pPqy1$g$=XqSD=dV1^=CwU`zi@diYn$A|Q{c0!sv#u+ zq;ILd{^68te_j<0(ZgO;N2B5oW`!l@T|D>UaW?Ax_JP-qqgE6-zPL0ad6PVRsx#_U zkmCs}H~9JY7(|sO*V|b`lc#WgH8lTygw;9G!j2} zD@slJS=bR!e=VdK?|UrlUBU#{TP?^@9j-npMAcnLKOA}%()r;hpH_v3@|y7TeN|gd z%AklR0?6%A-O*go`PY?S-76LBGFuWY| zycmx;nB;NE2YU9?7rcoS-%GLGND7^sPI4RSO zCJu=l{)n1!!iOHtTp7~fn)V#@VCk3V51wrM)UaSlgZ|-YQTs6{XVx+a^=pAhpB1Py$C1I29-iU ztvB$FtLCZxF3IXtBHgRPpU%)@kXIiZt>w_%+V7QEuD?OhT_KpWRMq`;Uj8Ibyim@+BG|?lMC$i_5EV@vpen+B@<^2gmg#v zE32D!$knO0+eapjp0echIRvYl1phDA3TnKY%Ds*|z`Ofbc5X0zjSHQt4n--3{^Zkp zNmEg~AZUsnqBEUeDGn)FzZA`}Z@>SYq#zR~XCeNq2aJ(_?KghM6u@YI+@|?{lJAa@ z8ST2=QBS>>FTHoXL~9at&_5S`DpO3&YFodHX{;h2P{vC=Ue0Tw5Ob@81FoeMgySbXWc5ZVc5Q7NL0zPyuNLDpN{-wwk}T z1hQJ77RA5G>e?Qcd51!loONkDw;P4|!+u`Q0>_{wc0yr~%e(?gr6RxbMPK;qSNV@^ z{Oysqfv)mh&G_=$zwc6NE+6u#@q#LvKlx}rIXT&Ap&BEZdv?k;XqR9Aw>7+c|MT1K zLn!yXwlr%~mfaIC2-)MY90Mbc`J&oh?s1(TD5sK%i*w(N!v9g~3S=?Th?MIqP7mDO z-ItldI5oK4uASVYipc_75T|5xtm^Sz_xB&$^Ji-GkL~$$t@%I3_5hEg-G9k(H{BWk zwltt4@Dp$Ww1(Ta|?{N3cgc8}ewUp{z@ z{@KsYUv}4m^hY7T3-F4H^K=WPBYF>B&gTXA9(DQ($DY0gA_EE>%aX7d*~7Cak2uTI zQLcgi)FNr53obbItWRx39b;?Rt6x5K`OrSD|Gl{9AKUXMg7r_(@u&FtpP=Kvyv8p) z@&9tr@sINTAFX^dLm94jpK$8`+vMMQG_u!#{3qb4KrnPI{>WY<>w6UGL5r>Iaa3Q@ zL-4&9vyyuy4l)4`6Nzn$7Tu#qJw&~_fReZ>s1X?+8OfC>V6|NG;>e!;^1(ZDAhQ04 z@c1vg{EzMV16usIdH%nJZET?DFL0Yy?<}?MTYrk}UZ0Ac<@K(qi+Sj`wvggMw9^uB zeBw#y(bIbHASV=wzR}Es5*{qKW;anMU!Q7=CoUXb5!$^zFUC{mOIjE};7cbv^K7eZ zf?+#bh>FFr^MuvB8s}wYu3MNIuP)zO8ky@;-Djp+SY;LrH6CpSFm>)kjnB<$dCk4T zoMRZWLEIZ$9Pz+6G#*e_nWN^OXv-C_##i*4f<}_O2mOoG2-xzKjQVfNCQr5&;449e z(+M7_?H9K~TC5)RF=ywqy*!){>f$josyJ37vty#aBl0>eLjS5uKiQ(NC&J)Xdjhw@ zbXz=X^vRQ(b+laS;93q3De}@p*i!Ehp6Apxwr5SsogN56mj#XZL_vw6$)o9bmp3LP zhxU?Y^GGAMlo6;zt{&afAd?|cMBdqDb77;v45yh*t$1| z(X-86z-7Lo+CK7rwPUY2s#WAIo!)5k@*LvWu(~A{%1lG`gWhPGL_!F@!H@ z-tW^j@dUSSH4Qz6QB7p4!s)Vp%+0nw^Q2~{op>ulJ$@N}&gmI)eSU?1c@UfR>sfVY znn`Z|Fu^jHeOcI=_jnkPcRiJgL#F~f+A$_f93Xh(niWZwTmglSC5E--tw=~Sz zmTNQ<=+@9%efIs2{L+oor50M;W+(N!p!bre*6%G4yx6>N?J$x$6`frM$kRi0or$bnkhS0&+@D3qx>%O$&j0^dg^39T^r-g78(P1~oVXt`F%|nkrUNUR!cOQ$3I58N7yS=k;xpR&rYc6@ z2-E(_NRb=e2?sNYXnc}TY9dYEUzIlei7=Ij17rX#tM0gFe_jq7EJMCX>rhjgFmS6S zR+QhEaYGy7^*%Pz*g?ytV)XEUccO)QQl5CH>&>ZG(_TcG%Tw+7hBJ(>^Q5Rg+f~-l zmj+?1<4etgrCc=dQk(tbOW5rE48rhN$95TZIy%8(HQv!%*vCeC#`f+Pt-m9T+u{yO znST4e{-gHfSaEyJ8yvc-;c9lySwx=!f7y^-EJgX|ONnInjO$$OqC%Q+TY0I5mLbp| zNyXMQrLrVKALh-h;8l7{JZ$y!QnM8CyYoI4u{O_?k>IUcz1r36-VXMYE79rZe1#d|3cAsC^8I=FmHInZiNnqwt23P!Y+<;K z)AkrIBE=L$h^f`6@gRpC2Hb78QHkGzVTQnFcyb?(gDMP~?4}j`UyjNW0Vq7eyjSw0 zv70ZtA=Ls`)wdU(L!Y1u45T6!*jzD$hRfXC&C<`N9=sgeUTIUF<4SbUuin&O7@Zsz zJquqO7I+#Vim^f6@K}6cwK7?o_vQ#Ya{|!1l2;tgtzs>SGBS4XjoylB4WhzS$hdw! z&B9Ovvvm#|p1g%Pgag}Xxbo%Z%WeaR0qdPSu_s=HiPeQ>KN@AEj4}o$O>i<4ak}5~ z>5^0Yutp8k%Yzssit+Z?7wenjk#DkdJxFq_;PI#V@PpMy;#?G3;wAF4u549)J=WY1 z533foRZ;&eO=|I>t}f1!2lm+XZC&IWDq1dG;f*~|o%)3!S0NQ^Vi{EdZgAaNsB&GE zSp6}d#i@~S4moIzshG;*{-~GlTx6>uxfJ}1Gs@XSmLD_n@H!CrGz8vI)Lb9$IvgW5 zT44*X_P_2MY{5f~U_Ns>&vrhYMjPXRA{1h?vQu@Kq_+zh9R?e`$0ps<0T`0m}iXhM$U$BxoIQOnH3nJ_}L z)Ywc)kW!=wbXC#*n-*zKa^uFreT_$te8%8xwx9t<-#VA6k3_~gT`jg~e@i+kd6`o! zCaz4lOcMj|Gjt5BaOgMhEHrDFFVM+Q4>SuRsRb}eJ{)|dtiZvy3ooCs&BK(go>3CbTd%bN z?)bJu{0_2Wjo6n#xOvPux5|TPK89^+oNb)NG={$_(~vfottPBhIoCXC71j-&%dZka z?5qvpzdhm~7uV_}p4kgkm66Q2oa22b;>g9iW!*dX+&H0VM>0W=lUXY)X;BT(n(i?*^lq z9;@!ght7xIp%{9!ESor-9hjXRt~&QPZ$s2`MEebU@@v`$d(rlVb*B9VDrO6%y-m{k z4<0a0$HN{;5>^EXC+HRiO9Kt;;L^~wZ9LVy@^qw$yD(q%%=@V8liAQj=iStk{RWdM zuF91|R8`V$c-?J&X;Z^KkNN44ZCM+&s~xhIuQcI(tOPkqz-)X}(O2(;*4*?P28DXA z#O;h;4_0xfH!>JkSDwQ4v4Jh%D~J^{?^RGW9^0nnH`bz3iU}7#!FPQ8zV#Q5cWnt% zS2}u(2Wr`mL5_6Kcg;WxUvvjck#7aC=n;prIm>K_=4K77<@s6lXyW!2yNacVl97mrwNXc$JSvvjV@YAAngkgI0f;f_9ks-~my5a_Nw&gQ0T zQ?rpi`>fFrUo$;YVr=p#n^!d0$09zoFYV*UpUG=KYL`AAfCU1>HHFsM&4|t40+PFw zNoLC3%h4>Hd6OxU{^4!`aBu_`U~l%qK+d%lH~YmBpRT=&OHi#;j#AUFLJD_C1`* zAVR(nEXf>6!y4gYJyfP9NuH^lC7Q3zixt+Y*U7xy%B$KryM-&(+Z=IUnW{@B1-)s% z?nCf3_P`Z-tjcVDcgnlh-U@t%M;1XUT64`WMJDU%n(}Yr@<&_tr&(u#!!2kf-l5k z+eWJXBj=oy9@Avx5t@uVtZB3%p<-9u7n6#$Q$}mq{m(}lB>*ufS>+&TtMJmD9Nx)r zayJQJqCIlX%~GGgq$9)`NgUa-ABLzK{@60WNWeD3*c$*UWaG{)(auFDKsTd-8G*e~ z4&&^Dn(QHu(XmO%TDK=m`@YRki=~GkNp=)8om+04uk_;6Jw5ps-6meb!p0s8rCEwk zN!xQK>;YO31mZJdqGVPE?PXD7h2r$UfAM1rYW6cKl|>r4j0mVpj;@!GUeRgcuOWbTn0h5?FjhFA?Xt zQNVqD6g^tH+5#DbAra#p@-*r!8j`ag+|0UTtq^%%;fUV1)_FBQBaD=btGngVT*Md6@tbZ2 zyc^~VajV*b;=$zD`nb@IbLehHW74 zw&aT6fd)2|482LU+NGVMp%Np0GlMd=2)l&@%Mw#CIts zx=#(<*cx6z?FHX-h#%Tqn`I4;PWzp}?7gDZoJ9=)k9o-Ey4h9(t_mO1My{Mz?Dlv8 zi50Om^=}nb*+MQiW!pDpT2TB_vUNVRrmS82g!W0vxz+xs&AeTgC{dApV@NVsj{Y67{4rLBms4pV$ zBUNUNmm*v8J|^$$oH#f)adB?q&WkJ%^2@45-MC_qzp3&2o8?zdF-Jec_h{+rMi}*i zRgWdT+^UOGgfH4AXQ>;SA2x}^q2}?U<2EZhd#t6`TX37V=#I= zimaF>AIu^uy~*nR`0m{n)gfks_3;H!#dbQq7U{K-EqntIPsseK%{>$^VJHJZp&})~ z_<&av#W;oC*qZm5J%+2EOQ@KgGC)C%UQ2lw8l3ZJ>6~4dh@Kc2&h99k4$>+%%#y=C zX0?bD;V479%sDAjT+MVM>`^t5e8kGY?AQsavwb4QI)^jEi1>=y_VEc!LX!`dHnf=E`6>Br(qlH(Y5?Avosp5o{?ko0roq z_9K*!x&hI77Y@xk#q#*YXBN8(IYZAS^JrQmS9<%U*S-het+1_|q;+sOBWtrX-12OP zQ+cWUfRmBHy9|}tj&0861>$qd^o_U1qjfTOmfADMQi2s4B2CmAM+~YRGiEx?Drbhu zU2RH6PmZzgtXoK~%sc)P$WvlxQM8*EPmSC3>V{xD^SKMgjM2UA5*C`fA zs9GzrKmVFLAI?c$?mIF!f3FEhqSlaYm0H|ltXT>O;!5-En?B@!REfOw(WuJBok$^l z7)8B3jSb`v)VZHDzxw)crge~x0cr8Vrp19#VSH|BZ;XK3kLbd&cii38;khutnhZR5 zZwO*t!I@m2C~{jZoG4~VzjKx|@$CmO?wF-utm-e*!r9)|_4)aU2qv>dGB zve;4L*bvo@xH#mP=f~!K(bw46OWe7Q_xA3|vZQbTko$^90XmGJPyLtj_hcN$xQ(~k z_el|Zi(|G8C}eS*dwr&rS?hBv+#pJw`if`Y%kIWyk0)QhWh9Dl^cq0WuPyIl_y`=% zMep09QR%^Ao1Xw#n5f5Zb3P3M=G*zQ3oQopJNUPvM5RbA$gwy_SY&P=xa?S>SKAFc zYcckfnm*#~`R^o*P&izGkmNt&MRb;mrs=$jEpvhhuo@EjC74 zPW2oM;f-=}zOwtnJJTLrsPHgU9&97q%XDpiU?8Z{x*b-8)3-jV&6N!SXnot1h&D|* z0Xvlqgno6VaDG1*J6BMO0)ik{dt^cy`BFJ3mNn_B>@1Rv2w$OWz9G7BaJxfwalm8pui z9bzy(1KVi`izenX8rW8v+mr!jyPi2agXl;Ns_g^xjNOIpw#MU^M*UJ8Ay@WbZF4E} zu)|^dcy@-Uov_^kHIYFTlcI>;Diope=lTcYQ1jnUA3_sM%74TyG2t$ij9 zB`t$o8qsF}JBXBedO=Z%eC^?E8klog#mB0`TlrWuUR=07h$WF^GocCJ%W}YMXn43y ziTNJuR5f{lHMLFN>$Q~JU?#TRB^KN0zoh5?T*mHFrlcEO-eV#7FKq(`jS2>wfBvg~ z3D0@}y6mC9v&Ti2oB@thx2Q8>FHs>-9@$a=0ZU(>+2bN}|2eupv8Vrs99>e$i|%k? zmo&9>?zvJRCo!5yJS%w{!XuF-r3KkSU`+p`S^A^>U)NAhd-|QDC6Ye$ zQAg}H< zZb$XOJVHE!pCn(AuFjR4A~<|_!A3gN#ZcG1}V`%gWW<)*c)pD&=zG#GGgb=W;>rkJD> zMqt+BaxE1C;vQVyqnjxB^vgRetEcicTXJ#m?NQ8YhW58cvD&%IVexCa2CREDki4?M zw;i&1u_tyLNJaH1>3y|-O-Ytz(&y*P^JH2<99=8$f7{`kZ5js`Ci@IegLuz zK66IxB_ly0EY-kVK6J^*$X*+ds6ii>-M-j|$M(1}Lb<@fp`act{~X|d>|Dn`2lyZR z@o&BPzefX;wDyCfmA`qFYjAY&lR6NV(1nMG2SSZ04eft)iT|&O2A{!ScsS+j#W}!H z#CF69x$7@Tm7ckL-UpNl)S1ik*YF?2S3{n_fwAiQ@#S67!_X2aecWc+9f z*Tk(Gt{YV;bVV3~v}zC)EoZ$49?7n;O=@(T4A(Oosdje`nmoK0t(QgbS5M6ws*gWI zf8VZ>&7K%vF6wqj@X6h8i=)By2w05_r+VDoX-8MIy#Wt$+rfFH9T6JGMjCd!0Hzu2 zFtU5C+T(Kdn=vLxNSq7yN@xq>yq?2N!XbteZzD~-)6Sy_dr4EB`cApT=Zoex?x+yB zk*jnWJryIHEK^>*<73bynv!2U}_jD z^z`H%iU2jo79w_Us~HZr+!Gf11TJ%i(=fKC@oHLzh(92F59P08vN-W>;?``89-vMh z2kdN5qike7KyF;vFCe#k@aH!1mDNLo+05@XiKhO}Z)jM>?+TmCCS;f~0B$dQ@mn5*yDTu54?7w0 zR8G8iU!bF-Tk@N;d!uLU#S3^p7Tdv+x8cyW00K0hMFL+TpHn^pw+9s;X5XkUtR(Cy z<#@_6iqfHZLCmF`q9q>NIM9f~yq0QwP`^OdRu0Qx0u@sSWAmyXl-mx8@WB_i`z>qP zCrW=Of8O6|6PWuu45yZ`V##=8>N}Y*3S#>>s;X{~4%eis2XTQw? z@U3)Y;ZobY-gd)L)AI)O3y14Hq;T(jDQWV0SdHF}AAX$09 z^t>w@a+$k9D%t1mU$wJCKGSEox$=bE zhm<<2XXx&1Y@lrg#Fa`}Mr8X-^|Z{+nE#E%ByTGNTRdsZU%>vy7t+U~>mIV6gL-?Y z2m)<=6#$vl5rp)qPg|;nYyvvGF2Q3yL3Cw82s?2X8>0vIBs-sss94&>OiPi6S1y?T zNOJ5d8xNM?bivq0mL#10rQ~NN&trM7?@YPk##84)*-t*c2QwvH<{2dxO5|6;tqGtC zNyS16a5(+==P%91zA0N7+)GZD!%n=KoA@?6JQpN^4~m6U^4f|MM z@J&ZUCaf3<4?Pv(0}4pLWf)-tz>45yD}J_1HLD})T5Qd zIXC{PmFMPXOxx!!b23RJMt5>fs*CVj+k~^!2Pxy@im37LXQ11flccIeMnk0_aLZu-*E zeZo*lSC?XHeU5WC4r26q#aMid@v00m@wJ$HxvcO%(1H>F0Y1#8OA0U?Y|E9ATMh8R-oqbxRJzYX+AGGxoM+CV9`NtdG`Wx}}Le z7wLT*{?sO|o%CsN1bx5GT3pQPF3^;I@I{h$$Jp0eOw`VJR3P|P&MFol)^0Cxt(!!r zI6(lo`4z&~JcEY+kvLz|1#It^v}d-rNq~YphZd9MLdVdXjm~vT$O!@V_uYs&w6-?z zYiiB4J`0gMM|%)>V7D&@IO|9AW0Orq`eo}Qe^6vRK~`X-rLm;)T{Np7z*(tr$6v1; zcacAV>(oP_3f4>beb)>);uC}!l3Q}etRUpP2G4fhhB)(({q;JQ;ux~j<|0!RS6(iCAUrbz9Dt84j1cqXs(HTk^U(bj&tE&V zz6?MBF}(ehE(hstbHW3w9QO!6sTCHLwzUnvbH~=r2qw0izzINGej|BO^C|0=?yf_q z{D~pzkp-as{9|DS(c4RN8jfNFJHXj38Yr{6m-*Yq6v_mYFHpBd~eV2jvHy{3NE&mh3_KBv;P66iO!zfQF$A^L&w-A1R zmiICTP{#1*joV_M#3{6Nja#1&w0;`+(+pPdT|l83Te8CLJTVqhI`=2i2Q*vM0su%Y zDX+fdAMyvQo~WNjDEb=xL1cKctN+9?vIzDke}0!v$N*SFuXz(x_G9%<-m^a-Cj&^M zaWZBZBChJB{;`@Ovd;exJRRWlsQ*{rnLNaayZ(>tCw3vLx`4DAF?rY5yLE8!w`q9N z<-6x469?)32-YrK))NB4OcNm_6_fTy@60FSe`FUf>zM;`6%tx;yK$4eYrb31ojWysabpU%h@Z{0ti9Po&?bPg~clap3WQw#y$7FHR&-2=$H@ z#;|B=eY3h}o?c99{LeJ;vh_Paj?P7bJZ$XlSC<^xV$}aE{e8yo*GZ?Wh2b72x5_Q> zcXhsDaY%c7Hv9LFXVvrE$^OJI1D+?zL^g8IFoBO-h3Cm3kCW7&<@H}(0oDRl9^3mi z0PO1Xgz6LU>$@#Yh>2VJ&UGf9CZiXV2U%~whT=^8aJM~qc;qy zLDJc-j7p>p?em4a+9V4yDza@E`duDombeukcFPR&skFjAtKTKnY-UltDF@fWxAX2g z$t}N`V^5xvwy3o&Xx{q2ssI0_W?J7l38T)WzK7K_3g6x@yAUX9evYhdB&JDev?z|c z+uh{#r;jR^$^|x{&ov%AQ1>FV-y|N)uMKCjG%eed(LXA52r*!#`0cRKVod4X8Db?x zOKW;7d3-vKF=yg;XqefDPMt2p>Du6`hpw7WJ32_?^TX4wrXQ>X6eMVP>Uq=v$;eB} zd^%Fk<|L#%_fiTH9^KtHx;l8U`MH;RFTn4fWZhTTd>~pPJ2~xplgk04B)N@0Za-qS{e_EP#wUp@)-^nk`Gl;iZu(J{ z7JkdDzO@>?(jzk0oyrosA$Y83ObWW9=NzK_rmCp6LL2d~9DdfWM&PmjC zYru&|KBLGud8d_75t=)=OwS_q+hqIYuUpgkR%+N(7N+>cYaztttL=y7R+~Fhlxxe5 zX&=QVI~;D&iiRkD3v55K{$Rj{sl<=;IuCcPt*WAM-q1FQ=u(dG%1v6BsJLtNLhZq? zwbf3?9K1CS2H~zyX<3NTpA0rEN;*8~zRS{Vh^vj-Zsj>xo-qBsbHy~LVa~jBrN-@t zG|mE@D`-}9)itj>TomOk)+|NzTFv&Fz4zs)(J%RXAKtA!T-a;id&2gb?%EcIDO*eS zvwY@MGnjDov+fQSwvKc`858;gm5B{bRjwZ5&hdE|%Q5!c3;hR?qZ)?*kG0Y?Oa5Rv zZG3tw^X_yA$KjNmJh4D{Q`wgfN34&EJP(WT;?A=;%4j}K_x<7pzzw=lS0XADAWO&= z4UL6XcuRVIqdk#kk;aR)E-xVc7HE8>+ApRJ^|@d8o1sJ-Lm zanD!RERI^%9IgFi7wT|5S4sU?Ke|16u^c>9lQy0{Yp19FR7wg=EV3f7a@O57Uaa$c zOmh2u)HWCsP}X7hydsBtCrx53(aJK-Yg@RiYFA4v4QG&{R#gogYqMvnZ z#8LOh5?}mYQGehNXg0TBrp8d)Ie$XrnSe;{zTJ(<^5B$B6;t?O_YJG|E-^z$g|o=Q zmkR{(r@>GY`Rdui?`=ms`@zRQTYg^&5mZFb{7zXPVNGwBCSLWE z^@--}JKXgZn9CyEUHD*pMfS{D(#!w-A4)^O0KX3DGyO#MT@=Y(H+hS@j3x1ogw?$1 z>&i#u3|ivNFQa()f;4GJp+h$j+(r%WjcE2rZ8q>v;8$$U7JM4NC z`ncGf(B0;!)m`nhy|&EQtn!)^W(L=dEP@2x6Xg<}xe^o3!;{+<7grS8c$qJ*)RjA(aeYplfIa(T}hMN4I`c-^=qEBs|-(Gov2()MC4#CRxFmAWFCp~MD6a? zb3sJY zH@7-Z9G^m&9v0y}doo|TM*N^Us%amNpRjW2oR>^-e&UUK@B^`yG1oUYLQ5&Eh?tkO zoqUa#l3;qAh$El{=-L8(Ru(-IbbiR#tu9LPUk-jWdgnBfC|gc(IVZeA@Y~xv*9$ai zvNn(3e&jyrwj16V9f{nx9jb>}Z}r)DhIV>R0zaaN5><&QPtpp>GP zRzT0$Xnzl~!UD(oaD>mBSew!r1evs7NrL9XzJmi1%}VgOPmTsnlw+U;&&lSxQpXi$ zc$>#u_@Q(Q9GjaaB!fb~wAVInYmSdjkr#`?h^XrLmg;$QPOg^KiCAAyCiW7G&YFSy zGzQXUYb;s_hUSMqw2?i|kM^yLH3B~4p#~N#cZzV40R!sYkq9kOrS^~!rA{^XT%~r9 z&Tr*&bBUwG_9VXe>u;9|iY8TF+Uf;@_QMVv ziHUrPqXIr2z2~V>OTsl4zs}qApkP9bJueG621~bbm$%09^OQ$zCE7M6TCU#=jBqs2 zu9hC@_hyw(P0@Okj`nZf4iS^7l6%SLU}*$O?%pd3ViyZC?+jX5>F@s>=+w*@9>$C? zNT%=0aHNG{(U|Yp@aUVar~%iw5@C5ADCWC({@FkqVZ8H}0S^DPvE2K3v_>4emx4U< zt`ef}Q5i8BmutQ#rAht81Lxhh+Dv;FbA9>YBIGfON6OcytdKpypxHeYDM-Y)Poj!N zD@}wy7Md0IW>&le>FEpofYV%DfPlAdw3`#NQjsewA3*lDO8X2FtwOF$_`^q2>rXa{ zpBR6F>$Z-VW380Un_5DaI|ID22;;Hz z&B=tyOPWnS^WU*BYhc7mrIlh5>|OmqJ+#d)HPJT$F|A&WE>o$R6~)&mQE!5kxkT`d zVtZme)4UK*zZ~A@YokFX$u)EK(W+*HpQN4ooL*^}nX0zo9<58|nc?=|i7%ipJ5g?! zm=SM;8fN=-<}40VXf};?Z*&}AN+2-LZ?=TYIevVqa1^M)aL7h-xPMn8vd+T=f(MUc z2De;G9nGq@r0O*%9pCMLoRHuY4vv3{>YzJxun{XqSm>0`E$jC$h!J5Qj?TIt4Z?=FOfEdXFO}??{VF%T#FaZ%lgeM zX3c32(koJ;qP-+c#~NQp46^m1f8T#uyJ>H&bS`;TC&S@54x-ucen9Ab?(MuLRA=n+ zx$xgeuX+m0T0|f^-dzS6!<0u!JnGyp(l9>MqJK`i;Ts1n))@3bcery?|4cpjbp{?a zTVa!oki}!%!A~aRnN0%%=~Oiwn#ZT5_CJ(GoL^VlUnSvk6ZROQd98bWQ0_f_&ftbA zVdk067w47AcDBYZjAN+}=s-=+Qyr*__(%5Ab=#vv=fM-%u6df-ZG9GR)!{a=6t1hr z(Uu?D;ArG+1WF}}k=7~w@V7bbO*iuC6v$384N%3+H-s$iz2)OtPPFu2>3T54iViQ^ z^|GJAxnkDdZ^JpTQOw;$zP`ehJ$~6yyjmm=t%%}C>9yf90qs(i52NeNCWlLDV?CtG zx^06G7*ZYEy`3_qrN)b#7TeTsD3A1A!@Ft?zt>7mO=i`mEo}FpjU*DCWFw%&O8)`+ z7#wJn{yuhJwrk2rYf)ry$@b^`{Et$aqZsOJotkibUC&V-ZLVd@NFMzTNsMGH)I5s1ZM-7 zDaUB@q-U`dp+wPj*1Nj*F97$-L`10&Ce%idgS0^K=oV*D+PtV%E~Xy z-Oy7#Um5d#RAs9hdH^DE0ZYNl_pGzElJ)&y%N^Y6U|+$hp$0B>70;`!>i#Q{s2UmY0JzYzcdIvuR_KECTG9)o z(&7jzkP9tP7${~XCD}yz-kXJQagaBwq1mP~V$Eb$f3R)soV3I!<*GRRLeRc`e|W&H zWUDi~9XnK-3cpgjGau8t-V+f&4|ylg^=mJ=+yyCpUtp^6McP+bU8+v=3JAIOfv@`^ zaa7o&Y+hS_B(<~g@}9=~!2Ffqfoi$Fl{o|c*RK)FjMjboUu9)*k26-##$3N`n`YA0 zkNY-$`@8O+c#!opUFH4-RB5S;zWj42YOLU5IPZFkYyJMq>59e*gWRK^tLI8*!ghTl zrX?*iybyC^y^^(MKX&ZtYj}Gsksj15X>UlzxTJfXY8-nEWn@0FnwBLmjle)e44Fnde(;*o7t&N=5n-KOHDZJlvU%05Q-DN(=#4YZSjz)z& z{%GR0);e}ZQN+yHxA&XkN%`4_p zg(;UmDxLKoc;RJm^W}GvJSCeDs!=5dTE-Da&U;8N4KjGcd*7j9M3jeMxPFWT|Q+9O+!x#A+cj zGB+AX=9|4uBodXXrg?XJX?sFv%C0XDrI=k1BJe3PAw4t9hE^KhE>(OU8ET>0EPTBn zXPVC8dMrGi|E)yFe2}xYEJ*!Qd5v~!Jq{mGw2}hQqVfd1yW`2*au}Y~6h4)Z=xbZ_ zmhm*9>e@P*qoUNr2VC4c6gr8eCz8uesrPhj4dvOBmZrV(9+yiEzc!?Pq5cJw(|wL? z+k>nQbf&($CZN;G9=@9!;6-M?s*j>+J_!-Kf&?YGj+085pLiW#d~R5(d_95xi)(31 zI%rS~y7sjytVe)eCGJul#iBoa;On(D||Bx<2JSRmrv{ zaKFmBitGdLRZ*nJVVC}4lP1pdlkK_dr--S6xA>X81g1|s^!|0z!-<4GuJ3o$`O$S3 z7u5vsY&u>g!=$Ul0l*+k1F|v{MP#R7X1#sC2$^I!F&Gdk!wU6D?vTj~(mi?F%IK_h z#~Z#@+P}6|`%Nl1^-YH5d>=OGgZtVNI=k(8XjReOvazpL>{oD3+a*MvP@D$vt*^Jb zZ&=QPt>J~6fo^aR%vD~BWi-zrip{apQ>12IRnhod8ob_!-B#tN*w6!wNCU39W-Q`< zSceyuKiLFDWty}ix}0JfX&{d`fK?vKsKwO5H6ffIL9t73X*CBZr=C7+iV6QLH<`i* zmo~f_6>?r-Iys5_vcr+^Z{!GdBYmY_`$Y70I9@}_F>7j=TplQO;g#Dp3{T+Nq;~BiK(V~7X z4JFX@Xiz@d99O%N<^dJts29@U9E8slDk4U0ewxDfL0fLn=z80RNsq1ye_*gSMyz`e z?QcOioEq!2GLbKVOi0PkMI^i)r&^|7W-VQH%v$QOtIX}5@ByWlMMHw0;4^!B$Y&j095_Rm#r>ro+1t^%@+Y32km~ZFi zVGl`b!v#lE%*iDlUJhFONjG}LDiPrpJR>q5Y)d|Bg z?~@Pps4QGp7dY!PZ%z(tF@30cX?cubG@FD10xmZwGCj0zhg_Fz$KiO%p7|ne`aaUu z>eSMwaUy+h`);}{kO1i~rIVOv3f74@13R)i)TDi^Y+T-+Uj|5^J6I@&H)1nplJ|$q z*s^4?PV#`$_!viC>-MeWRQP(TdTmwNz>-nrS6RF9Rq7{=WoAK%uLex9vF*6f=xEbr zM-m6}S#_;Cm&rY;U1nw7z%q5e)WBl70=cEwbnd9wW5X!ImGY4yodInym{V6wN2s9a zEQTjqWT?~E6y0Z^RF!tUP5?*nhKAASAkDg->ooT&4b%G$PA`?)9(m{!8T( z``2t@2Y~>~AbA1&5n*D|rVD4)R{2_PXQa>NR(O`Md~O)&uqmZ$qmTHCZ$@i-V1}l@Lj9@D>JK1U&oHTd?~| z+0EsIyXZBs;`G2Y_6vyg5IPnXMArlmsQ301NV7({-f!tPQAie_7*_>x;D{8OczJeu zCp7Ydk*E9i&=Q^b*L=WHz=nEuN_q1zu3(RieC3vaWT(YR5Rsyg|07&~m;5u@6Ov&z z&1Y*qn;#-YUKa3!OxtXG`SPo0(6gD%6ljF0+J)jz>Sc!$KQrsZDH^AW z7|VBK03QghG7*RpL&FgUh$9!6yNp`}9u328S{=FimknECT7Sk3@=+}iOa1|y;mOPr zQLO0meejAxUM)w4X&(mPdBmB0gt7UizG)Tnw_dP9d*+Jy=H>oXcZ7sQDaipL^|e$_ z6lQy2l1x|v`+24XoT#zSuD`cR0{>RyDl>Pww4|SzHXy$x-g7rShe+sufm}N&G;^N{ z!~61em^{>gc~rvOxtYzT-N%E&_LvP13+#i+1NKGRzV-3JDuLbB3C&E86g&E|uHj`t z)Tof)RPUl^Sai9C0^C`bpH50*d{Vx!5^lp;?GQ~ZgR1xj+5J!in0qVP*CIe{dbH7` zPc~wGxy)@>K!CUgOM9VhZ!GVPk<=JWqWnUp4YKz!aMc@N()FJ`>EMXlMAxb%ff zTAZE|Yuu(C7E61?ryp0hALPD#P~FRl*16g}=A2VnkS0joWSiUDVSlT%lXU%@HoYT| zy0URV_L~O!*mH(fH)iiL2@bd$JVm2n@6%lQM_>LlHY0nC|76Smkk_tOo<4Bl&)xro1gN)sz^+(0&^%pWCh>3c%AUBfe?z>opbg($vU2a}As8or*Wq#ekUK9a-I@Qb)P$(9-TFauCgAmubLQ)+_2;*K2RqbE`lO}e%9);|Ic?p? zm#tb|kP~K;8CG^F+b|+x{5|ZvoF#0WeHrk&mnlbdSXOTy^go@GOC2s4wbU=JIRXYgVnDhm=Rb3t$0RihiCLTYPIOHfdvf( z_DO#6g*B{1?q};SI`Y0jL}p6w`U%3txKg@yrMbb-jBWk(L7!nfM*(80pgF)$kJs``v)B@>YC$X1?2OfwGHt*{^H6*a2A=2gIr8-hP)+03{s&Tbq z^%g^w@`HUsnLO4?#EA2*NvEr;4bliJLk$QL7#!c>?J4_d3Rb1yUt%*wBm^=5sSb} zr2~#eCH3HFjVZLfAzVz80nv;*=C5=DwANV|B`^{M^N6~*^@Zqu0{L+?xx3*6|XBJ&$9hdJ7H$t(x zxvv~(Jnvm)Zh15YVl+W%~z4W9K&f~cDRGIuUB)#mik>Vp=7p5PGoTWZT zy|?WH&-w*K@o&Q!>;RW7@zTLBMy`uBwi6!RM-=fK&!Ytmehh^`f0xqS3(TPC-+J(6M_MPYlf;XD-WiWn)3jcGC7 z&K~mHT3WG9DjYm#?yu8!2=A+uid2-b%?$07&a210YK+u;S6Pp#8}(;$eIjC+vR8$) zVg~8IS#2E6vx~9Q^1^|aPU>cmJxkrEOBHkRWJ}3GmnaL1;Se^XIBRWs;*A_+KLX>% zJfS6&kb)*Ceyleby&Id&VMObVoj(As>2~tn-t>k>x zx5OKfcE@YDO8Pa_(bc#DQdeK^U*~!4T8;;^Am%w;Z+#+t`rzZuhV0=8mF@jq_ti$p z(^MBPuwJ$&A%$hHgz~4op?kELh|#Qm3{(c^^}3yfuf;goyz!GO;Y1X+KR~5{{0E{f zaJBYnhYZ_}oJ^`{ylL0&GZz&$?5jLV^sk&_4y(k=eb^&3hdlv7;sm8V2QqB7Ckj4TmlGPnh z2&G@0sTP}wrq4}Gj$)@J#wN5+^1B3xRGwSt#hpz%En%+`_lr^vefGvr&gJd_eybMn zVAN}AM~7qr#7{PJ6Pmy4OzLllL>SH&2HTTc+(iJzI)qDEp}^MmL%I5=`?o_)yN(Q8 zF3rx=m>Sh7Wu@B?$VC9WctHwt@A*6iU`4;#v#U93U&`wSRtIJC$efXzH_nKU4Qu<} zT1U?${YFcXfe9CY`Y;iJdr_Ic|6>AcBQWaYDDcNwz{fXw+M>kt#RTvT&(kn?qQLF$ z{hIcL+w3Xvw2xBqGi!PCf?=MK)gYjNw2|w#UIUv;DP{cus%IbY0z8a1pvs=`b?kAs z9%a%=VWXUJq^mH;K%)SWfvLr{=%82u=VFxdDH#L%B`X%f^jxKp5fD|+!RO7k=9Mk5 z^UCWCntFIjO3jw<-+w$nrEyIgu79x zQ4WMV+A8iQ^YUlL)0TK1<|==nGr^XSG8~{=5Zb}`ExY^Cj(gflv0Oa)zFtUfZ?AB> z#PWuT?;G@h0U0Rqy0k1zYj?BHR&;HCr7n!VxOX!jULc^hm zXenWitU}cscr;YL%=P#t7;!4P!V5mYv@EG#ImgX;7LieemBt+we=7{NWyx3ahY20F z!32QBX(`k;aC~`VWOpiB^+MTabs!z^CBIhuN8zB@^s2M;J{iawYR1v46h(`qXAA15 zAsgwynqVwbHX+9sxt448LUNJrSNIZ$&Lf^TegMhG>c>92+YDXOyB-TB`gU?4*P-p> zM=yjf6wKe15Ip{w1dbu&qq~+f$Xr;7dLU(TlQm>A!Ae_odsVm(7~5Bxo6`-p`jI(K zUZi3EntZLU1z%T``HkJG!sWx^(l$R0hh$&>%U{e^oX+`g37S7$iW^L8vMJH38rYY) zX+G0@ny}XvVpGRa7RzihN~^CYm1;iw4nAf|mU>1wu{9I>yBpgR&0sMg0r4jKt+Ex@ zrWlYSt)n66SI8ev$Sna$T0QNiN|iBI<%uN1@C3M-@*ecjcS@>=TYGgxkZqM_|a>1|Ca%sfz2C%Xlsmawsj?zn5&eQmMeXGCF!5kQGry`{R`vrj*Kv zZmv_>90bYpPb*KAQ=9K`a2T?wYiagpyBCF0`8}rXSt=Vp!WwdlqBw!D@NVL0`1w5L zWOsVxn238c-J31X9(s;}xaen_!ejwvJ^=%kLG;hjx%(T3=EM8Ywj@;iF8*6S!YOQ=4ciya}gQxU&tXNcXES^#6$wmVy zZ0k(ws>E|3_O9eyWuCxa!YKe{$Rjj?ch2vfiWZMY!^c~tp6*E^3X)AR0yy1w85thP z+pDX2^ap2YOH+u4`x+l8QR|7Ww(D#Qt^~jYY@Qh!FGG<0yxfH{(_ZQeUz%=T^HD!HB9nz~;5( z2fJ=;7=$EQvn_7AgKH=Kck#_*qN^%#;&Z-v#2Q(^p~5m>tmiFxHHHS!FCwYD zCxi;5=SyHwnzA2kYT8GP@z2+z>nwV?TrC={i9^fwS9$IE5Gs>eM{Dq9!+M-Ug^4_1 z&B$QxtpBiPWs}76(Uu=+u`pg*aKnVampcPt{kkvFK3Ui3{;vKykm;kUZdpL?@#`H*tF9w>352)hr!;kJJhD%hqNL9; z*7uMlC2>|_qd~1*Rii~`bmL&FMRaLqZ81?_s$+|kfcmH%m%(T6u4yfc_~9-v$c|H< zV|*A(xoY#4&lMbKt@!-hGinu$0=atj^?9l?)r6w>NmleW&c)i0_BZ~Ozt=xFDNz{9 z2yJbliT9Q8@*?&VcSO#1zQooYX7#~JSQZV~f+z=n1i7XF0#pSMP0F_WIitx{>0X05 znG6lYCtRbfKXhVEdCJ1$OJ1YIbi%D~>a`SQE=bbeF*<5UA9N_eaw&GlpKpt!z*_(b zeV14BzGBvo;q)HJSIyWAPqTlNF9ivZVKDT4T?9ItLg3QD0pkN*Hl1dpojPs0L1u6P z3Sfi{me{;1p049)ZHPHny58ReP;NR4iw&ynYvo22F*4>=>5bVvpa0tDo0t(YFFoa(j4UGU8!uIFA`w z8$5xKy4+!x{?!exJYsm(gK0X?8DB&wOz6ukA{6Aw8|c&6aC`N?|9VJ@I8nLtu)9^b z_tSaMfQ3V&`pK=NL4xs$!f{10^urw)hH)JzMfTh$cZ*q$kPbA)csr5ceaKtbS6J;X zy(s|&LSZ(07(rh7XqD**c>^j3I;>G3j3&3B;$QYxhD)8$%?JfbVO+{5UUHpDnEC2- zzd69gI&fEJIHi3+pTs2F1N_BKWI`IaKGIw`8fD?%VBu5UDwbgX!A}Q*86Y(mgba>S z(-+%8wK#hD;W{{Ma40?Fh}k#y5Yu!kGAnY3YZ|OTLd&CbgWAkiW>1UwNi@~^L%Y!L zc&ok+18M`Vrw)RC4P^#2ruHW?$Bp^R4+U!KLC*8MJ3GCI@0lPm4J5Qh-dDEm^px z(wl-`#!0sZlavS(nX4N9_1kYZ>umM38YfPwiw<2x;h65E@fVNG%82fmJu3NUODoHh zVk}(=jU}H1GxxUVr1j_TX$c!}xT4y-Is~*mwaka1Hw>mc5FW`8*3tYsXms7~BN2)G zt{_6hpL}roreyX zO2=I)<%boXz1^$_)Ib5poVo#IGAiCHccQ&DA?XBiDPql>V;S?z$l-ifHq*nPQ#sEU z81DjtAK}r8ZT*j40H0}__~mc(oUtl`3BX^^l*YCt@#j%slG^%?9{y+W84Gow4#?o^HDw!FV*c_tSqucT+Ix zHS?R^clOU!_r9vv!uXBaUXIJu5;JD?dgfJGM0&x`;wb8EFBq}-Ji49_ByTgn*eDuv zt;dTJpVg^trCnb_J8Zp>=z6&t0Swm&+OK?GFyFdY(CHhoLzlnnS2(&8Gxg5TSbs;m|KC-eOGU5!cwc^Hs{o0*$YTH)P7@K{PcdLbY} z*eDZLJ^iLS)ly#0kv8e(CQ$uzw+<*@0!0~mY7je+&$S>d2@MNbA{dn<7Ca5|Z-} zmh^%q`MbP3LrNDpS>?`YM{~^==^~wHk?i~0{ z>jHJXHL!!1)qncVQ|`cJS>Ue1nVU(cKj43@@&7;SQ*QFViTM9_kNP8q)jhPKOTxF| z?rv_5X(NKN5Ar4AQbjz)>J5hj^aSv-o$cmE8m|&m$%I>UXD5 zfBnCKnEN2Vs~wlLK35m0^B&&)w{tzMB)o$Hs&2x|cHx)s)$4zwbQ$+al^zME#0;4f z-3F3Kcz8}u-i@ZwiwJe5=MOfz>0emalnVb1@;<4O4ZUTG+|5U^39%)yqSYS0pvxJ& zqQB;l`j@Ar#7bHEtru|Q1)0cXTd-s;$#VY!kJG-&$RW$Rcb9Qo4kY!QQhN!dYi#*f zvSX&s+I&$AchHZ!pO7V^h)|@@8+@SD6Mix9_*u4W=TdC8vtB60zhnAoBy-1*icva+ zZC{W^Ne#(#k=H9c=liyfiWs|?*f71e63DwXg0tsB?RddUCdDPkQMJfDNAQx@^dBPi z<)w#9VfIrV1!EMpas#Jq3ZwNn!RBCVwGFAJzPB3KkimGHncFR9l`! zj$G1Excw?7RXs4^w6grK_sMQjJbBIhXfI$OSf}lvY%PmWE^z0s^h@z8@+A{nQ*5?` zB4TRsz8~j8ZRsiLtpC|a`d|JS73#Ek9+pjd|D#qb`yX!kKUDj2u9{1f$L2opSA-`isx+jQ#^d_x|6;&`a?*1yQW0j7k0_sVA?Te5hhxc|6+V)MS~= zPx>1}a)#suD^TvCR3nl9&r)|9%mBiUUx1HnTsy%?{ik?y@@rWqF59&f(!jqkKW9jq zPOjCytrMgFD;wblT#vZ_h~nbezgc)N;HkQ=dAkbz4KjQr0SxC0r>i$f{$}CVP{6`} zZOvK#h1#)R23lUgvVY#=C;gj+-!}mk-h}V$J)La)=Z$3rx(912G(3NG;cphMQ41_Q z1ecusS3wET{VFHiKlej~Mw${_6BBPfqV**VJEa!VD0Q#vh2iBK@m{cbud>*t!`70dGRzl#NZe zE+OdaUoGSWaWd}wKcRb24!@k7Cos*bQaq1(`a`Yt^`fjDq{k^q)c+E0zpSeO1imcY zWQZl1ZI6#%!or_}KuL^}Z}~Y}-qzAA&BmKV0=^WoQtanILsW7y9%S~%pmYD^g3D8w z@+2GYWm?+1K(n4GpnI1xy+{EcworQ`)P^wOHjFW==}51aZH`F4Z;L|^i_G#C0G+#$ z$|LoM{=MvPK+pmz-?W>lWa#(jt$#g7RBFG@<4?a^y@j7$tvP-G-d?2!fki0Q0UUhm zu>9dao2CC2&i{8u1SQg6zkbcEh?+*9&!coN?k~jJ&NL@GP*SLu`@TfONHn=pbg_BU|72Tvat1ge_E3Q3oHX|}%vY-Jh)AGgXSF!9)6%Qf&Q5o9$$z_P|5fv@o8ib8Gd$?aSXkoq_{W<%Yq5a|hR_qAc)^KBZSYOAqTBGpggT=_0`xFS;9QVgu zFoWD+yNTMTA`T<>%$mbDLR&{3rXO3&(5pH0efhkL)1yzs0WE%pQ%em!md73lLetr} zbdhcO~p=!^7;l2+S@y$sToAuo^3cD`OBE^Z!_(#I-&-M!?~^;Hlr0` z11Mef!6IWWpYt(=kNANmd5zig*8+Aqa$vE!gHiwx1d?Cssr=9;5su z!~L;;?QSy{(hRykPP4wp;8-<6!t)*ACbh6&9JOH{4jVt^BYqIdEG3d9H{vfcaN>-? zXe)gyUwSbm6YpJN_)61_wCHdSx8FtebJYxpSL?vwy_o1~Ht4vfC=Iybju!y1KX*d%*ORK zj`TKNQ)sf|&nnyauJwhxG|!EUQq)ByR5SK5Q0aU5sUC$!lADil-u?r;m;My7GH#xr z!a0GU`zC&+7VT}_ck6FZUl`R2hIRPhS3ExjdIcm3Er1)haMdDM%HF$ahn4V7lehZ_ zT&{Ne_3f-J?+t|KkM&uuA}<2#7LCloJ)pmEv<||cdV9^}M|*oTgJZR}4oZKzuFXLD zxYl*1nE~lqr(4gE)STNM*N&(hUoE^1)7KAY3VA+KVLvTi90;5A!80Wac?Da`iq*paP*}&_ zNUtVoGico%+Xzzf@TjoGd2cPX9!u|j#a6tYepa=Y#2{%uAqVOXX0^P|W5De><{r@< z7senQMVtgHE5-A!ly#Xlh8%l6eRe20f?i4|j`IYlF)e_Um6fB}l;b{q|9CH{xYFQJ ze&vKOu25yg4p55}pQHMS90N3{Yc6A+LX%vzDe%84_`fH7{!ai_LlKZ>DvBtFEaeQ- zdg=Aw0mOZ#fh1wu*=V4{@B^*H8Xw4Y{tHP-dymFa#LNsqif=xYHn%iUE!D-$?8~pRQmmU!uL(n z{^eoUnNLuu>0#uXreJ}CDe`+&wl~1EVopEb8F_8FXEnHi=>=vkR^h`(m!IOb8<$vo zc1l!|rRCdVc<(Za-)q~#8Q(1_DM7Bd`LUvDD5(E*r@o)){mq0`WwoDi$&OJQ-4Yx> z&&2T>v!m*FE4U3S#t0%D9!vL+eSP2CjsxSFXA`Z`J%PIC9#>zryMI29sHkq>r5Ym- zf;7F*_Klp0QVY0|XQRwaPo{ht#C@)wP{*U1EaHqFcNtAZI#-CsW|=~EpW;Mnw6tcE zY#lc#jPTFskN2ri40(mQ27c!-cv+N+8=SsLO0j)vyS~! zF}q8yFq66@tBqWC4PQ8g-G1_f*S@>WaMlN_*l@!ZRJ8cvcDo`lqaf4@^6Xil(WA|) zv{z+-mS$EHU?PvrL=mjcy6$R@hja0t+Q=p#wynMyDfXn5(oHfmzz8}n+*e_r{O(+$ zux+^H_V;M%hRKj1ll!7ZP=sxL5Q~?JWyj7qsAl2Y#%vw~$`b+o)tYb7H}e1~0+m~W zj=9tn>6P@MQ+ZQdyYyXvakw=j>5x^jUHc9_^<-wPh?NwF`e_IKTJuk34}SW5pro6b z|2$bUn4g!|nuNABw%>mI7_Ot4t7HLwk*At`J3?~%J=!Sy8TIa7`?1&HVn;_}eY<=k ziz|AV%JX=V$pz5Em8bYvR&+=J*(qI<|8Pw2pFeT;-*w#1lFtAWqi2HK`92R)Q23H> zPAR1SXi5Kau0b2F6N|#^3~1YXjqOmZZwhwnLu$8|l>54_^h{Lp$@6}(PRM_QhOh$9 z{yN^|HqiaNTy(AWk~Ac8%#~=IW|6vfNmFL`d$x;9#46IBw{DqpxB^lG=jnMIa=mkQ zymInFdG%Kht1S@Zc85b@-+$Sbq-ek+;+`6s1e`1lP>%d+k0)jL@ylz}X za|%J%hB>a%(oX9W`+vMx2PUL@#jV@|p0B_A(dfKhHH2So31_k!QErPHT%GWiny(GH zCnYtGy>6Z9I!`;hYn6Tpc%*F$z>e`$j@#Jd(8^X`9^bW)5X`|6!wD`L*>8U%n@{Hu zJ)S-f?)7F16tPu=}sIY3_@vbug;pe-=046i*%zmcPZNJ2J@zwPHK1#Qvmj($oN zZ>vvdnF7@S6XkPF>Z)B@Rw}DU95Gv$^f5jk;HozOE**J_xSorvE2M&&UGZ??cTkQe zLCa|0#C1HZ)c5ebu3^T9y)AreJ`41xL7ny5)kJBtJmB!Yt;UQC_t2?pI(tZ* zaIxPTO(@Z!v)7$ArNWuG#u|CIHX*hDX9t%`f-{2T8hI@8<9;%GZBitPKmy^aTx!sR zsr|kTIf(i`RAxt!Uew{1vOLSRv-TUICOuW!v~t9qgcyGpfLP-!pU4{t%LOl=mu?p+u{iU9Di* zV`9n!@3Z@}3oP8#oA~Xj@-=>^vPl;-rdQ(4IeXFoq9iV%R1gTQS)!H$NvaaYOvCkA z;Xf(IE8W1TTU*QRH1POPawgAege(%I;~Kv*SvNG4$4NPPwBko26R|X+3+Rad21~te zJde2)H5nS^G;>cKX5NH8D^vEM{JT26}5O`xeOLYRKjRb|1bltd4) zYU}X_i9}bWlShefQc*4I*z}x441z^BY84w$Ywc@9xr(cLxU6Lt+zP+rabUBqP4D}Y zolajn*wnkrR|el?A3Z2kD>BX9)yRBKV9}qE#$_}3-4jmsSU%zL@pibGSIO1GqXxT= z!P%)p^F7)o!+qJNv#s(sRSM&V3pG_N5vBC0iYt#wB2b<2MZfZr?VPX=Y$mD_c=f!- zNAgG}5RJPekNPh5AR$&v#Ka}u)dPe9!@ip4XLW2J+ya6bLACG4U4YWim&YXlN}-{v zmkw@@O`7R0af0>~02$X&0fBOIa-#cerkU-IC;Ata?dKb-W`A1`uk z!iWJFtX}B`p;9~?J5e+jV<-{m8%4!q8|Np?{T!H-lML8zJV!gtc=>qrUMU8L>53*{ zrDV|5)GT#H2f(A(->DGEl@<)I2$TLp$Cb_lHn6xa73U~$$kc*qwD>6}&~TA9!YtJ- z5Kaq0wduM|GDJ{vZ%wtVI%WX#JS|6lE&2)Ds+HhsjP>-=8gYBt6}Bh=CTGlKFfBwS z(BrIn{OXAw&%F2bSqhycMv_TcC0@Xlfq7gSs2r+ibl_$25Pq?N8*)6=roK}&mVhWc`Yee#s zAr_ch-r@+>sjGlQOq6QZ=mBcb>aL(|zzA-JXjOJrGD67bdJayB{j90DmPgS*Vwg*u zGBzc}nqCHIF9=)gzn4dQ?)fkQF+q)p2rOp!%WDZsRWNIa{Kx_|!}UfcdisU6s?8^q zS)=R_r~2JdL6hAL^4`3g$%sFkn}bPn@;u-`+$w%}SXD+2`H-KVUpz`CaE!8jv=bR} z^?qEHu$M_+8Z_q9ryI^R^_f`k>>G$D#N_S$OBVV(XD(<7)p{2?{F3F~+hcBl;RI~o z_T~!o1flBmbH49uTL6hB#;w0kr#kEx|R0i z`S5FZJ-b0^=TvQqO9v0()4X0LrCI(I2k6 zIHyEQMo@N2(KLcq4btwer-W1U(oNgE`S`!_f&Zgn`0pRNo_by;Z^1V0uGT+8_s)@9 zcI<_JN{sO#0Jkmd$e7XBAHW1zg&zBR<90zUqU@0${{1ok^-KQzU!^DKRdZNxwYCe= zy`Zi$G{jwhA`Nvyu7FK z!$iXDSIsShDT`+Nz$x&A(mtvb*FJ{I0mnrzin!bMLiy42^Ha2Si~CjX zeZrgkV08GwI{$Rof6aJeuYg-O{<*2A**x5axDPpQ1Q{$*&_zdorY(_##4FU~e^A$m zdw%GbY0jtIrfAL28bYxO@=0HbYb>5*%aU2ijyrDy#y)zA-+o%H{&hT{FR;<ZZhz7|tmriTa~eEVF=!ti-~ zd<-K|O^c4y-8>^qCV`jfbX6+P4t1lLw_g~-=`n01+s?;>SUG=cT2bqYT!KZ-tE#@F z!TUFWe%a7+Z_Sh3o7L;;)0IEYX##@N14}(|8zT06?#11mtxE;Sa@a~r)yu2BNG5(M z1v$g79x|3nx|Y?&Eb>HJ|;cEAUA7^=qO%covSi?Q}_2J%Bu*s-JJ;&p(}BG(Mk!F&zlxeB`D0c9N#gZ~2^g zbp3vfXV-Ai^i{cNp=#)sH@kc_v`)Obv7FUhv*eXtzJyQ5WWo(DUAQ@9?kcZKe7qtH zBhRX`Vn5>&`jx@1vZ@@Sb12Z)=lw9ZZE^&<*NumQB&gn}s?*EdU|3jGudO*%aNYA2 zc^ztwURpO-U9CW?CMiWES~t9*nFW>eV}*ZQ*i^gRqcWd4+G@nYM`hPg7EcyQZ`TC=b%-(V`ySUU=bkW%8v<9JhH84SJu- z8h8>9h&^S8a(kgm!wRJjoAs&L(vOT__YSuV>MR_e=U!CF<&tsa?0qqnckz?uc9ERk zyyjEpC*kf;%k9{1fjVV(kqwudMd~q@+cA%hozqH!?sfELX+Dm@2z13UNTV!Owd+=9 z{5kfq*B+tUEzHOaMZH8hl(z23>V6Uk^&NQU2O*SkRNoifuq8(N;=5%>7-i;`)E?n~ zY2tq=NAa$VzaSLmRd$u1ctCXo01!X z>}?Q?SZS*29AWAz(`fBjnr4j+-)=iUgnCGcTizH^wdjYI4|AMb{oeVJCnp86pJQSp zN=J26RruzIT%aw+ZiTUj5OS-etdOo}a~DnTWtV5NDr8Y)?M3jO3U9@Vv0HesEx>)9 zbkd@U-3m=Sz8AIaxKi1SeM`{FJ)F0^@Jz!>Ntj(X(Bv^M4d|iVwRY^a>hVKC&TP&6 z769@30r)nL(1P{!p=J`T%VuWDOQw=uPP$HOjSm&RHIiBW7MQ-qVx5Lv>~!s`q{O8W z?xfMGuYHqbUuTR-jSB0$KIG|h2~GCyRI}R@p-R)tFRf1|I_2prbo!4snD$8_Q4N7Actyg(QEzH5Xp38_yKXx% zg+Ga`%Jz}I=dnpN7k22?yf@}yhiE)S2P3TOyXS%D5%uRvDXmCrrjk-?CQ?tX1X+fi zQo5xmJ9ow27fz(Lh-=h%0k;&>VOX=gZth}J0z;GDc%pUBpa#vSz)f6dCc*ys zAvwyYJucio3T7N9C!MN~&5UJ|N}duQ>1@dFSaO6d#UDw z4ldi@wSg&3XQ82cjx9U^n!dty>^f$;MQLM%ZR@(9Yz4Oxt7*gUO)Pg3Vtag~!766` z`~F`0fqtB_6>eq|B33-L@m2SSdi9n^s1RjEad}ZGK5^BgJknO!Po8YWsOmIm-!M1Y zyGI>jbEkm|fNa~Fw1DrcfV)&@`Hx{1I8DTMS{kk{KR#=l{vwp^%VMi2IOd9zZ4lK~ z%95udTLI!_UqKQsW$^kDY*Ek@{hdX;sQNxiVL}h7Ih@&lu-ZNIgTht)*fufcO**TD z{(a+P+!!Fy`}cY&4h6+P+s#>0w*j6vg%_j zz!!Xi7sL4ZLlirRHx-S4rrHw5qr$_3G)r*jUQC{Cc)NC?f`^xwTJDC5InsDABCWQ)&K zN#l#@mH@k{JsimpqWh9bJko1bk}5&4y24$l?)7ROPf$J`3QDtDX85HtPdP6by5!29 zsih+9K4euCh|8RLN_seI{TivxGD2GwY*Cb478hK@)mS%m@d0-@)t&BjR~`&zYwp(g z_K`ZjQK5bMR60vN3+Y<*v$o3JZAir|=0{TkAx+2uR#y8xuK(Mi<6ux(h5R4NQF8d{ z96u+jB<+J{O@G~&m64xu5y|ecqz`*{HcW^~S%`SB&y)c!uK{mYoZC^fO}e96@+Q#e zLOS&M9!T(NS;XP25b_-tyAxR+?fFEOPi;UwSJMN^{pA8iZpMq})3DqxhZMI-g4 zq!(-8hZC31qytK0*pq9{TfK_nN$zzb*7k z#?s5z1;*Ku!U-{%suAJItp8D#UP%pBB=wB)SoR!0oWU8P^AH;|dGRglR?%8Tg>JCQ z5bJ$Bp_e?xuT)+&vm%1?e$}L}^)AdzfHxa^sZ&e+vF8|mxf>bR`^bocQ&S}JSGq2F z`dBsbwFNPAci-<&npiHJwL!fEM`*gq6KlKZ>FeD&1Y6Bjnt|Fg-%~tCdFq+kc11U? z2wAx4nt9p2#qb#-!F2kh1+GW3K%RwJ>h_c<%4r|4Tje_4_N1*g&j(LAaTOQ(zXbq( zeF|;c_A2~ZS*a?n-17_f$;qR%?B&9L_n9Y1?6!Hlva8qDXq`pp1?4UEe*5W)udnKN zfFgaNb_>D}x#GYW^{8jZbqe2A1=2kB_tWsKq>xB=n*ipWBj=9EB*SaGTtS86`;yS) zaSuw9X;CN8Jzd{+U&QgRWEdX|YyP7FHy~5VBAmZ9Icr7k10w0(9dB#g$zMGUijHxx<2Xb7k-z>K3b`0)2JJQx?z0Jy;6PE2^kpX(u zFfP=m17{xS460LEUACI=?rvNwL&BnS`#7NUF>P*TZKZ5(i%?GIevy&6Esq>LoACU@ zuB+{uP9={MqmMqyw_PBgljt+VS8wT1?ksH;HWn7Wj# zr7ykS;6C%w0gQRHCX-oj9X@+-`#o`(>#@3BqUSbJuZQ^6(Dk|KX?=?#yAbsq=jU!% zT1aJ9@Oaf8t~38Oe{86aB$7?5q*8rZU}KSOUjGt*h_xnD0B%1$lV`0O=LZVuCMTxI z!Me-wYO}bnH&?#jBO1*rv%yc1o59*tD(~ZRG zAZ&&Iw!rkV7qd@}_~s`+xa8F&*>Nj<9oF{*bPEh+$Pv|rkxD23|Q5!7l!z3=h{rTMD2#Oii2K4L34r(CacEyzeM=1U$FbF?^*sZR^OrSdA;b3RoirDsf$^s_~+@`cbx^}_CDgeNsSj4B$SK@rUT6KqM^z;i)5J^gAzXWm8??9z|>TQHuLsM%kY`YZ_&B&@1+u6=mQs5y~b zY-+PVHnI?N`CkD#)0)UOegnJ)a@>?_ZH$Z`H1SpbBxLw zL3+RLcoSIGlsu;N9DHXEglDweA z(Rr6n6F(T5VJdf7xo@wN$Z>vQF~en2pAu*NATW*UDW`4nJ%=A9sr)otwIZ`PJU#Dh zxR+BdB^y9;{n&8iNjn8ntyg%>hExxkUk&Ly zgi3+x?D|HF4@u)AQ{A%*el)7_z+pVjL*mm7Q$t;r%H@(`9lTt}DJdslW9;d7WnRK~b9S10wV)X?I26 z0)k;IbYt&ejcO^Wa9HA)UH!HQ`@=6Ao`7|ZnpzXpr3a#tEI1)MfwJ5MxywU#Y37WH z`4i}&fK_=C%K#_LlAIcUh{Cvs%LJm5?S%#TUUt_tLKd1m`rSejwuSCSW7&S6$wd{g zfyV;R3ct6la0{?_1r?@yX;W_65!vk&Z)?F{RWfCOfmXIQl)ixR|^+rq{d3mf^2 zQ%0&52-VHiT6^0-%tlaefSCw%nt?e(wn+7ih^+y*8N;1Yl*{O>X|*<`<+Qc}})l5Epajl9nw%23~z z8O#C03Pvbn@80KuWX&ajxC<^S+rvBP3&&y}2f^x5#?bT<3 zEuH>Zy@PB`akjVaC0(a%0;HV+!jx^=Q3F$-3AlnrwymHqisXH9D@Ft9b#B+n0oZ!$ z;l-|}8yyj=b-YxrjcEn*A(D=dmn5{1+oV4wE^__7NAz}-+@0Z}aMj~N#H)WOu`5OOccMS4F?E=e zRgB7FyhNvNROt(Y9j{U$ri0u@XdT?h2uYz)7MI*Mrx6{cGTH&vR9HD?pI<@oXur0` z>t##_BqfoG^IGX%zny5?f0US=q84Lf;#pc zVUnk)kW!UrmAZ{{h@>$95l=rBESx;SuAdWOEi$ay?rr_y72HL+pb&Z0&!tiInHndz zGkHhZjAFV>o|KYyphd^5;G1hDr44RNuHzPr?rDOls}1AkqwA>8ec{01ka|y4zZ5Q!&a=U$WojFnCZ$1JE#JCD(;lwP}ddK92Bg?|uD4TYgtZVU2smP49hm z8(4qy?+>gcv0;2=&cx<#ib z1|oUJ#d>G96#$3A%-L#_Lw3HpT~BL**Vs&{T?Ck-aby`lxW${OPd{dymM_3XH7L9H zIdmB7B#l(g*F6-Q^EpJCr0lwcs`atNOOS-=ZB+Pai2gJS|I`Tu=dJreX8?e zL4s@-NPI-Hx_DMbR9#^WGOS)E(J52uruvkLe$$U*(o-qw`KC|lQrF&=#(Xl$_9C{h zu;BRyO8Z2PAbK%-?>8uNJJ{us1mDb<34a zCZ;xNwTZnjBunW~sL^{kugVYM-LSG>+syvey?#$~dnG2u^~Qj=aNe(?2{|B$JXY8X zIGhj1>8l)sz0u=GfD+e*s4{DX( zOUkZTgpBz2Ty^&h`t>&D(+FJm_UHNVom7opZ}bpTPSK2#u;`ZQdtn;AOCbVXA^YKg zVr0a=%MT_}!)+rqB*?f%>^Fs+Xjm3ub5oKH%K~!wNEMUTlGxm`vi?c9pe(3C#pXJ+ z?8i4GDG;MV?sridd)iOwmB$zNY)Y(B1Bpm`JB4q$*(Z*}Vs=LG&WZgt6ZsXY3IEfA zn}Q+SElTCUz?cWgWVFtLFv3b-ZwNqMU-mrob*R(zX(1!Qn59b*g{gt|263#`_ zhjp=RW3k22Qa{1N!noMPR`iByJc_l+?{xJL{(KZb7jKFiZBLZE!4Gh0v@DQL$s#hl z$dhB(-s`sY$4SY^Bq96{`_(c<%l{f=SZn246FN;&x@5^cv5=1mD^-k z6lU@bv^lqsPt?pp$puD8SSUBx=xXkWz1|PJ{b56HL|`OmwJ$^(^Q)d?8GG%4K&1KT z(*loNQsryMLu!tls=dxc+0E~`@n`F=-Kdu3s}FVEIXr z7tVDBO<{j!;$s^~yf5OGu3N7#%|vuv+XH%qdVrSdH^W>=7ks~^3T9&LVF(KiMM5FY zZ-iGx4|j#k9Ea2Cbv1yzyUFt=lqujTTa&Nk1do^wi^3nt-RFtNA!wMY_2HY0&f>t` zv2t!~7tQr&9o|Sq_VNH1tyQwz{y{Vf)N&0_vMw!AZQ~)n)%OM@fmDi8LEvyEfT(8% zE>k-~z-lL<9#rAN>3&n{rPcn3e988zz@RaU9Oe#3=E9RsW*5|ILw~ z-A&N|xwjFjE{dSgsB&}xHF(JyljZ3x>?OaTu#KL0!>%mKrc zUhCG}ut*o^S|T9~^JP~7QW;B+ETRXcfn=jB&!H(~C8f4SVfK`k>1|f?jYwbM)P2|!TovOh3U7Q9T@O?(IPL-_W&wa} z4=a4~{g)PG$2_22ZFQPia2jcJUd<}351)9FyaIl()sB{2{_N>J6CERzs-S^mm^#-L zPiK$UN{z(`;u`26AWs9gAsadK)5Q`ga6rU*su7(8* zaX0a!r=o;-R{`C|x&lC1F7?M3YCQXToS0d(;|rMRCt2h5`Kd3N^H3TJHN^HrA~t_n z7%EGhGiqZY=8f3bHU&~*9HXk$`fssbnfTQNjjB)g@!Jr#@r5oPt#Xkqf=ej%TC3sU z&-(gI4Lz`f;5Ym2b`8B-(i7LQcTzA5`O`iO2_kNG(^idKh+K{6dYFggwP$!fOhY*7 zO!KbZKEmo%dc%-y+5)#AdymHrvm-ar8$MsfkM;UP2hqJ3;RYj{{zqAeosHu}JHL-V z02iah_eO?e1S3bUs#uMmM(wu&|I|9kEg{U|tT@Lqlgh8|ft02c>3vm=HSOx=o_R{n zkqL^s4YAshMAbc)PF09Rd%X`RnV7A^n|r-FueGRFB(|Ca^f)IQBy$d9tQqCue3C$> zQi9)SEsnEp%xpTH^b=4>zd9#aR_;Z-#oUR2Z&r4R_pwgrp;Y7mIx()17fI( z(s`SK+j?6M{`SQXn?k!@;IN*Wf2z+o&$06dW_N>n6Wbnp2BadKJy*Yp#oTnWh3&_k z`V<6SBYrihRizoC`-Nq)3vR0B?#EVMEZD&ar`^4dXvCD9X5AEXRNo?K@xEXW( z99hpIFGl+~6`HK}FeXuaeG|2ci_ei9F$H1=0NVaux&zWgdj<(D4AyLGG<`lg-$Dhw z8dV~|j68yVg?^w0MA8zc8Bj7L&gK3iM1_q=9gBpB z*INgJdQLzoZjsjVGx;7Z0*XDNmfl( zf|)~&y{SPjoG@|M(}vf4!fx1D=kD~|0P)Xxtt%+WS&^O`aDi*X_ltNoKMO#OIdS#| zvA%`xr)p%9>;o|Kb%5rL14>_3oH&S^=&jgltDFmJ6Xu=d7TBrD{-vV; zD^Fg9cnFp-@3p(lzLk7rbII)r)+Pj?#KAu)(MuPU*~K>v4Hy;x8!B#w^PtP8rg7d? zC{3X(MYCfPxTvl|aN{3j_5QZ{@NV_&(xK8)k8z7wG?XjTF)Mtx&!qwgM-PPdX)V^T zP44!~%fue_&;w!V3hc|F`GP4MthZFCGlw5p_i^vz7^onpIn^gzLFp}9O=v6Nn-rTQ znSnIeh0OE4Pl-PF^8{b%p7Tw4=2S6ckswgP)avNmLPzzelXoN)@~tvB-jb_`o>ZA~ zyeuZzKS2~G7MVErJj6uBfn!89Wm4EQ`4Hr^6Q?R$XkBzr&2_FL;UTg;Y1-HFxqPz_ z;N?MqpcJQJPMV|1__^`JuRI+S4$7B%(_$wW8cV)5QRWHc5|*GOW_^2d@eeQ9thoa2 z@*}H#V*c2)hY+oiPXg3S$Zc0xjb`tCw#zc=h3Yb_`vYPYK!Jm`pI0m@o$&B-?``S$ z2{oH!?pwO%&xexr;bm~ky!z#n(uoU|Ze0U&A%F%LavZ(L#=TOk#;JW(F~Jq#lAt@k z!wapR;CYthvJ%RmD!A9PoMVZyJTYW)3k?bY#N}MpXZ|fe=)?<06e~t@fWjKO_H3rB zon~+?BZ*L~X=*<*oK2DSw)yB1r1`i{^~#}12!AiPE2@*b=)>oXm6K>u@<*Ul=85o+ z#T&}}1u@oKNRc{zlsfUq55vIw5xGc&XU9_&ZnqYduJwji#$|TG!{>4Vu?RucMTd=l3^+pJ;J?>C_^Tt8XmeO1`C#MsC#KiJG5QZ zoz3Q@rH}vHl?GmE7%@M1Z~NxHvSh}3>5a!_C5WaiZ3d6vrDomirKG(>-wNFOImf0H z3A8-DgU{``^xkVhW?flPI`XVMlrmJ`r~|zMXRw^*xH>OUtOIy?PI+G70D99-weRL-IHb3fwe`q2X*gRR{HbktGA^*yVb zdxL8Fn?)A@t0>`ajlyNm(puh$<&X!L&8dy4Sr)(G}DEKwVOfcSDVN|7)gxOM8V2 zv0CEphcxP)ix8aC_8*P-Q$t~UGu?iN>8D5KfS9g6OVy#{ZD4f zo#A)(Cn_1JI0y~aOm(U9-0EOyv)MrweRJqynvl+C%a;bKgf5I^r~2fA1+2eKBIV8Z zGEh;$uzGJuK52)g0kdy*SRmY#E^lH~#d_8NbM`k(@9ILlRDUfzMO$lWS zj?@^MLurblHXBDQ4;mOKu3bhfPxLo#akaywl?{A*#K5x`D)H@w=z#Raz4M4MH(U0v z2hD~>yjFh*U_KgFOa*1gU1nGgdrjR_2}|4E|0a?y?*t*$qSHDCq__u1+*jWyz#y8D zPQci!XzaUv2cpaqK3>?kkEg4)61#T-xfZC9^>KjM{7#`3^bwV0sd7;$u|)E_^a5rK z`SYtaM5M|Hb9I&8q_rYKgY3Jks%s_mYVuxHMstbT{M7<3GRVPqMiKMebCU($+V2Ib zCUOybAJuN!^eYwl&zsIql(~!B`XjRPvWnhh7rMme6c*^Eng#qci$agtXW=iuwY;@# zo}rGME6u?)9LljvAoKjiN}eP+t*Mq5W@XAV+Q1iZ5XyS>ONdS=WqVYc`2Oo6*5$B2 zcJnu^>22KRY~jXxSyB4EyCi%RCR6Kxen$G@caQ0AlNMAf-TV{+#sa;8gQ`Sf|)JC{=H3GXzI>%iZ03E+=$V zYgf(&j!o?I-U2~y#oqV@S8oM;O201HJ?RkrWFmV=tsMIlU#_(so8I&^$ISV zHR3V5RCMSMyJ|$6E6#dCmuvJidxk(>TOgLI(7naO@wAbFE=zrDqSFbaFYSQq!{oT? zX#MB4lIu4Gl}W*TBT6pAfIt`du{;0s)0HIr*-e%a4rDk$Hy-^19QTLvrIRvGAPVvv zD93onZ^}5tai%tx7bi0=IUXnc1y-7&b2&$tU*{&%@Cjssw0i@+xC~<}=XPUl#~)-Wt%$im_|H z_dDPHl5xV4=53B|&UC^5`0x*)XLn*cnE!Xat0WFwl}3N$T-h1O^`CO4N&g)!1WxMo zJKxO+0GP8hgSyM`cN*B<0i9%)epK^kk}d!EuowY3kmGppetzuc;Nakv${=S2<3i@| zo&CEe0-)-}iQ#wF(d3s3kos{wEBf8(k~9B2_rD}B0QN%mD*x8tv){V-83I;A*IM8i z+%HOKul&{{%1<7_2ayUbIZlaANO-#}mTzXFtFu># zoFg_t1fR}t@KR?4Ko}YtI?u0YFx`3iPwxD88S`J!tA7~F$r9$k4u zKlsxp!O)rSgk6yJu2(kGD2&lFk7z-giKJhQ1&7 z0#T=&7yYjaCqfD3u;z3jn(3Y_yl z-@t#qQLzK!N1qwefvr{EyE69=Jp0U)3|;dp$1G9jBPfTTM)hQ!VIIt1uWIsxi0SFU zQhNEB2+*kpYq{tTQM8cRTT7C;mQuleeSoZUVm$MDL3$ZwWl9^HB#+=3VjGT|ooeqU z20j8Qn;}b)-(lQ8{7=9b+upSm{_6$(=ZE$0y`k6BPa@Zq)8@Z5CgJ-D@He55`fqW@ z4uBIwoqi};^gFwzJ;5e>_M@EfcU1HDd_Yp}tng|@{QF^??$Dl{_$B9})P8H(A^_2} znZXAve?u5u|8N58b;Z3n^mmrM{uHql#I68jV%%h`_FKzV1nz2m+^&l9 zcO;+D$q=Lq_ltf*O1%^FJ_)Gz`DTy&7H!cTZZZjg@##*JAx2j(HBS z=v;PJA8MT)4h7&vQ=r|dK3shK-tX{uoS*;j{in+2Nr`|hk(VBm_DStXTb|^1nD*p4 zzWl#Pga4ye&ZOP{N3Hw^_WwWr`9EsqZ%g>U@*)0JYyNlDN($}v@r6JBI6gKmn7R4) zc+nM75rZ4f~uE zU#dS2N74P?{<@w~-Ny{*`6X_?+@qr?E5)Bn8g-^9iL9OnO4eExSx<>y^}-VDWV-c@gUrr=3; zC!vG(YEJ3~0`-Ig8o zk;d=fDV4_PxP9REY^`xr2hXujyZm~4c9f|x_1QSHQVVbsF3*I}H1f`;x=qE9gP}Oj zdw$PrV(JPB0TC%!3T&hx0a!%IfL~Kn!TdFmg?HxDr5M#sHF+H$`RQ5=&M%I+V1X~) zhlfMp-qbUO!vm*|iBLjb(z~|+kZx<=p%RG@scGK}d0MW$nkZx7-`eN#lUC`U*AB0Z z*H-iSG& z-&?aHFDrD|;%i@>F7GaQGpueatx0)nipl?{KI^}2>ix-J$QG0<%+WC_VCa^t;6gaml3s!E}_+f zu%82MM~M+#f&s&G4_ePe3obGMJ%{FN-pj#yudEMje<#bb7-HBJCM3Ooa}iuIYVc{# z0lB7ae6)-1W8>e6t{#9-L(12_k)YcuIi(L*DUQejoe-X;t9q}&deDPi_|aZ6Ulq#m znc+7)`BVU{%X?-9;(rsX{|61e^x=dyuT}6#`xqf&v&ZX~Um&Y(HoUwyI`Rjq4`<@B zP-LkfIsl=&ft+^V?BT=Jl4b9>pDbo?+3vf8Zhb4UZe#@NxL(_}$8FllZma&F(^_Zp zMh@#}|Kqa|%@?absdwP#kIiWX!H1HO2SS7>d)?}`8`Od=`>Rpytu3i~AYAzN=)Q{Y z(ngn8n=l?l6D8#AS8d`-STOCg3SDqlMZc*M4?NgrgSj^!xV%ae;*VSekjM{v{VJCk zoq>5MH}%eTJXt5lqX^-XM$HyG&35FcMOuLusr}wK^&IHcObIaW;nHswv)(Hl;E-$U z;XM=v#(Pn~4>sgh8uXWUEPj4>{{d^bESFU;zT}04vcYzKc3HzWdV`3kTTu8{#O4&$ zG~WH^24K2K0Eah9^rLGC^{3U<+Gd=?(o@vsE~D=su4T;*w0#G|j}m%vBY~lsA?Hph zb^g>QV$@`Sh4RxMV5B~HhMCaDf^qq=FH839rw}xLZ>b3U^WBAOA9W1TF|I$(?MsDR z#cVnqd(MyZW$$agh97-%=+ixJA64U(PQ@t6nEh)1Ye)&5qPVY6LdYXQKY-we-k`Ls%H7f(b+1|Txz*cybe&{co)s&0-t%b~!{ zk-VYOHn&AeF!V^W<8|rs^ka2R)4795O|x_=MWJ11t~WWp078CT*#^L^QB=IFIMi{| z!FGmV^4sV8CH}ACfZXKYNo=reRA4sADX5KSM>qf81p2gf#qWDv&6#^^N1L@xY zXx-0un;gpe@omp&4}P_Nf2#H%l&LbixO%A&;9Bn8b^P@4br!r0d93e|M{wXUpg(23 zH@A7m*SiE~TYacC^pQ2*0-;RGAfkeypROVIZ-(4+RH~jHQaom=$MZd=n%==v8ST!2 zx}xl;1%&o+RM9p}&b|CaUe>Q?{?p0JN>{`hm zhf{J30Hh)0o5c5wa0||(u4@{9P`yN0puGas4?o5>thmR!RF8WWEjY|Cj=v=@;Jkb$ zL&ksn5ukktoK3}-s=D5z)5&^(F+z~$(H({YN!Ucov@)K2?OD@)Cl2;U2(QC46qwck#2((Z0&z;GLl*Q=E}GnmMzRG$!2+7Y7iyhdAx1887rTUvulZ6wt4zJ}l7Os$cnO4VSv_!Q2ZkGXpG- z%KiY7)(k4b?;KssvC}C5$bGDzf%iV9hMa|0>TKtmaEVLXE%kGXpd)m?CpjN+htu|e znSUU~y}vMEc+uC>SyZ@s{B6-eiTr1FI!Z3{=vDaf(FeXP<9u)Unxf5B^R<((bB9L|P< z*7XMGb;Q-{JNnITM$70R7JnZgFK~Z(NwB=6mUVS8gWHOSK_~eMQ$Y@ETtIq9PG`h{JWV#;mhX$u?PjMcM%H5@7_;5e zi4$=5sCZIp*W%j!4sa_SAHeo0a4=re!;&9g8p|0|0Zeue{e)Urg3Ixm^UlwIGaO^ zDjQ?|$J_8eSq&pOS7BP zf_o2Y%`6O4Y&~!O%_9Acm(RWZ?p|I^0*6uY*wsaj%wpktJ?jxg!oQRSU3qsb$TaTH z;`*zLrhD~Urew7K=EMHRf_#iP)cd^fX*q1*^^T3~KbZr&4NnJWtcURW^zNFGzI!O_ z?5`SVVHuqxPZL7&Fd4YB@CXB}PpkLhV zx{stJey(h?z%N?f@033Qn&!sfzZh10E%6sW)I{Qkifw3WQLXm04x!FxeS^okITF!V zWwyB*csn9rs@?EcS5yDHS34Uj^{_6|5Y@jwk2q6&PH>^qDlzbHcJ=Qb_(Q>7thFa| zJ&B9gJ*|H2xc=VD1H6jq`g!x;|K>*gmy7nF{-#{>N{p}P9ToQf^xDsSHu@I8zWOg8 z;=cBahkEJQ(d-P1?#^G!U!Gkl0=r%;7yUWp*DQgMbS((K>=G;1fAM|ypx}Mbj;yDr zer7rT)8Dj9f~^=5UcUUFUi+EP{@*S9yCe9&Tljak_y6TBy!U2ro8-uOE;GkcZwCF( zi#}`9DVHm(e<3Y_T>&PJ(?Pd;=MQ1$n{RJ*uq-$nm`RG}AOAB<3z8zeui!kR@fpL~}F zy1cgHYWCKAR`i^_GDY*}ZMgm^(94HYQN9DS7j{aWJ}~APd0aSNo_42MDj0S~j<_(o?2w@Dm`W-<>u4?E=C0->{W5b8z`IK&iy z&I_On+cK&WSTH`~jHDmUFJWnb7vZcjCfH%ei5 zj_q?f!RJ!H=@~#f$LqpTfNJoql!vuOTY#pi)}hN)Qh%(Yz^@JKz=Qx{_nBZh_b6y# zgQ={2_t_MA6H%bz`E)|Y_HG2filk-0OrQ5^Q{v=+RiMO>(=9$8IR}mr7fNE>RNd-q z>MEdj-nPfHccXKlcjF6F<(+ue+huh8<+ck>tWJckemxVNpqNNXZD!)el(x69axHeq z#=Qt$3M`;*F~6Wu8H$Qm*-a^(42!e|vlv$wkccKd9lCh8pM$AWo^WEjYVGo)5KhCd z*k~SEeb!m8= zKtp%37$!y^#;Yj^DtF3r!N%c~`gxxg8>+NNmq)+WoEm22^Vlc(I6pVC_nod!;0- zCf&mU@QQ6zj3f>grApp{wvfsEQ4!IQ?dr#pM|9(t^o47x$Ns@nPv#X8N+uq4VS2hs z$2#Z zCrZ%yM3cmMMe)1u+3H0VY5|UH+^r@9&l2$<|gFLK2=m8FOH$@A;lTJa2BZaDBw{)$8LT2^Ta!jf(qG z!p?~o>0h!MdNBPJpQSbO<#fnH)I98tEL1)x-_?f3FVi#o@bQV+jyJMuGs+nELGmL_%^RN1V36DET!sogb8i#tm6gup@@m76^nG5&r&IFYII$yT`K)# zC}1)4Lgt9ul-Kcq4^vJ|Eb^I6o}1iQQ7vJ2 z&EYdMddm=p-uV*>&gKoK+mFJv4${^T8PS>_^ z!?bR37(knz(^aqi)*9R!Lfueyoy^`^D#uT@-OqZ|b>K)Q@eZ!cFk@$HD!L2l!q|b|P1$gV=r>HfB+lhaGK3{D6-IyE@*J6|dt*YdHPy9OY$2L$ z*r*Pcw;Oly%%oNfy`9c zAFvSzmlIk`7xZd=_v!j+14!|QK93k>mS|En{Ky91-5SHT-koVtlT(<2#nQEM>|!Hi}|Mc_{wXi2Lf}fIOAgX zw%vduTbt5TO#gGW1&K%~R9zXgeuPr>l1e73ec!I8CcGaqze$1YRE|ugKxsD6Us;rs z0L;yBRq^Y86qI~K*NAJYKHm#v?6-{8SnK#c>_6K34soHXAP>&+^~4(1whWbf(} zU)#8Y`OV*F#Cs|-b1q~q{w~3t1a~z-jSr35rpiaJ<5RbNb%mEwog0M5{Q_@P8vX(k zk`w?u=Ym2xj!#Hh=IWxpjqd<<#bClBx3w|vnyV`melPWeoP&paU*S+q7qL6zBL4FF zWA_m4L*F6P-X5l|XqCWdFiXl(8Cf086nso9e_f zm+oh{Dmu9x6#VFGq(Wl57F7BSTi-!lm(nI%*Oehv4Q)ad;aN3o{zn|<^E=wfz;HE} zTCImkfy>?=bKaCON*N{$%<$rOkB>KsA|BXiA#0_x3ivDfTKe0|SIuXJHy^>2P>yL{ zi0$C?vJ9N+I04xqtMB=-rZL_`-1vEzDkuzG5pmCpDxrtl@5XGmN!@M=Vih!f|1l4l z#-XxOV$o8$1_+0f}ERoT=jq^|zBM;Teng;^YJ2_;BXzSPK$Zq&Bm$Ul)I=db8P&%ifG34bR z8I$p|ZNa_v&dccC6ZMj{inEBoUD?7C`1XRGD>#R@eAVp#-9!D|D_1s|*22YRhVSfO zheLGxgEr34yQ=SqE;7Ap%$BH_KQ+kp<7(4zMhPR*+S9b`^>6ZoAY{rvSz)nTJs$8V$z?X zi~IA~N#7(*1@F;`1yATeZ4lh zj*=;QSi#W5XXX&6-p$3zW%g)708L^9a%RtDg}YBoO}<}?b^;OX3Z(Elj_Iz#5@%?& zOJ#a#y_+xMsB1!-mVPT4hZzETWx14iBVa?uEiNe(eTq=j2dRb|f~#v`K1vvg1s240 z&Vur`o%6t0jpu6%uOW9m^~D%Db*k?Klp(DSz4E6 z9=lTNwX@NqGc;Prrpv8e!OSR5u?i-kye*T&>pInq>q}5ZKMlM}R~`Ia7w@FwFNq-x zb7f1G;8jR+qKyBAxy632v+Ig2$b|u(|(=!9J2sX73W6 zYa44x4cw%9wajZx_2g02C>3&2oD(t~Xmj9XjH5G-zp{fX zhB_7Ly@PJy9h&`PZp4zEn#q$PTC~OnB0>^;(5xSbUM$gqsZTv{o5ckKc z_mT409DhDGZ5L)DKP|x-BhKrTKXk2NGc%=R)4&KF2wip;s4XXZ@VA=3juNCW(o4YB z@Gz4Q{h8|O<$=X_CsaHg<U?@Jj)Dvjxx8r>IX2Z;_dne-qI+vLw! z1t^J)`x2Lv6zv}s4pzG|Gk6|(^9#C7iy*I+G*JWI0{qMJ&fzZFn&ugU&yvo9{#*A~ zw#UObGM)P!$BY9oGhqt2LD#9tZ%W^h)A6N9DBrh3l~&7ENxxgEuK z5*RZlS*KxH-3Nio=m9az%k@s|c>(wmLfHMl-}#4skN>YUfyLyky(>qXbE;|y;ZAJ? zYN2D%YOB-wBU-(ZLBjxzFaBDNR~1C22iUf(aZJ)_?}*mPHVKl+QiA4BAL6~YVw1r# zOj$l1SBlLS(kakNQxpZ_IbGQ&--OIe?}OO#Eh|%=1uU_ng+V%q2|zRn;_#Y;zubxY zC-Q>*%xnnU&LF1d>5hGU6wq}=%@2w;&{k^gCD7^r{?PyZE3>}^^%?9}Z{H7D_wh&1}RG{%Z^Ku4K%RF_L_+T@+A$?WA7nmN{%nF!$Q1J&u3! z?VDO{IjhU}1s2o0fL}@yFCJ7ZuFEuPQ1)0=3ZoIG^G_i%4#OE#{77Si1f@lu8Rhco z$<67<`vL>f)^FIKcV0ccUmNvhV}G9BAnn~g_E$jQan~TZW=B~M^v_3Ci)HvPF05%$ zSDCjOAS{!EQ`!-f+Yujr4B!3Pnv{=e!X=|_ZOv|NlBpIOK$_b2%7#a7;Lq%gmp1t~ z#^@1PE%f4&dnaB@4}~2^WNHDNp}w=2+**KYIw+DMTdS>rOP>SR$ECh6p>&FE1lP># za^kQ=#k~+u(JQKsTTWDmZlC~h4}o@11DOmL4hB&MV3U5C?b>w9DjD3Dcq0p52AneH zIMTj9ujeZBphrRSt#^dE-(~<8Ts9Q|@+NQMa@ACR0j-hS%KuMZr|PTbqwCKd{g|3M zp^$hl0=();>3~4#qp9YLjGc8mT8?%N1Gh`{9u1)Jua46=S%Z)`CL|DY*aTXn)(m7a z5zJ&mmviZwX6HiUWmLnO>Bh2}P~3H!qTJwKXffv2QYp>Kdc8wFQaI5(^K(z`Q%btm z*m19MAFu3~+FL(se__|(T@5}^y6sSqFd88ZJ9sA=U+7?OK(8Z>Wsg5K#hlh}1~f&*#I;Pi;T6=i#Es`)#cC zAzh;$d4pW%;fg!{JF6nATgP<_-KE-o@!zFAliqBn8dO#Z!E7$g{(R!We3ss0;8{`v zk3R2}b6EsKtA9GN2XA&TzmimAdxs?t+TYXlOYi)>{SxzIvpBPhl{9ak{&#%!|MH4- z8w=Rlm!N$*PgJT)B~a##oa;A+qrFM=KV82Z37#67%Rn_}B>c)Z`TghzAMilQ3P2X} zaw05}7x(?@fEGHx<9%q8-I?3A>!FoOibQ-=C&0eBP}94zKYJ9Jphyr#?_H+!ChZL5 z)xqQE+S7%4dD<{R?O)`Z8sa4_y+wKvM1nH z+!0r9UR{*B9T_Ht<&&d4Z2!ow@R#0m1ZBBC+tCA!IH?eDfKAWKD-Q%h23Z+noOy4y zfI-a`gN?z77@1%AVpnqZa)x{mxw{1!7rdC+4R<`xc`vr6*E+xJp9?5QnEm!;vOM-o zITg5<`ccA?WBz@-w$t3N?07HRo>Pk{K5U>i^y#R7xmK3bh&%{t3Yz>#(XV)&Pw?R( z6n{B##jll(UgCuP8|5IoS-MtX?i-n*c{{UYBe{@9FOE=axZZ3Yp2vvdC1itgt_r*Jx zxq=mbpnXgo5qi-Y*9_tk1rZC+oPiqkmGb0(3Ch(KcO^i4YYYtiUo7jteg&5Q5Jn$d zJADb&1R+@7?T{>iF`a0q$|124^7I>>+tKBCri9zU^g#$`LiDL%)&xG!sxh-h9W}cC zCA)jk>QQI^*$cpLzqaa3_MmI%a@k=XWe@L-1qC5qoq`?|sSjhtUX&oA!g!wX&pJ)_ z=U3?4n^W6+;Fzop!cXOTF3*-90$xQeXbjYLq28+G}8B#aqRg>iqn}%TJ55j8QXETuPKw z!NqAx-go0)VAMYVWm{`%&E9~9F{qO2`Z@Kt^i3eE3JbC1Kc<*RJXqQ$srS5>GVT>< z?mNU8KmM>S!S6P*ObCYT#2M8D7`l8YxVpHx+j~KN#IffxVIMo>E#u+m!pbxY9CvoH z$pVl@+^ns1dIZ?N=!=*`wN+yQw>vUEc4_Qq!upOC69<@uz`GzXa$OTe&Ry%D(o86- z?-!iP7nj1%j{5^b(0}ycP<8d2hOAV1`#6M#K>;Ym)UU(zZ%DOPpY1zMWBfRBk8j>wkp z?cvSVp7WbaXEZYl6Y**cbGL0S5a)NuI|+c4+h!DwuV4MdDwyD?6CA>2dLHN=+?hlL z)yZ$E?@|L}mzLMx_wseTku#6qN~xc$bKSMelu<0R>UY~h+);4+J-h<)fZ@=SEqDr4 z7b6@{RX-(I{WuC_3aSdK%b0n~xecMswKfTE1vbq4>DSAZe&JgnanqQc&Hhx@CLab) zS(v`PBD#hv8vM=Q)6l=pbXHV*B`~onU3u%PLyE8zdHZ8+ zlAtczd34Y<_H%k(PFOw&^-LwJD{Yyk970ffqauia6jZ-2X^e4x2%Rsq$y8%#r4(`$6qjl2!alz^$W#eUi+>8(>`RK9 z;yA#p7;~)XdKvPt4pc>61Q_ZL0Gj8bkGREW=^1-m@20!Tr|GZzy#3fvrLZoqF|vT z$bz!{1XX=KAX}zGH216{3a@wd)UVgV>Vv&+j#2)nwE^#*;LQDC@3owK?@Dkv5;*#)TJ?L#pMRU6}XIbY}{$&UGL zuYO9jiV6$F{y;b+#|uhD_FNn=Bk2gIT7Kn6?bI8AGP3hKx8)>um#YYqY7C#!$Joyg z`V0&^v1*Byz6-`@x%CB7Y1&jVyEo%{3nvZw;@ZS8cwb*ZAeJe+=+JAldS_*QclQKsxYD56VepW~XP%?4a}3SGIqFT`*Mqv_tlK$pFP9kRCaT@5Mi zREBbUh6~uG^Qvj3B}FoMtrH3>L`U=aY|2yL;sw>DhV|~!<|zJD+V0LJ-7OXPEioul z&D2?FFWXVCkkAHC3|#L}SRMKryZZUCl=kMh1ca$kI=;!BhtP`rs)TgsGF??2==IW? z7;Hi<(CoevSZ`&GQXag|nSZ7 z-Whl(7CITe$CNPK@eGwtWm;Xe(_jZiXyNS-O90iN2Q0<4RWW8v(>if<2wD?0QAIy< zU|d>}J1*mx?%l(>-s>wWE^Yl8Zi@@l68rFa@~bm!Y8M1&wRs6l`3@ii9mfC@aDq0= zr)ylCnXtD(N0pAM-cD(t9<_NBZx{x=5C^YgNx;pvatxC?m&8uyJMI8X^0lfbL82ee zQghg#uso7Mxbtvz&%OiA*bJXae?4ZC0@uzVJKJ>{TKPQpD+?jXy6>aLrLI$s4d18~ ztktVF-_2s#`PBRuV0zjR=BVwP&yv)E>6GUY3y^5Y;wyk%9mvxG5;4~03jQ9n|B=Ggntw{;Y8 zQ!KuLbvn4DX{3_YR_W?EryaYud`5!BToAs2aP5p7~@J%`}= zLKMM%bD84$T(8Otbm@nH{7sJ36A3}6ctMo=r4HM2bLBksyi~K0V77jB`?LQ9EYZR< z%sL7pb~u@Pwg-BskGwFVMyV4>5u3KCE6xm{$`k>-l3e@n0b|Fn{%HgtrR5HoE0jp5 zExIeXP0xYa@#XU64);AH*3nAJlrt}9$}wTeb_n-?%e#$lgj2iO4|RL_9cne|?RKZr zVp27pkJ(!sTCP-@e)k0aahEE1{4EJoT25KdmrS^}6@3x&5JzzZ?y{&(#oiWdW7F#) z$PERxDKn9XG_MsC;c^*0On@y!s)>>opjd7f4qqowL|`hXJVzhWmQ>TTku>l&d#YC~$b=sVoKmlO|l_CdZH2&_Ey#_g1S3N9{?t~L*d08F$`$lTgyi0h$n zK|+ohQ?(b8w*z(kCZ&~~KW*lWxye*TwbV>r&5s$Q4od2Uh#Hxfx^6T~mT6G5u71{E zRb=4@n&O1Y0}C}C&|y%& zZZKLNY}Bn(j#Huvp5>57`YnO_>(Wg_Gp<}QID9J>H~IXqpJ7dX<`Ez!Kx%wbFehNA zRfhnpt|2Cn7`PG^+?&_ERbu8+IKQFS0j$3ns8(Nr4+W$UV5(9LvI5>uTiO56HJH_u zY!K3Y1~-+U3!T9rNpC0RK?zPWwOAD5;-f}?V2k6g!sqJcYzB{1q%QiFv&4HiOs?zh zrs=fO6&{T^Rfb_#DxobVw7GzJH}{p>dqU)87#(7KUw+o|0&3)r7A{|IZ#ih4P(7r7 zRo>u329WNZ3Ar6U0$f?#;Tm*w7bu+U5q+z)^^&OZ`IY^Y0wI8Refo18r$LX_2w?v6 z^4B&8Ham>Wv_|y&08KtQV`SMPXq}ku6$bF@$v|E=#yB(UTLxJl=sCb7f&Aka)_yph zdYe2;!Vm?8_YCV7ZFf|ShaCu)eRWRDC`@j^_)MTxy(Ebr^gFQHHD{(!Rwha;U-W*j z`lcJR3F4Uxe@uZOG=qJL>s&V)DYUZp@P(tI(pv;CLI<|Ea#4&b*4Km+V}o*$rP#MQ zf!$E{${$aC{(gqy*NNe7R1*x$^!7<}a~l{0q>09??x36g3P#@4HaRaUmaEed5IJS~ zca%Z`!6)w2udd<{H)_A+>VMLv>2EZsueV4WOlyDYo+JYm-EA7%?OTVGk(I*^1-BRt z1CKR9MygC6!@}gX`||br7JK8aPK55y`wYw1uy|6-fK@5JZz~OX$T5C<=mtwVkYrs@ zo((v0FEDnyv^P%ERy^)%&F*ABwfgvJgINHTrF*s;5Fn-A?%7XiOtq4infFA9W@SB) zeY)yOzQ};o_SwsEW<&lVlNu5Y+?v37uVCiZ5p+&>!eMA(sqZe;AB3EWKfYgIr`$6( z4~Sma74ZJ?e(O9%;7QqJSShhsCDFe@8weeCC|4gc?CTRia|p`KeED?KHBHX!k?H&{ za3_Mg!K9vM z-#B2-DyMh5cL0{Z&dJc5A#XtL5=0~@P>Z$T*f%xlCu*1KtW7h}`ZpnPPa{BU=SBI@ zKVH2!-JDvE&XWNbVlo{`sm=8!tnGFvuyw){KG z>-MqF&KPOyf#bDry*Ctzquy(I$Z`yaq}HjPYnrFJ^jE7&Y>R;K#V*~aS^s?n$b&F; zlvfg!gN09%{5kveBhlYqw(>E*tv?GG;7XVY_R16c0brcO4vF&i?ovQwW;3a(QG)`S;1R=(7Db-Y|isopo0kU+DFL7DW^ zP&v>j${PASfkc4K?>ii4e} z4yQv^C#6SiK{X@a%m}$${lydXr4g~wBmk)y-%zQZyyQx@odU2&ngOygVuuldSMmNO z@&*K_(t!-uyT~YEHA}_i4VkGS^H&(ty%PsI#6ET z^!)IJB)DL9B$GGXQ8gN>-%2*`UGD~WLo`0I$F*nm@bViSwaCh4HmN_5R8xWMjD9xJ z%VYHR^3!mxFf;00v7)+#abkmrbG?r`P>zkk@o=}GB|)aLYLW)b7>%$Y)xX5ss z8bmxJO5@FfOtt;G)*2~Dg;XPAme`<)S{y5w#vtE$bkXh|~-o^R#oL0X#Z` zWk+PD;W!gcQ9niPwIyRsLfpN7swNcF%7AN-w_uFE#k>aW#BUcNJM&p_Gy&PCR~ouq zAC@tm1-Y(EFbbAZW?!<`W6o|U{f7V&`9icOWlhLFMVw7n3iSGNol|?6vrx$IH~QM- zO0~4lIELA+z{&K)Em!Xf5R@GHk}62>O|cej;=4 zu0KliZ?zwatB@!Xt>CB_1zlr=-!F6YYZ)}_eXsmxD-WdGOCZ+%kS*q#zoop9zl`rd#9MJ7ZV8_vzc>5 zh@)!c1*3G18*S8_O_4KGz%FN}=?xr@#v9FO9}l5CSW_Q}9Y^Nnd|MosFpGbox6Ug@ zMefk8Kx>oKqN*?fyNnEe(fUw5mSxal1CpwlzJ~v79jyw6#|1uYNohR*jQWb3Iq1|D zjkQJI;Y8Ph?mU*_z64v|aAh+Wv`rcim^+>eF)&*h5bLhzGR^;%0YR{=%VKF6eu?_w zl7&U{FhD$uW~T?J{{RXq9oUC8{1`|V#C>%T@J=d|Y}AIWti1+tam_Ri()_f~Dr zBZEoeQV7v+&KQ(Rxo}zpPS7&Fov3paTUe8y6+`yE1)?~uJIdNc$CCJgGW5NI!J>rA zjDcPFKD1~B6g(1Vs zNnIcmY_9#h*4E^P!7}x+sLoWeZ!2SuP)`P*mM(G3a2AUn+FpKhcs*C6w8;rkPiZv} zhlr(W7&J#K`)WMhE+IQjF$QZ%KhEdNMNLWFJobC{sg3X*m<#c&wk&lArkZ3!GkX>&wfnzs*_oA_Iz{1o_9?Z|79#$ z$*wbv+77bHDv}fBE^n<>!3k(J9t|V)-yE(87=|oujV=eTI#$1wOT1um4m3d#oQr5W zj7>;Wa@qgY3cjpG-K>h7tyUowJ~8}`*6x;eoywJ1epUf9N4$q<;>hNqot}LTMQ4jR zbBf4qHJi6KC#oV3H3XDB?(#2h#k|bom9sw;91-KQJRF^J9jTq_Y)F%^YDn|n=?a~_ zNJjt^%50nLRov_BRWqaxq^!x6MLEz!ZSn=43w_V>pgpZa*Dd)R1^a(^7sxL!(YNH| z#MLe4@Q@3=B z%}r<}4Y+NHU(d1Q+5OZFDpYt~M??qai#5l3-8rILOEW`~(haDW8~k{w&x>Wt?jwx4c(A9DjtE4Z_N+JnHM9x1fhtd%-5 zW8|#=8GTl^Fz>xqfzknoa4v~QhPIX48|8P(kuys}3DCY32J=(BncrnlZ9woTz%*}lh#ajE`sTI>r&gmqJ#m3?+YL8pQ zZbx0R$-Wt$yEd4Gz7gDW5dGqLFHosO_ZATpJ7tR}3I*k2GM?m^7kr|>Q7Lu?de86Ej!$Mh7M-r*)#%qp6^rT)HD41?)dKtf%5QNe+V>6sX3K#=WfjKW^IFai|$Dk=WA(g^U;UK1z}lx z(G4h_e*5nnd!yXD8SH0`Vob$hSbBeI<|%zIEv$kJ1R-2t2%oDc{uF#bBX}D&mVS&> zS~V^p1`XU+8oy|WgvM;s5JbcocB`O|1IP!F0g!b{3z>B zj}B1J{O#)E*}ZNxE{CdLHUV9k-$}@$x45Pn!-X9h$)X!cxPn}T`)*1pBIeG8_ahAyg)LIuqQ}nPnPkRW9E8t4 zkaxSD5mac5X-yg51rJ)pS&F_?+2^@DEKyHmEAdQ+7+o-P)K6;o^IqT#T4B11;H+Q8 zui#lRUtXDFSlBQ9IFyV}3FVTo6q|yi3FT-e#)%?!c`sCnJ-}`v6sF&YI+!BEYV(Pn z$kZc7nnfQ+v+M*F&fGLd;JMcuE)|@uW%Hzr6%4$4{X~xPBBhGiBM~#=?@~k^WpU`M z)5Ec4#($Ihwo)u%QEA@n|1>L;Qu5xVZ677HnwN)E>NUV=ZC*T*SFVEeCBG0VC@pUu+-rJJU;KGZ z<<|3Fmcv{zKJMvXUU!&P#_A!pG1_Osx%{2<1v~5oz5dW0@ST20#iyc%;D7!Zd&#ep zo7{kmydKKd7L~5j;p}yF(a>r5j>pD99png3?w(0jGrhYKCZ4CipiQeryDlZYTvS$J zX*_;Bd)Hyyu?3-ql}k67@LjA}Si=dL%{;yvp+vINQ;UE1E{>c8Y}Lx%bYHh?R~NYt zs7Y-S`$|z$d6T6FtZC#0n`ljkm|^r{k({glRfnP%#Uw;u)Xf{}wRS3|wPYj~i@jh~ z^KE<}k}bVP!`QeQUN|P>l&v`zMQ$)$FS4NB_nH3`xUc(qXynl%(?Zg7!`42r{$YU0 z21m$W`(Y^j{lt_H+Ho_Yr}hC`#9Sb7Gy(QsAFQ7=?I|*+7Df06MxddA4o6M)wHT`S z=nlZL4wb@2$B?x`XhVg8cNNxt75!({W_eM=p`$E$MV&j;wPdySC!-&NKsU=T%8r2z z3X^auxwdaMfDr)CwtsWW6R`_QCXiN3a2;N=2vT?ecfI}i{ybPl4GeLN{ywa)Vy|nu zZ{&@@@9%(#BChz&t&kpkY3`W$9CEn7f;=~c7JM^cS%073l+nMSGOLxU;+MPs09RS4 za>_7kdPw`u(B7s{e#>aC94Pp%QvQIfl9wI`gh#Q zMoFwWf!igceCk--6xJkaz4WK&8eMTacr;sE^3Lq4Xb?`INZ6%rH>^Il+zzh+&EhFF zyyQ7>F7VR**0-WgUKqm{eNofD>q1#(48#-E6E2u6L63OvvJ5rAL+eqzJQ@~tKcGnK zsH=;*pFUlJwVnk5&lLq{-!s2I@oFrOeG4XMRm6)M#09|p?hKWADGJCJ^g5tT3w(I9 zC3Ul3weRl85M|fPjYzv?es}?-b@4;u+e5llfyL<_OHZ@n&@VBp*sZc2QxBvLDWf~n zM~~)hxP7flh}gc}OZhDn zSl&4lyePx@l&at8hqRqJ#E8xJcicrilk^Lw6|d%L#KBPm7gBF&{bkCM47sE&krC^A zga>r|lb5|g_h_5V`~<@t>NCA#Dy{*A4p)?JkVZxz@UiV9Yt5-HL$sFC38xs-f;A%H zTERkXR$yx3J&eMhk;eUbXl42fcC`{oyN0aospIt2#CyCdwr@vaMx1_wqf)ai)1saD z`zoOgw1i&o?*V>k&^{llgSxebo&78nLFvI=*9iE&RmZa+9!i~Cs*af6a!Hu-cl_zu zPci0T;L{t;I3ItFE8?8crboD0(HnE7O-A^x-?9#z^;z`>e+Hxntwz7VuD0=RK6+1u1IAFQYPfuPILt6;pwhM@+IGgFKu6q! zQB4+s4ixCrcbYNaUjzy`N6`7`m!1}>(DUZBT2G=VE8ENA>#z<4k6OZ0f5tz2+=J-X zE@#Xt9m^gKomSy1wkGhCGkj3}J`O0-unYhe!Z=@mcF`!x^3V?6!w^<-!4c}sg$(vYyI@? z9`5>V<*rtj*Kny;@^*52vI>4R29qx0<=pbyPojkr9jyLvHE?#uZ!tPOEWjP zRh>^~6j42jVXM@MlmF>yOfAA-;uz*^GH!1FIPY%p3wf5T_C+l>w!G;kCzG}Ne9&r`=e<$y^@ue*H5Ltz;>|CL?S;lv-=;`rzE{G{p2+T> z;xX^T6ngIN_)woro|U-^-&{0UF99yZM3fnQhaW(qO-uTY@n#p_dtdj5Zv)n!L1!;> z9y_4qyOhN5C}EQM;_j|T<`d&ihh-HH*F(JQ@Hwn*R`Wi?Dn4a@8TH5znBa zQvr0F4tA*UhwML}BWC%Y4}2s}3b(c2LmS=*n2I#IDSl3+5|}8W`_`k*xm$`#NVt+k zc`=-@OV?GDzE^R~742ZK95AL14y9$43&OIy&gA%*Y^q`MuE(0}P=$Rt)nCA`FrmV! zr*%(?$9esdcdBQ_#7u8R?p|TzQxpRCOo0$o%bzbuymI8S3TT=w zJ3b=LFpnh#Zr%4>+0ookDbNZY4`w|Q;|n7u(YDnHDC*UhY`hOwpud?Fh#TeU4y_D0 zkbvA=F8@!44ddfg1ehK$Dxq`vzL_UbfLR5|5d;w5UV_FRsrO6$i2Y8p_CsZ3=U5{B zQ19m2DC1Yu_)3}Gej*D`V>@uUny zfe~OIKW$lGGh)yWi+PEug^`>XPCeEQy0NAM-4%DvED%u9&cn--P2tT1I?0AKPCo`e zZF=Yg#iIJ@LkwlyFFSM9%Wums>+vQi>FKHz^5<@M^;XYv>wZfW68KRqWeP7}Z= zZg(z4;}1T053 zp7b$i22K1wdV~3g)u6lXJo6=4pE~AP>z^3v(6`%^;>3+4LoF|g=UY}ky&uL*a}V?{ zHu79Sn`*G+!2$+;dk5>-g7k=~7ftl$y-|C;e)n=wpPSbJO6`*O)TYs-hrK#Al_h*> zil^A3>`8-OlkIZvx5Z~c!OO1W&huW^2|-&8XMzu~#}w zvF$uYPfY4Bu=Db%u~~0SJ0_w|A20Dbdp5g96_?k8oSA<8=2pnuqsbHGzCC9Mf@j2y z0-(`-g5r0RcS`kU9xwMEEizo{Oq9a*@aZA75{KLyO7J>QzR0PkfAd}*5WK#zpmI;r zy!rt?6PjfR}fHEj@kNl4lul_l?@oXZ< z5vSuG3m`bYh4lm@1cih(ICP%E0cI52W!>C@#}>M)$b+3%X2LhEZPzVd9S`e;9Qi$( zPwp0v><1A8F{AG5w(duCiJ!iI7xHQOz+>Lvj|pULTF18VXOlfdi^wB^--WW27a_<~ zJc}80sz>xEPuvxku^OG0814f~>7?qcK5r3!**muy6nY_PaaSEIY7Kim3x9XC8XVjL ziR#+S!1|1uOP#Htc7YID@(Ll`YkWKU&uRNXTkU@3Sg5+ZD?nwX2%MqMx%`hur%r8)c8TE6;_BLip5cFg z!h*Ne;?<;Y!*YzfGF?BnO-$ULMgqbRH76x4Uh8Y>?RFq{&J4gIary0lUUb} ztiEGrvC29bmv7n3l69woXuuUpSv6cB1W@V$(dd6r&8@K}qQ@@p`-790pFA7&vAapD zK45zNI(zaSvPt>eFb?6nc5q>+JaxJyeFWmU_Bdjv(lzVu_T#WLRX@XXT6``>wpuOB z6JkN55GA7feQ(Gb7il>uI1gVSMGJ^0N?OF7>_Mu#X4RBbR{Wt$+=NB)R1{jFqI%Z5 zH72(^rA+H?a7mfW>dTqq-JPazk+B-_D;4ZSxV%I6wF=)_Yu?LG-pNWgSVt9^MUR&O zTncyH(gg}zFx07fOUA2Ozp$e(t!t+#KI~L_IC*v*vczV6Jy5!~QNLJTEaTy3;HiF1)Q%1^tQg5QQl z15=n7Q(9G>J6=2@`}DI~+b&{63YX;m3pV9OWh{a_oD@5V4~7E>wHaZdo<^!+mv1X0 zdoTNbW|qGA@p9Y4oT5rNU$tIctJ2I`<#Hpu<7vJ>;vsXk;_*IF@Y}cLfdXEKT99$A z$@;x%x(7)-G2fM%?4~ijOgwfsV)T8c?sdf$Lzb3^hRt_Pl^WQB-FkO1&l>H@fT2nW z^7?&4B@QUPQTd5wNzqF>WWx6~ay}#rxF{&3@-mTS$aQ5kwSz1d8 zO(vyLyxvqHhhc1y)^_vs{>s3W$oyObYr1EN0xqoE$^jKxefxvC%6j@z;t;I|n$08b zGev1SmWA$xpFcldIC&iu)U`ZdekOiRS2_4+3xh*!xBb#LgJQ&3ZT8^lAd=)BL?4%! z+33nsE{S!fjHGeP?FIKk1ya^K_rQPxt{LLOJJ4qX-(U?q2cZrhKc+uvZs|Cn_;!Hw z$P$s{b^Y~WlkzO;TV(R#$#H4IUX*~k_2%{-#~HygKk^6?ANxR?o32`aP)90s^F+XD z#WC_MkbdE?gG(*nbCo0P^sH>lWZLs!D^Vo0uTkXi(z~eE8Gf5oyRbWBJ&4D>zR8l; zMFe}!PCXoor$hUw2$p=Lc8)&!>>;652xD0v{h!)C7RNj+4XXpcKU-DIV*2mX0DpIC z;PrM}5YBN-(k%x5c0NkL?1|9<5UVF{Cc8glNM*y9Z`saFXD*%5q&|_}$;d%Dzdd339-vsBk zm+Obe2x7%%A$#jv=aFx0rEP+Lt^kcw5)CAxmQMLW$;T6V9{IkU>xT6=3H|MbQ#XUG zTd!?+GWmIiLj!57yM)Ff|G6^A4=^a+v|6ec|F_dXe;1+u-|3!&i$ZUWH7mPy6BeV&8&^#Bsb%4&}Nvy{;JJm!O%;c`DO$C?LmF0tlw_OmnP zJ@fO3uk9+f5xez#;-;d=K+b^)MC(yMuR*FLJfQ2hYrFqCLEF`<`=V;qvh%WMlCk2C zA3O39dToUwJ|A6xAYObTJjX^`U%W`wfqi8C#A5X}i;BrC^!9co!B+4;Z{NS({a^pK zEK40#GH%%_aZm(_-QjRaY2*>=$~Xp%xBQ-6tPXp+A(CQ z_K>$w&3?9anNHfOaAfGc>`*Ko^o$gkjr{-mdH;EM8TFq*dUw7vCf|O3MfG5DOGKFX zL!~3Ok~X2|IgZ9xv>%iGwz7^xf@JuCM!r%_q*=-$Du6PnUtEeZ^?ViFYF{8bD2%=2 zp;3T+4s$_8^s7nm6GA;ht-QNcp$&6VOR5jD*mM z8k6GzIHyGe=#&$W=5!~~A^F>)fAebih0;MUUR zrttZ5{Qve(DD6q<^?zD>60jzOTK#{rAT#;WUX~&j8wBW|#Kp^=qQ2A>*90%eqJ6bd zPE{@oaLt_RYtAK5`@R>%ET~+u?_WI6hbyTAXLQBgf$KMg?%&?=>msmQ!oRL-V4UYB zWE27Sdl0!`@t@l6cl^xnmw?=PeW&?!`8*#ktqVRpceQ8eJgVd~7I5;8K8wG=InRef zYQcvqk0j-v!&UM1y@m~%IQ@b?6Q1Y8shu#fm9mR?)Wy%Eim9#xj_*s?{1|@cc>ePm zh_2v*D!8sqQQ*HR!{2B}JVmDY~89bsi}a9lr_=8S#sui^-IHcF?Y;lw#}E4@ z+xTQ&J6gUhQv!6a>i1Z}546Y!NZy)+uh>Q%kxy`MwzB~wWK?{-G9fv6Qv86I#jBPO z;yI+cekARakoNhmvv|wx?XJ5bXQc|K+cPfo>P0&C3wR=tzjA|GU!u8OYI)RgF^P~W z%KJS{VDIo6%9BkG#LsyAW-C&}N4U>$yhy*1HT(UC&D1H6xi+YGtkddn*I3!2l7kzM zS0SkScGcBDyE@`;-4^zYUK@jrBi{{qs9#gHD_0{F>EKe!B@2mg{@Qrt6?1gG4efuR_AWJ*9?h@FtyomN)h1>u; zX8JWdwP~XUV0ijr>ep%jHtuQiPVRlp((ZI$wVZ}7Y+XyIm2cm~DccT|+I-HoYol3p zWyf8XemZM_=GC!scfV6s{uxPsY2|p z_N8&IUTvJeeD~H+7Mp%8eSp5_K`e~N8g2hpnh6*WCWfv$bJpv(G^Dc>Qt3(A^r9C- zEqdZYKW!F{E_5f-z+4a!00ZF8GEKSn8r^-&cnd7!O#@>k{p+qrjW(U)*M_1a(j~h( zRc9EEBH4{Q>03fbVjjQ2?F8_;;4tBc3`?V)L{)!(S=l0;8hSy&$z;SKa&@!UZ31ur zPL6RHuU3l8Po*`_Qmo2ngDNePUS0KEPm=n_Few=cqt`lsJA@~j{mQ=?_utU9(t!Ij zcVKAtWyv%y;CEYRKg+MN|NdEQc__P){-*So5w^x<=b)XNt%)MKkGY$wuE}1vSk_M-+(7AgYnhZw7STxfmE2Mt%Opb7jjM#=FUE1Xj{hm}DJ&VPAcrleN_ z$4tZR+xE%)lmVh6kxS(6ijHDH1%^`>Nl%9MNUtR3iY?$aK^VcOy$C6YA2en91LatX z0x6{XZyVp{_RKhLn7>w~%w?gWpGq~VKQ1&PN2DHq#?EOGoDuv72nIik8-zE z)5y7V7-?vRjFEem-3J97oV+Ih!(5=dJW^Hl`ZjR^DXY#as&}EG(dz=viAQ7^dZ0FZ zyEB!`qe!TAyt=FUH0MUM5u)LQ-Mrsu)}dJQ4XRwV1xQ0>7sDv%si}hiXZpk7kg(Y8 z#a?pgbCtZx3kMQ^v!cHt8h(yUz>U=v<|avjd`8`C@O<(9dMT>0Dj%Q6&Gjob&l-#H zC^?@sXxB@&dOjSsf>gVfyxaoB#2DHr(GQivQuDTMX^Zq8!Py?pGd<|!o59UxK4>FOeUhntX4pcPsSDXj+D*)&Z1Qi z6bkK5wh$45*G6EX()b{j%ffM#U9Yz@n|+D zqB+y7kG6kfEKE;cJ;T-@LCCW9>Cvme?nI%HB?7Q8CI~}P5kXzMe#nVFX8QwIQ{LFWR$CrM=WQAT;XEhI(ek9s3B&N0_tWn zDTkBmJIh1jfOYeQ+I!~_5u1(sV-1GcbwH3|);QSM5QcXPFnp&!5%p?Xf>UZQU%s47 zEyjX5FVibly<$a@bI0VX7rWn)LVJ@TdcZJd$1%3>6EQsWTmoQpd+1>9i1bTCLn5c5 z)$awGWu2Y#?~GeIRoUIUc}J|nkD&1QyI>Xp#4kY4k<1V?SHOuoPk>6Hy4FGVN-hct z8g(};4xR;%hMV@-X=PW;F2>1cDV$0W1ik6VFRnMISU~^Qji7EFa@KG&_448FGDA-i zSHvzwt@M5bU2344Q{9UujE|~N)1FjIHK*Mbdc$u)vyyVtf^PFQ1Su&BCH{l(N(8-B zIHkjiLsb+2T-56|Hq>W4Z@$95(Hw4c5E5e#00ADiYaA9M{Z5W#hVu4gM>d2Qn3=~n z3@`oL{r?^N_cs-h$Yu5N%4>b^d8e^z^RhO(X-8o0bYmZAzIYv~-f@&J@@wIyLw7*} zR7SJU)k#mFc5xa29V6JH2G z)1AI>kqTr#K?vDCGo$Dq5Wql9E!qneVM|L(vtRBvrqa+n)cexD7bpuLd70|aQ_xK@ zO+VEg-$$33^E|D_3Pzy!Cgj~sCfYKQv!_`KNvvgyortJUtgkyQiMKpPF$x>`(7#Odv*q%() zRcF07Ukg3v(7zOa$l0&un0wE4Rz~t??J&F43nD*#vJF3Rq`&{`%lAe3*@JD;_H5;> zju;koLg9{{x05vv9o@^y479XLz{6iP`TAZQRP1B;%1qjA$ay+_X59BA+s>*yA4s1Z z`+9GEzO>g>wk|MLu9%!O_g`J0|BTze&w^W9?<)G_9ZAH;Cn2tn*zG{ZKTpmNaXBW4Jo>HOwms4$>&+2bKSS8 zZ%Fp4Ty5%))CWm3jI2G-#WfV_!_=3jl6yaa!#L7mvA1giLBJslzs=^U;I@ra?;$-) zykRm00Q_xoY?`%C!zhIoN}yrn7(I#H5tLJ~_=E2h0?zHHm$2pmb_PetQ5wU34)XEI zJK2(#Pu|06mAXearpv;0V9x8Um(OM_CbB9V*ZZHN6l|XAOb389cSG!KZ6VPt>S{m( z-H&6{j|I57PAZ>Q?;RQ_e^pRd)MQEGORy-nja1&+<1lPpEcI&Z-4E>heMH1Rthvn1 zdpf+&aIvn8mzfQ#Tv$=sdRYwksvD^xSm z_YW^Nx4TFdjZRtuue_Ndf7FSsd!`*T=JagH0})YarPYEnYT2?NayojKNcd1gAw_uI zJ+U4EKw^c-Q<)A@9dT^M1$rj|5|rW5%Gse6XJ^A@w4JLRVM6=ezN9ED$e zzlv&VIPxC-4ZZ#MpZLuYfBRDB63w*E$z))`7-lp^BfXB9u9m3~OhTxnTY7Yqq)f%h zOh?7)>S~1U}CIec3 z+PwL%ONV^MGL)3@J3h$tYGb9$w}JJZb;_}I23#ACmXuHQ@CsYKvxa7k#McGmb#A>w z?bvgGoQzy;?MQh1`0a+LD@hL93-_6o zJkq1T7#^RT(DU+wd^N`0@xeAB85uKx&MExJXZMmM`9_WWV$%>g1#{^_IdX|FSE6MI zi5z70TsMu2;Rfiwn_k}cp;P~{V2V6sJPNPvMs*A3H2H3r3J8e#otE!{21A@_tFkQl z4E-6st)|gy#vT3hIANyf>Rx&%SmIn+xe2YbmCUbT(JMsvJfvo&XVXu3Q~YG6@YhlCjlcNKknL~sZQVtsut z@cEq9y$%fQ1lK*v+&N2(+W0a`C4vS_i2ZzLrybohubrhw!NI{1uf|Gcrt91?MNd7I za-PwQm6;ab*Qt|GD?C&HxwKUFcLr)`T5joQ;EVhv^sb?jyk^Yo%F@zr6T(7;-C9?p zZtoY1zQLVGMN;&Z!}qymUahHWR(S`kjaN(vw_d?$V1Aa{pQ5zf8=~|{^kRqU>uffi zYHE-`>-IU?U5}gc*xg_0*Ca(RoB{A2utkFQ%u0-XB@)3ul^XRZ!prXKm&ktk@{Ri#jf8JpNjZrrrDAD)Y30(&|3Y8U&h=?FGR{165xb*2V zW=yn_nApPpyExVk&}=c8nlu;y3~l5f6Yp>1YX2!0)G4^tSCtVHKBB!T0&xn6drook z5dMpZqde6Zi&hcELfM$kNIvDevu_00Y#If+JvZ$ax|wVmPV-O(bEHT=ZhgYVm0w7v zE$+VVUErC^_1{TG9}5H##srOnbfG^#gZ_)f~7J*#nC zwqJSR%YuIKWk2}>%}TTvJt*D`^E8dIsN7?_He5iXS!PlKnk@BVoK|_-L5gzS@YR31 z*#A9EX>g}%2*dWRx1VNNRWLsCPrJ8GUEElYnDQn!3%oMfM zb+QX<4uv~>WIIhNZnW^c(q6GTVtlkqLCFRZS?ql7JMk!|2W?63&;BgrGGok|eBG&2 zNW^~-XVijg1pwCRAFeFaMv-NlPUT3;tFC;VI669#+nB8RIs;eiO%buVG6vB9$@{^) zbYd3^tGxl7A2{$2no5?vL_yMs9%KRSR|az(9as`VsqB|HLPA1z6SzQMil+U1t*-r) zH|%R`Yp3RH(A~xN2y;o-AkPJwPuJ0~i_`(AGVxC_OVyQVvp*Erjg=wizbi1wPmdlx zeD*P2u^nX~^bVIw3{}#dS!PdPfMsNA4SCF^!t&!)8+E13NB4>wT{>b#Dl_w`3s$}M z`@Ka)eet{-panV=THMy-YjSe$%1Csx13yqqIHl79w~Dk|cGI*sHKy@w8gQ8(Y8UC% zukdzHTR$rfL$yBK=5jCa>K@@?zP)PIR~PKb?v^MaNvT*iZ{b=CYKNgKXM3{CN=+Xx z+O%c)t#}<>YuEQ#kE9SdvtN5j{(Bng&y)5`A^~}j0Y@2;KMe5wKH@yJFM)x3`Cj~9MmU2L%TVZ$S%hB+f*MXC_xanWPg+ZNUQAh*8c zQt|k}ehV;Rx0CAk#{K$5x65mpE_PB2Tn}7Hh%m`2l9mu9NsLdiuQVHQX7D_dSryHo;-wQ?y}r{`2TrB6Vo z;C!4DxnM6u$ivyKNSB<$Q^ak>RPy0j@_>dL8M}v9lwQ05UHloAaRm0- z!xKj1J8%>|0h29p7J9Xn&t(AP1Lxk!FuYhuFj=gq$metz{WO8U*_2s+u{%K-+%Pg5 zvz=*=jaWuXAI?4yI}ayun2ILLb_BbHf|LkHAt(&~+~fq^il^`thobhi&DS^AzA^XJ z4v&tG((ATNfDT%Tnfzu0gHp3i_Tr)h9vjN-WEtpFc}K`$<%D(Agmsri9UEyq81mKc zTYAbndwdX$b2q<6?N)ekEsW<~A+lZknI@Fph(}tqs)h=%m6s_bk1m2eRSSDdLF6 z-l%Z$J&}Rq8;=X6C}aCG{aftMmKU8CPWVy_M7SRo2FQg7vv|Rguv*Z!cHoRmOe(ca zhW>toFmMd~22pJa?!!7v#F*nE6KbWmfAljcXV2`YUM0SNPsqbDA~@=9QrhDF-IeLW zsI>`~&v=yDvz#x+R+bl(N+odUY-^jbohYLWrRcghCf)31a=%kEsTUP=C!V~yox!S= z@o5fZe>&sXScqAoT>d^1L%z)c2XtB@-U{ zR+SArDTaZCsE&c3mq)wE_2iQ{IWNs?hf>?mZQkqHK(IAQ=BSEyksS~DmR%Vl8mPlp zvV6OnNeYdl@;;W~Tv{KcEJS{~&6~QvX|(<6iu+ZpD`aVtbz5^p;kW&^hFTpOZY&7_ z&AzDpkqN6BYB2~~SI;)Y93v$sUV*!{VBmhbRbo7;xAq_uj6+d39| zHbJ-6Q4`}TX(aA^mrSMrONcNJJ|>LY3k%B8z>+R<%SKqa&D%=^P~Eh*yo(FrbXt{C+mF$OTy6pG<4+RgJ6p$CiJn=x+1n*<6UlrNnk zSA~olhz`>)=o-crXaWL)(+{-JAB|?4O53pS{4vvwr`Rti_k;T@9I%4fy(d5Tc{*Kt zn5SfU;b>=>T*T}iM5OT`W!TO8&^X2IftPSg$SHYZIIzYJ3*PgNVXItYQfO&B3Y5m% zzONy}j$`J#SD~&Kog#1+i}@~ga;E?gx?z#i$m2Wu@E>rbC)#F=tmbTfKH2&faIHP3 zZ}z8<)TIwv!RpO98_Xu8JQ%%&+7%Fx$>{7iW|;-^zculHQ1afg2+ZWVzA{=q?l3bw z#W0C&w%C!B-D5TR<#_7<#O@G;-6>aU*35`)@iTo)Rd%P=l;pJ$ z6)tdV6Aj&f*&_Mo))WCDQ#H)#wJeLWRo6Bzn}ETdByR4<6JlF^ZO~SnY}l3D!UHbq znF=|ngq;o*VAYK&!nSi&p%wf){qrow6P4?Bhf@^aaOVJ6gOi1gO{4m2f#e4N#qZa+y58R8EYW-I(w@7YpSIv-vbrrZWQX>Yz3;{N{3 zOey(-cO7G`BgvyzFsEfRP;4c=ITG>w{ki74qmUNZnw%UZmQ9 zJo*sR)TsGM1JpxP)S`fk(uasvlX59k+u($tS5AV0>f1U;xc?jaIA1jj%41KF@E@`^ z#ZiF&3VD==N@;eyeNN@-A>)wD11vRfVOr0a!$N{;ypZl^+&;i)0fqE0@NK!7UG2O?U5(F?pWF!7KWJIaNn5|qEps-V)Dee@XmTJ z7YB13DWLqp^A%8At@Qtz%B-|{ltw(j^$L+&@oHMdy30A~_R=0_E7CQ<-AQ7m#{f|e zU0V4O=3vgXK7j`_9}sa7Tq{4ZxlkMQ`puiR1A{kCXQuE}uIU6B6QoUc6ovB!$FxIX zzp%m2Y`Z*gbIT*^yiJ8uULL!C$qAK53&{G*3U#YaJT<1|vCWKM7Fraj8oI1G7JW{N zUydZpU^P*Bz0sdr|1^cWIp>yV_o|!+7#WUqbm(vb$flNffrc!aes3@L_69F3qp=WG z1#v)oASC4sGO0JS!E72uL4dIt^b&0iO`!&`C5N@rsxH8yu|8fIyC)fDm-jY#lp5I# zkX%?B*CN725(pQy4z}jG@-FT{*cuNd%iTX^t5tv6T!T5wme*X#b+|>6I{xM=sZme3 zNXKxYk2~He0E-l+{XBGnvS0eHb$e`rd+v>&9g45F=SH(VyX)kxDxPzJdktseW zR^b)kIQ$1|?C04>jG*65(ue7;{h>euk@Z$uO!cCE$6FCMWE;jv0EW%oarM=e>OHcH zJNqE^LquFbuC`;%3fsF^6&#&eBd?YI7@7H*^f;C3o7Cx{M^(Y0vs2ydPQr2NhPq}W zjrGuut6~OPRZZ%lKS8AV{{oQ?kv3u80EGaIgKaqgN$D4qE)@F-TsuO1qvD5ocx|K? zoa=mS08>ZERGACZv&#MbY_4@x5|7pWs+m+}6Hno`T>XGS^_PY{dBX}61Oi%{8kc&- zgTn23SL!r@bGJNPksf+x771WNr2@cd8s@8Yw6+m0YdoDch8tLE#CXqMbzIdbq(13? z2k$z@lzid3`2O=JuJCL{d?lMB2N(*hl}&T16)}!o07}k^d1MBQD3E6!Lal3eT_B}( zSwYEv&?(jZv44PE;!xA<)3qNUk8zRR?1jj|%juB?*mr|?uYKVC^yEzd2F4a)6U<;C z%-jlhWVfcn`sN0Ao@%`mW${T4;8QDrSy#1baoW(5xhu*-YLzlW`afz$@m}%SCze=YCgT7)< z9)^&?Peyx?Arb1HpmqYKp&n}IuO-r&pUi^28fF94TD;4L#kT^U6Z5BKrRjO?0*@H- z?HLRlbmM8|qb3K+f&<^%WO{XuHJT~osh>xs!CqM*|zkb6!|Iq+;{Iv0`5?YKQBqPLQ3qLcQ&C_ijJe-EZ~a5oAIHykbcd5`#i{$ zf=$u4cpeC^8tSeE`CbHH$dtEtwI9Sz4kNt5LwvbhavW*#})PDqupMAaS=Us%C%Gx^fq0>UWFWhQf*F-nP%n7m;t*s3gFH?b6yK#BF*q#=@_>+ZNc5zWK4)sr z#}XWl$=`oY;eB(V1xSI->8ExB65cbH514k>F3X^zsj0H0wefl>5V~og*OgToB0d-!bl)({AlrwI|ra^*`6s_&U=3|kd! z$yTq5t-PSaK1$v!FzGq{g55x6uLYeA%l5Fn6BWG<$mh7?^@@9=Ox_?sL^c{HFAF*J zS)0OgRWTlK-DDiRjzOQcM?m}XVrakDab5)ocusdgsp4}j&wICIeD&2Cr}YE-`KvF?>x1AjdpP9b!c=&rn7 z`JxR9gu3;t7|ZC}_aCJq3@tM&9~TAI+i$EUmZ|R&(-X`ceseA*$|%yxEM0o!Q?%%{ z$_*3HJgj5hl&vXR=1Ra=PbC9Yd8lfHmOhzAjeUh7v3?suqa#!$UrluL1^^UL3cEQ@!9L@U@DQKy7>!EH$ja_Ed<Z?njPkgpjo2;9vgXFVqVrbG`}fD70cCl%zRb; z!VIM+X7HsN;qsKV%elx&OP|X4>&ShasPzq_5?6@%8R1W!8C-F z%^K;l6K_{)zD=_DBowXE`<#K_mAJt;yn(ZvuU{ojqN4{JSqc_@%zj)Ytrkst{N|}` zY1P_P96gzLcki=uvrs|g*YvHi#dPC|T?)OVdrI_LsctKFnx#8!z5#>IhS&Di85++{ zgK#8#Ea8zN0fQs$API(uUljgGvlc?!*~JL;T5h;E;Mmx3t)o{L2GUxZtX&v5oeM^g z+7m0QjK?io0B+9+>VUW78fp|(@-)OKJwL#RugsJ<#2x+okX=TYp%%58$X)Vy>JLw8 z!Up1=gQLfIMp5Vd%1pAz%D!S~;poy8S$Fr^ZCdDTz5Ario1DfI>j*fK6Z=@>tbyI> z@aaLz>)iDwbqFtHReYjD0isnkkhj)j(;y=mdic~CF`Zsk%4v4%sKzuE0&l!ETb5YE z?cTvaDwj>LJ{NEetMf;*k5AhHzxQ5m-Tv_aNP8)*LXX(9&`O+cWnCc7-Cl4@AGwIl zY2jK^Za&qSH+nSDI&*21cAHsi)1`N0+juCCD}nTsYf)BN^>A2Q%ZNpK3RyHU4@Q8n z(kz0>L@L&n4*AD3^Ttq6L~WtYNVPo3aDfBw8bfAPfrcogU0<&OHP8hmR@6wokX)-DF@b!ZZO zpfot#5Olq&G%*D60xX5Z?_#7VHy((bmUm~qEO$6cZPiX#-RQr9loxe{Bn!Ir4=@kc zp^$6!?oP&^r2=%B-H&hyvFyFfX2G{FWu40|Td8Fth$&Oo2&>aEq zNnB;v1N(%v0a(x-fSG9^6KFDSD4uoE?0Z^Xn_07zBxSMGHSQ&V-bT}+&_;8q==xeK0T)t?*T}(7;w$+9WLudXzd{$ zU>6>-KL1!fRvDBlS^rF}KxchP0l6|X2U4bl__q;bWh0Mfyd+pSNgo;v_UXTm0*pd6 zY$W)ZuxbS}F_x z^O6Sh`U?zZ3MVQ(w0n%bU%h(H5?W_BOU3TB@QTl4x1h^DB}cQYcG5|TG{I62TVrEk zfkpaGJ2GwElt;R7Vz@|k0C&(bW=SS0+n9aG$rHcAVi*F0P1A4yU~WxNa#f$DhE)(A z1yje7E{p#WzxN`yqYevv53nS0C*p1aVz^DS^#=R_wDfhv1AvDvgwNguee5Qe@!5a&rWZ$ z+$o$uSqpL`WLm?LmI^h)x51qS0|K_X z#`Se$N$+cXF4xwPy-VLdAE#^43vFNH+cpAVQr6Yw*HwVZYjrR!MWtA8h@TYjsu2pc zJ$m#+CrlA;7vyYJ*xBb!Va?eVZ&ak3qTisS$z*zJ&S13ot-i9*;O7L)k#j_=^uAWz zATHf%g>L0j^IYw!FrA4x3s5s5W%1oOrS&VOwxb>i+7OASuCUgxb!1u|EJ<0auk74W z4mj&r(39tbSbXVvLQg}}tFyW}ER@$)BEs;5#{tj%eO^7Q_I8(+!?8?kaUz%XJ-xC2JfDp!!?d8xc63pZMwQNvr4du?;;J z^20!EC|cEb2^6Wjv>?k4(;Nmdi`u8W6ANE;@o!{i&Xfcc{IA}ap$x$GD@&bA1y&Q2 z%*35>4)+Bd7D9>JPrdsH4^G16?c3H<=6rFyErtv{s<%2N?cd!r?A}-Cw8|^$2e84P>*^X2Yu^2dQxVUc3ijBlFZD^jukFT z`F4+B;_EJBOU1#W{-tRIN^$p|Kc-xr8Bum&?-}@BdnI5hXlp^x%-HNig%lsl@}VXc ze$-j5b$zaL{iGKMbbu^FO>XbU&ho(B_EZxLL=Z@KQIx(q!0mHOy`m4il`&^Cm!!d* z=RJ19T%kwPSX8DKd13*FYWw=l6a1qiE5Ss|t%ku)J=HcDBS?H6&X`&!3+>g3m~Y6$ zD&)kUqJ>O&tqb(_sNzM6cB_kpYdWneO+&vxN=?Z5xcUyy*)cxZ#(hn8 zF@+R<<2PCBpYj^lKc=UHmXBN8#W~53Xmkq83&bpZCMzfP-feBy)H z;C?l)aud(E%9hXzX7y|jZDd_Su`pSPI&`*8vHga!lYo#=X}G}fj_Q$Tw+i{luLh4d zW{XkjG@JdIvN8bwR=7Gab68ubm+nq6*F|ca=aj9HX0^z@-C3=-M^-E1v=yBJeOi@Q z19F7JHhW0QcRUkWNu5(w5k5pa190{~b#6cM<=e-TwP-{6-4ne`NdjH%#cumEga) z0RGt8|4XHfOh-wdy}Kx#kcbGWtfVyXWq@cmnF7iGQLy4 ze-{6G7C3}2@f2Zo)D@~!0)mTv=To$-xUU}xJcaO+!Z~1Q0UrLsKQMxNMTFmv!K;#J z#iV~G!l<(`zud~Oww3WJafZgn=RhMP6JrO0R$(U(U+!<*k~`NkGcXLg3G`nA(qxGz zPa#?!M3UF1gw6xf#Gd;k8qd)jL7vfT`kgrFT--IiY<~9~co(}xPVfe2|dwNwuRE^gjuu>n=U06D9#N~U82IB6o>aP8B>c{L~A}BJ3x6_^-oE{FE zUpdE9uD5$&JkRPvtt`}+W-DMYB*Vahg7)${y!Y3P^v!!Q&jbl!PoQXJJW(Krt6JX& za|i6#Tx*ksOtAu*;SoIkgOyP*@|ZlU+rnpnPNF9hJ>v-O%xisWIy!LxnFEE{)EH$( z#V0DhKvP_ z!;4{1Bun8Yw(>AQhgY3a>KvL|G#(SE+`G~g3l8v&bEu|jz@wuikaGC&B`?zd`FRee z-Q4e?Nl>nI$^c{B@6VL_OIL$8{sGcsjJwBCM2&ZjU8J`4z6uP+9XH}!I6}Fn4}EYs zXcV~&fWKkBQKF>i>IM|9mf8jE;bIYw2U=zIzp%F0fFFwDBBLMcxg>f6@I&?L+U%Z- zAL<6+hvLUjz|j5MY5b*;|LaEhO`k z9$?fyIoI}I@JlB8KK(_QpNn` zrZ{+{8=vP6i&A4;&iTJm3c=}JPQG0Gmk~uv|J0y}EnMoy$j>EqfPQcVn-|CNTrQkF zDy_faUdD5t(|&saILJ3_375`AKRAb?ADl#**kDtCm-+x2_3Za;6QLCvX!oXFMiFcC zid2TZ@Qc&)Q~>GH_5NnO4oG=9r;NflTgTB}*Ful>91KC)0pP|u!-lki7!>^FQD97) z9HJq-9kAdx58$93?vTC)-+%Qdr+z%vLDLaJwjxh;e!`~F;lf-ORPpD}pBXB-kxC6Z zd?>CbdPc^s_~O=%@?{PNI=bc(R=PBzdm5iU%z-*i|GDUTA^^o47F9Ino76uHRuByt&z{(64*nb7cT zZ8si3UbgLmh>uR+ldsiO998GCZmcgmM$})lpKHGXT`fhoJ@q=aB#@_v?yt!EFi!mk zofp&7(~ZAA8aJKQuA^t9{usHp%FAnf_P`f<7k}F;=kcc+H&M`1oyK-M~ z-BhW+QCCpvPw_hyJVfp+bIjLY6YkCrx>IsO$z`8&U*i*m+UaX54L^Ez?eiNTQ-@y! z7D>Brm@-IH5ECA|j4KZt1S)(djhgwss>_Qu0aDberXY#A*(jmkn zSF85>&)&U$?J6TL1X98q5mAhan)#N1N{SNMVM=pN32VTI>%MAfMl`do?92DFP2xcX z4cS>)SDdUpZ(|$z&Xt&Uv(#Z=~n=FP(}iTDXEE>RUo?*u<$tlB~vs#7{6_0Uuxumn;suC9b||aNeX=*IgqW` zbxDZQeiK$`W$9M#BVs<5S9m;QS=??M#|_yey4x{c(b(A(5R~z1jJ?$A$T^?6Vmt6X z8CNuEsz>YVuZ=+_Gxr>s+$70_3>06kK}*#Apc$VzaOJ$8NE{!!&+siSwOTn+MD?335jRfv*~@f zwnE|C(I3-*qC+-lcYW?n+$jwhWay;X=Jio_zLVYl>-DiZw|B?eG3pFVOk-Ze!NE+l zaKV!dvzTR6dwYdvOTT2N7o; zCnBk85v#?P%*Ds6#tHmZfp~W~zv70$igSpoU^5=!$BT_N9d!o@EXtOUTF;tNfY(t4 z=-|6&$0LpN?Gfo4J-k_57liGOZ}rKJpw#oDnSr-f>kp(UUY&udR_{QqKU;9`SWaze zQklw8ugM=%XxvpBdVrSSflUqB1C@-$dI!nyOE=pAa!)lscB=q~tMRN!N{!28Q5S4g zXegfB!WgO1eBMy+JE5?~Lxc|?;Z&C%@z~hbq|oA_WM87oAK$6p6QX8ROtm+M6DX~A z?@d!t12~tx=7wBLSD0sI8} zt0ihC0EXFsHD)J2QY}uw!dIGcoJHFI{ED->k5aL9yaTQ|{)1^tXZgj)%H>G`qj!LahuDI>ikaA##u2Un&^+!4k!$syt ze*JVO?U2ft1~=X;EVO<^{0RzSgu1J#6(6)1CmczDOF8#u5gHSBb`Wx3_b|Qd zCB705Z23xlZMj;)F3)RbX^N23KNQ%s7`Oc_{)n8CQt6J*4i2B={wL+DK4IfxE7wHG=%ccq_LNV0NmhB( z0!oreMwh86-N>k@DN>JQ%I$em6w`~_VZx$r?1b0~qCubj%p2(xXFPrPiuaD6gp^cQ zfRG2QU~2}<@V$c18d15q_JqZVhf>udcziba$xh}wST|c|23%Wy#`#;#WuIOdxF?zkXq}M@luCH*0%om zc-lw^gc^X)Di_wLsuU%`&@P9@RL1E%A+Q8ey~Cj6odI?!?PLmG#3#~SkLqwoFmfJ@qNfEg*9sG4341Y{>EMgrtWm z6slG4R)a&{xZf|LJ3K(`)EpQm2Rw<|?mg}sA=FOyj*3s#M$_siJrGkUw_*NK&*fH9 z)?+YdOK^GpVLVzeT@Y|BCICnLdg`;ndpc>J2OqQte=&>y!XV2Cd;fr0$bAJjloQZs<+V9>FMn$rb+uh|J>FnZRV&s`4XAEZuTsj$@V$VO2uPna?p}r1wt?dSD43JytO3{VY{Bw;q zdmQ}yT8UGR0p;di`Gff`5qCtqbr!l)7!6xPD|(^zlu&d}*c&*#1Wj&37m!v~6R$sH zHYRBpd>Oo)cedN!t5NMg7=Yz%hA~<4v1wH_C>!ej*xGz-5;Uji&`c00S;il{V{5xS zr~~NuG94DfPzuFS)`<(e;cq|Nsl%t^c*-#FO0 z&2cHu_f;`GJ6{y61PtlUZ__T+ zQgu6MScDlcF7YotW78@fT=kZ%TrAFZlGnpA1{Y>UvkPU$%c2xinIL zwBw+8mQrGeV&e!!~(a%^3ovY=FoCLJsPO173vCSM#gcxt%uul3qNp`ScZ?zJhTA~ zprxvhFc^ua*hmu~99dn>yX<`ykl^3%4ACNYMVwq@_iDWlwW>er{)^ z;_I`q5(m@Is-G{JM>(PC!BUq3uMEppn2_*ire}>kp>BqBR>eel!_Xs}g@UoL%@>l# z6$#!yUxV&@MI~h~EXRQ5=7UdGya9u%`6>|x;#i$Uy0CfZnY*g<`gBTg`P-V*RF7Sz zn$y~>tz7{`#~PmlN1-8Bu6ltE!%&`DiGMxlM2Z%CO-Z3fe(<{l@a*<#s#aD56W>_?8uIdh zPhltp6{!toM*X_}qRY}Z1xl|u12;s#HRHpbga$R^+vxc)e0QJao5%+Pb$%2XX*AQ2 zac2VlX3`d@-2cVidqy?6wd=wb6w5+bAfg~m1q%vFl@20;bm>Jvr4yP|Ap}Ge1f&Q; z=!oboKFT2sgV{8eGB@AvXHK`)I`6GDWQOyX;Wv2mbIc-4fQ z1!A#G;zSy9EJQ@LB%fA$1@7T&1YXMcwu)|3N%Gd9aM1-4#-J>$9(PwiUZ8_+_~VS! zeSXdKr5`fGic5j0_2f5K4Ag)|s!d6~%Y+}`pNFQl-MqLdSST=*blqD|FU+)QnEQ{d z;bRI=$Lm+FsEr~qnm}FpvV((zurv9Ok#et;<>4}=b$~zy&baV!KyrwKlqLvpNW^NH zug0?Q*WhKWF9Q9HNQoACivUH#V&lu_<+n9r+m&QXZy&wP&LIFC&X?>bEn}n-cZZ5i zltLKJT;h<}6{MA50DyfSw7$$p+W!6xGzhq9rM)2Bd{p5-E1{%YGf`2(&;GN0{Zl!# z!ii%*>2UDm^=r7{rk<>3>%O^;D2F?@&MPQ83PrKM8`J?kfull@9Z9pMq%!_L{5BTu z(F&?AuY=}^@#2h}QddD)a86@ozr?trs*$?;m;Juj{!deV^Rwy8W-Y|W=SQfl?z0Xep!vofA7)1!Rq{Kf>vv#Ogl zGSVWjsx#bd7sVjE=6q%XdR-}dn%>?`;$<%g1&;Bp?qBHg8B-qY?w%~^T{e9o z_0;x&X^z`eqi(G(-{prEI>Yroh)unNtBNa6+1*VqOH+kF_Y!a=!Y0)ZX?&n6wC?v9 zzdU&SPc2Q6UmG$i4AYGl=|WVF=!FtJLGSKcQVf$2(r0nTSlD$^qTB{&*z9@XRe!#P zIoPLj3$1{xLBp_GCBG&peK?_uA*@1$A;fXQ^xK=qe(|n8q6!4z6f{OG!g#9a>&R?F zakN&JdL{Gb&Y{;PE4AAl9cSYUfQ7&n+@R~4n`nD$8z`9w>mynCU%O`MgcK5`o+!Cq z1HX@_FaMsB!}!86$XB2wX8k!lo@?;fUU5Tj*P8n51Q!^#)z3$z{~G#`>B|1b{>)fU z=TM%iqENATqXVtJIT>6plUUz^40vCr@vlwLf(ZA)!YpWCS9D~|_2qk;YD8WPN;KI| z%QBh5f6a%{Xn_{XHJ98=P`pQdX)BLTVkd!^kQ1R2w^FGXQOQ`GCX{p2j+q^)h z;9t5&X#bh%%z^Y<{Xmc~4z$%(?$8qygpTM!Z{Gb#_l72e1aidbOoP3O+^)pSP~!3? z=DQ_?uCME1N8BD-r)dS8_VK|Uw`@l zAoi9iO%L9#@m%~q^CM2_anh_y>DRF=@g)DD70Vw z#jp$TP9P@SqksCQ!vMV4r)~d>M_M}%^b{F&Vj{qA+t>cT`5<2KLG)TLPXT?&eg74w zUi|X=|EBzusfsO;sf%BAWxptb?hQdrUY1GZ*JuA9A{3mQiu(&qn#wj7daMBd(6(9h zd?ro8;^U3~`rM$GOfSR3W6Nz?Rl)2D3=x%1Wap}>weFYnnA5nu5v|3;RIC6-kQX+; zDc)6=W_Hq>?;wgn^x?3(UqPK;Mwm-<|E|!QaP537Z|s}YRF)3<0o&K-dUP}WeMhQ6 z>M9Er½j+~yJzEEv{Z=@DNdf_>&$X!$y4-8)bD}ZlcC+$6UCoLvDoy)Uc^k*jB z01g1R^e(7k=Uq~$EJvOIG0)|{;yLfhOZxdSKoXp$O@3?GaVzBtNH$WXysk7is?i3R zdZFIB19X~>H|&(BA%U-=b@GrFG=x~eLco+7J1=B(Qp^C8;r9*$ zEL|)EEUIN7(l$S*@zml)=dXIrPSbWc19LRDEY5irEl5#B06+=->XM7>eZ4GF%cUyxF z3VV;=o*&^o6CD+mkeA`F4;&3HLjuj&V#T|L?i{E+j2n_rT#8z;0er@Cq05W@IW2L` ztbn)gW^M%53-hXpHT%TOC;$w7oA2?}eAeH|zS|7ltg$4nsK+jf*ikG;92lsdBQA2| zg*-48JYY)J?r_)s&L&wKaP$C4=6UW%nL)K%w;C1@Wec?re`fH=a}so&h;Q@v=&38_ zQj!VnDWpiJ5wabhRCD|F=)aQZ#0(B(D3~#t$n&~rTP|dPUenCQj5g2^kaa&PWTCOT z>KA(Qim_@)4$84#0F1NF2$|Z!d4*C%hP(uzeotJDY-eM3XAn5xbMn7dN%dc= z1dwT4zMd9wJXIATdq3tgV7j(lX%|7uX%kaE#tu$UYJ(;11XW+yx=S7N+TD2(+YlJI z7CHOz6pf6WDg`qID2>X1L6Ykir#m=A_Whx>>mp@%$0kx5F>kLunVx3 zRQMcMT22u>rU`Q@wgbyPkV|Ccxwc@K0)~QjC#W zBP=xVD>~XSV5fl=N^pNx^DB_+Ah#?e;cz+Xj1`RoE;P*J1@GjvrbMOD6?kmdS^4~9 zcJpETDzIa08;QKZ8sG{UGyVQu?TN{GVOxmU#G;68QU*zm>kMZ&u$y7e9$a;d@e2g5 zWG~_gvuzh?q+9?$Py@&W?Xsv9*SG_Rjz6z-RSrK%LmQBbV~xSU;ONL{?hU1f0+q@eLwLHde7XPMNl zY6S|HeT=E>3Qj)*E-7g}8?Z6RD7&kW5xDBSu)FE&0aVZ7%ItG`JZeFsqJgD@^>WXUv{S{MicZWHY|Y`z~%hOEkMLZ0rTE11}ybmt!jTTCt0G@DsZ za^M24OGVl!mssXkD%7jiub!~0`f@bb-|$(#&t%WYv3ABYQoT7j7P6~w?m$z15Ygs^ zv9RxTK_?ik zPpxPXYY)y`e`pCFQa66k z(m;{g*XMKsm#U#8E*d9v@WxUIyG4&xfdwjAzgTDTn6l#~kEW1F;k^`B*x{@ycPsGy zG2jDL7j<)PlS+8^I&#CaxH2&N3RbbOh4C`fSyj!dTW>qtHlC=*U%3nz)vw)c+SK|W zh_W3P=ID3mczQhY$JFetsK+(s>>`ysF7lQsMmf_zHGOCVTi6Se6D zlv*1Dxr_#`7;d^Vggbt)!=kNC8aC)@-Mcn2@wxNf=LJNuTs~xFv??3StF`)8D*G{PEd*X{T6Jf4xN^kQGFU?s;d~BENUDpy zYys55iz|@qTRXJ&ASaylHuo0bE59!lkUhoVTu^3cwYNF6X-FXkmb)`7-LT(!{3&0% zB&KE}gkT58F0)HTrJ}nwB}~XwC?INsZeh{Y9q-pe-yV5)AqnWz}Ns);+P@*4yjxf|RO@e3j-?Iy7!}OGovi!8W! z%_q7*E6%nJ6O?)e9J9yU_R5NfSEKoh#hr3L`O%K&>jB+3Jt_b-VDCC2?eG>RfBW7w`h{%l}Gs`>ee=VqkU zv5N%-^d8Dna#wbPXdH?uhdTVuG_MFDC7an?Qvg^vS5p* zJO1a=fG9wt0%WMPqSLJI=p+6MpG-0{BbEls8o4*_j0H=f7vY({p|3088wkRRc<0<+95&nK~hJ zm0%_I4adplJ1ldOAZACc8T0BKO!XO`{JJzrihvtW>8?~H+b_(wkB9(AwkIr?83-qsu2x%t%yUq(+{f_a^QF4P!U4PXGJ6HzjH5ZZc^PlYXIo#Ui!rj{O9Ui71SF7|&scEd$PaZR6PUC`p{ z;4u?(zeT?Ff}<9BNeV+S(xmetYq4(#*dWnSAHl!$?%@K+OwCrL_EZjPMaz@lAHBO8 zXF0fgpqR6psZ3ZW#eL&m= zi;>}D1eY6%-)E>4WhE=}{QJ}kQ8nn{yqR1z_c_dYQ2o#OP8;LQZ(xLQFFctoQ;z+nXy0)jB5IKf=zz=wlduAI zU1?PoTs+ka(rj{j`^`Ou!>ZeE)aLlJ4b6SxRxP`X^Q- z`aCX?u<;pgX>(aMZ352)3n+a2kZ}CuiYurBC6+2IL#OA?;I1jSl&lQ}Hptp}mhC!c z1vcRjCl^THnF+cHyRvRTb(H07&w#u*CxE^TNGq&hxj{3HCk@qJ?S3Z$u4g)t6cPJNJSB&pH;Wy?%h~Vito6$x zxHE`Au6qHMAq^&S4dL9;8TQKPk9yw>iY6yLr@aQZkwuQucm6uhWh-ZgodGcMqQN1c;lf2 z!@EA*qFY6z>J!+79KsJ)8h&QFKD~bbg>)-mIr@a9O(pOg0R%Ju-)QV)5^8!|!92<0a zVbe%pLs^cbXo+4L%gX~Q)m6T{&6{{Zs!d$F>?#tC+swJ(s^r}jS`ClKN!Mff$nGg2 z>+?ce;(dsqC(``T-Q!)dHdNi#avOnV6aSwf3oyL_L!!4^!#8yg9RSdU#G>Twqdp8V zj$R7$y!whuoVlZUh%31{YVnng_nS0l6-%z*WayY54Sa~md+>&HhGyd7zc!_SP}Gst zVt50wX+KD>o92T*JrtfXnht$iUsm7=BWOw($6Lz2kgN*wV;iU{G-u>=xuqLu@X%Xy z+3J%~jHwdFRMtcw1j@lKQP)`LxrIgU!W~!{VkpOSAr#XblZkP}@%b;J`KEv{!19cH ziFu)N#ml^8#@VRCb8?Ui+4K(Mykq_)GQ+ydd;6+hT_tFmDV<0vEahf6`@LKUsys0t z7foU-IhH=)_WH1P28{d|vd6yc!37#RD^_ld4NG1*K^v?BMkWuH=e^UKS3bZ)u1p+! z?FXZWs>5R}{!L8Z|}%p7I|?FVZU(#E>O`^d|??iweO$OtVa50ByU z45v|ZOGPu({oGLhT%1(ho?5&>IK`{Dt$|^;lv_Jc==nL-G;?k0=U29K_?HscfUYrK z8{dFSXsEleY6&R}eKQBs{mr@CGXIis{@cy+R|Kh`!vz&kIZsQIT66`){Lx-o`T&NZ zDv++gAm}GJNIY-Aa8;?`uGydGAJB{530SY)^qA`8jEKDE_`(uVUmCW(y~eygF#O}4 zfy6{8KuG3kr8rROYM~Tjr6B>j_`=Tm`%J-L7krGcDH5ZQbl5`XP}cHwJeaa-7&O&( zcGSHhJz0}u$rc0{&9h4Y1JZbm&k(^+79n&tu|#ji0Sn*Oam2iISEpzx?*tGK+c-1s zfo-vjAp=pmuTxE-6A~U85Ct>^<ETerWXFCH+m13jJF@>;&}w-f9ce!4SgQ$V zohnGv0p{CMw$Ks4JGid+EoHXEXA)^=k^xemfG$S^Vi7Z<(jvSCSVjt_tzVy7`D-^$ zGLoOQ&`Kkc+}1E8-hU;^P$q!?>*sN^354^q%c6DU?kIz2ZT89h7J|L$2ErTcX$jETC z(>D;5vQNzUFQCiaVRoeY+Zp@G$U#y>g6*QK(h9etqrropXr&&>0l`qmvDfg^5dh}d z*znW~+fL201o&WPs^kx#|J_m!bkTub@jKQOS%%DGx`E^oIB@RN(yn)F?|a`Ln4g^=S*Q>hxo zZEra)(>+FXF88)rvamllt97g@SgRW@8?Gi9i5W_OU6_7rFY0gy01NqPp@CMHLD-lt zny_W=WG4VQC&~H_mIKy|DLZp3Y4+`-~lYk(6 z5Lx|3VwV!7?q!HV2g_oKatEmWS322`3^0|-DIMUfL;$h5N1RQ-JrLz`Y8jQqiw9-_ zqKbR2s8uDlPoLwN81(CmvQK#L5yevay2PRKt3&Z!!Ml)$CCOqms!j_8fmvKneUH~9 z@pu7K*_j|poe7q{&#sebqAV9frLT`dQf>@WGM!Tlb*r6B1S*#h(WbSg0_lK^RU(wI z;2{zNm)w{Qd-VCyY+sj3y(gbQSL(7wFj0ta2TzS|my};B51c>B@J620&N3LG1x7}0 zSC4I2_&9yDnIQ^tmRwm(4~SI23`ti)1V)>SWkNlT(0_$PI*#lUU-a;IQAV3^Hrte? zZS=Dhi_;<c5R-Dy=Q_+LBHo*VS~f~kT%cy;RMuoqZC zVIg$W{Bx2TM5EEu3$zgby!?Q^K&(AJ*8M|HH2di*X1SFGGEy1< zcQ;$!?t2bg*!#H|5|lzuNJ^wR+;6I(DKXL&z-zA_zo3&F#HRi6lJxZj#G^cLd{o7K z!%1r;A^C_}sh+||jy~@ny;$#U(ytg?YkPfuGT6Rum(}RLZJ|ouS9n(QXbOe8!J0kj zSYbLlJoLcG`mB`Gn`L!1cas65m^ycWn*Bf}wSLPyf8dzjQXM@b*PF|Fb~lL+$Fx&! zs2d`7Khu~hoToO89vTAq%SgZYf;TJ9H2`NZD7Lb4-w{)&UwYxkk00+o_B_gUcTyxg z3PRu40piF6_mAN*hYRW_VDMBKuinDt<&rMq4!c-kSn1wWb8zH5mK0%u{h00wKcYuf!ibp<9$@7`8HAmZmRGYRT;|vwl%9hsgW} z7%)DgF&cLB0e=t!x{uA~b){Ap@=&CYl(=OiB%E@KF^yJ1Xi_Jsz9Yv1JIn@_gq(Hc z`>4zp?>S#aRO$=#Fo1tP!{c5Msg+qP_3Z%iiB>7#JGlM#}e89Mk z7Xuqk-7?cZ9fFaiqL`dwq>Qy;hE=tjr)t|}n#Iah#*w zC1zBv)Mu9zbhJ9n%~iaw((vRpX3iB|^WGD>l!~D*%L;EXxKGD)y8s}FMRZ*psHj2$ zMbD1c^sv60dOt(G%s(73{QN?+v0@eA-lbgci#L3F_h4|RlHsk$)#mP@aXWzKd|&uV z3c2WTzvwj)q>SSN?S991Ymrkp|9S+@wa%+3LAT13^^E9~8jOK?0{y5Fg}tp4#RAZz z+Vb1^tS;u5DG4|gn%wPJcU;4OJezv}BTEOS5a+ughC>WSq+0(90FswG+5w_ z%FYxLvEN!vJesw%Sv=H~!yx!o7i1Ad!K+9>T+DWv7#$RO@VV7s5OK&_qJP`2C~!|A zk#eIO(mqCgOPcZa&~~hu#J=rfDJkZ%S6(W%NMWCJ9w@K%ib|z0w~I8_aze-Z#PUfs zA>O3r2|L6b!J{L&s@$&wEA*MpkIP@&@zhe)+Ex~08>9TLlZ6_YqI?DR=eM$5#13u2^M9c{Q z1cxXPGA$U5c}J<2F9$^5r6hUJywpgR=_qq~ORQ6TJ9HQPEF!Y%b%bEyd5`&PF`(%{ zFb+ex;?rqUc-|6#7vjlX`4%ASTaV@(4vc(qJgN@C)>65u7hDNk%6MW1IB|5NLl0It zOSno60`oK_20GK8rA2Aoj9l>AT94>zU9KhEe+CjX%M@f+Jk)K{VJNESLAvuKF^jYS zo4_ZO@IR=t@6jEp7xFkgcw!4hB&P_n=2W=5p1Q_v_2SH?ax6ffwzBc}v$u$Re7t6H z=UFZHLDZLq2}W5^LV$vdYS=VT>VqM<6sfs`9>>JoNFF!bRU_VR{u{cJB)U*$@1|RH zLz*$jAMaZ)o;p_6ENdP-NpyCd#*1_lz9Bfxfr|`Bw$_U2AcAKY2T|T>6RPho>~`&{ zkoWjbJ}L@of=_zdGLF=`Paum}5i|+Z^Ob@}v6kO_*Hug2#F+@~i`P(nkG4GM`}otO zCfGSNpaHTJ{{W-DOqks%z-T?*GzilzvSq-{K0|b1udNst`}|=8DY$8~WLZ9!p=D!yx7q63EA&Pk7m}^{AzuSAos-YQ0w!a=r?x1f+t| z+n|rjhYKQr(6>SFSy|gur_qMbv%^X^{w(G3Li=yuR+5_jq8%$Q?o5PUGS&3#5W=+H zV&SR`Rao(&Dj?#(-$I7Sfy7m*&TzlI=`H%~daK3NFNatTI-ERtL*bs{EgdHmW^59I z?0tCr-BY#vOX9q0mvz-hjk@Y;yXXwO*Px`wqptJ^UEd+AP0-GMA2cBq-#!&h@~;lz zRB>&PR1~KxSk0$)|JV&KFg@EA-p^*~8N_fT3Oeg0d%LB;q3;W@KT-iSdOIi9`*zb0 zrpHY1{)dl8N#R5Y1p_+u<^#%Hf$Jt_6F0|UO)HQ}QYVZw?tmDOz;-f>RNZ=U>?_KL zv1}l8qN~h4ntL^Ip!3kNvZZymbmxyzefVm*>R7TF3;*`>>?(7+-Us&0M5EjKuSXr4 zw)-6mhAjHbH+*J4!&Ph@HEufJ%;=eno{B1aKxz^*vgA9|fgj*-)%2`8x#6+KN#*0S zu^VPBsN#jy-YJp^B|{iH_iu9bVVHh^W|m~cvYn_^Q(h+4?m*;6Rs7>Tsv9D>0tRMZ zAE5K!f`AVJWRbNzbo|DLozkmuuJi4L5iyHt6+B#g&X?Nmk!i_w8JK&HPm)ggLcd=y zsV7GBcvYs$U0h7=!A=W|TJV3(4MZeAF8{o9=#^Wp@ea{?9{h))^W#4_S6uJrLkbkh zMfK*FGXj59wWsW*b>-3(z-}h~1libn^q5bk>;R2> zoNR>j;YmSYZ}|p+Nt!mF6_I}*XesHvvy~yJT5`nnj8U+~S!qS zPwJGB^hIxrZgeWHPXXorxTAW~dgl%m2w|3)^+qaR7nJUl_sL?kLFC?r;+Yxd{JJEQ zb+QaiP<52}^__?&=d}U+htfmlQa&+D1BI>XO?PS&b`gI5RI-=Nr$~IB=pKyy>@QEnhNWNLRztXrxKF75T{MG zI1)Cu_3=Pw5Si)Hr@}F1snYeCujd(M-J)gllp_-8q_WKiLA~lQQtqn(P_1uS)S`)> zU)$rG-I|TxQxv1I`412JPUTDuULM|acxsTgDVdlQ-p}q=5~FWn0i9lXpqVGcEt8J{ z`Ujs4jkGQ8(YK|<$DM01^z6Z%s7&5ffR(6`V8lUdhIos=wBIqMLgzcp*TV|9EDIhT zs?E`MWf|q>b#S2fPkuSH)nm6THi3v$0Yh(ElI)>DdPTtVyT(YFYLjjpfMJ>%wunIL zJ^AUbQIH|!TEu5p?MC{7=2u9oFZh{`XZ8pc+b=$%7``C#s>NWf9zD%H?iH!wRgU6P z7iLQhz4!1n)C2u9fNiESuuont4&QivsPU*SWDkmcf_ih+6>^LJE{igc>^BPZ* zPvqLrZ%ep*p6ZG*sCF6Sg7Z`vE?;$QtV5(YHh#|CViSY~C z|Ir0ZwLe-{hUKBvhtjlN}meD zB}Q&ZepKM3(0rAPO<{lq`*l^$&eMN*pJ2aTZ@2JZ%q4&6D?or$vzlPG)*(rI6C}Bb zSRGn%-T44vO0 zn10QH-**a507b$2#`owELH_514ZeL(6_@OzxR?F*9?!_5X(4A+wK?7}6umc@DLhMM zv;jlrK%k|5&2_Tjolql?g}7u3B$Rij=G0-?IupQzx9Z1?9vua!m%iK%#W92>qI9DsH$|J()^1w0 zIivzZ66rqOZ&x`v9m>dglx%dlVWnoi33Xx>b_?ce9pGA8vm;FC{d(O2yXsDm5#VJX zC29R&m%p3a3)~ivE${!#0;CJnWK(VzuFcLb5(R#mY#$@jOvEm9xjR!SAd|wAqJA|1 z$}Fb3qJN!n(}@2aiYw_1wr3}Su0EjCor?Tgdo5)f^<ksP)(03}OGC9*0ove=ZF7 z(+LAvgS6L7xQZNw8pS0bm(coQKg?#e0YB4*K>v^&8Z7CIZxeL33Ra#hjH$~!ED9tV zLIEaB6L?=t2q4f?6@gb9L)a6XM&2crEI5ZS;%unjI3m6V9!M>-t&v!Z> zjJHvPSCf)`{y4;eo%DWoNCk|piV9YxK#|b%*1JXzRAxER1f^1tbvOL8OnBbIyb7N*R**C;xQ9kX6=X#lB@yLlI688$<=UgcO3 zQslF&`r60>+K2M(#{cK77woOkm1W%XZvBfH%M8GT2EYb*$k$+gcV9QYu%U)TCV^zr z%Jh&dd>fX!)>+SdX#up&VPOuy5*tix=mVOgZJoBnY){c~1RHe7md3xe3y@L2Wgx-W zZwrE5H##T*$fl^T*3WBkxZ%AGjLee!W(x-bQocZT7JlH_g;foczwIUGWwe2;QRBrDHru%Doo=ar_2E9;@rb_*z;AT)5!Q?4iF36zC6hH=$|nLDj%=wPx$xan0^0A*fP_#_NHPezXH1DKRf%{8B9W@j$Ty%i?HG z)>Z0{i!3|$uK~u>_347AwGwT^KRo-N2M^qC^4{~^xSJ8<`4(EClX&>-2mg77MW(Wr7Vet1P-4lv2d)}Sx&`h!?ECG|D#BGTWs z5n);a%{Z#G^jN^C^n$Zc{ipGW`dQRhyqO*2YnZsrMm<}^jr?ZR+B3qk$ekh&NTT0- zsd?`DkB1cLqWE>ND;|>X-{VI~f6hypvY^jM6HZ*Tws=yY59qEZx=`2K@jl8v(eqn9 zltT6S6W*zTdrjw{9UD23v2%4|PR7`s&9IQ%a~m2xOWi>ryTPc+R55#p`&KWZ8UR44 zhizy>Zs3P8C}Vo;Y9`}c(PB5gscZU;E9g~XWWzu#^gz{(#RL8zE0ob0R2mIO;`J&` zF{IBgR7*pvGe&-JesvAoRgQi)hwW=ixCT#~BS8X9lVNiUgqla6FGwN`%C{r0*;?rO zDiK#F@+QEU4iK@^lY!AW_)ly+Eg9pY#B`0tnKz5k&8_QTtWkA%RU!v$563}?MWwFU|es^Y!HTHbx+N)z2z z;kfCzJvZhnzTm(X@*~g$=<*6WUa!zhIj&sPQsREbZniyt8eSrl(cQ?>=f^`yJK}d%R`5e!3lD@O7-=* z!FzB{S-*aL0}I#Sd>~8l_{2QnjFUgb$=ViNDbV|UngCTIX!QlPG{INw%K$}6SeXU) z`QaB&ccUS0>H=T1V1cH7(o;k+7(Ib68LD!yC{5b?y`uI?3h^!;1!$*ZOJnRBLrmKi zghxtmd8&x#W2fyrQ4{lQR{`buwn(XIq8b%mT{|2?p9YC_Y^;?RvV54)#=Z}>5Cm;J zrdu>&GlyX8M;J9nY5VML)`viVLCGZm-oz*2isgqI{JYWSX1>I2xTekghv}h_LF$gmm>hk1cLuNd+e=0*BX_dAO+Auwg+0;`WyN)E3Zr`~b2 z<$|c4JV=7%q;0NG(-AOcYbak|T*Oyn1^9Zlhsy$cwLo`^mAUNP+s~ zR*J#rZJ$i^A3s3xlBTD<*S@^j&3XO|Hi>$zhb_P~C8l9F{pOy9r&P&&wovtgWyH}9 zxTq(T>Z~qqrP5rWRp&JPvS&ZiXLR;w{4RqYfMH|s*Y{`l!=Hu}iM~n_7?R}IhdTxf zlny-JD;y|OPq@TetNB8kA>Nw5l8w~qd*ZFZg$Rx!EB-goweHNPtSYkg7j}vb_Y1i+ zwgAv~ODv9C;H`h|y2nu#G$^V51AM~q)7GE}i%Grb*tQqW1@m1Dl}WZ#4jgE(&k z-kC`#*~$ScmRk6*4EW=;1?cf^0<1`n=pxcJn-m2ww*$U}nJUF$RRQ-qe*PGiub-aT ze~C{=?!I_>Yc6@g!^HB$OYdG>kx(~{h9PGsmYT2FtDxtj7bdSgDHAXde$bi2-b9pS z^_F0HRf79Jcc7}U`k_%9l4&N|vfL=r2A9mk^b&`;$v&PcmN$`eQudae z8?M@-R0bbQXj*&4Ud%Q!!4Sr{x!kq9c?8KARNdC@8iwxA{J8ck_nqenmXN{l8S*%T zmtg0OO{{H>T0#uVoH7#?`M5YRE^Yc}1ghPLG+i4C;)dNzK+@W|eCSxp2jYa!#KS_* z6Cy#oN`YzzwWI`$rW0zZqXl0zez1EH?WukKv%_%=t#h zC{foz{mJy3mov%AcI6llYqyny`@yBL{A%yTvt>l{nV(|I)4n3+CfI>2^QPS_v>+XH z`dEK~xq1|*G(S$l>D9v`(HBouzsB-qn+{wlck5xk`SYAj9uBZBonP3ZOMj*&{X1Jr z!5Tc)c@Hb0pSe2z{!lGnz#muq_?(6N`Bna}2VkPf^|Xu+|2kC;faJ?*wY8J~j|HiJ z2CDx14gdSQZ}S6%5Mc@8uX7^7t8)UZ3n>munYyU|`N99Z9bO*=!qDxJsK2k}Pt2+n z{@1TMl3hHe&vxi6P}(D3E`au)gM|IogMdXir=Yy#6djF$;Ns9%nkHEf9Xq&r{VptYs=VvX9caT zK(HFw`rhO9I|mnhHIJ9I%kr<&UBM9=p;dU|=qH|>|MNHf^DaKeqT0aYb;9FZ-g)UW zzj**J#Jm`p`UHl5FHIE_f9D{5TRzp&xD2K|6;S)f-oFvNE&$D9$DyjPxBf5^+WIvC zjQ=SFOd0*yTZ2uY9-@k+3f5a#S8M^YDBB@VU3s_C= zx$o{45Hx;cA$Z(~M`o_)xwr1*WtfQa*~XaOD8KnIU3nHH`Nv~m{;|!n zZ(*7HMJn%aoDMr39!25CFi>RRGIb;a_xgSLf9I661RRjmfNLl1ZHVm8{lus%5F1k9 zrN&gb=M}Q2eLF~(FZ{wI>HgyB=%I`10QKzx7H~ zKNRSv@qCVFkp>X7MY^EYg}QRC-#I>wOsX-j+`bI{uy&7h_2<> zMX>1~x+m{##QoNF)+rctcFt3aw#y=NKQZXq@v5CNKYrrZl_;Km$WY;lDAK)X5hE3$ zxGQr$T15Gu>4g8|RYe>szfN;Yia^MQs{H!jf72EKq*SlP3Z|xk zhDK$f+FDwJ+IJ`7PT~6)CIU`9dcJxZ@-tn?|M9DG511r!y4VB1q*>KOaR2mia4c3+ zzwiBh+yDI!|4$3>&50G<9&XBEAKl;Dt(%$vsEQ zc%Jy3-vPclMvAMj^0&;5j?z4HGldw_eo;5*uLli!LUVTsz2f{^+xr#>@LCIPO7p+- z>Up?8$u*s+mhw{p>Th>`OgF6tC9ii&{!Z+D84BLk|9jQHu<#21?^XXyJpFGm_TQ&k z;rRhDaf}68lPzEnaNa3s;@8hhBT&!bjA9;36+1u^Z;`O%7P9&h1qXwm*E;j@=T%N5 z32$?5KVH;c$M4A`>%g)^e&Ox@71BS9fK~$8ss3H6wrUVfyqQXxI1gIBf<6o=p_%Hk z`zFA@;I6v*@sVu9taRc>YrtkkZQ$fD%~TiP{%=40XMWvFTHWj!u$Uac2u$;mijnZXIA(3aNtBAday44ay39KW1U9=RypEXHSzkU;ueQR4gj~^b7Nga;lO(Ih`+hmF1g+6L zbmu=A+68@(Rl>gkehg|pdS}Q}pZ1NZY51EG>TiAzn-*wgF1Q*fIt}P8N`2iGj!5u zTq1lOkIVJndgPsO#{!xPl~Lwu1pI3J{aW|0&^Z2c;h%t_bdKc) zs?UU7%=lrlntmA&(Z?mNV?-f?`r)kClF@1h+c2dj0_Qt^7?qf&p~oqIDJm~*-Eg1p zhT6=w8n`d=IcGyj0>CF_iT{r@d6-8@zpT|hcqByet!+<}*3Q+SeyA59{OYk(NH{9$IIK|l+?m#>F>4j~(l$--3ORV5Nhs)b zlV$8VO%V5tApbk8)7WM&xgd4TBNdJwVi|fABcH`oB_xxT2*1<73kcVK*EiujqhXq(wW1OD4+ZJM@hj;7a=pBHY}*?UDT9<#HF z51>^1as+C*vj2*%UA#=QtknT_H!fMnnuhfy-1^`cOJB5E)*Y`i(tgj)b8)vcX<9PK z$tTK0ytc^xnTyt&LYU{H<8~9YGp?0;j>x(qO}WY_%5p{397vA(+U(ey)O)AxOj}03 zH2gr+GQCF*qTu7jf&NyP9O+&A&Vm)5|2tiQo}N$2m63};)R^qrO>mgFV!{R8`18zO zD`cJc+{b^kHAy5-gYuw!2Taa=w}b*&O5SriwWdiUX+poljtRfqBe%N`d|l35oPTNu z?3BQc^m&7GZMZ8cvz#vaz`ViuM*V7kf!?Zt95!@P?6y?O^$ks!%kk3>h$F)yEJZw< zw5U>PKdIreFrd=gd&?+_Th=`h=r4_LkPI%I; z>*^>5!q#g%^)9o4umGcVXe4~_HpHyYCw;D(9>nt<#u0D+Xg z;v}i%H;s7BXJActDJ>Z5_TeAvo!J1o>hr8WMcg%kb`|AmXAn*BX|>zA7QORxlf4CP z26CBB4365qu8%%gJsErO%LTitDCl+`byJRwZEXXHb(Xgm?JU_U!#9Ai!L`7>W(+_- zZ3kR523Kv;&MKYB8kNzT1H;h%3E%-1Ip5nSF075iF<=qyWvLm{rRj=T2ZwR-Z zB*k{5*2Au4T2kO5ni>LBd^A@Bzdf{jP4#@%4?r`wxS%_iGrWRqN0Ifnxct`SYO7oW zM`|9&b@5Msi4tZ-MYMj9UVUR;uM7K~*HcdGCf{!BnN!u$sm>Mu~4b-vDE07H)ZkQ_4K);UR~49&P!} z8cs8mANKpz@(isQzs65@L0B%5!yV|z?+E1D&ieyRa51TMkMH6KiUkRF83DSqixGkP zkw6Paf4PG>{|sjKzvqF>_dx60hNST@6MyF1%9%~2<73%Z;GSTnFsU=7P-NbOa2 zKg*C6x>24}ic26a4j8s^`T1O8q{#L?no>%NNbu#;Cx%;e|@3+jowzUiNMEpfrC^3e@^~5;gs>xCXH9|;6;By39 zo4%O6&p~jKqS=3xpS+^4>WB3&s$Y!3;xTwG2W)9ci7E^vOB>G9tl8ctVu1A=ODoEI= z^IDvbkxHJt;xXR=fpg)F00qb86oeGuKyoZb1Q_l++^V4?0)q80N3iNdE zN3!zZo1~2HhhJp!4mL1#tJ|5$JZ81^;=wKJ#bXO(QCn?@dBCc~w(ICg-_;z8g^re8 zO2DZDfu}lYV|A)caYbx<;$^w*>RI2NmwEoxg+PJn4V$z=uDUNIERq#hA=uM-bT0ks zzVCE;mR|SOi^qtbxxoW;EFw`r;c*CHqT2_4dukzf33P8{6b(MIWDR}y1a%>ePTR+Q zz&sOEY$mCaZbBY;)%k<{lFQ_swaM(D%MTv^#RWhEK2Q_qCGih7HA;H~dbPFS+#lWSbIH?At8M_`MX1fC_Tz?J@d~vU8SGS{^(Ox zw+QTudhdxr^K6C~L5Kwm>$>kGfJ4!Ess2 zXC($My9U|z>Kfhfx(NF#zcOJnDYSZ?q;M2b_^_DYvh7WjfJt?`?B4bZ$C3KMlIzm@ z&)FNa1e@j+C~8nMQ(8~9oj~^E1=f76rgFOgW1x%n7)*}NLw0{zS0`Uve!&;!A^{^+ zLPZY*D*apZ;Cvz1#VqQ$=d7fvn)~_#wOvdrJMahWQHE$9?s)ORXsJB$!uWjAyU186 zWof_8+6||zvvqQRIR_y3!wmxarGC1>{0C-VBG@gczB1qS*3w88dHb9rK<-tt>#yhi zxg7va{&iGzX?kEmS10SK8z8N#Pl22B0bmvrjNOn@;;mXLC7zg`0p{L2OA;#YdVB4G zf{ss4d$$>?j~=A8NR}$wUemo@bn}SZ8ks{q780_c2gS@^F}JK$!McBW-i=nZ$9S z=Dqqa6Lbe!Mfh7IQ0{b~`%JqkC_DNw?023j4;9fhA9o~0_|sem1@aZG4ZaBrJLGL- ze4dy4v7(8N_p(3JQK1hmn~Md`thwX7#KVf>SXJ$&eu<=B!lJS-^U3;M7+N z`UNzsEs%mmu_)E53W4;OLfW;iTnJFBrFe8pl*6$yy?xu0->ZoHstJPDK|PFJ-p{Sa zs-4`we~`!XSfCxAN_=}*C-|T|+sOgoy{mP+hUq@rwt(7Pg@W{XhZr!cw0$7qIUlur zE54ezJaU;?(B?N0DS@4|Pl1{OZ3sdbf5Dy}=mdFY8P1(jbr7B`t%NrEn4NoWZSea& znFX#Kz`4!SX#9TX+sX!r7ObNDjvy=@lj9zm zi(J8}2PzEIJIn0{bn^gSwb~85|34T)d=QX(H;O!i!h;Lj*qOK=%dTp#)KA{joGcZU zw=X&U+r5K74m*Q8bq*i)zpBi}qBQnOKWiweQurvXa*boJsqwr0TObvEVgsP+znu!4 z1|#JVgeA1=xK7*GewK(K)d6PzQzE{6I>$zNhRd~a)ML+oSJDZ5+BVPsuvi>6Qwkcm zS-KIH&-5Qr`XdjWPL1v4c%GkEsZ(P|uwLD!bK9NY4J^+-j9dq57GjuqPOrF#M7jqy zv#zU-Qo_5BOn%?4KA+`OXWJ!!rfg`Y{@az&91lNQ@Wmtmy4qZ{(t7A=FA=}x-=2J? z>>dvMG~h5)92(O+dus~-kWL#-@K574-AVyq| z96pNh$7!FIiy$3N^ec!a}O2Y6jtZIO48j0nq{bn{rD#zaH?I!%{2q2Fy+0Z@%G zr}hid_m7I@PjI7-Fms#ob%4w3*$m6KG`cxzG9&r+5bn5UyxBpz#D9yHpuclg9kBR2 z3LckVRG0iBe3uPfE$o}*_}f(vXVkO9A^Da*4*&;1pF8+w6UP-P;z%HQdrZFQXrnOj z(aP}mubM%*sMINN(NDr4q4&h~NiaZn$`*jD38qFg;spQsnP~%IhBA(0e`4NpNB)g@ zdkl}O$iD}OuYO5X=;pgtqS~wUONM$xe;daEK0IEaCLuEgYS~q{Dr7xX-$z~@Xz&QI zxYw4Ew#@&fYWc5+@;^UDPAQtxSrOR5OUi7rCT_^mAL zCP+46k~qCm{9|L?e<_#`;*vhCjl8H47Rm5fU9D>(DK=fvVj z-2~h7zyI7U$4_U;2s0u6oJ+Iv{(CMh>@i)jb8V%xQv8~92E2Krg8m^=62=YrpTEBU zRWozX^UrA#AZ*M_Cj!Z3tFF+%Na30Q}{EbxrQi))H3HCOfPS|&CIvNPQQg}k90ic`4NA+W| z$|tY5Q@aaC3-l5EK*Bq|vXTn!_ga_+FlryVZczQ^+;!u-eVchIiz^eR!NR_WZXZzQ zCyM!lE?;FWq}J{AjiJy%M^c zVIyTwK%5u@dQ{f4Z594QrhT)Q5Rm5LHy0#^Y_>;k=;nIbUA&!9^5%l*kdR#3@j0gD zq$>*8d8)(CfyY)@cp(9VaDLOu&yDZ!4~|=Huw?JguMGbq50O{c}gr~lA9dpQnc z4p-Y4srJAWUyInA8`Fan^*$njxk7o@x4Ey;imLIvc5oC!PCr1-$6dO2LJh3P&3t~z z;Qpb(2s+=xCE>OBFv~MK;6OtvIWZ>SeV^0j>p`m4DuwN$Mp?4VD{aeYUI=)L{Sf|g zxGPyS9&E^Tz}aE9bOq?^ET0t_)~Pmatu3kJn7Y6CoUES+bHKt}>~AOAkez};y=io8 zCUWS!HOh;XST6>C0F@LK>TZR|fQvR@hOz#Yv9~se!M4|U%;s?L_^gcU6j-U$HDU$U zCZ~y@!9KXK)IBRiobbq_lSiRfHx~MNK0pmmvER972QvU_{7&Jw!b zr!DPE8evMgN3%cjVS|`dSQ67~35h<(kcBQ#Y3Z+W7>qj)R3-@adiSU%S5&A5DUpql zPyZXb!=Tn+^?<0$uM}*BdaQLru#^Z`Tk!_O)+m}_5iM-=X)nop<4qzilMm}X7db&A z=A}B@RQE?JryIPKtvf`{%A`Q-WNHjTrq#icuG_A)lTAwJr~8XXnPx!)Za?0-7Tc6M zoK0u%0Yk&t4EACjF-R0L=T#m%J<8$*Xk?W1}R1DcG0r77xk_!;`+0)@Hx7$u^A_ntH zaBfu(ZwPVQEBj4-(RgxaIVN>hmhK^wD173*X7Epn)p{=tWEN z=XN?xgZL3@Z*%D`PWdxY_zc*X0AAs}5@Qn?`OtbX(Nogw$-Ew}9-&+o0Y-Xyd0 zSE@xxKKU#|7wRD$Y{rlt_D-Jj5SV8`tAn=bb()(Y_f!o=|bvL7_Xu3t6=f+?c& zRmb5IFT`?5eN;VATK9Dmd?iz^G$`){{*_;qF%V#&0+n88RFIJ&HG}<15skXX=u;Vgip&aP2 zT5ZljtZSVb#CuM!v$$v~Z*f*h+7hNwVDy^anIwSSFTLTIboX{!sT4F!><;MDWkaws zF;WK3zB5(g8u!*(Z05hRQXeP`?JZND&2p=H3xZXsT(FKGn zC31l~x$X-OD6Z{8b!zBG1yosqGIG-|tv3W&8I!MnTo!oHeq5<6VYnXaraL&6sG7jb z4W<>ZRRBFEScadWTOvJ&0&9r{vzx>vU*iBWPJHg+r@eut49lM&RkXlQO=_bno*_mH zrbOT0oS8(Ecj3F&9^vod>mRKr-aIuFrk|r%qYcAAB@Bv9<QHGSr4C$R68ZPP_d> zianSx(s)OhSP7LS`iS90iqY0<;#+{0$=03NAm?Qxx3-Ki>(*C#L*o^^{T0#U zue;^JEHpLvSbKi&lrX^MVr5bPi)sY&rhl@K+@_#Jwl^T;s?@h71QeF16 zTLQ=}gWWg0b4gb#)2lu4g^BCsqy)%BVHSz~wc7*GMS{9mi&SUrO21jWJ96I{_l9dTS zH(`%mLFOleYGH@nqK zdz`a@?+&)(U`}iTG!4B+uF)EE(A{zwYf_XUFME&|Sh3p=Tey5qM)?5w%7Frrkndrq?<)MiUaU?!6v{`K*ju7jNrtlaeK3#9i2- zMF9Ent$1MInNx^yeqafp8lV6r-o|jN89LB;t_+vy&UPjPJc{$$h*@xKVqKb_hWCnU zJQ!$jQ?{^qG?-Pk-K{nB1}{~c!MGlQA22`iI`$cMibPgl(w|cW-J#BR0+#qd%3j)A zqzUe}9$GGTlBy8CI~b98Kb%=P_I`M_`^+nEI2&LfBAE94f@f@Qkj%WlwR+!~m(I4l zi%*D4MZGb4g?nudA;uY5+CXer8>QW1=)!9ncXU7t=T#j4gHOgz6ZIMa+g{=RHQ$e+ zUT@B1(W1r29>$+gnZZ>Jl>VZG?oB4h(UTpE9=VFB>RT)E7@V*?9xxH`jUe)R;#gAXhu5=E1vYH`aUI#kT+@vKL`c z0#N}HzGof=53CyOL-vb61*CgM0?!)*QPmy zmcU?g;7vGw95sw5r95n2n`s}xUNy@{rz6Lzzs=3c&~7F#V4`f~p9Bq%);a~(O;hj8 zP^If{)HFWnS_Jcc6>s0{xeG6yve6Q3V-qEdyi*X^L_><}=Q;n!Ui)N`#iU-Sj2DsJ zcOCh%I42qw?rA!|UDN#2-DA&Xn2Z2!<>ek!9#5azwC!DtZT{iud!_k#J;%W+!7E`P z!MXr>eud%P(r8YFR$)j!>~{B8^`hVb3UDOZ56fxU*34tz)7(eB2}Fwofp}s3d!AaO zth+Z^mit``sG|*vjd4C{nL(}0&-T_jT(ZF)zgTvyMGFthhYl_YM?;fB5&IXu*@(V6 z_QUWnLxVVc)6yxHG_u_Y8f+y$CTqx*<F+WOc1u-^jj3| z?Wv2PXVYb7$9z~dXLvkVnilp|@aD&xbT=0biD6NMTIL?qVtcpPGIF=qE$@&qou$3& zjq8XMb+JLJj0IkE?@M%UxUyoWvbjEi36L!3O)n+Tgy7RL~TCX99iv-3?$qka3&7VDSN*FkP`bTWH1Ba75ZJ3POb=bz-oVu(zqPOROvfLv9a0RT6$w zUKBIMPYR{rDfA=(eqbw~!kZH^8Xwa?%nYPX>AclHK0(+14ct?xUv4&$C ztyFaCnosADJ5D~Q z=co>Rgg5NfUIgjryNr38EIsduScb;~Hi2P*qS-5{l0J?uEuZScS7i55M<+ELt89_% zQtb^-&*b0o%O_uZ4>g8QRjzqtPtAd9m(k6)goJiVVxHc1lEkQ_zlOl1uYPZmG~Wnt8ZK?3v-T?_ z+s`a=`D}>KmFea-$##{Tg$AtiSD>{SJ`wdLhh)6_+_VdGFIwv2p3>$44%~0`c(&O9 zH+^*s^s;C<2tV3&Eo;d6R~=7arL4Jxd0t7K31*o3fWDNXL)cP7ojS5;l=J)~`> z=j5a8snsI2d3q+Io)lv?-(N>NSW_i@B;~dB_UN~sV05%av-Hr-Q6kfcS>`^ontM_;t35iVS)BH)kE;W~vFgLS>^50yv2^z^wa;uH?NUc0k zuYaCi43Q(F>sbU}ox#W?SBcEI*GVK;T>i49x925R1jrJQjw`tIP3WWjCV>BVUainv z0lS}0F;Ymj{G#$otM=|majPOY*Cn4~)2zX=nho^Gdq0 zYL<=@PNKQ`H2DEby}4oq^G_f|8Y+|gToU{A2%^d_Pd|Lf)v3K(w!ly7&@czwl!rr; ze)q8=#}umL;n?o{l+nUm7Fl-VgY@jq`R!1yesR)n$4r9RCF5T43Q+C67cyUaPs0IU zaO$&Zvif#5_pAq;CBwAoaSpoPwK&h50V!A*xTdWO@|<(X;v$Pj#B6zIy0r*)@+)W= zmbm0+ewmq{7@;B^U{|s4A=JQnD`OUu;UEv1o*LZPL)D|}?Rte~4hrz_q2Y^4v`hl4 z7da;1Z#E($X>{h|fADa!IQF^eG#cw&bTF@V)zW<7vNk}!lg82QZS1CBLU^njZd~~O zSh6#U@PvhPxAWn0_wu>Lw1_7=wl5^%P5xXhC8Gv&Imcb1>J>t-EI4%Yz3237Vsw`jNXSKQ*h35 zktLX^K}@iLmyZj_JW8K;=vC`z4S;b_kA8MB;(wFsmK`5D*O`j@yC{G1cmgA@?r8VfCy(xZUt1(cO(CF26f&;!UnKWW z&&}{Pptd@R&Aa*|^&(PT_-W_n3)3HXGio-H=iHVQURuh6ToL*OmSv6Xd+rS#> zm(rqO~a>*)CsFcxHu zp9U1bTaNftx5E~eUz&KObaedn9k%A$i&NE)b{#JF-&QrU{RFwFcNeW5WlZ%Zo=-3C zXY1?aS6@P%qWEiQ1Rb8%8CMmowS2l~!>^orRf`>=Qx`*-i@i!(Y(Ls1;UMci)6Gp- z9HL>)P7~X`3?x#uWSl1xDU`i+>(g&l@R}+Rz21i(2N#vdXB zxGxEaf6Ko)Wes>@i-!)w2c3v36MP*0w_9w2foF{P2qSNH9P9Td670Tq+A?AQTQIMd z%x(jkSNaP8;92QX3o$$t1+~;3$^99$yiHsW(+Kl%iR~qV=+Dg@K-d%*2q?SZ9W-!J zF9!qoTAN_|!3*-JY_7$1E}@? zeC2crr&oq+G%@ZHjSi*+VsQTr>ylHujm*O+WAT9xhQTC)V|-^jk8P2~5||*hYjp&i zx}bjI>eE6CH9F5K$6oal=lN}eUL$x0Y9M`}SN1(i-_R-EznG5w3+hr;*yk}*&p^PR zrVSRgxKTd%>O(C+;&%9tZ05?ktxp;9i=dSi2jt`zpUCIQ$uE)!i>j32hA_G@&Z5c% znLpBuMJ5&~?<$dnk~Slc;F2qTf+herh;adWIW2Xd!xN`TCSAOyjNBt)p$W^kEWiJX zenUp!Y>)a7&#kOZke@dDEcR#?JVZK%H!cNrwS5`}Gf9yM$EeW|OGUk)?rX}ay&hkv z5jIJjRWv|QHRvc}%1sMOK5f6Fp0*YU=9}%P*Vr9J`ti%@$%|N8Cc#aUJX+Ow{_6sr z9x8k?bGP)S;bInx60<^wtj-0T9DZkH2>AW&MzdeS0?rGWcj_mlN#UhNE@ZqaW2p9D z3AGRt;V9BDD;}(pJ`G%>I&sgS4v+|#{ z$I9Lj5<5^hVXt}ROZ|qODW9g<+IZJwU*Yb3c=U%xOTeuY}9`z+mA>JwC2ym0(pOG9ss(qV#p`bBFFieoGy8Rn_Uq8r}uiiT(>+k$vl*w&9QHDYLLlHU1M6*kg$iZu#>*CIoxn)l(iF~UilrrjwL zPVwIpInXh!uM$!5leOa^;KP2N3x?NyL!#i3V^6^}A5H>UXz z*SjmS9?Q#}F3Wh4v2m&E@Z(IrMqV>xNET{WuSX-urIacKsuqP28JzKN&}JEIvTd2Vd^DSCuh-4B=A zM!`+5Iz35AgA;L@>m&mnQZl|;ONOjaoz(1ix;>7K7}~tTH1hV)Wgxiu zHrb{AV}Yjh%DND4aL6X(yAyC>+1PMQN81!x6pl(cExfsBtfnMiHnWf-leo3*|89~ap2ad zLvdV!`Nd1dXQbaX6r5ybVd0CE@o(O#O<$<5)Ow&UU1s8ZwbI$4`awa)hZ@6>9N_E3dGt$u3>`ye4ZgI?bjei zu%)Qestxu7zth-uc7>Sf1Lr^3`A$;SWTc=GDZz)Cuk|hFtuxvFu`-ttVfFkZ){iW$ ztGAZlCSyc{xeH#omO{%j=4mK_P;-Y@)!~eLfw_>Mz8npv{7Gq3T* z%}>en*V35Lp_@1=73yGmI%q(GpbmvlL5S#75-Z1@E3r+hMY$`D z`x3Lv4rAaQ<77lmH(0cMiE7#Nmff^LvrlB(5Axn3wUll0mNnDoqTg|=Q9ZP2{<+rO z*I?AIj(@NlK>E?vIwWh*Cf{uvx&svAi~?6Veae!yp?eB6I?qY`B$f(3W$C_<7>4~* z+$j9}%(1+*r&sz>la1lh*rLR3x7Rc+^e~%utTH=3Rkl!62^!pp5LhhGa%EA~H5+x{LZLs6=iLnEAhy=-~1v2EtUvby&;(_S|g%K9UK!;jc@ z>p-~I=~OV&X{ea{D#4#|s5V!F`5P1;xna~g%pOEtf@gk;VwFyMtVdIY8B3>}x^dL# zsa)S<-zqOH0@Xo)Pk>iy^-onmYk;m#>ge0_HtL$tQ@F82-qHkP#wU%6ADR@PO`oit zC!Qp+`J?4V$~+QmU3)RvgB7AD(1$3p;OH#sqv zis8-Xtdc2gi(rcdie9xOTATY=Hz%}j>`| ziQW_S=1-0m5sWs8ohZB|TKrB;;CN4s)?2vxclWIZGtPJf0Z)xYv4!NXxuJ`N}6E->?6}W7p2QOT*A!r?!bx ziz~UR6+JK@(stSY>D;RhNi{WH*!J$3_pF8bPq z4XZ;^o4iZwn|n2ehnmpM@4lB!n)h&8qF2n2oL=s0^3bZK3b0@2J|-Y;#Q3VJzzfJ4 zLW%Xp1t5WMQF`+ha0sBjJVIC64=M=aJj)opyI*p8RTbzVKYSms6V}-B&w&|6qTdQ6 zz1B|`Fec^0KH4?Fj9HP*!|RE_xdxa$JU*(p*k z@*h-tN9{89Hc*-SPU0OF44+fC2-v}2IDBwrr6JhwhneoDY`C zX-OuY-{@0$53Fjmu^-yi*ht)Qnw5AH{_-aJM}ofgFcj5a-aIEX!0B}joz*|Q>}6jJ zdWR+4TV#i`grz}7WGAkKw^skvil>{>#hYu2D&u(52_Ps&w7CI{$>Hckacw8bJ~fowft=Hw=S^nlBDdo3r{?kOp$`T5nS+#D1Yz2c3Y@KKH1#`alvSmWyH z^j-CXBf^TH} z&86s?$&j{$FFF=P+RyZY**vQFJvDPWeC4`B5xmG~$rvxvPaZAI$*(i`0++bi|AcPZ z?uJ%yDp2954)PtX@v}V+p?Z`KlQCbZThi1`+^`%;kBdXl!}&!1$URgZ5^{GNL=F9C z{L;I%bxM3Hin=tUPqd>QCv@fgNu47@gw+*3;Nmv-g5p+ow@-YsXMs5vb(l4;c*Bh-kO!^B|@?;w*9!QRHTY8D=V8#J$sdHv^ANWU*x~l+XhHUxG;937!|$& z?9&#nauQK?nkYMDh!q%B#y8V;?jjg>uWBU<0{o~4Zb{}n@qK_Sg&dvK@dvrH0uFGu zOB02GhID=QgJUjp-As6niu{Bop?07}v)<`Z>(M5-Br!0j6A2mI8Eb+)Z$tH9*O~02 zjL}!)YJXZrGka=N+<*M|Ox(=={13XWD% zch#i&WUR4G3BO8l@va)q)Ckef?+-!f-q>9jhmJP*7V_U>gx1s@eT@@izKt4x_%p&~ z?2Fz-eN3a2V+dbm9@i&lGocDn4N*7G47F*rzIt*x@Ib$A8GbZ?y1(|P3XU9LO z!4F$}^7JUmz?xAxC%Euvb(~x2+ojUbFKyOUvU}=G6=`3`ya(CZr7wRH?!l=`1_Dx) zWHGV}a$0}P?w(#F-dM!NURt+0)LA!@jz!FP(5jKj`6D}oO!MTGuwFaLyK(%4roHko z`|~hc(IW^(jmA9f@ZiSCOA^Y+^AfA-P?lr$aFHY96;N@6(K;)iND)R2-cV+PHs?!e z?hjcfOnCN$yqX9eaOy%8RMC`xOF<>Q`3E1`LwM8z_6G5&ahNQf^Ai1ojoo5&Bsp8Q zy7$=zU{5i{D?(AbuwQG1F3RfamA*>mf^!ce8Fu-O`_V7TN+;L}Kl!$|y9d`kV_Bf; zBTmL3bjL#Osu`ZzG!$uQbl&yb-h18}F_(?b45$%x$wgaS$Ly9&4ZsL(@+-2utHhm9 zpdB(5y2ig4pcxzXwWN{6i!iCFCcM82t0tJ?cU!0?46yM`UJY_Te-_l$_c_$Gg}4w> zi)7Vltbs&9SWROd(8w{CHI($+D&01p;A-Bh9yo!8*7RG$ z?mVB(^R?p;{;5`>G{Mr!H!#A(O+j{fZMw8{pX}f1mAvepo6Y93*?kZgrX#8iA0B7X zB$koieY)w5zuMfb^hp?r0X+AuuNlST5e&giE}qNGkA{|D?F}sivpixN^*hDH4d@Rv z(Wdflq7Op9e$$6z%%TGmc2ZQ9RoR102mkRgC@BV!ioVp9<<lV!(DWf$0y^ z)MM`+#DYZ(L%0!VtKocP$lBu*Ge#StnoDLbE0LC8e)eRx1mNi#nKqzY6FWUh&0~s< zO#b2Ac|$fcAgvU*hL_l-rLtBhc)`T_BJ)hpwm08v9H|2o2hT=B1~oZ;?iFw*^Y*ERn7v79%p zcC;kw-U9sr4EF!=lS>p_#%IVSYKq9h?>xevKOUj5YX0AU`hRD3e}C)$_l5s|Zf2Zo zK?4uI@L&Epae?z682RxKzNqITKfeAS@Xu#FqMf$z20X+co2qV0{pC^*?6wXaxn%H+ zvudpBo8rlu2RHumr@!?gB?Q1jSn%r1ZM5dV|G^!cb_J^xxS5#eoaUD;&ivh?4}`Y? z&+4wg87bTnZ4hl7&6v{zNw4n=`6oW-s1j#;O8doiE!lP3SDl#H zYUDy_?ml9_y~d}*XUw&Z{_?uiq22YMcKi3=aUMT}((wv8XArRrYJt4VM|fYTsr{+& z^Sdwb_?16xhE7N6xOT?USMPuFNq)_eJ7N`jSy&l)BeYX?*XlRPME<I(oun>n+~f49iLzo`G!vvD2<6@}7= zdykI)R@nI0kE2kaS>l07e*fFv2V6kz2xV;g?DdD!|LDejD1}F{xY9qdoxtN1=8i*5 zfn5L1*BkS2tQ&0@3N!Gs#%fJ4| zf&9!RIgr&KF+CFY-;0F<-FO`U;z;^5N-+PEWa;iRP{|&zJ$~}HLki_Jxr02%YsJq) zK|?X|T|VXbywq{+8L zVVf%g0veAWKc4>e<8mLlo&~t89q#YH>t|1MQA}uB;l`U~rl%_-c~|PKRD4&q;WqHO z?aDTcIZTBaU?589e02jz3pNsfY>h%C*`5eDsd4JavuQ0o5a#o5-%el=U~}lMzX+XX z2+VY$iyj`naPfw#c0^>YZEu!Nt*Zs4y|QW<>h}x);J$r5ga1ZuQECq<;Rzk3BmZ_B zII2Kt{?xun35k^hy>u`Hy`S~|{Y*bv#)nz;ZV_s8v~cDlV1Nb$w?;s7{`48k$EOc` zI{)(Ka^^Ju(Zl-qpFONW!`p&~M|h)>;1eTbYfKksIjiitZPvC@2IiPoT6k(`9f5l~2N%v*Z_Va==)1qUtG! zR$^|pbit&?Ii9kbFP&BrPGRK^qeI7k3Z+#8;x81egr2W4dI_@cubCw3#ET)|<_c*e z3H4fle;^0&`?-?_>t{zRvII^9w>V5fGYp&()0 z-9y%n39G+2guD#cKx*n;=`UTq$`RKjKDoSTOoawQ#t9wuo^Jua#EYi{$ooxv_j~KZ@68T`0fPr z$4AF-FhWDXt`nkR^^3Lym^@6}>9^@P-vt);NUHuj+mG=M;(d>H7P0$LKmxwwvkG>& zaQncW+W&A0ffW?uS|jg|=-hs~bJ^@tPvUlntqE5I1vN=n@7JC0ZmQ`Qn+u?PaMACt zD+4=xmn;^=*b6wG5{|rdN&(m?Bw2W{1 z^+@}uq)%enBV`5OZUflv69(R)U#@@>dxo?`{wl$fvip{XADtxH1~b6y7(fC9vFd4; z3ibB|OByz^io~YUntw?dH9H4?{`^_lQ@wI$t)qlTd0ZdRXjtQXx&{qYaidl0r%BQV zvRBpPXYuf@-m0R&wYmM(H$~V|c?t_LaFxPyO$M)+_yoZuv-(q4mHlAcJ{kRbZNf*k zc5^+gR}3w)9yf5aEm_PdtjMJKh< zf3Jj*-P_$BD`>t){7DNCT#?fiZV)Sbonljo#M?hSwp}|7w>K)#!cIiTh^)_>-&E4Lr9Z!M56v5aKa4J%*KMSJ2}QYEn)YgIRZ?lJ(!>;OXz)dpLC|+>1 zxgxl{3>2UI=d&E>zrGg%?kw04_V7_A&Uc)Ih*YVW2r2wqxxo|{u%)#C9~0=CYIm64 zazpdB8PVv-t`9KuWhzS5ExaA$=H_k{+M9}$zBGX{4~3u_SFFpG2wJYUJYIee2t`RCph-|60~ zJ7SpjL1twwHMImN^~9XLL!{I6vG+5tR~bx~5`UWvv;kCx(ATA=kB$V<=%7=@A$vrf z*;nYv<7OqbrfGg_H|s1vOq9dOry{$&pAuVcT2j&t;_z(a4G)qPh2;8cn;)qWd~rfT z3{9+8EoJuxNOQd}TRv^i)kFht`oMe(y>Ioy2Mew2;Uw(slC6Ki=>3X_HBn{&kMIS< z&>S}ckdVKk-`_d4{Z)}(ITGMM9l*v|XQD9s*kJ+B75|qzQzLmZy=`f6j69C)w#>J` zpQ=M(=_onxOi!j_@hruia+Ne*qOfB{z9F2{6_pYY=&DM+_`6k+95`7Ij&p{TuhfMO zW{|6%dcKEKDrf-g@-ec-QkN0AuN=Aa#L=;+Qq;npjt_2EAdAvs&Ngo(`D{1uH_SJU z;{Ek0dw_A#nyG>@AQi|4C?K62ck7ogUq*wea-!<+y&Uk}-m>`gSzUgSl3#;?|F^E1 z@f9C_O%|8By7X~hCHVG29(N3g___>{UKE0Ok$ecc>~T%Rk3BNA8rgf5A_hdEYXR`x zD1erGy7BRMi_erskoQxWLg}pZ#kl%FqIS$S5tU3~=>d0IZiAj2mv)trGzRNfnCA`G zg`aevda6HiCVQoCTgMla304%fqUrhGXKj@%ogz~n1j_~<-@@a%U9H>-rX;uQ%O3RxLUwbSEeSaR^xDi#LN~HTWpsb*6TTD43<( z8If1Yv^q5sB~`Yqv->+lZlls)sM74pOJ3f`5PT2wIbG=4fcY^dfUMXtv?h{GYW8-w zi;Y&oONQp|htbAeRmKFT-D9^`=3H|0-wzcGz>4u#kI}PlU_?5`RO7B$d>Tm2(ZV|* zZAfh#OdYiQyXin;gSP`#M)jLbg>xrC9xGF9SyP;#(o-4U+jiUN9T4xSosVy{dOHp@h~UXlHL7brn5DdJDS(xTyF`ReSwfB zvLdqAJolc9SefrK;!QXKB{zE@-NE(FgN=jl3n8#0h8}FJASiSz_i%FRpU&igmY43W zH5vdpalfVXUG2X1lQQexhTIgj1QCVprNKo5i+k65KyvNjLjmaQqZmm?pKAP2SU&GV za2SD?xSoFR4u97DseXO@pk~S4j-eEeO(>ggJ$uo7=MA;gkd2~s&P|x@fuuQZMVh2y zK=9UAX^~egao3`=d64xqsP<)9=*@^SLYF07=d^U(T9lh>J}OfFhI9^8=oCm+WDhUV z+cwbu3qok3M>$@?#KVV2ZGVFg)eNlqHK%A#k@OLAttf652f7nex|{3!c<`?eJ}SKw|=*FC&8?f1|O9BKnWvY1wGfUQtFtkSxdW4)tG z6ijxq7T8>N-`}39;g^swkU3Z~BNca!9DJ=Ciz{-i(CmU!!ikg z$^o`x>Fu7*@VJ42$ni+tC{SA`Ufe=}?3%}W-iR;+njN*Ejfw=G#dSW^dgXYpeOGer zIo9nEHN010wWwYBcqvf?^p;dUYyKc$-*P=h!oIRvxX=B!O1r^A0k<|Xt;|PUjcg?$ zyRQ)k+N6+n*nyReuzh1kGFWZ6Sf$v%_+U4W-g%SkT!Mu0^#d=W_!SQ{+hC!qVY*ZP z@k61N|KZ7y*Z%R7;!TgYfFD5hqoR;o)UOXq4K)PJs@$TRRf-z%ViUN%MDI!dioL=P zf$b^H9PR{X=vnnEd@H1cb#Wa9Y!miEjx#HV?e1x0;}~WAg#>ZP&C@mhXd`_{4k}sANzzEl6eZcBA63aQd8i% zsG}oS1FQ1r{#uFqn3%|0G}jgZEMBB>l{?hY;&5e!e_unNH#A-6O!mE8r5o-<5BXg) zqyy8yZ_h@(bcSEaIN{`D455Eg90 z!neN22uGU~-J|3(t&ImG(|_(TMecJbC%k_@;c{>_{e$~!@)^a>&q2slSX=qZc+z!) zehEHf7*#ao(ZE8FvmUx>1MRPnHDTY4t}8G97X7!*$v%1(^$Z(e%>V5{G~hm!{O#|J z;?MefLl3V6eQDU#m``fGQ3pHzb>^=f|6e`m5_r({M|5%LQ{8@R%l zesliXPPUWaLF~!9Khr>&z=tQLihtw(Yu%em`U!s?qh)78UCfbZR*3U~bA$#Vm6w10 zTjHPq_Uy6;Vj1k&x7+{5p3$Vg)Q7ZWZE!4TkLcur z|92LB7cl#?fA?Izr)a}RW8C&{i1RBpz>a@Xh_wnhxi6dljR!q@2&OF1eLF7133Ny5 zv6-Dx`&2KZc)OqF_eq1fy122r{b00Lhy4RnFs|ULm;T0%iNBa}wZzX}<0SHPo6`p>rrWf+xceIx>Nn~p z%Jq#E6*1ZGx{nIk(KN}D7PoBxG}&tVTedAM>VRGL*6yH$0oDYq3`RyXg~XRYP9lqD z6>X2^fPtcC6c|L%vCE?fE^0X`KuCdA7uyZqA^CzUqfjOTbNl{d+QD8u=2qij9-58Is0i8at?Eqzx=Ai`t!4CbSX#Y?$Y0!e+h6~VE<(V(<=NP; zd<%ruhdP6UtWTdlUFTV)C>H;;V)5_3P;C9^dop=x@%IsCj- zPdsZZF>DGnTn$i*ITNjzj#Nj$rgaK*UO%A>rg7~sW(V=NU0^KR3lf~LY#@9i^8q_+ zj(6UG>G8fCL#37|9?sVk^lo+@_)Y8kG9C{~?FPBIxVS>>_j20AT<(?HkFx_F9I3^+ z3}XCGy4~Y|)8>Ob?p)ZDI$5#B6FOQZj=s8aL1;1!e$>KIkoSCV&L>{Z1C+8CkyC4`~~y zgE1%=gyAZH_~x!Z6xuKW02ksg-w0r1R|}HbZaR^!vTw9IgB~ZYM2nxidN;6iH02ZNp9vswrCmmR_+L`3ef zz;=#-hS$VByRlnpXYR(zX>K?;45hw5t3@3V6cl8~YNCCyX8PQL3mZkQW%zWZa)1*4)Cg>N6iGgxdt<}L$R{4&T0(+>FV{; zIZ4;Fz~)+vOg8{k2I6i@dXbq#IxtoA(`VIK@|nitNv{+ra;CwD>>#5X4(dz;=zMe+ zE*B^D_4R!Xh81_c!+4D+%D{${D8{o$bowBkFb?L9VZDBiMd*P)<-ylIk6$lsVZRG{ z!AYsvhB?Ory^WDfGo37vfJI#}g^de<`>u8wYr6pN0Zqt3!U`d*vMa@gdW)OJX;dkj z%q!B%w!bDM4#ack)ew|l(Q8XvUXF`J=a*pTF}w6!T6Y03cOA49ap>V5Y!`I$bY+a0 zW@vcIMEPtxjpug8YkW%#B-DOuBO`QJk7lMB4a|JFc?zijOCl3=7&=t(*&iOZ+%o{j zQElLN0FO+Tp{CH6D^~B`z5DQ)Lk)0|&#I{d)}X6ry%d4PWlS8F8!EHq0o}W!SXJ2fywhFx=?QnTs>AOG84ib=+7?vwaOOfKx!IilJaQ!oWna0b2_NO zHDz!p=k1&JtsS=pIMJglgZiOTvqp{G`KeBU<+)IOs=-JR}kV_qWCzC zB}}h6^=ICX5lG8{UBqFdzzo1v_wfTO-_H8%4H#nQ_ravs+)K-o!z!NIgRt2p#~Guk zi{sngE+PHu4=TP~2Z?s$D!10qKzLz8-c;{~Bb4Z=m1UvMWe%TCexffuR_#fVV>|zX zDg|GGOOs#INRWtK)P)pZsL=o_zL1aop@`kcb<}=oTfdQC-&;aBm=8SI^JSu@06Kx;KKUm(pQPY!w7M?XOf{-};R~qm26e_wbCf)?& zk{`f^8@oEQ$9h)?677}&MPpG3d=)<{JHRZL{6uZaZI0_JqWuRKv*+3gWM?q_DKJUv zpZPwIMEZk-X|m-H_GcNcU*|Bu&7~*=2vUlF+(2Vbj^-(DSj>v=5tKwSG!g``e$s_c z>hA6Kk5H`0J~(5Zq~_;pn9>{6WY|HSj? zcfJI^8QA@(KHD6uR9cRfMXoisxWf*vGrh6gf>viwxr&e#bJwG$w~j3mQJn zO~Beg-i3F#9on1t-7{$zw)*z)Vc)JPP^Z!8{7+|<2QneO1@x3|r@`!=9_t~XkdPg5 z)5ULHkDV-(R2~IB7t+}anN8fM=83OrJejWD+moiYpml+so->#+fkze0(HzLupW_#x zG&gZ^)kNB_oTog875ZjE*=6(cVcjbyC&*0J{qd&ATfb&9ozgcx%P`r#{z6KI z1xD@NtWy7}rSP5Mw}Ho2x3$5L(&^bahcFUfex)npw48Gxav+|UR;|3EMx3ukQDAaTHE0Y7F=f=cN`An5l`6CRu4 z_*#X2RaSy+iQv8;NY}0wR`yO!==8q&OR+3@jH-n3v*WW{&(<_$TWOC!N$Hfy~KOJ{m~-cE9veRxSOn3 zLe-0vXRl+?Ipb_^Ir_5X^`#w|!~Oeovv;bl)_^wUU+~pm@(X|!f#*vu8viRrLFc8h z-(HlF_j@LB=eshO_aCOWOmDl!0UnyY0*f5!bBo%9u`0(T*L~p^wN`7I1FmOF9ha~7 zL5IxPs3;~RY@1AzN-nu9M*+eR@x`Kab~jgEo$TnggtD(wO$;n6uI-Rd@(1;@`&U6o zGP^5gHM)o}NowKfl2IbTwL^S;8)!_g`xrbcUdF{>AlH}=Pt~1Vx~*GlByRlxmH1Kg z+jM9H93!FgJE7cdo8L@U(4{uPF)?5a^o-k(Xck>rBX665F%FqV9`a<1%!0($w=#&I z$?SV9qj~vbj9Iz|Pezqq2VN@mZNn4$U1FuoW49EJVN>QW3pL3u?NdvM43b1UUQEyd z#%aw~>-5=wy?xr61%@3dX|1LwW`AeJ5Jo;L&>bGKNtOe(7rZo4@55K=nmPa_U>F?p zR!QxQOUj9p?ehYEudr<*)R3uE`@3`=a- zb+?vyv7wjEeGkZ_L~Lm`Q^-!YV$*%sg|v_9p7=Euu2XCe=s9V9&jA{ih{BTf<>-Q> z=rBBg=*kw;=}~DpjaZj2R(CR!ytiM|-osfvqw{)!wK=6f&OGbMyyTX$vrx-G*Poo5 zNB|=-mRI)RHa{!WVgxvr;w>Q8(U_UBaQ`1<)C^Xyy@5zf6b#ln)PhM-PW{=7sr?;A zLuD+#lVm4MhVG85P9EX(_>ETemtJ6i5liQXPzC)bMCeMTc2Ap2nmil}ZA8OU5>fsE zhB2AV;3q9_=x@qc{7&$|P1Iz=Og!YFS+Tof8z$YE%VXLvUfi!(XsG@0L?lQ=_Reae zkR6P~kd!$OCImG>iy&vKp=GT(@8+;IvI5$!^K$Z-=VRgq#?@1=muE`Y6$FD-bzg1B zxG#l89Nr%f%OjPaFSa)Rf}MS48CI#4_D*0Y(MQ0!FFH9(Zn2zOH}^V2UmwjTm5vEAd*SV?2@v8A$c*m&mC zr59rMxF!W$j7>i(79k52>gFEHQSZXHr(oauUrR^_DdE;S>MXgVdOJL}> z6?-}z5X1d~AQ7pm%&=Rt~!b%mTje zifoJD&*_}?N}8|P87yBb^la4$bt@a|(R>$6Ak>A*tm$EEAAEVhUO@^3)d)})l9?Xx;keFG zNo5`?&%>peC^1?xW=$f}X@&zZ05}S{?Ug8qlkmE&7?~L9|{ybsf0S{>alNr zR?_xf!PdyvWs$NY+Z$uEwId6YAw9+S&8~>-oxt@260C_$<__s){w5kaZ*fqF(?PzZ zv4gSgCSUoc0oWeO9Q?*_7r2{F#G`b496)7a@tvYP%<5Ppg*hu$raEewtz=AejCQ(a z7(*>j#iSgWr&jL(&D2UOTqL`Shp&q!perLbm%97$?20NaQI;BI4K1G2Dy8-5LlTvmro3f&mm6k7;hAIrx z+oNa7?9n`x(fN+jJddqKixt{r_saE11a>9~*OJ`c?1XE|Mv=&9LY{;^nQ)hlrrEuU z_R5HnsmXo+U6H&s>LN#lh;7NT5=*725Zg-D)w0oY^VV7Cc8IhB7{v9Ym)_K?eTBO> z!&u+F?WblAraXpWuViw8lQm+{Wwv>pmIo&6WQ1+aTcnM;zdR(I^RjX(L`DbjpJ4Ms z+qYIlOT_actbW@EqXE~gEKEgB0oCGyWIRdHvESTrcIaC*T7beFTiKMHg zu{&6_>!Rq%l28%yxjoe=-W%?lC=gGEH1{nC`eh2Rw#fKsG=R22K^Fi)pxX0l3j-kf zh`sZwfN{h#)YG-2xaDqjGk!A)@hRs`bnBkkv7k~Qm1lYHV<3wC+V3h2Qzok&pVJTobF>zhUqHk+|v$%TbTa$afDGCP{a(p zU3iu#;PZ122o9T`_H$6$itopO^XZ71X-)9!)8ATjpW4!48yfww@uowSAywwZe7?7! zd8~^cYQUysyp^x&k%{NBdZ^oW%@mI^v&Q(uNH2@uW>FYqjzXfi$hTmO3QoliY}K=0 z3H#>LWMH!N0ix z2<2F;bRPTc#&B^Ydfa0es-12Q8()B>(~d7Ar(QE>=L5D-sS|tKZn#d8@^@MXI6@ASJdsqn=&mk)?OGVfFTM^A;pGBpY@vzok)WtkAEXzv zz;va%rBx8a{UYOHDdN0eAp-FsH9c)1^JVYPP+6CfHF|$nVRC1Vp_A#7#xGKet-9MD zB}-o;qhiWG{!2+a#31GQa(Zt)Gwd`n;dsSZfE&4%sP%|)?xIT$?N2pz^{ugbvkE{6 z=#2X+d582_kFtNwfsYbmg~BZipMdjk1#?zML_OOGW)oJ%Q%*rm3E#ccUiwebUC4LV{b8< zRkIjW`Uu(ml+)7geYQ|IvrekkSet5Gt~1A<1L03XG%dr^fy^E(CF4TzpqVj1!&0H> zRubNI)$Ql-dail3(#g5~A7<40bF(J>GQhm_xrb26{A4RBrQC+)+Q%Hh<9iIc!FZ$5 zTiLQ%{&ON>jQDN-h)3h^%^E{aEw4>aQU4LZo;omYRxXp%X)iL>pdR*-KcC*A`Z8?~LC&(!A7Fau); z3>y6?ki~)fCV}eqqL@w0+7*yQyVwbRbmFihv$K6zAN%rKviUiGmmUPc1TM6KQ{iKg4{UNNp29V{Y9y2ly1{q8%AoWDNtew z>ud-v<5nlw%+;7=RoQ%T9NWW!FiO=ZjbNn?CU!C2WMvBR= z$T)vI`%zN&buOS-I#+2aR|*QmbiT0RsA^SDTG(16SG^)FqMZo{mk(4K%Bu(RfA_7|i$3zjg!uVD5a2jF$|<)7qU+6f^ZvCW5pWO=!}m z#&w9UTNIdl;xSSO=E>0Pzn8l`W>8|5@+a> zar>MoU3njLn>^bLFk6N=|4l7=ci!O2w3^!~B-w~l97xRTacIOYZ8ZHuVk(aTLx}az zkB2t(3+*ZnGDql5x=a8Q>h($AzKNX$abtifxyVw6Z*IOwB91Wv9x0M914~?Koeoa{+WK)VW{f@&O04JuM58{hcHcL5x%)Ry z)FBSa6g$X}k|!Zf!`5w;9Sg9PtXqqRFO*|LkQi4Grn2|2N^*72)#HRNP@cnQHrQcv zzu8h!vH;G|Q&*O^zQNtB#x;f##|_5d?&Y>o_dp*`EgBaI;@b!ScU26K35FZXW4__e zePo{f*=yOh?x{x^YWrsIZ%1dy-25CvCOIOj z#CHp{WHl30uVdR~qF|>4M%}+ybI;p|?fxfiY%BHxgkB_qel-61-exrxg=5iQ-^kM^ zU%clGylv>vYs~G7Aw_N(oh!)jjBLyH6lf#FIB)(curK+EgT=){jUr<_E||ULDXIPG z&jMxxOeB^G;^MBa}Z_hi7)C@e@$#Rlpdn|o9^=p3u851anC+L zwLqP>si)oA)`&%;WCkRQ&Kc6VLaGhqzH(&%TPGF5+~(U$kc!^7@;d^~qzP~)VwFXZ zn6l4>8!AmOj^rvw(@);gp6^oAB?4{$YV@1BMg#f=rFNu{dFG)wggR|P2H_($ib9>m zu!#74dus~Sfv+GI)j!c1HNyDi0pRb;w42oEO{~bsR>=niNsOEDG0OkK+X)4IEzBlE z3r~5L;z8*qn09Qyjz;!cw5-!2$Ucsek#tZ6pvu)MeAfJiLMvb@V{YeQX~aDq(qAFE zN=Bjler)+E+0xZ*7AUsHU0v;IrsIm?N=>tR(7n$OvkU4kR6WHSU!sB5`EQ!g%KsX* zjT02tj(OtG)#i?nsT;J!mY@v?Romiw8BkX+`wdK~8ZO2? zmX%8|I#gcH27_&OV&~$5Wnw3H7s_PBHI1-9nAmgae8-2vbF+9nf8GX03-^@Pb4E@R z>2b^-@TQ0w*Qus!RPBhJ_uPtn&BFB?*>;DOw3OEfSX5|7f}~>T%IHSEDY+yye7ay~y7&D|<*;QQt71S1^W>=e zcqpL8s1J$}+~_i|a$A1d4}ms{7*f9pVU}zN79G{fopfTDT2-L#@NMB~Eb6SG0n?LOU>Wb`Y;qp@LlWD-nY8yD zv9L2>Xdly#h$vr(MEn@kpZWPnxKwP(FkJkR&U=YbEAopO4?q!po!O6J>}*O)pL?cU z!uLfagIlH-bao-*2c_s(&lhejbOYZgft)9shKxDi)UJF2um9Cu*?Vt|lb;>x-?L^S z4ZYjBgssBX^3dM1Uy{e%fTf2knH$2uzTVCmgVz%{zcyccz*FEfOJ1I7BD*v-U0ipX^c#TcDW+^*O5_y;H)V$X7JnTKjyM*oK4ISk7 z7vviqZFfMq_U3(-Pij5`?@DEC^Jq_yQN1Y{FuF!fPFHr{XX#Ri_e?+94AW;_pP{m? z{kr!O$5=UH+-lThb5C5k9+ba;Qf=rutTN9_OdaP8-m zrbSARxDy`9ITPU%$lOx`v5z<<5SXVgP0^e29H=A4N4)bUBP+V79cwAj_O&)(n8stt zhctB>-!Cc|e?qYTtUA}RJ5hYvTJh%&dT?SpF5}tm(`M`9CihG3*V#gxz%nF>m>@ploYX?(b-nHxczo97saI&=1o|t zP;*#_QNu;lk|~AkNwIh?y^WT1cQ7BFZq%k--ZTQ!U9wV*@fu8$;OZZvERBgfU zRl#&8PM=fGD>C(xQ7B4?;GY_;bL?c+qcuV#70 za--Ab)=7b%XzsLfrgy^k9}BVKF15(Dt%w(fId#bI_8HmSj+y>(v!gVIxjo~yHkoTk-?hoo*fB(`HVB74fgu*22Ma~f$G0H%V7JZp z(`YtMGiKBK*v39xRClWT4da8WsLA2`~Ias&b&X_cH}+9ztrx3 z|1}L;{<$+}wD?X0&eQ$z2Xd|_L0{hIRLaAhV!I+}qprvP;LvHrpPqp$m zCXewqJt6oX=kWJO|MH#WMDRNouZ%oD+y?(+=!L3*4_BAxbLF3R4)@|gCvXC`&N+zv z56;4WT{MFU5Q_=)*KG9B(1|JemflHje{K0f`=JBNGGR|NJ&+K(~h zFo*pg|HsFlo+i~{NBH)MBkl`EAM8uwH%g^LN!LGLC|3u>OmvSS`q&ZoW$Pxu>pOq> zUptg^{j;d#2_R;SaLTrS-Z|V0A1^wZ)LhHwb%2@YaDVaV@9A0vVn&HNZE>W(l6wiR zpHMBEYoOZWhtfQkk9vrBdaJKX&!;G~GH6_n7aVcP`F0dSkKOdbyawULBg{uS7M}(l za4N+jly4piQB)mHQ2)8EH|>2+w^8A+XwmfvvU8WiOw88%VnCl{)(Ywve`aEI(Gj25 zhm<>E5kN4P#}t=X3CUxG;!dBuUpIWjd#l%SoHG83L$y3+MquZa*%8I<@!$ok_oE%( zm-uQ#x(3Aj`p$m#xj0K%%;Nv2X*ldp%3q=o^38reMX8lB<9Jf8m8d;Wb@rc~JIsr| z&vMtA&w$;<1(dJ9Ja(ez<5RG`TVEaor}Sh;wi4F|A)jkF4!fSeq#2kOy1|chV5()w zdAs1MtFFhs(0p>ZZuQ#Q)86~Iv1FN}ceuc{BWMyiLHcM>M|j(=g~Lrfy)&mprIdSt zC5>;XL_RVOTf_4mleY;yegv5W_nq#R!6nc^^ajvI{HVsx3TOW2Dz5|>QYIq)(L#rM z;WI>0+*GNjmmc>b`@OyTHD%*3cSp}0V;uB~r8>fjfPrt|>^igYHCR?Tp$qIhxks?0 zemfwbI>J8v=2L(65;sKj!(>aaq;kUd-r$oqPKy|+BR%8T@qQYs>sKZk7*idt%k}H2 zs2}lee0eK(t%+Q;gU!`fpO>JTCvucu0G1kg3y9D1%{F3>?Fsu}QRUH>zf%^|9r0>( zd7oq`=XM3kPV~0&hUfYS*O4~C=QJJAmHBM0C-Q1QP3uv#yO1F;>7UXZ<$^xx|K;i( z`u;q&{zJ(sV$y2L@tj994#`i!_g;;n8-)Kab$j_5B-NxeYH0L`mZ9qm@SqvLU5!4< z4J291Es|M4jomw<_Dntx9C%S*#oMQjC|DR>;Ecd)g6|#0R0E@XjRrVBCj%doANm~s z{DQtb;B4)CF&@sr|3^N3?y&*q?hM_xOGmwUra%JlTOthqJnC>Sg5|)zoWJSIbtE~b zVS9igIm?UoLPtCY1|P65*Yr+mALUwswI#z(;c<(Mfradb=Puu7t7(`<3NE^zKC1kX zyr?h#ANLYBfxkp&ZdQ8v_G3A(;AU;hfsIS&j_8E{=7Xnw@c#e5F#rA5|8rq(GW!I= z30YRXm99pcRR={cPIvJf?#})BP`Pkgpjrx5EhhsnmhTm+elo5qb;4L%-pWO8{P(Z@ z7w@#Ifh!zy%fqD-W_|M-1FM zB$DulV8zo>PulrZhu(DcO?_z2j>A~>&SW5;8F6p7KT$K~NtVtnvwnzf zFsQk%PkkHybnn&L+Nk>mc?LZpcD4(^P4hz~wr!oW{N|XxXem#XHjoV~K-(P2fUf$1 zzHQDYF|=Q@*tSS`IA?-~_flc2Mt6}?D4@bqbSQoN&3DJ95AB2-#Wh^ilqu0`gy<|V z&m}?K>`MA0J%=xOgKl-#TGaE2@6PB0G~z&0>fn3ejYiSIas-p>^m+crUn6h0{2s67 z;)$!lO-1OM1VgdVCY+1nM=&#p~tYc`rknd)0Z=7Wo9HtP|4FmH+VqRT?_l}lT_)#R>V zTAx_}b7`Qqh6Mjmsr|(RtSo{xoI^82ylC!OUbqT31e?F_wuU;G`gF5gn)@_0{HDy_ z{O4#Hm{+k0()C4arnY1GH~jk{wOAo>xJx%SmN;2)6ujW876_(ITE12~iunwkMrz-{ zfElMUc?|nW2U`Iii#g|K95^5uGPCp7rap#i23aOSWrzeE;wG8{l2A*m%rYA)UT`9Y zA{YYcZUMklGpWR^3!?jD*?oi-fm(>vnu{`YsPLHgflh{NDmCOGHc(GNO@CSkJxbrH zo|YtQ^#My4k7AP^0Yhzk?43fZznr~aUjU2qgLr6%{#vW4=_Q2#s;mn$@kO0)6sX0; zI;0k>tDm|$O^v#Z-r&VA=S^1Myu1I6jFm2lyW}9tlqgj?>=q~XE4faE*%Z25GKsg% z3y~!*eDIiT&QM9%@IOiz@VFUVjMUC3 z-!F}uS}q$8F+JFJPa8^t4>ddWy;u5SLSTAeUNT=tC4F6sjqt@x;|<7WMQ*;w*Wy+r zCx;dt-bi9AtES7Dk7DwDZUFSi#92~T#Mx))B$BYT%!sJj`>>NFOB7G^#w^&3F61Fx zpDb0jb`;Ew5gNg)K$YD4joN7opw7B@T2E0Dx?G{Ow@xn`8m=jQjg;g;a-dB`f0uAw zqOnYHfdh%F=o5E5lDlNX3(n3(P*>s2T2+*dd8qx?H~Xa%VQq zaT1x46#OkziXjQM?RlS3@?V&s|Nc?`MF5T^YDeUhjy&D?d6mF3))2xR1$cZy)ArL` ztHr(=yS2^YYk`bXAc(y`EwR#Oq0+cpy3CaVowr2BZ}Jj*StoIb9c`)owxYDy1jN|j z`|sOP2V0J7^Jbxch)IY0e3uOG&f0E)r`x`@Wjt*-hdQsgZg+LbVta zHOt`Vr^@#`swRQb<>_}+L`xhg3LqH=S7xcRw5O1Z$-@k;?8?T8SzzHs9a7REVtZX; z>+@4|jCQ<1)r~7v4UX^xNGfrckCb`6L={!d;_(&kskpE<#rdP@eNsJWS{a3jP-dg1IZ5+o6Hwm4C2L#t{iK zl6k+HoElk}Gvd9UGP!Q9@jLaTI^U9To2NlkY)&f6W01Y+4c}h}KHZ$}UaO}!ZHQ9{ zxaB0g00^aILfU4bLrBg>p1fK*6e0A$(82DI>G!|%t_lEtqqg-vx!22ME?KciIv9;< zlB>}>g3FNEJ5_(oULNywfpy#VV(QqlDWd26?xgI&4HoF$+w}z9=hLDnyy8;zMo0l# zhU_DSqWj7SS8n-UkH>U(F* zl6dUY3M#WLo?!4l8Ei)ISHrn4m$fG7cYZ2N_bw zMn_(}am6E@FF<_k(po^};st`!Zc9?7QTwQJ~BzGfb+jF!G5;UzvTU^P5t$n6+^ zav{;a@_v8oU;ZU$wK9-N-aTiX_M94j9Na-o#z{ znIYmP=Un4gAHzl`&UmJcxlTU!T3)K9;$EsX6vF*syc-^*j_FMY6r=D*v5Ys1fF^Uz zFQ%lma`@u3_%hq1@{4^~CCKMH)w%k8QV7^y8%OMzox8GbQQ=u;)qOQY9N$Dzw^Iv1 z;mGc-O*-56_|(Eg->Dw#HC~qSzFWPG4~v$zbbFSD+$h~Be7rT?to`)+tGE32L&eVM zyef?(l558AI9BaEM@}Z;wsaX$F|FARlE`9{U#21r`WL@@m>eF-@k!&!2b9R3ywCSu zo#lt`y-JhR6I`wV8Qk|h@wZL`AUZ>WQ!`;ujVp4ml##n@KRvi96zCnLq1$g{_lUA)Tm3qLN~}<+G2j92Z1%qI1|)ZS?g_3>3CpE# zZ!>BKYtdAi1yJ3XLjjd`IRf&oc0WXN zYH-fvcX1Op%aVSbU~NrtE(!OQkB}TVFNaz@O>ahL6SvkuSD`uGOYrW;vB!Q}W_i-M zHzM{!KQwvEZ_5y;!>hkp#Mv_tuw|O(M!e**fg&}p>Z}{ql-hkU0>$q0d$mP7&oLiC zgkvM+T6lANEtj>z>C$=YA96Z^TmQ14P|k(?K?a+vu>&h)--x0G_UdGt8k5A#Xus&*NeXw-<}6QKWtxSzl8Y3-d}6M zZ!DpH1W}Pc_5_nwWd&~hui*ziv;GWaR86sp^tV7uv=U3Ltp7PrK_IO}_Y&;xoNN`F z+o*ZQO=XzXO+eE$gtk^b{5Rc%9{=8_>ZnctFc4DBA@JCV)6+A~;2u_N-ZQ)hb@(FZ zq7Yma#A}u?t^>FYpO25Otu?YX@*!XkO9-e5ygbkro8_zYsN8K~h6{(6hSuDdx3_xq z4Qau?mZThSrxbQz4ik>!CC=dvuI%Ht0)byD&7mG!{gWWGlYC-oZ=)jwWwed<@L2sE zXrFh4EM}L~$ydllcmnVrqiruYasZoezF(o(gWRV1vth@bYzuo3rrvu4b_y{6=Lz2pYWJ` zoADGx&08X}CyoFpt1HPxSFQ}GgjG`Av}Lg3bujInU}f1;X8ECxro{=~q|l=e$hIBI z+g3GAb{r4>1nQ~omE{_LcA-lo0)O@C`ZU+>ILXOsO!6+=d6q9){e0^vkC7V%k3k2UrO<=cnY*`4{@Q%s zmbCxp!TsMJugb=Dx8|f(V8z`qFMhdx@zFn(rUb{(kr4R4V89qPDi*n{7*?6xgc<`i zY&@kuy*HHe0*Ae}=g&)fxpl^=UzX)>(2UM6S8YjP1(mU29Dr1ht*fX!2BTtq6hzo6 z_V^v3dq;u0Ss=X;)XOcdO?(cxxjq{YyY0Rmbg^h$8gyw9&1`rdKqh-t*_e{^NQuLC zdAT=U3%P}CuBU42BNBPUYWk?a7-=bg3q=3uyE*+{+bl_cwTlY+ROc!vrB-lETedyM=Ok~id ztjyIXYc(vkIuEv^IVrGV?_8=UapjX~eGN|fG8VD=#4Ith;*gdjSs#Rry7_x0XGL|p zj3WYU1P4e6$^yPPEprg*Rk}>(<6vAh`>pqBC>Ulj)Bi-9b~>iWqMm?7TqaeVrcRZn zaduU>WRNV}X04B=4xhqW#f<-xSTbBzk672U^}Fyia+e9F>9Ih6uir;njKnH zoweosWLTE#v>lUCKcy*^09j3l4=>isRV=pe6#-~>)Tu6L!|BC5dO?e}Am|E=ts$5- z)Sm0?QUM{ifatZ@5TR?V?eNN^#;ai=Bk^M%K(*kHFy0UlR)4YAh=89$B0Plf+wH!6 zWUQCbCOBO7r`=atovLPD*OW)2b?S@`X-*zg0KvT>vZcRV;gS6aB5|sWzRbR&ezrhy zJF4_g_^NZ;(dSMWz9G&bxchVC9^r1c31OS3kza}R{4HI(E9lWx96-w|6fKtrBECLU zVu>7tGg8YuT5}ndq|gp!lua=*Uv2U2<4VO(0l%s>uRJq1{pUR4d@AwD+nyoZ(%`j* zVA~N{Z;(paWaYX@s?7YqY2E*F?d3=SV6$Hrh+&kE&3!Kws%sHu&Jw$uFk4p4V?lo| z7HCP|z6E&Yiv^~+cvmj~<*TmswC0JV8QKZBNbeVigA7G&5QwB}@44jOR8ANWNvPWS z&}!Rfs_k%7d9+wZ6VNv2L=7I!&+PIBfqa%8VN#_VsZXw*VZT)F^qyM@J)bR}=yjRbP*S*Jxz#yQp^ z3yodG26K(8s#`VzQb`A`nu~{dd9Qv`^3;PB1P3xaqDvjK>s5b>8+9}J#O4aLxmicN zV+#bu%TU@gN&<9-imk(qWjX11jr6RmUXV(E`4Pmu9U=jnWvAQSycu)@{Q~x65fm54 z!v?IK`jZz)YUp*Hu$TJ8Sg`{V8!J=ClUx2Ym5?Oq-ke#Q0X2Z{&J;SKjIRP6cY#?z`Rov*s%y0G z=fzEZNm7bAE2q?k?v6bp7hBBnT;Q{XW+ZxXAZ{6b>`243ItGIV0&f?+iRVak-yFDH zm$20YIG`zCOzWT>1HLeSh~(^-^2HUX+2oJ=U@PFGpgpAiyJ8@z!yt2g2(;M>W_njSg5WEOuA~WOf{I~MkyT- zVV{+7EALl0Pd!KNZ;!K&@Z?o;P{Yz6W1Bfy=y78>Ij+_|{Xw=Zj=0UxV}|zUYrMAG z@)BfV_mKRoUOVqeFiBcSny57;nS(SNU?7V*6|dWZb_7_;+Fl@E{ag}4KNlwPeEu6* zLt_%00b7HUhqK0QV*jWYPF=Moe|XTD#CwbW13)OW0cfvLptAiLaPvw`yQm%8KR>v! ziVqXzVaj-Z+qh~tS5gUUvM{v0TXK<8{aqf4V*Z~DJVe}PAJCuEP)r!Pm>{e4AYeY^bJ)ncjQ}oKEE3+>hah1iTPSZn4?YKV)` zT*Jww1nVBoKA*W6c%186cHD-y8D`Oj3Hb@^PE47($J^GGQB-a=>8%tZIQp+|E+Cjyw6 z0_k|)K?}p2A;b8^97ZlRfMb`JKYCe6bGioW6Y$A&Ja|2S&NdHqUOQc_{dio_Cm3P7 z;+sf}BKedI@kj5CIzSxp`8rc2&II}c{kd^EW%`a^s0{J?xH`;eb;@NjJKCC z`g@EHG=}ySo>GJn3QwBqo!H`}2I5Zm`-%h5`9{xIyJ=I}@p*mq#V}}5AU{Fx*u0v2 z0@s@K8gLo>cy;r)afz(&@pqc4ma5IXw|D8CI%}vuQdFeNkfQne=>&Cq}Xx z0Ddp%9FuKHigGVvg(bbcohBzj|h?16_^M2Hn9e(5W`*ho(66^U(yYsP#*`A_k z_(;Ke%kuiyJ-1=1pt3P9Nq_aATdl~E8G z6TAZ^{&iKaW%nUdHa@dgldrl8>qGKeZ#*MdL(7DCE=af38j(@9Y1X=Md(V zc5?||MA6ZjsX+a9&eQ{G)XDX12lVenNG4J-xon>APIp~YPU-$0c_$2c;RU&TXPju> z^YZDf9YhZd8(+$<>uhve??ZB_u;lUKX1x`IA~4k&GXt z<#^5=2T^cC!9gvwu^(-eq$|!V+3eCGBQ3M@>oYmb_ChM}W>x#woFdH66H}9_ynIZV ztHKaL4cqs=-)SM48a`XF?J>c;yNQ{y^p0H0(xQgAOJ8gDI}kehSEL|xGIQCzJe1}c zG8*E$JJs(tx&->ew9B_R=aLcv+Q?)L3LG;Hs-1L3CG~;$)mYF;$gop@Ec57ikxkph zcaC{2`;P{9s$Dvoc*Mp@ombqBWgUsTQqzf$VU3B^$s8Is;_BznjdzXiBcARi!PVvJ zLz*T?iOt?lDc$Wy&4f$dGE>Fjs_iHMINoEl57W)k2ysO1JKUFrEcaO~XJX2J0jxm+ za!*rsOnF=s+%1&~2QAvQ%_+Z2rNrTW^ep6SAY)pmp;vD2+$~5xZ&eyARVwRQqqQreuzt>DVEY^pEvPdFKJ$@|ZDGSHC{wg^gI-Y!*b#I;MK) zg?c%DQ=cb98s7x+(8dNA^lqN?!&WaQI`==*2EA5E`(jx_1Z9v+qVn|Eo&iZi;b-KJ zO?HZset;}`7{n8v)mIT)izFTN2i=+Q*}dMRc*eXMqQ$mo>WC2IRpo^2PFY-A_Js|y zwYH+ps5tG3uQ8VKAIKnB{9MgzgAwuX?LFo`gdJBluP=r7r1d{vY{L1;yow;-2e7SSKIQf9d z`#xotwbx#o8kw%o1z%d@o$eByn$w{{N%C!{59~EJV00+!TDLWJRiZQh5pN5`6|qhu<+Bo&*h)xI}0DSBpX=WQZUcxG%$CHt6bSh z=^gbi0O4%DS?*JOYvJN{=5VsUS3%c^zPQTQ4k1`UDhica1xbq$r3In zy#oI;rL(MamssUC*Stp;D{o;J8*q8O?X;^^}yF1Ib%LS@eF{FEu*( z0|?y2%r<79cIZ>(jg~=K3W`e9mOeL?|M&n4sl*l4SOdo?Zo2@6MOkQWCqrG{oC1Ue zGx$JKZnL3fL|99@cm8jq5o1d4agQ=>rvTq-?N9tW{^Lv`cXU%GjLSxTYRT~x@W^~> zbU@{4dQ?*Oxh)5-6u#x zhg@9eb0ij6?%tg6b~Cc*s_vt*nOG{vb{CJAABECqS=hu)JX>tzy|b2RQ;qoJMExBs zaLd}a7;QuE`lr`}JS+odHVc!9*dXPHC(pu@sgiZY7u(B06W^05BF?o!FR6Md{z!vD z&E&54N)S_KWtbOedAPl~Mz5D44)q*f;rF*pDJ%Hg^f8bsq(o^EM4T~a z{B}^c8B5QP&i&%P<`y-;6J$jWz&YugTj(SadOM0bi^yI>WlMJf)uUbc=hg)IQ7xGi zLRg41bWR8f?J%Gf_H*)WXye(N{<61)0A{a?oR}H;dc~MSR)3&~f8P8e3gl30;TdGE zl^XH~@6|mz>JR~cx#^7<>(0byYpt1)38^B-UhB4QRn1unN?H8S@|D*m(%%-TaVq_B z{8`Uoq7By7CXd4(Y^NN&)UU8=cJW<6--B_)1AV{y1J2K^=`Xh*&m-c;ulGW-E5l$m zFou^C6=S}B{)GNd(Y7tDetLi}!*{w`LD#j=n^zyDg;BR(qEpzZ{H;ex%Rv^ApfE?L zux^yy->5G9d7m|?7q%Qd4VDR_RnxS$LZMWuLa(o})%LKR1($ zsZ-hAjrj?of=*xaPT*6w^@4~(rsZ$MOD5d_vW21^Sk44}uRa%Lf8nn^%7hb?CUCRl`Rm?Hv6ABbIWS9!c$u2 zRCyrf`EhX#FQeamCFq->W7XraO|)OfUzeHsY;Kv!Sgp(xsPv-(q3M6)6S19gRC&4R z#B+4Aw<;;*qfuwE>pC85--CjGmgVKUQ)f5qwnKdk3v3xOwcGer5)gLj8G<Q4rfZ{glS#4T9n8y>Ii=Gga9W2Q);CoQ zD2CJ-4LYp!b$MMQ3?8~u&R;(`M)^{z$WF(d)AX|&3LCLubU9@;^O6m(OX3%HG$ofa z6eJhYJDeAcL9x9FmyfrHg;n5(A-{S8>0b96n2J-ZG)WeC41kf5_n0KhwD*OifIe7G z5OAT4W@o)(f;c>epF2j+4;5Rdx((Q`HK#QF0wNIw^tqahi4*oA%anL{Mjw%@kraL6 z9;7Qhj_UK=+~9KQG=An~U*44^5s_LBo!5Rtf6n>T&{u+T+TJuefmFs-TZgt#2m^L1 zK~GN03hQo89m!}Ijc|V%F7?n*X|cqrCoI^>5m0hao9284N94p$XB$HN0DsPUcl#8# zrf!sPZ&uq{tF?CQwmKJ^jnM z5xLBJ07LZ_NY8#D&bi#nr?wc5zg#iok1~Sqd7#b`D~7lFObNH*sFnn@1f4G+l&>fm&$w91ipv1u*Voi1k4W4;T91#1?A;H z!lFQQF9xJ6eTLLxIm;Pdn1lv4-_{pC9+Qnk_v=BIB0KmWkZ0B#z5_*h>*cb6H`b9- zq6G$iK7g|;*-#`w){|7N`=Mg|ek&^QR|EO!GscUS4@95XSoK67zbo@rNEP;&@m0Dw z)PSNAa2Hibat5K@g4Bp?L8m|PyoMn(_kTWjXJJF0LvBR@)PI1`5tTC z`@1bp+;nM;eqa@7N(_0XATohaK^2+;j=GwENZ!E|RZD;j*u=HAT1MQ*Rwtuor9`)| zVnzA}2%6M_hk&$!H3bkC;7_=`JE#SWaOs4bEjrY1#qa$RcU(OZ#7QFy4O)7$pEsW) z9)~Pfv^C+vu~+vvuIguLS&^p5J4z~3$-qxHzZ>?_08$v%OG9fun=27%(kg>XFhDMN z68i57j0oaEhwy- zb|iZ)9p(#kSB0Ew_PSm7R_jNFi`$y_P|xQ!Z$P>wXS#Ebj@NjE16EsEBM5AHSL#Q* zeXdnM_^>neHS#-{^!1?EklK{An>*J6qTocsq6wQhR^0VX0H|bVX*zkXb8LRR3zA{| z5cP^nw>a=aut6JsRoIsR;+=|>@n69#E*4iB0cNQiG#5xaCPMntqW+k)%bp)===DX9 zdna}2QY`^!nHXl)7p<2B0QQeEt^E4|rNu@LpxpqK2UdDLY(5i3-DeL4D)biIJ9rsV z650EGPkl8qj_S2QO}#E7Nsc^*`nAL2%%8Uiqd;q;tF@+9cV_^CY+qLc=^xis=pT1L zd4{uOiiU_ASPJRP*GQw)zw+qMk^rKsPLovMKr8*IA(6bddr{8Tku5o0+Q#8c#`R~R z0k7T#(7SGbIB{=hqINf|0J%T=PwS**_^zL#Fi0x5>QAV%iUgp31RHaM3BUQ*Rn1RkS-6eAEq1N(^a)y2 zu-q909g!B#n2Is=es^n@b}9HFUv0{fGCm`7rcrsn)l1{mo}no&b#?74_z|~A*$1Pg z{5mc%L46_x8})!~{K(>&tbSOL{TC?@lW~sC{DO@L-4e*mzfqMUcX@_1RjVNkX{Yhx zZtL`oUBo#CaXzW|6-b4-R}qTCJD5qPo~G5((3L-+fZvYEju@QP++o`prkeX69Xt;e zD~Ilr?$Gl9>;Mh7%UCx5gES70As=IhWsHdt-14;#hH z0-%eZ=5CHde^W>UYnrsjYk+coqa^uemaqW}fe6`OJ*qD-dT9Wq$V5XwUUCn%1gK=;HJJSP3?yq&Fx(F0HTFh_^w{4t3)VkJG;;S1Bhi_7) z>r!C>h)QAU7nL|^YUQlWbtYY)liRgxvjLQ8KS~!6$#>@c_DapFT7)4ax8%?>{XzUH zMiM{dG`QU{W7wRoFd_uVR;eLA0@XR7_$sP_Uc)L+6yoX5In;PEbRnM>@`s?hZ;8+P z<1|Ti5A7^}KzB%h^shp?8vYBHm%NRH6HsIG9Y__1jQq`j#jPKLse9crtNqm?toy8H z|4%aotbbZ#9^dEf_5x%A^&>XdKZk!57@{w_chMAs_6yhP-0Q2tGRuh}k6h}OBes8a zAlu7^VHM^d_u2&jEIxiE$Oq#`4s>S_B?1&=v-1oqvx&@= zn+C>T2t~|PJ-U#7&~#l6Eh_fS%5RU9#osvtqC9E6WyEI{KnxR{U|#bK8gwdoM&ACx zR-=L)K!BW1%W48tAN7YI(nBAViK-taK3_n5!0e1|PnHhB{E%-ojWQi#02bP1$Oxf!X3OIjGy7}TS^msAS=5P$OC z)=a%ZFIBi7qfW}^ps6JJVGE|H9=O7!WZL0=dVZG2!h7JX~^_x29<$BkcUUeht!D)E;w($Jd4{DNKc@I}|=)XB`a*{%-aH6r>2ag_xS*|q%Td^M^TQF%_(?im4#_kFU#f`%m2 z)wXY)fPC%i+Y&?9MU6M*`fQhg;<69J3ca*uoWJh27Y2rR5Cs)bLGAt!2qZ3+qVAM< z!&)Wl`U*we2@^nc3ccqGpFB*YlvWc?%us3&lztYZY(0o~W{&g8CYM9fVe)XHUELTC zk7`>=z@6qb!YRMA9Wy2tWI5MK-~p7&I76aEu6BkIY*T-_2tHwY@#AlCs^_{-B@oN6 zD==MwD8B9F+oTl7UInBtDN<%7OiWvW+qrTr-oY?Sez`9OFk4TpO@*+x^x6MhFVo)3 z5!a6EqqtOxFqWZ;FiX6a6^7n{5(m}(`PFeFpz&Lw^!mnF6=)zUR$*k*E}|q{Z4jRE z2l|J9MY9w=f@IWfz3DGO>m{4!cU$0Fjs>ab1E>Q6&J{kKM$$~d0_LRZpNjbYDl}$Y zYHM-$s;@0PuhDb(kE_!_(RE}AGTcoSo0gsch-aY{sMUmL!;xIQZfUbsGw~@czSyFe z6YU+{W!JT+zf#=TJNXWv{?(067ME#$!HgdM_XzNd)m9ZZ#*u zxNH~Dd^-yU8>HNg%5%^RUiKOPClC6+agsVpfr5@`U2WIati$;%Eu}eJx71ZSv59AM zSkp83z6C0yp?a6_dAaF`&qti8RY>cNr+?u@ z>N^XT+KhRv8znggRG8UFMn%GgZD@M=D$bfJs}^1|@SHQCdWlk6e)$ zeKIYpXy#cGtQ&RjCF*WYku zy0yP5|DhK)cYyTKC1cf!;*DcE;)7bOGQaiB03)`(g8riOaK24Y|C<7t1p1|=#Bt>s z!OJp$RU@lsG7e>d)-=i?QW0pNQnlHcq>t33j`PBfh!>dE-R^9={U^_Lb(es{?&5oE zr9Boe0*O(7oKt5zKN&~_R+voxcI#~H!_9R?g0a8`*yQixYW)?Uavif*_I4FTOiPk$ z;sZe)MtEh%U0y$I1yFuFiOv=lr)2fToR>_g>2fzM0)l36>~b0a%IZ}c4DzF_?arqK zs7b=c9+1;2)lL#EYxlSxhw~b<8m+|dq^z?m>q!_?M{Z2N0dYoz(%{&Gd}C%2IXWQx z+6_;9SN~I|b!^`?lxqN?yKFcvC&~8$+$*tk*hK*+W-c9&FNB` zq<;i%Q_Sj8`>f&CQ@}#qBID*%`v;x&85MIpphzdxhF(3!{8lkV0&$fpPo!?Cox(6+ z>8jOuMd?De17&ctZ4`S8Y)gTDwT}Gt@djLOgoO=~O?o~u_fehU>Aj4bB9QS%#HfSM0 z3cw+50KH`DQK@}1qR+kTOF#108-|Jh>(L|Po8eekX;kaN5JL( z;XLC>VTB|DZv-NInZE=aK@L4FZ@%A4I{Tl~w$IG=-?)_BEC}ekb`L+@r*_^A}b&tpbV9`jlMxY#~d`(F?A!WK}J#yi;$RqPXo z`}eoMm!cf<7JV=Dz7Fbt-#(c_(_b*k1~ zTgmac5Qsp<{b+3s3f3MiSKba}M;AlH} z!VAn=3Ar7Vo`#h^$mGudj!ri7Kf-C-dTLgEPU$)oJj&$VO$~%@)O&84;MK3!9%MbJ ze{`AA`oQDeh3#K#Z|k~l44smSd2}KWl|KFJq|T^Ty|Z3^xlLjQ1BYr?=6@f7W1pX% z)G2~Ft*O!;Dq3k$R{^OYkYCXWdp4__JMrp1zv6%Xl;RH6Z4IVV^5gU694W#P9A)OA z(kBlGE(M5Q{s$-Zr8Wo9Hv7t+Wl;J6XERNOak9Cy@4fsVj};aD+&oWOHB5lAvrRvh zj>PrCY!nVWh8SGdtlJ!_qK#i!vS`o0*Bety{vSWG@74N3IC)IT;1)RX)E6A;-MbGy zuNnN*usX*#Gp(0|ULQtH@HpMKV+E_3{?W}*zsC_?pmV}9N;+IgIE^<_;O^g7bibcC z!l_EG%V>bFSe47Yx8MKu_uoxMgVVcQxoP}*>LOM6KicBqBgToWIafSvF=jje;0X>L z_5ya9HsLI)kmCSzjQ-yAs5;6LT=r+kLv0~u7xzET=gibKR!9XH&O1dDpY<3Yba7E2~qz0bnW}o3y!m3!1FQ57o7jdx&?u&46~|}V)-Zb6}-06 zB1h$^GY6Ws{-0M9E(HJkG`4H_K&SQJfBgUU_JR4`C!LS{qx<&aw18sNPNT2e0mkC} zeXma*0T)K;>4l3&{>grs8G--JG?0Sg{M!=l`;+2XFuIiXWy+VcXH~-$pFGLxL+F}H zIFE4Ec&*-7XJT5u!L3H0pvEB3p5G7s{VntY)3V3)rw6r&xwp_q;J${2hA#Vp+_j6% zQ4`Qf?}IGEi*Q|ld4Ko8T=d{S)?5dM3F;wvK79DF?uedPZy@i*hh;`f`sBFr+K+4~ zf!VpI@)yxx!L<8#S3_O}1+@V&r|4;$UPgW$-mi;d>Ac#`_L!->oA3=;_`i6b`mX^3LZ;|Qo$TSxMtyUl2q_>UR&OS9IY?hBH%bj!;h7SJP+20WRv4J z9LVSHNFZMksgqr=6_EfV8$}^_;yQMO+>WRi(})_m`*}fGlZ&5UZNd*8-!aiSd?!k} zO}q|h$8QZLP&4qiz6y1**?!Bs)A%R}w`N9I-cmS%PfM~s>HXMq|AX&=9XDI2*j2(k z4&o8J){Q??O(k%0fc*oqyie9$sFeHsA0P8Sa$95EdqjNvSCKOeG{F&%q)!lnOX#_OGTt zPcrpHEr7jx(jL1Y>eGA2$8TMaFrOKThE7hmyp4OEdQNnA=HYtx8@^+C<{P#e8G@i3 z0ZtrKO6LT9A!tpeI^8}dg~}qL>P~{>QdyCFAop$0$f25MD@}XG^Ds>k4;PneWO|*= zFBYUakV~5hEobGrapQ)*GV(!vtwzdD`5Tx=s^dth@r19Ne|}(}Z_)Yh;rH*{5gxw8 zDg-70s)F`r=7n2e@2(XWpWu?_G0{qYQ;}?=a(7YIXI(WrETQ8?;0YTdo;5yWG;ztv zrX%(ojSkv-Zv5tnysKBPWP$Ox=h@jsOv@ePbaSJKm-rWneDadJhp=I$n*w{h29ctNGT{hwM?WI z5rU|7n65qevi|eA``Ejy=b`CypaZ32;b(5lTLmtzZ+g!g4AZgwSAV|jd-(93t4~k| zH|LG7zFLuqH`37b%*_1RYVon>xz$@aafPcRb*2%QLuE3A?ZOWdBt+4GI1v(<(#lGuZxGVPkB~@mg#(Ypz@K4y$Mcv%4C^`sw?ef5}7*N!ep<8tZaY2B$(S4YcTDhdO3?5pOCFhQ{|`z={Ralx&)sHNnhefwm$` zmf4O3?P?Dnlf}L&lTvoS-Z`ta=8*rrBm2= zuXl6G7qc)_JUvS=;s&EsV`dr(KYL=`Jm*-wRDl{`p~oIa;A&r)pEd!D^hob|(fppc z{=56?-U(XKRXw(ab$3YK!_4YIw|v$Gm^W;UrGzKQO9t4kk#ZliWZ9lp-$C%0Jk^@K z6~*0_pH;!Yp-0Pe2MVSX@fW~V+*{!@bT{~NDQh6V#m%-sq`(0A?n9G>){jzujJb?b+SoCcfNmNe`ZIV&{ev`$yrUw366}e6p?96 z;=C_u?gYN#$fqVtHtq|&wZggDY4K<#!C0U-)RYCk8^$2O-%w~|ukSoSt8*c%etE$3 z$)ER!MTwb_HtVtWZQTV^6JOC=382>9KBg@nV>wt92PX|X9BB&5^4)Y;-_AtL06#Cf z9rU3jVDC73t^e)4Je_PV?ewu;1XhgVDLWz+NK3=W(TD0{9BLxXxfmX=4#!Fc+{Z1WJU!%cm@Xx~j=gY%jkM#^Py@?NBertf$h zzkYOkoPcqHB))%exnrZVKrc^Fg!U5GyLVN;1C3EOX=~x3q3004V9Vkj*~X}lnJooU zET?iX&*^+W>HAikb->HdI`kKE`fB^hzbBg9voFpch zt6;FOIR63E1Dh-kRm+W7zFW|M6|2BEkYh5R-P4>|HsaU!<12Z202}p01URK(Y=Emc z?O{lii6pdatobc-`&A*fxWE&1(k48Xg)aPS_=RzGY4;_^Ac!ut4wQ~Lf4tNl1+{rR zjsfvl?;p~RK?X43{hAgr!7A$U*My1I)`+lyz>wOD*S{s{M41E@G0U6dzZ-sxD~0hQ zZpqs8rWknpMV-PGnO00xgz7)@-DsW4(Q$uSYQOcQ#|r zFXzuqXp?8s-LLe-d+H%*Hpm62l%QZIH3Ui=v|x9kN`$ct!w9E!M&mNYhgKxw1Rvg} zI8KGcKU?Ze_bSETNjJN63S33xk6pd@_8pkQRax#fYE)?VFp1E8Qy1Zzc}AR}c{6=S zYtY;a!B9#9%p>#FNEg3~%}#0^Lxj#<;Qwkncb=AOBuO_d_YFwEf;R#{*X>BbTZ5zQ zPmb)2S8s`0J;NzIKcuUsv}o#5b^licTbxM!b}w@WP~?o>jK6x1_L7WkRxF>n%0|*H zhY_Nd@^PA2Xi?r(rxE!DUj^5hcJ80KTG2oYPi>10O zbzE(=a?e02V7Ic=aqrcshwS$UnyWY;M41$9*W(v27A&rW^R!|O`U&YZtFffLoz^I( z;I=J=-T9>vsBwV_-6h!`YND`7Z6DOqzPZRg?Ctj+!e5wyb;&93hlXNeD>DOn|eGcQ9edSpTrGVaRd$Y<|3!pxKEAj zkDS1z8(+=fF%eTQnrX6~h!Ji4l0=#2DmfJ3T(Ub{F;8D`OmAwj*;@H+mS%6%*Kvj@Di1$v=n_6XV)ml6fVAH_e#4DNcsmxm$_aBDcC z~RfRltS5h+X;yP}FPW6V(diMq&#WY1Ft=2Pr_9=e+ zz3}NCu=Nx}bNMr3v>P0JAZ>^c_3k<3Q?2ebs5awl{mdEVB=+%2S^WhQ@!bMsgGc(6 z;gVoXf^fPBdsh;a-%xvN1P-jJO>AD_M2$8aH}%r84liZ6ar9)&MEbREFHBX2&4Dta zC2o*$`;BWCHFHifW|bFQ2THYy21tu(JD78^Uxl#2`zmAH00<#nmRmn@Y}#FzebXAJ zUac^S9Xo{<9#&eU)t2XmlTqBm0T>$3DBleMYn!%Sn}L}?!cEAFJ z(V+&Al^^qKrL0ml(nU4pQ{`I9-nvbHISiX=W+_Ste#`Fa9AA1YuchI}L-`a*OaXgE z-0RmTjY}uRlC}s(epsjKssND(LnP0I<^~=#2=Sl+=GY~RU^+h~e#0WcE>n32>X-~m z@kPe2l>5LD=1RXRjEk0Z9uYixoEFcl>|h`&plbeJ@h}0*bN&tTy$sCtfcI-Q?olH` zODmovx``A%?4U~&QwYu0h0I$1x|G`w=9>b<(|7a`R&F^JZW$wefTj5T49N;oA2eeV9_7q` zxhH=Ve|)x`%dO$A;RBO(Nh);hloWJ%Yy8oPypRT2HK2qC4Gjy69<=nkd&N~nwF2VT z{y~|9nUPtoHBV>n(e}kJUWIBJNo40K6U%$^ZQSg4kc_T>CY7{tV4+XY1UwAbU4Uq_ zzhIP4k})Oi;6yInnx{hAUOM-efz!y4Zlk^~LbeGqB%4Uddcq4gZdz^N(ttb?&*o~) zAaz=e{?V;v?WVCR-0%4EW$B$2wPzHY;rke&hB&;FXkPPV{kQ#qoVwE|*{gwlUSpu| zvw?hguzj&!F@{$&c4+8mFOrP2s97Ay6GFaW<7~2E=Cp)QH&xPqgMZJ3Z3 zu?~88RKpD-jX$VET(%@DwL$8loNhO&RPKVA8jc&`C_7%}QcqB+s=ZCcXHfWwUc^9S zeFn{2EeDCX94%rguj{nK-T*|qJc{CT=p?sNC3{}7W(7Q(e@a-Gn-Oh4riiRxRP*uc zr6<^Rk12+8%YCnG7 zdmqFXGZ7mVb#|er7-fj+JD%4OCjiy&6}DXooQMR1&#!}LHUoZ(G9Wht?6~bfpnVX18TtbzBoDZFeKXdcgXr5Khwj`P<%_B#bA~ zh4U=xl9$Bi3Lf1aL%T279vL+?i~RYv&et;`cuO)WuE2okG+hoY?tF7bCj%`rC8CN51Y*9U zS(caygNy!)r3F4Xk_e4GL!6ELicU54FiG%~yqoVde6)Sh04f@)osSjW3 zyU83H5!$w~*n^i!<8+qW;>UfbH{y5z;t*dvmRwtSUCHz>vrNg6WP5-8c=B~rQEAaY zC`CO4?=&-WE^{Vaq=EX@HJalYQf@rTfqg&=J-U8YnwCx0F3q$cCz4IdEFQL&{pPZG zvxh7&?)P>!R=CY;wqg}X+ds=R9VBwNRrh}NO#Ow@=J*koVj_RT8}@_)L(XhEtcs|n zf%u!?zH+ZbOxnbE!@s*=@w4Fx+nF2|mnbXc5U$fY&>G-h?dveWanJb~g<)aD4blEc zmxP@yg~?M3x!w<$SXEol8bPi%(Mfxx?Ab;Z-} zJjv?R|E>Nlc?4a0Dqi3JX->o_apAB7#>&#Vv6wlkjJL6`{1w^fJx7@VE6EN|GX*fAKOYFYN4p(~=$ZonD z&Iv;a{>qs)?XmGmVma-J#mJ<^Hubt4lz>(w8!lhac%2;ytNtibzw?G!ZXo}CTA>oZ zBslDQ&95o|6>&D(J9wPCnlQybh|gihOhZMmnjJp^K_pzrS^Zy%(T7}*k^o0 zs;Li1Fw`FftK{nrVm5UYT)gZEQql~bCOcYJAiHB^8aiAiU_1x@z~rz`Q}f&23e1-$ zEmD$t`9=>*AFl+{u!za2vI0br`A?DOU45(>&=GK>{eG+^^T_~lwH?nYlchcgsl%tC z)c^wfWFnWn;{?jKqtCwW=zMqm(jOcEYq9}Y&~0AS0kl)1WPeu0=)c_wVTZ3fSZ{5D zYDk@Y-yZ-pP>`1a@jb$zG}7ANu#~yXAlvh_4#kd-R6wta(2Dh=8Z^x}9c$n+opRWw z;i3=zHRdXvC{b0!bcOOXo$R(qXm~izthY-Nb4}Uuq9CkOrr4q10qt24q{z;3vJ{O# zDl+617$B~=XkHd^8uf@pjMidKRMZds1Jm&|GVlX)ncM3$Y0p1}TFJ8gsLtE2F92TX z>q3@utM2sQlB-(CVVU{z;;#^_O-9u82vr^iq~X8Y<2tDAs@WVR9K;s~En#;Z`tyC1 zUiL{xGzL+(#kRS$e+>-D!ikM*P))>GG@Yi`!#gB4wl@+o+CjQ{4FCYAhI(lgczJkC z3;n6^2v8gc%uJdx!ympZ_v_E+k#DAFPPTPxSoKQY1kVCb+6LJ zQY~ktMG*L7hi`fACYC}m_s^d{zl)zKS5_Vw>_Z4h*Y6RxYQ)>3oQzqsRwfYPW6y|) z^+!MN)fVMCFkCQ^SPg0jo9}LZ(b)R}FGc*E09-(s8Xk9)ct3};FBDL znS{8uh{)Hie5@lCF)S{XTD0s^S2$-CwB^Rdjcaf;Z{zuNO>Dap`Tq?{YYt>M_k8(d z=k^u^gs9tyZk4I2DN)!WS6hMzvQ~6fykXFpJyWG6lD)!E&W)xs{+h+@3}bHB#<8O59>VI4m)`4g~zQ>OjcuW?VU>9gO419!1re9qpk+ zg@Gq%&LWIpM5l@!xfURuBDA+757E~P@cCvZUP8WiTVESSnmj95M9d7dQe?wDG-NF z!+j_;sZ%+A=CY%UXW9whm7~jUSV0O3^0`3_76z&SkL&1mzJ`iHx{bzDZzvH!icsRU zYB5~rr~L)%DI+qvpQ7Wx%epT*&wkP?{s_Q#Q_tlIArNJBztJ^Yhn>%&{d4k|skj4c zzL+WktCwv+wZ$j?7p!D#adEwNX|%%9q|~=l+`FLe1VH2zb(K+s_1U<{+0Hly0fY9# zx>VJAZRd6B{iS^7zw(@CW8;zY-HgkjlYgY2UH?GIft7e6Qo#ZC_Tpxkpea7vd0m5B zJ@#{BqX{1ojE#OrfqNUs!;f!g7xO$y)23#;#$jl#-;qC5=TD%fWC`eE{7Zu!)(wBS zvD0nTPmIstv4>vjFLnvsUg@&yqb?1jU9wYiIb;V;^Yj3<#R0@s_HL3Yi9}@ovDioG zx?!k?;D5_39<@Hx-j?E`9gmhLj=9ykeYK1-86Ao%C-34!ev&T_mv|KX4r}GM>42x`#{04E1xNYf+lZ?cbks&Mc$y(Owm7cwN1Ci zoabE5R4eqz6TRnT!5JIXFVcJ19Osuy8pU&b@Wo2aK zK|$&u zsz4QS^+#BXwMyjY#z}3D6^EdBH0_V%1=77_Il(Q-Pa+BC25PsJmD6f$BJ+BQO>_!v zASpydl?`g4KDJ1TwNyZHmHPH06UaE2X?ehy#U_|kCfBR>SX2BFjW_1$o`)-8hT+a? zpjNI{T1jL3g$aLCk|;ywo+j|R(g2UF*Om4J$YM>9ocU!LPmKX2<`I=&0=cAdgw!@R zyxuN=RC|BcZCKRicM>E$+QCpyJY%VCdO@3MBR#UW zY!FY-foz5BvfGXma|3>vhwUrwD?EDtg0RC=xsn=Bf+SIbBvc#bVyV)57?2`6O#*QP zXN`UbqwC)0=5GZuK?f9`g^61&YK=+9u=Ce(N+Cz6)>9t%+E=Yk_}x)Bbc6IZbe4He z#usw#0Q}p^r$>?v3-s1pkr&SA;D5D7F}&z!r-%ebE^-K&fHPavXJ+6<% zW!<=Q_inpQwwiH&qNLNvl1ZMVw@QjX7Z4Ywr=exy*XyCiv)zm<+e+pr3vSd+1`Lcs z4u^mXs&8+^g>8~mI5;`^KIONJOhIT2p{*n7rP5Ec)#513kdl5qzk#stmu}dX?VzxUn^`lw!GSd>x^KA{;jo0w>x$A%>7{8StDtuq;y8aU=d$0kib z?`~W#A}ZSJ%SfHr{+pS45IRxgl_9R(CH8?SYEaKX1lrlCX%x`XZFk|(1Y8NJeso+c zM>8H??pVwpLP;(r2_VIs=`YSKT%4z2QFszWJj(V(>mU~_=9qth4%YspE<{j5$w48# z`?KqH{mk+Z>=_^3xDf*@w$38}5Bt$Fdb}&-{LA6+Vw*S54de%rj6&?F{DRyZLj*I1 zSjA>Avkf$`b7s$u9E3@bbVV^yTGt4nRrUz_mbpJB9@}34iAx=4^1FrW_CB{cR{2m_ zx2-%&{MVy=6{ic*ffLnl^ZUxr;2r@GgSF6$$1f84?T?ktW*C3(#?)+HeNWA5weIna z)vMZG3&Nn6S$p%@%{vF6(1h&>8~ZLHSr{4l`}6fd#}%+gKUm+STh0JC+%1Ls=#4+AO{H`)g{ z!z<&}@>eA%p4NT)&KkEoTG2roGP-{&h699mQ2=@mB`u9NC>SsbnsK=)5Hvs~{rKer z0H|kUkG#qgn=QYiqN4UaEJ1y#-uhS`?0(wUx%v5v#&x!D4Q=co{SI@*&R-#LCs-4D zr07Xow849kY89$Ye&VCcy}Qc8gILOOTC z5|OW7i5YnNVnD&&twjsxMlwVRai&bQJ>v;D6~lEaVsY>pNNCZzZ2eH&Fm^joYK zfP^ypdP)rfXm1WPd`e^ZxK}n<{^Q0CoeC}1LB(=d>Ugec;;6GVdbu1g?RJ3E@h{8p zLS6ZbkVc(74s)J~$;_J(Ue`!QX2W%q>2u@2L1#|;it-WU#34u! z6mg5y`sF}@#^gx)?q(iwe5WkZ`aqSpzwQ~}aF4z0tMOco2NV*>>S^t{{vcp{s$6Zj z!BDXEJxPI6Iz*iN@jUT)S@_r6aLu}M=pmEQTwCdk^6s^>Sz2#}oemJD|Fs=2mUt%_ zKSqSh@B>CecK}n$S3`P+OMDFcu?gS4oi(ntJEi0RuYd8fqgq5ks7^-@DCZfHY7BFS9Lk^r%+|# z;dy{_?#O)esBsa8LK=!r+>(%v^kBPp*WtwZ12go$aC0cWmWD}60a|5yET0gNdyJ23 z*yTHcp8>r8$Ug9UoDMX)8LLlDWc)n;tvu3$1x<(u#2@^{m@*D=E^dsAAymviKT>+w zqPrHlK2svXb)^<~RCuBD*BQ{t?VSw$BGsc;^5j0U2Z*5SB0Oq7mKmf(goZv_Zd^91 zSgT~~R5|$3b-W5*a<4)Za3Lv`Py_KrGGbithfD;hi`%^HBiW6=?C1t1l}z1a|IwPw z1!UyLWh_#={NRl?X0k_KefkMUHa0b8*@1B9(<4qP&y7-lAc7bzRv7#$gq{a1>!8ra z5{on5tFUgoqRuqK(-h<58?m_@?s4!}3s(o{WoOke@zg_5bQpZ~>9m@jUaUWPS?xkj zH+VOF?wf+C9AyfRD|%2amBW}~ye9_l3>$HR%`Hd`REP|m`WTb)RylzWw0SuxDlB|jLM00L&k*YYK`!nZ)a+Or+9bET zUk7B%0}+;Ra{=f;VI0tAFv9MD=_FpV9VEt)3YY2O?B(&Djhlar?J)IkAsqxZtW*>g zIIEL|ibbtvIwg0W4OhczxKg#gaK{{@rtcK-alO|T!FnUfJ-84nA!BJekmqW<@3S3! z8l+X4P;0ZX8wBENLyTmrfob7Iw`8PhQ}4NR=b{14xh+j5@=nqr4e zWzO?hao*M7Uc3@*_tA|r2c{#wcvd%NWH%Q~alWs#c=TSc?CT}(N30h<*6%D96snun z;2TPsUjZ3f*p;pXX}~>thW%+7((RVEN;#W;?MHS(UtPIN-8NB2)OFSfKh5)CXe{Pv z@d<8D&dQ@-2q{+@J{Yb@xYo;E; z4@@| zeIb#FkJ5yb0ybXxx~3J{jDL#h)=0S{_rTD9KyDP#JU8M~PAnaqMyGX{+<*n&Do-1S zmn)1zJV%;JN2CYQv>4}Q`?=v2*WD@{wk#`Jv32 zIk{P7($TbrE)Dzk*67=QgHbLnu68hLG<%UjKg%^+ZD6}lUea;Bv{*vAoBUiVL2G30 zB~^HqT7SDvnHmEW)^uEq4L5_Gs?x%$`o+%8)-NwZ%T~)4#@zPs64;S${G4Ykn{~!u z`e@g(hu?~4trLVbCITnvpl3SB|-DnTz^$^SZ8Ap7Kpud(uZt zNZKMl_9GWn@2K%XZeww?LZ$G#Cb;m;J+~c84}Bp%)AG_zvj4dTxc>wM?Ux>;0GHir zUn71I6V6y$C*g3B8RR(e&5>9R6Ma6<)uY2#G0D4o_F4WU89owefQ*<~`i6ne zW=n5vrLPiy`=GmBhq3svin>))GqHs@N7VR(3&~K}-JRKrd189-j&3Yo)**Tc1a zNZr3yMby9G!S`C!!=Zn+c;WCJ`3t*yZJ3OI|6_klXP0OSH}IZd#CfUpR?Ag*CRyI- z_Q1{+;GsFM#6n9TgXb=!PgqeeG$&H`eb@A^e&4piD3MDW*AsOeCtw0k86}Sw8DtN% zrRM4v7}#2VynJJ(p$lk#?k%oY-Qafea&{}%9PwMJL5)`-R$$)UR*b2z>dg;K&+s4X zMtEdGGR;e1wt+A$jN5#*mMuJ6jREl-QRF;Qc^?#~pEwn`N_3`f+>5+8_Tc{Y>5`W% zwngTja>X9hJ)5>2wrd=U(|BE7vS2vs0B6yR8WCfZdpEsH!#oC&;G%I~`^9Z57?<_< zdsq(Uf!mnM&kQL8UZP3#KyD?4@#`8wnlpLV&>Sv=yMWY~5Asz4n+w5(k4T zx+F6yZzwH-FPhWqe&#EYZvHg=XH{X1hk5Qz3wZC>SwF^%27@kUog#l@+~LIU>6|`{ zse?;q1IHIC1NL6&ho1kA$goNB*)w#As@AY~b5f5M4$Xk4n_`Vyf6a-At-?Q(NLxeL zBcxf#r_t~{iP?^cng6wzZFj!Ro~id~{{B1l#mPJWd!FC)zWllI`*$Fb1m##`Kj{xTkq#=iJhCf_xyvu^VDvq zn|=6g?|Jn4jm%fO{re04#Q;;wtG9Q`({~p~Po6gCuhsO@^_wBlGx2x*xxndf(k(Mz z->l_Re_j?_w##bz+ghvV-}i5yJnO}insrzG)c;JDnR9=x-?_KD-qbvs1B!yre=4n4 zcKZ2+&)csed~ZJ}hMpHcy0h-|x$<*6bKYOJd_Nzoz2xa%Z=;8Qy^9L!%I(y_20Vut z@DFMLP%~`};NA88yxfGo%QZjuh)13I@kLX3n%VV&TOwzA`|Xw0{pU@3eBA%k#T^#G zE#>=V>^9w(nHGM?xqH@}T)W^-tNkrA_N*-{dpD6|^REk&GrnC{X*fIm#D7MsTC<`B S648weK;Y@>=d#Wzp$P!@`~pw_ literal 0 HcmV?d00001 diff --git a/web/projects/shared/assets/img/temp/three.png b/web/projects/shared/assets/img/temp/three.png new file mode 100644 index 0000000000000000000000000000000000000000..ec09d41a1cf624502451892f446f8443da2ea21c GIT binary patch literal 336622 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 K&t;ucLK6TzWC`;C literal 0 HcmV?d00001 diff --git a/web/projects/shared/assets/img/temp/two.png b/web/projects/shared/assets/img/temp/two.png new file mode 100644 index 0000000000000000000000000000000000000000..3aa62e5098ac653b964dff2003031168e060c1e3 GIT binary patch literal 1741287 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 x>UJ4 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

    caRg;z7#14kNdh_=04%J?-k0*s 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�jly5# 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%0D?lS17-%WJU|H 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�}I9E34o@j^IWvu!!?THThYc1jyFv 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 z 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±V%<;tn25``b|lYmF3t=24)lTN@4a+?tBXY5T}av08c zgRRoynxPhx%NS#m-huH(3R^1cG-<;R%-`ZZWpSC~v@O_5;Q$+?>gt#0_aeDi5r!1O z6|Ud-T;6$F4W4_158J?=xL^)+cQSmTPHcECXeV@g_(w7>P!tT^a3eigfG>0-?4n(> zLxrXn^)?<|DWAAZ-*%;_kVd&Jf2CSzUR+l4rWRqYqd#|O4+E&7O|cvc>S)ba-ua(1F17SET60f}Ps ztSbe?6v-99v`lzV)n(hmJ`3-Esw@1Y$o{@eA?p|}WD@DH8p!^NHQ!`4wP7 z>3f7ub}nHoC_?wg^VAk&kkaN#iG(k*f1ALrJ(xf_(Qf2Q^|qZaS4X=$nU5XzetROi zf-5y#e>@9zJ*n_7`1F|Ycr{2Y{#r7yJ(74~U0W3DPNKh+K0qdA!A9d+t|Z(nj`w}J zt?==Wg!nke#ad|SGZmVBuEO)8pTXr zXFKL@Z~r%Sp-$+NIMa~l?X*oS`!@v;KU3gQYVY>N5Spm;{L43O4V^}F z=KI*=EL9fTVy(7JK93^T+v$WjEztD&+V)4CO9ms0;nR z@jLPtIWoa#8UfIusRiF`EV`F~^eI0;R{B1jSAX_k7A8Zd*IG&rK%G>PL^)ze+bx_z z)-Afx22nD9NV1(ymbDv%ze&S+o-`1mhj1Za#+1zhrl{!Ip4X+EI&Od8r3Gl*sk?8_ zQtG#?J%vFOnFCn4AO*%^-o8II0*nJuc(jS8AH_JQng5)pHy{AqV)HeEVFwEYh0u8I z(lr8JieR<wX3S>xO zZNv$aeg-3;R{Y>>trKb$ggHRj4`eTrPdZwbP@uj#>wz`;bB(3Y_&9+Qe#DGqKtSC`9 zOUvW96FnCbsW<1bUMxzaF=(S1Pkv$0s5GGW&Us4KG?*YCE<2bsL)Jabx>ECWiDGI2?m!;tvQV2xif2-@4?Tci(bai!m(@~#ETUTjSH&RaL zILxOlEWS(UeI_1)Nbf4uQC@ejJbcQ0Fr~ zZDtsP|Fj(7e~`naHX;ERjm2aChKA?t=Ls%jw=)=(1UdBv0Uayc>pYlpeK1Pzet#%Y z*5?zND@Fi4e6Im{Tbs;aKq3u(w(N2{zk$d81$AdIGVTC~w>dhr?~yg!q;;?qG=9OA z9^lTWZSPjv10$R1;)4zyfMxj|$abP>NQ}*rH3eM%yQbBJaZs(z0}yAa&1$lQ>gN)D zzSJKrrxuFn^|w{WqEW6}>BsGOzv6o+KWZ)%$fP(&d96F1Hebl9Up%2tTUl*g#wMcO z>fDa|$t1!07u72lO}B#W*^d|{>J|y5^zv#w%i4d*jBxT+~EO5 z2e2_br0fY@yZZcAb=S`c$tSPbJ!VO1W0hE(d88e?dJ=zGmLM!ZdXpRV(0fPF>5WYkN zEF3xoD!`FBztIT!@p1O?8Yq2XQ|D^`)P`-%6^m}vgN?@q!YlC(*rG(+b-vw~Yqi;V zF9FX(b(Hk7E3+%8C3^trx#Kg5dKszARMRM5UczOh{+)8LM*R{%+2d^ zi)p%D^1^o!8m|I#-eiwOA?LR;doBqu~d>O<3|V0=vJ}P z8Zf8EJMWV#BbBB=`um_S2`s5UG5n#JodRidTlh+waY)!6hm=kG_zFCWLTKX$BB-;5 zD3)W=p4Z#Er7uB_OI-cq_}R&(je*CIaOc-(?>*AYaeEx3&9`rB60Cw5o++ykA{Wc^ z^t}eBpUiP$6yq-#nNG~O_T~`Qk7f%Kp{bQp%GC;6HeBwP%b6oOyxhaQzI>laLsU2g z*Xx)}5m0w`@fBVNB7#qCBH|tG{ML$`=&Li^%5KlNrkIgXABC(^IX$AR4ZAH3h31J# zQUbpJ_CH2&K3yFz&Zz7##%=7j3?`Dh{yn%;XtR**(u#7|kIk4C-h6`%>00{1-1VtO zJZ_Ht%b{I$7UuIW;Ek-a1H!HEb=P_`hXx$?&f^o1NOjxYj1=} zApT-)yjCI5qVj3*0ydwb*p0f?C3233YflYWBrSY?Nwoh(BeY}&Y%UelDkK=~pB!=q zs~%t0j^}O!OIFa$W)!l_`1MkPQrX2e9RMB ziDR_Xm@fb30;WjT9SG%#GL0;Cr5L}pk<%@z|521m@hy~Iq(1An)5e+BAcyrH|0%GL zR9uut&8L8`L+>~+9Vk$%<)gHJ2Mc6+Lsu_fgdf!sG9J_Y=fL2uvE3U@3{V?FN^=#|7~3>&<)^MU(L;Gi=_<`#ZR99Y1Q<+ z+>*?*I#StICmS^CaRwBqCLKkm9~o5SrYa4eqnZHFrqFUUpn&5meh%_X(rRFjdKtVO z1}~s4yqcXaKTcTf!J?Wo%DD~keW`T+R_{se=Kto}UjbWsfJq_Fzb!lZ;bEh8Se-{? zebE4o`CypbVSkL2$n_G8?CcCfG$abvF1J*Qqea9iaRf`8$sPH)5>`t|r|wJX#zn|y z(e_UnzAhckuW1|GX)5OY?zgz5jh_%gi)4$xOW*5>Zj1x+7Kq;`)H$dLQF`$Uzx0za z`>*?Xa&;6}T5Lh>w0B}n3d}lf3B+bn^x8Ec!`8dtM@4fJXL~1ZhFI+$cc^?W9n9`` zN8iQ`rgrSEf#m=$$(7q2#zSC^({rQ**!wh}QEF?KEDzL@X~sffq@O+Gj}}t zfA|BxMOW%FL5Vd7q&Y6`?nY^RmBPvddAG4Q_5kYR<4B!zCG&e zy+7e}%0jIVF>g{i!!&mX(KT~&P;cw=kgeywX;&W;o_yV4#RibSG^+axL6VjqC$wsK z2t}xP!w$!zLmPY}>b3D#zQ9sb?T~pQ<~e)updwi!Zpd6_UGh=0LXQr8`awD9Gr6av zg|2&vtON$t_q7c2W=r2HBfZ1g*?* z*HvM&RX&~`epUlD&DWCGY<`~r18{ox(*$9>TeYNbS2nx*;z z(#K!zC|@UzISa&IioIJ`fkqn`+Dw?SsA(V24(>nZJUL|w@nTYIMNR&@zc?+*2u2EZ z&R40^>+~Bzzq7yf-T1M0P3e=|i{BtKDHD0o|3AYMg6B>3w7)!dH6TD{LkzxkcND z=vnEL7@lujgSnkb4l?z+(%u{sGMAfX=UU@#VV*=q3)pldK9Ahz^jADq7PHV>SmXBY zg77VtdASv0tsBNnXRzU#G985yxIAzg8avf%4@8$1Edo-SYzfTqgJV*9tFW1uMCHIp9rR0aD83~ zcyRS<6)NS5!hb;^oO8 z+3OT|ilcwZGou^77o4iL%dMLkNk#I2^QS~9-Zjm2e9S9yA2?YkkY_(b0JZ}UoaQ)k zCtR~_9b`-hd5@du{OJ+xo93 z<-uIg=?LE(U^HK#953)*yzJ(5HajVhob_34)dFGXHIHLJ##ez1YV76=^u1B5dd3Y| zgui@XK|`dz<#!-d2kG5$TK#e9Y{SYyNhf<8h#vs*G56@yYB(usy)G}}iwey6Z5n}C z&^lWjk@}+yF`88)0&u9C`SPUEr)x5C*~6+)ula*%=FR4!$d6$^>WKUO5~%IgAe$zTem%@-fyVAxc^B9Fgf1w|M?~0i}v`@&xb!3U(6r*Y*{8z zP)^4L?J$Jc8x_zHCrAA00t z=|ZBpwgp))6f%5YvqvASSBFfkz`#A0@=3gAUbw0t$ivc?Yy)6sz9`V6M|R}QbXZ#| z|HST6f4o~X>@S%%^%`N0{(N1P0^sHuOBxS>%R2L@0Gb;um8V}|`2?WZ&#)ipvVep} zDTlgQlc<&pc`^xK3bqWrj7n0?gZ^;rFuA1mqMe;dz)xJ_E z1((O6&UKJ7j5(u?UIe)#8HUI;X2gZJ*$%#D56mGOo~$VuRbkm+yPrKXZzX~&bQR9! zwz~(g+a`0rJrymOW`42x$ZA!^fv!xQ+XD-}>P#kMB5Vbk8&(sfR8OXKt3@uA>``Y7 zr6Fme-+|na7j~AIvMt77sa~ozc{0JXJ!?_+jyNV!l*?pOUTAeX{sdd%bNeMnCJ2-V zMjI*ehmAnQsbHiu3*|K6^Hj@Mgd>qPbLDx^Pw$MVA!t`yT;SPL8Q0*KTf3-_Qi|xn zpq587j3u3j2L#n4g(Nqpf_6g}E=uO5jMrS2`y49koeb)Z^KSKCJd+V7Lhl_jQ-$)a z-<^1O7cd)R;HHqY0s|esukqGHj36%GLwy-b2&(esb;WQPe!1Hs_nz($DyZxZcq4ra z7()ct(qVHK{xF>!#dblm<7KEEl9 zE}s1x;I_qah@G5^b#)9n>YB+5E?t>ie~SI=#-^KSFn4w`)X$kfBurAp4t_a|W+>Ym@nq`gTD< z@K?UZ6o|D2!JwjY8UKJ{OG!s9%Q&`o8}7B6Hit{1G>w#HO9RHF(Q(iVg5_OWC+ z>ZF|+lN3wy7fymNn|z|gv#2*;Syv=ASi>;Xb)~@<%VIb$tO@);h6EBKA<*f)+M%XE zdtJKP@lFOPFf1*W>uqqc;SnR=B%stopDkV4c&fKW}oVSvWV1YNE&uga9Yl<=K zu=BOQhf|5xJX-_GP$`-6JI`HlVD+_DjODr|cmHuh2N(y@58FK7pJCuI8=#w)*e1ND zT6M5q0XlD0!8}T$D>}c3$ba_&Kp;_##^aQ`|L6@mqW;7D9*>v{th<}(2we~WaT+V0 zO7V{WW7t(GGn@5+2KwJ^>}-dx^s?{hztzpZUsr#-2sibnz>9synpzakRz<-T?9l)9 z#rMkQ)!k``B`^F!Bf)x3S4l>~cgq|wH@7~hvQw1AKj;t(?xb5PjI;za!m&FzPQ(r2 zN=ViI#Y0n&XB&VjkwFMnvwK(y=1fcN)jiLo|N2^=*|0-oXKHpPlyL#~Mt}! zj+=-zcorvqBfi}iCVtj(C(S`ljrXy*p!!L18#Xe`IA@PCWkMRV7YP~%V<4K!FX^`9 z&0m#hI;3YciOIs>31UqBHK~Dr>q8Lasi>T%`*P?z42DRkOuokOR2a)~m6AY_UnpwQpPT zfJvXSI%6}IlpRe`H_qRwM-0yE0cPdtWU`ay+#F2It?)ZyKNU?x$NSqe8D8SEyOSjb z&mNv}@kCj1fTz(Grr25RmpOk_6k3}Bt%3i{Nr&FL~oi!G{=FL}T zbT_Wjbajbe10T6B`p;U!QLLR(*$ThB8cANOJ^Zomr7Z?I8eAK+Y9RT&Yp}J2<3ML1 z;m?uph7UPB%l*S}{ zh&D3jJwz8LzOblN`Etml@!681Wh0~6v*r#7XXTV>RGgAW^xi-m(_69(w=Ujex_w9` zwCHCk@gFHs_~Cv%Of7a0bwCH&T_clYge+um!rGt%>$LC6LbS-&jQFJ`N z__XazQ%s_oPb9pi+tAk8!g^dXj4>#klCeDd2wK10m}ntZ$ZogI&Jv^Y3R-WjIg|+0 zYoiCbr1S>HuDh{`5Gp#79zGijz(H3zgWUvuk6;<(1&HuZ`diQNSaVCufQiM^=G!YM zX2b*enyPMr%g`8ydSB^aGM%#1y7jGnjeWt9s=(}DfmIa1=m3|Eqy!{HG)4ULW~&<7 z^wrLPI76(dDfjI}vj9SMRc)1|j9C}GbqIPs!uu6wnJ%;R`L2R&8Zb+Qs`Y+#m*qsIxn|I- zTe@$Y%jWtMjW?x<-u@6jdUC$zAq&oet;+l3JAEPo8W-%Aa%9>v6~=rH6XU%)HX)zW z9W8M`b?)-6N3TaT0gu|}L`sBL=T<4k+Qu`!@_4PoKudSj&RgFge;`D-N#i>r*M-b9 zTwos{yA~k;(v&HvH7{tsDaC}aQK*?r#C^Q86KygN`Dj@6ti}@vLRafr3rwJm8x*&I6oyZw37972!$<|ub1Ap9;MmNr)LRo?{=|rtSPO+JWX+d=rMU%qgp0+$ z2#|B}?NgFe6H%;+6;er7z)wZJ%48RbjD6^zLgm)VHC;Z__5Mt)1#EN~*UN7}3k6Y1 z$E!-=0l8BK4l9`~#$;?-Zt`sap39aB^jV(fZ|JPWIRdtIbyaxlgX_#yBL37C$%2br z#eJE`F?|dY?oia0Q0j3dR8@UJ+3CehoHR`8^Kj)(wU8P@E+N<)546h z+cv9j@#vlak*pvuOF#2BY#7VxhbILT5-4DYs2%ragqh6iWMRG=!+q5rXB6gv6T`NJ zd5j{?OCft-rB(CYkHQt3PH(QEvi|#)p7bu_!iCccju3JEkJ7lAO=Jp4EH%R^nUY|4 zzMf~|QU6ht`D3$0w9MOr38$lFeNVAKjz%yFc~^NqGS^WJ>wZ$4aIdW-RenW- zYh-2&0HwufN&d*MFfVDRvikGOJCawnxmvQw>*TSz=;Z8K6$+MQOterD^w#Kc5ad^r z!%bXst6GnT!94am*&)`(%K!dI5E?s(Ez60ZH2{^>C1dy|i8)||GJxMDL-$@x? zO|AwbYlt>}whxWTgH>RJOO=CM9h_&2la$pelm{3e3OMdFxanBZdCz{9=f9nL-+e*P zs!+Jm3`dRRFln!sPlDET+@HWnW$ZjLw1~8!`O71{GF*sbYUTzCQ>R0sgQ*UM*6q!&an_3PkjSmZzv`Gs< zlf6Aiut3I6)v32R2)`{H#IWj=+7g)=KL#KtDK`d<*A_%HSzYv4fQsUSwMVZJi(sj= zqgC%fi&i=r213Fgr6KoAA4%6?7;F{!vs5Nfa9+DYhmHh02k^1tnGCkloSvgHof{=@ z2@<@7$p*HuuDyd{lcEb{D5ZOp7)RrHYL~9g6`Gq&<#EHiNgTT<`C#Yi`f&cPk`U6> zx{DKJJ{^mc%{lh7`vS>p$L+U_9mN_IX|nUwG%CW{l+tk&DpxpkqpYl=;Gr>~n*}c} zH<(gxAW#MDOTJja3tNtlVe@y3VgXBeRl-(jU4GM=JCV7$*$Y?t&%;afJW_gvoc$%gcl@i zG^7Ll6{hd;r`qj-+zBiVT<%t|$Tsn=g#ii>@Z}({;s8BeYIf!hwpZWv@u@KUWxf4b zEZun;lUpE6##9ipP8ZGT+ znZ!UI5LAFA<6mQ`B#)9`K^Ui>{l>_^rFc~YZD$(-mRgyskTt%@@PW5GbpEVEbK!D$ z?s)GaO~o==E_AF@iwW*d<*huxpn!Z)$OV^bS?G7C>1Wg@kS*~pmtrLjQ;D`@Mbn8> zUE3&;zWH!L*2Em=1vZaUhhBE~QsOn+mcB4fN4)gOaz?7{)fw%N!0GB!2QJ5#62>GD z`@*YLfsUZ(l99GzBp#o^FD<-s9h>&a^CfwndVz~i7vXlW=(KOTq5wQ14g?<&gjvR( zcG9YZVu1ZgYkd5y;p7`XLvsy{0#6c8nozF9lhfvo_pS7vLrph79@}!UlzQGc7Nsx> zmM!~y3uaNRi%YG;Q~T(sx0HB~@}lUhRHZ~>ErjiEFBvBE@;<)_G|MU2Q{;|v((rG6 zTorSd)g`!@+5UN8ut__{uES-Jl^#JWsYP0m?MzYXJ(S$cCxGdA!W9qT)Z;mMEzWl` zrI@yo8X8x5nW1=7(L=2$EAAEDUMMpu`;lDNXv$Bl_$!n+Q(pifT6hMr-_;|4*bG(m zZ0tmm4Ng$^GLP+W2l4Ly$sw4>K*gDoo^CRvRpaYt^&6^DL^E%&e*P{PEi~c_lNHa> z2o+$_niE<{(^@#HQN>AA>oGCP1Kef!dVY@|`3-`xP0p_^O;QqOO7{b;dTp-KQFoG& zMD!Z%wNxa0S6A&&UqtxOY_bUl9w%dQ3iJA9rnMMyZyOrDo?EvG(8_>-5TOk?Hvy>( ztzTLVGz`o#fZwLh0)#Uw3~UYUeq)Bn-(Fd73CN+NUMq}Ep%IGTR>Z=YZ=u?(kHWfd z50F-G!0p7`;4nRYg$ibgr&fpwbmqhI>`Z?bU`dU?3{Qv4#s4Fb4GC#6COMYLmECa{ zzRfmYX&owOtzI+lztB1vuuJQ<;{GXKm>)aSLa8frC~xdLcxpfRlsa#F~ z2{k9PZX~b0VvVEGn@LG24(;(5vkTMhM&$>##|xK0Ke>xwo4&v!@S;Z!Kc#R2EG z%Wdiap_OBkh=Jsj^|I9NNUACmhe#}bf$z7YR`92Fb3c^huOuV^eUs0n0PB=m+5=h|71}?C9TgO zeNxMDjzySM>ZZ6@Xu^`lr1PbeNkmdQs#zxD@9fk z{-Mte75nys%PdL33Ka968m(FG8cf(IErnE!P?=gLw|!hFV>Pq_z=l#da^tyZ_=^u< zm$vW#`7ETafV2Gd11wB2(C?FKoCCFQwdh~0*plFdx0egj@f!>2qZ{9**qiK?&3i9m zb&pO|$=;p35WzaI7;PF=e?9rMK}cd^yu|3jWfqaQY`iq zp`^oz8(_n*LL-36Pc*{$ErVt zr_PtDp#zuzMt5khvs)Jr7Z8#n*ae#lIBI4)u>B;jG-$=Ixj0A&Y2vMfo!7XKTDVOh zYs(CQVBTT4#Q^Acq*J!(op#lnJe@nuwclby-b_U%cdBx$*RzeLuJ+!9xE?}t0Ed^t zElF*&h32 zc-6)`ROUI6-nHu078 zFv?$7nh>vy1)v8)=!|}g;_a0?UMd8)43~d{?#qXrR|x(n!?-SkYrEbSMx$9&cWRrz zafX>=18iAD+?uVLWoAD9Ia5>E60Wq*hu+O4Dd!mDbv=y1l=cBQ^P;)MNk9MEcRT2s`&#kPW_Lwdsndbx!NFARcd9}=d>i(if!d* zon=cFW*g3v8I;xP%-3W*<%x>ZVh(7z{#KGmHbsFJZ5aE~FtH{A`-iLt;mySew~;GQ zK*^||!5z}lfsD78Ppp=fF#o^M8Gm*O!oFC-&AUl`#SBLwk?GjNQ{d$uyHDsIRw#1!>fNwiw*2SNX z4%$&U?+&U_@&>Dn10b=D(TqNPV2jZI(2VIsgq_ff)GPUuOk~b|O_%iPjD z(%-HeVE+V)lGua%_WF_~EslV@fXP-KC7rHA`H(q4!o^N3 zQ+sF)4gk{M!iILeq~=!*x_LLjM&U448I+$06|z4`qr+|ro2=XudN1BW6xx|lstG1i zvd88G%c9drd6kDTIHetPG@*7TBSP4SP8rS63d;1Lh$yZpaT%yyYGa^mSV&{DlIV~=~03`WeG?D^J;F-zVj z*VVhUmA&4}{Xwc~kVi2RGPGC}STW}|*hv#mN$0_Zt*xyeA%r0dR9lcl%= z>uqkFE=m1@2bad**84K~Hk#eeA2N2v5d_=bdwUDGP!`r_)CVE(I&&*hKbyA^7=9e? zEEz4=V9LJ&nf(>SB<`|Tt6M|n{V^iglmCBMd&{W0x^7!DNN{&|g1ftI+$BJQySsaE z_aH%oI|R3l1b2c5cXta8wep=h=bqc@z2B*7t$y-@-PT@f?J?&ZqxYw4yzw}yg#4~^ z%Um{d-}^LDU%`V~G5}jjs{rKEpdIsonlParZ*f|OF2+VIBHKfAt9 z_@29iPfXGH0F)}1h+hT(Y1co!v1&7c$hO$dEO$03QJ%3|cfGD2F=f@^8iY)21a>vd z#8RwQhGRt(nd9FC415*CV16ZwkwTix3l<9Wg4YyE2O2O;pbsXOLK<-auQBpoZMDrQ zMmhExU@gYReLi4*CHH04Z&N^zG#}m6#{*us^kCRw##K}Qr z+_Jm<@oNlFNM&BW?MnKi93^GM4l@vS98$$B7#rLzDgjwQlR@a%Kwpw5be3K$GERv? zWrfv2v{hr5yA(;d6Yuo)*C5PS%X(nsMb@MaVrG~k?)p>|X;Nf0h9hOdEyG8lu}*Hx zh4?>sBS91wZ>cI(SUsNOfOs9<>YS%$UDwO(K2C7o{cwK9ZMB7sa+qVxCtrE}b*J`- zaKWh&%6K^I(@asgra_1`_A9#FGz4hv<*MS8K9Y9194(VlI+ol4mq*gzYGtL=iDN3E zN2ORkQ_7g#s)zTm3iF;;Ee5ltEUm8oSIyZ+DuPBlSO?>a-*Dp2$K0oVMWb4?MfN(L za~wWIZtdMS+rsEypg#U$s3QmOb|0VhhIeJE`P5k+JM}oeiza|m^*Q*3-m7}NYATC4 z^8}`!0AgMI0{d07uVC`UCeQSWN~}C(t=99B4cNKr5}sdSvGQUZBjb2IZXe=D> z=oJ~Q^$2`pkNfdiL2E&}zy9OWYtu`_*n{kuZndODz(VF^@CJm#HDGMT>J5v>_PK=?L)lRHbAt_eQWbE+pUa{nT7v#TN z&c%3~vB}=NDtc75jEp1lHJpQkZeU9-UV@CEk_u9!(0T5NndRG&xa5gSS5?!`2K2or z*hKOvX;T$W;~iQG6cO_7ZT^H&&6>|2I!1qb!tKBnl=g4AfwD-YpdSq-VR;ND)kqxn zCv-L_gwtza4-FrtC9(20m{3vY#xuEbu<0uA|0-(2d9FL|t2(1u#2d4{3D`Wp+|=z& zwl{suaa3r|@s{UF-*$g`UoxVj(J=mcM7Lz(NrwoEBN6&g{c@kYTtvQeSi$Y}Tt}h5 zk=ZkZJfKC^pMFd(uE+AJL9|$_-d%|Om$R}C6Y$i`pi4G5rMhp*w$9iN*|FP`5{ ztMy0#sQ|i!8J;ymZ!OVcz3k*L8N*!lvZ&B}qnkD3cMJ^^G09TZ!45mOtLmk94p!U1 zh@(FHav7G?6dmg6F2%ILY*aJi5|ie=pj4xda@86S0PLzcpe>=TF~=9OP9MsmOa8(} zHvsihhHRVX>+O^&Yw!aBlD(m40W>M zW`E1{OboRaQ3rwAek(y3jfl(q*xtVlW-k^sEpzbj+jr7W+!+tC*5!4-fuq;KXQZ_C zq}tj2q9^VKOb$UW3EsxA=omgXN5|A|=i#}H-qvGf>`Fa%-5#|VG^2z|O);}IuUDgP z?9QE5x4fe!?gJdu=rAAR0zpc%&L$!$#Fs=hiS&C7F9+9gnM&MRc+<=86q)H_S z9~H`*qe-)iO)3-<3r{1SP$W`joXN}^k0o=Ew8h}|!F|v{)2o~906CM#hGL&rbK)I% zb#Ubs3JcHE=8BVG5#SxupHwyGd zTWl$+Lc*gf+Vw4;c;k5icyDf-vu(Qhka}aiYGU*d@@f%>to9>NeCt+Q~{5Z)i+`G_8 zF|UpO+jlkGrB**c5h)Mt?4nM9$~gTdD=zdqxdcqYCFnDKMdGFn6c^FOouHdOQ+iK3 z9XKna$UZwG-#&Y(hp>#WuqVx=)3#Hw!G2Y|``SQ@-F~t8?TeY$b<5#ppy+W~^V6JD zi0fn$UoswtJ6OAx-BG!*MZ~A6(%7<(tj0(^+m=$pe+~!wmzRsVobu?!iQjXdtlLOq zs1X8qviG<7ZH8O*_U~`vB*MU<+HAQZ3&q|ZpY5eoy&|kst0s;!rhNT-BGR~B8>sY^ zU@&%vOy{?&Y`&i^) zQ8B}^;nlXwRK8>$a65~lIpBk}2)8Zm8O-DFAsHboL*5I7pjm>)8%698BztAP1r5Z$ z^errVw8WXvfc?^G^(#y7bHGdPWamvv(N`K_GW0-bxvM-0;@SNN4vTU0`r-5eMx~hd zF;?ZZhTlW1v%vz3+!frg=NJd~O!9j%>?b^eKE}*Je37cYiz1Maup`^FjRuHfEGwqkNBzq>f`U$YKv=^VAfCe^auy zr^Z#fj!^V^yxALGXP{vc;2E36=~PK&gM!D~7fXc-sefCZc(+NM^+AI{@Z?X4C8;6O z@3^JaWRWa2)^@w6KZkTzzp}jc#ukmaz4o{e9_u;F)YW&s&To-OYO~2JQ0TDea~cr1 z(*+w|b1A)Q?vxwC&#?-gOt)et4jCkyS#x^*)FK(`*i~*;p20^v5Z3v>OW)b4&%Hpk z;J1ueg|R#GElF$onFzA)(6^q~18&m^y(9M+3m;4V#w;vggwf;0`}WFE`lnboV}{)Q?X?l*EuMFF#?^LnC4pD2Ai$!^y+6NEe!` zUu3Q>D($G1Qkp%_`-)`fC_&Hnm(;_~+XLeiK@`~cnC&KiLa!~7YezHl0Xmy7X|3Be zfMR6+3~rb_&JR-2i$rqCObk5h^m~%@9Ar+NM9pipw#%r0q|nn@v*az6x8|nW)uJ&1 z<2aKQse-ykC6z?0q+TY-?FG+YT{BVd|!Qc%2RKh-ohG(JD8q z_;IR~kx1CbDCr~5?#J(aw>zDa49!Yyz;So~LuEvVKr6Re1c4KP7685si`Uf-MmS;f znP9RfS=N2V90N3tmGwf|IY&I7iz$t>cz_o&+#G{el{;mlVeNO5aK}U;AI-ziW_YhR z_N2_(@0`x}Dv6XKS|^A zq<9D*z8vXG=CfgxJ5`^VB<)c@qEroIUY#yC&oQYs_4^=E)zpxc1mVrJ$hy#@zCquD zG5VvU{+#wO;vQ6Cs73j1^97jdtX|ERnfP3KCHB&heu4C$wiK& zRJ6}w>O$vFCQ&0stUR@`CgarN34IY{_D|;s*NS)N_X-HcA+AG@bQ76l;rL0enjd0( z(e2M(+04_6kZsWpQFtlA)P1`6)Nvq5(&%5p4Fx&PHUim+xU|P=&46~K2|po?L_#YR z_-(i=$x?A&)NxrfZz(($?{NOLjPt~vBhjLrtw35X9}B#0(CIvvf(3?FE?}*4+UmPJ z+FW<5wJMP>LCJUAoDBMK3!|>Qxyv9NYAv1X2&7NoGFx6(XjD@XZ%z!~La;dJsitQ{Fu8hd|i&JAopFO|Q@@;REtk5`!_OZGU! zWA2!Fbv*jY$zMwWZ#w=c>?J`Uo>T7-85Wz_Hi8M4L1wMr=_@&l4DU9Y`Ir}+Dc3uJ z1G@Y+Q!;b~U1JaoBi%9teQ#bQpMnJ>tYXxFuc8!y6P7*Uyxdp%PvTkpexE}ckv$S0 zHzKQL62+YZiAajcI^pKrkLch+S(n5gLYyGLi3EfA7cHsWiUjo6p`|&v7_cZr7#$Iy zr^*PWt}hKWuI2I3@-IN0E~JN{%vvqkwbwuvKbp$;)u>WTP!N+<4nI&n%^<+WX;3 zN_^Zeo+enks?LXXyT;EU!vpG5oj@0I2yPFDl9nDi=DVRvuz!K(_)$J2K1;XG)sIce z{7*MW%FRiP)H z6w;*_z>lYuACJxc@OPg&!h5`*8;}>F8Z5ZCX4&;Y0gp1)qAKQ77&0+Pzp`E}B(K-G z+9Zzo3*R3kf{O2gj|B3bzA~AxCm3AVQwl;j{DJ&fUc9`3s`G$D!o7G%}R3BE&7bivkD^!L!+1h znphr;%iW+LHu2Z`t5XksEwHPj(11F(QvV)5KBxnQc-?V7wU4_PW85HRa9sT^nJLR27hn4fzhdwvRim+)jRkF?3Fcy zgrUZ_VQ-Hw8rXbl7foCqQhsa?64(=SYI;?wZW=#(E%`BM1bp7k$QC@;o*N(YR2!2k&f!7CEXYnTWZ zbp-Gn+J(uga%CWw5h#Z6ihk&{-h#gWKoX9=2&N z=7`B}T#8h(NgxcE(bSq9iZuLO2i)cm0BzP}rz1Z}z-Hw{yrv{ZE8>8_)f+xs*0W>V z`m5lAu`denkc{9VAkj?98^|Q#{C3lXoJ5V|o5^jnySb`-w`gvA@+#Emy=JXp`1yA z+7c@BVxAx$oJ<)QQVceTU1U?@gp~8ub_ejBvq(BOq#r4g*@Z4%%7%_U*fnuPQSc~S z*ctz!oA+RPmmzf$YVo^H+E8dc!%at%-(^b7&c$L$t{N##p~c1d@Kb8a!G?K?KI@<; z)%jvU1rg%LOO1X9y+36z0SNgEO$jClB%j5bXlrw+_)A|omrY(6vL%)hb(XDESzG{O zvYSPfST37Bh0z9poy&y!qZb}mm=dvuEO}F2;={k!QJ#DHNoYDrvPva}?bn?b9A3uK z!YpbzEDp`-85z>;XoKVxrQ6}&(Z=<;S?LDReKga4`NUPI@tWLlj6DWCSD+|*u!lHX z97r3>4dYfRzi>uE1$j%vn1PDVsY38fegze=@RoFUMPaHN%uRYq8Pi@F^Ff1vf0?~V zK8m|aM~%>38Q^zG{>he%#z~YyCPUfi;;9wD5%s>nSxi|ffu5xi7gYhhbc(xS*m1FH zcNrB>w`#132Dn~TPj_>tH!XS^{MhDMsffrJaIO54R-?Pi=I)-KQ*N<1EO7RI%B?Q~ zZjl7A!fSj#AH3h8WGCwXUG(v|DK#g-ZNR~^njkoRKZF<7YdcnZ+S3)qOFfs(Mrr4# z#ZC={MzC!hKNP#rUh3WOHCz4%v0n>Sc`_K3((!J)pFMIyLlR&ptiDf%>>qZ3y!!-^ zrxe#l6Z8oZw)hQY9-)a<3ZbO%w~Q zgjzDnLo(W2aW@@8^CGg8<=xNQl3f4PZE~d4fQQ|-10KWglbv}1>uVGqXYqQAy-(a$ zOVhW@%W+D%<{pgSukx>L3-f0FEK0KIhA2NZX{b7@AxUrXMm0GWzWg}n#eYX-@n6ALt8e&aC1x;*%NL(0mD&+GW( z{<;Q;{<=yhl9Eay!|xJ1oiocgCgS(~%>)UN!{&YC_`rDZ{f~-Jha7tIR)0KA?24oQ zuqJy9F{@?7=(&F}DG|MfXr4E_P{sc|U!}UtUxhDR66@yH@+-}r# zW|ti4daGRHXM3r>Bcdkv!4t)-flLsBM5DF9BwU zwi(X?&_hd!zQLMoGiM7#fg&+l>!9=L_re|NH@QiRxt%E`=hdzmeJg&!kV8^w##H4Y zsuVgMWU;-10%Dxu7hA0ArPp*(i--+TC14^_^1cWfUBY?|J^p;!k}R)~3y9*|JRIaF zyqOu5r7@bv6<}MaeX<3^ASD|;weAB z1Yv??FQk2umzfGf7qCibtURGmVWNUlg!a37|K7d*CImStm`8xfKc2yr8YO370EHlp z_9&IuGta1E-)y_4LEoAeq7@W+e7kdrxCSMrc0;XVU96b-IZ05|G&oHmBt>&%MG9og zhJl@jMl27_j3(;`kMm8OkP91dh9=jH+Gazco9)Gvso?{=7p63i?~mkeMf>%7?e5Xl zt3Ckp55=CW`sY&_MTD0;a2~}3?6<7(Gb5SAN`{Fw_A(O9{e+%1Od4=~T|?&){V#R{D1 z`gM7he!y*gMrHPBn6{63?bo)8Y~-;iNf4rM0GV$Lb+vS?D2f2l`YBOt*6l)t%l*U? zmBo{{Cey>Srk~?_e{^5<4B-AUoB)7(E7kG(xMN|Rj$BL~v`7KByYKvyfbr4WUDL`C5kv1qC1LlCo22-vNK1LMLx8g( zQ1t7&1dA9*Utfu=@TPISnAwY-(eveX3beW&dM!e7LiYO9)LYblE0MhD?b z-ACvU!=o~9lqT(Wc2oIfI@ucgY{h?vYK#J8S%M5(8eN7ZV7@7Cfltb({+NtQcSTKj zeWcU}s6NwMZPt@>PS-dsp^f&`QK}7?AC;Yuhs1)zkleh|c-Hr49nhjSAyC5L&~Bv3 zgy|&S8%)*$8+Pvt+ejxHu*ceEh9F$#Uz3?P2@SCRV4yVFY2FzTj@=_KY=63+AnWwP zykR-m7MtLSQoq$G!na+U^J5k7%YrLJqQ3B5juey*);6K$-{vXQI;dBsE?ZJK;u1cd zDi9eae12DJvd_G|X}PWya&&=`-QP$WfW=iYlO8k>aM2bk3>PLmYIzn2Cm}VJZBf=B zidG@E9T|nq&=Q-iI$`*O&HtH-?^R<#$8OVz$V*Biju7#ClR#ryEXlE0OF*=@eu(V>VsveaInRhpRj%h<+9Ei!>5G(z-kkQ=c zmyumtG7>ydpBSbDJPSYI71rcAA7}_#9BgS-%)|jnjURBwb>F)Kts&#ZC~OjvtdEZu z7|6;G^pA*3VWVj^5oI&Qqkmk{yb?mEkW5MOBSSq-^6gV}X5-B{MOd_1yKMBMF)fqX zY9x2QkVaVAVd1$c9Ct|8}yha(f8Xu?jY>ntWvP~*e5L@Yt|Zq=E| zwGaI`;`6+-Gc62z0AL&Zbw!>As-~;&y*eedCB0)`t>=`W zY+sHXdgR_rIv*N7XlizYX)W`9+T&=#%{3?1nceP)D)&+10GHq6kQoINevS5GdZkX% zh242*XI^-NVC=Ny7uX*eKg+9EM~fyeI@3E%moz}eduU)9PCP|$xd^2cGNMRght?XUpcV_5DrI&beHOf%p>|0Zim#0g-i9x&If zc*fa2{eztNzq5ol;QyBUM_J9=yYG(SS~NlGn+WH~4pTf1Ql~x)3SyvMW2%u6CW=>G zD#%%uui=K!rs0*OrinSnN@!)>3c7bGsVMfH)5tqSBRV4*bbU+|**_WDn)@|fKHuwK z=%NP4M}t&a{I`oAlD-5iSCw2a=Z19R3!am|0bEK`ah-ci22 z%dY%a{sN+0SAABX~)1s6=EdSiG&c7 z_RFDkc6=|%*qc4C#p!o!>EWS`R&;V{^mNGJjViu!s^6~~P5o9gNeh!4)1wSa^Hdu8 z=!&o=^SPxWf4J6rp81S|LXuA6Jc4T7z@AQ#M7L2l&d8I+KVu5=5z<6w{GLvKr}jAo z+#Ub1;x~a__B+CsU3P%Ff`LqAP{8LM! z`wbO3hg!TbIU0 zxkkQSrshs4Q?}^+AEoT}_vsi00NL#SNiM$-1Vj>nfVYfwZ*Zi-<=OK*0_Ii%lt>ZU zM;vvgUgd3f`9vBZ7@wQA{_Q_33mbfr-<7He^7T9TjTf&{j92a>C+QHLmnQik0TvWC z&~VHflI4-CTDt8k5P9>RuOEB(AHD!T0O>+`cLmH;B7tskgchwXV9&qnf7AE-=v_2W zMWg&m_IN`qY7`WJLPp&g@=wl*4KImzh1+4sgb~2#J^FX;I>!EFF0RM%I2`5nUM- zV7V7pI1Na9E9__i(aQE3jT7$l) zSVTYK{*0$xwRVU53rCjv1i?SO`2Pi83#Fz0@SiLIv<^7aiLbJ7(RM65-iI~A^&_$|9y4+KL%U;*H8anw>$?E z_|3j#`C9rb{^uk3fBB#P`{(@kzb^jfBjluCp#T5&iJnSmhT^v_S9uRy|L(5+_lx)+ z??pEz@H6l+?veig^k4t(=4|kZ0bhJ_IDBv6A77dO@sj@O!eE;i01HYr+E2EcVeo&xQE0H6|pi!dmZ-2?;4LAz|Fq5|3EX2pR3w=-L zT`XIJ@ic&ji5U=wF}%L;{8(Q1-9}FQU`LQB_(|;&U|vLA?@vaP`tvf8ygXQl!h@f$ zMk#uI4kg=M5BvUNW|UqX<(>g%8^mgb&lDmHT;kTM$Kh)IUs7`9UoEtN$N7>R&iY2j z%^_8oi0bRz=`zdNdVnEAm8g9bK4n-Rlj2gt)=I0(7I1R+XB#BDegC*G|N8h;^QEh! z#??1l9%yXJu2(_;F>%$l@LGNToHBEK6w zMYa%{#bgeyC2nwH^LiXpo&QCrZDxEfFF9~Q=U*I@)5!v5l0T$)?xtv!DYua^>w-mJ z)HilH#h&jqlsQz_NJsb|f%*+0qI1{t_HzEw+ui)qc?@ssS6=T{&bUAH`nwk$0_%GH z@7~XVUO4)g$NtECa{q;Y9mx%Im)fWYniHo*X*c#kKf8u%|4zY{g5*L;CL#)*4UYMT{(u)Uh*2t z%!SI&%=*5Ul5Ebic(vZ+ZEs5qj{bgRD(#wXiL|N|)&j5CncVg`;qfHbPF%THph>9H0PVVJBkWv_}FfwSs(%bVcTSSMPLFlVs4*NfyeA|C+oFqDal`%|x zQck=}=ZqUmAcq=fa{!WU{QJmrum0v8cdjo;{v1>HD=L`4AG83T8YUsPy;_N_gInh} z@6rif8h@}S1rSAHJh|2Z5kJ!r`;g~>Vs1~$Fn>(pQXHdp=koSb;+7x6E-zXx1;aZu ztshX)LA4DYQ8aw~yCng9rOO`ecc1mly%?qc*lzWw>0^}0X!$=)5RckaqAWe^b&j-W zJIA$J19~#qfX9q6Ap78r!hAf(CPgnJ9_|vOqa+2Iz3W<2KSBSySF=E~I|5I(F!G~y zr7V@)*Mu8LEtyGw{*60sWBX<>{>()qDfVe*&AyjFiOyQ(^v7%XET5YLWj41ZSEute zzj%2z^S*U2;i7wsR4b0V3}#(~6c-EAOY zFV6GZ(mjJ#brjGwOB6oOxKxYxBlfG+BgSKgsC2zKxm=5sx2ds`y}PReG9f^}t{Hd4 zN<{i!5)3h}^bt{&DA?mdbGIz%_!(*N>qdg7;UV)vR+WB)ouECN%hiIFWSZnp? zq9o6h8-1C8t68h5BhZG`;kt_O(Oebf7O)^bU*Cxs1B?!_V~7}DsRiM+-ZW_TxE=!2 z&(r;1NS%R^d+QnTn5T{h(H1DTc!mX9K>8+>Cl?VZ5Y=T5Eg1GT4L5w&LB{ON*^uXT zu*TUM$qW`I+X*fQH@l5UZ^d=*lc$G(i_Hpbq|yq7OLxG()|?1_=sL7Cgp&%~2wH|u z+GMKY_A3awfpiWLJtB*;wM&&&l$TaNgGiJg?C(gX>a|F7LlkMb!ljUKfUpi{^*x|6 zY2BPG>Qw3!v1n{tF)Pz1-Cr=(T_POML%Wq4^=yz#GVK zR#@Oey1-@r%m{-VhlU!Y;ogn`Z@6Etj2QJZ7&d~}q3g7bAo^han zGjW1OyT>sF0`{YZ=%w{nI?hWXPS4WI1e2#Kokp?~!nV!V2sjM@uZS5O2GV9`4rz8^ z$l$a;;6YvYZ+?f`+eh&*8ojHmh|>INNS&EEUwLMJgVj#(XS``n5Q+IYm@k2a9s<4E-7GsFTP9vLu17^-P>ZmJ}W_`zKTQlsd@dk;f{4#a0fTR+ZoZA$x@n`;Df6~mA4yO~K{uaEMKe`7R?{l}xo zVr=qG5I{fh%u-;^=7!rJ7FXNdF>=+G;jQNL8@uzBG-Q+dB0&rUh@uasSd72o|7M7^ zk2aeH9IEw8w$_<}qOj;z1_IixPIv+DfKD{Sfbad%LRpDAjWQabq`pZ3w}^#7eJr1A z0K=>kx~*mkl2IZMB=OSkS$r1S2IxRev9+&xNPD+#M0sHTf_<+!y9aEyq_!bZ-qlBsLg>ESy@TRwpr*zUl?UD$2!*Wjk!k6fe zeQLsExBO1^M7QD(#1v1}s^dECmOH4uuU;4y*fu}UyUzk|>v0z+Jb&c6DBf z{fcDO!Q9u8)rI)r&Drlc5l~B@7X2*C$XzJ?v`~}B1*gMNqD<~APqe+Q_e4e?m&-a; z;-mvG9zbi#&e2(%T5`F<*;M_gk$4}t?U%OX2A5F=-v5H{R^gWZb3y?qD2CwPa8*0Z zi5;4?Nnl~-$~DnX7~$j^qRMnquCwu@7iFJ0CRgRJBSWM+#Ym> zA(N8FVK}j?)T*yRD(dL%n?4m!Be_=qt3wVhU#>ReaQTsM{a%&eh;87rmn4v6-!aeO zb{>&f(4WzGJg3}j=X&IvfS&DCI7DANedDPmC$#{Rh44WzXkD9hhiB;-By=RFzD{W_o)F z>?*EC+vO-bM*`|H!TD?_d%miVF~kB8?Mp$o&Gv;ennAB5ao_Xhb5dWCOhNMQSS1$$kOO@pLLu);JV{g4`fkG8I+&dX-Z6SQWdkG@jsc(%tz;8DRxuVFkV z$(%6hgnK18rJ})80pi~^dlzDWvE}zSaHV=(8~S&XTe9a}tyti3NIY@EyKrPux(`a; z;%moCt(1w_#}6&?a0$`JbEvmu9EYhqxu~};7*N%~sXH2VNWGc`U)Z<-k7rFi62f7H zaK7eG8KaQPUL~zoUeX}X^(|O*;&1~;X(Z!=BEf?nl1x0Q={P>x)K3TFV#KV{k{?7w z+^!M2Nb18T=&<_Hm!zh1!~$I(ONbVaX4OqaOYGct-g9E$i);34H-HGgNLH8>evg$5 zqam~JiH00!_D=3q+<%|Bx`d&r~dQ#hOVXA zJl5Ko9RBI)jugvhnDV+ngarO3nculmcX3+H%Pk&mA2@?h$8*Q`?HB&)5oeDv`|Clu<9ir3 zkqk#U?X#)rkV-_Hhz4>j;6V^y1}#AB_Z)C6>;9yF?jf@s!l(=n)Qg-Yt=~wZPS;P+ zfFY@l>1b+frx%25`BK|0Vtl`{ZyH3y#?g3i3g0p|L=P>O00hy1TnYP2n3mK^yJ&j>euPgWhg7Lx8qZR9VT?s71*9IRiG9s zn7OxHs(d}^QhWx$!GP<5^+eiMT{Nv zJ9YT|LzZCezO7g*-o8*KT7oJ^b_;|>pm09|l^aa}ExJ~&TSkGeGLQCVCVrd$-o;cv zztecG6k#^Udv;i>xL}D^}L$ghoC?do2Hw!xbUm zGv3zE3&)HW3mwXDoCqo}ul|S3@IGKQw3;s0~jb z$zHWg4%wi&H9I)1BaV0(@gO!YphwVSy%VZ1^DQMGGMgs8e4Zb^8FVoCBQKcNS%ROh zOVIJ+yX8V>@&iWmI{!Kmh#sw6RQv7DK-mKQmrfJ4p3)Eg_p?H1sZ#L-%w6Hwd2O62 zxOfBGK4OEGIH0d5QZAehQ(sdVGgyu(IvYPF>`6rlv!}|aY32(w19RFEWeL4+Y<}gO zcwh7laq&OCNvu~N>`NAs90EJkBNRvhm-n;t>&NrjF9cmK#en9QhBKQT>r;U4c3@aO7QmI3_iWipDKUMckgVq z7m8I{ne{QTDFK%~ZGQB9Y@n-)G08T(%Ms!%_M#fryWHx>6|fRI4p%Rk+g;MRnd|Uz zOAE7{QY;-96=ZrLr1&vgp`-J)$PJ%Z{B~yE2a@t%OVrI`31DN7b7q2oDZx80QchFi zPw3?ZBjR75ia4UBc}JY__6-Y<10zw7xC01i(jTGkz|y@+$Jwu3`2I&%H3#PJoXz{>06pLH(ikJUVu#P_ zXOE=XqHa(e{%|e;N5bszzPs+W zun+N}MvMfZ@@oIaoFF7^eM-ziyXw@Aq?uHS6h((XEe1BYnWCQgr|Z6y9jd(?G!bfY zS9@<7-2z{elad5|Z5P2mB|*}i3svi)eFxBmhP0a_0$6KsT*lNY)ym{7kx>a9-s7KT z#UD1qNd=Mx>PmKR=Y}= zQT^%)IAU|4C*q=5&z@Da75pq>grvHo>tkXpujP(o3OSZf$j! zgJg8~5{lb)6?cD5a4Tla0&(y(JGmb#<|F)`?hrZAN*NqFAHo!H)FEEcczQ<(kpMpy6v+jR@buYDe5|A~ zKtNSlwUgUUcmGjJB{it8DPAT_^^jb>BnOf=v;&eYz3I~`Cb5p^k97r4iN)zMc^;>W z4I?e?3#PCAZz@+<9XSy;nnC@Ho~%LGz6Bq~b#vIisv%Gv^WTbB*{7J|c@kx^yYb(K zN9!$+8O#(bB!#FlI9Ip*(4L~8An{_+ksA<{I{(4DMh?yfSIRXK=wpx56AS3jb{pOV z^%ns_H&GIxy|6-s#GtP=1v{5VT-M188-)7F;U$?lpg+AqzGUgGPoo#30;XZWc$FyJ|I>Q!nwcldt=i*G{ zQucx$V&ActIGc;!?*oY;5r-V+FEj?ey=@HJ1 zv5%<#SkH2bCRuSkl5<^9#~bRDx~}S#j+14XBSVH3FNKN3GZ}Q>%x3JUC!Z$831lN# zZ#zY-ISt9iOs5&o;ERoUj+5<05wJS&<=DPH8FOPz8_hnZ#zl<|9FUc*jGhoD&>ZGYl;-cxtbet?uD74&9(xPXPF*aqA&ND0=we|8EX>) zQ=MM&0twq~yW{H|FsfY;z2M^U&)x~dV%Bsz#SNt&+jENa2__Vyu%C22XWk@Bm|=ms zdDj1;bjY-<(!jkD(x~D&kE${G&Y=*nB}!_702qbuk@l`+{M*4nw41BpfilqUIv5o_ z=zlDldZK}oBJN$5ryqI`aG4Z=N%CVeR>_vS3 zlV4JbjC`nV+h{aToB}UFt9%qcER3LoBt<=tuuraMZ-L`WA^K_?5%GVtu(Dg-T(`rX z>;EH^m=jIZ)EfH5pB#W9{>H#(X!Sjd)%nRFz8j13CdMlmf(knL3EcEHu!@Nq_&T$u z$c&4`3&`(PZStjVE|KthU(*|PFBk^4k0aue(ub)P_ z7ZYt}Gv0{+5%_@??bGJ?L(L$GG}{kaz4AgqkLx`})s2}R`$AD#mFXfyN_wrTO?n3U z$ymbBHn`wD52Ylk+TX8p++K%3+<>lryV#ayp7Lb201M4s3!IVArr&^q%zBeq@R&dx z51if3=Sn5XXe1qO5qJ}xSV5mm3AUqDp4%MvrVE_s(}^MW2**euLfxI(gqej5Is@La zG=8z(jOKWa!#s5YQ-LF7ouGG+_$xw}j5u&`9)zHrlZWHR4|muazGJ%3lxW)mNMN%GVfvxz=iXg$#8s zM;=(=c(xCxa#h@P3R(`STw6WpgrZ9YG-L=`;JweY2Yj5=Lb{~5j}ra&~{WRU-LA90x0h#jAXm#OU*%a0zJiAgdA z(Q|)Ieu{f6A15-6QBO+$l%iw4%!Ys)4t>rF$rFI$;BVccvIjYI^>cs38OPsALXWPd{eh+&;)xdC8bIG3%P<;EYZHgV~SBzJDm z(I%|v7n&#u?t2ROLx^i|vfa?=>awI)P04A34<0~16!z&mM6~1i%C8}$AU4CxxGy!2 z`!Cf)9C&x-e9>Jt1;@S`XytBe0>8asR`R1&s%CO2@=;ifk zdM-iUQo6?p!+91^t7GrFu9dRB!_QFu(&z3B6&* zSolt*RPFba8pr-Fdd5HIeDLChDnhJRTN|0}`Ta7`4X!&g2;VMx=>R?2NuMvV|1zC} z=AmHKpYfwb-o1(r?zIAmS@=+{YvE1Ev6Ft*$px(3(Yp5{CeE&_^|#m@45WyG?2in}hBYz*W6c)7MZT|MKeN%hE%Ee}; z?-*)Du{?51MaQ8d_cFpfiSX2vnLHBc1TlM#@$G8GvUEx3bIsj%xDg}*?mkqg)n+IO z$dyYzV!FW=BX7^Q5i&_7|1E*r%nnaknrC-p(LE9MY5E0RoCGdiJcHcHwekX!ttO+^ zf=K@P^QbdcC}pzEArVll5T+SB!Ba`)88g}h_|+KRTyWZ*bpC~IM)q_H!er8yr6*tD zqiIr{pNkurdxyL+g%>6G+Mp$aa=G2Rhow)HN6ST^l|DE9tF+Cwo=;?I_Oi{Dyz?aR zD7?)Wn{lU#T#ONsy&}P4!=T#0y`3@`G}9P?i*#9!wim#M`}{YE5&SzY{#_Tq6R)4t zcDt~8e&hX7-LTj!u6&;+Jjo!Z!%%1T@LjuHgm`a`0vfcWjC~p$j7*t(VB^w_cY+{B z|KtANZKm|{lk-ghbf+4$S2LT*P!v|BX8R<=sbM`2FN2utV%4Qw&E@Hmz02*ls!aD3 zJP(s}j;M~|glmm7JE0JGXne$c{L#|!40f5%t+^3*H5AHuwpz{K@W+iH{_%QBAV{i* z+ko3Z1LAc_p1=yhV^|wJ5=HdNq>?~hsfET9l>}RO^Um)wR;9hHv?Dqa4F#PRG6~m&2GrSYy@;FVPSVFPADi9Y zA&hT^9vUtELNax%fV!((q_qJ z<=&pACn@WaH-i{ga_L&r_hi$TRo4w1Jkch*wUS20uO|?sYyIiFi%h4==RGBk{mOW$ zSZD-5Hks5;`NzX?DYQh}-7z>395H|uiS2wcZ^e%PK3Z2*VS(37N85+I`YQ<>8BX8Z z+($^`_vSHMfs251Rk4}p2SOXFi%0vrhW_}BfUUaO{5lS^I<$&8L#tL2?W7MKqz?YW zrvMXL|L4omO^QwRE87x??9vO@LR1;2cEr|fK0u=4j5D-!iW=JJm`3sEUh3wqnyCGF zur;H7reXH)8)i^t8^X zc}`y4drzwq0O~>_Cz=_eYI`p~nM2D5p+QCm^0zoWCk~s4+pswCo6s(3>b5@=nhg-) zM)r>qOV;Q#dExgT?PWVw(iMtAy#m$gs8^x68f+oN)kL@KZe2@gw7k9V1cbUInlC!X z;~Za+C}yXGnMm&~F5@9!2}unJ{iW4`GwZe<;GizrC>DUN+)412kx0w!@FI-mUd! zSUxkN8*tA}-@(VJ{J2bKf3kUGxpj4>)xZo5i|^1DAKkHKa`rYW$F`S+jP}_Od~SPI zDK|fGn?$7mNY0=oRCuduaK0^^10sH_=VteQsA>#cAEQb7Xw4`BLYGaY)~_F}9@lrAFF9@(-R6W{L8ONb}b1e|?9 z@HM~#5USgW?6T6QYEAT%7GT1EgyM8KDsj7oTjyg@ES+Ou|4)*iilb}nc+Nubr0lw5 z!&kx>Iv@W9bY#G8I`ZZA-;cf9A*J*^*R%4R3?3!B0MP0sIvNj|L~xhfX%CKN#|zi- z2ipEK5cyC^YqLE++FD1?Be5Tdq$-rpx9`Elewno&IYzk>0}ua)j_I}{M4CFo?PpNg zGeE7_9;gz1_af(rvHC3ur#L|9gjk#8!nQe3y@~Ni=H!xh^LP7mjc=v~{>S~Egp3mL z!NLgmmt&P)bIx7fN1-0>E$TS$fJg2sN`q4WeeVOp3Et2zHD|EN&ja78Qt|F0s5aZG z2;21r3F1C{!{-~bjXURQ(ZaX)FV0ehP=(GKj{#fLZLSD^oO{@C=kpYU+Jnk+B}N$h z9?rBSN}}=hJ>UgnTpM!Cv5#cO(ij+2OJ%4wBM5+VscwX$dBrS2x>t)MT%87ZjxFjR zCW;8}EJHoAfA3hQ8}*CyB0Q8>t^LvniH&2RB*k&cbE@;5tfSMbW|d@324IlHEYF_! zeBc`yo3*UYXg=xk8MHKCX2K*!vb{kn+ z!uE(ed$4<0-p_S|)dKK1bksO4da#zm(w1P4Ayu>Wel+6c<}m7H`w<-g5l4akr@yDrg z!jMT4a=g~j>z@Mt-1NSC>rp;dZ+HPB!c;9?D_`2>8yF`}P%j7;t^h%r4P<31brT*mX`xnN&%WSYCSoT@o+yu}YtK-0+m(wIs-UCzYpVFqK>m9q^W0wq^tvZUE zE%^?iJ#qrkcz*BqJYza8r&j7s6RCK9k+2Jtkh1=G_2hpphK4I8b_sawWKlwfoR_EW zufzT`otc6hm;0v&eSSSR|MVe4qz|v|4TrA{gAVoD>tv;e^5w?XJ6*IPO~DL~DESmo14zhJd&53B&BxO=5R0R&_#10pCs-G?YJFf!a~P(!IT6(^#+T<+v9grn-tM!>K;N#3m~{~ zb(%kP+;KXucAqUOkB82t+nKngN#|V4TZTAkSj6eM-?%EV&G#TELCdu4~a`UO4edM)!yfS~uJE}KQQzzqHp z#dBywo=(P)9cju|hiBAkpj@IZ0D68GSt04i9h6qrc!wTpG_eu|M_}dSA97b4hzH-V z6<9ZZJ5g)|pju>qk72CL&VDrQnKu`Ar(cErv%{!TB5dg48+?b6>%~ zS2_|txD^J<7p=oeh@7f?4$`=f5r3&q2MY@Po(v8L?qYx?3%hENSBVBCoa+S#d0eyI zf-d@pBMD|J3W+c#omxr!t`zOL#dwy2>Dve&UN~<0kMf&f7r=^Uag(fp({9K9`v=K2 zn?%1#;LT@>U+pnHNk^dv>n0@yKHicAd)7@kcv=>;~7>Zu>o@guB)BLuh!;pO*5xJ;qq=;y!fL<-u8GF{6TsB*HG=H~|5A4vG0ALW% z-AWGA-*Xqkvzgq+kzC7RF)3?7-!+tjE6#1dsV-^5z7ysf4H1?oDtH1p%b>lgHymq& z>4@x{kW>_=l*AoF_`{&ZL3A-{t=WE;y{67|#)t1~Il-(yIg~jCy&FY{z@KTD=j@G1=~YzRh$|_j67(;w+&238!qwlkP{VO7RkP z!gT_5j!KEDhdj~^4BBLOmAEd&vN<1_MpF4?31g3Ag|er0jQv9SOAn9$KgqpZnWiHB z74k=sUFS7|#RZ*43xqUUX?#aESSxARpdV5NV2&CfuKkK!UX9VAL}pcHtn z>~7JZP_hOz4>Ss>_@xJtd*BdQ(lp#MNwIYSNW` zu|~5q6_%#wr0L7uo z;xIrrcmn_lLl#@I|BYK#bv2tZt4&`+(@gwBzuRyGY=I& z5~$Zr8qH;?`O?aM!g3v(i*xG&pFgXr6aS-stue)h*F*RQ=@7@kJU<6%W0N-0=R2o* zD4;F>{L*@tvz5RGeK(4WfVajI9r2UX_Bg-Ly&z|mNPOX!S`y*fg46NX^(I63QS~DK z(A>|`9i~q-S9)HL$1Kyp&@docyg)6@1c#@i{X$UA-Hs@`1^VXv8UKF=0$E~zMdZpR zrJ+_*7*g9X$$~mG^9-l1~6Jn;>W3{~{Dwa&g(VD$~x|OIu$JQ-O z0yBW>B*UuVg|(S#I^Pfy%)AW139!=>K!_K@6om@ri^mGoNY0$&{ukl?Z0x|EBaJ>`8E-=v+_$Fd5jLq0mv$fs z{nE}8LRX_vAKKw_xp^tkh~Fq=N2CBhm`D{lwtH2u5FCE>F(6GEw&Qc&hGf@VL?uBQ zPK_FWpBy+yknaT-f)I4`*ZW3HCxzPM1B%$f`~K{r?QBjgSFSGn)IToUaEt&m7Z|qe z+=Rvy<){CnRD#ek;vJ5`ql-k7fw|d@6OmPIc-!7b85t33cTdV`+lGd8dVg`f313k> z+pJ$2(@O};9{2v;g2!Qg*CY7jLu{tg!hY9E>cRDtj=k1(4CcQUIU|=&tu&&}Y*acf z>gLmX01v#@=!=eSxq59NrDXZ*@4-Le$_um^MUw9|4B1nb0I=$mF!6H8h;tYj7Vdcs~`>=PBsc`9bv2hf z)(YY>SnZ;9d7=noUbgY$^4!t#yB|74% z3VI>bN7`I>^1E8n;A|!1SjU59Qy9r2eko)&UXk+Q=jPYj1N>J(4O{(Atj9R&?4nm4LD{<>pkAJbd-+n8{D}V!IMJYdx^54PRk`MKJ0Flni<8jQVCGQ zHIOhZ;I0Y`mpaF|(eD-&cg!BC)(ku(W2{y2NobB*9bmQn_41ol80&jXojut*A*bQnpiEL+$l^;0hj7zBRnc_O$a zlCb9R=Fmj&uTToK=meUSk>?E^`%XHXfbD0r_g@Pw28Wqs|4?ZT_!H<>Zk2y+>Jis&^$(*5t)KG+HXZq%xrX#Jx){fW*{7dg?|fn! z?`K`I6mN5@qz#HJvnuV#7hIx1xoN?1)=FjpGs`BB^Wi~!O_cP9-v9_*`f&vPO){16S4kMGL&qs!;c&R+JjGj3u~bfmP7WWaS(iejG!(nI#_e@h6+nR~LSsZJ5(&hA+z44wZbmNdRSh}1-Pw=8g4SrK*o+7ATtl)=&ssw6 z*p`Zk0r>z^%2&f^@zJkkJ0%#s?-jlSA0O|qfPcKO*b#cD@9GnR{gWj{g=WohN$Ko@ zH#xgS$vEEivj5&qF@y1^7=Zf@yxCk`2>{cFRfs3V*9Q^@su*D`7+=TTp#)<8(|Mb} z{D-!~lf2+!tnay@uV=s*CgcB(VKiSO2V&juW;!QkQ1W@0zBWZuY8F--z1dQ>tpTqz z9eJ_6MzZxKF%q=}xnq`VT2W!Q;r9*t{!K6@Ct|t2)WnI0R?$=`hQ7vt4kZx*W06@` z@}K76G*2IdJVc~2azK(;F@ok&8Ph2CD(^@^i1WVBB1t|zzY;G5q@x##qe-4~NUWL+ zgp(o=4@M|=eowp$^;L+4$xk|3Yfl^d``IQw{KGvgs}eYR)r)1A5k6n3|LSsb6I>a1 z2Mo=CfhTUY+vR4;K^ULuk58rKqgpukFl{dJE0VGJOobEpV^Mv>)&wKGlx?njK!A9% z-sNBsNH#A#9+>>^m=}x%`ATJQT*?p7LSNocKH^xvcj;(c1Ahx$732A zsiE6tSWyPO)rOm^J3NjJL6wY}L3`Tyzh-Ek*+7__Kx14aGm;e0B53rYR;sBmlSHj6 zo9AM?Sdg+@XO_vox6Iuj8m>Do8Av*7K9w;>ac+!>?nl@emRPmog#Jv%p3DovcaCt` zR{AScCBFi17o_*&@kv0$brkBq1C|?hdH76i+T}0I{!S=PZ%=S4KX3lZP1jy7f28QX z!Cvr*jGwD$Ug-@-d85n-`wU54I=6de1;H1Z!B^Tv=%JMs5#PP| zS=gmr+JDdo!R<}9f^`=ASg<%`9oEe70iZ%A3bt|J=YBfFLPTz#D><8Ox2drODz=?i zC94j(HUyZuP}DbYqMntqCZ%h4OhGCC$@l8a5l*&I$r;G#QAU1|wuzAg98efr%I0xh>~u%4{DMkPCN`T5kVGU?x6v= z#vUUSHfEQKB)v8_oUQW*+wjur#(E}$>gZ_PU{6!a{-FkcY?*M$ZzGS^KWzeguw;jn zhP;9lw0AII!;T0k$q|| z;6-kg7S#Hr)#?**SD+Rn*uqBz{9o=$Q1J{rr@2cE;zpWXk3_JyPs6yK5{~*-8z?U$ zsrCgH%5hFkFrpvnXE|fZUNA-+Wk*r3ixo08iHAf^1jUwsXNE-Rj5>@U@J((v+Mw6A zfX9m9{LPgURpGnw;qowUHM_i^V;WWs#${1IQj$(v5`%+Lg!c>tX%FI4JYD+@+UJ z>F)(>9*CnIy%KmtZgFu2WEk_rzM-=XN>|N1n@dlXw<6C5LhS;~t($Ok7$;`z#(Wb0 z$66HOCw~x3@jkBUMjMhbu0$pRIFQUgV-5jW9|%4N93=yhHY-w?ORI2oh|gBh``aUs zL*Fz5L!7|;5Ht3p^CQpR0Dl_@KM7`t0jA+Ch;lW*Flo+ogA(}+RY@t)q9}&1HLYfP zDfix{oZ+?k3G4m{wTb~Rfwe*|4uBZUxt&A=vlU7!fYR}3nv7gxkP_XLIDux0=Ee&= zd{y!zSeTOTIGc4-(o=NVKAH?|A7+npzMGm;q>0?#)ARtqp&u@~Irf{lymFds25=mh z$^LyfmCE^lSpX}>+^R+3_JNPJzEBm;V<(=*wAY zLANpyp6j&1!E=P^uC;ScTn+pJh5Y$1Zx3(Uqq_lX8{wYsO_5{WJE0^D%xSo^X(|AZ zKog}CJHf01EdUD~Ag_#M^{d>gv4WjHVRi~etc<&hX4CPe=z2C!IJx6&6}Y1rY~%m^ z<^GJ+C?FWQ5c^08V78Jj<$fu^=go`zz7_y+0(TN60#_ok@O}XNqHEkeR{vYw6jy$( z^;{2@>C&I5b&gcF#S*GD4Di|0Zerk*c?u!)Z9O&m!aIZuGNwML7|$1xG}Q$2rn5TM zY1O&3@|(3HN&YJl{P(R<4|fijvB^BNZZ0MRQ$HBfXr};3T2R}pZ699u{p+E%U-+!i4(~w& zV7j*%4?j($k)wabjJ~%)#ar)i3x4A&kWL{$x5w+lCT24Vfy+?T zJbs5o)@=6v&W3un)ZBarE>%P(Vf#tFi!rZMqa$y=HbV~Chu1BKa7DikD<~1bdPU<| z%mI(t25iu}uH%>90d!rqw2M-oPB4%fp!7*yx)>ilftL@w(7CcYR zlGsV&U88x(_UYB`(e6f2^^b(21AqxGLF=2RD;uC=Rp7kO`6p|?2N*mj_J4f2(@>oJWGbx5Rx3+SX<#| z-(%i?pObw2LreWJ_O+@gKiT|uAAS`$l=yZHTD2Q;27lfqe^PpH4HdYy~59LgAP zjgC^bU1mb*5hm>zY9vOK&RX*&YUhamaOU4N7n;l5aAnlRNsc;*mq=}J+jYqsduh}l zB3Q)VjI)D+lkBoybF+W^ahoUkOS&{gGUf}E{J_iw5M2P;RLIMS!)FZK>Ykl7+TSnw zvN`WF#8`CS`s#>OOl9lIp^x{TDbtSDO4H=ggRMOt)VB))tkNclOuHjPbX;}y<$uIm z>ioJ(J>C^8R*zLC6=9>D?YX>P>eCTJc>jYXhE3 z`mFj47aYcXe0?`jLNV!OVA?AeSN)MZdO{Sfv;POjLZZ zKo}sBl0VRNCWu_qgMxBRTT2-%=}{9#zDR%RfwOM}lAQu>^R($T76iO0)GKd4ntB??3HBkVh;QIi(7vvKU*PBkAQ!kkCMcK; z3Mu5Is6Nf-dM|U*Vc^L|>Bv~19dmk(^fv;37vIEJJyePQt)cl)fg+9`Sd!%N-B5mO z@iR6o8Ck@o`GV%RH^O$K>Z`Nf={#l2Hl@>c;^6|!?O*4#8%A=YvCaEd6T=9;5wb;9 z$Z1AZ0|mR7G*^P`$MqItg*+}2cl6SKIf(xy^neURX*Jkgh-*>%OrTZ^nMDI@L;y&U z^VqE#`vt!t`J#`AB(D-W(i zCwatI6(?NPg@ed|!tNm_)kLKFLM#RwQzCZ^R5!AAV#hH=Um-m;*HD@u+P_c5R8T9Xl{xkAg)*|&EUx4Q-dMD z>6SuEkDPmvbvi~9AvbQhi?!?0EbWkRe=XUB4t)R|3JJG!Enr;VyI~4EGMHVL_}7jE zRG>y<(IIUr0kWOSy6vVxL5rEd)>&^8)?jOioEwQnXK&Q^9v(#Xw9hD&NaCk*;&5P_ zJL>762TIjF0Kzo*)u0_C!DXnk0;$J2XhCO(_%4Dp!RUQp*-sKSpI^(D?ZzHck4THv z%S{l6pNtnOPz41sr5XbbIe|UTpw%zCz&u`!*}h2Fq^lONoK(C{oG+?5=PX+|fJg$WrRk%Fm+I54MozKOl&U zWUwo46`gLElLVz~x-!22uj@<0JXWE|(VV;g))_QVh-t9pb3?tePjJ+Qv(hOl8s2Qj zl3-6#nKHE{k2O@_MSpS$WX&$L;@=j77Q7z-c<{!TXyogd#cF-JSB#@5wxxjDqxaWG z-COKk4#*XhU}dCXVw*x}U**ztT{)ky3J^|o28kTcyEvitKN=it}F2J*|3%GF#SGkYrV zSvRZRc=aCgbsw>5eb~gbtkif2xcS3Sz7>0wM@6Ttxer-Ta-;_5oJBr z^VKm1MEMMl>6Fc#Slmqm?Xz&wsCzh%EGUyks+5b0Xt_Nxp9Thu6gYtn6M$LZs9oW~ zwRMe;NQ_HNb0YoY$C(~<50(TD5fd}6}g zS(yB{)T(bAira)6AZ{O~wM))aSB^9~eE=9Lg-B2pA&$G(dqi|50LOzkrBXo?*y-J3 z&~ce9;5v`)2i6PD#Ky?#7eX?ZtEY(@5{Sk(PGupLuO5Z_RN=mzI?UH zui(WjK|F0&(dWTp_{OYc8_9u*>%B%UGEY%Cl4nFs{ML%s?cp>lxM@SQC5xq+$9gKi zW)XS>g>W!2Tcl~&Zuv)b>k*pW46t`M)M8+iPQJP^SWpIAXV&e$17S?&lzSy;D%GST zEA)z~EWSd;cxOzpgiu)rt=2F3ut5tf`ksJaLpMz0^ERX;8H;M=(sKuqnlonWM)A-AX+H#}q8@nC z9IxVyFuj}#ZMduK7AxIJ8eP}g{f2+5NwCf`5on5z1m6&B%H?2!xR0X{xNK*YQ&_$( zrYIxHPd}PDfnviFh+?hQar(Gl6RnO1*{a z9z?@#jk1SbvmazG23`J(`A^JqDMf8i0FmA57nLGF;d&sjULqtxT}6HbKyyXN2L&be zkdu01&!wAuX){q{Te=ihpqr&MIHz#`Y#!3V05b)iRcs8ClG zN%^L*&|Q{=vU&fYEsS~77k@2{bU=6Ci?Lu&?{4a0=1)@oSrM!c#ythgmOZq~495{~ zlyy?pMo2`ZmeFyBBBqd&`SaaICM!?Sf5YWis?wOU&k9#wa6TNLe%Is`;U}6}=0o=- zy$j*Z2tHxf^E#@nPvVU>vCZK#7_<3vN%7(V+I}Bn={^y^uCCIFI>MFtOrDnRY1GkT zeh;q{VtuQ1$lula>}+v-q@za*_4o>Y3#Uw>)dx2Mj$To&jtIFTDGU8td>sk{mi4Ef zO}6-lySh8A^S|`uG|E+Fl9;~Cx`ygCdv5LMb&G1$$Q{O>v>rOW4iyUO2jfE0upBCH zUN#{#gLt+!YlyQWJWL9B{S z@@dC+6tPAbUGq}Z`N7}Yo>a>X%1R`H9?}biWjMX6Ey31qitf%Y?6U3{{(jdc;f}&{c}I=F?qNo!uSMe572qS3_{nWsB`| zDADP2H_i8@&NltV?+c5UTJnfL-e$ao`!Utocp!3G%MP^W6;O2Vms4o{r3MUc+Gx{6}sm$g+sbC0k`=}zVCje{!slP zOX=mo2s-IJF0svk7Y^oT-81KrXw^R%YI;Rf?C@?y(9;)6Mc9%FuZ)Cx-=Zj^-dwFL zRkVY_Fe3K#b*;JF^iSfk?^Oqfz$F9?FE?1O%ma=wM0&kl9Ql90YLm2>TJViKuj%Efd*7;ute3lEDx^ zWxxbAm{XUSlKx5}&%+NSJPG1C9pr|x>8s98({ABMhmxk4Pf8KJzre4k4Dny1&{*e{tUZ+Yz%EnmW z6~PIS0M1VBTeMX&xmADtICt&d&0y57bnE;S^!en()#j^J5G7)&V!vU?v&hTVqI(DW_hCDrQt`Tz<%4bJM5S%NA(*8Ul|s|L%WZ zV++zAmj*3xn}z*+2zD&|^Z6g-ee2{?3POcG=|{Gpt88(eEAEinkNd_gw%RucaqLyJ zJDEJlonn2$3$Bdm@V7`zhJ7hW5Ko*#Y}A5#WJH3Q9QO3yn?2aN990wdFc4aQ8beCC z-Tn)G+nb`r)CVnJ0HPz+d5E)8Z>$lyJ?lOR^=|)ju=ui5P8r2T5r|3RI3qou##1D< z$C!$)npC4&Ra`*iH+zs;qcVx1y*I3;hj>E_}3RhX}S&-wja()__@gHHGqC-)n`r{X1R_*No={(KO>*n+fu&(6ye;zNt zPAOerROvM9Bhi$a+5z-$?>&!4i+DIN;VnZ#e5%@fat)#F=dN-e&)bSL_-<+V<>Nb^ zsYys)6sxVScdzveiK@6{<(QAvK+k$#6=!Axs;4cUEy@Kt3MZ_s9}Vw3ADSKWoivK1 zTxE>ff>>3yFUoJ@oyiUOTvbYFEu%K~*0g^7N&nTox7G50STC_zbjut#>pMZ2=gsI- zm-EklD~hSk27KwaWCcGA-`sX%cutPs!|PD3cHD^`>dZNFu4Hv{Op2&srIZx8rx?kG z_-iTE>%Ca})ZC93lk8WV@!%lFGh~W_twE??v?mp?kUS|0v=7EJEIZI}L%j_D3DbYA zE_HEX;=OQ^O{6TB&3<7PV(x$1KNa%UBQp4}<}oZgaox{+d9wtB=QSuMu_Ay5ai_c} zR(SHo)rNBgEjBlS`l4TnjQoh4JXkXE3nkPH0vIKpwG7x28VfZIg{(X5LSDHO+mb}y zI_enfTdd56{A@Xp{1o-z+m3$16KnWc>d15N4K7jW`wwZrE2ge&!YtvIXbG6T`cHj# z9SIJ;UB!48t8gkk92Ksp1NDPgrv;AJL$BXfpc&S#iO_Ge-h4{K`9PA#!eZ{Su~uhC zpKYkO1vH~Dk<6&=blw5AU;~E8mV0dS&$8`EWa?dDGVt@WdoaHB0E!)_o7?S+*6-O5cahpB&EZ!&TV=FpI?b6ax_bC?crzWP+`)5HGs_2{*5~Z@As; z$wca^QCJ#K;|sKUvdwGAr{*dq5TP~lr1OS*R<{yYkQfu6HW61T^k3In<2H{mZ`9f!W?K zZUoaacn-#Xa@pghdg${8Tjz*?4QdeiIAP@kQQ!|X$79mzzKOa1pAzPYLVDtMu`G(k z_!PML_Izki1_(4@colyhUU@aVqgHPfW;7qTKUg=kuBHm*v|Mwf6_b*JK#&muJsP5A zU9T7O-^#a%e}+r(zcqXPA^S#NOnL(y9ZD*k{)bY49Q=^f>hzjmE>HCh*BHLzN%a#M z(rDuDP;`;A;g%U20|3FkGVZx1Cg{Lvf_{ZFCF!da}f z{t;-D9_t5Q)Nwg?hwmW~Ph3WCTJIP{9a&0(6YY2CLo0-Qb+5L!FSX8x%+N~8ilDDy zSLRuH>MwNVhR%UxZX7AuYH8IQ?~{k;9gNx?>G*t3=^w`u(+4ISsWYe*Y^XokJqvQQ z#Bwrux_^CZva6J_ddiMXHbgs^SD4_?yd;Pw<#XPf&sWK_Zhr54)U64-NiUb#4XyBP z=k8Jf4I}O2Qo5MV6}9RRIiuqF!g^QDm+5QVUo41Ux>EcVP>L!!tL-~yhW~drxu_sa z6NQ6-r2&e#NZEPLE|AaldFw(x3~?RyPzCAAZsHId9nFg5!DBm1Vz5^b79Q&ecbd*{WyRx zQw5-fD)NTxkJtP#p`BhXg}-yBPU6)_oz@b|6L`G+Nd(-os4L!yyih|?mx3OB%Yxg^ zH_q2SkL(wgF~g9}Oney(W{-!ri62ejAd5Z+dhh!KYp@5mxP%D>LEbtdobn&9v)ZdH zA7uj9O?^wdJ;vjedlwbqGCd260N|Lf^2q;nM~(uE}|2l>YgKVZy3JR|V> z2g1%ouCM(?RdG#Elzf=MnOg6V?+FlKyR`;Sxt3Bd;xIpSP>ggh^&nr6nsJOa6YgIYKSc?K zp%8#o1?Ln!)DliHyRX#>2(Np(lcJciYDc!Dm8IA*J8TXuvOh zl)q3aMj4>YY7~!Yf>=Mo)F}NVT~D}`2d%0gT@&C_Dy%FZXpza@I0@C!d9#J)8ZgFsq;OI+o@0ptQ=zr=p6 zGW{xigi{n^!D2e*X>u1xZ5Dke98KIVxm6!d#}ME?r>p)GxqARcPlJ94*4RTtf(+r1 zg&{GS3)`WkI1Ma*$`XiJe6O)r)KKX!2u&wj*aEz{e=p$Gi_nn&61K*Mc>Rq{_!P zmEoA|*$UmY{@U6%I>FK(FBApNEN*<_IUBnPFLle=eM5pJ;h`bP zw7BR9z2*6y6AlSW1951||D6|C2Rf?BIPqs8nK}wN>_h2Dg704045uH0%Yb9*(%S?w zWH_-#m$8O(+Lo7C^sk`p(5SU0D?gsUH$hn98=xL;pbI)})=8vUdVmLqlmnOGTUm(W zJ-#oNa0~jEI$LSp)@xfG&j><9o-?Hewcl&q+>n8deb>iM$Sv1#z2pSHUxAR1$ToA( ziqpwbWno34@$;HaQzC`SKZp7|fyt6B873*CFk%? zQ~F~ua3$)Q7AR~DKo{4wmPjPEwegYjU;1H<3}TJkO360YvuBWqprcFe_P58b`D>S+ zLhwocp7H}PUvh}*6;G~G*}VhYLVB9^<0!q;>Pt{T&^#G)U%7u(h6~b%m>60`VXb#x zstd;buRaBbD);)apNCS`G(1yWOWMnzcN#D<5?8ZP&e&=13z<*!61!GrsI&0`^VPlW zaCnwdiyUo$crm^+f4CF!ha&6_F(#ervPLxA^HATx=zbJ%t?%g+ZkQgiWdbs|%k$J8 z@2v7QBf4K>ai$qJ$vy>oGf%-#XSCL7PhXCypIjAIGveWTF2&L%<~yx%(pVMGALAW? zzuJ9ExqWH7uwT-{;XhQj#jF8k=z#B2E_Oj*mJ&|nU)=8>8zm&@N;-c3EnY{ubA4{gt(RNMYs9YycH=4~5DwAH&l*PG*Khr@ z&l{}f$`tJFrZJvAIrk07SU-i&;D1Hd8K*pN4kz8nQ&AHc-@X@$5Tv~oPLr~Sg)1{E z96E_&aX;QlfAeu)!&a@4uExsAhSzPCVZ#`WQ8wo2pQNIo5=13R5Sbl_NLu)fR(R)C z^?^vb5GRYpaCD}a%`cIJfkhjA)BNH-ak8LZqrc&s1~jBumpQ-DWVb=3GxipFH?qH63)DDkt0#?)(%6XRo)RmKA91lu4~#thk6kWnma5`(mM>>PlaQ_m4>T^QpG*jKmczU=Z| zNKz84-t@9@_HPz}QBYC^*--j)lWs!GC8P?awq%TsNl8Pq{|FH4jkNBZIuIBfl#0Wz zj>KW87~59guF=XTq=Pre`95$v{*x)}BX%7=Ms!C&hv)T#64%mzURCUTt$XX-!QklH zvRiGfZKY8;q6N((hL}&cS&qc_uJ&Z5GR{CKxR)R??YdMTiYTJj zW;&|ZHqK7(9_sP2sA{H5+`{#&rTZI)^tG~BIHzbfF*538#EJCnHGdcQx&Sk@saO-o zE!56tv7t5)jVnD7@#I!MgT0M@z|B%=2-lk6N{~PC# zD@3#WAK9bGuTVygm%UwqbTw7aA?hLn!7d{1|Fm_<-B$Xm@~I}qB#|`^c60#!n57T$ z(3ZJ1CM?i82u9&;XyCw+bPcnh$^K#;+Rqod+Q6YIjh-bugu_C9=AG3d+-c1MyRsH} z%Z3qd;Vc+;+$yFf$_yxZw}Mr-P=2)R%(-bmSbrf(`q3``OqAI_hPWKKOWV6@$yAz? z6Rh9c1MkbDs`jSCzCYy%89X3}+7jEmj!$%CoeGwG$vi@AoS6C?Yfq#*L^o1t5m)UM zjo6ze4Yz=6Kb|Wv#>LoHpJmsbp|y>Lg>XnYzs!$or>mLC9dqlTvqPW{B(1PR%amN> z)lmBne4{Mhhm5v5p3 z3GNa!xVyVU2o_ul2=1;SIE3Kt?(PJ4_k!Ssd+-z`gf`t!o8+f&mqEurs&`xC(6MCSqVI&W!sWK<`K`Aj z>jjpj;8%s!;&1EK)o8A+EVrcZU1p*l%AQ*Wk~9GT)Q~-@Daroln0mnmkG%<-w5}kZ zBJZ^%|Fo0G0nqH_?uU8zR7&OV{S(`05pOojVI6#m1z`0grZ`UQ*O>j6!aN9_6wVmA zJCP+?XzJvraG7)7r#J}1`V<&+JU;N27UlTjQe*}mr^E(ZH_}RexkE(}N#v)jN$}GD zZC-m4MLEqcG3)d#&OKv$4M_fe3vAr;1AC^439x6nfCj?TrSnIliJ22j2BR~wxjLS? zcy-2Suh=xp<{hI3@ZY3;NM?I4#u+SRKAv7Fl`yoHs{Mjhyd_X$T9c|Q{P_JiEn{52 z^6$p^l_GZq?4r%kkiLh+cIqNeKqwA{j3rbw`Ez%0wdVrBRsd-AkZV;4cdwq+4Yd57UOIV%sbfNj*k)iO;c2x#7*EzH{qnnIljrK?l8!%N@}`vv4j$t(wVS> ze_}Vv4AeHsMmb;}oG;`Q4C0FD<2fG#aI`vH!0L^!UV+bUx)zPTsePagH_;|Jp-E`Q zgF@E(d@Br>{?GQd z%8uLG5xVwUV=^Ziy6$U_mgEgo%9S;bD_Pk`Ma@!EWX%kuWd(xMjlAR{iVXHi2ft(% zZ7npC>zMfN;CI|m{i3Qs-4UoN~=Qy>)o1~P|PMxG?Hrjc=P1iT2?Fs4mE(v=4MRB4v^ z+U3J_mX?BrbU}(~{JNlLe*p?*n=auvU6uVnbN_ag?HoaOR^i=8)2RgOt38&fAlD5< zv8!9RCd&fT&xoe}cfx-}p8sqsmjW7r`KXU{q@_u7gHdS*k0+la{^pNpW<8sG0f;11 zzr@@{FpIE1F8dZCC5Oc3{yc`WdJp$UG9ME;p?Z5J&|*73L{!w3^_;VCxNk)}K!0yy0d2^C4ofN>4f|dpHV({p8P6ZLStgk z%m&XeYe)ZjbzkpDO=G7Q_l;4yz@OasH2s~%{(5N?8Y^Ev-?9KZI&?&YE`d!lQ^Haf-Z4K3$HMf<4JJNlfJ!efJwgO!#%^tN5eC%4SO1eSK<6B9rsZoWx0 z@jP;>4JF2Tb0LUkUif7PM@XNAO?RP5*?zuJA5pl7^|=3Txn0*pvD?>VThCW&PlI0l zz>WBsl|_^DN^ClDeUG2BD#}FxW}NCH%gQcbm)`oGaNKFBIm)5><~;`rlI-}m!>!o5 zaqm7|#CIkO->o3#6bfx6BQ;+VlV=eUsJ=2?KLUmDW2c$GuO)!{FJC*)3co@>37_+l zcDX3*V@c7F#~YlizG2y~{5LJUqB$fvzl{%gK86*isiO+QM z3G)X0=Jj)46E(hcCre{i=W@q8kPSoDs#gwS{!#ggF8)ERLWv4(KKZ)ldjC14D;U;#dP)#VTs=mAS%H+yywD6|6DuGCV4322&{&w93G`wO?xIkvoF@& z!0P=0qR=kf6In9R7(b^_ZYz3nSoId9odtu~7?e$O(LMRJnXR)>iVcfN7Yg*0JDnAN zG@cwD#Px9q9hgjJG^r#b`{W^S4@@nw2c5ckg=jUMh|gE*>d)u|_F=y}< z zXoXJ9wN`cJu?l+4W1XDCCre{|fN_bKGQ9=6Ut)UX`XO4RQd0$YKNEe&;diwyTb+SL zL@ymsOnbcj%4?hXZhz~u6yL(u6(zX_<#&#U%n2d5hfvKj4Xqo<0*!I>8`CP#4zJMO z(U*7h&|?DJYGRx;jTdXvuDqJXEfrxEuyXY(EN^HF3M}1$@~FlZCQh!;UNvF2)-7_> zhvgsLWxxQ9~?+@6bBf1d+s3@VqSeB7u$o9`Cv zjg37~qoklTgw^TMj#hQkygUdVMZ?cV++r73ibsNA#m@V^;8Oi2UnnkbpZ$;NcTAZ# zX(gUV&cUHRP^E3k!Wr`5AA~t8dp_(L5nY9JVL=EOH(08w!b#Z&eBmSg6r#Y^h!ucv zE5Q9b=4yFq#qqq;=onBNX8U%^so`@ozt|~H_62Q#zFNN9d<##%rx2Wm={lO5zY}4Z z+e4(}!!7$^8uK&gxNxC(rDn1S#kF>~VqV zQTz%v-;O_;2l{bhl^Sou#9^7*gy(i2j;HI1z8<_hp3dGPNsvEY&k~oqg}3|yYC#9u z;>XZeq}BJGuP=I!5 z(dRoGJ#)%hwmPy@k9Lr7f1@J%=$A_A73T96E&x-eoS`0Ynk`bC;jv$Rh;Eb*fnY4H zd~W#;K$^>{m_$^?(_OW8f)@LFu8<`qJm%}%=qDl1V|TD?RT2OXD93gqTzvs#BpN)U zCSAkY$scAT_PEKU0xf?<$wKv&2RWeL1-0)T?@eS@&J-$^$t848OJ>2L+w)E>-&uOa7z3F67v&$t)G4IT)4>p+E>k=(3un@NxK+N~Ai5$z0wDnIYQfrd&(#321kspx zKpE)3%~gM%MqItGjveK@d0)(=*LWWdi*?tay=ZMxW}i1Yf_h1Dq)dK{LlMvqHIGT7 z%wP32HXMUYos|4Clf7pM&ZJS+$dzPUa=?`Y|Ii*&83BzbTg3TX4$u?+VLe}{uTter z=e+p>aH)KL4_m;DixDP-@`mq( z$)37xtXB?~8Qibf?IS-p<$rm2II_1yEa{zF2x{Jy>gK3I?AwVIg>9II!Z9Z!ewMVx zV8QMoO8BFa6#zZPdvCdib>dk+`Mqk;I8O9i2-_>2pqn==wH)qZs17%^u@JrlEGA#V zG#sniTgQBnHgs4RB-O5j0K}V*GT-fn8;{L1e;z0*HenFx9AQ*J8PfUgVQn}vN zpiW3ZV|0n(LP_*~t$k&@or0zZ?0FE9!YQ|~LEORHkLB5PcjTT&qd(N^J5w)GKJ1*3 zbzE8Mc(h41BF;S`Bk(I!Ov%qczv%Stu&8>7OQ+j%M|OlCfs)h~(A)7yTqsh^!prs# zb^W?D)$_nZH%-Pc*sy3&L_*$RnCXDflWS7M>}%~){AS?$yPPAqH83Knckz_HdK)l+dP5_s8!s7u+d`P8P!Kx*}3K3zjUTsbCJjg-3 zfn!YEay?y9EZy$&z9G8wkK+ftTOM9mRb9g&eN-I2BR@{C6p;oVBb_(9MIE0G2v`w} z3&e?FEhu8kjETa&@nf$Xm@|Dky3u(O{koZdY1wGYfEM>-vpr=0`z`+2u$zWqzEZ{~ z`@WlO&*08%b?7K@tltD{gd-7G7n#B`N)fULUXs0Tvq?zfZD`m*%VE7<0gV{nRQ}M2 z3izedU~K;JzpcLdBAKP~o{es%%pd7Uluxg8K8Jirh9lv~RMJC~6cM zPv{5U_tEpgKw!VKolh9SkYE{3ogJ-INKXlUS0qJA=mJ`x=g;==uWbVaAv;AwyvR!R zO!TGQceKhLy=LmJJxr|@%+0?LxmWF}4Z!rrZe-=_9<(<>2fG2==n&8P^+Bt(;J3)z zEU|+MV!5l*!kLLHQwY&ywDe8Lru)3%)>FypM53R1bu2J$@;dW8;h*t$g7`3=DHPIK zsP^rZ4vsp`d#_qw5L4dolcNm(itJJsJ|LjK*?=4^=43)<8j8wRici?LFOA+E>L6ly zjbQ2$NoeJJv0Ka>Rl{!zO(7z%`7ES+cnZJvG`rr6?6!_e3d7xX+Jl8shdOlm4TIJK zaK~C0O$NL)t_l^MNic;avhXK2^{giwPQq4nC3KIujk0Z4VZ_LTMJfv#aeEQ&;=l1c z9EPU`z+v~Gs6{$Q*Ig?;1R=S&pOT&0t~@oaD4*~iZ(1(KrcQ=9|zKCEQ$G4utIb+9c-NZ*qf8ug4}ph+>caqjM{or^#0 z3;#f!w57uNV3uF8!aH`WLFXm4O_flgiDVA+PYu?b#&wbwPQo|pH0p2)$9*1;Nc(-# z=(GHp@!>VfhiC9UmY9@l1G3K#w+p89*EM&?>v<8&UDFr3#TeuLpQ^%j8cl5U)}Tb{ zLGOq5B2n9*GV%KzDye6dOsF(s0kwzc4GO+^+4TABwx@{eztGA;+8(=6nIzxW-+B-? z(y3gbl#ga}E)Zbq=4X1)B)fJBxF2NGqz^)T`Uq+O;fGeCKK{rHOb8y2;Ft6Wdt4AI zglOs0`RU|OUP4JUnPIE;8r#D!&rxI)>cw0`3qOKBMiFqy+*M8A9v7TF4Q=Ipaz=n* zs16~^VG(jaXI;DqRqW#a;VO@*_~xy<==RvQRz1GTy)%kxH%Z_oE-1F%zRV#&2z&{y=Cc8@pCiJIKG zRQsUSOsU5)&}xYLZ=g&e+R$k}{vH>Lt)!8uFBy<`*Zm8??xpy`;K< z|ESiv?0t)y=*M`|rWm59_eeP6fG_DATt{xJYThe=JhW;ubWe2CC|fM0D+)C(cL)DS zx1u&ij!LD}d*=64a%DSPSl}wr95R4ejR&NsPTFBdmM59!x}ZhMhJqKL{(o62xFa`!*z_09$Xj;2} ziCzQQRstK1#^mmB1%H+RVqoKxb7BAImHuIM{m1ADF0=`=YTn)!7Bu89*(?zcgsxNO zpC*dXDvjd-hG5qFyhmC{w3mp3C1|L>7|iM#qJBn`s;A#-8=^~fbYuCT zqFJ&L5=7-7DTeF+i{q{7MNIp(z^FD|8HvXqmyYF92Y4G z6N2!zSm~j=RI;m&$PfOYQ}2$8?QojMN3y8|mHu4qMva=98^*E1d`VZ{TH^cnG;_AK%pk?jb#)K#AM+*XZH_E{|yZhFov}9`-6jr2Ri*~0OF73fam1QGc+)Dd(G{S5nv3Y!s;{ta20M&B6beekebQ`i2O(rYLL zw%4?Gih$9$TE9wk+h5#hC#2RrM+_bh)yG?(2nib;7!o-LSZnFiV!(c^TY}ogz;%gN zAq;|}q@-EwpfMVghi>Ak_+(uGs(T_M3q-}Yp;q2+p!6~K7DCkloX7KT>ub4|E?f!X zv?@O3CB2!%iJN4~(GT?G!TFdmXe8Eb-vw=b)aaJc=G~R&0rsYS?FjUQiN+@~4!R4f z*KP6@UySe+LMYX;q|8Qg1ymqU%8juZ0Q>@mC3w9r-@7{4zEFrB#UyY#CEG~9;*%Lf z-29@C=wxXi%D#kt7AWZ-@J{Z7<9+~bg}XXYfZrpeg;$F(2hCBA{&UCZ`P zBw-d%H`YbiwO7rSe*1nxRjx4IriCf2x@@sDOrm5C@(RULI^(vwb)~<5MaH*|cBJkg z(*}2V-5$R5b2Cp8-uFPw0kV}Kp54d6yMU=R@vxYDOQKyD33Q^!)?B4^gic>p+*`g_ z2u`>_`nfM?xiw0|wPWvU#y4#OXnI zg_WF@iy>soOQGa#gBpCm^mN-~&7y?`ZA5P9J!)8@{ ze69?7^$`uq3y1ebtXgI3_F9#?sR)NAo?db%MA{%4za%okebrAsaW7g^8qPGjtvO6alp0?G1dt}rz$4f zSn%1+%_3NZU8d(9R(v2e5RleFnL?jp_?y;eJgAVlQp3F?-K_yBv*j!#%c%Y=-U*h` z>?l_H$}oEF>tr<>*1NN%Qv1d<*DW0`1Fe zme<5x^jF`5J`s>3AY{7I6Wzq0?2$E^_bB2ZvkfOUU#{!aujj_Jef~s%1d;@ zdlM|fFvNfIvdWsxu}7@%mg)E6iE53q`ARfLpvPffD2q*_wG{S(aeQU7*da&7V0)q5 zXmX^p8Hz2rTG-RmPQDx?@`LqJdB|z8a^3p485#QK&23A8)PLh2{{t^?%IhmzljW&wK4iSx8SMPo>UEr{2BkwLROn?bX5lbdGH?S46$*!rfl zA#;M_v(T!qJ>&5Y6}iw{E@8h!G`Pw}5dWXJ;_By(v6T7ntsvM=tYdbZV`Rm&rjOi* zE`(k+6=-7%6VbeQON6{zUfo0|{SoQ{#7=*77(uJ*I{|LYsTOuu83Q=nt9NLsb)TjL z((43af25yx^pe0p$LUZPclEM84iMU3n<0A{hbbk4vt|n94tPm<>?m_k?S4a%S$z>Y z2C8WA*U(!WAuuvplmR{S zdxsNCUXusYu9x?=xekt^^=K0MBto{;hFRFRdUMNmTsc5o(+Q(nDPc`3Jr_nD`S#Cz z0f84Ir5^Q5h+N|{<|@}XqaoD^%tYio!8D^d$B}t{GSGu?$R<_no!ijjh}&p%A5;Ye zzXLk6#o$5hWw?sa?o}eGws*?tMl=yJ8ksw+ydoq@3W`B%3>Gid10(IMyd6)q)T>xV z?Dp<2!@bACno2h@F%tMmVI+0{hkSz{zFG0|UF^>6e`*0le~RMD)lbf9jv8y zf1BqkkK|(3xn;x?3O>qos z>N0>`7{~pGy9Yf6fTJuBdMySN@;&9zO=y)fXEuIY42=rZ#49eFs7kH9-oM$$IT4gj zQ5Ei4!kB+&gic*OTSPf1Kw>6+Kh3=6J*&te+deoS8)Z`24@ZeVf*wBv@45F=18R%w z=f_yt;>MCU#%o>4L@La27Y@QDf+An3(}RUjI~D1ayroa*!b9y65Vv+hOpJmLgO zkrL>dmFcwFuX&0xseQZMCxf%n=#0xmhSy-`P|kO85)ppnavh>l74-c?V-r=AB+cS2 z!&&f3jF8iV^I`og!%#d~bufgTRzo*;82@Zc@ZITjboIfNm=zP-3CgsPlLXaptWZ!U zsedWu#+}TA$U#+4$s3bVnG6k46$H`ualI3jsoP~YyZ9d}_p3+%z%$7q@h5BBhJk>;^ zpc7s-DsP7)n)$u(^{sLnHCUWu)O|IQl8JrfjT#3LGixKS!=_R0e8fcU-(0dw-GaCG z-iLbYt&&GozsY8O=8qM}Vxhd~r|9E%aT6uKE<2|T7!6xx-pKrni!<>+voM%m63pWc>LdR;`h&@M_3)k~ucqa)Wtx%Q zY)s~C#LZJ7sOJ4ZQ@8{4psECH$TJ%ow(U;1nCB{}$!gb~XI63rL;kyCtA1Z2#_kV` zFQCXGrop$|Xp~2M9Xh^Fg@Jj#BH~;m}e|z<(ibADXMf4lvlmR~;S!y2Dzn|>ij;NLf zoM&zckB z@bK%jSwkf&^>!tA{zZyuId2(1U1s%3*y;SIE0sZl3s%X%ESAgsFJFy`4IOO2s9u;j zax<5}ARA8wbklX_W4b1raGx!=X)6LY-KHdtBEKnO8O%`Tvqc4O+$Ylcj>&sxvjn}A z@L_T=0EgUyiOjYq{;%>h+Bp9*ivNDq{~X#EA0)tiRieReUJbm&TiZshocUSbX`J)n z?uc+hB~L0!vrE7I&sp2o7RvuL0%Yh&NI87y*`w6|*f##<#3hho&2kzx$g? zKcU_ERMHL&NQjaF_4E0u9@u%8MSXmSj!1kzZM64XT7bne#uDv68!Z0iME^2sWR7qo z-ei%GnU*{`fW_f*(y&-+-^rT;s9of80YwT=uhGUK_C)so_|*L4Y~47}GnY z9kLuOk!CpsIG)-2t9{vul@?83Lu4ef@`Ia2S~NP8-sqQ$!7S)iv!H)40shNR^=}Ug z8PXED18_B#{H06aV~51L|1=^2Mt_HjfUj2hU+(9BJ=*{ME&sQNyv!q+`s`p8ROY+_ zIeWzo7;rksw*NDilJz>z&CE^v&!_l*UEhCvwEtiKNvAQ&|Nr`#|9-e$b%6)}Im_qT zar?g?&i~iT4Yu|`{4c-le>-;nmm@cYBZ0a9S{Gwr_xb;~-z!*!>FjUk?f<&7S7^8w zx1$QkvPG7v@at28=l=TL3#=Ps6W!lqMBI@CGTFoaKIS)ouV~qsawh5-6|daCUr!|g zoSkgu=iQ0t?|jY&)en#(L2ZSWe6s%!gQ|@WqYai!ZigitQ4>U{X5|MYwpeieQV zw|d8PqwiMocsg2c*Ssa=a=uCKa&VqgefAuBRJFKYD4(p9A?#7blOgC^MbsByV7Ja<}kJLT4t=u{zt{?oaDW^{#RI8 z92bso8L*$98sJeY@_gPGQ#pvR8tzTvCs4%adHi#w&CRe{+~*Of6#liuHXHdFv60~A zvV3>EoHvotwK*z0he87)_2DS{%S@Q-5x=gO+5r_iue&Uk+MEX>$of59Sj2WDyKV80 zr}HK}fM4x22a)Q09x)EwICmnP{h92%qul50y+H;G#Rih=K6mR6v@217-(0cN{=}7? z?t3I$W(^e=$dbYH#UN?vl>DzK!5nSS3jB`m<4IG=ag3lGXzLx&abm|He&CiaZ??)T zag}k|080L|QKw=Eb9Rtyc=|oHIE8B1g<)IpPUX>)WuA1gG)Cw_2H;YzG`fpUb{!TH zYA%#(bWtnjx*q=#$Zef&WWlUAGCr=S=eHn@c|hBpNMy@9^~x5M?4pkMJ-?Yl^g0h< zyzVS0ycl3>usGWY@8s;fvrO)0bfUQ?ttvWuDl4uPCEBS~{H!Y}zFKdNv+Twi%73o*?27b5mnc=lV5DxH2o zCWT)${3I>;qD;$!+yvg<;;y>(-0Yd<{l|IvznMQzA26GLBhQnyReY*RM2Z`Jh7x`m z=Ps2RZ}nZR>?gIFT?05#ww0OQzrS|<7QMF}`*{IbKgq?kf?@ag&7RC9@ z^ffp#7EF2^>fGzj31>4!;mvb(ZlsFeZb7If1riq&rHV&d4?}?7b(v&ja_Cnr=dh(t zd)``MDKk*X%ye)~3ZO4v0f^F;0NSfx?9g>4U%d_Ho4<-D0hN<3pVh{Wyn(1JnS_9% zr^Ym4+tCS+0HpO?5A`HkH@l?oG8gG0Q-Bj4@9Xtvq5B=2QrT?;NG9sLCmJijG(E!z zd<1HGRyHGp@f6r_Q6}qM3XrV=bed`4JQEYBO2wDLIeF*K5+CAHrVA*japNRqBAAI15gMH zc+YEHzTfZG+3ulnXQwYfOM3r>QaVc2#?T|l?}6!}lf!042ahfmY|l>j$P;LWI))(hTQ6SkKJ`wWmWeBIakKD!MBLUZc^x~9s=lNydL@Zi5!sNPV6nAj?-~ zH%IneAxU1X^;Q~fjTQ5K7{d90aV&)20^nCz|IRPz1lJgpsC1TFFJ)&|Rkk`G#(!!z zrJrYG7dK!??S$IEiLLIFO%Bh2mZq&TRd;2d>@NqaB+r+r>m@PktLb~4G<1IHjm{Pdu1xB1(wR11dnJwtu~^+|u%FvKSRkb^yv$#UkjLJqk|=f#7JoOM1L zXqITP=gLdX`oX5`o99)Xwv(l6_ql9rvJKH$`z^ZHcTGI)Hj%~tMCz91z>rLF4?IS} zh~0*Rd?ObRD_b=1qg4H7JX^SY4e#K@wK#Ckb<&&Rwow_1`o8!hps>!XuSBclT?Y8{ zmiB&q-^j#ocm?iMNcvdtso5yn{xhdba;M#$lV&N1i~!44z=d-oIZ^lDx6A*{o*z#A z4-yRb8#6IFep=c1VAMwLVywQ<;<5l0G|H=P=;!c*Bn@I-M-9-%6ITgxCI$Q+QL4^0 zK9-n~DME|Xj2T>ZFRW(Af`pjg_e92R(PHLvG2i(L8(KAudwGz%NuCy>H<|ofMFU{V z18XkY3C`1I`MzDC3{o3g<7E$zO_WIRvKUXz+Z)rvTxf|SF@5aREc>LJ@YP{mS?FHD zM+TCN@7Gpr;9cWSbMSOMt6XXjGyoY(A^jXVAR!oAd9KuTzekf4N`zv-s3XF1fyM#a zP}6r%Rjp&<$44rS23*~>0enQAth*~MB_%?xlSDi%j zF1rxr25d4IBVAtGw~NwnJW~=h(4y24N-lepb166W97V{f0=Tv1Mf^0p4j%J5>!@M!@dKvxwo-lu5@BRg!ofh^}YauKg*D zc87x5o>ktTIoV-#^gX8tUftaD7o|3T-fM5X=YPkmnh$if@dnjT<eruwXyczqZ?Ix615)jD!diTcR4%dB0%(yxtKjER5Atsk%O-x(h4}jvbAl zHlwSI*0*%MQ5aY?E=yCQ`Ey=DD^Iro>q$8O>rf(n!o$xMfLZI=ynwZ5cDXlP!RKmQ zWY>9b?gDgc+#vXzfn&wV6C*KHsGyqo1_XpxZUCUuvZxja4oc7nxgZCqA(p?Nqxnx& zoQ74+_l{dKb){$Vn{R&T%>~}q-S~K#A1~EprW?&}XabL-eJ)ptu$nK~heSF92 zm%%D511WkpR8xkERW6#JCGRtsG8g774{W}w0MlZ2NA9|zF`;g+po_VrH^g9W^0+tT zO(|fL4k4s~qLF}1KVNc3w@+*LH=m59u$KaJ-`J3O&>&c?H!XCb9H6Gn|wZ5^h+ka26eE{t041ss_p1$>S32V3AmBy-X(aB1^+OKbTBjrlo@G1+T8vOQoV9kPqMD z+0561vvs0KI6uc^tfTj``#UYI&V?Cv>?MWghG>+0R^=={}kLXUk~=!eJS0PrlOZ3pEWz*-%^nc5K-0P}%sHNblxSlAU*KnUKtE zkbRWcc)~{`2PgSiJO2L|kT^7u$1)vJq6GY@l+EC4KpzSl_R3ec@Ld@FaDox8ZnIe4 z&VV%EV68O^r&xT24!F}R@8%1ZpuJ^!h|df!(RY3SYZ zVR{5MB)!GSyp;c}U7UA5-=p{UW{-HOZ{L7%oQ)`|-(i86^;Yh$2YneCv4)e!(BUr% z3yK+BK_hMbVZ1{{vqee^!P7=?%fBM`tjr)nK8Ti=1Qt+1&r>}?LvdtnTDrkAx$Mh7 zi0{{v81S&r3N4e;IXR$tUDy6(TSrd-iqMjd3L7s#fL`jfc#86EAtDLk_AJkF*HbQp z0*hA5qqjxr!P#oQJY|+6ClBcK)}YNg&p^2B`EHef*X!A2wJHiUCcFU)HQ}|JsMAC( zg6Bjjhy$+)Q6qJ{i_om%ug>ErQ?uO<!Wp!;?Mn6z~?Sh1g7GKs1%Y1Rgp8ss$|?PwxWSm#Xuh7h4;xn6A6 z+}T=hYV}RjK64`{k+}ng;u1Xabp^wVU_?)7KH{I@Nx_PW)r9lO6~gGIH(~=zHdO$XT(#|fT5hP z-ab!u0r0rPXlCYGYJ9^5F0l!qSVKa@;`ug~&Y3n;{pMy_B`^&z2ca>)A!YrEw3jB} z6!P$?Ds#Pr_))z_7KUoIU*^DqMZZ=h0dA$?Y^SVC)I9@mwc0q<6wdLUzJ@2suD->g z{jLdQq;-7ObR9jayKgCGM9khvm{9R(i>2I@Ro&6?DF6K1glG_<+a-9b!^P?NN5$ui znBV1w5(ke;I;&EjkAbIbzC_QESnxJVSD_=Cs|oN4T8SHXmI#DJM;f%6E!34XaK1K znn&3&2Tu7b)<+y(fR954H>K?>WGM6uI-$um0+jeUFFw`)>N22IMMEfumCvh<`o-cq z8}9)kt;N=aeygg!x5rrb&97FMqxti=Ji)A1#brVE=j1aZi_Wq*70^{iE-^4B-$|rX zB|a~y@wsGQ(DOD{7<6bwk??O^p@lC#zOB&D_HOxDY8vrdNbROKByxW4kp20z3dpEi zJNu+~*xFlPIBV(0@Azp_Ngck}D5wtq6~{>8QhX1B4VeT|dx7sF_Gkx#m zV&-+e+RumUSj1nBJw9_+nK*_^Wb3Q9Bh3SpcA2Pmf@&WowMx~PM4&APu805TnZ*us zN2lZIx{8?`O5=vr;d8)+errSqDi%Iq5eL8?BjgB9a~z_nd9uPOi+AOv*a#H#GFz8&Am7RwBK;S4@>_^ znHGk1&L#V|d*a+T9CrOE2}K%@j;mAG`Mmv6XorCBTJeysLw55+d$LU^6W9-ME(c4J zAFSUp{t;6F)IYk^^9VfW$J*S7KSH}SUAga{k>@)^s2oQQ(Ho=i(l%39wPNg4?~cAb zL|!t_pW6Mg^ls4RGXALeN5x7pi`(h#Xm5K{S%vRa8&(V{K)BC|9qT8EVSMHqyyS zoeUj*k__2K377+kcKnW?T@*fe2`eh-)u#O zbHW_w{c2dPo_s1q?c^J_wH8|Z&b*esEk*gu9XPvlDOXaR)BdH`pAOFwUyISOTvkv# zEK23baMkE7=MEpvY$pwjCk`UC;LflrQ7pwTVl14$lQTf3Grk%+r4@^pAcY>kWDuQ- zmXL?Q*pMznB7HSDToZ33S-oK>g`ws#z1d-=#`PSRQ zH}1)tdbOWS1CST^CoE9^hHQ}er?50X>SD>NKM`BZ0|^!cG&in-685Q54~}NF_L2E* zUXo1bhbH-z_OrP3(UTue?pqC3=9I1ZQfL@)yn5 z(!nLVp+-kQEKv18M&$KPv90^gxdCV^2{UNN6vOu`VVJiL-DT{)W0wCY3x zOcFQr5C-XygvWO`&Xu1Tq@#}^KlJR$vFG=#m#X8S$vILaOc*q@D>X!S^RKdBz6B!} z{E|<;7Zgr>$56gSwRY8Vwf{u3sKe<52u%Sj5p(Ee=aV(nfa7=3Go-kIGwPNz?;9Yo zxjGwgv>J%G3rj|ioi&~mVnz7$S~D2zpZ6yC?Tf18-nbOIHB~21?s{l-thE)b0B$0X z^`b1*+NrXw#AiUYM>Byon)339WhYxjI+@aW;+1H+Ntq?-aoK|70v~R(U(P*A74e$V zkyuPx9PK)irR%y)U`}>iR&oQ`B8oQ4Tg-R{>5#F+ZGsYS4mSU@x6e#|spM55$NkTd zyN+yT0wM22WqQ*5`h3}VM_18gznA+kKEEyeE|W{)EM;( z&vlMB@AvJ%_6k5to1nhW{jSn{gBQy$unud;kdALrXW&yuZ%%4QI%4`Dzn{~=nq|2C z_d~$;b8g1$L%Qw}Sm02=bBu@BcgbVwx&%iPuqV*yc!m0|GU;C}uRiKo`b6ttFM3zl7+thLBDSk5m92=*-Mt~+4TKiH9(8M5bKaM>P^ zP13PV-@@y3T+eG8s`p8KztoR^45Z0<58h6*Z!e4{6;^uw@Ja{6Wp<~ZsP#p)OLQ3% z43$_9N=R1o=DGjDsHy;zxx_$ZAy=Xjr^vL+iGpfk(TcApc4})`!fsmrPB7uo4)Nmk z?=0q$jP7FiTBUBRIhbvB@t?_;c;imRQwTYWtKzBKbQ3xNw}WCO)pex71V)S}!3lwv zD7$1X(8e*u9VhbZ+Yz*)q}l>`t6xvoJ8+JtYaTAaNO=HasS){u5$#YV^z8Ox(21d) zMOc;e3IN3yc51>%JVk)qUor+(IYAv6_jWmePRlH&Q1F*vP`75ak!Xk|05cYaa5xx10O&m>8V9v>GE;H&*Q z0FA{FB{1)t*Wa#aN~z5!WufQ9hw(b`=qAxxA96pTBwi<)Bnn9s3h1l_m({;oUwo`7 zy)QyOj|qZ%f#3?Z8Ul&&lU1-ffQV`7)|t(7Rf?N-rSZG@c609~Lq88GnBUVVh@2V=_Lon!qNTL)PG0z*Q=jUH;6hH{6DLJ0Oppq1KIo z&g&3fEctEvpwF?F$Ki*(v+(K*;l91E7Y?oB?szTk|FM`07tn>(O@zr2SoJqCTtJzK zB@fzgfs9RRQ^~|JXat?l=IHBHTq5RC(**cFT}X#K_M38H<6cN5c;-5NM0^z40BWlV zna%_D>;ZJ?=`=Ya2I3DtQJ;uEqdx8Nwol+Vvo}N(xlRlKTy4cv5u%7+o^r}o1$I+1CYId;%O9eC!B9DAkOl?q66s^vW z@UjS`0Dn)Zd*)(~7)Vz!Hq#P1Uo`a7B*W`eqQc7OKW*0kTUa1$y#J{pU-bUV%l;L% zY<(FzlVPJbH7T_J)!}kp8I81;;@0lS$de4q;pT0o<> zpNfV~RXCAZT@)ulw7FTL>-FhMt#~$X1KeWbbt4eRj}PhJ@47V&iG1xWvEI6S+4))!~}9@P+S>ay zDq#uWU^TmRe`XxfE{Cj6e5mPVBDo=?Az6>~HnaeM__huV=tOkX@F z4LU&`-hncP;s~$ePlze+;HsT>t^?t6;pg;3r??VM+`hGM?#$JQ^HT)w&*+MKoc1?? zOZn}(^aH{Xicmf`Espv;=W6!<=I1=4UO38Gf%nF!vrsIO!6<5wtGjwo-uF~PI{<6* zYc*IcPPgzMoH?w(SE1T=saJWApRBj4^#|i$K0ZM036JzFJZ(Mj}^Kr}M9?aex zEbAqNT5e<@EiK}RQaY#YwQJ>fC9Bj&;L@KuYaU9jzc7R}ht5zU!P$XKIeegf@wHS4 zg`&gZ)0t0A6G~<%V*p+AhSq*kI)camvzyy}MSP6sr1i_)`cR3_j6yu8-@m zRe2y18JS)0A&P0W1I~a#o)r3`+_{4{%rw2uH_2s6>Yb%)@DemckV3JCJQC-Qw~I`= zf(x|zNZ)_OcJYZqY})9X=~q}Ec^R^qYz(;G9Cl(J2NfL7J5rv_rcu{)_@cJG@ifem z=I~R*+^mQf{EY@caR~w{Zjz39cO>^ISY4*)St_4scwBHa&J-)r)&nioxRW7NY(=zkfF$Vwqb0nC*w^2{6bRkcs z4tVu`z9aN~xwlwn>5|wE29Ui6TWB6*pgYp~GSRBj$%IYl#>~8&iU!aNP^>$7v-FwJ zVY&XzuSmS<35b#xv~Z{t8l*&S=Ugxi$^Os2LZg}69{#XB<|%6-3|1=6L+gQ4D)RPV z^0y!7gvv&KfUM&%TW;-{iuY=9Q+DEaxWQR~pxU}p?Vv#We*cR?-|)%G(*9f3Fywj6 z5AOa%ic>H8fK7A&=EQI$V7*r^+R<7n7UK9|pqwQnzCA^`5^++?zNhHP_?_)443{@@ zHt9U0_a0eEWwoiRs`chik>d783JO?A4p3w*g@1#8We)zBd6pKX@4sq$okXKZP-Z}` zH%(W2L9R)jW(J}FwjYkn#8P8F(C(MW-$)EXtd`V?9nmpnU#b_EUQ>#kN?x7~XjG$2 z<}&B^XFn&e*#qvT#PfA-hKnYFpzrk@ARwiv7b#5P6d}sCIBw+@aBO)?BxJL` zvxyH?{9R>8!~8#3d&{7>zHRL{xH|;*1b26L_aFg+6Wkhihu}_d3$8(e2S{*t8fo02 zg9Qt4SKfQhu5)(n`oDFn?#FH@Shc#>oO6uvd!9$Uutvc3kG`tQ-w38q93efF-I%>G zHuZ+@46!Jt{1NEyu@G03(nsw>!Qp_J7Z9BS;&gD8rpt0rS5%Tg_Q6Wm!B)CVL7g=U zzcO-m)O)<8)M$@ZLC`fx`X<@Iho>&bQTMH$!t%r54>CIWeLNJugF55D+erJ+H@;)6 zFG&g$BI}Dd9e8ivtEo(Whhma<-X-fxzWFR{^F^=A9qs3+Pa)YisJqP+PRy4|IT(P3;2FyFMsNlDDNgkm2eq4tm1W6hkW)5Gju1QgaqZCIL0bK;2_w=h;&(3J% zGVL!DzsOTQOYN9%SZp^_&U)FG- z{iI{~QbSQl!E&b^Fw)3)KQ4|DsljW2VixjP?jbfsxlk7h9elq_8Kr41oz*wiPMY;*}L8ohAy9^PqW>e zts3>VQGKd4efg|+;J+Dyq_ZP;Gt#(=S<8cTn#cJ1+t2F2YJ-x``5H(*zJS0O6<(-9 z*=9T|L;-K_#%t>KM6M#zUFT$x6{VVeVX+pf(dnTPgryM%6ofrePka0L1fQVSdnW4( z?(@$@VkA7?(fOA9O~vnlcm*9S(QB&Y@3$2htgClvnie+z;$Ys6UT*AtI^$rs8(kz* zCtPvNYm4i09~FHXCd8!gN8*C(h}>q(F%`eyWw%f4kVkIfdvjjW>g312sgZvQm48yZ z{xlxmR2Ov9RBQqa26TW!(akMp3M@DTAhz3?@IL#?S%p@NV?Q(;7F#JU@$1lX2Y~9-Qy=3b7vnv#@#K zX};;^q^5YYg@}<;;jHFQdY!-1IQQoF_Ji%xG}c4-Ab&JpilDo-Zlja|x$Kq*V;hhJ z5Uhi){zyOowQJsCq06U+#-!4n^pNzDQk}HCY2tmDIh@+bbC+{IT#O)-L)~4ntn|4e zOy;_AqG6-cTw%o3NoPv;w{(>WlnD4cFiLC{l_i$2j$(RCR#nJlhnsia2{lrXAzh);@U@EAKhf3?8tZ?M}RpTgssh`cv}N5M{IW2I3sm-do>RUOH31n zO{tXL0UgZmW?vk#wW@r+(s_sn9U@aZ_sIT^?(NmZCgGfn!oa$rJmsN(cA~8dho;dg z6`r$dPnxb1f#%Z`cX(Ayl4pVG_Qlsvi)`PM`?2?GgazMho6PivVc@CxLQ?RK;hQ1~ zp-8K7O9I5drJ7}LH*yRxDES2F!tLTZA8${jnV>6-pQnWixB3(9$=fLb4tmU?MweP++)B0t^>U>@LPxIj>GIP!Q2Mgo^zY)*l}T{y@iYWc((s9wRV`JV(ULE35Bh{v z^!Oj`De_gAT%U+f>mJ1=@@J|P!xWL=SwB5=*DOdB4u7@1z+JNWnD6{m%vQow_4+wQ z%H;O&qKWR61y>ndB~@5O2)vYcn4IcO$CWxj3E4K)ryS3>=cwN^&`m`(u-hoyVr@CV#c z5=EtSu84e|A3yj~tF%)(4i&V9fAB9iY7^3E2N5V{;E;c6I64EjVhRj>QW!uom-={m zn2d_ry^>{AN8Q~7c6Mpfo$3gr)3V$cl+J`BIkEs zbWo+*9`S=DU^5daD%QG|Ald=S6P+Pe3}2qKW*na)4eB6}LK2eD^wmZqt;R(Lck@r6 z9xwu2r$EAaZxnGCy5*gFW8~Kee;v-$R_o>cfPRrtc!@m@b-_yw;J7y`)-jlxE528g ze2}n&d-GM5j~y0v6_~}{+>)?}H2SECEDbmkW-TK}^tG1OoTwble$jNdo|+ENF@HNM z;N|y>39Q`Q(f{wt9e~N`Uap*}$9&wraHOITzJoaIWgQwe1dN$^j3wTm9;;EHAYt-OHBP$cK&%;lJM#O&m-SV3Kb9qc|-$QruZ-i<2ztcL;Z*V9f zc((|7;dT{mw2po@!jwvrPQU-I+}0`i-&~A4Z#1Ad)U31cDRjkOByhT{s$1=D-pjm!7DD-Kr?F{fpKveN^#7|}G~pwC_^49efgiwcql0nKc=0@;R7^z^qH!1} z73yrhoFoZe*?+nf*D$Uy-By{2`zpZ{S%QWOE(Ka4U(>~!=S-SHG?3_jggX`A+&3j^B=h&QGd_@G;C-#Be; z%xp+kE*~*i?BiA6{O{E_x>&nQU(-tNf~$ZsF{BGW!g18egnkwzGXi_=qHjN6Y7iX8 zF!&)lSL@sKCn0-&DNutw*UZ`k-}g7laRpmh!9qW>W4m+|^n)RA54KTQX$x_~RvDru&>REAXS#7meJpE2iTOzS z0`K?frJO`$8p6%a)zi?&gy{M2aD1hCmYLGc31LX&~ms>#~cryA>8EymlOy59z$jyxC1K5i{_B7fVEC%n@13%-{khPNG37Vj`%zeSe zN$lrAqRq%!GG8E5;cBs4XQP?T%vNu>>6dAe&RQrN%SgRk1`xJcnN24}nRC;iC*AaF z4FmNWNn*>JDl3^%v7+Mz=bEo^2u|<$@>zzurB;?J#eNL6vu4Y{!TvSw21UOMw_a}+ z^#117)d0HXf36N~Pl-OZeA* z3Qn=nuZ@ifXhQO|7rM^v_av?Ro9^R6wX5|eT8{DXD+_BUAz+O7~^VHu|$Q3a!&8%l1!5%kk&b!$T3Q-lB}hT|9Ll>*8G7YAlT|;*Zh16RO{8(08hW)Yw&@Nk^4q z&lI@ap{?5z14>O%KhMq@5wAZ2$umKE#D#8Z5K<|0X^e$WA~s=0UB~>`6P%JHEdE@` zuRjq^&b?t{m*UOW1q>8GIq^`q)IyD_@MC9MtxCD*b->WbC-7j#zg#8v29& zU!LJY#qzZ);8W_{n<%KEnXK(96@iT|nv^lKj58^TCP?JxJZOAU;%&YO*q-=bIw&yHvYD(geL{%6y!aUH)DLULv-OQ zE@CafM;Eqd$#&3SEkDxEUS-z277S_;Vj1l_j*i|im%Hl|Q}d3R_5y6k$w!E0T1BlQ z?B)aRzVzIg11-BiEt?>*1Nr6MM;A7Gz4|JgbGS@yqx47T2haZE?u9|Ng;A^dP5jT4LtDQbzV2Ez?4k~>pO@G98oObn&N?pNQR%Bxo5Ss{Oma^e za6%kVA2Z%ny{`=Yi@~shq?1+fZ+Doq!rJ_WGe;pKL{%NY# zu8ypdoGIJ%*DcXo4{mHZ(;tGG4<@>tGPVL~R+EuHr28~IObE&EXrN%3?lh6i`|{9& zkzAQKIxn!%`VuL!rj@hEssmID%}-SZpCppu+uSX4{t=Y=Wh%L8s$7A%<$xa%63OM( zh+7thON^>HJU5vqWUHl{=ZkUkHA?bf;hmm+dJo{0fj|`VGPR-mN?#MSMXLqN#6-3J zp*RgSG(6a2iLJ4r!Gmo*Pua`Mi=Rj#th8|UOfiPr-T|rpSn)N4Y?FM#L3+_2^PEW&)&@@m#AdG(7-^FIskyLnG0!13E z^%7t)3x!9SZ|OA;MbhEG#+M+Pk>PCm<&v`PE4xM!YYE)aFE ze^dGX0~{FOI|F33S+1SB23%!0HrrlkWmq$X>0Td(_CMaQwZ)%6ey0~sDQcXYA-hWd=*ZDtW(UO)5$x_i3)7H;r3P^4cJl2pJnp=zKbb0Nqxt?%H`>c4}yam>tmaWFOf3D7;slKJ#H( zlEJ`zcF@fs>SEz;EqDO%EFqvC$-9`%EfDX0qPF{79|py+izMbMeRrcr|7`O6t6`FE zXi?)^;gla17Pb5+GRcZ$Y~Tt@LRs3jf_`Ku3Jd5R%2jMR*D3&PKsTB z8|3O|cw+?LX4-Dh?f|S?&Hg``yxPj7%%sg0Vl^-Z9IG=}8Bl~_4&k>&kkJOig@FB3 z_wqn^A=0?{k;=7QxzYTm7L)G5WS)(=a%q@0RgbpU(v?kT{aL8qvu8Qo?Q3E4zx?Tq z?s0getic;oFoJrv>`h)Mc9+wc(v677Ude5(X>W3*TaJy&Mx-%x)tO2-Ho!_mw^B*U z7#C%$>0O=SPP1v7fvx>Sf^moGfk$W*B^;vM^rB;daKf**=$`3zeQY3ME>ufXiCctj zYMoV9zrqv#F8RBYXT=wEqQN1*D%p(~MXr7v`#|D3 zdX7dt8Y-ZKvC51L8SmWcNi?JT#|nVly~&d?Mv4PiMWFKk@< zc@&*Cmk+~%WR}?S(kx;pwb{4cBj_s3SKF^J&N2Do4=$B>JHgC2$DuIo93Gf-c*O8I zfosT`CVV*y}`^8i+Z_MB88ANdqb7eu2x~X*QV_*toyyM_EjsiA}*_X;{)3|;Xxe9BR`NdMNRKaALV!?lK;a z;UF}_EiP2QW2}&i?y1?EHI=&g+;T!TlPch+{@-2zDAPg8X&gB6;y$X3Y)du7H5<%v zXVkeL(mepqp^l?>OZ~D8Ymf1zVo*r$0Pz?+OzIA}1B~k=gE*o(y$amZUWhyh5hr&S zJKEW91nVT*Et2#=FfV>F;FM7noq!x*OE*n4h8KOarII!|8Gb~^!l^w4h#*hboiRq)8_tB7#eO^>^N(A3yb! zYd4TuDTp2<#I8Q(xY|?r42R?=Bts0}Y~~N1k4d8r@GX1Q35Z%UuQ(bp;nvk_9voFr zR;a=*Lk?jEc5?-4;=0fIlgjD-!<=_>zDTP?L$=(kBaL+5Zg#bxl zT@u((TPe_cigY7QO@7}PJ91r;rQ=LrWNE#<2ixuRH^hTjW9d61 z%9B0qJt5?h>HNhJ+?6dCM^=KBh@)&QPxTq&LGwJt=>-v!M9Qeu$z5o?z%@h9^JY*{ zL*9%;$N|06hJ7{)E-^wjlkI4kuk#>_Z7)=jf*>(BfBQHR?D24O=Gn5Ipr9UYq`Sbn!{>7G zD_C3mzY-AH*mRwDO938#rk}*ITlw7}WXZZ51v`u@)H33q1c z9%*raYPIs7yV{}{ysu2jRMo|kura9!e+g#D0Yd!px#C~58E)&m7q%cTk3$#t&sJ}o zV>?tfUkkp~>TUDwWLKVFlBN{YD4skY!@+KIZ|1DFY8J=C4uWv|$i0NrkMiyKeQrCzZKqmzD^mxu<_ z$|n%F8rFYN%u9jNi{%OWEk3;ZRO`9HkB#B$39U-|BFW*jRHU6|X@^e@rPVbhQo9%* zSFE;br(HbSd18G8GI6qql1Edz(4=md=={P&-V47;tNU}P;<c#fag>}q|oIQ8*+ zA+qs&Fxw+%_SH_851E{_DK}CdoZS^Mw{@Y}fV}3O62W|juq^Lx;=_rLp6Ml>=&sjd zjmwvTgnq#fgEfL|E4EVc1Sl}jf$NW{>AvM-F_9Qlhhe);H?_o=?uIw}!XTl(?I=9~ z?o@LYOwbB^ao;FGvfMz`LKrzyHXD){IM~@~Ce&witN-|kr-0wJpQvu&tH!D)IV(X^ zb84cnMTemH(<0T`gouW`@u~=)Vl?ktPmt5n`8bq!H&W~>W zLZ0(PgP5e}DZOW*oqrlctDyKdoM24n*)|A8Ic3np%8>^7F*w#c#0Hg~U%)g3-(v7* z1=xO%s0amDKwTK-_!I3P&mMnDZW#LG4)W2LPEV+3rKx-ZQB}VNmh}Ps*B$-3T){Lq zu3@E?lli4g5DVM_;WY7aPa)m>;n{hH=V;x@D=!}lKaX3;Mvyou#wp}o@=OM+k>n1& z+GR)Lapjuf3O`dheqNM#fO54M(=GOT3{u7=bQ4GOm2f0O~a47hmC4`GvYi)Ler=Vo~zo|cqYC_R+$X=-`)xINNrID zFvJlSK4Z1mS@d6hZ}d9faCeZ)cQqd>`VoVNr%>VIEzLD0Dl>GaBR+;hE8keMY!M|d zza>%=4F8)?7%K6!u-4lqG@+Jb-Nydm0Q`+m_$)Nx;T4i>^Uywz?>vX^ZJrnMYukdOI5@&H&Q3Fm~?M`A1*BAC<~GUY_+z<7LO0*6x`HLCWOlX>Gj`y zZPoAUO)TgSOl#Q=nkOc^UOm8!r1nlG_*#+q(0~c{)%cyj#jTRM-Y5GQqr{}6C;3_) z*j1pH#dUw2(UPG}ahK8xItm(DAEwUw00wm*S>8p?0@7i7TBsz8(TbJ&q1Mm zw;g`4wdub0X)_w&UHvTx5hob8Y}98@qJC;l`C5}Y6gKMEb%&m_vOQuH>nx`ICB)q$ z2kQKyYP!_*qst6XSu79@8F9XHr?@ow=MHB*&98#DIy)f%%9UdhBudP>!%>S&Y?m$} z1K)^+syp{(suU>rg)rx~N+eMwyocs&C{hh^UN=j3w(1m01cJJRfi<-7&m*+A(yQQ^ zO^%VMyD)|LFdTacjc{CZ=`n9)mog|fGrn`7k|s(LVWtBhvgWI8yh59b4LFzCoE}X6 za9*Fd^TrHTI za=-1*Rp?gl!|(OhovvL@^hswxbH)@C`Me+VI)qJ~)L637^xKPn({V3*$(QH0RcJy%UPnJS7P)zC&zRPGgXb z?bpK(6HQc3e3A22lAx1FhM@}I8`7%jwS8%jU;LTeC1K!6$Gp-O-lHUu#8bj}JwHk)BVK^1>U=kWE?CV+fv zc>-zRQN1wS2bls$^1bHMq9yG$WznRg|M_R^fGp|AHnSn*Y92>a`GMi2{KxpG!|F5P zT+ELUwp^tQ1~nx8g;u!gRYakWWn3~^N2|_-+P^uz?PLQoswnHP-0^}4#q1x(wSgk} ztoCTZ_?3xqECfWW-8AKgwu<4`mOpmkp6Ek5trUd&uQyf z1@+-%!cY9~-{Bo%FVL{maISX*tZL@oLUwu%eo>PdTZm#%a)KL0>1qyt!-HgOyCc>1 z7Wd}PkaEYEbWz-nuF z(|&LWj@lb7>|deP^7&DI$UH@cJ6q0vu@5k%;sT`sQ{nv8^KI(tqeB+^fLF(ygWf(b zU9(L#x7GGAW9=cIygp~SfXbm^mu-*R=`3d7z6I>PQEGL~uw8x~98w2co-k*ONQiH_ zg#QBS?)l``)h{bYXv^KLd7dxo zwD=p_z19Aj8Y4(4(>449%7fnu>i6pM*%9JpYjukpaP509&a?T@7pqa*JI5^kJe=@H zl_h;6S>F2mg*s&hD7B1_#e+~54By`W&J%{0byE*TWq?!25>mnnl$XD}73R%&YYgUL zLWP^JI^kBN7zOJwYCuW%YZ4U5@%b7{x= zF3LdOehd6aeI#}ZG0S3{0_IuDI=G!r{MBwBay%m&+~z@E2@Zt+2=(R@z(3E01Hn{o zT!KZtz8O?H_3vB2G4rq%l0%qhj5d>}N)c_G)j`A~6C4cjWMXMeR(|hPH>CSW5YdSm z++8;~>Ye}~P)TtzR>QdIhYb@M6T0KN-?g>dreygosvISQJRqLTPYCeq|7c1TsPdU3 zW3~a81^pr_>l<9lr};{)SqHs^$Yf^S(X`9$I7PgJblS;%r7SpVP z10X^m2l)a5=BkbO-)F+^3@fH_ndJ?>MLMnTiK`5Gmyd+|B&i-)wvsMmaOvJ~f5aKI z#g-Ev&Ks*O&RcKVG0Nrl`r^xW_u6bzHuUpMA{yTFDQZ@H5x*gtSly%YA|g_2cZSvS8dKOFvknk^#gb4H250`BAEbvsU@&P zAlJ|T8;e*(gE1s~q&L=f0`UA?{ayr)iYGey#@>r&C!iT+C;NnW^QfFzFYsIHtv5Ig zMX4K-*WbJIVNNMijl9BkMqM<8MYX)5pvS*l<6dd72s}eaCVr6zM>v1KP^CwG`f^YZ z#84w?LCEV*^!+oxeNC=zYlB^TBc@b7PMnV+pZ|_AmvFUyx>2=(kMeRo&ilOn4{W!}Y+vwfh7>c>x^mueA*Fe3B2fMF+H z*n&waFS3ggMpFd2d#_~ggxRH{Fv*KdREpynN7Ool{f6_OMD-xCAIg4{&KGLp$v+`T zaYXlJvKfC7Dl*GxvoAMBzV@;+_|CwWu-yvxG(^m8Gn3nnHa}DGbtsWs^=P(CSE++a z*x;?qp2WHfpp!@#of(we@Z;2^`ONLtL6cu-iWb!;L7(Qjk`fUcjJCa%T#`J)!&R!T zjyIU77u&*Xx9F<5C?|OO8)5vm_%U06R9tlSO9_Ms6^Hf3@u@3IE5fCWsvzICtxGGx`};;U^p- zx|?f0%jBCOzO7mv518u4C?~Y!7f!vym*+?5(fxAc(UZeUT522xDbO%+Y!h9WH0b@~ zmQE{&;YRFN^8ER`ro^U*{oXhiAd}H+oSejoOsHy15bSt0xXk^nKJ<1*+qD0<{qF08 zY4I0NlKG_{xf00oCb6U0W5C(BoIThL+}^tGS>&X^inxgw_0l9j`Em}S&H{pKA%;J7TMr8Pvpevpr;%DfRB3aLD_bTn-B3NmDE_w z1dhOhPlP9f9vg=q25lA(I#{ZQxV$H2X4HODt}Zq*wey@(1*Oy}Y2A6w#YCUR3hLDk zxNq|&6E6&++^g7PAypbwvpxO!bhVb$Lzm&XkAQ8);F-IuQ|E7G zk->ICx>&1a(GA#;c-Pd!Dpo|6s8A&QSS$(<-V5KZgx2QWQJ3Nn9Ifu{Q#k%A!y-6r zOkiIc{6kTE4@}WMAE4I@tz(k4Xo}OAPh!!lGf|^g_t;Pk3H3~tFFO*t40NzYNRQ^W zUy(V&xr|@U$lEytB_3=Ed!22CW0Ad)Ylx=~{Np{JUjjoRev##nU=!PeNQNHSgg1cb zX+6z|{luS_>AI4a_Y?K&75DM@uU7K7{~Jo+y^j-p5pG8`fFs6_iC2)6Z$p4Y6vLqz zuzzZi&f8kR0K1AxH%zQePSj_&1O#PqaPHm3;9alALl{^|x7-g#%jgDcfy5~aDq0=~ z4bw_U|6vJU+|Pl?#A2F)*IKEk`x@gYJ~Tdkq3y9Bs-|4q;6vPmqv$X^W+N?j?Rlc7 zvU%eHx~mL1Y>!#bHEAqv>6WlckhF+xD zb=##Yr4`UaxGfdxFFEk4K5-t^NI&w8N+3)BzOi2-C_+|>4N;=<+I#@K!(wSB52i8` zQJ7uvslA4iwmhyDS?k#m-VPPZis{O6gmXoNQuH$?5_4~)#FcVKf`5fySX`^OgquU1 z=x&VOc0zOLFpc&cH}s0kb(PTzrBD&Lh}H}J6P#J8@oE~$W0}280R9>zxa70~y8kt~ zO*wzf=KxmW&-xzqumkwySR=IdR+>B^UeiW7v?@{cOT{oUiu)x=1KH*B^*xuU>DCs^ z3ZFHJ$7(OHtw?)vW=bNtagKO(pPwFki*^}J-YI!&)JcYdadaxN?Z^fJ_mKW0Q9aWi zei0A9zJ~x|Z~`lmUtnJ&pam93QwvZcvd$Z5NMY*C%IJQ;q=lA^Wu})Xt~6QUhu{l* zj#oIZ!x%6k;p6C=#-PQGyM{D|pvbr|r$psJb)w?s4GPUY!^zbobmZ@@&>e=QNW{%> zS&dtzYDr(ZhDH}?4f;q>phC!r6;rs}Bb#t^bejP%21vUzt8Gvsb&vtlQNU4(Y*k=L z%ID;?bGKh57*sHcHd?gkPE>soyr;L2pm(Kfz{kzdM61w=mL*}9e!6KrIR$x`$W7$$ zHETWtq&dfEuWp&&)lEZBHQ=`K(sFw&XbeZw7=SNv&=7IHUrA>)WN1YlY0xw-~-3HYTOxovK)%NyZ^TLj+We9;cZZCY?JZB(M0 zkxRUU?Z_ZJPlXH(b@L68UhMmc(&4Nm*crCM)%jZG(xTs7OIWL7FIuvg_suS5=b6b` z#p2)XocAr;jFES}?AUVJdbh^8;uelI>8U)feCp;TC?v?k{LW`vI*o9#;`VXE5SgOH zvCSmAo+*Wu@GTBV=I<*gx7Ms=HGZ}F=O-|~Yvln%g`p=600BGqy3E|L%bRm={?+!Y z=XT}i-v~*R^E928kC#GiF$z=++mAitkT=J69~uG&PZ0#6yjiJ~f5NCBWk2{mzpg(7dCoZx%Nh#rc+cLGr68C%X~ug) z{B{3ug44VbW#Q0tI|nA4!eUIg#y_q?QNi|Pv7zZ@c*cUG~esVMbo|no&l~m)2g7cVF6)`5F$0k~x`0;s`9SNc;_5t>34aMv@C6n_P5Z zk>x>@u|oDxDi9;*bq34a5NCO*Gk#-z)pr9NmNcKJJu>P|y5*h_(XW^JuA!?rm-|n{ znj&lU{NetxV4q_}ZZt}|L^?A`%; zjwOivQH)*-t+1rJv#3M6!XnE2z9Pmv#r?qq4PqCh_gS9&g9^b|X31;T&sD02NZ%We z(|^SHh!hCAsaYPd5j>%T*f$EKk+6gp8lgQ`8MqkVA7h|!ONd9f7D;UzzS=jRHvgd5 zXzh3-B-03a+A2dYm&q;MHqqo$0oG#JJc7U-H|``H3{o%X!?TlKvCub;pLu|;KNDLJ7XdFi zlw=kNuQlKe%E!A{ulgS14XM(tti8iI-CPl}G0;?UHlg8rKztrq_aqW-UqiM=b?uR_f~bCb9<3#7l`3p8phi~_QA+7- z)AZ6N`~dCBCDfD+8F=d*_I^-_@8R8t1@fldCl7;)MF;(2nv)MQCER#3CX)H?$2 z^ZG*t_xSh&z)ACpb7~o|tI-`Y_kUrXqPDhr&rwh~r&h<@d3#zC__sm*sEUy;O}fD< zum@f5EI2rjt9Zb07jX&wvG(?u@k6K0l-M4TTjs$Fur>r~6B9p6z{6N*BXh`<$v6wB z>iskQYy%rYq+SszS^jZO&aQZN4zDkq7CE3KE6!3aYt5+-@h!_l>ETVy9m0)7629nL z6+7#Z6vbo_j*sZ+D&gsiKe{4S95`_aIH`p)P~KCe_$qM-g!4K`iMLbx`U>$^1yB`_ z=W^<*4k9j8>}eoX5gN)f7MyK#XLfi(kN8M~Tn2W9<{5Y;$Bp*^cQ*M6qsY$FMLYFn z7+TZ3X+*U_(u$?mjIcDXjdBG-8elBe`el{pojZd}{LTmryIgu`gLaWDD5BH#c1J7f zkaTI1$Ur`>B5}VQ_1_Z6`Kwog#`cx&kM9pG04heT zJV5UZlqrE4qE$l|cDPfh!RvYIO-LYe+GgY#fWb1B!8kIw^92(L-2pBJ>-bc>fpbY4 zHl)WHnm;;SohaSi6b-38dM__S=&EXpCbK>HCvaf6mR#XiAf<>$R?o9<6iualD1F@H z+!r;SUA};4z$~%Cxi=)XBFYiSkunG6V(Bty{)tTHFdx1MO|R~*GIGTfJ0PC>!eC{Shm=7zvw&uQ7}~uK#gA-jXm|)`fT5Zq!i(m`qf^s_ zSJ?5~5t^(v;Es;BHpn|Cg`&k>0kj!tzHRVo{KN(OXsuE-Z>ysarrO^x$K^$plwZqE zYS3N6S0dn>?}TC9ZM+}N(%H84Q3D;>)67gHfsDkKp$m$ky579qGV;IBX5ksYt=j^cjFq6zz(n~NXkSK zIsDGs*Q&=)huRJ+9je{J*6Hj(6I~y%%J`LHE1s}Quu9FU)OCOcI~3eKbh!v@b@0c+ zEi8qZq>`S8V<66GaiJp7(~&`taly&i{#zF`=YE;*sBzL4JTivaHUScPuil z?EG;2d<_B6qO9~Z0C@6^Uy718?tO-{9hzJpoKO!i#;aQOIvk%26xW>iaIWq0f>pI@ z8@74)HExI^n!{4XbI3r59s7q}!+_h~XnO9TgZI>C183l$Hw!QGLq@DcS&3Y3q(+*&Sl4D*oTq6c5JmbK~90_@TY2l6l9bA>>g3StEW zy6{@q!ji9f>EetesZ5)_W0ZRrymNa`G?JjJ<>f=SahNXJ|zA&IjP(Az-QEq}lfm&Q^1=JN+?w_ip)!vC6XTRC5pN zB>pf_Ys7EEb-b$fgnaG1mDKL=6O|CbCXZ03xG1f@q_@!No5v9sV5w!iP#z}WOQ^7? z0BK0oe@rmGuC$ARmM~7C;4|rb=dAmQIX^ zLB^Sn*yjx^uYb3{NnQWR>=qbCB)IKv3L#ygead8Ur|Icrj;_Cgbs7ISa%BwmA-mru zAGiwtnyBUy%R9NVZJaxipyhHNCe1m z(wZZaeJcLEgZTqE&D`Us&HddEuKcfIrULl1)UbVPBHLruMS2jnAPhj0$_DcoQr|ZB zi0J>B&$(=$Oyeb3W$Y9!= ze>6`*hE4oiU>y(1w)94#cvW1!QOng=T{P|XTuAZQA4|7(vo$43kzVok2~pJKWHsCV z-8X<#Gwd_3$wQP~2pjNgnz~JnXQ;0Wm;4*?RpQ4Jj=Eq=l=ONaN_?8qfhx!lWqHVa zFVFAx+22t1*L??rdt@B3z8NDg^Vzy4FhXa5KKN7f(|;dMO3$Oz`l6yp$o9VUtIZVC z0wI4?r$giwd|GUg9l`>uMV5JHScw@Nx^ks<`Ip|6BxEje{C0C+*goNaNROI~%-rJVp%&qXMpm&?h|lIy*wPrjC@htQ`Z%JtEY1-<%n^?=O3TMY3Xg3Fdk8 z=g-!*kfqcS2gyqj82D)Iq;){Dg)Z*zzR)+4LyaQij?z&@b!JvJ4t4vllv0J_x&D}Z z2<>k<>GcKWFGxNEOlqe3PY8e7ZDH}t7`yn_)CuEi9(i|GW zsZ(3D^2If#aS=Y?02pB_{*9>K6ZPsBM1-yy13(!AN?dJLJ{|V_c_O3*IhkYXTz}4C zd+9a%_(tbZD(zE(pYrHr+DCl?Uag5MTy{}mVtL)jUyH2EeT~gD+LE<`9Vzu^l~td< zTAJ-$&nfK@fb5w(#pHO%uML9se=loOqV62**3-YU^jgCkL{m)d8QiV#R@x&O{i0rF zj0XRuzAGiGCVEG6&#_JQ>l|T&pJV44Z0-WYdk4ca)|yw3!r~$2G-Ex}K0EPefJIHH z7rDh)K^E2VL}#q4l91kmY>rDLbfw^#2|rx>tGPWF#nWOpo4Sr`V9gL!TiCl z;EM-!_ioSH52&?9QIC&92Hibpc+8`7WG8Qw(voH``~~*wof^1j5j;mPK_&x}`a|b` z2{9NfVk-$zxTttjL7L#1K3XADSfHgXuow}spq)T^GeB}LViG;+m)iBu$EvL0SKhcu z4*?1B7_lj7e2#{?btnA!6frz>uXa?43lCqt6=fJruh)=eJn(kUC!_sOkLRybYV1_x zg%BCaT}1&>+TDP}{BDa}E^jKR?j`Pjx7Fj2-&hXiAY2_V97GsW7ilu_kWQt8BsUdl zIRMd(Z&+Sn6eg+U3BQByY-Z-kKVu!76foFT$>AF0KTAUGz%Tko#G_>#uK^8gGLZQ& z!X#^evb8DJOxe?737Dn$1v}I=TpS-# zOS%>Qb?HF!U&?NwumdD*3o!0HPJe#b?6vNRy;vc40brFXk$5C6{gYCQ-BQ_O(908h zCmdtlKOiZ=RM<~I5&;-3j@xEb0SMkL^d@5?*pf1hrZlb8+L?z6Is_E-zzL}QVmH}+ z6ZJnyzJGBpBKF9^9&3e?0i)^M^l#PvaODYmB{;2j)P9htxGNfvduFDg_!*BEW!-=a zip3u}`s=y9mpHX!QED30EeVH+`2~o2tAJeoE4ss54?9@t=10uV;lewUqGL&3pXa;t zuWl!91ur!49bP9Y2x$INXF?vu0D}DdNr_FC;J-iD|KRD14WCa2D^>9u_Cy8+Z#ozz zfDx}+tM^wwn#T>8x5N7amt4prD}%*Y?xn#FRHy|Y5r;rT@QrXMz`D$^zpH-;=*j&* z2K@g{_F(J7H`xRwMxs+3x{UMg2LfZ;`9d>`4v+g-SNAw$X9!>J<^DuT^j4eGdNE)O zGdrSP{&6z*9^UQSzhXx=4P>YsKhN{neh4Dr_7pkW_H z8+LmJptDuttN!Cy-Mi!O=P3WDXqX^x>lY2;P5D~8`@MeEP}J@DTw)KnXXgUZ;6EmR zcpoGGh$qe59*p17!ekIdnpIrdgPm!n?id=J(Qz2j`|p1n%?Fy1D zI0D9nqgmI0=E56Pw;q=7m%tFv;o%QmIb1Szo}MWgI^3@{3bguU^J|~ffFM%b{T{IC zrdn@zU#jow5@b|6T}EviH)xt(`D%0YBL-UhL&Wp+;7IU!O8eoUPuxV@PyOB-oC!2S zm2&vv`;UhxgGy7&CzINy*3KXI0n6dDfzHow-Rao;43)AtsExmQhXmd|mzqLVy1XwK z>@!r--YV;L1ii2efsT2eTrPEVWE)z7%6CHZI_OH?RIQ*qq&$&bxPfCvoWUPkG zmMJTf@;O|d^ngrySm5sSdj8BRU(+q|1K!~!rp|xlfCkzLH)c=TdI5Akt2eJ>C2K0x zMBX@+4nzX6S zo$`dAdUa-GUH3KLkL@*JpA%eX{IcM5A(HQWkiE6~<1t0#{$!2t+u&2u*Xvd1UcW9A zDlaf&CmYf^^}D)UkE2T~-SU&OnRfsCy-Y^#oeZ9jxPWm#Zg0KKQT^j>K+l`w6&*%x zx16+W+_y>!5ZBd6FL9x{tEr)FPY$#)h2+r3{Gq3ZNsUD>h>y|29)OvBn%q{}n8JpQ zKn;|l^iRq;nLM~#7y64``$nE`Jk=HlG8lcq|GCeJJp23vnI<$1+Cxf|H zD-hTXG;NU7XFx#GEr$fXgfZz>o_mQ+^~W4?7pwkG>mp_bpZS5w**9NvS$`+uW&4X7 zsJHESLgo&?cCyC(OaQlp>O!7_M2fmT?pO}lAg3FI=4A}01-uV%zuXo!kOphL+LD6n?>(SY9>hZQB!YA$C zbs~#bQ*(-*Ne?^wss+v>lA(m&CiJPFoqN5Y>fq-a%vJ&!(R#e-+lhiEi%DLKLG-Hp zp7ATw@~Patc8GXD5A;xsT4U#7G@Ys9Udh6T6EOMu$+Yu@sKumtxZGi2q;Av$*mHR- z23dMHCWt`VV)%4_xg`4gt2y^Zid#zPT90(<7nT2qthWk^s|&Psg9LXA?he7--JQlI zxCVDZtUl45@AHIJfH=0;I-B5!n$lTvOc=ErBa?%+ zf#AS=gS8XzM$S>}_LVFLF_ftfu$61H)pH;mp6MEQdPhCo5sBpmT$Z>r%=tR2ahDr+ zF{-9?i@T&l%CKo|KC$R4g}|W~bj--b1O5XAp^*27uBS1kr&%HP7ttr*VHG5Fr{TdH zQR3D0s=&3?E`v{u8pUj?lwGIpODSb@52WD&4#@Kf+MlyH?@+Uyhox45T#Sv{Aco?$ z$+M>e1gQ0^G;j|sB>({;yd&)Vd^U{2%dMGrqZU}&ZIcRNK&sQl=V`@s|mp|BP4WIBHgsgSqLnq`~u?p%MU zHPp6ArEbFIOBM-+$XK$dK5dIwIkBieS6813@{l_~^0nJ2Y~sMcZy{RzVo|UE3kerO zo*Z+v`xv=BoKWL=|M$ss<0WiJvdB^xW7C#7S7_i~gQ`_PFsIm^@nFV$7-Cjpr?Lut zJCJt)`m(CBUU}_JsAv**(dqxHrZA`iKh$V@jpvU}H&eCR5|?H4$8_*ytqi8c{v*lr z+sn1;v8V~g*;>r-!0KjzH?1BVRTO0Z%ZCVe4Vz`U4dy(K+zkmIMxy z{Zph#;cBO{S&e3UjF|!+;i}qzU%^fNHgc{@qkRf-hyCq-*YmWJl1?i z%Jd&Ndl6<_sCH9j+2hT3xyzo8aRQ87{BzR4r_x|Soae1rAtPAd^~>LowYF?msK()@*XypHz9G-X5=_bPnIUC^iHP=>q3fZRbCz{WI;8XOuv`Vk zq1d?J1*xb|(CdDyZ{H*$|2^mP2z_~MWN{|k{eFQ%f|yy z$hX$7sx~<*pbk%Ec$9BECPbCxo6Cjy)tO7;dfahG#A>_jyQ$NJgaYKGL zjqO3!2FZIZq-uig=1OhBTG6Ps&*$bL(4|iCObRy$s_ktbaUwqw%)+J_U>gzxLV=hONAKiV}aLFNQtoSH=j!c;FYYF&t z`G)eN7Qqa*3@2zNM#nfN9L|EdwvjiJgi2aS($ zS!(;*F2mfsUsH#@c}LD=S*f4pW)BP$f~QgjmofPL+cMr_n>~6BG8)|murseFfal2W z&%54!?W;i?IrCEmj=gsC-{p;1~vfB+Za*O=`yHNh$BU;d*B>52Fw*wbX?4dZ9OlS51 zm$)cy8pX5*kWZ-He^L4ci;_p7*Kaq6bzIS-h5NAF$Cl%Gf=Nk}!-3QWA#t$JcVuiA zg~to!zXRXEM$JUL%m&TD0`A9VYdE#H0u)U+m@9mGmJ=^R*vgV8yr4m6Kz4r`_PJJ* z8WdCL8=Dtce>md}wtjQbe#{kcfJ^3OIW&UOlQ{DnNfeK+J!BbRO&{DS)M`a0upR{l zMmc4Rt=l`?>RvxEb%W5W_xNC6avcnK%SMHVhv>CUgz$O%sFkz1ez{mIPLX6(>MmZc z+F8OUFQ5EDcB9~225(kY@161BPvfy>t6nr{RF`u34cZX$`UkH{ntV7}DZ&1z6`-^c z2XYrxO{+01m~H{9xD^HEzx2Vk+02Hzu!IH}{qFF((1`i5b+f0ldP`fn_teCcQF|9Y z$Mb?e7G8;nP1o@ieK%apuhceOSMaM%D2K^$eNZ;?g4qj6#ri@Y1@^=-A8H9gWZ8>`NxPU6w^H1=PnMiQ#i>c;F5Oqw(pCWL=v9-`O+ zexvD{VpPq;W0@!(J%BI~;occEGVrxn#gSVE4m|aRMCf%Le^`G%5h=` zC?w%<*NYSv&mA`x+=KW3ANN%TL9nC;Tj&V2pn-l4Gf^=V!n&9z~n4?+h_ zV(rbCICcc%;66Lt+A?+@Xu-^N|)zu(@bR66o{O)1@0 z-yR9}R;-2%$gpU;0XlR7MmcI^0g1{FE&|KxH&PFq%^#s^4j*K-^Yma}%FGL~nIBb( zu-AL{b9kpCPKz~Sx~)sL4~flTo99(UcoF1)ff0G>&%O`8xy@#fSv&KGP^dE0x>isN zR#Z0U&bd&)1~ohU(cyN_es6*`c*1!dmjc8s(Sw)L(H ziQ}1%fA5hvIpy5^L_|dUzZ>ZuMcz6KY(N?%fTM?y!J_u=Su|!K94(w?8aF6Mw(;L-?8q*y5D5^e0ofu zA^j<=P}R@(dnE@+f*Kv`F+O29(G`(0^4%)T2mDUGobVSrF%q8xW|B8o_8AI$j#}Keh}i&pJhMRM6Fn->@WG=@ zugZ7Sr96xG!2lEkjpsnJtRrd2H=^MB}b?H^y{Xcr_c=1hdR3%Kq=DD(HMnzA~T z{{68)kG)oVYDS0}s z){hqaLFPVNs90nyv|4txBu2x0Ktsl3DU1xO8ZpKIsKgtM|zR0|2C42>d=wdK9Dr7l7l(f-I{D~Ia?hGk_IhlfB* zL<~uXTD7evt-3y~nSPSnZ4mJP*2LabT+Wb9CaFVT6(^P~#{&&iVXBe*Js`tp+qwxx zyZ~l_W-)2qsQSD`{MYE4gj?Z2T-6<2(DSRlcZWZ5nu6*wgii0IvII|sIQfMBixLnx z5^;U)hl|Q1E(z*`-qmRo-*Q+HWb1=^7%~CLzJCaX%`sUD(!calQi3WYLzL2LWRJo7 zy!AVN?xw)bw)Au;_FufXG%6e`h81QMxd7q<@a1FNA<9mKLy2|PaCaO&-Yro`CFh&h zvfjh>LX0Qk{Hdy~4zJzN_ibXy#aLR;IW3QMwMhYkQg9-pLo5eLy5rJZwgRK&6&}UP zI+~Ta0rn3Q>F9^g*(p>+9bZ%hL?pne|yceWa?8HJUXR9g2vr@M6hQlj16wv8-341@g$ zxN3o>p1Lv0^Q`jLH?0lA<(m#Sr*c{Xe@>_GIq}3_UxBkDp6-rtfyY66Z-ovE4aRE> zE^8IgD&+I%C&8j9-QrIvjttib?#7 zJX|C$G$1G@sID{`nz`cz=gI0O>h{mm%>Y ztHzRb@>(e}+zXJw>?UR=VuMj5|8V%}hGwF(d?|=tMR3_zD{2{@|2xuR8p{uxF{GTn zd)FwIaMA>$phO3<7kj!nR(aI(E7CgQagY6&pSuvsZ?N2H_4P|jZ(l+?J}k}R|&DPH@W^+yn) zO6@c-^I9|kN7j^@(SX*qpEPtmI4njW37Wkvhg;FAT)!)P$7trG!#vxBI6l{=8z3>* zKBukD7XU43cZg@mASx9U)`)1joW$7mOho9vSSyLA=Fdc+<+?6^UC9UuhanV#^uOK4 zIWeMhy34DTGIsZ1H;eOOBoy5aPnqrz1Wtbcese9W>t|?*zXvZ}>B;IzuYhs*Ga9#o zksJQnCFsqlPJ&+>ilnmsV;cq zl-`3`d`JsgeN|B(!W7Cdh>xq015B&g#;_7hZ4!)pQO_RD4iC3L$AOElVva&X7Jtu_ zZn)^^^L7DnWEm@ZG``(NmA}`;N)*y3mf{tvM4>oD3NB8|F*&tX5m)N(&R^HiXFcjI z4|3peLPq^CxtZ3291+fZca2Pbw|FHWH z;1AQKVz@w4`(gko=%=lL;d({idXnRRRT)wj%CibK|M7wPoPkMDVp9r@J^e35;;(88 z-A1M~kXkrpXvYsyhbO>&vfQ72Wd~@~{Vo|#dZjfA2V_8oMn{t4L_Y zAi#0=b#Tf{T5!odh7o>~!6|+vUih7TmsT-sH`FzG0 zA|l0MAg+7ScB=_W?ysS#ZgFL9rFS^mJ-I9HCx0BC*i=Q}9}$S+q?BG*G#X)ZdYqvu z7%8&BufN;fv$eD*7=wX;O+E!?0-|YH`qIhSF2?+`=ht_MFX1Ae^|MWg5kbBgsf_n^ z8XOYt6w)XJKT}HL9s}we8bX-6d~XS9FFe@Je*)xsHSY?!Jxh8ioie-|sn`XzU%3K% z>@FRysmJc=H8q-yw6hNH$Lvwnz~$>dG*#E?j_bhFf?cA|>yyXW^(CE3F_aR$(*}>*<cxUoZDxxZSjs29fa?|t z3Q@RIfG;Bd)PO?%CND;)+ulThT*d~ylq4!{JlvesgnR#x9FHu&siAKBX`SSU=B=F7 zc8?-S)RpSwKvv5yZDxo-qtgf{qffXH9wjdf&j_=O1Zzpzwp`;D#h?-1H6g`%wR*+tGh6w454u z-odz2RVI(kKa7=5n%N-fyaYB6$q1Ayd=;!vdyJZben1c*0^2pRo{4b!u_FAs2b731 z)lDdtJ%_1#P}GG3usz*qwqQ5>_FJHdU&>ec(^V_(f5SibDaX%Gw?sMfji*11KEZ`& z^Ec@J`jJ!9?tUUKuvW_&YNs^O^E@SZy5_N7$aV0%Jw%PUZyR3)U=Y;6fC!sGWku-X?mEaB@ zmMO&L4RDr>>!Cg$ltk0P1ES8v&Fza3KodSEnj!;KM6HV$_8#DT;@zCeqy>t%$4{mP zQUy%=U#zumkQGu#l^h|T^dm5~jp?LPGKR+%|FcUrihr=Ng|inBOTpyClM3#up)anU zGK-TVm21awG?sYnyrWVbvj$P zf>@!5u+&e#6{Dg&px->EanM{rJE3RHyga7S>p}!AqI1R)1quu6X?y}~C3%A=`%Y*n z{VmW-KEXWSliyt1;tTw9((ldifsZS*C#NR-d}jEvtc=wg9n4?VB=Eg3L<_cW0nbk= z*W&Wi68O8QXjk9ERtAMc|7bGZ5mR-|+`q2CVp6$6+M&QWLf~>IN@)~Jz#CNEFe{Q> zS?@}qQ6kq@P!q7rk!@zZ%DOJXyM}bUw?eFpxRtl{0ohtt>X6^#iEGm8fVzP*X1)nOd!Q1hihMRyi<|jQEnir;{ee@e@IPzPRCLI}%Gw%-kWXvt5k{)L zpHnrPuP$25Bk176pIXLZ_Nz#^-l^ws0aWv2i&3E2Oi0LQ>>3n0K!XKn*Uqgk>)!HW3tzXHq3vFT&+{a{f6Kptrir z;WZ(882*ah)8fBj4_NO}b=#kC%ec6L=S`eA^DlKaW7cn^7caqdgNh8j8Ybgy187X8 z4+i6-XM^WP-)xWsqYP*o;UhUdAy2@n*z9<^<(d2%8-6vcxV~wod(AmM$xQRs$rrl> zR-Fz0(CzOOowSfDDy8#f{9yLTjhI<%oV!Pv_ZCn4r6b`%{(RbwqH1PK3zCf8a_~GH z_Id^a5!g>^t34Y>b!2ADrJ|w40Z+L@_D`!UxCC3m*HdhCYglzomxIgzjRm`}~_=Q%7 z{|&T{@IxC6xH_wvb!O7@eh~FgiGzm3sD#!4zJzDSOz5DvKUMnP?h}iP?5r~?PaJ6> zJ_J%|m0jY;YrOj)_CI~;P%}a^pFGoEfGJNLTF#iy^{^XeDes9(*rvBbaZVr)#500X@Z5 zlbOF4nN1qw4}>R2qt!@2UFC#X$0Hr&_pJK$^RAuNQ`4)PfQk!7{c_NI^b-!n-}M+>7AfiDuzsv`#X;(1=(PG17ih)nIzaOu z?!0`A>sYTI_&Hy0iEP&gi}YXe)FpCIuEf5D?y(hyV&n&_!6{#bO&wNrA9va<4qnJ_|b==0rkKqwO5$NY$iIVM}C*sH%hC2>dw_q6lcIyO3g$#mF zRQha{T#m`raek7t1iEFo0*D^H7L*0w4e2o z2#GTYwf#OnUz$e{Bh9b#Q9nb|GU6v^ykt=wM6g(R?Odt?AD74rcfc+9din;!4S>QP zdAcPV8O-#;soTFf(){`&d{i9o)Tz4TE0k;VrQ1D;a?C^!w6Zl3SR1Q7dJec}9t~PP zdAq<+EF43>(g#WY8|wSplOD!BeYfQ+AoC2&C8d#2#J2-mq6ysZf5P2E6S!Nv_RS}I zM9l|G=y))Ucjf2WE3ZgN5FI?fQ`e}IXuEL;lJ_k&_^&fc|CM|-wM@+9wWc+7ZTXg9 zJeC-G$EA|psuHg;qwd%-jRKCt9sk5sWbj|FM8;!{H#;)F-H4Yfmc_XJv^7j-ja1tj zCQxs5FI8_b+-$?{Kdo2fuRZY+&QA;#KLXQAaJuU1^xs zsy*n_;-WMcDu&67le8#h`ECr9I?)cDa_+G+Ur6#SfUH~i#*?=iUFL|Ork+Yw{+g+V zIt)c0G7xB|-MJ_ue*G=3QydbMDTtFNCMGydef&jlPmm_yzHIq00oJuYU!2(LUVZob zGG{4&_QE{Wi}lFwtwvyn@>TP5fgLHkcYX*$bQ~bV{saU#ev*R=boy3ago;uGip+E* z81l$!^4D#n9NvI#>>#4>27)*X=}zv8bXdy?y+?OK9PgyTW%+r8qFI27ZpBq!vxEq2SX#=CcW0EOh(Am~~y z9OY=?`9sk@@I5tp8sz)rU=8ERS3PF_QOf1%c9Cf9&Jc9LK&*tB0skt>Cz?TmA040# zl760%vE9{a|N8NX&&hbGK4-k+`s{M2a$|q_Awj59nQh7}8zDj>=b!(v4ak@1hjzIO zIa`a%w7qe4YgPmY63>KD z<>adj0(3J^;%NqvczkmY6?cb_5WeFslX$TkWLe631<$A4c2*3?WmyfNPv0(AIY&)7 zWU9qI{u(qKF3RPhyNQvBCw3rM9`mbg2_**S{vRS201gu&Q{*fl+^KZgkztT%6F~!` zOmr2h)?km6n9HDQg1_nFq<+Q*Eu{zt>kmFU3So! z8l9}vkj^p%nu`8mNUl|($@B*JbCK2KYJjAu$zA19ybEP@90JJgfF&RB>IL~7P06q* zqqe^J-Y)3aysha)dy}-$9rql*-;w?ECY8?%dTap-V6}4>Xia3hiU6+BnK>{7>PZZj z&vy@qj%W?GMZB!qRjYoPUY|{S#K?*0v0U_E-?vx=)=WSF7IJyHw5o)q`#0sFiUL;L z&x(94;$k1oU+YdokxfZeE$=^TV&3ept&~a3IXVT?RoN4+(Q3Wr z;gK(~m?WCCi53?FuZ1J8vb;q&Fh-}m%4;sBiPJ?E?T(NO1k?*diPbG~2Y!b0Gf6c_ zuKyf=?4LuZHDJ6%X9oeoI({Ga@_wV&{o>bus)aoFXS{({Q<>%> zgM0TeLVpdr?7}GJO%BSn?B}Ut#)HC9)$X9SaFBG;#bo+-m12HWea1aODShhHk6s8I zs--|j3|ZmboZ6QN6yxg?>H1b~4m5?O`CY+~KbP>>Upl;`RsII2u;s?RDlZ?xOGK)u zDGylW2=vhVNw9BV!3upPT#QDGM>~FCZ>p35&`;77{1Z3f}%&leH$cqMX@g@;x=iz8ahx%gi6J=QEskbH^<3`3 zvuEzGJS%Q5fbirafWFxD;eCpUGT^pbsH-FsFD7I6i}d9I41O1epFF#IVM!kROSMq9 zca<5Mxbowx@>~$sf{DD{>C)_Eu`4K_aZP;r0UEIWua>U=2u!0o-4eK#YV6j50sx1S z57gvas~EY~y7ops_CaI)_Y)4Gep)_s_^67~#8ei#<#5e}9^9@Md2WU_X-~hDBt-7Q zBxK%x?LM%b1(a2l5=+EuC+5s%`==8ZY^}E1LyB>&Hg&>J#ws3Rc9JX4$F>qS(E)GleWY9J(ey!BFPvl%hGL zCK*tCoqcs?Gnj&l57Mr23+>}LIHJxH$_#-Cmg}}0=OG-S*3L1>|HeKObDIA{ zPx@ETirYc8@Qou+ZD~GGE?4h|MNCh545lmy%=ZBxIK%9^k7V!nsMyO^leq_tB%+O5 zxRw!^|1lHCw$N{nfrMvqtYReE2g#q0-v(OveCH8v!3C3qV^W^xp~yEqV&5emP18em zj@LWxi7n;ELQkZ>_I7xl5#E>NJU^2c3`PH1G~`m<(yw>-8TRr0c-B8lgN(xuy^}hs z`ID(0c0eW!30F-$8pFdBm<(bWG>iRZrIJ@UWI?ViLGmz>;g+o`Wkqxiwgq;|t zmS$^MFr-ucm0Ay5hPy%lg2lAMjzw=hF*Sct?`4YAc zCy?chvq>ZsSk)1F%AM&e*!ockauD-5i!t~YO?~tDn6k;1N*H}GKe!=i zNRc2I(NLQon+6j!maRM>Z_^@V3k1EO!_#7v-e2Nld&H`X`WI}f`e68LoX;NaaOB;o5|vlo@4C@-y$~8?zzz-=3naV zL@_h_9qs!AgW`S$Xo{g6}bHo zow~zOY0r7y0L~Q`wD`DmP5*~~m$Dx{zCpMoaW~g420bvBkAR)|Khlw|K1bV@guS;F zy#IB{LDhx?pRCn(+E!d}J-z`WfyA$@#34_ZQar^?#Fr9+GZ0kAH}XRA{nYUkhLRB@ z@J1IEz~61&0Q%Glvk z3V3Ttc7W9+p>CfLLS7_ISZlw{^nsYEViKC)L%r;Se58%-)j2L*TK<4#e0B%qNCt)Y zhg@ukel`^H5AD~r_QZk#yS?I)X6%T?tRO=z?#k<8LyN!IREf`N13Et2y}zu-!DF-A zafkBxHfLMlZ7Rrzu?P@wCl177kKkhPzpmbe)sw6r+@YQ!Q*thD+vui$Dc9g$V(%%b zF{-q|r1=x(;uELukrOI;!|to{jbM7yHVL_FdTRFkIs7pl*nHq8wq%n{fC%zBz4aye zyJ78LY`OP1ZTcS%Hcvplv%a<*_9`Pkdjm4~x$GVC|H2@1LZ|cgpYFL4=ju(GNfaO+ zJ;i0&5n#XfK4aPStAQnh>-9!8ERWE&TiAX&C6Ky%|F{E6OI8i-nfyWdsi~>JD{?yB z_9)3o2p+}~!Ypx%frw26AS^h7b`mey(ry#=xy$HO2ajM`Pk<;b<5lPe9)w0BGsHa@ zmeOHr&Bw5wrH^83_!4}WA}s5e>m7q~7W;48?OV4~UxNZ|-wQC(8v=?g>6^81=#E`#$l| zxwUq-n5!&AhVO|D&4oLIu5&VXWxu|2m~6RF`kG{8`isN6e%W3|Lc`P9^mF*L2LHN$F8(Q(a4)duxQ+b!^%a(^`?d-_;J3Ntv4%O9U0bGQDNu2E`3)RcYv9 zzQnGs3ELB!-wVdYw=e77mDa_N+S9{I-olwWq_G&7>Y-F2xIg^E^c*}obVZ4+Q7h~# zwm7PvN`f&&^KXR0exs5_vkXzz&XWtC%;GIjz@?P8Q!5PQjM9snUFQa`qjB_pmqrF< z>D@GZ{~^;ajeMY?K}*1EyV6gy>jUH>^a!l$DZRu-8EKf>gL^-T`U^=5Nc!Z@p0nJv z*6eYUl0mG)YmXdO8+oj%{$Rf0ggUzgGn(fL`J{*wCa(zSVV2jSpUq-wV}?q6SMeOL zUX{T=xBG+Uq4XU%d&5y++l2{ifh(rKbZ$M$7x#@{f5FaPRl=cA(I2~EU{rnAMhNLU zkK?V!0^Oh2_F;l$@$K?=H>$zI^v`T>DMl5vk_@Da?4{L}-nzwdrqXcmdgSH12~g?> zWm*@e4-wyY^*kG+sx7EN1AkWopNsnX7IKcIyh4GU^Uo0G2*Qs+OvR4rJ4T#8w30h( zQFjd!1CnkyGsk5(5}7@aOs$(+D?yd1uC+$VgjJx*Tc2)bcG@6LH3 zUMOXc7J?R$_1hOUhgb)R4YTo+AWkOYf&dwQ-mu%V87=7KRrlC@t?BcSdECj$zi0=5 z=4=Wd+Rd^F8%Zij30FR+&!+x&kgAmHuR&UzGQNFiJyN3<PEbK7@-1&p zAW7krVFNkn#GI!x2DDvI3ED~5@)H4N4#(vUQhzw`)aeNj^gJyl1@s8!1*|bY2$}d- zhsExO7=_ROVEd4ZEg^UwrcHTbv{ls6F4U1dYRR0me|fmf5;=AW@&u1}feAuP(3*Nn zXp61&a_+Hp$i*mrvxr8SLp@>gM26s(GF_sY7!O0L;HdFP=rAv6YPJflU1Fqt z&J5kj7Ho$y<^aj97t{il5dHbK>jR@|t?$Dv{K93{0 zUKdB1FStb%aYr%^?Or^G3o&Zbmr{aEHz+H`soKq*S$eOHC*6p=H~W{Cr*u_U!TX*r zbN3gjBq~h{z+!n(?6Bwd3tE4jRzm>hBLI8h z0@R{oMJJqd5hL{HXrn8JGL7KGy=${mN(xPC|DR03lWjohP<=>b$!P6TybZFpo92*P zp*hJ^DtU45%(7-Eryy9hW9Q>F82G@Vf%4W3;}74e5EokGQ?K!w7g5WkDPGWbFz7iq z{J9RI!TYF+KB>)h+l5Lnf}YE~-FBPV?x z6U^tD-*&w1L^ks_odXTqEhvPCr)(m{Y}}pM_u&Cp)%ODY4!Z?H&wttZ^PXF4Le64j z5&g})yX@=ee;x;xvDLj}UtzkY?T)4mRbX-l!i%hBwY?UuMczFmnl1&K2rCNm7J{{0 zn4CqG!KJ4okRm2LGfK`4Y3i!Cul{)WFqF__`#AvTX@YTfe1XFA*=gtme;f+_wffZL z+vV)eh}DoeOk4Z~VUh=)b4nqDrZuDz!01vD$})Lshy@5sU+pq74wopV&99N{E6wD| z8r8WilGa3@p7=%P)E9|4`$>Ybfbj7#NJOeK@c1o>YB;-Db~xb&@iN{8&Co}DGO5(l z*psTOyD&9}(s#VHg9i4+m^W6ruA#_p?S{@zVVXjq7hv6nN&uSJ4?_>nO&s~t=Vs#P zqZgREn*+fnPWb)m3E<_sz87>>%V|;#m()YZV|Tp$A*gODWfYrU^6BOWm|UpgX{XwRY#NHNzP9t;z&J}%b z)wS$qxqbMLpUYjx{r^Y%NDSj2T2Mfagohb@G`kDMYDdzRK09KF+7#PE=3E`sCSU)d zSs@&D{XVR;5`8H}AIyr~-|FeUe0YV^_eFcQ! zu&KiM*Khms1m+6;(RLSI_qi^~tG7LGPjj|djFrYl#}gJL)QPFC`%fc#hM{TU?HMW; z*3*0GT$R5Vzju+9>72aco18Cqq?K!zZL{T?e|d)r$sS=^`oXVBTWVfAX$0+}ht26c z0V0i+oIyb>m=>?(q@(ZsV-+lbMXNCeJbFY1kGw>*(L%+s5s|>;z2CCdFw47y-+{F# zv%<+8wrMr*YEWByGG%5*=V_;t8g!UAmFMY_knN2qA-^w590}3wH#=tJ5ubFSj|@;p z_O!)fG}93BqJ+(shz0F0-<01$8)ra9v0&a-qhVVfQ5vIH1?3!w(Usxc6T@d|`!Rgu z(Js|%+h!*~H68BZrEjCO2c$4;aWy)RG(QTE=;Q^?=JL-t`y9ueiHrtfIOh@$wY~jO zr=0xW;Mzau8h*Lt1|6OynFs^y-YUS3Vhc!j$RBvq=AT%l9NE(1tBZ9iOy0f#m|Dmu z!GEoaY^42>kq95R9H>aX#10?JJ3ApRq#w%Ogam&SQ6CH+suVdHRkQEJi}g;Ymx2g2 zB9dR_Z;${}awXRv&#@O{82em)3F$@G7Afj2lijM{gV1^PZec$E&WQJH>N=FY+ zU_DySg-MRZdU1}cZFB%_8id+^NzXZUuG}8*-i_=Zr6 z9m*H51ubZJdwF1FD#z@=g zhrTHixJSEcwVm(xp-|(c?7IxGAD4h~$2N;@62d$3d_IEyB*gs6@XXB9Sh{t`+Nu1F zwylG3l`CV`#+}=EuJgPCNpQ#1V8KgzXJMk4npJTmw=r8>8uijKjc3t`Vc=1ITSaacDhF9=q8G3Oad06 zGza&h=J5xz_g=(0AP{)mfreClRIFe%fn>x0*|Cz#+XxfG!bVt7Lq;xFAEyxr?2foQ z>(>%A1+8WAnZ~**G*NP%T-S!KkUtf(ebufq9;j2qmajH)(}Mhg_fdpYkAUqvzYM{a zb|g_nFwkL}lObH}tt>Es-v1~WbLVb0%1cVXCLB_Oh%UK|iB4?W(4cJL%QRAt%Z(OP zbi9pCf$?qx)Z-6xWDteVFzk_EI)OQF0f~hl{<}*s95S!9Lo8CRIdSo=P*i4*(OS%? zzcV5HZu?&|CwET|Rq&GoiG%1RWatpDJ;aSGKy8JttuyKvvD0gj5s!v1e~?nOEi{xN zcYENu#owWJ7_~BSQJ~uS=US=t6i#c;y)`T9v?bt0=gj$InoOc8=YH~G0{S+G$9`6h zLA}2=;qB=!h2-bwqM_&J2IC}Lh(V)`9YN~;`>D~#d|c^Iq?jlYm{3WMxYCHoM~;d9 zH&moK35n;xkIGRBo;YTSASh8y{^Q>JH1D(?z`5+YKVJtYL}aUPY*Z~TJ9$}I@B1AH zDzsft<5=0{!=iJdp50 z8rg;4IG%FJ03(9w&0TGt{OQAQ8$Ww-C7T1_O>(}}>*HvtmX!||X^PlN@>yXCmO z$WssLdDvxCHzliU3mYelppVzEUC%f71nTl}Uaw)XUMu(RCms2K@=F`Ba|(ceq$1*t zlu2@LrX~2n6#av`nMFcgZ`nBaVtE76BbB0}9R3GWw;9A0<}4Pyy%Zv>P%jh$K_mKJ zBYK}+b*097h5DQ9akxXWy{d?9V+nfh&joiMo|}6+VBuX&IK2PW2Cfixxbdf32WyfJ zNs)spZYnX#*$=Q}z}65~BJ4te|H9Znm5Jmy1)FO>;rWipMo8H}XHZ9&ecJY2c|6;n zzL1u93>asTybC>fT2Hzna##eG^5j2@ z^$%8dI(|LbY)Om7EAgtnO|8jPM6)t<`cd;FV!jp`Nuxb#`;LkkX__ZRq+h2IX_dug zjP6!mbku5Ok;m2G#1Li|i_Ol8n^owIiqE$+F8(K-HFChkrkf+tJ%N(%RUYliiXq+i z*aB^$5@iVwrGStp2%WM`btx|qUB{6@~4=nT^t)FXSLu5adJeS4-2BsPu*oF3=-V1OWlPo1tMEn zA2|36T~mM3x4a$u=D+fKpwhLL3Ee2(p7(8N1XFgrN_#|MQ}qHcfY=ZJ|F71FUQKC; ze-46PgSB#+Y4ZmtxK-t>rbbZJ@8l9peFSP$^I2^1D!D~I_|VEe7g5BACyY=5^U^n0IZb~JBkM9K6_E?)ROBHLOp3+oYvl(leL{(;M7 zL>IPQk!we*GSUo(Xbn@QWKhP1>~>hpKog9SKKHzyCqh7N`CEhL@EkV$-5U~ zZ+sLW>&L%fcJK-gKU9?cmhojJjQV%y9dO8XpEZsd4&Sk)KD_HDId{lQ>BxLKet6P| z-S%Ne$aB+kC-^yjBtx)9CNn$;jhZr5!nWTXkS6UG+zD)!<1CK!n@+s>K9RdoT`tAC zSFwhYNZck@mLiD4NhB(G%cRHtWMtI@AoLck-zxJ-yjk6}#}7WageRJwf1&-g*;PDb zV}$`4=C3MsY@RGvQnf=YJZD2P&!JVeqa=QzkJHq?g|$TCD!!u0?5s2@6;Y{EvY`|3 zn^D1GPW*zk&@b;YlZMr1DbomJH!={8Mll=-Yc`f*Yqk+AO&U?8EZcf6rrGlrB9!v? z@@%QqKaN^BjV279Q_HmT6PuEDu~RfVSG$JFz^yDMrtL?}?>9g-7@0%rN200Px7+j5 zO`7B1yjA->>Zn4V>6Q7_pepV0qDg=fk>ASUG=*Xt3)PH__xaE9CppfoDgz|?(Zx!m z#glI3XgS6oip5yIby$|nqt3@dbe6-bC%JmfJF$W4 zXDV%o>oPlexm#^$As+1_W;vchGm;nnstLa4$&*|53lCO#QX1u6jb4KaN{N3fK>^|5 z#ojpO3UT5dn1(O9z^UHs7bAOgq%os%E}u%Va+VC1=ZrrHwT!taHGeNB)Rs735}%haSD?&L29Vq#n*jNKabZ)ppgmtDsfSz+ToWk zRvJ^7CDkFC*O|jv^MGZdM%h|S-iX`eF+=LM@d^kTtv@1vTKuB%7Cz%a!G9ch2n>8e z`&i<{(Y!FAF%0NhV3pq%qt+1RqmGS~gD&Sgf}L=2X8mY{h>A&tpCd^GsbWJFCNZSs z8%wkiJy1O0%M2gKe$K$+s5jsc5L_J1|ERihZzq9uxp@vz$JO5Tr5`jW{#$XTdGQ21 zIZCeDyVuA;tKiM~$7nSNX)!0F4TX3opv3yw6GL5+rgVA@(Xkvw7fur5dDSfqBpri@ z(Y(8#j-Q@AuZZB@KVDlY;)11mX9bg(B#M@wPhok@eL~7g4;%h-1_TZXuRFlc&9NB4 z^f(XAnYRaV2e1l|c(mJjUC+uL1CN;VXZhlrquFTr`5q_&)UlWD@5$Yz$(O-;8K)TK zR7KN{+CN8@ej+SXXoKaU;mny?3!Vbrh=V~r17rm&wwrTR7r}(ddDK?p~XY70wog$r+6ehdO=)W|wp>+>Q`|%MG{Jj34 zewEF!O+&P5^iqGmtpQVMvOP&vh;f%y6$lM&P+WBBvP_hDZKGyEQ?i(N#{lckmn#k zdx+Ftck_Q1eEM7@i<;(9K!iv}-VcWr*`l1q^Zhzr9kWS-U!lwgM-PE40H)>L-xHDCsri7{Xbw3-#si zHWz9Rmjb648RqWpOs_PZ{7N*%EHqKswdl8i~K5-ut)$U6NqU7i~s+Ak+Z?(5=wAO98P8kOQOv>+yAq0l45j+ zM^Ee zL?Ms#g`wc|%h}>0V%l~@eCPf!@xGO0EEkBsjEEC`k)b<_m`m`7{%kt9sM0&|S%bm18 zAYokm!EH3yM_eSEv>L{7Aw7H(Z?;A|`9}~cpml0;}?nogB zJTDH2pfJD6KH%FzqQ4dZ>}9*OMU2p~n!8gB7g?z{h&lZ}<|T`Wp(s5V6`~NjHcdCx zMc9FxLtZSM;h_yyse#8oXBm)ZcRF7|EGMm?ME$VX?0#rcDq8eU;^$KOfQM&RgZf_Z z$9m66<%EsK#hnrnzsJl_Je|Q6Lz0J0!2|Bts|{{Z&o!txCM0YovCTG8#vaS@+uF%t zbit5AT0Irh)#uZd=jDzj+m*Fo3p=X!D}Hy4(MtY&z*g2cP9qgHqeONqrpBg}F$d+| z?(m385{Yc}MJ;I+f!3}hHFtY9PVS^3tvIN01oH;T!VX>1^y3F9`4+NQJ~??QY0#f* zZ$F9k%9m%KBi@H6VXq{g+7+@4W(9m=3zSApEx#Z~b&6!r$ZD1VK$scDIAFf?oV}A zAyY^CcmKE{oVOY+<}iYnDDzPFkjnX?z`)e?>@iy?6fS#yIm)VlT@`Xo2qrfUk&jCX z)_rKVx1G+C$SF{PaxZgO>AL*-j;2g}3O?VNuUvz$PtH6jU_LT@AI>MJbW+jb7)<&u z7FFABbbBx+F)~aWX<ik))bW2SL{?u`S$ z>=;1CUwmXOzpF3BA-ZWEKuODROYu>0VUE{%y)gYgz#fozIj$Z#kQXPb7L`RaB}&ZY zMVG+F12Xj}Yf&(rH>R;H;FU!o$!FEtpRk>^4(E3hencALO)px;1tJJ0hz6eWVv)G3 z0Y!VHKh}%^wWaeqIQ00XsK7$8f(4>psy;|0uv6t>H>T26{e6)48~wa_Wl=OZjnz06 z701UiPvC~&{^@1^$Y5OGy@9P1}q*{g6>KOXmP>u;3 z&JQRYaWZY9D`d%4!Qi5Ixe?0>W#!`8Bop$&|S&MBhs2%Fbtyq!_Vomfg8gf)>w`R)&VS%nW3ZHu=Bn6YO;BbxK_&oE^q zHnZZ$kKy9JV%Iv=MLs`Bbe8dzj55$+5ECDk|7hN?(=_MgwAL}lpZ|oZxUO*nn-!~~ z_1C^Ntt>n&(#GJ%rZ6uuY5YCDvvHQWUUhPslwSF!@d;FseJ%X^iKUF4e!x=n`MSPL zt%Ko)nI(LoYQ^>$l~Hvof%840D-+yXW)S~chqT)l`7!ZqbDVzYtGU18zr*egjry9~ z^_6Nov;!!JcG8$KWKbsp)Iy@U%2_sZ70F+W6L5SShULT55B{}PT>wee7rqwHJZ4AY|o#W43r+Omc575 zSJ4W=@O##{(!q0EBclbzArpI_?)+_;)`gQj>S z&)2|Za(Uth>pIw;9;4!PcJl}-xwZJ%=X7g6m&@dG4VT6WE!mC2Se+1xlsE!hLgJWt z|LvKH$3G3n6*1gV=U-l?kufIZGOm>l?(+&Z@kWmZAffJ{D?Lu@@sjYimy@_d14qyI zPFf3p-?hlK7$V?IZ$f^1Bb&Ek13U$k?+T5@bUkHh4$JQ6>AV~{y#7q%92C;?1p(Tz7S77L%^oS8zeEC#_J*@Moem{b5>;b3 zV1hFl+FTGz8Nf2qhtqwt{3~8eHJty_VgU`;XFr%6B#E0$CmN7jgkp9i@`x<1O(G71 zUHUgEdD+MeRnKn`X()r7rj*iRMF` z9b_PlcsA1zwkw2(P#6jE_LhsM3g@9<_kaQQ^a`{7$Ps2TZ7%y&U|x?$mK4Jj&&Q*VSo|gJQ1JYC&%2Uk@8UKkZJi#?ik*bCu=C3p~nQNkQ*Zz zPh>bj0pr)ae;G}(;-YS?p`N?~Vg?jW2f<@Z8AZ+V08~bMenutLtQuTV zW0X(CP|@nT*ZiYl)iF%G7nerg#&!D+ZN39sK&|NI1i^!lJwmDiTc_aWIXn z6x1I4VbK9yM@dt9u2uP{oY0}3VKhk}a3rBizyNjP9@b=+F<;`sp<4F;+^k4ZuzW-= zh*j$;cg$X%!8;h;h#Ve2H581>;ulSVLqczjS+6#6Rx1+WOvFz%bP+BazE`kWxjp`U zB*mgLLJAF!0wUxQaU4uAzO~ou2Z*P`cps|o^L1D&l|!rxHzky$GeCJ_B{1wP@gL9D zgjsjZODDep{#$CT>aez1St4#tI_$|5QC+HahhWQg)DYE^qGKQ@2p1SZCd$ViE?X&> zXqU@#*X%h6;W!BPdT$x{#tjh=nhvOW zaAFHf1>H%N!L`CrVd6cVlsPdHPoPEuym(2V+5K79EBVGR6UEwngJzF$hVq~9vn0|oicJuz4`xcRlW1d- z%(H;>Z|`W7n?=>g-UPWa9?rQ+j=bj=*Be*4Z{nn9024_)#bqbl6pEoXH?5|~w0z>C z`J0+BSYVDq)18;2iC?YFygH&M)ufJ|Y*@92T7&ShSmXI34OyL@EJw=LLNQDH-W|i)vo*tA%aEj4w9BmSF!Zq-umgVd*S9cEA8jn=oG~IIUXviP-UnF+GJOm&H-jNy(tD z!!>tWup1WtuR~w^FhiK8K;Sp+Sv)&PP5Gx6fT?Tl?~8H~$>{#gZ<29_-KG0NAhKuv zz5U7ND}(u2Adv_}EL*j}(1U;1;kll&J=m|1I@|}B)Is;@*4}LF*M%A2H>_Qn;pn*> zFl%j>Rue32DzhFPF*gpAE)`8e z@VBlV3t%GYnHOSrGcH3iz_XHGv&45KSpgtWy`ACwZ=XNe2(2&v0E)0Z1EE47pAvyD zsyh|{9W7^PO`-c&t;rA*tOJBx$F5b|Zsub6+3JIU_FP-}=e<>*mF;bnru#5%K7plb z5GWkA!*rWQDVyLbTU*UYWb~q3vyP_?ew$~Ek|7YG^el7aQ4X_0E!Mxurk3)eW zTkhZ+Hodwcvz64C8T1%80E8z4hIkRVi6ICSB^0(!)IlG0`)FKqA<*ujh+yTRB*C;* z7!1|m(3o%`PtEFJta|H3RHSVJz$}3cVZJo0C>?QEnlADHh0SH?9UfR_CyvYi3C#R4 z;l-D>>+$A9DycQa0%x(tm^KkijWkJ+-=bG3?LOV{377eCa#U;T6p=7LzTM$S`r=Qf z(};O=MVBfMlS0y}>|^H|YsF$2b3oe#e9`Ziqs92G4+LL{FVRq{WEjW;lBSi>Tc6oM z#FIiQYe6EkMmO>;Kt=$!mh!olV_S$_h$@k&BeL)cu0@mE-Z*Z$m+FqKB0&?P6SGzY zI)z~_P)|VGuS2x#!+yM@iT9-rnGAuVOGJukipC<-l4xmt-|8Bf11@5(sF(CB@T?)Z zRGmu#lGN;w>JfG$e9AC{7P?A??E#tjF<@?p(I+d8j(FH~(@PLZEa)-p9`A({Pp&SE z7JpHqoJoGC_gpJk)-*ynb)tMoUmd7gUM!y)pT=2n9^AduWejtGIC<4Ere`V4!ALkX z*XHTCxJ-qo9*ND$tenel?$JWEC|F*qyka#gA+;&J!R>ml`d}y^R?&w5UC#TaM=ace zhdkmWeeO$O51t6-BaMdc-bbu8JtZjfOcB$W#t(bSGkQ=15lux+E?=?ouMr0V=v;m& zsg~C06=uMjPB@Zu#0NlWg_^mltcr8_j$r9Ni>c28eNd)*vg}F z)e$d}6Ty$#nT7@e-d2(5$o-D-*3so2Rfh#0RT*YWb=YReN@9-+08}zGDz`K}=}oTv z^G?y2g)XJr8R$NM9e+R~(n-=wf z(QpB)TObM|33(ug?=zwtlZvmhQF_hM6yrU;8&It|?Xk0!DjT>UmQ(9u+w{LZ=1<^p zAVB+KcdRoarp>^^Cr#Z@Yjtvzr8nEph_&p+gx}Fcw(ChpD@wZUE!Qy6+-1`91n%|H ztI(=!&td`HdM%9ECh9IU8lcsFniQF3%C8f(+i~`OufU;OUJHY&jr2sToP!mU*>Emk zoKQ5DQ!1d_;igmlzW94Z;N9rF_mDLZZDQ8b+s~ljfVg!9c->jZTH_6;svCR>c_GL; zP<1SutL&`y*y<96Q~d}H-eqr^^wPT1|ef>H78*)8urx6QLeB9<6)i9yE?J!WY3)p!^$di--S(AW2;Yda1*=AAM<} z_j^ZBmUvz$UU==8u1<0R=G-MZb1!Z!-Y$Di4XZgDSn2t}BY;uJpF+|Dk6(8G(Gb#Z zqROORgwD@Ce$|aVoxkQqS?e2cL6S+`e&kH$lbzK#ZG~63CWI)_IBR{1#rq}6j`6sG zU3sl}sH`-cA&J=l$6Emivc^=(Xu4hrP`f*`Sn4$7qZh^n70Se6t^gT(vUP4n8sNsm zMkPuy{+@B&36n#5$dNM~Ov2CzezRxIY0 zQ@i^K${LlASVjwSofHQKDD$w%-Gp41SjKFO!4-u)x5C-cxY4_67HL4A<9M@lF|J={ zBf<~UP7wvue^N33LH|}Idbg>qIy?h!MOW&``|P)8kp}W*s2f&Jsg}AqOhAZTsh>)7 z=R3S43Ntm+$nfxx*42q@0oj7hz~J@BiR`wF3gK--gW)J zZ8r+Oi7KwxIk{=&hr_|gHf@HCt1R#p-+u0V<+`f${kdnXizp;#G>s+kdDbLL^m%+Y zZ~cR`v`olIi4p-4UDf1Q!SzZ}N2XH!W=;{Uy|Q9Rs0r~+DGM8C_)3|1Hp|UT1K@T; zV$PP*3^_IHkQ!YeFjb#VA&nzSI4kg1teMbK7@IW}$#9gRDShTmVNLaj$bh&7KgT>q zC@5Y%qSz&kjd1L0_1L>owI(sbm*-GVpO

    asWQ?7^<;(hLXZ__uD%tC+CWkvB0NMg?Y5E!idE(15D?&B3smE6?M4-o~O z0CEY)0R7o4^>Xb0=g% z**Ptkad2yhbV6h^gSqkgd*kbK`L6uw$kw~=@{?r10{uxF;|F%XIVG@njiT71h0_L5Ms7$X`ToUAlXhu;ET+et|ReDH?@UDJ=SmkX%sTZB?b zoRAPXFCn*(Lh0W64zG)X7j!wA;OV!a$p!ri-p6j2od=vypDN`*FDO^`WyJUx({S;txAcwuNpG>VlY zv@WyG|1X}cjug4vO{oL7PzxyTlMBj4!lmwRBO zLG1z~W$?U9VEg7f1I?VEAo`M0t{4Z@<^%%(6DluTRdPu6d*J;LL;ga*AgfL0E#h_G zy*=an^tt!lkg}Crd5l>d`!`eb@fOvr0-VoyzCdc8+DcwS^`#mN4|*gpewWR+r~v>q zy)H*$wI7P~YUS!$tOfM4tNoGKpbtYmQ0tV!AnXbFV7S}TTb9)Ff|^08p!aV*6mVJN z9T;Q@)=6VkMS%F4Mop_X<)}Ltg?7z9h_Iyd;M@RZhATSaBJy`KvGE*kC4$Kt3sLtR zLIv7M#RO_`Bzv(~gEW@cB5cHySxxo%ek%8xH9xss_tK`x!!SdM#-uuflzfe_+XB^m zsJDczDSVQ1zy1o>N$Xw*+z*VRoQ2w8@c4Tp6-&sUu04_qULt@$qhqE_1BeUZOf z<>#b|C~!&ov$gtgbt#1R2p?aM2*CvM@2I!EfBvkO`ST;iWF&T029=b8L!)B`lSd7H zAO>H`FFLsiVI0_(M{JO(N%-)7w`?x4YDXR@%R&oy3Hd`PG=txBx;^z0t=U|8c=Cf0=?y4Cp%Crb*{k0@Bcqm>UD$S0bMp}@%Vy9VlnHrU-O-8oXu3fsV)w_#oF50~M9-R-A%@J*=B zH6?JH!KmSp-(zoE{T`i{cmZ#dEStHauT5wP&|(5`F1D2T6VjMViZwjp)}LQsi72ON zKgfoBe^<0qrJ_+9Ux;jIelW9ZHZZ2Q`~U zDo7!yNIXmUelVqziBy!}zJ#xJyFX9Z+OOSC40&7V8gr;6<=u<&+y+FRsCM06;A!BC ziem-ORwkT>-yLkniC_T?$N0%A{1~+q30g}T`L7_mPwTTSf5nY&0YnbE(A2~kU3Ol6 z%tGd#bm}5~rIW88;HTqE!ZRROCocnn)v~8}yl5mGbA^6Uq_0{PVIhPukAZ|k{Ckte zQ!LOooZOvYW7GZ-Es_ZqGJoIc&TOjHpt;%ba3_dA28RzYE`Gl_%;_0PSRIF@NVt9N z=T@I%RaiS6-;=XVP#;bY@;o{k+x5zK?>`1OoB zAdFIQ_#5+sy?0(u_tO;IQgOlCEz`ql0e(+Sl4brgH=4#CQWokfQ_W>sZPoUr^G!qV z8DJHS&mu1%%8(q#SlnZbirj9OJnpU+p3Lo@=<;H(ALc7q z`@_}D6;;H$@L;N=(pVx`yWStM(|)!wF;-p2e7?yIc##TOs5+a!i~QD_g@MJM&n%^k z@Kanmz#Q<;gIsOgf0k9-H>ZH*AX&_Hx@+#tG4mC&I)=Hx=I0fDdL-pHV$v_lv-w4) zIAI8Q(#Ajrpc@tPR8VCE5g583h!ZTY{Upa2|I(WNkwQw0DJPR!d@{PuJ1dY^hBz^x zF$I&`9Zq^)@e&DGVd6vDB*SdRmU^rg00P1gzc+diyjquGBP`w>r4RAIbBs-nbc}|t zCC>3<$t34gog`a{e}_Qb`a*Kn+4bc6alOw%Xa+giLmwb@Fqa0HF=X)Am93V3BFY0d z5Z^f`L74E_{qXa5S!vJ_7OV42X>zF8hMCEO|@ zmgH324G$BggTjCxNM4G>joB21;1fb4SrAqDKK+Z(1l*VrA0&tKC%}%eUs%?dkWL0C$D$`G9VBKK6efAB&wM(B*8q$t6-H_+OJL zQ5beTr1KH^-cC#~X*aMbg~uWBB`Ka+Cj2CPMoiDj6|gKo27Ozv_BWpr0A$W-S3!=rkfv zbYaClK|hp(zx$}qt5!YgTaCU%+)K)Qhu?&)hzq2`L%ZG_&+c>@_&~w63QyWz)6S&rl~KMrz{e_U)Co&J&J z6Zwu1yCddHAbUHEQrVO8=G8a#9HG{q*X2pV9-hZ@QcU{obLN@;{kFm=O%4lbn{rRu zRL}v7aJEn*5>|-0Us$qbJ0cJ!03Zy`<@ZTNLj(LI6SB|w zHyFa6bAdoo$*{*Lt{O%tNYQFAf>6gQja|~`!BEuuFqunUn5uwc*)slOEOEB(=qhBy z8HqzE*cl#!T6SbGmIN1wojR9e3!Fs_Z)eziu2i(p3Ay1?U|Sobg&hQVa_J|xzZME* zoN9x!yv7pM&EZaucX79wt3g_1E9cSy3W0v6&rX`x5{t}^`#RhYSCxna{h=!LXPOgywp>@vwG+c*pu5OmADv`} z*TzH6$cHFNpO3ELZ!R=SRib2Gg)nU8m~r7qqv4ga_~`p=2vgG4aEdo#)>}kFmZiDi z!GLm}aPGHhx`6)^U&3&y?4Bx7r3%{baO){~wAVFC!3QghgZs$H(J2B{#)*!UHrct~QSYDmjodMsJ64iQA^h zUC-m$=-t~JV)6vuc=q4v$&{d`?H};vj@|h6#PEAMv1aMPBTcIN&R zOopLPdX@b0JpRQVA=r81NL8#FgTTRNH2?&l0!G%km-?zQ(!E#uC{U?^>A`iuc*qsV=(xQ+S-# z7$7KkR5}+Zr?L}V!->>MN6t*an5ht)ayQ56$CWk}(HNqdrncIU8CoLSbLB$ALBUVh zH^C!MsQfH>9sTvtZ>PsLao1s@(E`!3>d%dO^mwTGTgeWw*M#G@03QhnHT?-YDS)`N z>D>reVhE%a)VQ8N++Bj!Wa!4pgRsNHHZ9&rJ-8SHFf3-u5gxzMXB!MP7=ZLd?}&uZ z=72o$?$)ob)p23AnZt@~uVZ>hTVdbnjCyaVOcok)mk^6;6L%gPs#$fQ#u{UZfWyms zSnmHVmJr6r6o-(>)8? z7d5U^wZKesrL<})H;X!5fGnQgb>|*jHS*{%*V5WV@>O(8-JrqZLSkuvBIENK{_LVV zfFWnc;!cTJi3(CieGrgYepT0(EPB*s_;gGL<~;f^Y?ct3CDag z8+G9ysXps_eZG@qw;cKSHI9LFS%%hc(xmHMi)Xx(M#AqmXN1cL#i~^!3qQ2n)P87& z*l`mj`vaa=a%Nh7bbk%9x{nAC!?O54Df=&Oj)n5TnRkoH?jL6Ku=E`+g0v(nrhJh> zw!`Jq#=Xy_iU|_8*qF5POogHJ@a+Kcdsx4a;6bTi&YvDu%#cM7tmH3V?@S51bX>p;Xat zO{K$L;op~-i+~C!!*#7vF=*xK`spy#M4!V*fU=rk0nOGi=@!(Mi9UZUSj{GEB zk5h?nzXN6@av+qk58r5gfrvs+xtuUJUZQOAYF@$*>6_@sJU2?gvmX5;oph0-HB@B__>xmbnm%(x zsG5ktZa;mrogMLsI{9u+A+e*vMfwfnR9I(X(t=AediMrtp09+BUx-W}IqTz8lVO*K zp)^y_Y~1XQw6Hq|JREIcDsx6e%f*&$b7JTp40f6Up>Aj&4~Dmbem}u{I!a%;#F3mf z4g7wM1P^yG!8KO-WBY(zR@t> zq9)1j6m$pcw)}WUIt9~)PK}Zv$WHp@$D6$y2a8X-?G|6PHEExDnUewnS^^C?U3t1! z@p3fA^+C@j+wNZ3|H29T3vURLA=AgKU`LEWpT+02IR6x;+R3c?z3jjxy@g0|BvUF9 zYk_9enG7yW^%mkfE>LsDmYyr*BBT`mX8|j=0~O*4J@-LeHzcu2B(MlU3L{>O?V&_v z(U!syOR0%jw`C}Cr$SWZ*ZO%p3D@`BEILhZle{PFgij_Wih$UdpbiIEJFxQaqkUaY0FJeSM2$M{_aAFnOPo|LNRNPw znbIzSeZ+X=$%qC&QKQDlQ3yUsj!Z_pRWbLoyRkaWTfJdpfWC!@ul2(&to5SP_Ukm7 zVn|Q=SNd5&R}5His=LMa2KnwE;?F)@_{W*;p`N9NkFiBatutJVc+==JBvfR6P=W0q znn@DL^41-1R~(nLNK~JQ1bvFAsLC94%`nQnqqL2X{14OZcf8U1ITWi6sPWza+k%v- zex^S0mQCAVm6Hw-vPQ{u@D7T4;sqKGqBY+A2p>#@)nPtB)p${5AhqH_%#`x;X3<$) zCD=CeX3-y`D}Mvp61lj{TnjFMp^U9s44bH8H1ZzC6&>08)9oqeIF9Kt2%-mCRYWU@ zAwvYh$#)tFsov2=;nJ(icE2gAj)E4i$lwhK)NQdTr^@xtKHh@EI|IUqY7!_-eS_G| zmao71*Fdf6H`|k^G~MjNlOyj?nbWCt;V<)%rCXQOg{hU;&5v9Qqa^GgG!hqOU^8mV zVVifF8F9Ib-eSlKW~4D{GQ*`_e-tWADY#y26(IH z&o;FHsKbZmhKl#MOt68bS$uNDvM8 zlK2~_w?5@cGynpT;PCP|6e3ma6J=?#j+ulPqNjl(0SWR)J8Lm}q$Ulq2w8FE#qxkdJ7mq1*KU=+ zkv(d|0oddfdVw}2Ds29gJM_qF+I~9i*5esGsZ=KJECckja_o?{Gt`J-i(@En>@%T) z5IVE(0@}>tO`i+lWbqk#YVG!_4HNBsA;xByxAeu{PjKah+BSY~_u{g0{Yny`&#Sxf z9kzZBr^4u=OH3PwRj?zEG2}alitV^Z}9k<(PV~2^#+oZDHaJm zA}|5Ba^EM9mnUy_i+u!F4{xRGd`MJ?zX^a6Gr6R}FWna+%~BZFHzrO>QA8K9n!xklk#!F}cy6L6H6h<}iEF~onWCB5rNIuu%iHg*t1 zFc~keHZ4Ds`8?H`n%oW2>b@5SYL$Z&v3Wl+!*-WhD|J&s;8aGhW6|~p59T*qa{dNV zXn6=aL<`WS-zjAuSqVExg+TM^3%&X(W)S{j&R(usws7}rP7T)%V&_Wp#bd1{>~6q9ruvD2~>yWrvhPkexYhYjrndV+9t!OAZ=0Htt2q1}evnm8D+3rg(W-h zf30E)k0MEN@pF+<4DnGG5t3Zr*Y0qsfaK6}9>J6JigHgYrxfpbAgDs)9M;i4XUGQ^@am?Ey&kDI;J zxeTg-J9k_pN%5Me)tKy*6`07dXBY{`BuYbl=m>QP<7&U;ds2z_EXn6P_ri;yZ_qj2 zu?=7&dV{m)H0XjX$@Y?v!D8*MHx+MeM{IU(JsA>DpsxF!3baNED;fH|FHkLo6K$h@vK8OA7Vc4 zAMAV2gKwD^4;c8`sylMh9(~O|`k0vn_(#;1&&F@T^G6%Dc^Fohu2Q*=mB}lQoJ!-n zyn3Gfj;XtQpMnqfIU0XPO_YZI2A(Cca9j`nkIo621-|`~>C=R4WGvgy7q6W`SxS63 zSG4I(yg5TW6qY2U%9J3&kq9272?y1(Hu?32%Az3$uAHyG(Ih+pyVjiEXs0`}njP{w zRtUvCkF-axaEW|M5c27yf)**dBDB&y$(FFx>j6MTw7<)qb5~u&r1mvz;_S?#oxgxk zM{|&+ea^EhMf>6}tFB(+AH3!sAD$PFxzCFNLtLicSAMir9Q8K0l-2Wlm)a>-5zqZ$ zWzA4+=x-5Kw#9kOiYm?DP~*62j(MpF=43-xi%#$F^qQ|9w)FY}@h1%`?9>hGS3KwT za8tT2RueIoNDfcP@?TwdaSi+s0bl7qqyYcO1wc%E76VXzbV}{|ZR;!Nv}&x*b^M)o zwOUc?b;`c~o1LM*;xTfJ8f!Aoq|JN~)xZy(wguKrv~FF(T%HbkOEAWX;E&dZSB%I} zN~KN#a@W49irRX?4?{31o#8SU2f=U+m(lmktXtvS9WU}`kR$D;sZYIj-fwM9M8C`vzAT_OrcEo&Dy#}O*kBk#g{X03ZP1OCg68; zGyAs{1MjUT$P3UDok|S0{>Lcw@6yLW$_<))f%D4Cgnw!wy8|%aV%ws6;+7#j1z;j} zGD?#{DBeh1Rs;}}0yI~KjArDx>)s!7WwF=2m#}zmp`ldk|MHuoYF#KPtL#BHMA5rs zpxh9Ea^8_iHYw8$)2zg|j7_Uvm&LN)hjR>ni70CfPn>e<&ZFyu?j-sz0p{Q2m_RaC zcgUgjHvg3&$G;DM|2ktKQa6yNo7wht3PuU=`)+s3Je7x zA#~zPlMzs!i%8KCvYVALnU+o%_IK8FMO@Etz&tQQ@Hf1V0I zQaspY2~(Po25JNC9*3oT1ieOSl=l_x^5h1-a38&+>Yp4@r>5wJh3{$_E*TUs|A+g1 z2YQpA5%d_oN4I+R8t(_-tGhr%LpycaQ`mnrYyXh*06m*aK?nuYx16CI=FD&a&2a%z zbzB~AiNBH$8B2!7qBoy`zrhD!izNN?E4-S}>GX@@ZI+7?bnC6M)A_s)>)o$>o1?om zg2W&nZKdu`4Sy0JJ_4y>6zU4Zlz{(;UeW*sz*VNusz}~iG!DQ9_%11nPe(n_?0y4G zE>HInvdqxd69_GV-3Iua;R%$X5ty{f;i-V=KY@C$2Z2w5Or<)j;CQdN|B5{)?ZIN? zIyM}ivxLv%xP=eE*zmZ0qP_0#L}RNjjD?mQR!5Q<$n_iT$gRe*m;s-G{pr%2APXLg3zEB0;jknu+c@`}+2em2!5zaA$Un1nO8PnG; zo*(a|#+Tju$1}UWo(81y{)jQiT@(I!*7eL18iPkqBD^(mR{!L9(ebaGcQ6Z-Vp;5a zUw+U3I@|v)e@Bu?mZ5Bon3 z?o9fYMzbxBesAbM*cSg>3I3Zn`d_8e|Cd)Ph`^=#%adT?{_lV4f4|bd6C(fPME>Wu ztjc^woIf=m;r~Cb2LG26`5!L;ct+j;!83{Q{r&%5Vg1`(|KD=E|M!{SflMSCAJbi9 z|HniB|J=~?WU}+Mwlky)qUT&Hxy0A}F?x-XWT`Iys|5|$ckdPdKkwuJbZJ47pRp@~ z`(h^lbN~3)qhP{p^~W%}{uv{m$n7GF&E>Oog>m|SedwQGLFPk#4rndqqzsA_GWDsH zG8CU)2G6!um#((1zjD5%B;ZxHzj%2(i~1RX89^E##4rIY#xJz)tAl=f?M1lJye&r@Y|oYr6V@68D4t;ZWxf=3Y(%sM%y2Wud$UX zA_?bmd#vYjz0cm2J{bKVR9-!+^e7wfdga+YxhBIS;#sVanToZpA^XiAcxYWN=kP)M zoSu-*2d4CxY<|&4O`*H@$UciIkw7x(qtGnrY23@5?9;Y?uOl7ccyY$K~MC(&cc@wvk^x)rR(JcU<9S zHWbuG4}F0D($Cs$+Fh^t%MiLXwR&l-h_hE43GY5g%of|GJ+GOgkJC5yccrW7{9Q8F?YPW3K&{bv@< z@1KWKnWLCy0k_-!>jTbUAKt=wr6szt(p+CE*S!(yoWfR>l+#2M`>h@NrcV09_eKzz z4cp_chb~5upnu!?O<=yEdodu)FWK~#$Zf+>072$PceQ6n&jo$6%oF|hs(%-_ zA2op$UnN%@Z=eA?Ktq9uAlR!}s+mfXFr^%hlvC62L7rx9{U#gfUt!)Gu@OxG)EfCV z7%me7ex(rwH-;eefw?zF_|sn%LPuIV}iEzpNULXAOOrV!y$W0zd&Ixw&ZbcpzHO; zV9fZt>h=DTj6-CDWyg>F0*yh|h9`q2BwXWaz0#^m(lSy&U%Md7Y1iiB4HSPD7qt8x zIn5U>CX2tzO36?QIyEcxzho&V`e5yzqlt#Q?lOL|cl$sMnDJDf6gg;n3q??Wmlm$k zsfi6Iq>YsU@z}3Y4a8*1QoRV0ti&*;kDdL>7xr7cv}=2Lx>A{LUVrl!x7s0dDejw| z2zr%4BRY^jboC1*EU8B_Eb1LDi;w+cO}lJp+Yk2-QSIKYN%b-zj^@gXO@Ioofe2%r*JH%FMxL_lv}0v!{^Z zKr8bjKH5p-J?%;YiX+N4US?QXa+`x67rgmHypJX| z9Y4;SGuvz|YC?e&m?mb+=o@;{G5~ zZSZ*O$1LD}@bay%_ihpa0Adv_BnED{IHuis&j4FVaCsv2Ph&18^>zzAPtI4g-Bex` z7XI9V0U7OP9^apIwUE(9?Y3Rd4wW+!utaPnvD;@b`VaS`15cK|VXwD-LeZ?7AHND4 z@PI^LDtD%yE6emdQnh2n{6E_-w(DUgFj^}IwnC+B{9O9(!r2G`r?o8ZD&S%!@R<2~ zp0>l99X8-MjlzU&03HWE+0Bl>;rL7LmO&^yCXQYQiLlG}NZa=kQu5&7L|7x3(ru>b z@uT@lMz+#?&(HT4Lm+-*q&<)^qMy^4j>H>rC(3T3i7C^*{y6YNlf2{P?k{|ULPcli zp&LEazl2l$22PgAv7^CoXxM;VJo1WNV%)w#EEBDftfX6A$`R|^HW`JXu zz+fpK=QCUU0j<`$=HaQ-;BSlCeJHoXs_b&lHE#q2Mevt^Yf;1qjG)$$D zqk$HZD}KgQ=G%SI4Uzzgz`Tsc_7iJ0@7K<1ZkH##C7yC~pmV`Y1_-yWwg$JS^M*S` z9!u#G6$=d~`{rZ8i{qehmgi=oTz`oz^Sz&17>?UN|D%LX2or0d)x>3auL?xXE}QrE zBMfq@&ocpG8s#IDnuH}v*;KTQF?;1VfZi`Wp|FFtE?>GM8KKyRqfS7ESv;{yS~}=? zok%sa!7^n8TMD4cH@er80viD?AoJi@+4V9w(dVWD>5C3mPF_DfToovHz$M~UuUEf5 z>&2?{=ZQb}XBH_|&5W=6W1f$RN-zK@q%!U00BqxE3iX^L&_|IWMrq?at~6zblU8*M z@kQZ|<1W=ndzBbuN1edSUKIajFGRj^XTQ`gu6$}s`26(w!eswD$gKD0@NzrAAiHxQ5uP{D(IOs=7#}Ifq@H)OZxCmwXv{Oun=D z9pjS`6y69l>xpoR?n?1)`TEfTWR<7O9Wp1bmIp;S1#bXqu#RK5I889zb&51q!&`uX zKuNI-0;NSq<)$%HV$3|kOPwz`EPoa7+o&rub{2c{mB8Tu=x+N7i!L?E0{l7Tg=qzn z)HVr|oRB7}jF`a$8|RNJPG|`}^KUOUYT%*P4q zw0-_~TN*TaUujP}b(6(yZM0q=&1!J!emdsT6Ayra8%GJL6yaxX6Jf>sZ2B!w5+sXS zHN<|z)^VnmfX?B6`^`2)M$!8OFja`qbNi!b^h03}HN;88XOLv(Zb480D%qpAJV$!q z(TpjXcy$Xs!Q!T3w=QHYs=U4`KC($(~G{`mB(QO9J6}t{>DK}a2inAGDh}?l9|#=i2OM#$RT6%$?bqBGzh)=To%|WgA#Vz3 zl)OIt&6>CJrBB*J-R*Ft6c@9?J$zFzi%-ogfqL|@0LTXn0&H)c@Ao*P#MppUF{u9^ zt0M61DJnB?|8!Ajh#g}OZ7Yt2tdfzb)k=8dH|~R^202R7jQ#au@uku8eNtfa2|yR2 zQ$hqpt5c-izN7=0wlhTu3A+OBr*=zc?gB>p%hYD}QLcr#h~%M}yiSoo01>`ZzpJp) z;aq{t9Sa5QcweuJ^K8jD2L*Y-ad!St$g~_Ru3b5hkcrOyK@$`3A$bckr;@MwOe8he z5t#^KP&~L_~R=@%HsGrPk4!PBtpo?h0A?>ca z6*kiq+#OxKE@e9M2}0%RA`X#M6q0$CtROkiaE(nuud4`*ckd={!tGdMrW?P<;6gba zWb4`%F+PfnR+Z429Kch5oPf3bCzQB`(ryH=!2Qd(fqAl+Syu0?l; zfOJbrcXvv&2vNGbTe`bTT3Ywb^St{Vdw+ZT&oTTX4(C1Rd0ppmaK9v5xd#XYyLzMU zq3GdUw)}T((;DLn^k+&^UYDP zeKj15D(UuaN{%_g*z9B2uORCc{-i&;@wC`BT0p<>f$Hc=RBazF0y$vjBGRpzv@hsr z@LTp|-rtaRZkr7SnSHMD`FI>4JXrd-1V7s ztC5(xr-vlH0aWlMn3KxCI6uu}vOb_?JTc}alWfi&&2VbEgj|@jl~U4+{Vtm|j0jIG z4g(UjG)0d^#)8=kvh16)Tdlsk$FsL`FiW9@Ziy5FB}-O;GKbnqz@C{te}l{=_gXT) zyCANKX$P^cBK=0=CWTZut7-psi9F&bPherSj_@4Ix)$hW{fq(X`KwMKVj__+@ZEK9 zIF`()F}?~Cn8MW3^`)J<9Bm$ax!X&o!ZkqIq>_c21n~iUs*ZtCANzw^Q&iJOfc7BAB#e623j^})C^Xc~pOb-5PU z##b`4qr{&Wh$f+H(EJ9E8-1LzDBkuB*y2@DCc-Bg>PeyDTiM)6@7gr(zox5JK>qYI z4Hc`yvdF&+W=GRIP$#runx*SC)Rd*H!0(kNFImAOE2#L(Oe}0ZeLE{~uPy!= zqdJ@CbXa)u5Op3SDiQ6m3=^~%0Cy=xmq!Sn06-@OeaWJnfHswJlBDGvO){{nG1~%w z!y?mb_R>N$)K5_d--!>Fj-(0Q-%%Wi-=v&HRoN4;Yslxde+mpmy*&!Wze08)*(_tw ztfajPVMVdRr2AejL>QH@2^Nx$7ihBa%Z+(Ul?>$44^fv`2RHXTYPM(iv^V3L}U!&gvj(eK}GG0=>-&YaJSf>?)67AoV(!}Ge zPVT}}&YJ`)HPLA&vmxJJ9nKb%4@ztig+U(PAc+W;BRSVYAQob-Gi|Sx%KjDy@dMe} zp>bwRGygur{~XLrz{3DPjMWAuB}|o~YE(S!Y8P#VU_$Ja7I$ANb-@d$@6$yXt!`!h zfNGB!j9Mt}#b=IEyBK_4o%h(7We$0gWg%ORJ|MnB)$}Q1?P^~KE={KY%>s~yUGsXFhHDMVQ@L1m50ysRv$tIbs8X1KL2-KSI5Fd({?yRw z*zO7cXGg4>yr==>^r_XGs{6cbv{`4C-YMTezl3W9z5k9ZD8 zc2Pg+!lw|=u41%L5=S$o=6}el#m4T>{BU24_xkiE-GBO{i9q&$#NHQ*$lHA!jWbXy zQ&I5JR1*aV2j4N_qi?f5XscA2KEC^W5FCleIcpc!XiO;rbB};6BmLF)vI=#=lCsc# zu~spKWEl|2{)!c^QKT}rFCZ)hp4jh3gM}}o9pRBDAf4cB(Lwb>prN3A zQ<=6(kLpim1BxyPmz2Mx0L%i%^JvMNe1M1&_mS2tPsp6yJP=@U3@eb)ibt=W?$qYw z3-nmAHJ}n0#@DOzPc_Oot5Q@5bQTE%IF#x7#iC_IKB87lVGIHfgwio0Y&G3#iy_c# zDgr8@$qM6qOM;V~ugZAeEh4Z%i)x4@bOtkEE)0fZJ}~p(GeWf@*iL9nff(GUIh25jtK7@%wp~zsSGf&&ZB)n^jS^I7s@q6t@c~>G~Sxp4f9Q;xBSmY z?|(*bnMJ4-2y?d#IuhR@CR9Xc@TYD-`|fYR%@%v5?suYhYeiwrR|;tB zbH{b+_}v_Os_X;3e7W_9?n% z25{NWAb;CeM&*%a&TEneHyrVnMkV3uUk!i@k6cX))_VZ1muac(-s}o@!=qa+8 ze%kI!R=KT_hPqAtg^5v|m={JdJgfP`L(>7c>sfuO8)fT@L^%d{z2>gJAkN+~DNtR! znnB`eGR*hHwyAz>=S}Cg0a%wwWGXicj@Z3Z<_xV70=7rscs_M{CrP_gonGeekxwnJ z74cE_CsKZw9C3>ECHtLvS`4%ZR{Bi=e}OYM7izWTHar^JAXPC}HQ(5=wQZWFv0u(A z=IYNUG?>O_-FK5_2oq$@E~n(bHf@?1fk=<~FY&^m;9~DH>;0U= z9B((shByYPX++5~?T+{`!N2vCM;wvrT@#@R&0TBwG{AMr2ZxM{%M#O=Y(P~s{9Kq6 z#bPE6qzlQzQx8uKwu{jCBF%3)3OjATA6D~$71ey#5yXFV^%cZh#z_}E3w^jy6Q%U0 zv_}0r6I{oz%I_*{psCY4Kv|D&EQiOWlkfJZSE<_~i_Vsp`*irRNl^Mt8f2}JJYWGz z0~@%K4Ui1d?SZOikqM=S+u0IRkKQkuDdX9r*zib5$Y>%>LmH1`H87BrMT+Ddpxd+&NTG~JLng}H#l*>Pgkj8!(_!= zS~a1ee?Z+~twD6f(Ym zb4z&^$qGs_n+mNed0dJk406J}z`*pd$Bn>I@DI`t9nJtH=E8D2YL}%lu&~N#jrii> z7zuonkyk0D(0P+&z4XODu&-YM6a7OOF`{ZH#%%kHl1L-`1tI;(m~Ke9DuvJCb$VVq z84jtK{q51}M0xAjK~8R&u;(>TmG>^atzY&MCmq<+mH84t+VaVz+!h@@0-at#waDxg zeO$m=zsN4rmy-1z2-BF<8jXPpTkYgo+he6mT+OoL=Bj_QBaqHY6EG+xVV4Cmwh%Rz ze#}i_5C4D-1Y`Ly5*n-&gm^SJ-EOu$ZCTiC9jW0*8xR?{5bKHff&ulEN=5*+hRL(> zRAs+Df9W%6*h!j4*iQi-`m(L_GUsp0Uw8ZU1Xnt2Mj1cCNAMdXV0Q;lUc3GvMS4E1-U$n^KXi5aLCj-G zE5S@pzutms1_7eRcM@@T24x=47Xzf2H0e)pZcWa+SoWB{9u{G74wpMJ7r1rvbO+DQ zx_N}Aogv0I=1?1OGrpi(YoqUJhD-IZw7K-}y-b{khmZ6u0DjZZn zev&T8JUt+>iPGtkz7I}{Y<%qa_M{WdI(76Q;Dvrk0={z#`YP31%7dL5)66_&aey*J~Wb`cBkI zMPQ&v@q=`mtDuG*87+%`>ghE|e={BM${9-LHj6mFDwn}kA^i+~y|LpXo*BaG3jBF9 zK?9LV35=~)gH=AYkWrkxEza=A)_atL^fO2*hdy9I@7mfcj8^8x8htDtcdf}OE~Yg& zAQBy7sK)A#O<(uY9C`1G;?sFU#5H6KrPv)#PTqweJl|~irzt3BMP2E4ZNMiqO?x7P zRPw}vVbusXJz}J3{hk~nmy$=eaAxaluCo_fK7LITaBXge19rJzwDfOAVP)_7Pm6@Q zE^%WYo8HslYvecQ5HfxLwx!<{ba=5nps@Msv^r}&R5(m+y)_QTJ#I$`L?(gcCv%>7AETjIp{!hzP zjf4}iC$2_VYh^`qe|6fu;e0}WN5%?`G6ma1lwMr*5oWHEzAvtN_m)J4kLUz+oVb`) ziIAO%r1t?aZ8(F<9t=4OUUOw0X?{AO*Dlk+)FwX~v3O{tDft zVD)xvXvNs$_??P~)ee+3=swjzB8%^HtF-u;Qrknc*$&tDH+n0%dy2lfpBq!YE!~YS zesgSVmSzb$GJ3E-^3>YO)F|+DCCvO7_m8Sx9#GYvt|`R(HAEIG5JhHF8r6pE2}Tb^ zK}b}J5{NU){!!KIwf4HSejH`~=}L2>rr-06IE`<@#wrzp#{Y>9t5P-{6kMxq(!Qk> z!QvIZ2ZurBIsdE8AQh?HP-;nY7JVba@lKN;bQ0>o(!C;hVnE+jY!Ouq{SDWGy5}RO zxJ?L7jFEGO2S$yBi2W22Qp$q~Y$o+op9Q^s z69-FwF#hb#!jBPv+N+X`jLSqFPHRmfCzyx1`5>DdPF7rQ+Roqj74_rAj&=E*t>vpW zDYNmXoUp&cKK&jU0nPlcmzTJ2g17V*N}>Aw&8 zJI{*NKJVLJ?3V3bHkuc*{QMOe^M1co$}A|EA!XS1IUJv5cYR2RLF{IZk!TR{tBSW$ zZ}KHBz1NO;Jq*QMo_)vUAbEC+3pPra9=0WLol~z=6a9h_6<11TBeLlN;EH^iQ-$>T zs`f^3tFs_+JR*fZ?ce$`PM{<~&;tG(vhUOOYUz}s`)&2oRb@+)JIEta!s)tY&371* zIs){>*ZYX_9}wiA{bqA(tNbtA7D`?!rS<@SoYgs2yP4_m?SX`Gz0!GgJq8pNirVq74 zAnmEbOIadrAb~4iH3)-Y$939C@(+_19Nub}~ ziXlg39-JL#V~a|nQuVaSy8l|kH6PZ1lsjn`cp{Rh%EfGoz${3?h7O+efonOeRDgo9F%ybUlhz5g6PQ+D}N_=X7`BoUuIkIry^ivEVSONJ~B{zj*4aulKiVhJ84u zW2Iu^JTvXLg)b2~x_BZTLBz=F-H)aD%B8ki8KwRHohy|JjW#G3Ya7q64$;Pm9Bd>4 zuy3Rz$nt4S`9H63sk8&R9mST5clzJAGg5NmFRFTz(R}wymPkF2QogWa&gUPEO_MJK zOoubOS=A&{Sc&&N-tbsU2k_Au@GE$6G;ntxN1>ZjWZ%&TTIxfHO@JhfirXKInBeb3 z*d;lmUHey;&YCa*dnId5l_%cycq%>1z-h>SezPZZNM^5DIz@nhx8HnfZ(K2p5_gsw z6aB9GXR|QN5TTsr#0jsH%;)P=`evLEe z6H&fS-fFolW>`fQfQtbI@59{J{i&|{5Viw9fH#_Mf-d(}&9L*^MXA0Ru!pq?M*jdx z7P-&|2PAS6qvboR0H#vr{t~YDr?sqkh8!lnw9|tcfHID12YMB7=v4*)v6!G&RUBAl z7o$Kwn+|FBi07J>t52>IFeZwTsM2aj)qSUF!YuU<&LUj*+b^=Z$uo>1k?BMAS?2? zCA?fF2Il%N7yfgZi1PcW_>~^+jRWIC5XLSFI(C&Jhe7$(~ z6R_qFhH(lDOnmo{3rtclf#ih?mkP1|Z-{SaMf!B@e+>3}qj)|K*Vhg!-9nULEO8&% zxD8HL`*C@h)|iFuzswIEK97PqQYs&f{@6au4DDRE$o)dNXTt!_3X~0_FG4@}cj?2I z-G2>+ImcSA+Egm(Pgq;s`Z%+>LzhfOhe8@`&nA5fWwLeTGk7${57jI5#>yHiZ9<)i zVAYIL@x>JzG4?K!XBq^6)pS<-7T{h1coCWpI=DV9fr%0~SG&9;9J3Jk)xEGUu-L`w zRERYH)z=eQ3Qa}t6y}s2Bd{YBk8|oSk*f_v6G<)28S{g?vvBhl^K4bOeZZBRd|>(# z7*`(whEaa#Klb`TWkrd9?e%i;-iHuPl^NVIUCKyS`)9r+pJta|w79b@{!u|g>3fVi>GX4l6LpU*u%)k~sm0%8 z!PnV;96phF5!t^`z)bB{n;EMu{%ZZ{Czba;UBzbgM^WkKVYB8SFCaxErx)c!OLWx; zl5@>kHJ^B|KSU&GqH>gJj~<4hBF$B-Oc5HdqvF`Kh&QC^my;uc?lhbFNg&#o1^>HY zi%t$qbxy`pJxGnY7!m_X?FK92X5`+c=JG5Tcxj&gc!GnKr_11OQdGEd`){CKlhOk2z<&QOhldaFl7 z(DS)*;BHMR-rPcY+Hl;*can3*Myv3(%fN{kPx(!RW-`|)l5M}3@9jQioVUo@C9b53 zyNs@|aszjzAqCC-u&;qKp;{C{E}HLVuvWfGa+v|SlVR@J+k8~A;JH$oqZuSz$msSui43k!bTNlB zZh(zo*a!|3voiUz7`=`vfyE(kzeq3Wv$kWWfJVlAz@mQ3DrQmwsP4Y zv63v80oS^y8bH(Yf`mDz2L~UnR_?yhsC}hQUIB!vG7@v+F5m<=Aq1|i|YtToRX-`d)-Y~^IKFS*88QTcT69&1q>4?SParR zK4(zMVc38S+XdKUG4q+^bJ)frwW6vPqO1}r58--cp>MvDe-y#TtxOLj9}5u>d|{C;C&t>ho?Y z!_kxz(u%PQ3A<+_rT7>n=ZOyIC+VV#o1H<2jn3DlciCUV%scI_Qog<4M`#InV2R6D z&13vh*e$!&p7zZe9S?P3*b6B988guD| zEscZ*&H}UwG66;lgU0oUv&#BPv!NV0Hi}`dI+1LRfmE+_Y>zR%#{0BRvlrMuf@_}` z(@Dc#P)?XM?kT!#*KUb@mLKlt@ehAoh}r4)AQvb(?*P^|2#x^)-LMc`J1K-Qgq}*; z_inuOM!Zc!t&%-2;}HTK!8o{!S;M6zdq)*Y$Abr2MC!9kjSGCr0&pbWcn-FTl46|s zLSGKjlk#mlCEHWLN|gx(?N#GHwuy;}j8*r95HEw91*JzIecZqKt4QOs*NUP1Zqs$; z^L<9vhNqPL+aKKYBsyyJf`@bd;9W`qCn3=ke1u1rB8O98A1N3oNWaN!Xe(g_4(475 z3(8_*;pRzOPfTO_$&?`ApUX(a`jg=9v2j*Y;zO}RS&snP5uH>rOHIKI#iM~;b$Xs4 zA)gJ;&1Mc_FjUddfz4W>UeoQN?jTOvwpG>TD zrP3yoOpnWJAC+o~B(U%6Nk{mO_zQzZ*v?hE|Q+yoOJ(9595hqrXUsP~>9%M6?8cyNCG1fLkV-6O_TCwjP&jqfy~O zcR^9A3q8#I-hK|q?t#E^l){zMG$5WzFgOH2^?SvXO0|2U!w*BWg94DTP>GVu=g43N zQjd&mw_s$-vyIAl&Q|7}h)=_DqdDEBsBQ)QeT$kM@SInjm1AXu};}x^{7-f|S zo~TfhZqHU3Y0SSoww(DKTvcu~#n7loW3l~dC}eSKkamO_ihx8rT%*zT&T_DM5DC^r zn-9qwpa37dOAq0*#TKQqU4mHlN0MQ{b$>&yrn-7}P#_=#k8zU$LC#{c3Q&7RD-p2^ z!Ksyl+DYXJijHptdA^?by`STi!aZa@ps4?}g=@X&6<;H!&*mY5TLszNx)jRBC{v#j zN@`|}-*KCS5LBen*bRgcS5|rAq=zXV0QQST6|2jZLt+uHlwr4?6_2gJ zwPSkqP@QfMv|uCXTIXjY0P0^XVJwjgct+zW6!E^AvfLw65#m$HC0)i4Z#bWCqp{q@ z60j#w+e{%yVA(8Ir_&m8Wfg`zAb-RvAS{~Y41AH^Ulv8~a@PQUlH$Z5xzrCB0NrW@ z*n;~Sw{PDXpOEBOEaQZbRFRO7&w%LdxFtX%^O5$g+R`_%SOi^z8;^z@g6?8>%XN)0 zol1%)I>gQXAf)CjUgu#XEBrcM0Jm55cD)F@5QG>^si-(IzAh=hQcB(!NTudHsLq79 z)<8ew&h~rRLzo#83)5_dsZgZntQfd?FoflOzr5c!9R4E)1JX>PQ{HkQJ{u(|_x<1GS^42Ug6-vp_A&2)=YHUV#Fk~%*@7TOj}I79wLnD?HdlhDUzEt|O9YMyBmlrZ8?Zk)XoLuxrGh zNI0feao=i`f}hx#4%gcOILN|yuh%~$Q|E(qj~Kc(iw&Op4PqERhaoPd5+g?kS&t(m zP9z>Ynoz1;`F^;^FSn2MtY{v`{=VRL{?m9eb!Il|>|NM$OXp1keW zDtKQik{LYQPq_(j?216=fY?eONWxTt&H`C)$m&i33Y^>kEr$B+j!SFq zUhs_((rm>MN`gMTr(tf=GfF({MYO0_%%eZa(1I|l0e7_@An2awbYAQJ-CXx6V(FUn z7S_D~E9tUc)kN9}mJ`q(UwvSL1|8k5jgfm|JEE2T{UVyFR^6dlp=%FwdhH>$}1Wq(o}DP(vQ>w*)Ke1wU*<1^S{RCyO2$Hv#>OM`mA!O1$Tv;*zoJX7TK|qLNw}8HR z7Xsx1OqSR5q#z9u*T20;XVPyC5Sp$FTu07tv9@8N-ojAPY@Zt&VAR>0)jBy-=g#4o}EH?&L zT=uXUH!9TQ`A=HX8`ivV*kB=yjZ4w<*?X_l9VTd7--CkDXqJWCF(0Bl>a7kP^pLAy|Q5TCSBjKT^*A>%Ve5mva&Vn*E7DXqg{` zMB97z$>3;h@D27}AOc#PndmhV9~`1EsqErvck~&-$V!t?!WqWV!B1m~S^bpbyO4=2 zRtd!iT};6bO6bO+z}z%p!`lht^RFfzm3ZQbwFt-F;$-3ILDtY<^=}5#G<>ht#YvX-|LuQnV5ilflTaJAqki+WH%5p8 zJ`a-?tBWY{w5=#96ylZUm)>R2h+kKCYwo_XUT92@`bqYd<;lNnMwZ9uXXHH8(OC() zgcVETCDL#C^GE61_^g`EFrqZ@2i3~_Ls$-M&i&DJnmtTj{(Nji5;8Zkh`1w4<5s4@ zPrD3B*b30~k)x#}cFhZxoXGVGh?OL@Ik5L~Mr0U>G)ra_O+s2}Gz3WRmy-m&G!9pa z6XXB^7~uTgMG1zS?)a#FP1n7tm8hXs3CF^IJox^Wh;^z~xNNN<@y4l8WVKA)c^b-5 zvEq@{t{{mZN7G0!LL@6_zE5?%kGc1F{9P$Q_9k{~Q%U#{`eLd7z08!S0y5l20$wCCy4H6Dl@1~us@s%l^r`D`0YC+6k-2j zd!&lMz)@33Mpe(w!G0QXln{{q0y7a>L- zK?Y)IF&6LvjMc>FR{!wt^e_JU=&SyO@C?YT-E!rdF`5-scd0?XrONc_k_4Tn$b4!a zzqAAURLIyiEe<*+qfrOYzizJ`d#P@z<+k&kn7AHso>z6GuR?%-<%Xg`8m(n=L!#}$ zwKgwleq<2i^WC=6i^3jntFOS)8Nm!J)gLtB=*4RW@grcAb*;Q{N2{j_Wvk>KN$r@x z=LVUC1B@;|aafa4rF^t+(lMPUKaE=7+mvk|Ha>F*TXA*tAJ^B%1q$FsgxFeEMXx3nHtj9Xe1{HylD{Zd|QZ zkIpcAu|OR>8sA%0e0$Cpq8a@pbouGq{)pjE@qU$|DSY{7W>e~k&crK-%(Uc`>ndNJ zS(uK{yFBD{4)lbx2y;0z9_5q2TO-@~D!bO+P(3kGR^7P|2Fn$`BFa2~a5ra_Ui*O^ zxlgl5M`1$9z(2vo5d=%79bb8`^+5`i2sEtP=v4Sax!|x#A@SJlAGQ5hg7#<*r#K;* zBjXA~P8|sq689Q652-hpT++XQaBAtK{Zss~(Yny4afOjcyHX)u;XWOhFzlnWq0e(& zqiDnr2Slj!1TlT28&=eaEv*er2@G5$GJef-k;W|?$X{5TIS zl}~8hvd9@bfFiY41YgPziT*n=7GcN~;DXh8|33K!XLCRVaSL`^Flth5*ZgR%E)mr| zmedkqZ76AM>KxBEB+mHPSDLBCJbq zl_dM)n%5Gk+!GQoKeu@eqMU-~nX=L)QuIH}<1!n4hCll~}e zlgR{ggV1~hsYbgNtMj-`69mkA-p%DI+Yw0_PbP8Xw{NYwXVT6Mj7+djBUw547)my? z9Km26@gPdhI{WzyYEa||3-meJ?bX0cfxXVR0cErq=g~Q3%`)}xr?VD(J{Ax??OLOl ztf<%Zaw&|rGt6-oOAVhWaw!eV6@9)waxs_!=i2{p-aD!w&02cdCpaf9?og6W$l;Iq zQQf%uouZJU47}k%{-RbuA72)9bTd=mQ#CFfurE-NBCr^=ub+UrQ?|K&MBHK?i?{-z z){x~uk+4y>ptbI5jDgfas?Ap%|EA$@uWJB#>8doe|6ZPHz0t7-vEV<(``PmDWnuv( zKRS&Htpv(ui!nadm@tE^Vx?@#sX`e>q!vrzGWBo&DDTn0qp$rj$HhO*SHz7=jafZy zNNzpydY-U@;;*kWsS^LAypQ(Peuh{0Ffu_Nssw~1Itj9z)Qg*=?=q<~S>Eyc>{aYG zIoN4cd-$(R^cp=mL_*M#YXEEZy&h>|rQDD*0+>d97G)>dks}4Mkf#^h6jKJOAwwj@ zEkfjxkgR@jr!Tq;7tG;@Gyz{~-{Eg^)_yJ{roj%YjFot*fdsahAt?lk+nJKsM)}lB zKMir~%*zF`?GQwXkNonW$m~t;O;drJ*@Nxloqh*UDpNDi96=Lv1!iksCxWaQU_1wY z+wR`g+poViVU8B&;q}>5bl7GyB0$bt8hU)Ee1n6%*qJj6%+1ekW2)vqyM z%ejI+{#SM{{vx}-Jy=tJk==XUos&ykHZwjh|HpQ}K&2)X>S_If-*;R027A?At+3X< z7;_rx_lAuy>HfLsC5?@)R9gRIvi>JfC={KlsO@$relBX}*sOKKnS2QYH7}z8pPUrz zbUg1Dr{TRzt zc(aL?)*+X0-@jT;9^15d-WU&D2R()@ZVEPw%?eBR=^}jtWH8DA|L$_)%gD$z;{ZP? zEgb*2n2SH)a8jX+Z!r6MhqFjPqm<5+-HIvEi%&)I^M=*8!muGG>Lk#e1RbaA`Wwum zlY>vgz+4xG-kViF@UPpMf3)|U=>p#*1x!NUU8hgF*UKJg8u{)|6^-P-mgp1%zCEhn z`vB`bUK$&)syE^y$h3HY@cT?IABH*o7x!|b?W5x1_4p%?PG4HpHe7#YmYSF=w^QyH zoyTv>4WAo64*lk}`GQ?yJ<;_jWV(cN2sWC(2XJE19Yl?8KkCJ^0)0pB91DuFOSzFq z$-3dO!WtNLIFj842E%l^VpMFT;)BnxLT&ZBVvfI612LQ1lHa!b7+tYEbnmfCt4a6P zKqx*JNRI$)G~I^0C5^ux@c;SEw0IzJI4yLJ0-<9b;h8*84DNkKtpn$ZRW#sLiw&4Ea|DRtS%cnd zs?IZ!NEC$Z1-jhu82l|X!t@U}q(m*$_^vbF0^S5s2@IRHVj^?Oa|tTswXhP5ml}1! zm>lh#BfZA2yV_$A>CMb+)rAHfhracDr(F}ejzIcKMc(4lrasZg;GXd*9~a4r>A z)TYsSpQ)5!{{jPipL_F3Gd!yBDT>2uT#wb^CuD86rWd>yFa9VYpn?ggeyjM>51j*y z#s3LDM#yK0@0vRs0c61zmjWBCEapW!T(iYr-!_TpqqSZSzx|yjmIgJY3wP8rc6z!u zp}+#drQLvB9LIX$kR<=%R-c>-$^3d1WEvKe#A+j#ym<5H{S&mJByHvSGO|DqM`h#W zM1qYIt1{5%R*)dG;=h9XnSTZMu19L%IbjN*lusC!HY8~mgw3fs@|R`*vCwU4U8O6- z9>a_)u9Q{#i%dg(p=AI1Dzt(sWO1IqjOo^2Sd3698Q?J*EUD-xDFL2) zYNcl}`VVj42k|dDv_pIWjL-hAJK5`RfwViZkfD9Jnw3_^ZyY-m)qxpXeO{soN4Y8i z2gq0Z%-4>uAh8WPAB&VRK26+_2kK`($IIJsTFN#Y`45i&=UzRBL4G;_e zDu1!tKaVYJ6U_x2RjF^unrjK>pC5S`EX=Fll7u4yx9}CG6e#s$vi+gLwe*H_~2?4rLUgwCN%Mg7E21! zC?E3yA5T^NMpn_`YBd5!qNkpib zd#y7YrD#cQD~U{s=*%EU;Dd%EDuOZtITxXR?-B;D{wkWJRaS$aAn!sF_DT?BE5 zzMBI2#cw6VdEjq;HXYq*S6)t_+tdwj--Dl+vCvnB+%rNgp5KhZGk&Nt>9A-n$R?Vi?}d7qYnJHB^BBaz3S z_>SF|PtmY-D&(~GuST6L)nudc8_Wul9xXfIRa<4ec!`@&A%P^>cJi~dJau)@V{IpV zMi_+Emi@2MK5hb~KIihP`#x`}^KR*AiYbpU05kD0GvkAmO2nR<-Usb!y$B3Za^kbk z5j%9!#HB@9rog()cJqpRmw=CJb(1Iw0cL^qv>$^M8xM`mTCE~u{krR{;@-8-Hi`rl zpaDjN<7WD=&VG4*8PM5R{Q36(zPeyzJ39g(&kx5ky<#9$aRR)C}ZOC*P1NUMlt`60pVuStc;rHDkpvG=Sd6TsrQvbVMR9&;@>!_!0bn% z5-C^{td)&=xt+!t(^Qe>g)UrhKND?b3K-3hMcBIKmRI53YoKAMv0q>OPChHljLUSRBBk` z#{XUOafIm-V5r8#TW{s{gerWeK>_<2wH}ET3h^KQ%TpQ^_MN-hoNCf$%2 ziI@>s*lj0w-#|9$14ZtgQL=-#Be43&-)MEE;kXPo51Me*QChXkZ2F*F7j$Wk{~vMv zYAGW!4j`@%-gH=9O0M>SR~~?FsC5{S@Dd!_cjNYt3AK5K#R~tCR)l;RJdGW-z@wnP zNsk}RJ&8CLRiK85Ed!G&a#AN=20v6HAr+g|--RSnzP!~Ru_;2{<_&2%_q|nbtANMM ziN?mWiQ=FT@s~$3$;!Sy{@(Eb7;qj&fl)Xmy=EC%ct_3t_$?hgLp3Zi)db~$u7e=H@V2Yz%P?rTHEtaCKm zUuOceMIxJ|I|A$h0PWXk_!pNQty~jZkwm%1m`_+^ztg2X5BYc+t3*g4XM!p{R$c=y zrq?$_?kp)Gz%s@d8AIuF`H|ql(0@$z z)LoAhfLstJ0g3u4PH?An64Wy%TK}vSONBRQaYAuT(!4d(~BrL_N zG1`TXjGm=tYYvkRAF&Bw@CshZ45yh)H`q=0yQ+jY;RiEu%H?6`t;;7$%75jOiE)%o zqTlD_Qv2Q&(G5JdxH6&pfT@1%hi@I_TyCuUpQi?uWXF>M8F>cS+m1XlG3?*__7BRJrZM1Ya5k#%b0&eM-4~-xME^!nmoVTRd&c?&gH70Wg_Q$b{WiuBfh_T zpUz9VwWR34o+6m!86h+w$J};OKplF4khO$S2QOO!seU{2r$7K05CLC1!V7Uy5CyMm z4n?;Xi*;4Mx7a;eYbuigZ8oC%N6PY69?;t)pY+y=fo_YY5Li5s2yV%(E>^{U6mK-w zp$RNy8+wh(%3o~yU%5XP6RT$OrUpRT+-{KX+ZVfD|DQU0dRF5p!@sEW?}c3AJZ@Ks zO#~z~v=uNlDzIWds{da;d%2j%6V$OFwQC7}mm?EiuHMIxTiv?s+|_Ue@YvnOHp)Wc zBEkP+@2#Th>aup-KyV4N2<~nP7TjUs?hxE1IKiFZ?(PuWA-E>EYjAf9?sg_$eO0@5 z{dLZ{-52{J7io~zX6Bk}jM@8m`|~W^j`Sw4yW)1t%h=vBmT2LPAv>iT^JICmn=i>L z7i+~F5eJEk>3F(2$V;h$1I_viTby7WEBH0vG26Ra5+HTWxR4di+WyYz`zTzXLkVd_ zyo+y0=;ZCd%ln$VkhJ)r3P0L-()v`7&;L=kT9S~>U`{WFOw5T%f5WKS;_7p$l1u~l zaYu0qjMQ{@le~|}C40+07A|7RCW6x>{MY9tSH$3>md;&9)sR4YPZfJcMoOoDXzDjt z|K8VD;s-WG?!WGf*X1Lk$;jEF@km|zp2xW;f#;NXuyPVq=n^HxA}FL1L(I2`@u)d* zX4AHx%~ zIxW_2Tss2#ziQ)9U9Z#P3T04`>oc46-?GpJ1BdzCXq#yfoKm$m6b)~m;by4cavzg$ zT>{H3@4@t*!)FoKyS-oOiUSKrfP76)%;;5AkGD%O<8Kj9hOyN6co0jrpr=XwPQyaS zP5a-@-n2_+Y5&Or_`BRX6(L>#mFT0YGkRBis>-|7^*H-(wp7<-N_x4B&q*DA=|P&{ z$-p<7G4|z6^6P~Dmt8havch9jfYfDmq2VnB(AfCi`~G| z`Y~#MxiCw;aW5p6C?0tzItFk5G$t=sbcD-(If9>)=Q)>C!|G&?KTRVWsLM`}`;Q_#fZj7nX|afPSJT!6QV& z&<`OzkYJ%9j#dROrh*axu%sqQs`oe*wRHMmScb}#B+J{0{d7lCaVa&ze1|pWz!fv3 zK|{FJAgxiODO*8o(=b?p-h`&;IjW^gns=rHv<;*4&atR1dAes-0Wm#-pL{U@qDV4k zeihSm8rgE}!{__~`iU~X$!hW5q}+G5FK4pBj}@C$D{d?zVhz7b(qBxURw}frHP0cn zBRj?A=92bG;v+Mb@b^`w@?jJVHZqCscEWaK>e55X3h|txDPzHyorepzvhbVup%(QA z@Y2VD2qdgFxoCun;p1N9H{jT2N;Ng7OEi|l7_lq~pCcJmY8uUE>wo-ZrvH%2o&Xk` zo^s9SuuL4!1X`Gq^~HeM=7!5(m}b-UD`k&dLtLC`Zz!Go5sYhZ@@p#`_(P#u{+Wz2 z8iGq6Ay7V|H9el-Dc#gC$a`$sUa%Mn1jFlg9YgZzZJUj)fWX`|7;G)}P-8sA#^jgY z_DIp%X9C&@&Yj401wpWK_-{Q$Oox7xkv@I=MmaAPPkWdbT(N`o*MZy+Q;4#IfcU{o zOC^Ub<73+JL%7ssLLf3cm31;2&q1^z(sK~Af=z4USpzWP+vi9o@+1_15FCcZ5CY7H zxYH;b^3%Q5D4tuxmNhdRS(tr=xg=57oqUM2u(hv|9~DPv}cx^MFA*F#;PCPa|Q z=~<$z$3phojR5~AN@hCLd>IhH*&qSz^Pti^-y@xN1C=}NzV2&W(nLYziBY4J>WZpY z`}~^pMwEK^Irf;^5H^B>5-hnTJwF2wV?k4-3|eRew00Zd z^QRtn%f!=)Uom^E_P<5baw5I$Jd{yO{>q~;$u6lvO}&n@kmhERmPlV8t;?=rF=(TY zXx70OcMK=bX*>Oy&Wz7Q3_IJT3ek4IMwM{#{Tf=NlNWh=QQ6^9W9OH~R4e~)0(xhG z7ry+m>zpckRQVx&;FR0}n0zhS7M;%iv)qgx!c*ZPw>At>xY;ks$?qbEMEFTS0KOH- zxtu}QGTRdLI72H$6Y{zpwSi$-6lSyT^Wx6@s(GZHs)1bER7pS`gV3Hn{d!r!&uM3{ zasdFQmBL`qSU7B--mHqW`3+S610-t{O^Bh3GZxe5a~t7(+)pE5nQ*JJ+^g1$Yt2a- zm|4HSRP`IX7(i`Uce4N68NyHzOiv32DrLQg!-=+1a$K+LJFHx>D4hZY$I}XuQ0*aA zD-W)maZRV+8b>Wby}7Wa{%bq#jUd<2PDu_9;hM zfg6uF{fV2`b6mjT9U9_updR;uoTnZpv3)2LN(+!DQ|qy7b>DEJ}6*nL~5bz%pNZq78rryS=T(cmJ~|EcQ*Okp;fGZ)Q3A)VkXorZzDUB~ zk`n3WXeLNpW+=Rn`(7KE)nE!&*5df5k=|Pt?(kg#e<{@V`8U{WH@K@0{dy?qNgYs? zm!lb6F2UF4Q|&ZaETc^l{+FW$*3Q#$KX z{5*VFagzdQw;DR`EHfiO$1|qpvCwOPERC%!N8Sc!i<8*V4~Zydz??VW^OA|84O9$b z{=Q1-tbB64u_8&kU0z@;hu?YSYL$ZQ8};QdN%CF8|1i+^I!S-^#YSLNjxM{uA_5!1 z*_<=u^Jkwz*2HNT{7}Hg!(%nyNzoGUgkZV_Iz0fIGti{a4bGAn12`Ox5E@vy=Bm(t za?4fTkIhy5Zc$UN=5jL=%phyXDe1uG2lTxED|bMq6ffaYFtj#ayHwh5YC!EAZgK+l?>=o)h@pZ(ifTr092A%-|f=ZZ5u+ zks8=Ayg?uM`}t2X5RR*_M^>?wjb-ZR`AqRHxSuS9K(Z@O2CC9GV$UiUh$hPbMq?|r zsn&Fm5B2{qHM@!whrrX@DMUKauCbL|$L0QsJ05It*pP7oe3m2(sQ=4T!)cW3zT+ z?%f)YL+x3+v>@l%@N|1=a~3I9?AdnsB4Mbkx(CkkydAgw(FXeThv1V@QKR!1x4)~R z1(`z}3)2F6xJHR;<+ke%HAA6%aHRvp zyUNafXzm2CrSR8zE11HP(Y+e}Jd5B3)xUG}d})8n3{}q$83U+>CW92^zQj2gYunef zdOk#AOI!ILyzy^6hn~bV#T%0AdeQp2%p{SzJVm_t6`&BTnUD$3}=&A|+ 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�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

    60)Z0r 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

      GKiucD%s&ZYBGe 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

      U6jwM;P`c)5V?9sT98$_YRKb!3dQsJBmawT4?!X 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

      HLRTFD`HJvg~5Q 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 + +

      + Services from this registry are packaged and maintained by the Start9 + team. If you experience an issue or have questions related to a + service from this registry, one of our dedicated support staff will be + happy to assist you. +

      + + +

      + Services from this registry are packaged and maintained by members of + the Start9 community. + Install at your own risk + . If you experience an issue or have a question related to a service + in this marketplace, please reach out to the package developer for + assistance. +

      +
      + +

      + Services from this registry are undergoing + beta + testing and may contain bugs. + Install at your own risk + . +

      +
      + +

      + Services from this registry are undergoing + alpha + testing. They are expected to contain bugs and could damage your + system. + Install at your own risk + . +

      +
      + +

      + This is a Custom Registry. Start9 cannot verify the integrity or + functionality of services from this registry, and they could damage + your system. + Install at your own risk + . +

      +
      + +
      +

      + {{ category$ | async | titlecase }} +

      +
      + +
      +
        +
      • + +
      • +
      +
      +
      + +

      + Loading + +

      +
      + +

      13*SN9_eyN;O-2XcFBfG{ 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’(jp?>{tEdJkKyI>h|m0UiX``QB3 zetom!z*q0YZ`=;bKsSYtG{F8&$kSd0zyYfcoC6nO`hd%7f5=QsO>-6sNy08dnZ8XAk(<{d-)0t_d8v$MTDQ+_usyaMB-o=1WeTsm1ne+?z)uRGQjyf&Q&axyp8Yp;8Ltj> zbjh2o8xeW{thNs%yxj8#%FHLJ0?-VyX>5y;P{ zKlhiKjvAfTaWGer{>1_acs$uv>i#~+=fxxE5xya#{C2ngCf?$-e!;}*@a}C_-z!pdUrh>lr3dAk;a2mDk4IokQ$|&C!i#k_`L6yD-T5O zF{=JGV6~z<7`VXV2xtkS&ZWA*X=!!Y0uH*HUVhIn-Dhq;@9OK%@l&2s0GiyJ?}d!d z*P|?em-egasQcIJ%R9eO-%|}6e@LFIZQO|Rs(sv^$ys5wd^#_Q#mJY;fVUS^60v|U zs%(##hCU1k=~sMOtA6|ECV8V?jMY>CA3$+R^oh7dzI1=~KtptACY3=QT@c*;_9_Il zI$hfQc4FA%Tij28G>xIDfKbeVL^(jlQ>YivOmz=uyhMX zYQL8S_^Z2%6uy3Wg8JARAS}`S>`GN42Y1{d1{e;o`5g7fxL3LZ#r`a-3*QI6J&{>h ztQZCe2;_+Prd=H&JZ?>ivCM2AkRJ|Q+ssUJoC*QT3mKJkxMSia&Fd^fZyKD^7vekE z1aGa$MDqdOX6(_VRcoGe60iNrwRyK{ka}MHkT1??da;)< zoWw%Yk?*7FSUNby;5!C@ToETH-{D557tQAX78aqJv(&T?i8m?-TpDP51uFX*>}H8qyC~7J!MF%+QZ0r?Ipjjezo-WQeqs#BVtw zdl#EQqs-i3jfMLkc6Yb0`24{jd@%^o7eURcMV;_4zyX$)7XT<7=q-Rl`XU<}gr0!Po8 zF*Xv2Mr}%Y6SdJ_W*)t%jD+3&;*s)rd!k||YPff*t&l>?!(&IN03bCrkf0z)Q`rI^ zfbLSkRQH0Z@NuJ2sfSX9RwZ1DjjQVO{RPRMc$jXZ7eY81k+SFM^C>^+ehykJPO(XU zgeov8ag~mjf2?VCC{`$W!i4=R#xf*h=0jL5@n4@_NtM`@HClp8&NR z*R4{v^N_Tj=ByuLBEF+M@$pJIG>_9CY6!RA%MB``?ZWU*8@1w6A5+~T)vO5sy+v|X=eDOSpY9B?BmN6007pDCT}y1pefC_F-jt38v0}<2j_sI#aLZ36Zn&g3 zpgSvWbat+<9d`#B`-fs+dPTP4kJ*@UQ2ybmQ z{6K@QJY2|g&*hns2z9o~VCoXn&nea2a|4w~%{iSqAAGafFeO^KIj~u#)zc?M{5h5X zc>=-NGiR>TmDv);wP9nMVbZAE=XZ;oeW6@D`L;$F@PSv$sztSZvw6dsW{(O9Ax-_^ z)U_xt;&bD_WRiS`2Qxe`NXtu+;!2pc5663oda|tk;A(MTa@`4)bs0&d2efs{K2Dt` zTqL)bCK8II{R!w;TeX?1Mk8EE#BAVfMP09hm&_A=G0Pr12V`=4`H7Ji7O&3_^nqP| zsnjEH3;9o+bLI2mbp0pI{|I1fC6bmsBPC1$9r|j5+lnml2fFiWrgSz7N{8#`(`VRN zYsmPbs2B=duLhlp^G_#$B5JF6=DNwjAM|qrNJ0_l!hu}Sh%!Fm7mYtrFOXQ7*sry^ zQ1xX;{043I^oGuso`EccHyL<5AW^}&W92}Daf&Itd|Nq(S8C#8`v+h0-JX>}mZ3ak z7~|{&?*RPev+btVe+H&G&iEJ2)@xy$wa&41E7ymsQ?AN%=noUhSrNQdTCuyfB;)sA z*irih7vOk{yfeT@nn3=MCDh}`H0nk1xTD~Q3Y-r)k7!;)SIp?xvpw!F$0l9frB+Ir z+_}cq39EeW&938$) z{a>m>@nedAM)@Don1N**=l0E+qu(Vwn#W>Pt5MTC%(h>V_LumNIRktl58-%|`Z59W zc%O$$8fA0yD<1NZKRYrZPM-c&qB2dk+NBhs@7jp@NOijWXxtC}^#8LNp%Be}l(yb7 z|H^TxQL3!=eyaq=w6*=*uons&gCo_@Zu0yAk`JecpsHcWLHQ!Ys;jK{`)WzsS?3o}>1=5d&InbE zZv)~vT59Wk5FcxGIJ9?tB782t_p!$E!rlQ9W_roob#MJ>zB-+ULXTI8Vh9d2O9JQz zgnTy2^SYTUjMv7Pp3#_OjOx(1^BZ-bSR&PL5_&)^6Ct5c!1uWyU;*u)>ae!UB{-|5 zeGj`6d5k>Y{xNyUr_gFaIM?X)aagZK-4CXdF=-XcXwk#~t566Yh+ecmrMFW@^|Iw^ z0z{1L52W-!9R8dsgujF7?C`$2h)vgig(UuXIFNVn> z{DqgJ8Ui4pRBd3r$-;bRLw7+nc%6^e8iv^8d&jSEnZEl;5;0Xl0i(FuQJt-Y-5Sk$41^IB(MS9d_x*70+q#%{V;NvXk7`J;mG`zKUdpt77=*E}rz z!dSEZ(@hRTidCn~oX&Kvq{&XZg7YzpXpRnF#Dt>;pqsNEgks)~A7~J7Tc#u3gASwD zo>zsF+kTw7c~)VkZ+MtE5Kjq@yo~*ESQ2=&CN~<-;R-c05BD&OI(dZLSG_$3*uI`# zeYc!RV{4fX3YO~dF-Q%4uG;;_Lq?%Vgf1nNy}5&(N;j1?3&?9RC7Zy+i~hD4=cNhJ zO0`AV5Zboj_;$dwvhcoGlw`v@Xo1)ahIbB4j2HgBW{tL%H_KyIr&(q{P~+A>kP9QRt^@9^)#Ou-LMkmo-!JfU9z(ibZwV*;W%@rknd4j||5O{44seRw zhR6*A4p6makCVmo8$nig1Yoa>Voq`sV5|KtGrN*0Jdd6zf<;@j*swRf;*F#~U4^!g z13hywd^;jT?kdgiD>htxId&@ITV_`3$kB!TXvdyWZd8-dhU>;>RL97(o6L^qbNcL^ z-h`oV&DXtXGgB+dX{kxwdAn3;`+A^}>l7B*Xexum#Fl;GHDL>bq+4aRl^%(4&MM{A zkqgKaG&^NUK7iwZ>hZTnKNIoV#m~Lm;^Yp1jEhxqahd^bHzbLyGvl)aKR4x)hxT0% zVSx!=@~%3EfuzO?sX)-iyT3m^MJCU!xE@oI*CG9@5AvVqVih!~pKHVN zzsh_ga16g{8~8Ni%C-8edd?dhLO^c>VjkFE88ki(`n*2FermPm0HT8uM=v?39=L4R z{0`>>lg4H^?rR2MSV?#tm#W}D7JvBas{U3vS(Li!dwV!Gi;E@t@+70T5}F-ll`Z6% zix{XH6?54aMk_!fbc^+s_31BxAf}>+Wbbvlk>f8wQ(VA2QXq?Bp^RSqnO?J1r^jH* z%5*14h1ba${de-I`w<^Ihaip0Ynpoz$?2RVp)Ql4*@XpRCAF>OEr92qNiCl_*#BLa zhGqEZf9xnB2pz2u31F`npqBKiJTz*J!TuQ$4bu(D<8fHaU5}E<-N_#vS3R_&lK#!}Y_ic&?xJFyukaTI)629<^G{PoBguheMM~_xbz8q#J2xm`O^# zLysS?o_iaTE;LvV_|Y|iCU$IjiLdV;Q2M@J75oP=UDf#HPiJ}pBe|Z=N2jIpI;v_w zz6U)1p2cfh#dW?7tDDWlNsm{4qU(3qpoAEm}Zr1_!V)o@m?+=kNYMIl; zWp1Unwk8D<&Sg}FTa)|A{d1aF5&cd6@Xr$&yy4TODstM}`u-*d>NImO51hQa z92NbW{847`KyZe8JAB#Jg;gx9B7UcFU%Odpbz}O-3Vaz8tulUL!hAUrPJE?fVWf}V zx@aeMFCKo@NWY^~qj%pVUubXtvF?nP|3Z-s5?yfsvrf=+3~!l#IcA$iTH9@8A|Ko8wbdi;d`u`)dvwZ#poAYkVsb8^D5al)B}V0?*!DDJU{Q6( zR6xi$D@Gz_lG!zMVeCyi_dQU^=~eQZfL+1~b=R9A7>M6mH&ZG5!`5aw$Ei&ln5&S+ zSc)cctJl88ynPXk1*v$*O;a=$blooVu|g+p2XuDq*hBgiUyYGi8@Xf$UV^j7zz^u| zh<|j%y#O6H>HsnRG~33AOult8TA9jOZq=l4%C|7yOP_H9h$*5@N`D*vu1Z}1t_J*n zoVLGidDD9Jho=A9W%(pTaMhzXHarZ^L#AKudK0-RP{8Wjg<>&IG0bf;jooq%>!V+T zqDty1*#u`U-o2(7HOSYuNCQ~|GBiK3!& z;NNfVa7?~gbMG;nc$J^X6xYPuZixc~p=hOJ@ZMBk)&l>6w5rwnU0BhDRFPhNd_R){ zuQ-NQ*(aaXVUmp;CSY=B&>*N+e4aIDpK`C|hhDd-y0N>vjXg#M#?S87a9%|1Q^94= zed+buF-f!G{!uu9KBFBet{Oq;n;*LB8gm`DIkFPdaUTPMoyTQa)?w|dK!Um+aujIN z<9oNy^PEtkHMZNBH`1e*xo?B2>HuJB64i}R6Y)(%e+1lF;#8Yf^@ZPBqf`4?`^;OqdjGSuhKrkMvM zRVfK|ukIYUc2C-**IS>#p%NZqzhnQQ-Nf0A7gbb!77@E)h*!~FuF?G+zBw=8_NNAM z-9!H*A5*WpXX2@W_0znN4o++L2hO?--8xh69Y#V#D?w|X%j7}``-4ZQsG?3s1ku^F z1ruYqQ+CiJnWp6r?7)+v7d6ZZi7yoct#KA;l(Ls%YadmJ&ALhNrp5#Y+i zyn!g;o9d@Y-lDr}1MLp?(V_J(4XY25JT3P6r)Ofhq`KdyvHlwTy zb^%-bG3eYva%|;QUGK@-`>yhMx9-TO=tNoT9lz??1O$sZoiaJL3EzJj(&;4{elD50 z;Ra~H(L`ObY~EAz&!#u4WIG&2Yd0>6rKF`fqW%$|>P)({f;>g=okIrn8$3ixeblf- z{$`eu5IKK>721Mz^8>(XIFd~S*lYnuXV+!e75*%H!PJ^hkM?YTKl?_PK9ZNXq=};S zeu3+a&&dTtA6VE6qhiFg-4NA6)ie#Umu4Z0eO}3hL`96{c({{noaig3jc3{bzO=BP z@2apqn}(vOgxLy@1K9@}A$jLy9*;&|?(KI(8&|1$@$-v|LrZ^vhoO$n4x%qRN$==x zLkFd1p~1J_O)xzcdxpT+4rJN*KT68Ri!LFx;QwSzEa3n2?-368*$*p=AB!hjepBjm z6FMgt+inLfQXM!8@TabBw}2?28-wFn3=f1kv<4B6^mMX07o+YJ<-Nk=ZlzrAg!$eE zwVJh;eLF*`^#5(f@t>Puu-xA|I!!aE66KsFMa)l1a)H9TVdB#F=oQ*OVgx;cqpQhk zU8^}hpZ&>{B;r$#bX@C@Im7l^mk{miW&Fxi|6$xDK`$nqUa3?$&*M2_xgA2$`#DKV zdt8B4t5UOM0|O1-L?(0L=wusx_Nm$7rSBpe?L#Uha{>&bc-@_zwn9WKYuG=QPu(T_ zH@rLtkEG)HD&4W|PFBdwY@0ihEg9~Q4&?CtLmoRJmQj8K;vO>9!CcW3uuJ==n@^3A zc{Ngmw9^hRm*8kr#}9aHx+N;UD~`r<=E$5ihMfwqYfnAV+(8IC6ItJ*<7F@ThgShV zz4`?zKEDow?B>v|gI;RZm{aCwozgYvP0CaXB)r!k1ihJkARQ=Y`f3L+PyG|^167sI z&u@aB2fLrwX3(fE{v7)1u4X088DH&2?^5FGalSZF1HsHq1I4Xv^tdp%=zo_;)plhnUFl&_vx8Dm@ ztH7EQMY%qrGOe7Z41ItzEk|ok5#9L zOQ?^2&YdE_z&-uCdDpXI^o-YW1wh;R#Bce*&*w#io8YkJ1D6P6Nv2KJ-KG&q2wvK$68P;;k}W45 zNCbyx{h_8lc&9e%{jH&AgRdwaWvjDn;LLa~N~BrG;;@0;Hh|NKv1Pp9M4 zt>8(uwbRv%9FcY|A-74-t`uG+!Ut4QuXAy@R7$g%jt8Uxz!-8-kW15338eBB+6|^I zvv=e3TeHKGiKU(yclmkmTtRCvfFv|ZlncEZpZrmvzKSv@sZ9RHq*0L0FD6pA8uq{h zMsL9{87%~%Ichfh2s4~y+4m%{$LjJwepo<@3J$C zh0IfkrxLn(!yvf#y8Wz+>qMn$(#=gAY+W&bak~FFho&tdJJ+sjuV-)TY6#5N2bdE z6ma%w<}QH~y6#!FhziS^`4%hQU9E}*{Q4CfY}u|ax89%Xopm@%4`p+wQ01j&#~p&eANoIIx}=_DCW#kmE>M;Z zro`S9tL{s8_#V@Zs`ik|>~dFrnwQLegnyqE#~HX*!oj{Pn88J!MF;8AHuZdlQ_r}T zZU*&we&%^_{6%{n52NSZT%{}Xr|L}g{K23uHso%OIh!BO-JdUwOdm$nqcV4;M#$mZJ6-J?OD2^)UEoCI-NYMXK zIyr4E?-7MCC4Q6GDIt|+S-Fb_vq<~Li&cuk*J+_E>@^pmE1xb5p&(nKExs<&wEL2| zGQ*tRT>@%r5^%Rz5{kwA>1yi3oyPAfU91ZM4E!H-?WJntpgAqZkEw1NlO0ITZ=1zq zihI70%aE6oqMS<}$)?~7Z_6=N@Z5Pr8u@0$ERYb3EG+_={6&MPT8sOVRllJC#S zKoF_OXXm^qT$XPuvr+2a4$HeJmz!qsV?dgHbcqt-*u=-0SL(H?lqs*M1E>2`fa^i= z2|WnPb$47>Az5eqTBn^TImCYOk|uWs3FlP@N==x^S_YPzl#U#;r@F$=-C9gwa&t`S z$8sap)*xvz!_4yL;GR+btgamO`O4@*NgCFnU<1*X@IKGoy9d8GpGs|38oHh3dg~&t z6ESk(zZPqLS15Ik6AIodF*udd0J*ed(mSgMzVahW`Z62_yYUj0SsqTl&(Q6}c9;qa zDwcDx{)2*{MdnKo*3l6gnpY3SYTF%lEG`?5(5w|v5Cc;b13>~D{B(M`eX%IrFSwvW zFnj`uP_v@UyNDSEjnXUsnByT)X zu0c2Q;M*5VvR-jH^`(I144?QMy|$4m18hSuF<>JUKi;)i)s^T*6dD1JVTbBbMdNh^ z3IM74NP?r=wRVBQ9`Fl2`X*7HINnwrWc~R4+wL-z=(^B9-^dJeEMyXg;SF1VDmBb- zX<_QVm{3loFDO&8SB8M7`9*lEj99>a@W$+J?IM7g{+Tyzjf?wj9?n3|6n! zoK=mQv5KgJjN*JKn)%_e%Fb3QcuFK8ZM<5o(GvX8BSd!K)+m!0Bui_=CC&pX-a@!< z@qeN-1^M^uWdF$l&!y16-xnfe0@24*q3jL2eBR!7sqx*g`^J(&txOGxCt=AGyLDQu zSJL5V&B}3FfiUQsfY|i9zN3ZmkR^8cA=Y(?5gqBOrLP_N-kn7vmw7atIxB!@k#T*3 zj=;5uGWP=gx*X>F@G}~V1XCba;xO`Jh7{W2JA1G{6D8FaRCRxl?TTJ+2y7Ab+_2Y_ zvc#5e{8jQdZ2MDVKPb=%ad4Rv`i!Zo?H$9&0UDT}BD-F8B{21;`DE2Wt}%}{=!HPg zK5U`Y2I(#JL+v*-0^wn3m_bNQ*XyT7yYAYFIAX9zQpUy{7ZpxS&&4uPfK|g>Z|*&$QM}5Hdj`}|dwlh7$b`Q>CTIy0 zv1nI?__ZdA=OgM|AI(>8jU4yOYy_Mu>4`J+#`oC6OuHX0OlqhA35eU@!kP=aBSEeF z84Kf@svcIO=1}5@*;)8!mA%m*sz2V?agkSN&$n6hT5ZDGBI<=cID#c<+5KRc+C&iM zPuEVSZVC{inLhMS*BwTVV!l*miK&r9ZS`VB<@L@4C^wiw(0QBrf$MKTj`M0%;T}WyyA-IonQV z^F(Inzm30hA%$6=WJlz$e(wfr?$YM6MeFa&I(&x>F7b-wc$GR&;RxC&qzpH2Ci74z z?AW9ki@I~$p)_c|^Y%<27Ew5Mc+GjEr_u>_!_{?0R~-(yOKDKM;ANiB*#a4#{;K|Q zjC8T~_XV_%a*GC|E`=^F@{Kd9%-EjpOi!56lXs#})pNLoTlT|;-ZtmW&BbyFQp?N_ z+w#{#BU~+&e0-1ibZ11Tt3NzqeB!>3o7Gy0v#&WUwCWbcQ4GZsFpykcN?yM^Tk=7S zBH(b1TY*8R5Qih?4vDvJ*nbm1O2z6Fa43bRJX-7|g6-T+UatnUWf39f)v?$xv%wQ# z4p!@V`HDnJdZWIaue~o6=;~iXBfGFkgxt0GGOOiefPwJml$iVM2tzu+pZHZ`rb%6;h#w>o8>1jz+jm7zs;vSJ#W1&`aqb^AAN~1l< zcH!sdP@rK#&aaj{LHAEz^i~RkLh01di6dN~j$_%>$r1yW=<)I533(vg4PP%7jKKna zxjA)od3Ja0J$q(0Fq%~CfzS89F;yprOya=HOpt44P3+M5b27pYu9~tQ@RyVI+yV3_D%eu5q&BsIiZFGBPF{EH5|Q!|XA+%dv4-qt!8`mK)Yf}pm0B3txp zNPy?a3&;o#x=hv>428@NCmAuZ?0GsI=Z1FBlKCUC25+46*VFEG7Q~;!zTRQk^ZHN> zpqWVB7GF%GY8R+C8CTdn;ls29i^B#)yI_YQnF2ZQcMhJ0PRv4@;!Ud;L`Ha9^Scw@ ze0I&fJdIU2Ca+L2z2)VwE-`@}vmyS92i*@X|Jkx$u8l%@iNR<+0VQsVM=t`Z41iv< zT3~0g`A5b<*)uVcbkN2~_zABI|do_FJqsQICnjs5WDBkT+P z>h9cJ@9Dl|J>8JeTTbNK2@mXf`h9b**6ma$e5`Z3Ic%C9-gL{a2ak)cw!0_C*#e0R z#@RN%>v=d_U(1LO{F?CV!0|M4q%bKkK#1^~ekc?rVFP?s0WkM-De+~EF z8cM(#v#1`*Y zJf@k1ieomiA8Ixj!@#IreV9VYhwC4hWC2nyb@W$jaU=obvf~SxWXQBFsp{s(&9^+B zK)B3yUD%yNWqj}iiZG`appV;(9eB-B>{jR%;fA>F))a`}PJLBwfU^3y77ASsh12zu zC!D4kb1$5GH9Y=M4{^kqGx`3n~p za|3gZfLmIR%7loq`He8&A1(142Gfxo4*wW)Y+C?oY(;DfTPFK=G0sNA{2X6Adl>h7 zNW`zT_RpvE649XQxWYOH82>SN)7^KfIK8&OF|G+TQ=0i#C+MJO8|~aVG56GOxmPEG zgJ;do{5(UzEy1b-R?d2k@heRwUXL4LHAJeUMs{1V8Sj+KBhwFnMn4d}Rsn!?s~ z>A77g)>BziLcL9wiN&3e);C>+vnF>~YQ)U<27KOA96AqKuR_w|&5Le+Ly5;;JG=px z+YAKfk$^=TFE@RXrjd%DGyVj{!DW0u88biJ=?^B` zHX7QV8&lW61_0+1GQGCtAEa6+Q)oBcis{busiSdE*s#~rWN|tilQ@{;GPRtGS|?#9ednXeCLydz9eLI;KVjBZCdi)KbImW& zuov>N!W>2iOPQykC){-)Zn;Aj3*j$J?7=OGkTCLQ>lHgz%*DNPi@C!i3 zZUL%SDS8q-_?O@IaNUp}oi@j1O#9plUf6h;GZBza>VNKGic>U$I&m+yS~!}3Cd zci6@>9f>@4b62Bnu)pNel}~o=Xwk6Ie9+>=l*he}47c{c&f{H;`ZcM*_RhCHHX z9wen1-kzI~%6999#b^**E;eZvMJZFX3_A_!kC4lDeF|AZ^S9pleC!E=Cn8+XrRXg( zMZ--Bz08gi$??N;cEF{|C)6baT`MXt@)}baDHYM-(W~Y~2pIMSyTRLsDLriT2cm-7 zMa0L92l*0&)ZjUVI%RY{L%zo1u|@~acEeHijyLc-f)i&4zdMY z->bunPlUp1UbP;LXEvBFoF}^mfT7TWu#*SjB#L|MyDQugcm3TSm86{CcL#LtWJ8bt zBI0xWqML6R_~QP%RSg=!S@tOcg^e>Dn&v!S!Z=EhjJv%$#k*72y8u*?ld#Ty8?p*bKX$2vgq&u(%rjAbO^S-Cz4iAOax&YN_`Hl-<;tLh zn%RE8KX!9vtUk#U39xE^l(Je<|01mI{=sCJ01F0#-e<84`HIQ}Dl%*g&G^@vk9-S7 zcETvnNjCH&w>IQg?GsFOS+ z(2lly1Tabn{_;)8{^_@dBRpRRgD5WxdD~5eoFZ~4i&uf>-pj2Asp~6IsHSqLFYBa_ zOG9^iT|lW^Us(x>rQ3T$w&J?cPS=l2xca*QfsMRBd1td&@5>{oqTHe5Ex?crI;z{X z7R@K3OE&_UEwEMPyB2Rjr>|Di$WDSVMh@R z1K8OpN54jc%7de!dZ}f36)No_+DMFpievE<{^}G^%J>sk(mP#z_on0sj?3b9*hsm2 z{`yfJi)#`a;S`jj5%Pr&Ca{DO6pQvRv=F=EP5D0jofwMLgn}<15A)KS1^|G>2W4ZtJv8C?M5rm zs8c>l;9%mks|5`sMeM9&8#A0;wZO1@E>6pA56H6_3Vjg>@IB0F%AmGj8WQhd`q#KeMrO9~sB?h&y)Fp*SmiB2M%UCcdt@qRH z*M)!;Y)i~RVN8%zEms9pCkhcJD~b1^+mN4ypanph5UN*ev{_!e_8px9fTMuGHrI-< zmy=IsQhs+*k6gEE?#Ps69$&I&=NLwOPza2kkvUH3;hq~C+Uti4t~~IdRO0V>=TETk zeO%ohulRulMCS}40?+kFhR0Uv*1s2*&hj8pJVJE7+LqticKZnJa$j=X<;34@pQ+9% zg>#IH(nsj+4}IP-pX302rU#AKtnp-1I<->1cE5IV&7r)`$G2RL_<76saOp?n!rdVF z_23ZG&CJ|O5)QL6^&&%MBS)j#sw_;Svz*VgH0Sbe6u)R_2U7Y|Ig!+WrWH9ZHyEaB z*jNrVqCl`>x!i{hl+1yTyA0mvX;3QPlZFV^dxDcf#H|7eCi%_Y)n9Hr8K*i9G#db7 zI)W(p{0c_pJtSLQ9W)%(iK^~eHd4XsuZ}x&s6o{G1~FTGBsmsF0tbSqLpgBsFI=!_6`BoT_yAe{ ze19zovRB+tuOC{$B*w{tYu|80y!e#z!0D(58C}q!v4gQ+qFSBia`~b@%2pNbK#X1l z#HKz+ot(;wVMImTvLhDVGLUx-dN*je=iQ$>fO3W&dyVKFHFJ^WL()VF|LaT^+>A%R zKwS@eLYV1}tDg3~e8zHg3>K+OmN!8g8#&?PactzvNEI<2n_+6R(1IdIuAEVw?^IX5 z6V<}qM7$Fr)Oylf$@^qU!y73GV(lrJ=yA?L?-6-=Kx5H(vlkl&ThB9j5`X4=)>jh5 z{H2k57Tm=KlcT|VynI8REz)@;iEj89xsn!R(A;oB5Qxk?Eu6*r_a;q=n;7eQd~uG) z;Q*Ya)}AV8PTRs*=oz`zjPeTa*%ShTA9pWN&ZGxU`(}c0eO!9{fvipbl=%67)w%SN zyN{lh_qP4FTm^I>8L+5NZoA_Ya2g&NLgsd?GGXk&)C(6xqrf3siz!h9Wrgh>}i%8FNSiRi4s_7218Q- zukDa_>;`Z__m9EPMn5o}iS+nhMg61_L^dI7HBm z>~PV#E`--PTr4BSv(6zXVZXJT zYs-OY(aC|f)Q9P&z=G%E*;)WDvg7Q_Ny{3wY!2UkmSHL+s65(WzYSmTa~Pg)#hm~7 zE!t%V+d4(#@AKY%uZDFRb!?S9UU|WnA3>x6NboMD7^)~qfAta3y>Ay6z9j2+G4WKy z0BqJL_B~f|*wVb_w(HNP8A@5a@pwVJy3<9bz0Zr7#wf;wFvkYYj#5i%=c6C72cW?3 zdF=jpQV-8AsEj~MK8KPI0MS6h9tOp>?rhqeP4xV8y$M;sa66Mj4mL>`A;`8iT&rBW zpH2w0E){v}unv698@QiZI*1I=~itrOyaZl=!9%cNbsyErKR#f}wJF*dzGc$Urx zZ%xee|Iqf1s?5GLUq<@?*mH zf@b%YYhV5B??ccD_C1=gE#L0+3IC^mjjup3E>Swn$h>< zL2l0j3yv`PBT{l9#eaK2z%a_M4++@T;B_fCm^{rghO`+r9?bv!Yve~zGuX+>hC?wV zjDWY2{CG#c$5n+bYadIEX5VvnYsv=+p2W#;nyL|sIdX{{GWAczk|`RF32PH%qSb!b z_jPkf?G$H$2)hfeXX?wc|9WBNl195#|{6en&68 zklu5mT@9SR&I}xc164C(TgM3=SXOBCO8U(pTQqt|B^_(~bt%zTTg{XQybdr1>`%shghH`DX8sA8|Nc7xEb{$jeKbS*;m@rjLsfqxj_73Kf=^h_HyMbOw(& z^@wQr;O))9H~BRj4_&C)`^JqJysLmzzN=c+!@)Oy+8PfvJ7ubEhh4^ELp9XfZ~fIj zvrB8WG`Mrk|8PkgP4N2WU*8l<6iKI88oGksd#Kq_t2s_Pqm(as^QtphZm2;DyuK=eD!Pd&V*pt< zZI4lYgt#S>t7PlworKh?z}OFY)#&zssF+c}O5QEyT;Os#_@bcDO{k{4UqW=s?V@Z_MBQ|wF80%dP6%1yR5JCw8=(XbhJj?bBBM|sbr3Om zr2V)}B<8zhUxsiwhOMTs56H0aNN4D}ZAZOjfBp&C@r#eti~~k*4$V+P#>h4<^u(_L z;jlkw5)yk#@OwS``TQ>gFffk`;HjN74Mnz_(eVZ6lgThU0D zdwj;*_U53$8s~8}#1qCGtF@qXeGv*+?RZnVX?A^XT&BEFvK7ttBYToVXS@f3AMdnw zcWy85l?bQ)#35p#ZXG1J4CIIPgT_~bK)wo;lsbeci^?S{4zJCfyum3}K_R2`6;F_a ziYDb?cN$+B*C;P#)$HL6mI@#BbV4zeMqR0o#5|~QeaT=mqG?+T%si(H-{Fr|AB|)k{Snyr!v z>Dyyx_CatZ1ZrEqpEGEerjKm=t+rRq`V}}VV3U90Ci#1g6|3%1BB&6nC&%nYCHZ7C zsk1wlAtid>?rvwgoJ^>9_I2aT;eK1a%sp6OC>%an@if&y zN`a(`O3gqO(YcLE%;@{x(aOMLi0OR(1LO?n;Q6|G*c|FgNj-Lrn??B9C;Qf7bCXo- zk&Oschb*Y*LrzTYZ&+V)iPc9<1o9(WPcOBTyp2~Yybgnz=u}?1^cz7rwqhVK5qNzX zbX}e;AEF>!QR0P>BQ1wo^SS%uS(ot;sqRH;A)}#<@0FQoDkqp-iYFbwI}|7y#7G)7LoMnSs-ipH`D4iSEJPGX<8 zGud2m9yraIt=Ji5zaK*J*b!^nE1->pJ7=z-x(^F0a-}(9KL&5=Dbc(4`dAL-#$RJ` z2++n;$nFp%B-Hl@DUQzXe=lX5p99zAZ;lh~X7S*|jxD{OQSNtkc)n}A_X0_>gwO}T z85UJSv4y^qVDQ#e^EN zXMj&*uIRpQY!xFxmVpSPI}9H^KrQ_o7fs2`ArWwzQK;>7Nm8&Tequt99L5kdwqCT& zKYjva0+8Qaow7eeZfc&TJO8NmY9{dC49X~jq;U%RSU&|%nsOo_PQRIhh4AJ#D;X3r zwxuJ^g65K*2#?65E{EwXi5D!1Mn6Z#(s0c`(q@r^g%jc+>IXlHC3|;wC)9>we3^-5 z;aS-v4iQkyoPJJ8^RJ~YW=X6-${HrNM7+^gsY@%Oa2RYBODn0toGM5SZfLXleVHE- zKBu)%iA>XfKmik5q&W{+DX>Ax#yY#S3=()o2Qd?-0s&`MMA;fNfeIO5Fc;=bkx&89 zM~l^7mfo=3iJHK^u@S6(*~u>Cqy*(k9Y2ey=tek{4Dfr{YTx5}_L;=G&wxOJ7{~h> zJzZBKF1OUM4mWZ-yBFysqkT8^AJovlWglSwCnyPsP0qP%xxf)axRz zmN7tYdo>aUJ8%eG8;{n{=xL{NvY+t2k6!5O8B&2zLGb5LoFfgkJN}k?C2~7X?L*mXw4Tr5BmCKl5vL} z6oBGPedtV!e7M+Vxrxv+d-#eqvykR_aQWG-s#8G_A5G~67T5+Ol@?|R5_wKeM}v~r zdTne)Em)9z!XE_e@plVc{xr*Z&OEMiAGfKnOhq<%XI{zye91}B=E{}H`r4`-yr5pV zO+hOL2gBjF)XA@Frk1`T#WbADXEvB3AU(y)a=rU*)|C*fEGEV(lU4eH;b^ajnkH^K zis=Foq~<#ct_R&uW*}FA+FJdR(XHp@@;-6m&F5UR{ePVhCM+3eT<>^xWX_10RZkU*ejd_!2+TM5na?E`8&s4D*u-cEW z7BtR8^0lcz8w7y6scww^gTj5dl2Sf?`=cASnF*9u+_EvwMhMQgP!Vco){sB(DArAZ z7stIyU7Isthd+(E{G)O3XcB2}CyNb7fwo*wozCm_PHF+9>0I`KF9cD^t?%g1Kud{m z;P|UcPNdh5cT4y!Wxe(;UIbEOE>E_5VAcqX2pt*YH;e=2j&Whsh$RPa5~y8-!&R+_>bgI? zcRwwS5Bo~I+?-G0RnNylHGm#%g`%Z~Wq(;72i(n9(CL!y`6^`5ru^Ose4fje^XWX( ze8tHA59a1jdGN~cVyn6DW6bj=@9y30+DDiUt2BJ6;?L!@Yw1IF=IhDv&vHU=C{h_N zu>WAn2A*q^*Z`W6a<$cyFAR9z;lQ+kC?U5BRX^6r&ZQOSs?Td$KU#r{I zsTqGV_GPK~JUi)3rPY@3XjU~e&$Mo5WOje%<*F|&6KSLzb%*$u>X*Sin{Vc{F8o#k zn;#0c)in`N=@5R4j5^lTOps|Dc-&w&`s|M*eM*~3%O(H{B`Y%#OM!dvz{JY?E$^Lg zDcnN6t*oMpmG4R+y(Afx?wz!?bHUU4(rLiLBtY>2;V{t=yV$UYW(zI0k?$M$(OmE2 zR(EK0^V|{kkAvBhP=*q*ono%VZcJi+KSFq2hQ_|*6P6_(6roiqO*{Um2(DTg|1(g$ z{@(dx>ra@E3*akpMNY1p!l`WCPp$kFAo(!3;G>Uzp98}{P%3$|YXmR-ANbED!4^WWG97|BTg#y;@}5W$c&%-3>HT;6HmxDp-iCD*P_l34($6V z_HO!N36p9ZBdek+vPIQmo^`AG|?f8gX-c~&FY zg_kqf{gDr-aD}+Cg#A8wUgiyG_jZg_dp!qUO;}-{KS%LLyVw+A{RFdzEQ^8yc+{EQ zcnPj%t8K{rjy4iXM+44&<8S+G(uyakaI_JPU56$>LVI3O6AI8EqTzu*PA&?@aE3RH z`M_8ehVmMPMWr#_b7jp{^w&iCt^kpPvRVGFYi)q*#phJ3hoU@m^Pj3SS1-*OFCU=} zAwpQMQ3rv`?_{$AxXeD)fY!o3ET3CY0Qv2%o#?^UV%&b5>>WUx92NI4{p5hV(Z2#! zQ@S*(Z1?`s#+jNFCrA(2uU?!EgSM$@GPWnn_%ai2>B|LOPPa!j*N1M}Jas@l&ez_v zqxfN$127xA%?8F9D+umooov9_C89s=!tx;grNvQl$fbKyO6JUH1QE>x1v8syroYC5 zWPUSF0n<#-uu3;39qS-S2c!$3z84J&bhMK5z8nCMMdTm2lT(Iz)4pzA>V?r5L%zKK zNj~exK#((Mzi{!NK+p{%9~uA+FwPB4T0@qY9nx(cQXIhim}hR> z?p6@i3InV0P| z{a@Nd_}1M|SD>=EGMo*lOdOBS+q2>ICkQ>mE=2ocGm}ePE52N^QDwYr17=Q*Vkr|E zKL@u;t$J8U?I}lh$4h?Af0Dz1SO+CN#}(Ot6TJaxVG%<#Fwh5pw@4q+IL9fp^}PP& z4K2-MqoijkAEOu$J0)9VQAN7!J(5~LWz@P6zAcveR6-a$X%p*Tj&Zr~6C$GYvs0q*<=qA;X4xibGG3JJR z=v|hhH_UqWq;tiQjXvY$>5t!ly2ucm{m8lyi@YGwc2CLmg%9uFj@n{^4=Kj);aj@>ZH1mx4@-furjqf%D20 zp?V6jMWJzuybPJ(FoK;Vj%dYPc2cvjVtQpUqh{9NtA-WCK>}tH=5t09@CPT5V-ZZ|)Pu4gPL9vSKpZ4JFjpWgy_i%PZ@CADPGwYHn7=dW%XJZJIz zW=1+NluvhOyBZG3zXO=OGA*%%JwSD&qUF{h-vm-FXO}`hEZOn*c!*|nDo7!RvSn=< zkwKdm^k|w5)C==B5Q6A$U=SK+c_PugpFZw72au1yJJJY~*gxTbd}K5zc`z-6#SL56 zOn9mNRG`jc)`F(6%5IcQ=ncdQBkHd~WftgkT%^YdM+enaz4+>9K;&TALxy+9;sn_a zu#;I@a>df~IN-~AdghXe8LGV8UE8OD&BQ4@jmg?00|ZLCk1Hwy644B5fSZgr=VMsp z;b8di*zWV*8-zSeY#XHz&_mSf*Ka^9Ef)IDC1K&4#^UfvmR0q`dD|aY(k$dk5-swb6LMQ9RC zp7IF+_Efrvk0R#?cy_O7Q`(qGB1eG6gQt(B+`L_jIqGdv*2&vz(-IZ0(Go)+?L+In z_MXS%d+WL#tV3UJU&2XV+znN_p?S*`uTGf~$mB^OATWB$PG^JvMbFeJ1lV`rRx8*Dj}a8k2zl1#d|Gv%x0S(5M3E0U zXV%pNiDz>BCeJdYg64MJaLawhv@%Zz^FR1U)8$r-vPSgpk11F%sL(#11Vgd!cMUK{ z{TAH*)&bYZjtbJ{DiaYFswAbJ*F%ohs@9ha8$pJmPP^*dqo{NBkVi}!^tpI5TaHtO z8Am89^9q2eWuKNO%B}fxI@*j@s3gpKt8nA<_C0y*XOt zAzl&Wa_#nKfSQB=?Sin4e%5T@wawx9mXgOH%H0Y<^Z+nlJxxw*x+=k^&pp~464tbK zl_4Gy{H&?@XxaN%ApM~;sUp`5Pdw=Qtq+Dh$JH?dGsDETq+2o){9S|O1y*I;)4x6F zG^&15^{vdMJ>Rxr^xAp-LetR&nhhNbu<#N(csd{f93+lJAOO^NdP*1n+HoZroA@or zB^4}lpowmWcli z)3~wFmHCb|&RG6w%%p_=!_hlx0!@W{tjKjGDRKC;KvP_k` zaWt~e7^mOT8_1-fYSWN+SL7T@iTQj%#huJtUpITPzha#9eJDvX5Ic95%#L_fnz{iF z%#yTxtFcAEG5cz}gqga6lIuleYOhx0MwiQ=rD>z?MJMte`j%#&I}{Uq@QwPAUns5w zGP39f$-R35rxpiKf~c7*ahKGrn$n~NSd3I#AI@z79Tql>bec*7*{LBZX%6tilIIn< z4VuVym6zV4hy?&Z!qUFu=2T(Qs4?Um=AKM5k0&C9C)YaD z#!M-_2@EP=vh4jL@-2SnUF3ZQ6O~^InUX~(-V4pa3B7b z^c&1HWH-)b=pOa%Di-k4trn!>Gy~8TL5DYoWJ{&i>Qv8QFeQ{Eb$y9Jg}tQQ%F!-A zO<`0cAzGoE@D!eOb^6@3FNeC6RRV8#T05YTjDipn?!kXz($xL8@Bbw6B8 zrPXs*Iuy;{x-9so+DvvdC*MvQKCvweeEd|02(q2bYsM^sYdovumhqgdPo{tSW5s7J z<*uAxVJgC%5tCI0^S=j3C#xZ|uLSqRF!DOF7E0||!TBeEGH@B)eL<_`41YnC zd`;LPHK#56YXIgF7UU8+r}ezvep3v4?axK?yCuHowTB?~#xi*?Zfo{y9Gel@!=#HNoBoI3cs_`o zen$(#Yd)JbXZp?KAdf$qmfm}Aee|_&gdfvbQ&?9HW=JN+$#(i?j4xH5+4^7cRlVuq z{1%nO5`Q28>V6|tArPb$JhGvQz;tb@+_gAN`r)b2PRO9 zRr8M{bR0!aSQvg}G5OY-%(tUH?AViAhgVLsgyCq=$3 zs6abgk`)Xh$VVf8a^YP%DsEd*N<>?_++Kfe&`cQQO&t*VMNNK0NGE>C-}|CD<5Tbb z_Jnc&J0wQZH~V(qgt5AN93U$P;f6Txi0zfRizuoEp>V9@AY5lvgFKTaTp*=Pzw=>4po`a^Y z%|H%1?j!*YEb@2w_$&z>pRo+?U0W)c_*7mS<09$;y!Vem+vy1%jLiHYp@qk>40C>n z)2;D#?ieYFO;yO}JB|H&sOQpAQLY3+1BDRV`&p7R9?ZUV0C`)7H~}s!!La=JqRGR|PGY89qPqRbh+BV~{i38KnveNd- zm`fJYMo{pS9-G(p1R0K~>n%i>-sJ0CM`VhKtrlqnic|R=CFOqWmAo+l1Ur^qn!V0- z{w3~it*%e~ak!d`QT^Lzt*!h!_&OY@g9I+Ed9In&hhzb)h!-GD3=r`to?w?afg>}L zweSw;B7ea^ZJX&aOEO`^0~1^Zt2LQYTj^!n#}aj&qnL0`z{ODw={Z^qa)og~K{me zh3*9W5z=*Y*sa{@$xy%Kh^K`%26^C zLgQe7sfsm?22_mE(A6_H_&w|;)Jf2GI4cj7P{)YP3)1n}9EczCpxo`=Y^?GG)>mF! zW|$)0k0#%(>H@XLLNb{~UN1lI&AWoCT7vgxZEMMZR*TERiV}un55Nl!d`8uMUxx`) z4d=s7C9`A}LGUbLNc&!hx5Z65PLLX23$EPz;!~@5RY#^V8NY7mUB(dPK@>qhbOaN7;U?hh%Q%&>u?jh7pXR@ZWoTko!5E!erZ;^hzJgzU_NSCXJvwH>u5>YP zP;af@t=9*lP#vpZGo@wsF;l}xGQw|1feX3enc)yJ5UsXfVfZGUA`oI$W!YU|#{6{h z@U1%(<*v>NN|+b9+>B+Ie>-g+pc%RXh|qhp5d&Zl14cv58+u#ICl%cD%voUcJ)CIN zk1|s5w;|oikKE%0Pjd)NEie9ju$bDF%sLwX?59kyyJWaM;0%aZ=4EPZqloSBLm~PL zoF*%nuW+9Mq*8+ZXM7J(j0b|Gfyh|C*ry}+TW^Jb)vKHof1=+aTx$k4<54Gcw`rEu zN8~UeXe%u^&NuruMI?gLxH>h^Ww0p3CR~diL#!Y6EDvSxeVPY?aeTlFiLavNbP7Q{4r$B+HBmJOtw1vqZLt^ts z<55;W;wE}Cg_@_-q!o>yioL8_5X4Gq-oe!|Jg4Vr8y2TEf-*9N&REv7YK zq4=6U`=0sI$UGH5v_EF%w{K#p0iZH?*75awCoP*n9y(nJ!Va%K57Ao zg#p6t#*;vuE;i&N{MUX82RD2r&L?!k49+74Io^!ay{{zrf5a_x&ULaI zL)2JQI(~5YAOHHqi-`)Y6|H_S;g@VId$5S)1g}*9=B=owmgqDF_DyzR%p<|NpG$>? zd`@=*8Uhyfwau7A8FAqR8fkVQE8i&sc`@n=MM1vxJLArZgxiJc>>6F;9i<&_jI0=1M<4+Y#-Od8InBJruLhXf}DWI%8mG z@|CabUoXKSo$VjwprhzXt_riXQwXyOEd24g(8~z%w=_Al-4nq|aPU}$f%BZ|ocMPw z>7Qr4QG^495y0v{z(V|7-Kdk@Oo^|D8JF3=Sao2bBl=A83UfP*pw*7aMqv$oId}2< zIH*%B8w!-rE8&Z3$((9yg9c-D`Zc~>y7PqPUzGo${KA0jZmcXj*hx1NC41O;YR*3I z+Pv|D0~J}Y{cwSHI}00aec2&JwOD^Gt>?)#WkIDb`53T3EDs+ z@u$QjJa2jlUagj3Nr!ZYHxUn=o5?l@pvKWh!|!#8;SOJG4B>A=6ErXd>4xhemUMCW zC*lO9D`8l8)Ow{>SEmeCIQF)^S;(V!HG(r@Fq}no=tc4_?jPpMalz6yE3x&Z+vM5m zcAj8;&?z_F*Y=}I;vo!6|0AJ1)yP#S?3AOy?1{xjqXvvOBy_@Uza??jqsQ8!l250y z5}S8*_R!9{^Kz2R^W_hhQ#xjE#B7<>X2Corbz~WonOiX1=x=qZ?)vzsF8H^6^bdIQ z#e_CqK*=Rw#Q;XJYNMkU(L0?qX3+%P?dR@F0QO3CAVY3)X95_8eFp@m1~}`6NH`aG zU)j_WJ*^sI4uef&*+F){+Jp`Rq}i@TCD0}i783Ov>W1OC8i9%Tm_)gLuN7*P8T~C5 zd(Hdnk~Jq!N7?*h(TT(x3E+$X^&0r$qo&DHSNWCJlmPu>|gfA?Y6@J3(ZIO-Vcl|4(l#C>%@HuEr^IUP#RH1a#H z%fN{Op$wK04Rwj>esf7jVD@W#Bn9m02|P|ncw0wUgdc2qH$!Pw1twM}L@qJ~q&4td zaSCp=Denfm>Qs_v(Lv9qYM*N}vBPTP^pO3(=j)PTP8su2)VstaiLL3O`}a|-l1!L4 zK{qEa-TzE*9UgQjCd4j^O9Toso!?%O3&+$YMA3M?#BwcNyN!3Cv*fbkMM*=weI)YR zuJ)uMiQ0)Bxe^AH62ZBaIL8r5HK1IKWw65YED8I!*e{@<>jdz*QWXz zPGB%VVYkQ*$(jpzl)=3-^2JemcDRo)?iQi&RrRc#i~`Ag|Hl=Z)ID&)zSR)#5_XNx zXQf4rAtyme&zjL^Z!nl=Gd5}@cO7*KFTf*S#fZu8gGy|4|J zG~re@g;<%pu7Hs`Q`L$?(B+?U$Xh%aeyPMvxM&}!eK=&Me3c{B{sf8N zQxj^74fx2p2nBF^$UZIdc zw2^od1k#bjzuk2`zx4tT3MGE;7cL;v*f)w))$+=$B)p;PLctxrXAcIMn0?O-Ng8G) zY&PLC(TWFInV$~H(Xv3R@jXqNn?ULsK>hDK;LztX;*Lh=kwkxquj+If_*oGRKUFZq zxg5ygN+g(S_C0)m9SoOy=f0y)8^WQUtl^^QN1cbNvna(!J29>I@-cdyi0((RZvHH6 zmI}YyskpM3t4XV-FK4<`1scrFOPD{TQS}uhvyescW6}YgK`+PgrZ=3%ETOfuU^QT1 z;VZQ25A|E{qy*!o6l^Vi+;*sMUn+EVq#I5|O@NbGVedn;ErWlSEv3&bX`u05A}UZ- z66Ctrf+?KHg#C+VXWcXQR~;WVIPMKzFlRTTj9f!D7Bf+M`oV>U}ni)R8rTDvK8?b&zvP63(|mKUON* zbAO5@0OoR9aoayN9>+d7{QB+oT4+~Lyg`Y9GFCqekHg#b-k;Qy?_Q?NG4+VBgb{QU z+CcLsi*$9nzDVM?ah>OPW;FmFjBL1tocNPfC9=ruRPp?f{Xv9gs-VhyJ5+g<{Wuj~#;tPbCg~5tbSUb?#)GiUM?CpjQ*p%mjhem; z!t-nOLh5wb&pNyy)wBT)slh4{tH%P)-M{jT3+a+dXL-0J^eLOy#FLPlleHckX-^5- z1xRr*cezqG+duMWI@Qk*$+HV970U_z2w-IKe++1!8T};$lM)4jRR^rk2|_(b>P_3d zO>KA|jl}7?=VeM&A@8Gd0X{4XqxGic6LsX4op~k34_0Xce9rzHdBbbp^8+`4Vh$2IEq{Nh6X>hS=mYx75yc<7?}V*l1#pZR^g)Kh z)LUw7x{ACIM?$-Q95d7Zk~~Ohx$@2XiEBHocy4 z)?Dkf*b-$oR+t-cNb_@b&SPWf1H#Nkys~MrrSU72;8FZS^I4>c*Y-A${9*o@(#h%9C zWT3$WJtMTWK}Wl)vEm_k>3UzlamPXT~U>B4KAE9SHyrG+tftd1cp zWpGr4T6|RUpPn@6?Cd2knmlw>(^|pd;6i2Xx21FoXEvCai%iJ zYPJ^VZxYjy+8}JOU}J>QuR$nG=X0aAypEDN92x?;S)pq@BqQO5*R9C0c6C0)k7EOY8<%I>LxESNU+@A3w^Ld zK@=rWLn3RdD@jErwPZosC6C>puGob(lf`05cxvWj| z&xg%k5#$9gW`!9M+5TX}Gu0SI^_*FrZJTkg%HfmGhfwNYF61Lj9kjRfIwSY!%W$-g zIP63SBQ@D{7*KK#llw#vH$FNQ%}L5lZ4 zIvx?kKs3Q98xT;nXq<^{=}&|AShw35ZFxw5GIO@d7h}BFx1Z1%;fwj|C6J^u_S&c* zH4ST+a;q}o%NKGm6*0ZUFOMi6oX4Zp%DP*H`aYjpTyf(=ZRHRtJh{kN_zaDdRXm8t_)Fg;tMjf2V9I_!hzAqVU#?W`)0Jo`Lznvwe-w9QQ9uRq zZ*Yl330;;{v{C8y&SD;L1JjAPFX4hr{ptull0q<*Hx<+%sLe42N|)^qb^6v;4vpp0 z`voixDD~QHQ4*Zno}1e%MmNwRB~(W%OJ=e<4#G^a=2c1C*)b5>cEfx^o+|Q!1y!E5 zoTgv&A_`V6CKJSpo&}Ks%A-2sB`(P9_`}!D0XA9wr0>hpq0EF?dEn?)rwhDSe+HAT zq)BG5m!uYn3*=L|#dYc!sgB>lsZ>#r;c;M{V=b7gT*>2{`N=lgZtm(Q0eb;VSk+BP zr_k(HKR0|uJ$@A`bV5wwtJCU0c}NSE>tM!%OM$rHzp)DEH3VHcQ_Hk|n+S8N%3?Lm zwAvC|Q_U%KU|?%@cu<buW4(D3`Dc>T)Uzc$kYca$ay$ zz7w~fdLitDkxJy2MthEM&*;O7JIavrDDVgNd}G}QlHQBra=^x9?jr~rrzVn77HbyE zyFbUfL@upje~N5Y4IRzMwbXclPxWLZB&YiKufZ7aKAJ~@uH8l~l1MSVj)uRbg#}iO zX+p0CWu;+WHi(2ZKBwKZ@l`Fg>Jm<#%$~PHi(D|q@pQQ}k0c|KA03-*C*>j}J-zi1 z5z^$j$E-z;l8COJf6bD{<(tP8)I4#>VRREf3VLE~AjUJk7YMd?A3+#5&V&nrLrp<# zx@=}G4Nxb0&OgBiNZZ|xtHW3Xr8m2EB@Cp-j9egBaEhl94Nnyhd77i^^gHEuG)9RI1MvKWvobH3&ph9hr6_CflS8HNq~2qLmfHW8*tMpe-|_Wq$|Wiw+_{ zZ@{muI)FX7{S;xHVR>&-dXbZT+MrM!L|_&=nU{A`eJ^_U38g6=_J#_ z-@*EbsEilfO6h>@1Jr>3MNMkCxiS{Xx4LiuOFCTuEq$TBY_|PM1M}2xMm8a6RH9pD z`NE)YBg$PQ^g0@VWf~MK35|w^Zu{|D^4@D7Rprl@^TI<0us(= zIW;B8B4bhw5hTCs=u3FjxF{7d?XIU+#U>Em7-Y#13A^}=ZZ|}sE-Ll#6v?dqKr}a zPQ;bzD4(8C*N3}yIIG%D0SNbcNNbpH;#NN$i4BcwFYa6b;1-_~qT3qD42wxhMhFMsaIwG9TD*{Y_ z@cgweiiE*oP1=dGaOglVZlpc^tJ`bkc3z#1q%(;)g}JTzMSpeL1b(xY2YCmRIM?u< z_mM_><>Z2E_7u`yKA-CE;pQZ8>*E!1|KcTq2?%>`f6fdg<;B3vwqgdYekd_yOD`Sm zWhfk~$_`3K>5M9FGwI|fdcQr&D|SWK=9w(R2L5QV_dX1}9URCdq481z_`^FDPdM0( zsyp;ShdLorbd^Cyw(#%MYzW6Vi8CJjT@GYhaQz?kKbVVRVLbo z*Hqb$k*#54Mgu4y)9RN$9(WIQvw80jRbs$;;Ueu%meY=)64z1NOvTH$Ay+r`-KSX* zCh{TO^JM|WNxit77fqhLFIs#P5MNRhX#-Z9Ng|%HgoLcV=A!O2&&=)$vTJsug%KMN zxD<+Cazg9D(2x&p_J$!%8*4Hm&GIb;TjK=PrxuwsbilH3KBoPM)*U&13k;-*Cb)r_560buile;IltbMJE>qGXbbrC0t4l z?G)wy_?1PzmRb%5A`%r(zAH`$VyHA>E!_F`9bX~a)*w!&K6kMw()r*oGRY&Rd*xae zJP9-axF@&+7~)FR;OehMNR}^l#LKUopKtg2PT|1ON6DohC#D`TNEiQ<9rBW?PlDEA z2S~$y$(vmWeXfEcvf)P|Kt>JbhKaoCRj+qIK*m{&qom)4)(QH|p&-s3nB<$(I{cA0 z+DyLPkhnkJOBQVluUu&K;FuL*gqi{jLChf1pD@HJ%noD&3oJO)3^T<?54GfkGR!H z0p2Nu55e~&w0WZ9CXC&IE!ACi1Arjvw_g^}7x)Jx!cNw@W0H~YK-K1XC}+NZ&KH_s z>^XpZ**{7}+4iJyTOR7_;)(u?q5JIaKjHHJ3!vv#4hAd=Lymds|8-`B*0)IvmA2t_ zucI0zzu;5qSRrS&gcL2BL_7OIW{rHpIkEM z-rv-y)tay*?J{fc$nN+%63RH!_Gm=Q0l1iy$-RGrHIR?nF$oJ}Jt=qam8t(MmqFQ2XG8Cw^Sn)Dsmy(FQ}_($MS)U-0D?hx^YyeZN8Z{RMIn z+d>Kr3!KkVa>bS(WB47dQ+?@Aq8QCn zPWfpyaGw9y;3yG%E$t3am4$3}CEV{Suw%;)U1esSTR(6=)u?e3%q7 z?e*2{f8UuATAW81LKaH*h#6%_Lhcy4Ixb26-WJYr(A>6p0zqBCUgL}fsgMskj%jIA z?k->JFB8iGXqw1f9b=UtIi6x*{@J7i`YKc(iuK5S_HPd#7(AWclK+fkkLgqbqIER) z&-WIZKLI>~RUo!d^Xx7~ys51I_QwC6dGM`rG_{zCOkg2)``u3;^`++j_IShA|30^@ zhV4zBz(xHZ4$^nezM|h!j;oS~0DS(>Vd{bW#p3@I2d?qOK+E2{GgU!*yK4@9>Vr^Ot^NH~T(SWIf{+GiMI+~}N2m2Ob_H&2nKi%#< zN8kb%ri=KW{vV#$e;V`u-=A6L8bx5~$+How8S4HI{CZRnp&hLDN@|kL;U7}UKkwiF z*E2F~w7yqm^{;)yZ?%(oXO{{+wkL|LCo7g(PLh6vmgoPskNUsw`2K%>ElX$@?hxQV zZfpNP@F!j4i{^kQ??NLAT^0T(K94NmKYK1~@!0r3J!vKwcie<6H&f{>%5N!vf!pS; z1t1H$WKVM``v37(!t@+r^GlyDaewVN5-OErS#(A6FNW;P9xkt7{H5~rw5I;wUb)QA zL=W`9#ffa{>}HxNDi5@?9$o+05m?<#^H`nO8du<9H~S&M0uX3ep1ki`?Mbj)Jx&{6 z-ER+*zPUI*RK6tGQr_0%`ra8q{C)PT?f0{#Y>KnJCE{X)QI$oM_>!+_%julsYC(1| z*-}u*qZh6IVuc>SD|tZV(ckEdrZbIIbWHl+O*>`1%Tk>_Z&n9gMLWBf@0;zAUn422 zKtOxFzJVae_h?eZZN8vz0>JqwvN}_>2KI_o*cLg?mcQ8PFjtTd2>E$Ff9BBS$>O!G z_smfK`XEfg{g3D4VHx|e&n*4YX-dHB;5#sq^nKK_yURR8_Q2!5e)BuL@!^29i6D<}5B4Kgfd*9hgpkgCu4fPK-Swv_nlqv;|BD51eb5=V`tAlB z!mu~Hf1KurS6#JgBOSDIvH6{DV(Igfqqhz2N4AH*>s255pFJvT%k(Zb>wL0QntaqS zeK=I0mZsKn=^zEkyy4f%mg5-_2xk#!J!Yvr8mM-a^S<_d>?}ibLJI7z$%p0W(%YVF zb~PRWEg6b+)fnzH(I;d`1r(4``MpTD;Jfy8`I~26s@-yDFPxfA=UEH}s8H^iQgBE+!G!#EeRp^%VDlSKi!H@*jH+#F2J=e|K*yNR|}{M}Dq+u~?IHcWRbKsJu8iL+U4;It1kR_A4mX)X-o696yA0BDxc-Y&z``IJ z9HQUyN6mpI=MAhZ0F2((I^ICb^zWrINPQjG8ZEF0+}38?%=m6D3;7*(`_*=seJN3= zd-e$#2bKMJKIs)P{r^SNTSi6Iw*A9HcS}i2cS(0kr*wCRq;yG0N+TW8ATV?cC7`5q z4ns+IH}Agg=l_14H6LcJz2`iS(I^-R8Bd z3vVhZ)LZMD7uV#3FmP|5^H(TPtNveJkGs?Zw~Pa=55&RP*E{x;X-L8Y>j5qI?$Yg- z5UK=dOR?!p!nOH>fIywqM|mcHj9Cf!7U+#bqftMO7Eox6mvdxFvZ9vFFQ%l3$aNA# zej^}SBHZkR7H>eA;^s3rGDoulSF<)Z+zw6fh3@;p1$&y)ng$Dz-ZOH1>v^^Q00CMj zH}T{no-7*j3GF7oaV7=66rn$qKiyv_QVsaRf~as=!?sG6e-a#sz2qcLX47_(kc&&M zX+ixhu2dm+ZXIHy0UnMbO>BZO6oB-OBg`k2Hozw~RZ-HjOMh|*Ka<0RDB$+w$NdQo zoYRI^A_<|D&uSX99ecvta@51$CHLq52{5R6_|9~ISPz>~7NB&V34MF=v?MOb?1;GA z|Mr@Dxe{fF-fFA9C_)ZM%S{<(fu1at`P@WL0eFT~nvV*#Dt9?Ym8t##`` zkCug(702Js$w7siOFcfa-vP%sfz?nVF)&Z_^J#76ojg8*jpD�K^st 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 -4M`E@=^AJ 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

    diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.scss b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.scss index df947e148..6a6700581 100644 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.scss +++ b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.scss @@ -1,40 +1,4 @@ -.heading { - margin-top: 32px; - h1 { - font-size: 42px; - margin-top: 0; - } -} - -.icon { - display: inline-block; - margin-bottom: 14px; -} - -.divider { - margin: 24px; -} - -.ion-padding { - text-align: center; -} - -.status { - font-size: 14px; -} - -.description { - - ion-icon { - padding-right: 8px; - } - - @media (min-width: 1000px) { - ion-label { - ::ng-deep p { - font-size: 1.1rem; - line-height: 25px; - } - } - } +.background { + background: url('/assets/img/background.png') no-repeat center center fixed; + z-index: -100; } \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.ts index 813e9109b..1402d1c11 100644 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.ts +++ b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.ts @@ -1,14 +1,18 @@ import { ChangeDetectionStrategy, Component, Inject } from '@angular/core' -import { ActivatedRoute } from '@angular/router' -import { AbstractMarketplaceService } from '@start9labs/marketplace' +import { + AbstractCategoryService, + AbstractMarketplaceService, +} from '@start9labs/marketplace' import { TuiDialogService } from '@taiga-ui/core' -import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' import { PatchDB } from 'patch-db-client' import { map } from 'rxjs' -import { MarketplaceSettingsPage } from './marketplace-settings/marketplace-settings.page' import { ConfigService } from 'src/app/services/config.service' import { MarketplaceService } from 'src/app/services/marketplace.service' import { DataModel } from 'src/app/services/patch-db/data-model' +import { CategoryService } from 'src/app/services/category.service' +import { SidebarService } from 'src/app/services/sidebar.service' +import { MarketplaceSettingsPage } from './marketplace-settings/marketplace-settings.page' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' @Component({ selector: 'marketplace-list', @@ -17,81 +21,37 @@ import { DataModel } from 'src/app/services/patch-db/data-model' changeDetection: ChangeDetectionStrategy.OnPush, }) export class MarketplaceListPage { - readonly back = !!this.route.snapshot.queryParamMap.get('back') - - readonly store$ = this.marketplaceService.getSelectedStore$().pipe( - map(({ info, packages }) => { - const categories = new Set() - if (info.categories.includes('featured')) categories.add('featured') - info.categories.forEach(c => categories.add(c)) - categories.add('all') - - return { categories: Array.from(categories), packages } - }), - ) - - readonly localPkgs$ = this.patch.watch$('package-data') - - readonly details$ = this.marketplaceService.getSelectedHost$().pipe( - map(({ url, name }) => { - const { start9, community } = this.config.marketplace - let color: string - let description: string - - if (url === start9) { - color = 'success' - description = - 'Services from this registry are packaged and maintained by the Start9 team. If you experience an issue or have questions related to a service from this registry, one of our dedicated support staff will be happy to assist you.' - } else if (url === community) { - color = 'tertiary' - description = - 'Services from this registry are packaged and maintained by members of the Start9 community. Install at your own risk. If you experience an issue or have a question related to a service in this marketplace, please reach out to the package developer for assistance.' - } else if (url.includes('beta')) { - color = 'warning' - description = - 'Services from this registry are undergoing beta testing and may contain bugs. Install at your own risk.' - } else if (url.includes('alpha')) { - color = 'danger' - description = - 'Services from this registry are undergoing alpha testing. They are expected to contain bugs and could damage your system. Install at your own risk.' - } else { - // alt marketplace - color = 'warning' - description = - 'This is a Custom Registry. Start9 cannot verify the integrity or functionality of services from this registry, and they could damage your system. Install at your own risk.' - } - - return { - name, - url, - color, - description, - } - }), - ) - constructor( private readonly patch: PatchDB, @Inject(AbstractMarketplaceService) private readonly marketplaceService: MarketplaceService, - private readonly dialogs: TuiDialogService, + @Inject(AbstractCategoryService) + private readonly categoryService: CategoryService, + @Inject(TuiDialogService) private readonly dialogs: TuiDialogService, readonly config: ConfigService, - private readonly route: ActivatedRoute, + readonly sidebarService: SidebarService, ) {} - category = 'featured' - query = '' + readonly packages$ = this.marketplaceService.getSelectedStore$().pipe( + map(({ packages }) => { + this.sidebarService.setMap(packages.map(p => p.manifest.id)) + return packages + }), + ) + readonly localPkgs$ = this.patch.watch$('package-data') + readonly category$ = this.categoryService.getCategory$() + readonly query$ = this.categoryService.getQuery$() + readonly details$ = this.marketplaceService.getSelectedHost$() + readonly marketplace = this.config.marketplace - presentModalMarketplaceSettings() { + async presentModalMarketplaceSettings() { this.dialogs - .open(new PolymorpheusComponent(MarketplaceSettingsPage), { - label: 'Change Registry', - }) + .open( + new PolymorpheusComponent(MarketplaceSettingsPage), + { + label: 'Change Registry', + }, + ) .subscribe() } - - onCategoryChange(category: string): void { - this.category = category - this.query = '' - } } diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.ts index a5fee0e90..d09e7cded 100644 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.ts +++ b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.ts @@ -25,6 +25,18 @@ import { ConfigService } from 'src/app/services/config.service' changeDetection: ChangeDetectionStrategy.OnPush, }) export class MarketplaceSettingsPage { + constructor( + private readonly api: ApiService, + private readonly loader: LoadingService, + private readonly formDialog: FormDialogService, + private readonly errorService: ErrorService, + @Inject(AbstractMarketplaceService) + private readonly marketplaceService: MarketplaceService, + private readonly patch: PatchDB, + private readonly dialogs: TuiDialogService, + readonly config: ConfigService, + ) {} + stores$ = combineLatest([ this.marketplaceService.getKnownHosts$(), this.marketplaceService.getSelectedHost$(), @@ -43,18 +55,6 @@ export class MarketplaceSettingsPage { }), ) - constructor( - private readonly api: ApiService, - private readonly loader: LoadingService, - private readonly formDialog: FormDialogService, - private readonly errorService: ErrorService, - @Inject(AbstractMarketplaceService) - private readonly marketplaceService: MarketplaceService, - private readonly patch: PatchDB, - private readonly dialogs: TuiDialogService, - readonly config: ConfigService, - ) {} - async presentModalAdd() { const { name, spec } = getMarketplaceValueSpec() diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/components/marketplace-show-controls.component.ts similarity index 66% rename from web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.ts rename to web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/components/marketplace-show-controls.component.ts index acc7b77de..98d89492a 100644 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.ts +++ b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/components/marketplace-show-controls.component.ts @@ -2,18 +2,27 @@ import { ChangeDetectionStrategy, Component, Inject, + inject, Input, } from '@angular/core' import { AbstractMarketplaceService, MarketplacePkg, + AboutModule, + AdditionalModule, + DependenciesModule, } from '@start9labs/marketplace' import { Emver, ErrorService, isEmptyObject, LoadingService, + pauseFor, sameUrl, + EmverPipesModule, + MarkdownPipeModule, + SharedPipesModule, + TextSpinnerComponentModule, } from '@start9labs/shared' import { TuiDialogService } from '@taiga-ui/core' import { filter, firstValueFrom, of, Subscription, switchMap } from 'rxjs' @@ -29,12 +38,99 @@ import { PatchDB } from 'patch-db-client' import { getAllPackages } from 'src/app/util/get-package-data' import { TUI_PROMPT } from '@taiga-ui/kit' import { dryUpdate } from 'src/app/util/dry-update' +import { Router } from '@angular/router' +import { SidebarService } from 'src/app/services/sidebar.service' +import { CommonModule } from '@angular/common' +import { IonicModule } from '@ionic/angular' +import { RouterModule } from '@angular/router' + +import { TuiButtonModule } from '@taiga-ui/core' @Component({ selector: 'marketplace-show-controls', - templateUrl: 'marketplace-show-controls.component.html', - styleUrls: ['./marketplace-show-controls.page.scss'], + template: ` +
    + + + + + + + + + + + + + + +
    + `, + styles: [ + ` + button { + --tui-padding: 1.5rem; + } + `, + ], + standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + CommonModule, + IonicModule, + RouterModule, + TextSpinnerComponentModule, + SharedPipesModule, + EmverPipesModule, + MarkdownPipeModule, + AboutModule, + DependenciesModule, + AdditionalModule, + TuiButtonModule, + ], }) export class MarketplaceShowControlsComponent { @Input() @@ -47,8 +143,9 @@ export class MarketplaceShowControlsComponent { localPkg!: PackageDataEntry | null readonly showDevTools$ = this.ClientStorageService.showDevTools$ - readonly PackageState = PackageState + private readonly router = inject(Router) + readonly sidebarService = inject(SidebarService) constructor( private readonly dialogs: TuiDialogService, @@ -66,6 +163,7 @@ export class MarketplaceShowControlsComponent { } async tryInstall() { + this.sidebarService.toggleState(this.pkg.manifest.id, false) const currentMarketplace = await firstValueFrom( this.marketplaceService.getSelectedHost$(), ) @@ -96,6 +194,13 @@ export class MarketplaceShowControlsComponent { } } + async showService() { + this.sidebarService.toggleState(this.pkg.manifest.id, false) + // @TODO code smell - needed to close preview - likely due to sidebar animation + await pauseFor(300) + this.router.navigate(['/services', this.pkg.manifest.id]) + } + private async presentAlertDifferentMarketplace( url: string, originalUrl: string | null | undefined, @@ -150,7 +255,7 @@ export class MarketplaceShowControlsComponent { of(this.pkg.manifest.alerts.install) .pipe( switchMap(content => - content + !content ? of(true) : this.dialogs.open(TUI_PROMPT, { label: 'Alert', diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.component.html b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.component.html new file mode 100644 index 000000000..e9b39e0ce --- /dev/null +++ b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.component.html @@ -0,0 +1,47 @@ +
    + + + + + + + + View more details + +
    + +
    +
    +

    Dependencies

    +
    +
    + +
    +
    +
    +
    + + +
    +
    diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.component.scss b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.component.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.component.ts new file mode 100644 index 000000000..74118a4e6 --- /dev/null +++ b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.component.ts @@ -0,0 +1,59 @@ +import { + ChangeDetectionStrategy, + Component, + Inject, + inject, + Input, +} from '@angular/core' +import { BehaviorSubject, map } from 'rxjs' +import { + TuiDialogContext, + TuiDialogService, + TuiDurationOptions, + tuiFadeIn, +} from '@taiga-ui/core' +import { tuiPure } from '@taiga-ui/cdk' +import { PolymorpheusContent } from '@tinkoff/ng-polymorpheus' +import { isPlatform } from '@ionic/angular' +import { + AbstractMarketplaceService, + MarketplacePkg, +} from '@start9labs/marketplace' +import { SidebarService } from 'src/app/services/sidebar.service' + +@Component({ + selector: 'marketplace-show-preview', + templateUrl: './marketplace-show-preview.component.html', + styleUrls: ['./marketplace-show-preview.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, + animations: [tuiFadeIn], +}) +export class MarketplaceShowPreviewComponent { + @Input({ required: true }) + pkg!: MarketplacePkg + + constructor( + @Inject(TuiDialogService) private readonly dialogs: TuiDialogService, + ) {} + + readonly sidebarService = inject(SidebarService) + private readonly marketplaceService = inject(AbstractMarketplaceService) + readonly version$ = new BehaviorSubject('*') + index = 0 + speed = 1000 + isMobile = isPlatform(window, 'ios') || isPlatform(window, 'android') + url$ = this.marketplaceService.getSelectedHost$().pipe(map(({ url }) => url)) + + @tuiPure + getAnimation(duration: number): TuiDurationOptions { + return { value: '', params: { duration } } + } + + presentModalImg(content: PolymorpheusContent) { + this.dialogs + .open(content, { + size: 'l', + }) + .subscribe() + } +} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.module.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.module.ts new file mode 100644 index 000000000..d4e63364f --- /dev/null +++ b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.module.ts @@ -0,0 +1,35 @@ +import { CommonModule } from '@angular/common' +import { NgModule } from '@angular/core' +import { + SharedPipesModule, + TextSpinnerComponentModule, +} from '@start9labs/shared' +import { + AboutModule, + AdditionalModule, + DependenciesModule, + MarketplacePackageHeroComponent, + ReleaseNotesModule, +} from '@start9labs/marketplace' +import { MarketplaceShowPreviewComponent } from './marketplace-show-preview.component' + +import { TuiButtonModule } from '@taiga-ui/core' +import { RouterModule } from '@angular/router' + +@NgModule({ + declarations: [MarketplaceShowPreviewComponent], + exports: [MarketplaceShowPreviewComponent], + imports: [ + CommonModule, + SharedPipesModule, + TextSpinnerComponentModule, + RouterModule, + DependenciesModule, + AdditionalModule, + ReleaseNotesModule, + TuiButtonModule, + AboutModule, + MarketplacePackageHeroComponent, + ], +}) +export class MarketplaceShowPreviewModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-components.module.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-components.module.ts deleted file mode 100644 index 2c47125b9..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-components.module.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { RouterModule } from '@angular/router' -import { - SharedPipesModule, - EmverPipesModule, - MarkdownPipeModule, - TextSpinnerComponentModule, -} from '@start9labs/shared' -import { - PackageModule, - AboutModule, - AdditionalModule, - DependenciesModule, -} from '@start9labs/marketplace' -import { MarketplaceShowHeaderComponent } from './marketplace-show-header/marketplace-show-header.component' -import { MarketplaceShowDependentComponent } from './marketplace-show-dependent/marketplace-show-dependent.component' -import { MarketplaceShowControlsComponent } from './marketplace-show-controls/marketplace-show-controls.component' - -@NgModule({ - declarations: [ - MarketplaceShowHeaderComponent, - MarketplaceShowControlsComponent, - MarketplaceShowDependentComponent, - ], - imports: [ - CommonModule, - IonicModule, - RouterModule, - TextSpinnerComponentModule, - SharedPipesModule, - EmverPipesModule, - MarkdownPipeModule, - PackageModule, - AboutModule, - DependenciesModule, - AdditionalModule, - ], - exports: [ - MarketplaceShowHeaderComponent, - MarketplaceShowControlsComponent, - MarketplaceShowDependentComponent, - ], -}) -export class MarketplaceShowComponentsModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.html b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.html deleted file mode 100644 index 64bb3db0b..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.component.html +++ /dev/null @@ -1,46 +0,0 @@ -
    - - View Installed - - - - - Update - - - Downgrade - - - - Reinstall - - - - - - - - Install - - -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.page.scss b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.page.scss deleted file mode 100644 index cee1bd49f..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-controls/marketplace-show-controls.page.scss +++ /dev/null @@ -1,19 +0,0 @@ -ion-button::part(native) { - font-size: 17px; -} - -ion-button { - height: 44px; - margin: 16px; -} - -@media (min-width: 1000px) { - - .action-buttons { - display: flex; - } - - ion-button { - width: 240px; - } -} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.html b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.html deleted file mode 100644 index 18dd2fedf..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.html +++ /dev/null @@ -1,30 +0,0 @@ - - - -

    - - {{ title }} - -

    -

    - - {{ dependentInfo.title }} requires an install of {{ title }} satisfying - {{ dependentInfo.version }}. -
    -
    - - {{ title }} version {{ version | displayEmver }} is compatible. - - - {{ title }} version {{ version | displayEmver }} is NOT compatible. - -
    -

    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.scss b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.scss deleted file mode 100644 index 5fc4b4248..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.scss +++ /dev/null @@ -1,17 +0,0 @@ -.heading { - display: flex; - align-items: center; -} - -.title { - margin: 5px; - font-size: 18px; -} - -.text { - font-style: italic; - - &_error { - color: var(--ion-color-danger); - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.ts deleted file mode 100644 index 3e28b783b..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-dependent/marketplace-show-dependent.component.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - Inject, - Input, -} from '@angular/core' -import { MarketplacePkg } from '@start9labs/marketplace' -import { DOCUMENT } from '@angular/common' -import { DependentInfo } from 'src/app/types/dependent-info' - -@Component({ - selector: 'marketplace-show-dependent', - templateUrl: 'marketplace-show-dependent.component.html', - styleUrls: ['marketplace-show-dependent.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class MarketplaceShowDependentComponent { - @Input({ required: true }) - pkg!: MarketplacePkg - - readonly dependentInfo?: DependentInfo = - this.document.defaultView?.history.state?.dependentInfo - - constructor(@Inject(DOCUMENT) private readonly document: Document) {} - - get title(): string { - return this.pkg.manifest.title - } - - get version(): string { - return this.pkg.manifest.version - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-header/marketplace-show-header.component.html b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-header/marketplace-show-header.component.html deleted file mode 100644 index 26bddfbcb..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-header/marketplace-show-header.component.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - Marketplace Listing - - diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-header/marketplace-show-header.component.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-header/marketplace-show-header.component.ts deleted file mode 100644 index efe309db7..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/components/marketplace-show-header/marketplace-show-header.component.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' - -@Component({ - selector: 'marketplace-show-header', - templateUrl: 'marketplace-show-header.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class MarketplaceShowHeaderComponent {} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.module.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.module.ts deleted file mode 100644 index 1905ffba8..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.module.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { RouterModule, Routes } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { - EmverPipesModule, - MarkdownPipeModule, - SharedPipesModule, - TextSpinnerComponentModule, -} from '@start9labs/shared' -import { - AboutModule, - AdditionalModule, - DependenciesModule, - PackageModule, -} from '@start9labs/marketplace' -import { MarketplaceStatusModule } from '../marketplace-status/marketplace-status.module' -import { MarketplaceShowPage } from './marketplace-show.page' -import { MarketplaceShowComponentsModule } from './components/marketplace-show-components.module' - -const routes: Routes = [ - { - path: '', - component: MarketplaceShowPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - TextSpinnerComponentModule, - SharedPipesModule, - EmverPipesModule, - MarkdownPipeModule, - MarketplaceStatusModule, - PackageModule, - AboutModule, - DependenciesModule, - AdditionalModule, - MarketplaceShowComponentsModule, - ], - declarations: [MarketplaceShowPage], -}) -export class MarketplaceShowPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.html b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.html deleted file mode 100644 index f563e88d6..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - -
    - -

    - {{ pkgId }} @{{ version === '*' ? 'latest' : version }} not found in - this registry -

    -
    -
    - - - - - - - - - - - - - - -
    - - - - -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.scss b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.scss deleted file mode 100644 index e8f9e8e0c..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.scss +++ /dev/null @@ -1,3 +0,0 @@ -.status { - font-size: calc(16px + 1vw); -} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.ts deleted file mode 100644 index 623490f5c..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show/marketplace-show.page.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' -import { ActivatedRoute } from '@angular/router' -import { getPkgId } from '@start9labs/shared' -import { AbstractMarketplaceService } from '@start9labs/marketplace' -import { PatchDB } from 'patch-db-client' -import { filter, shareReplay, switchMap, BehaviorSubject } from 'rxjs' -import { DataModel } from 'src/app/services/patch-db/data-model' - -@Component({ - selector: 'marketplace-show', - templateUrl: './marketplace-show.page.html', - styleUrls: ['./marketplace-show.page.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class MarketplaceShowPage { - readonly pkgId = getPkgId(this.route) - readonly url = this.route.snapshot.queryParamMap.get('url') || undefined - - readonly loadVersion$ = new BehaviorSubject('*') - - readonly localPkg$ = this.patch - .watch$('package-data', this.pkgId) - .pipe(filter(Boolean), shareReplay({ bufferSize: 1, refCount: true })) - - readonly pkg$ = this.loadVersion$.pipe( - switchMap(version => - this.marketplaceService.getPackage$(this.pkgId, version, this.url), - ), - ) - - constructor( - private readonly route: ActivatedRoute, - private readonly patch: PatchDB, - private readonly marketplaceService: AbstractMarketplaceService, - ) {} -} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace.module.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace.module.ts index 3a90c851b..cbe1a5afb 100644 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace.module.ts +++ b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace.module.ts @@ -1,5 +1,5 @@ import { NgModule } from '@angular/core' -import { Routes, RouterModule } from '@angular/router' +import { RouterModule, Routes } from '@angular/router' const routes: Routes = [ { @@ -10,20 +10,6 @@ const routes: Routes = [ m => m.MarketplaceListPageModule, ), }, - { - path: ':pkgId', - loadChildren: () => - import('./marketplace-show/marketplace-show.module').then( - m => m.MarketplaceShowPageModule, - ), - }, - { - path: ':pkgId/notes', - loadChildren: () => - import('./release-notes/release-notes.module').then( - m => m.ReleaseNotesPageModule, - ), - }, ] @NgModule({ diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.module.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.module.ts deleted file mode 100644 index dfff311b3..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NgModule } from '@angular/core' -import { Routes, RouterModule } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { ReleaseNotesModule } from '@start9labs/marketplace' - -import { ReleaseNotesPage } from './release-notes.page' - -const routes: Routes = [ - { - path: '', - component: ReleaseNotesPage, - }, -] - -@NgModule({ - imports: [IonicModule, ReleaseNotesModule, RouterModule.forChild(routes)], - declarations: [ReleaseNotesPage], - exports: [ReleaseNotesPage], -}) -export class ReleaseNotesPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.page.html b/web/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.page.html deleted file mode 100644 index df9605253..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.page.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - Release Notes - - - - diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.page.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.page.ts deleted file mode 100644 index f8397fe32..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/release-notes/release-notes.page.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' -import { ActivatedRoute } from '@angular/router' -import { getPkgId } from '@start9labs/shared' - -@Component({ - templateUrl: './release-notes.page.html', - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class ReleaseNotesPage { - readonly href = `/marketplace/${getPkgId(this.route)}` - - constructor(private readonly route: ActivatedRoute) {} -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.scss index e69de29bb..c7a3fb9de 100644 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.scss +++ b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.scss @@ -0,0 +1,3 @@ +img { + border-radius: 100%; +} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.scss index 81e085b84..360689817 100644 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.scss +++ b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.scss @@ -6,4 +6,4 @@ font-weight: bold; font-size: 2rem; } -} +} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.scss index dd0cbe2b8..b1f9a952f 100644 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.scss +++ b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.scss @@ -1,3 +1,7 @@ .icon { padding-right: 4px; } + +img { + border-radius: 100%; +} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.scss index 2be7a3c4d..49557dd5b 100644 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.scss +++ b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.scss @@ -11,3 +11,7 @@ width: 54px; margin: 0 16px; } + +img { + border-radius: 100%; +} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.html index 161f0ecbf..c57070d8c 100644 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.html +++ b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.html @@ -77,7 +77,7 @@

    Logs

    *ngIf="pkg.installed?.['marketplace-url'] as url; else sideloaded" button detail - (click)="navigate('/marketplace/' + pkg.manifest.id, { url })" + (click)="navigate('/marketplace', { url, id: pkg.manifest.id })" > diff --git a/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.module.ts index 9dab5392d..a38c4c7b9 100644 --- a/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.module.ts +++ b/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.module.ts @@ -2,17 +2,17 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { IonicModule } from '@ionic/angular' import { SideloadPage } from './sideload.page' -import { Routes, RouterModule } from '@angular/router' +import { RouterModule, Routes } from '@angular/router' import { EmverPipesModule, SharedPipesModule } from '@start9labs/shared' import { DragNDropDirective } from './dnd.directive' import { - PackageModule, AboutModule, AdditionalModule, DependenciesModule, + MarketplacePackageHeroComponent, } from '@start9labs/marketplace' // TODO: Find a way to not tie two routes together -import { MarketplaceShowComponentsModule } from '../../marketplace/marketplace-show/components/marketplace-show-components.module' +import { MarketplaceShowControlsComponent } from '../../marketplace/marketplace-show-preview/components/marketplace-show-controls.component' const routes: Routes = [ { @@ -28,11 +28,11 @@ const routes: Routes = [ RouterModule.forChild(routes), SharedPipesModule, EmverPipesModule, - PackageModule, AboutModule, AdditionalModule, + MarketplaceShowControlsComponent, DependenciesModule, - MarketplaceShowComponentsModule, + MarketplacePackageHeroComponent, ], declarations: [SideloadPage, DragNDropDirective], }) diff --git a/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.html b/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.html index 6a02a6c65..3ff228fbd 100644 --- a/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.html +++ b/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.html @@ -30,17 +30,29 @@

    - - - - +
    + + + - - - + class="rounded-xl bg-gradient-to-bl from-zinc-400/75 to-zinc-600 p-px shadow-lg shadow-zinc-400/10 mt-6" + > +
    +

    Dependencies

    +
    +
    + +
    +
    +
    +
    + +
    diff --git a/web/projects/ui/src/app/apps/ui/pages/updates/updates.page.html b/web/projects/ui/src/app/apps/ui/pages/updates/updates.page.html index bb576c8f4..33c3a8a68 100644 --- a/web/projects/ui/src/app/apps/ui/pages/updates/updates.page.html +++ b/web/projects/ui/src/app/apps/ui/pages/updates/updates.page.html @@ -10,7 +10,7 @@
    - + *', [ + query(':enter, :leave', style({ position: 'fixed', width: '100%' }), { + optional: true, + }), + group([ + query( + ':enter', + [ + style({ transform: 'translateX(-100%)' }), + animate('1s ease-in-out', style({ transform: 'translateX(0%)' })), + ], + { optional: true }, + ), + query( + ':leave', + [ + style({ transform: 'translateX(0%)' }), + animate('1s ease-in-out', style({ transform: 'translateX(100%)' })), + ], + { optional: true }, + ), + ]), + ]), +]) diff --git a/web/projects/ui/src/app/services/api/api.fixures.ts b/web/projects/ui/src/app/services/api/api.fixures.ts index 8a2893b6c..1e67c67c3 100644 --- a/web/projects/ui/src/app/services/api/api.fixures.ts +++ b/web/projects/ui/src/app/services/api/api.fixures.ts @@ -6,17 +6,17 @@ import { ServerStatusInfo, } from 'src/app/services/patch-db/data-model' import { - RR, + Metrics, NotificationLevel, + RR, ServerNotifications, - Metrics, } from './api.types' import { BTC_ICON, LND_ICON, PROXY_ICON } from './api-icons' import { DependencyMetadata, - MarketplacePkg, Manifest, + MarketplacePkg, } from '@start9labs/marketplace' import { Log } from '@start9labs/shared' import { unionSelectKey } from '@start9labs/start-sdk/lib/config/configTypes' @@ -102,7 +102,8 @@ export module Mock { assets: { icon: 'icon.png', }, - 'release-notes': 'Dual funded channels!', + 'release-notes': + 'Dual funded channels! And lots more amazing new features. Also includes several bugfixes and performance enhancements.', license: 'MIT', 'wrapper-repo': 'https://github.com/start9labs/lnd-wrapper', 'upstream-repo': 'https://github.com/lightningnetwork/lnd', @@ -203,7 +204,7 @@ export module Mock { ...Mock.MockManifestBitcoind, version: '0.19.0', }, - categories: ['bitcoin', 'cryptocurrency'], + categories: ['bitcoin', 'cryptocurrency', 'featured'], versions: ['0.19.0', '0.20.0', '0.21.0'], 'dependency-metadata': {}, 'published-at': new Date().toISOString(), @@ -240,6 +241,7 @@ export module Mock { icon: BTC_ICON, license: 'licenseUrl', instructions: 'instructionsUrl', + screenshots: ['one.png', 'two.png', 'three.png'], manifest: { ...Mock.MockManifestBitcoind, 'release-notes': diff --git a/web/projects/ui/src/app/services/category.service.ts b/web/projects/ui/src/app/services/category.service.ts new file mode 100644 index 000000000..045fdae86 --- /dev/null +++ b/web/projects/ui/src/app/services/category.service.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@angular/core' +import { Observable } from 'rxjs' +import { AbstractCategoryService } from '@start9labs/marketplace' + +@Injectable() +export class CategoryService extends AbstractCategoryService { + getCategory$(): Observable { + return this.category$ + } + + changeCategory(category: string) { + this.category$.next(category) + } + + setQuery(query: string) { + this.query$.next(query) + } + + getQuery$(): Observable { + return this.query$ + } + + resetQuery() { + this.query$.next('') + } +} diff --git a/web/projects/ui/src/app/services/marketplace.service.ts b/web/projects/ui/src/app/services/marketplace.service.ts index a6a1bf2c6..8a5f4c74e 100644 --- a/web/projects/ui/src/app/services/marketplace.service.ts +++ b/web/projects/ui/src/app/services/marketplace.service.ts @@ -1,27 +1,28 @@ import { Injectable } from '@angular/core' import { sameUrl } from '@start9labs/shared' import { - MarketplacePkg, AbstractMarketplaceService, - StoreData, Marketplace, - StoreInfo, + MarketplacePkg, + StoreData, StoreIdentity, + StoreIdentityWithData, + StoreInfo, } from '@start9labs/marketplace' import { PatchDB } from 'patch-db-client' import { BehaviorSubject, + catchError, combineLatest, distinctUntilKeyChanged, + filter, from, + map, mergeMap, Observable, of, - scan, - catchError, - filter, - map, pairwise, + scan, shareReplay, startWith, switchMap, @@ -162,6 +163,32 @@ export class MarketplaceService implements AbstractMarketplaceService { return this.selectedStore$ } + getSelectedStoreWithCategories$() { + return this.selectedHost$.pipe( + switchMap(({ url }) => + this.marketplace$.pipe( + map(m => m[url]), + filter(Boolean), + map(({ info, packages }) => { + const categories = new Set() + if (info.categories.includes('featured')) categories.add('featured') + categories.add('all') + info.categories.forEach(c => categories.add(c)) + + return { + url, + info: { + ...info, + categories: Array.from(categories), + }, + packages, + } + }), + ), + ), + ) + } + getPackage$( id: string, version: string, diff --git a/web/projects/ui/src/app/services/sidebar.service.ts b/web/projects/ui/src/app/services/sidebar.service.ts new file mode 100644 index 000000000..279c45ecd --- /dev/null +++ b/web/projects/ui/src/app/services/sidebar.service.ts @@ -0,0 +1,21 @@ +import { Injectable } from '@angular/core' +import { BehaviorSubject, Observable } from 'rxjs' + +@Injectable({ + providedIn: 'root', +}) +export class SidebarService { + openMap: Record> = {} + + setMap(ids: string[]) { + ids.map(i => (this.openMap[i] = new BehaviorSubject(false))) + } + + getToggleState(pkgId: string): Observable { + return this.openMap[pkgId] + } + + toggleState(pkgId: string, open: boolean) { + this.openMap[pkgId].next(open) + } +} diff --git a/web/projects/ui/src/styles.scss b/web/projects/ui/src/styles.scss index d7f728578..b2137e699 100644 --- a/web/projects/ui/src/styles.scss +++ b/web/projects/ui/src/styles.scss @@ -1,3 +1,6 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; @import '@taiga-ui/core/styles/taiga-ui-local'; @font-face { @@ -156,10 +159,6 @@ ion-toast { } } -img { - border-radius: 100%; -} - ion-back-button { margin-left: 16px; height: 36px; @@ -480,3 +479,11 @@ button.g-action { svg:not(:root) { overflow: auto; } + +.small-caps { + font-variant: all-small-caps; +} + +.externalLink { + color: var(--ion-color-secondary); +} \ No newline at end of file diff --git a/web/projects/ui/tailwind.config.js b/web/projects/ui/tailwind.config.js new file mode 100644 index 000000000..4fab723c2 --- /dev/null +++ b/web/projects/ui/tailwind.config.js @@ -0,0 +1,25 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ['./src/**/*.{html,ts}', '../marketplace/src/**/*.{html,ts}'], + theme: { + extend: { + screens: { + xs: '376px', + '3xl': '1792px', + '4xl': '2048px', + }, + colors: { + folly: '#FF4961', + lime: '#BCFF49', + cyan: '#49FFE7', + veronica: '#9747ff', + tangerine: '#ff8c49', + royal: '#4961ff', + background: '#222428', + }, + }, + fontFamily: { + sans: ['Montserrat', 'sans-serif'], + }, + }, +} diff --git a/web/tsconfig.json b/web/tsconfig.json index 05d2d293c..9b4b79b35 100644 --- a/web/tsconfig.json +++ b/web/tsconfig.json @@ -22,7 +22,7 @@ "allowSyntheticDefaultImports": true, "paths": { /* These paths are relative to each app base folder */ - "@start9labs/marketplace": ["../marketplace/src/public-api"], + "@start9labs/marketplace": ["../marketplace/index"], "@start9labs/shared": ["../shared/src/public-api"] }, "typeRoots": ["node_modules/@types"], From ea6f70e3c5de1e201b590061deeb0a3aee192624 Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Mon, 11 Dec 2023 18:06:55 +0400 Subject: [PATCH 039/169] chore: migrate to Angular 17 (#2538) * chore: migrate to Angular 17 * chore: update --- web/angular.json | 26 +- web/package-lock.json | 5353 +++++++++-------- web/package.json | 40 +- web/projects/install-wizard/src/polyfills.ts | 64 - web/projects/install-wizard/src/zone-flags.ts | 6 - web/projects/install-wizard/tsconfig.json | 2 +- web/projects/setup-wizard/src/polyfills.ts | 65 - web/projects/setup-wizard/src/zone-flags.ts | 6 - web/projects/setup-wizard/tsconfig.json | 2 +- .../settings/routes/email/email.component.ts | 2 +- .../ui/pages/system/email/email.page.html | 2 +- web/projects/ui/src/main.ts | 5 +- web/projects/ui/src/polyfills.ts | 68 - web/projects/ui/src/zone-flags.ts | 5 - web/projects/ui/tsconfig.json | 2 +- 15 files changed, 2784 insertions(+), 2864 deletions(-) delete mode 100644 web/projects/install-wizard/src/polyfills.ts delete mode 100644 web/projects/install-wizard/src/zone-flags.ts delete mode 100644 web/projects/setup-wizard/src/polyfills.ts delete mode 100644 web/projects/setup-wizard/src/zone-flags.ts delete mode 100644 web/projects/ui/src/polyfills.ts delete mode 100644 web/projects/ui/src/zone-flags.ts diff --git a/web/angular.json b/web/angular.json index ab9777774..963d90bb7 100644 --- a/web/angular.json +++ b/web/angular.json @@ -17,7 +17,7 @@ "outputPath": "dist/raw/ui", "index": "projects/ui/src/index.html", "main": "projects/ui/src/main.ts", - "polyfills": "projects/ui/src/polyfills.ts", + "polyfills": ["zone.js"], "tsConfig": "projects/ui/tsconfig.json", "inlineStyleLanguage": "scss", "assets": [ @@ -101,10 +101,10 @@ "builder": "@angular-devkit/build-angular:dev-server", "configurations": { "production": { - "browserTarget": "ui:build:production" + "buildTarget": "ui:build:production" }, "development": { - "browserTarget": "ui:build:development" + "buildTarget": "ui:build:development" } }, "defaultConfiguration": "development" @@ -112,7 +112,7 @@ "extract-i18n": { "builder": "@angular-devkit/build-angular:extract-i18n", "options": { - "browserTarget": "ui:build" + "buildTarget": "ui:build" } }, "lint": { @@ -163,7 +163,7 @@ "outputPath": "dist/raw/install-wizard", "index": "projects/install-wizard/src/index.html", "main": "projects/install-wizard/src/main.ts", - "polyfills": "projects/install-wizard/src/polyfills.ts", + "polyfills": ["zone.js"], "tsConfig": "projects/install-wizard/tsconfig.json", "inlineStyleLanguage": "scss", "assets": [ @@ -234,14 +234,14 @@ "serve": { "builder": "@angular-devkit/build-angular:dev-server", "options": { - "browserTarget": "install-wizard:build" + "buildTarget": "install-wizard:build" }, "configurations": { "production": { - "browserTarget": "install-wizard:build:production" + "buildTarget": "install-wizard:build:production" }, "development": { - "browserTarget": "install-wizard:build:development" + "buildTarget": "install-wizard:build:development" } }, "defaultConfiguration": "development" @@ -249,7 +249,7 @@ "extract-i18n": { "builder": "@angular-devkit/build-angular:extract-i18n", "options": { - "browserTarget": "install-wizard:build" + "buildTarget": "install-wizard:build" } }, "lint": { @@ -300,7 +300,7 @@ "outputPath": "dist/raw/setup-wizard", "index": "projects/setup-wizard/src/index.html", "main": "projects/setup-wizard/src/main.ts", - "polyfills": "projects/setup-wizard/src/polyfills.ts", + "polyfills": ["zone.js"], "tsConfig": "projects/setup-wizard/tsconfig.json", "inlineStyleLanguage": "scss", "assets": [ @@ -365,10 +365,10 @@ "builder": "@angular-devkit/build-angular:dev-server", "configurations": { "production": { - "browserTarget": "setup-wizard:build:production" + "buildTarget": "setup-wizard:build:production" }, "development": { - "browserTarget": "setup-wizard:build:development" + "buildTarget": "setup-wizard:build:development" } }, "defaultConfiguration": "development" @@ -376,7 +376,7 @@ "extract-i18n": { "builder": "@angular-devkit/build-angular:extract-i18n", "options": { - "browserTarget": "setup-wizard:build" + "buildTarget": "setup-wizard:build" } }, "lint": { diff --git a/web/package-lock.json b/web/package-lock.json index 2994ceaf4..f77d5be5e 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -8,17 +8,17 @@ "name": "startos-ui", "version": "0.3.5.1", "dependencies": { - "@angular/animations": "^16.1.4", - "@angular/cdk": "^16.1.4", - "@angular/common": "^16.1.4", - "@angular/compiler": "^16.1.4", - "@angular/core": "^16.1.4", - "@angular/forms": "^16.1.4", - "@angular/platform-browser": "^16.1.4", - "@angular/platform-browser-dynamic": "^16.1.4", - "@angular/pwa": "^16.1.4", - "@angular/router": "^16.1.4", - "@angular/service-worker": "^16.1.4", + "@angular/animations": "^17.0.6", + "@angular/cdk": "^17.0.3", + "@angular/common": "^17.0.6", + "@angular/compiler": "^17.0.6", + "@angular/core": "^17.0.6", + "@angular/forms": "^17.0.6", + "@angular/platform-browser": "^17.0.6", + "@angular/platform-browser-dynamic": "^17.0.6", + "@angular/pwa": "^17.0.6", + "@angular/router": "^17.0.6", + "@angular/service-worker": "^17.0.6", "@ionic/angular": "^6.1.15", "@materia-ui/ngx-monaco-editor": "^6.0.0", "@start9labs/argon2": "^0.1.0", @@ -49,7 +49,7 @@ "marked": "^4.0.0", "monaco-editor": "^0.33.0", "mustache": "^4.2.0", - "ng-qrcode": "^16.0.0", + "ng-qrcode": "^17.0.0", "node-jose": "^2.1.1", "patch-db-client": "file: ../../../patch-db/client", "pbkdf2": "^3.1.2", @@ -59,13 +59,13 @@ "ts-matches": "^5.2.1", "tslib": "^2.3.0", "uuid": "^8.3.2", - "zone.js": "^0.13.1" + "zone.js": "^0.14.2" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.1.4", - "@angular/cli": "^16.1.4", - "@angular/compiler-cli": "^16.1.4", - "@angular/language-service": "^16.1.4", + "@angular-devkit/build-angular": "^17.0.6", + "@angular/cli": "^17.0.6", + "@angular/compiler-cli": "^17.0.6", + "@angular/language-service": "^17.0.6", "@ionic/cli": "^6.19.0", "@types/dompurify": "^2.3.3", "@types/estree": "^0.0.51", @@ -79,14 +79,14 @@ "autoprefixer": "^10.4.14", "husky": "^4.3.8", "lint-staged": "^13.2.0", - "ng-packagr": "^16.1.0", + "ng-packagr": "^17.0.2", "node-html-parser": "^5.3.3", "postcss": "^8.4.21", - "prettier": "^2.6.1", + "prettier": "^3.1.1", "raw-loader": "^4.0.2", "ts-node": "^10.7.0", "tslint": "^6.1.3", - "typescript": "^5.1.6", + "typescript": "^5.2.2", "webpack-bundle-analyzer": "^4.8.0" } }, @@ -137,111 +137,112 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1602.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.10.tgz", - "integrity": "sha512-FwemQXh3edqA/S6zPpsqKei5v7gt0R0WpjJoAJaz+FOpfDwij1fwnKr88XINY8xcefTcQaTDQxJZheJShA/hHw==", + "version": "0.1700.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1700.6.tgz", + "integrity": "sha512-zVpz736cBZHXcv0v2bRLfJLcykanUyEMVQXkGwZp2eygjNK1Ls9s/74o1dXd6nGdvjh6AnkzOU/vouj2dqA41g==", "devOptional": true, "dependencies": { - "@angular-devkit/core": "16.2.10", + "@angular-devkit/core": "17.0.6", "rxjs": "7.8.1" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.13.0 || >=20.9.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@angular-devkit/build-angular": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.10.tgz", - "integrity": "sha512-msB/qjIsAOySDxdU5DpcX2sWGUEJOFIO03O9+HbtLwf3NDfe74mFfejxuKlHJXIJdgpM2Zc948M6+618QKpUYA==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.0.6.tgz", + "integrity": "sha512-gYxmbvq5/nk7aVJ6JxIIW0//RM7859kMPJGPKekcCGSWkkObjqG6P5cDgJJNAjMl/IfCsG7B+xGYjr4zN8QV9g==", "dev": true, "dependencies": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1602.10", - "@angular-devkit/build-webpack": "0.1602.10", - "@angular-devkit/core": "16.2.10", - "@babel/core": "7.22.9", - "@babel/generator": "7.22.9", + "@angular-devkit/architect": "0.1700.6", + "@angular-devkit/build-webpack": "0.1700.6", + "@angular-devkit/core": "17.0.6", + "@babel/core": "7.23.2", + "@babel/generator": "7.23.0", "@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-generator-functions": "7.23.2", "@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", + "@babel/plugin-transform-runtime": "7.23.2", + "@babel/preset-env": "7.23.2", + "@babel/runtime": "7.23.2", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.2.10", + "@ngtools/webpack": "17.0.6", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", - "autoprefixer": "10.4.14", + "autoprefixer": "10.4.16", "babel-loader": "9.1.3", "babel-plugin-istanbul": "6.1.1", + "browser-sync": "2.29.3", "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", + "esbuild-wasm": "0.19.5", "fast-glob": "3.3.1", - "guess-parser": "0.4.22", - "https-proxy-agent": "5.0.1", - "inquirer": "8.2.4", + "http-proxy-middleware": "2.0.6", + "https-proxy-agent": "7.0.2", + "inquirer": "9.2.11", "jsonc-parser": "3.2.0", "karma-source-map-support": "1.4.0", - "less": "4.1.3", + "less": "4.2.0", "less-loader": "11.1.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.2.1", - "magic-string": "0.30.1", + "magic-string": "0.30.5", "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", + "picomatch": "3.0.1", + "piscina": "4.1.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": "1.69.5", "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", + "terser": "5.24.0", "text-table": "0.2.0", "tree-kill": "1.2.2", - "tslib": "2.6.1", - "vite": "4.4.7", - "webpack": "5.88.2", + "tslib": "2.6.2", + "undici": "5.27.2", + "vite": "4.5.1", + "webpack": "5.89.0", "webpack-dev-middleware": "6.1.1", "webpack-dev-server": "4.15.1", - "webpack-merge": "5.9.0", + "webpack-merge": "5.10.0", "webpack-subresource-integrity": "5.1.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.13.0 || >=20.9.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.18.17" + "esbuild": "0.19.5" }, "peerDependencies": { - "@angular/compiler-cli": "^16.0.0", - "@angular/localize": "^16.0.0", - "@angular/platform-server": "^16.0.0", - "@angular/service-worker": "^16.0.0", + "@angular/compiler-cli": "^17.0.0", + "@angular/localize": "^17.0.0", + "@angular/platform-server": "^17.0.0", + "@angular/service-worker": "^17.0.0", "jest": "^29.5.0", "jest-environment-jsdom": "^29.5.0", "karma": "^6.3.0", - "ng-packagr": "^16.0.0", + "ng-packagr": "^17.0.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=4.9.3 <5.2" + "typescript": ">=5.2 <5.3" }, "peerDependenciesMeta": { "@angular/localize": { @@ -273,76 +274,433 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz", + "integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@angular-devkit/build-angular/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz", + "integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@angular-devkit/build-angular/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz", + "integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==", + "cpu": [ + "x64" + ], "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@angular-devkit/build-angular/node_modules/autoprefixer": { - "version": "10.4.14", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz", + "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==", + "cpu": [ + "arm64" + ], "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz", + "integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz", + "integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz", + "integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz", + "integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==", + "cpu": [ + "arm" ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz", + "integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ia32": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz", + "integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-loong64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz", + "integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz", + "integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz", + "integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz", + "integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-s390x": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz", + "integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz", + "integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz", + "integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz", + "integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/sunos-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz", + "integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz", + "integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-ia32": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz", + "integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz", + "integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, "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" + "debug": "^4.3.4" }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/esbuild": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz", + "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==", + "dev": true, + "hasInstallScript": true, + "optional": true, "bin": { - "autoprefixer": "bin/autoprefixer" + "esbuild": "bin/esbuild" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.5", + "@esbuild/android-arm64": "0.19.5", + "@esbuild/android-x64": "0.19.5", + "@esbuild/darwin-arm64": "0.19.5", + "@esbuild/darwin-x64": "0.19.5", + "@esbuild/freebsd-arm64": "0.19.5", + "@esbuild/freebsd-x64": "0.19.5", + "@esbuild/linux-arm": "0.19.5", + "@esbuild/linux-arm64": "0.19.5", + "@esbuild/linux-ia32": "0.19.5", + "@esbuild/linux-loong64": "0.19.5", + "@esbuild/linux-mips64el": "0.19.5", + "@esbuild/linux-ppc64": "0.19.5", + "@esbuild/linux-riscv64": "0.19.5", + "@esbuild/linux-s390x": "0.19.5", + "@esbuild/linux-x64": "0.19.5", + "@esbuild/netbsd-x64": "0.19.5", + "@esbuild/openbsd-x64": "0.19.5", + "@esbuild/sunos-x64": "0.19.5", + "@esbuild/win32-arm64": "0.19.5", + "@esbuild/win32-ia32": "0.19.5", + "@esbuild/win32-x64": "0.19.5" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/picomatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", + "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", + "dev": true, + "engines": { + "node": ">=10" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@angular-devkit/build-angular/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/@angular-devkit/build-angular/node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -371,88 +729,17 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/@angular-devkit/build-angular/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", - "dev": true - }, - "node_modules/@angular-devkit/build-angular/node_modules/webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", - "dev": true, - "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" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1602.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.10.tgz", - "integrity": "sha512-H7HiFKbZl/xVxpr1RH05SGawTpA1417wvr2nFGRu2OiePd0lPr6pIhcq8F8gt7JcA8yZKKaqjn2gU+6um2MFLg==", + "version": "0.1700.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1700.6.tgz", + "integrity": "sha512-xT5LL92rScVjvGZO7but/YbTQ12PNilosyjDouephl+HIf2V6rwDovTsEfpLYgcrqgodh+R0X0ZCOk95+MmSBA==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1602.10", + "@angular-devkit/architect": "0.1700.6", "rxjs": "7.8.1" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.13.0 || >=20.9.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -462,19 +749,19 @@ } }, "node_modules/@angular-devkit/core": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.10.tgz", - "integrity": "sha512-eo7suLDjyu5bSlEr4TluYkFm4v2PVLSAPgnau8XHHlN5Yg4P/BZ00ve7LA7C9S1gzRSCrxQhK5ki4rnoFTo5zg==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.0.6.tgz", + "integrity": "sha512-+h9VnFHof7rKzBJ5FWrbPXWzbag31QKbUGJ/mV5BYgj39vjzPNUXBW8AaScZAlATi8+tElYXjRMvM49GnuyRLg==", "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", "jsonc-parser": "3.2.0", - "picomatch": "2.3.1", + "picomatch": "3.0.1", "rxjs": "7.8.1", "source-map": "0.7.4" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.13.0 || >=20.9.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -487,41 +774,52 @@ } } }, + "node_modules/@angular-devkit/core/node_modules/picomatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", + "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@angular-devkit/schematics": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.2.10.tgz", - "integrity": "sha512-UCfPJKVNekb21bWRbzyx81tfHN3x8vU4ZMX/VA6xALg//QalMB7NOkkXBAssthnLastkyzkUtlvApTp2+R+EkQ==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.0.6.tgz", + "integrity": "sha512-2g769MpazA1aOzJOm2MNGosra3kxw8CbdIQQOKkvycIzroRNgN06yHcRTDC03GADgP/CkDJ6kxwJQNG+wNFL2A==", "dependencies": { - "@angular-devkit/core": "16.2.10", + "@angular-devkit/core": "17.0.6", "jsonc-parser": "3.2.0", - "magic-string": "0.30.1", + "magic-string": "0.30.5", "ora": "5.4.1", "rxjs": "7.8.1" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.13.0 || >=20.9.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@angular/animations": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.2.12.tgz", - "integrity": "sha512-MD0ElviEfAJY8qMOd6/jjSSvtqER2RDAi0lxe6EtUacC1DHCYkaPrKW4vLqY+tmZBg1yf+6n+uS77pXcHHcA3w==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.0.6.tgz", + "integrity": "sha512-fic61LjLHry79c5H9UGM8Ff311MJnf9an7EukLj2aLJ3J0uadL/H9de7dDp8PaIT10DX9g+aRTIKOmF3PmmXIQ==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "16.2.12" + "@angular/core": "17.0.6" } }, "node_modules/@angular/cdk": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-16.2.12.tgz", - "integrity": "sha512-wT8/265zm2WKY0BDaRoYbrAT4kadrmejTRLjuimQIEUKnw4vBsJMWCwQkpFo3s6zr6eznGqYVAFb8KKPVLKGBg==", + "version": "17.0.3", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.0.3.tgz", + "integrity": "sha512-Qd5uvC09B3+uk2uX1JxmiWrD7wueMHSxNBoCbDEmnrsdDVUta0wN/jj/CtATljxUM8ZqvEvkqgxJCig1od9oyQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -529,32 +827,32 @@ "parse5": "^7.1.2" }, "peerDependencies": { - "@angular/common": "^16.0.0 || ^17.0.0", - "@angular/core": "^16.0.0 || ^17.0.0", + "@angular/common": "^17.0.0 || ^18.0.0", + "@angular/core": "^17.0.0 || ^18.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/cli": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.2.10.tgz", - "integrity": "sha512-zDqlD+rXFuYZP169c2v35HkMbkchVCft5sS+VpoCCgYTk2rwxpeYkjJ8DQZztZJZRXQ+EMpkv/TubswmDro2zA==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.0.6.tgz", + "integrity": "sha512-BLA2wDeqZManC/7MI6WvRRV+VhrwjxxB7FawLyp4xYlo0CTSOFOfeKPVRMLEnA/Ou4R5d47B+BqJTlep62pHwg==", "devOptional": true, "dependencies": { - "@angular-devkit/architect": "0.1602.10", - "@angular-devkit/core": "16.2.10", - "@angular-devkit/schematics": "16.2.10", - "@schematics/angular": "16.2.10", + "@angular-devkit/architect": "0.1700.6", + "@angular-devkit/core": "17.0.6", + "@angular-devkit/schematics": "17.0.6", + "@schematics/angular": "17.0.6", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.1", - "inquirer": "8.2.4", + "inquirer": "9.2.11", "jsonc-parser": "3.2.0", - "npm-package-arg": "10.1.0", - "npm-pick-manifest": "8.0.1", + "npm-package-arg": "11.0.1", + "npm-pick-manifest": "9.0.0", "open": "8.4.2", "ora": "5.4.1", - "pacote": "15.2.0", - "resolve": "1.22.2", + "pacote": "17.0.4", + "resolve": "1.22.8", "semver": "7.5.4", "symbol-observable": "4.0.0", "yargs": "17.7.2" @@ -563,38 +861,38 @@ "ng": "bin/ng.js" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.13.0 || >=20.9.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@angular/common": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.2.12.tgz", - "integrity": "sha512-B+WY/cT2VgEaz9HfJitBmgdk4I333XG/ybC98CMC4Wz8E49T8yzivmmxXB3OD6qvjcOB6ftuicl6WBqLbZNg2w==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.0.6.tgz", + "integrity": "sha512-FZtf8ol8W2V21ZDgFtcxmJ6JJKUO97QZ+wr/bosyYEryWMmn6VGrbOARhfW7BlrEgn14NdFkLb72KKtqoqRjrg==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "16.2.12", + "@angular/core": "17.0.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.2.12.tgz", - "integrity": "sha512-6SMXUgSVekGM7R6l1Z9rCtUGtlg58GFmgbpMCsGf+VXxP468Njw8rjT2YZkf5aEPxEuRpSHhDYjqz7n14cwCXQ==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.0.6.tgz", + "integrity": "sha512-PaCNnlPcL0rvByKCBUUyLWkKJYXOrcfKlYYvcacjOzEUgZeEpekG81hMRb9u/Pz+A+M4HJSTmdgzwGP35zo8qw==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "16.2.12" + "@angular/core": "17.0.6" }, "peerDependenciesMeta": { "@angular/core": { @@ -603,9 +901,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.2.12.tgz", - "integrity": "sha512-pWSrr152562ujh6lsFZR8NfNc5Ljj+zSTQO44DsuB0tZjwEpnRcjJEgzuhGXr+CoiBf+jTSPZKemtSktDk5aaA==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.0.6.tgz", + "integrity": "sha512-C1Gfh9kbjYZezEMOwxnvUTHuPXa+6pk7mAfSj8e5oAO6E+wfo2dTxv1J5zxa3KYzxPYMNfF8OFvLuMKsw7lXjA==", "dev": true, "dependencies": { "@babel/core": "7.23.2", @@ -623,142 +921,68 @@ "ngcc": "bundles/ngcc/index.js" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "16.2.12", - "typescript": ">=4.9.3 <5.2" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", - "dev": true, - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/generator": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", - "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" + "@angular/compiler": "17.0.6", + "typescript": ">=5.2 <5.3" } }, "node_modules/@angular/core": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.2.12.tgz", - "integrity": "sha512-GLLlDeke/NjroaLYOks0uyzFVo6HyLl7VOm0K1QpLXnYvW63W9Ql/T3yguRZa7tRkOAeFZ3jw+1wnBD4O8MoUA==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.0.6.tgz", + "integrity": "sha512-QzfKRTDNgGOY9D5VxenUUz20cvPVC+uVw9xiqkDuHgGfLYVFlCAK9ymFYkdUCLTcVzJPxckP+spMpPX8nc4Aqw==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.13.0" + "zone.js": "~0.14.0" } }, "node_modules/@angular/forms": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.2.12.tgz", - "integrity": "sha512-1Eao89hlBgLR3v8tU91vccn21BBKL06WWxl7zLpQmG6Hun+2jrThgOE4Pf3os4fkkbH4Apj0tWL2fNIWe/blbw==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.0.6.tgz", + "integrity": "sha512-n/trsMtQHUBGiWz5lFaggMcMOuw0gH+96TCtHxQiUYJOdrbOemkFdGrNh3B4fGHmogWuOYJVF5FAm97WRES2XA==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "16.2.12", - "@angular/core": "16.2.12", - "@angular/platform-browser": "16.2.12", + "@angular/common": "17.0.6", + "@angular/core": "17.0.6", + "@angular/platform-browser": "17.0.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-16.2.12.tgz", - "integrity": "sha512-sZwB+ZEjChx9EYcqPaS4OnhC/q5RcedZjIdM9mCxuU/MtseURRYRI/8Hnm1RHo9qyc5PmsQpg7p9Vp/5hXLUjw==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-17.0.6.tgz", + "integrity": "sha512-HTJmnZeXFZoAJD8wvMN7QHuGd9KHsEQTdA7DeEDxqDneGM63bPVdRN6gSaai6abU1/8gfBNtSTfiwhHnCRTh0Q==", "dev": true, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.13.0 || >=20.9.0" } }, "node_modules/@angular/platform-browser": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.2.12.tgz", - "integrity": "sha512-NnH7ju1iirmVEsUq432DTm0nZBGQsBrU40M3ZeVHMQ2subnGiyUs3QyzDz8+VWLL/T5xTxWLt9BkDn65vgzlIQ==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.0.6.tgz", + "integrity": "sha512-nBhWH1MKT2WswgRNIoMnmNAt0n5/fG59BanJtodW71//Aj5aIE+BuVoFgK3wmO8IMoeP4i4GXRInBXs6lUMOJw==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/animations": "16.2.12", - "@angular/common": "16.2.12", - "@angular/core": "16.2.12" + "@angular/animations": "17.0.6", + "@angular/common": "17.0.6", + "@angular/core": "17.0.6" }, "peerDependenciesMeta": { "@angular/animations": { @@ -767,38 +991,38 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.2.12.tgz", - "integrity": "sha512-ya54jerNgreCVAR278wZavwjrUWImMr2F8yM5n9HBvsMBbFaAQ83anwbOEiHEF2BlR+gJiEBLfpuPRMw20pHqw==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.0.6.tgz", + "integrity": "sha512-5ZEmBtBkqamTaWjUXCls7G1f3xyK/ykXE7hnUV9CgGqXKrNkxblmbtOhoWdsbuIYjjdxQcAk1qtg/Rg21wcc4w==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "16.2.12", - "@angular/compiler": "16.2.12", - "@angular/core": "16.2.12", - "@angular/platform-browser": "16.2.12" + "@angular/common": "17.0.6", + "@angular/compiler": "17.0.6", + "@angular/core": "17.0.6", + "@angular/platform-browser": "17.0.6" } }, "node_modules/@angular/pwa": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@angular/pwa/-/pwa-16.2.10.tgz", - "integrity": "sha512-qZFXdm8oTnH58A3ONXJ63G3rkgvBu+wSRhE/q4luickTLHrDp9P1YbvBdplJduhFHIh7tg6oFNd7ps0NuFklYg==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/@angular/pwa/-/pwa-17.0.6.tgz", + "integrity": "sha512-bHv3+b8e8xXQnPKd8qxJiE3wLtZ93ALQ9qG/Dd5P6tSw3UwhWi6UCvN+/Wi23EP2ftYMY1n6x1aJnCWgunCIpg==", "dependencies": { - "@angular-devkit/schematics": "16.2.10", - "@schematics/angular": "16.2.10", + "@angular-devkit/schematics": "17.0.6", + "@schematics/angular": "17.0.6", "parse5-html-rewriting-stream": "7.0.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.13.0 || >=20.9.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/cli": "^16.0.0" + "@angular/cli": "^17.0.0" }, "peerDependenciesMeta": { "@angular/cli": { @@ -807,26 +1031,26 @@ } }, "node_modules/@angular/router": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.2.12.tgz", - "integrity": "sha512-aU6QnYSza005V9P3W6PpkieL56O0IHps96DjqI1RS8yOJUl3THmokqYN4Fm5+HXy4f390FN9i6ftadYQDKeWmA==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.0.6.tgz", + "integrity": "sha512-xW6yDxREpBOB9MoODSfIw5HwkwLK+OgK34Q6sGYs0ft9UryMoFwft+pHGAaDz2nzhA72n+Ht9B2eai78UE9jGQ==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "16.2.12", - "@angular/core": "16.2.12", - "@angular/platform-browser": "16.2.12", + "@angular/common": "17.0.6", + "@angular/core": "17.0.6", + "@angular/platform-browser": "17.0.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/service-worker": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-16.2.12.tgz", - "integrity": "sha512-o0z0s4c76NmRASa+mUHn/q6vUKQNa06mGmLBDKm84vRQ1sQ2TJv+R1p8K9WkiM5mGy6tjQCDOgaz13TcxMFWOQ==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-17.0.6.tgz", + "integrity": "sha512-sJpO3LuITWX0+Z71m47CcS2vJAqqflMh72Ou46pPguA5ewCW8GsSaohHNYuqSlkmTBxg1HRd61pv3e9dj/U2jA==", "dependencies": { "tslib": "^2.3.0" }, @@ -834,11 +1058,11 @@ "ngsw-config": "ngsw-config.js" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "16.2.12", - "@angular/core": "16.2.12" + "@angular/common": "17.0.6", + "@angular/core": "17.0.6" } }, "node_modules/@assemblyscript/loader": { @@ -870,25 +1094,25 @@ } }, "node_modules/@babel/core": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", - "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", "dev": true, "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", + "@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.2", + "json5": "^2.2.3", "semver": "^6.3.1" }, "engines": { @@ -899,6 +1123,12 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -909,12 +1139,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", - "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -1068,20 +1298,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-function-name/node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-hoist-variables": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", @@ -1269,20 +1485,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helpers": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.5.tgz", @@ -1297,20 +1499,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helpers/node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/highlight": { "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", @@ -1369,25 +1557,6 @@ "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", - "dev": true, - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", @@ -1400,23 +1569,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -1668,9 +1820,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz", - "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", + "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -1804,20 +1956,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-destructuring": { "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", @@ -2300,16 +2438,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", - "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz", + "integrity": "sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", "@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", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", "semver": "^6.3.1" }, "engines": { @@ -2468,17 +2606,17 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", - "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", + "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", + "@babel/compat-data": "^7.23.2", + "@babel/helper-compilation-targets": "^7.22.15", "@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/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", "@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", @@ -2499,58 +2637,58 @@ "@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-generator-functions": "^7.23.2", "@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-block-scoping": "^7.23.0", "@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-class-static-block": "^7.22.11", + "@babel/plugin-transform-classes": "^7.22.15", "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.23.0", "@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-dynamic-import": "^7.22.11", "@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-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-for-of": "^7.22.15", "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.11", "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", "@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-amd": "^7.23.0", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-modules-systemjs": "^7.23.0", "@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-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", "@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-optional-catch-binding": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.23.0", + "@babel/plugin-transform-parameters": "^7.22.15", "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", "@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-escapes": "^7.22.10", "@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", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.23.0", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -2571,14 +2709,12 @@ } }, "node_modules/@babel/preset-modules": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", - "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "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" }, @@ -2593,26 +2729,26 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", "dev": true, "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -3051,11 +3187,14 @@ "node": ">=12" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "devOptional": true + "node_modules/@fastify/busboy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "dev": true, + "engines": { + "node": ">=14" + } }, "node_modules/@iarna/toml": { "version": "2.2.5", @@ -3778,6 +3917,18 @@ "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", "dev": true }, + "node_modules/@ljharb/through": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.11.tgz", + "integrity": "sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==", + "devOptional": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/@maskito/angular": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@maskito/angular/-/angular-1.9.0.tgz", @@ -3868,18 +4019,18 @@ } }, "node_modules/@ngtools/webpack": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.10.tgz", - "integrity": "sha512-XAVn59zP3ztuKDtw92Xc9+64RK4u4c9g8y5GgtjIWeOwgNXl8bYhAo3uTZzrSrOu96DFZGjsmghFab/7/C2pDg==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.0.6.tgz", + "integrity": "sha512-9Us20rqGhi8PmQBwQu6Qtww3WVV/gf2s2DbzcLclsiDtSBobzT64Z6F6E9OpAYD+c5PxlUaOghL6NXdnSNdByA==", "dev": true, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.13.0 || >=20.9.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/compiler-cli": "^16.0.0", - "typescript": ">=4.9.3 <5.2", + "@angular/compiler-cli": "^17.0.0", + "typescript": ">=5.2 <5.3", "webpack": "^5.54.0" } }, @@ -3915,6 +4066,69 @@ "node": ">= 8" } }, + "node_modules/@npmcli/agent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.0.tgz", + "integrity": "sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==", + "devOptional": true, + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/agent/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "devOptional": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/http-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "devOptional": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "devOptional": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "devOptional": true, + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/@npmcli/fs": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", @@ -3928,46 +4142,55 @@ } }, "node_modules/@npmcli/git": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", - "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.3.tgz", + "integrity": "sha512-UZp9NwK+AynTrKvHn5k3KviW/hA5eENmFsu3iAPe7sWRt0lFUdsY/wXIYjpDFe7cdSNwOIzbObfwgt6eL5/2zw==", "devOptional": true, "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.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" + "which": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "devOptional": true, + "engines": { + "node": ">=16" } }, "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", "devOptional": true, "engines": { - "node": ">=12" + "node": "14 || >=16.14" } }, "node_modules/@npmcli/git/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "devOptional": true, "dependencies": { - "isexe": "^2.0.0" + "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/installed-package-contents": { @@ -3986,20 +4209,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "devOptional": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/@npmcli/node-gyp": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", @@ -4010,61 +4219,79 @@ } }, "node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", - "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.0.tgz", + "integrity": "sha512-wBqcGsMELZna0jDblGd7UXgOby45TQaMWmbFwWX+SEotk4HV6zG2t6rT9siyLhPk4P6YYqgfL1UO8nMWDBVJXQ==", "devOptional": true, "dependencies": { - "which": "^3.0.0" + "which": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "devOptional": true, + "engines": { + "node": ">=16" } }, "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "devOptional": true, "dependencies": { - "isexe": "^2.0.0" + "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/run-script": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", - "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.2.tgz", + "integrity": "sha512-Omu0rpA8WXvcGeY6DDzyRoY1i5DkCBkzyJ+m2u7PD6quzb0TvSqdIPOkTn8ZBOj7LbbcbMfZ3c5skwSu6m8y2w==", "devOptional": true, "dependencies": { "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" + "which": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "devOptional": true, + "engines": { + "node": ">=16" } }, "node_modules/@npmcli/run-script/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "devOptional": true, "dependencies": { - "isexe": "^2.0.0" + "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.13.0 || >=18.0.0" } }, "node_modules/@pkgjs/parseargs": { @@ -4141,46 +4368,231 @@ "engines": { "node": ">=14.0.0" }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.7.0.tgz", + "integrity": "sha512-rGku10pL1StFlFvXX5pEv88KdGW6DHUghsxyP/aRYb9eH+74jTGJ3U0S/rtlsQ4yYq1Hcc7AMkoJOb1xu29Fxw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.7.0.tgz", + "integrity": "sha512-/EBw0cuJ/KVHiU2qyVYUhogXz7W2vXxBzeE9xtVIMC+RyitlY2vvaoysMUqASpkUtoNIHlnKTu/l7mXOPgnKOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.7.0.tgz", + "integrity": "sha512-4VXG1bgvClJdbEYYjQ85RkOtwN8sqI3uCxH0HC5w9fKdqzRzgG39K7GAehATGS8jghA7zNoS5CjSKkDEqWmNZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.7.0.tgz", + "integrity": "sha512-/ImhO+T/RWJ96hUbxiCn2yWI0/MeQZV/aeukQQfhxiSXuZJfyqtdHPUPrc84jxCfXTxbJLmg4q+GBETeb61aNw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.7.0.tgz", + "integrity": "sha512-zhye8POvTyUXlKbfPBVqoHy3t43gIgffY+7qBFqFxNqVtltQLtWeHNAbrMnXiLIfYmxcoL/feuLDote2tx+Qbg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.7.0.tgz", + "integrity": "sha512-RAdr3OJnUum6Vs83cQmKjxdTg31zJnLLTkjhcFt0auxM6jw00GD6IPFF42uasYPr/wGC6TRm7FsQiJyk0qIEfg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.7.0.tgz", + "integrity": "sha512-nhWwYsiJwZGq7SyR3afS3EekEOsEAlrNMpPC4ZDKn5ooYSEjDLe9W/xGvoIV8/F/+HNIY6jY8lIdXjjxfxopXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.7.0.tgz", + "integrity": "sha512-rlfy5RnQG1aop1BL/gjdH42M2geMUyVQqd52GJVirqYc787A/XVvl3kQ5NG/43KXgOgE9HXgCaEH05kzQ+hLoA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.7.0.tgz", + "integrity": "sha512-cCkoGlGWfBobdDtiiypxf79q6k3/iRVGu1HVLbD92gWV5WZbmuWJCgRM4x2N6i7ljGn1cGytPn9ZAfS8UwF6vg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.7.0.tgz", + "integrity": "sha512-R2oBf2p/Arc1m+tWmiWbpHBjEcJnHVnv6bsypu4tcKdrYTpDfl1UT9qTyfkIL1iiii5D4WHxUHCg5X0pzqmxFg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.7.0.tgz", + "integrity": "sha512-CPtgaQL1aaPc80m8SCVEoxFGHxKYIt3zQYC3AccL/SqqiWXblo3pgToHuBwR8eCP2Toa+X1WmTR/QKFMykws7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.7.0.tgz", + "integrity": "sha512-pmioUlttNh9GXF5x2CzNa7Z8kmRTyhEzzAC+2WOOapjewMbl+3tGuAnxbwc5JyG8Jsz2+hf/QD/n5VjimOZ63g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.7.0.tgz", + "integrity": "sha512-SeZzC2QhhdBQUm3U0c8+c/P6UlRyBcLL2Xp5KX7z46WXZxzR8RJSIWL9wSUeBTgxog5LTPJuPj0WOT9lvrtP7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/wasm-node": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.7.0.tgz", + "integrity": "sha512-L/IGXIv1TmMaMvklR93wlsaqZ/yZYTHLXuRTyPkOLshlsKW9+7W8+SMrzNR9FQRNLlwCbe4uPrtWMj1jn0uXKg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/@rollup/pluginutils/node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, "node_modules/@schematics/angular": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.10.tgz", - "integrity": "sha512-PXmoswvN7qknTsXDmEvhZ9UG+awwWnQ/1Jd/eqqQx08iAaAT81OsXj1bN7eSs6tEGBKGjPb6q2xzuiECAdymzg==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.0.6.tgz", + "integrity": "sha512-AyC7Bk3Omy6PfADThhq5ci+zzdTTi2N1oZI35gw4tMK5ZxVwIACx2Zyhaz399m5c2RCDi9Hz4A2BOFq9f0j/dg==", "dependencies": { - "@angular-devkit/core": "16.2.10", - "@angular-devkit/schematics": "16.2.10", + "@angular-devkit/core": "17.0.6", + "@angular-devkit/schematics": "17.0.6", "jsonc-parser": "3.2.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.13.0 || >=20.9.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@sigstore/bundle": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", - "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.1.0.tgz", + "integrity": "sha512-89uOo6yh/oxaU8AeOUnVrTdVMcGk9Q1hJa7Hkvalc6G3Z3CupWk4Xe9djSgJm9fMkH69s0P0cVHUoKSOemLdng==", "devOptional": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0" + "@sigstore/protobuf-specs": "^0.2.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@sigstore/protobuf-specs": { @@ -4193,169 +4605,38 @@ } }, "node_modules/@sigstore/sign": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", - "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", - "devOptional": true, - "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "make-fetch-happen": "^11.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign/node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "devOptional": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@sigstore/sign/node_modules/cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", - "devOptional": true, - "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" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "devOptional": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@sigstore/sign/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "devOptional": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@sigstore/sign/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "devOptional": true, - "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" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign/node_modules/make-fetch-happen/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "devOptional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sigstore/sign/node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "devOptional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@sigstore/sign/node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "devOptional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sigstore/sign/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.2.0.tgz", + "integrity": "sha512-AAbmnEHDQv6CSfrWA5wXslGtzLPtAtHZleKOgxdQYvx/s76Fk6T6ZVt7w2IGV9j1UrFeBocTTQxaXG2oRrDhYA==", "devOptional": true, "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "@sigstore/bundle": "^2.1.0", + "@sigstore/protobuf-specs": "^0.2.1", + "make-fetch-happen": "^13.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@sigstore/sign/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true - }, "node_modules/@sigstore/tuf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", - "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.2.0.tgz", + "integrity": "sha512-KKATZ5orWfqd9ZG6MN8PtCIx4eevWSuGRKQvofnWXRpyMyUEpmrzg5M5BrCpjM+NfZ0RbNGOh5tCz/P2uoRqOA==", "devOptional": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0", - "tuf-js": "^1.1.7" + "@sigstore/protobuf-specs": "^0.2.1", + "tuf-js": "^2.1.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "dev": true + }, "node_modules/@start9labs/argon2": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@start9labs/argon2/-/argon2-0.1.0.tgz", @@ -4695,25 +4976,25 @@ "devOptional": true }, "node_modules/@tufjs/canonical-json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", - "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", "devOptional": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@tufjs/models": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", - "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.0.tgz", + "integrity": "sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==", "devOptional": true, "dependencies": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^9.0.0" + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.3" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@types/body-parser": { @@ -4754,6 +5035,21 @@ "@types/node": "*" } }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/dompurify": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-2.4.0.tgz", @@ -5166,99 +5462,6 @@ "@xtuc/long": "4.2.2" } }, - "node_modules/@wessberg/ts-evaluator": { - "version": "0.0.27", - "resolved": "https://registry.npmjs.org/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz", - "integrity": "sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==", - "deprecated": "this package has been renamed to ts-evaluator. Please install ts-evaluator instead", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "jsdom": "^16.4.0", - "object-path": "^0.11.5", - "tslib": "^2.0.3" - }, - "engines": { - "node": ">=10.1.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/wessberg/ts-evaluator?sponsor=1" - }, - "peerDependencies": { - "typescript": ">=3.2.x || >= 4.x" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@wessberg/ts-evaluator/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -5285,10 +5488,13 @@ "dev": true }, "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "devOptional": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "devOptional": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "node_modules/accepts": { "version": "1.3.8", @@ -5315,44 +5521,13 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/acorn-import-assertions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" + "peerDependencies": { + "acorn": "^8" } }, "node_modules/adjust-sourcemap-loader": { @@ -5386,7 +5561,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "devOptional": true, + "dev": true, "dependencies": { "debug": "4" }, @@ -5394,18 +5569,6 @@ "node": ">= 6.0.0" } }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "devOptional": true, - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -5549,25 +5712,6 @@ "node": ">= 8" } }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "devOptional": true - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "devOptional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -5632,6 +5776,24 @@ "node": ">=8" } }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -5684,6 +5846,15 @@ "postcss": "^8.1.0" } }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, "node_modules/babel-loader": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", @@ -5789,6 +5960,15 @@ } ] }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, "node_modules/base64url": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", @@ -5886,12 +6066,34 @@ "ms": "2.0.0" } }, + "node_modules/body-parser/node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/body-parser/node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -5960,12 +6162,265 @@ "node": ">=8" } }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "node_modules/browser-sync": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.29.3.tgz", + "integrity": "sha512-NiM38O6XU84+MN+gzspVmXV2fTOoe+jBqIBx3IBdhZrdeURr6ZgznJr/p+hQ+KzkKEiGH/GcC4SQFSL0jV49bg==", + "dev": true, + "dependencies": { + "browser-sync-client": "^2.29.3", + "browser-sync-ui": "^2.29.3", + "bs-recipes": "1.3.4", + "chalk": "4.1.2", + "chokidar": "^3.5.1", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "^4.0.1", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "^1.18.1", + "immutable": "^3", + "localtunnel": "^2.0.1", + "micromatch": "^4.0.2", + "opn": "5.3.0", + "portscanner": "2.2.0", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "^4.4.1", + "ua-parser-js": "^1.0.33", + "yargs": "^17.3.1" + }, + "bin": { + "browser-sync": "dist/bin.js" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/browser-sync-client": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.29.3.tgz", + "integrity": "sha512-4tK5JKCl7v/3aLbmCBMzpufiYLsB1+UI+7tUXCCp5qF0AllHy/jAqYu6k7hUF3hYtlClKpxExWaR+rH+ny07wQ==", + "dev": true, + "dependencies": { + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/browser-sync-ui": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.29.3.tgz", + "integrity": "sha512-kBYOIQjU/D/3kYtUIJtj82e797Egk1FB2broqItkr3i4eF1qiHbFCG6srksu9gWhfmuM/TNG76jMfzAdxEPakg==", + "dev": true, + "dependencies": { + "async-each-series": "0.1.1", + "chalk": "4.1.2", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^4.4.1", + "stream-throttle": "^0.1.3" + } + }, + "node_modules/browser-sync-ui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/browser-sync-ui/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/browser-sync-ui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/browser-sync-ui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/browser-sync-ui/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync-ui/node_modules/immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync-ui/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/browser-sync/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/browser-sync/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/browser-sync/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/browser-sync/node_modules/fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/browser-sync/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync/node_modules/immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync/node_modules/jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/browser-sync/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/browserslist": { "version": "4.22.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", @@ -5998,6 +6453,12 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==", + "dev": true + }, "node_modules/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", @@ -6061,7 +6522,7 @@ "version": "18.0.1", "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.1.tgz", "integrity": "sha512-g4Uf2CFZPaxtJKre6qr4zqLDOOPU7bNVhWjlNhvzc51xaTOx2noMOLhfFkTAqwtrAZAKQUuDfyjitzilpA8WsQ==", - "dev": true, + "devOptional": true, "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", @@ -6084,7 +6545,7 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", - "dev": true, + "devOptional": true, "engines": { "node": "14 || >=16.14" } @@ -6093,7 +6554,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, + "devOptional": true, "dependencies": { "function-bind": "^1.1.2", "get-intrinsic": "^1.2.1", @@ -6382,7 +6843,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "devOptional": true, + "dev": true, "engines": { "node": ">= 10" } @@ -6456,15 +6917,6 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "devOptional": true, - "bin": { - "color-support": "bin.js" - } - }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -6584,20 +7036,44 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", "dev": true, "engines": { "node": ">=0.8" } }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "devOptional": true + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/content-disposition": { "version": "0.5.4", @@ -6627,9 +7103,9 @@ "dev": true }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true, "engines": { "node": ">= 0.6" @@ -6724,6 +7200,19 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", @@ -6961,30 +7450,6 @@ "node": ">=4" } }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, "node_modules/cuint": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", @@ -7000,20 +7465,6 @@ "node": ">= 6" } }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/debounce": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", @@ -7045,12 +7496,6 @@ "node": ">=0.10.0" } }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -7182,7 +7627,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, + "devOptional": true, "dependencies": { "get-intrinsic": "^1.2.1", "gopd": "^1.0.1", @@ -7266,12 +7711,6 @@ "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "devOptional": true - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -7291,14 +7730,10 @@ } }, "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", + "dev": true }, "node_modules/detect-node": { "version": "2.1.0", @@ -7306,6 +7741,18 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, + "node_modules/dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==", + "dev": true, + "bin": { + "dev-ip": "lib/dev-ip.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -7406,28 +7853,6 @@ } ] }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "deprecated": "Use your platform's native DOMException instead", - "dev": true, - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", @@ -7513,6 +7938,100 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "devOptional": true }, + "node_modules/easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "dependencies": { + "lodash": "^4.17.10" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/eazy-logger": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-4.0.1.tgz", + "integrity": "sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw==", + "dev": true, + "dependencies": { + "chalk": "4.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eazy-logger/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eazy-logger/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eazy-logger/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eazy-logger/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eazy-logger/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eazy-logger/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -7595,6 +8114,91 @@ "once": "^1.4.0" } }, + "node_modules/engine.io": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", + "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "dev": true, + "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" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-client": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.3.tgz", + "integrity": "sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" + } + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", + "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/enhanced-resolve": { "version": "5.15.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", @@ -7702,9 +8306,9 @@ } }, "node_modules/esbuild-wasm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz", - "integrity": "sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.19.5.tgz", + "integrity": "sha512-7zmLLn2QCj93XfMmHtzrDJ1UBuOHB2CZz1ghoCEZiRajxjUvHsF40PnbzFIY/pmesqPRaEtEWii0uzsTbnAgrA==", "dev": true, "bin": { "esbuild": "bin/esbuild" @@ -7722,50 +8326,19 @@ "node": ">=6" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "devOptional": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.8.0" } }, "node_modules/eslint-scope": { @@ -7946,6 +8519,15 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -7955,12 +8537,52 @@ "ms": "2.0.0" } }, + "node_modules/express/node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/express/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -7976,6 +8598,51 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/express/node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express/node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/express/node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -8057,7 +8724,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "devOptional": true, + "dev": true, "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -8089,17 +8756,17 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==", "dev": true, "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~1.0.1", "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", "unpipe": "~1.0.0" }, "engines": { @@ -8121,6 +8788,15 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/find-cache-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", @@ -8164,6 +8840,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, "node_modules/follow-redirects": { "version": "1.15.3", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", @@ -8371,25 +9056,6 @@ "node": ">=10" } }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "devOptional": true, - "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" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -8411,7 +9077,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, + "devOptional": true, "dependencies": { "function-bind": "^1.1.2", "has-proto": "^1.0.1", @@ -8563,7 +9229,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, + "devOptional": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -8577,18 +9243,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "devOptional": true }, - "node_modules/guess-parser": { - "version": "0.4.22", - "resolved": "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz", - "integrity": "sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==", - "dev": true, - "dependencies": { - "@wessberg/ts-evaluator": "0.0.27" - }, - "peerDependencies": { - "typescript": ">=3.7.5" - } - }, "node_modules/gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -8623,7 +9277,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, + "devOptional": true, "dependencies": { "get-intrinsic": "^1.2.2" }, @@ -8635,7 +9289,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, + "devOptional": true, "engines": { "node": ">= 0.4" }, @@ -8647,7 +9301,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, + "devOptional": true, "engines": { "node": ">= 0.4" }, @@ -8655,12 +9309,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "devOptional": true - }, "node_modules/hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -8718,24 +9366,24 @@ } }, "node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", + "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", "devOptional": true, "dependencies": { - "lru-cache": "^7.5.1" + "lru-cache": "^10.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", "devOptional": true, "engines": { - "node": ">=12" + "node": "14 || >=16.14" } }, "node_modules/hpack.js": { @@ -8780,18 +9428,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/html-entities": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", @@ -8941,7 +9577,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "devOptional": true, + "dev": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -8959,15 +9595,6 @@ "node": ">=14.18.0" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "devOptional": true, - "dependencies": { - "ms": "^2.0.0" - } - }, "node_modules/husky": { "version": "4.3.8", "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.8.tgz", @@ -9276,12 +9903,6 @@ "node": ">=8" } }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "devOptional": true - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -9315,29 +9936,29 @@ } }, "node_modules/inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "version": "9.2.11", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.11.tgz", + "integrity": "sha512-B2LafrnnhbRzCWfAdOXisUzL89Kg8cVJlYmhqoi3flSiV/TveO+nsXwgKr9h9PIo+J1hz7nBSk6gegRIMBBf7g==", "devOptional": true, "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", + "@ljharb/through": "^2.3.9", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "figures": "^5.0.0", "lodash": "^4.17.21", - "mute-stream": "0.0.8", + "mute-stream": "1.0.0", "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" + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.18.0" } }, "node_modules/inquirer/node_modules/ansi-styles": { @@ -9356,55 +9977,111 @@ } }, "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "devOptional": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "devOptional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "devOptional": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=10" + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "devOptional": true + }, + "node_modules/inquirer/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "devOptional": true, + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/figures": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "devOptional": true, + "dependencies": { + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "devOptional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/inquirer/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", "devOptional": true, - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true - }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/inquirer/node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", "devOptional": true, "engines": { - "node": ">=8" + "node": ">=0.12.0" } }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/inquirer/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "devOptional": true, "dependencies": { - "has-flag": "^4.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { "node": ">=8" @@ -9546,6 +10223,15 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "dependencies": { + "lodash.isfinite": "^3.3.2" + } + }, "node_modules/is-plain-obj": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", @@ -9567,12 +10253,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, "node_modules/is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", @@ -9773,58 +10453,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "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" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -9950,9 +10578,9 @@ "dev": true }, "node_modules/less": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", - "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", + "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", "dev": true, "dependencies": { "copy-anything": "^2.0.1", @@ -10043,6 +10671,12 @@ "node": ">=10" } }, + "node_modules/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "dev": true + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -10218,6 +10852,79 @@ "node": ">= 12.13.0" } }, + "node_modules/localtunnel": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", + "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", + "dev": true, + "dependencies": { + "axios": "0.21.4", + "debug": "4.3.2", + "openurl": "1.1.1", + "yargs": "17.1.1" + }, + "bin": { + "lt": "bin/lt.js" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/localtunnel/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/localtunnel/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/localtunnel/node_modules/yargs": { + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", + "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", + "dev": true, + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/localtunnel/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -10308,6 +11015,12 @@ "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", "dev": true }, + "node_modules/lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", + "dev": true + }, "node_modules/lodash.keys": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", @@ -10647,9 +11360,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", - "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, @@ -10659,244 +11372,56 @@ }, "node_modules/make-dir": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "optional": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "optional": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "devOptional": true - }, - "node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "devOptional": true, - "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" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "devOptional": true, - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "devOptional": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/make-fetch-happen/node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "devOptional": true, - "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" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "devOptional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/make-fetch-happen/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "devOptional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "devOptional": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "devOptional": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/make-fetch-happen/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "devOptional": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-fetch-happen/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "devOptional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/make-fetch-happen/node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "devOptional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/make-fetch-happen/node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "devOptional": true, + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, "dependencies": { - "minipass": "^3.1.1" + "pify": "^4.0.1", + "semver": "^5.6.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=6" } }, - "node_modules/make-fetch-happen/node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "devOptional": true, - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" } }, - "node_modules/make-fetch-happen/node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "devOptional": true + }, + "node_modules/make-fetch-happen": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", + "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", "devOptional": true, "dependencies": { - "imurmurhash": "^0.1.4" + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/make-fetch-happen/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true - }, "node_modules/marked": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", @@ -11087,7 +11612,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", - "dev": true, + "devOptional": true, "dependencies": { "minipass": "^7.0.3" }, @@ -11096,40 +11621,22 @@ } }, "node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "devOptional": true, "dependencies": { - "minipass": "^3.1.6", + "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, "optionalDependencies": { "encoding": "^0.1.13" } }, - "node_modules/minipass-fetch/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "devOptional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-fetch/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true - }, "node_modules/minipass-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", @@ -11279,6 +11786,12 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "devOptional": true }, + "node_modules/mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "dev": true + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -11377,7 +11890,7 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "devOptional": true + "dev": true }, "node_modules/mz": { "version": "2.7.0", @@ -11485,50 +11998,51 @@ } }, "node_modules/ng-packagr": { - "version": "16.2.3", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-16.2.3.tgz", - "integrity": "sha512-VTJ7Qtge52+1subkhmF5nOqLNbVutA8/igJ0A5vH6Mgpb8Z/3HeZomtD1SHzZF5Dqp+p+QPHE548FWYu1MdMSQ==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-17.0.2.tgz", + "integrity": "sha512-1bn1Y93d23ZwTjazCdiEEdolYbXPddq4Q1XNhh+CyUgSTMONJhW2Ikpzbt+Z+3uxz0kSAAPBlHTx7uABXbMPPQ==", "dev": true, "dependencies": { - "@rollup/plugin-json": "^6.0.0", - "@rollup/plugin-node-resolve": "^15.0.0", - "ajv": "^8.11.0", + "@rollup/plugin-json": "^6.0.1", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/wasm-node": "^4.5.0", + "ajv": "^8.12.0", "ansi-colors": "^4.1.3", - "autoprefixer": "^10.4.12", - "browserslist": "^4.21.4", + "autoprefixer": "^10.4.16", + "browserslist": "^4.22.1", "cacache": "^18.0.0", "chokidar": "^3.5.3", - "commander": "^11.0.0", + "commander": "^11.1.0", "convert-source-map": "^2.0.0", "dependency-graph": "^0.11.0", - "esbuild-wasm": "^0.19.0", - "fast-glob": "^3.2.12", + "esbuild-wasm": "^0.19.5", + "fast-glob": "^3.3.1", "find-cache-dir": "^3.3.2", "injection-js": "^2.4.0", "jsonc-parser": "^3.2.0", - "less": "^4.1.3", + "less": "^4.2.0", "ora": "^5.1.0", - "piscina": "^4.0.0", - "postcss": "^8.4.16", + "piscina": "^4.1.0", + "postcss": "^8.4.31", "postcss-url": "^10.1.3", - "rollup": "^3.0.0", - "rxjs": "^7.5.6", - "sass": "^1.55.0" + "rxjs": "^7.8.1", + "sass": "^1.69.5" }, "bin": { "ng-packagr": "cli/main.js" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.13.0 || >=20.9.0" }, "optionalDependencies": { - "esbuild": "^0.19.0" + "esbuild": "^0.19.0", + "rollup": "^4.5.0" }, "peerDependencies": { - "@angular/compiler-cli": "^16.0.0 || ^16.2.0-next.0", + "@angular/compiler-cli": "^17.0.0 || ^17.0.0-next.0", "tailwindcss": "^2.0.0 || ^3.0.0", "tslib": "^2.3.0", - "typescript": ">=4.9.3 <5.2" + "typescript": ">=5.2 <5.3" }, "peerDependenciesMeta": { "tailwindcss": { @@ -11537,9 +12051,9 @@ } }, "node_modules/ng-packagr/node_modules/@esbuild/android-arm": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.8.tgz", - "integrity": "sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.9.tgz", + "integrity": "sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==", "cpu": [ "arm" ], @@ -11553,9 +12067,9 @@ } }, "node_modules/ng-packagr/node_modules/@esbuild/android-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.8.tgz", - "integrity": "sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz", + "integrity": "sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==", "cpu": [ "arm64" ], @@ -11569,9 +12083,9 @@ } }, "node_modules/ng-packagr/node_modules/@esbuild/android-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.8.tgz", - "integrity": "sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.9.tgz", + "integrity": "sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==", "cpu": [ "x64" ], @@ -11585,9 +12099,9 @@ } }, "node_modules/ng-packagr/node_modules/@esbuild/darwin-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.8.tgz", - "integrity": "sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz", + "integrity": "sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==", "cpu": [ "arm64" ], @@ -11601,9 +12115,9 @@ } }, "node_modules/ng-packagr/node_modules/@esbuild/darwin-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.8.tgz", - "integrity": "sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz", + "integrity": "sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==", "cpu": [ "x64" ], @@ -11617,9 +12131,9 @@ } }, "node_modules/ng-packagr/node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.8.tgz", - "integrity": "sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz", + "integrity": "sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==", "cpu": [ "arm64" ], @@ -11633,9 +12147,9 @@ } }, "node_modules/ng-packagr/node_modules/@esbuild/freebsd-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.8.tgz", - "integrity": "sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz", + "integrity": "sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==", "cpu": [ "x64" ], @@ -11649,9 +12163,9 @@ } }, "node_modules/ng-packagr/node_modules/@esbuild/linux-arm": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.8.tgz", - "integrity": "sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz", + "integrity": "sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==", "cpu": [ "arm" ], @@ -11665,9 +12179,9 @@ } }, "node_modules/ng-packagr/node_modules/@esbuild/linux-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.8.tgz", - "integrity": "sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz", + "integrity": "sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==", "cpu": [ "arm64" ], @@ -11681,9 +12195,9 @@ } }, "node_modules/ng-packagr/node_modules/@esbuild/linux-ia32": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.8.tgz", - "integrity": "sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz", + "integrity": "sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==", "cpu": [ "ia32" ], @@ -11697,9 +12211,9 @@ } }, "node_modules/ng-packagr/node_modules/@esbuild/linux-loong64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.8.tgz", - "integrity": "sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz", + "integrity": "sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==", "cpu": [ "loong64" ], @@ -11713,9 +12227,9 @@ } }, "node_modules/ng-packagr/node_modules/@esbuild/linux-mips64el": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.8.tgz", - "integrity": "sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz", + "integrity": "sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==", "cpu": [ "mips64el" ], @@ -11729,9 +12243,9 @@ } }, "node_modules/ng-packagr/node_modules/@esbuild/linux-ppc64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.8.tgz", - "integrity": "sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz", + "integrity": "sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==", "cpu": [ "ppc64" ], @@ -11745,9 +12259,9 @@ } }, "node_modules/ng-packagr/node_modules/@esbuild/linux-riscv64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.8.tgz", - "integrity": "sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz", + "integrity": "sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==", "cpu": [ "riscv64" ], @@ -11761,9 +12275,9 @@ } }, "node_modules/ng-packagr/node_modules/@esbuild/linux-s390x": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.8.tgz", - "integrity": "sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz", + "integrity": "sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==", "cpu": [ "s390x" ], @@ -11777,9 +12291,9 @@ } }, "node_modules/ng-packagr/node_modules/@esbuild/linux-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.8.tgz", - "integrity": "sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz", + "integrity": "sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==", "cpu": [ "x64" ], @@ -11793,9 +12307,9 @@ } }, "node_modules/ng-packagr/node_modules/@esbuild/netbsd-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.8.tgz", - "integrity": "sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz", + "integrity": "sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==", "cpu": [ "x64" ], @@ -11809,9 +12323,9 @@ } }, "node_modules/ng-packagr/node_modules/@esbuild/openbsd-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.8.tgz", - "integrity": "sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz", + "integrity": "sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==", "cpu": [ "x64" ], @@ -11825,9 +12339,9 @@ } }, "node_modules/ng-packagr/node_modules/@esbuild/sunos-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.8.tgz", - "integrity": "sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz", + "integrity": "sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==", "cpu": [ "x64" ], @@ -11841,9 +12355,9 @@ } }, "node_modules/ng-packagr/node_modules/@esbuild/win32-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.8.tgz", - "integrity": "sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz", + "integrity": "sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==", "cpu": [ "arm64" ], @@ -11857,9 +12371,9 @@ } }, "node_modules/ng-packagr/node_modules/@esbuild/win32-ia32": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.8.tgz", - "integrity": "sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz", + "integrity": "sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==", "cpu": [ "ia32" ], @@ -11873,9 +12387,9 @@ } }, "node_modules/ng-packagr/node_modules/@esbuild/win32-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.8.tgz", - "integrity": "sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz", + "integrity": "sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==", "cpu": [ "x64" ], @@ -11888,6 +12402,15 @@ "node": ">=12" } }, + "node_modules/ng-packagr/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, "node_modules/ng-packagr/node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -11895,9 +12418,9 @@ "dev": true }, "node_modules/ng-packagr/node_modules/esbuild": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.8.tgz", - "integrity": "sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz", + "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==", "dev": true, "hasInstallScript": true, "optional": true, @@ -11908,40 +12431,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.19.8", - "@esbuild/android-arm64": "0.19.8", - "@esbuild/android-x64": "0.19.8", - "@esbuild/darwin-arm64": "0.19.8", - "@esbuild/darwin-x64": "0.19.8", - "@esbuild/freebsd-arm64": "0.19.8", - "@esbuild/freebsd-x64": "0.19.8", - "@esbuild/linux-arm": "0.19.8", - "@esbuild/linux-arm64": "0.19.8", - "@esbuild/linux-ia32": "0.19.8", - "@esbuild/linux-loong64": "0.19.8", - "@esbuild/linux-mips64el": "0.19.8", - "@esbuild/linux-ppc64": "0.19.8", - "@esbuild/linux-riscv64": "0.19.8", - "@esbuild/linux-s390x": "0.19.8", - "@esbuild/linux-x64": "0.19.8", - "@esbuild/netbsd-x64": "0.19.8", - "@esbuild/openbsd-x64": "0.19.8", - "@esbuild/sunos-x64": "0.19.8", - "@esbuild/win32-arm64": "0.19.8", - "@esbuild/win32-ia32": "0.19.8", - "@esbuild/win32-x64": "0.19.8" - } - }, - "node_modules/ng-packagr/node_modules/esbuild-wasm": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.19.8.tgz", - "integrity": "sha512-+5BhFGjW0+3cC5BEcujYfNaslSEBjF+zFHj4a7xff2LLByCJGok3iCyV9/oHpN8OlZrGlnjSduhY1t1QqU1YBQ==", - "dev": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" + "@esbuild/android-arm": "0.19.9", + "@esbuild/android-arm64": "0.19.9", + "@esbuild/android-x64": "0.19.9", + "@esbuild/darwin-arm64": "0.19.9", + "@esbuild/darwin-x64": "0.19.9", + "@esbuild/freebsd-arm64": "0.19.9", + "@esbuild/freebsd-x64": "0.19.9", + "@esbuild/linux-arm": "0.19.9", + "@esbuild/linux-arm64": "0.19.9", + "@esbuild/linux-ia32": "0.19.9", + "@esbuild/linux-loong64": "0.19.9", + "@esbuild/linux-mips64el": "0.19.9", + "@esbuild/linux-ppc64": "0.19.9", + "@esbuild/linux-riscv64": "0.19.9", + "@esbuild/linux-s390x": "0.19.9", + "@esbuild/linux-x64": "0.19.9", + "@esbuild/netbsd-x64": "0.19.9", + "@esbuild/openbsd-x64": "0.19.9", + "@esbuild/sunos-x64": "0.19.9", + "@esbuild/win32-arm64": "0.19.9", + "@esbuild/win32-ia32": "0.19.9", + "@esbuild/win32-x64": "0.19.9" } }, "node_modules/ng-packagr/node_modules/find-cache-dir": { @@ -11988,6 +12499,36 @@ "node": ">=8" } }, + "node_modules/ng-packagr/node_modules/rollup": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.7.0.tgz", + "integrity": "sha512-7Kw0dUP4BWH78zaZCqF1rPyQ8D5DSU6URG45v1dqS/faNsx9WXyess00uTOZxKr7oR/4TOjO1CPudT8L1UsEgw==", + "dev": true, + "optional": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.7.0", + "@rollup/rollup-android-arm64": "4.7.0", + "@rollup/rollup-darwin-arm64": "4.7.0", + "@rollup/rollup-darwin-x64": "4.7.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.7.0", + "@rollup/rollup-linux-arm64-gnu": "4.7.0", + "@rollup/rollup-linux-arm64-musl": "4.7.0", + "@rollup/rollup-linux-riscv64-gnu": "4.7.0", + "@rollup/rollup-linux-x64-gnu": "4.7.0", + "@rollup/rollup-linux-x64-musl": "4.7.0", + "@rollup/rollup-win32-arm64-msvc": "4.7.0", + "@rollup/rollup-win32-ia32-msvc": "4.7.0", + "@rollup/rollup-win32-x64-msvc": "4.7.0", + "fsevents": "~2.3.2" + } + }, "node_modules/ng-packagr/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -11998,16 +12539,16 @@ } }, "node_modules/ng-qrcode": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/ng-qrcode/-/ng-qrcode-16.0.0.tgz", - "integrity": "sha512-AVp3Tw1bAwqiHzt57x1Rp7YrnzkMUNlww1+ypjGvgbMPRYmy//cHOzMYsH3HPkFDDmPHwGerdAElmIA/X4SBiQ==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/ng-qrcode/-/ng-qrcode-17.0.0.tgz", + "integrity": "sha512-dqnW/VwC4vaS9tIeUG9wlmKrGI8SzcOx9/LeHMbJSbKg1+Gm+MxwSnDbohn88idn4OukO9wscIMFfIj4NyOFnA==", "dependencies": { - "qrcode": "^1.5.1", - "tslib": "^2.4.0" + "qrcode": "^1.5.3", + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular/common": ">=16 <17", - "@angular/core": ">=16 <17" + "@angular/common": ">=17 <18", + "@angular/core": ">=17 <18" } }, "node_modules/nice-napi": { @@ -12079,28 +12620,27 @@ } }, "node_modules/node-gyp": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", - "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.1.tgz", + "integrity": "sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==", "devOptional": true, "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", + "glob": "^10.3.10", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", "semver": "^7.3.5", "tar": "^6.1.2", - "which": "^2.0.2" + "which": "^4.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^12.13 || ^14.13 || >=16" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/node-gyp-build": { @@ -12115,46 +12655,28 @@ "node-gyp-build-test": "build-test.js" } }, - "node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "devOptional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=16" } }, - "node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/node-gyp/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "devOptional": true, "dependencies": { - "brace-expansion": "^1.1.7" + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" }, "engines": { - "node": "*" + "node": "^16.13.0 || >=18.0.0" } }, "node_modules/node-html-parser": { @@ -12261,33 +12783,33 @@ "dev": true }, "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", "devOptional": true, "dependencies": { - "abbrev": "^1.0.0" + "abbrev": "^2.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", + "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", "devOptional": true, "dependencies": { - "hosted-git-info": "^6.0.0", + "hosted-git-info": "^7.0.0", "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/normalize-path": { @@ -12304,257 +12826,102 @@ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-bundled": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", - "devOptional": true, - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-install-checks": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", - "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", - "devOptional": true, - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", - "devOptional": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", - "devOptional": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-packlist": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", - "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", - "devOptional": true, - "dependencies": { - "ignore-walk": "^6.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-pick-manifest": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", - "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", - "devOptional": true, - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch": { - "version": "14.0.5", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", - "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", - "devOptional": true, - "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" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch/node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "devOptional": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm-registry-fetch/node_modules/cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", - "devOptional": true, - "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" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch/node_modules/cacache/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "devOptional": true, - "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=0.10.0" } }, - "node_modules/npm-registry-fetch/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "node_modules/npm-bundled": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", "devOptional": true, "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "npm-normalize-package-bin": "^3.0.0" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/npm-registry-fetch/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "devOptional": true, - "engines": { - "node": ">=12" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", "devOptional": true, "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" + "semver": "^7.1.1" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-registry-fetch/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "devOptional": true, "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-registry-fetch/node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "node_modules/npm-package-arg": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", + "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", "devOptional": true, "dependencies": { - "minipass": "^3.0.0" + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" }, "engines": { - "node": ">= 8" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm-registry-fetch/node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/npm-packlist": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.1.tgz", + "integrity": "sha512-MQpL27ZrsJQ2kiAuQPpZb5LtJwydNRnI15QWXsf3WHERu4rzjRj6Zju/My2fov7tLuu3Gle/uoIX/DDZ3u4O4Q==", "devOptional": true, "dependencies": { - "yallist": "^4.0.0" + "ignore-walk": "^6.0.4" }, "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "node_modules/npm-pick-manifest": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz", + "integrity": "sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==", "devOptional": true, "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm-registry-fetch/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "node_modules/npm-registry-fetch": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.1.0.tgz", + "integrity": "sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==", "devOptional": true, + "dependencies": { + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^3.0.0" + }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm-registry-fetch/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true - }, "node_modules/npm-run-path": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", @@ -12582,21 +12949,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "devOptional": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -12609,12 +12961,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", - "dev": true - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -12640,15 +12986,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-path": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", - "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", - "dev": true, - "engines": { - "node": ">= 10.12.0" - } - }, "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -12656,9 +12993,9 @@ "dev": true }, "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "dev": true, "dependencies": { "ee-first": "1.1.1" @@ -12734,6 +13071,33 @@ "opener": "bin/opener-bin.js" } }, + "node_modules/openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", + "dev": true + }, + "node_modules/opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opn/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -12987,27 +13351,27 @@ "dev": true }, "node_modules/pacote": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", - "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.4.tgz", + "integrity": "sha512-eGdLHrV/g5b5MtD5cTPyss+JxOlaOloSMG3UwPMAvL8ywaLJ6beONPF40K4KKl/UI6q5hTKCJq5rCu8tkF+7Dg==", "devOptional": true, "dependencies": { - "@npmcli/git": "^4.0.0", + "@npmcli/git": "^5.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", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^7.0.0", + "cacache": "^18.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", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^16.0.0", "proc-log": "^3.0.0", "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", + "read-package-json": "^7.0.0", "read-package-json-fast": "^3.0.0", - "sigstore": "^1.3.0", + "sigstore": "^2.0.0", "ssri": "^10.0.0", "tar": "^6.1.11" }, @@ -13015,89 +13379,9 @@ "pacote": "lib/bin.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/pacote/node_modules/cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", - "devOptional": true, - "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" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/pacote/node_modules/cacache/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "devOptional": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/pacote/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "devOptional": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/pacote/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "devOptional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pacote/node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "devOptional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/pacote/node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "devOptional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/pacote/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true - }, "node_modules/pako": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", @@ -13350,9 +13634,9 @@ } }, "node_modules/piscina": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.0.0.tgz", - "integrity": "sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.1.0.tgz", + "integrity": "sha512-sjbLMi3sokkie+qmtZpkfMCUJTpbxJm/wvaPzU28vmYSsTSW8xk9JcFUsbqGJdtPpIQ9tuj+iDcTtgZjwnOSig==", "dev": true, "dependencies": { "eventemitter-asyncresource": "^1.0.0", @@ -13477,6 +13761,20 @@ "node": ">=10.13.0" } }, + "node_modules/portscanner": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", + "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", + "dev": true, + "dependencies": { + "async": "^2.6.0", + "is-number-like": "^1.0.3" + }, + "engines": { + "node": ">=0.4", + "npm": ">=1.0.0" + } + }, "node_modules/postcss": { "version": "8.4.32", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", @@ -13808,15 +14106,15 @@ } }, "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -13944,12 +14242,6 @@ "dev": true, "optional": true }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -14091,12 +14383,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -14249,18 +14535,18 @@ } }, "node_modules/read-package-json": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", - "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.0.tgz", + "integrity": "sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==", "devOptional": true, "dependencies": { "glob": "^10.2.2", "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", + "normalize-package-data": "^6.0.0", "npm-normalize-package-bin": "^3.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/read-package-json-fast": { @@ -14343,9 +14629,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", "dev": true }, "node_modules/regenerator-transform": { @@ -14429,11 +14715,11 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -14480,17 +14766,67 @@ "json5": "^2.1.2" }, "engines": { - "node": ">=8.9.0" + "node": ">=8.9.0" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==", + "dev": true, + "dependencies": { + "debug": "^2.2.0", + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/resp-modifier/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/resp-modifier/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/resp-modifier/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "node_modules/resolve-url-loader/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/resp-modifier/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/restore-cursor": { "version": "3.1.0", @@ -14554,7 +14890,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "devOptional": true, + "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -14569,7 +14905,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -14579,7 +14915,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "devOptional": true, + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -14599,7 +14935,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "devOptional": true, + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -14645,7 +14981,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.12.0" } @@ -14672,6 +15008,12 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==", + "dev": true + }, "node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -14706,9 +15048,9 @@ "devOptional": true }, "node_modules/sass": { - "version": "1.64.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", - "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", + "version": "1.69.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", + "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -14765,18 +15107,6 @@ "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", "dev": true }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/schema-utils": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", @@ -14867,24 +15197,24 @@ "devOptional": true }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "dev": true, "dependencies": { "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", + "depd": "~1.1.2", + "destroy": "~1.0.4", "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" + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" }, "engines": { "node": ">= 0.8.0" @@ -14899,18 +15229,66 @@ "ms": "2.0.0" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { + "node_modules/send/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/send/node_modules/mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true, + "bin": { + "mime": "cli.js" + } + }, + "node_modules/send/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "node_modules/send/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true }, + "node_modules/send/node_modules/statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/serialize-javascript": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", @@ -14999,20 +15377,26 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "dev": true, "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" + "parseurl": "~1.3.2", + "send": "0.16.2" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", + "dev": true + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -15022,7 +15406,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dev": true, + "devOptional": true, "dependencies": { "define-data-property": "^1.1.1", "get-intrinsic": "^1.2.1", @@ -15113,161 +15497,20 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/sigstore": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", - "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", - "devOptional": true, - "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" - }, - "bin": { - "sigstore": "bin/sigstore.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/sigstore/node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "devOptional": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sigstore/node_modules/cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", - "devOptional": true, - "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" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/sigstore/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "devOptional": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/sigstore/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "devOptional": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/sigstore/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "devOptional": true, - "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" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/sigstore/node_modules/make-fetch-happen/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "devOptional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/sigstore/node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "devOptional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/sigstore/node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "devOptional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sigstore/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.1.0.tgz", + "integrity": "sha512-kPIj+ZLkyI3QaM0qX8V/nSsweYND3W448pwkDgS6CQ74MfhEkIR8ToK5Iyx46KJYRjseVcD3Rp9zAmUAj6ZjPw==", "devOptional": true, "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "@sigstore/bundle": "^2.1.0", + "@sigstore/protobuf-specs": "^0.2.1", + "@sigstore/sign": "^2.1.0", + "@sigstore/tuf": "^2.1.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/sigstore/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true - }, "node_modules/sirv": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", @@ -15354,6 +15597,82 @@ "npm": ">= 3.0.0" } }, + "node_modules/socket.io": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.2.tgz", + "integrity": "sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==", + "dev": true, + "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" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dev": true, + "dependencies": { + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/socket.io-client": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz", + "integrity": "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -15380,17 +15699,29 @@ } }, "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", "devOptional": true, "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" }, "engines": { - "node": ">= 10" + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "devOptional": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" } }, "node_modules/source-map": { @@ -15610,6 +15941,28 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", + "dev": true, + "dependencies": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + }, + "bin": { + "throttleproxy": "bin/throttleproxy.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/stream-throttle/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -15865,12 +16218,6 @@ "node": ">=0.10" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, "node_modules/tailwindcss": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.6.tgz", @@ -15984,9 +16331,9 @@ "devOptional": true }, "node_modules/terser": { - "version": "5.19.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", - "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", + "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -16180,7 +16527,7 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "devOptional": true + "dev": true }, "node_modules/thunky": { "version": "1.1.0", @@ -16238,42 +16585,6 @@ "node": ">=6" } }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -16522,156 +16833,19 @@ "dev": true }, "node_modules/tuf-js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", - "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.1.0.tgz", + "integrity": "sha512-eD7YPPjVlMzdggrOeE8zwoegUaG/rt6Bt3jwoQPunRiNVzgcCE009UDFJKJjG+Gk9wFu6W/Vi+P5d/5QpdD9jA==", "devOptional": true, "dependencies": { - "@tufjs/models": "1.0.4", + "@tufjs/models": "2.0.0", "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/tuf-js/node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "devOptional": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/tuf-js/node_modules/cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", - "devOptional": true, - "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" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/tuf-js/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "devOptional": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tuf-js/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "devOptional": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/tuf-js/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "devOptional": true, - "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" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/tuf-js/node_modules/make-fetch-happen/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "devOptional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tuf-js/node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "devOptional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tuf-js/node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "devOptional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tuf-js/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", - "devOptional": true, - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "make-fetch-happen": "^13.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/tuf-js/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true - }, "node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -16725,9 +16899,9 @@ } }, "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "devOptional": true, "bin": { "tsc": "bin/tsc", @@ -16737,6 +16911,41 @@ "node": ">=14.17" } }, + "node_modules/ua-parser-js": { + "version": "1.0.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", + "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/undici": { + "version": "5.27.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.27.2.tgz", + "integrity": "sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==", + "dev": true, + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -16872,16 +17081,6 @@ "punycode": "^2.1.0" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -16942,14 +17141,14 @@ } }, "node_modules/vite": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.7.tgz", - "integrity": "sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz", + "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==", "dev": true, "dependencies": { "esbuild": "^0.18.10", - "postcss": "^8.4.26", - "rollup": "^3.25.2" + "postcss": "^8.4.27", + "rollup": "^3.27.1" }, "bin": { "vite": "bin/vite.js" @@ -17022,28 +17221,6 @@ "node": ">=0.4.0" } }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -17074,21 +17251,11 @@ "defaults": "^1.0.3" } }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "engines": { - "node": ">=10.4" - } - }, "node_modules/webpack": { "version": "5.89.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", "dev": true, - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -17275,6 +17442,15 @@ } } }, + "node_modules/webpack-dev-server/node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", @@ -17299,9 +17475,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.15.0.tgz", + "integrity": "sha512-H/Z3H55mrcrgjFwI+5jKavgXvwQLtfPCUEp6pi35VhoB0pfcHnSoyuTzkBEZpzq49g1193CUEwIvmsjcotenYw==", "dev": true, "engines": { "node": ">=10.0.0" @@ -17320,12 +17496,13 @@ } }, "node_modules/webpack-merge": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", - "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", + "flat": "^5.0.2", "wildcard": "^2.0.0" }, "engines": { @@ -17366,15 +17543,13 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/webpack/node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -17391,7 +17566,6 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "peer": true, "peerDependencies": { "ajv": "^6.9.1" } @@ -17400,15 +17574,13 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/webpack/node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, - "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -17445,40 +17617,11 @@ "node": ">=0.8.0" } }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "dependencies": { - "iconv-lite": "0.4.24" - } - }, "node_modules/whatwg-fetch": { "version": "3.6.19", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==" }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -17508,15 +17651,6 @@ "node": ">=4" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "devOptional": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", @@ -17790,17 +17924,14 @@ } } }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true + "node_modules/xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } }, "node_modules/xregexp": { "version": "2.0.0", @@ -17892,9 +18023,9 @@ } }, "node_modules/zone.js": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.3.tgz", - "integrity": "sha512-MKPbmZie6fASC/ps4dkmIhaT5eonHkEt6eAy80K42tAm0G2W+AahLJjbfi6X9NPdciOE9GRFTTM8u2IiF6O3ww==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.2.tgz", + "integrity": "sha512-X4U7J1isDhoOmHmFWiLhloWc2lzMkdnumtfQ1LXzf/IOZp5NQYuMUTaviVzG/q1ugMBIXzin2AqeVJUoSEkNyQ==", "dependencies": { "tslib": "^2.3.0" } diff --git a/web/package.json b/web/package.json index c82dc774e..d2a401bd3 100644 --- a/web/package.json +++ b/web/package.json @@ -30,17 +30,17 @@ "build-config": "node build-config.js" }, "dependencies": { - "@angular/animations": "^16.1.4", - "@angular/cdk": "^16.1.4", - "@angular/common": "^16.1.4", - "@angular/compiler": "^16.1.4", - "@angular/core": "^16.1.4", - "@angular/forms": "^16.1.4", - "@angular/platform-browser": "^16.1.4", - "@angular/platform-browser-dynamic": "^16.1.4", - "@angular/pwa": "^16.1.4", - "@angular/router": "^16.1.4", - "@angular/service-worker": "^16.1.4", + "@angular/animations": "^17.0.6", + "@angular/cdk": "^17.0.3", + "@angular/common": "^17.0.6", + "@angular/compiler": "^17.0.6", + "@angular/core": "^17.0.6", + "@angular/forms": "^17.0.6", + "@angular/platform-browser": "^17.0.6", + "@angular/platform-browser-dynamic": "^17.0.6", + "@angular/pwa": "^17.0.6", + "@angular/router": "^17.0.6", + "@angular/service-worker": "^17.0.6", "@ionic/angular": "^6.1.15", "@materia-ui/ngx-monaco-editor": "^6.0.0", "@start9labs/argon2": "^0.1.0", @@ -71,7 +71,7 @@ "marked": "^4.0.0", "monaco-editor": "^0.33.0", "mustache": "^4.2.0", - "ng-qrcode": "^16.0.0", + "ng-qrcode": "^17.0.0", "node-jose": "^2.1.1", "patch-db-client": "file: ../../../patch-db/client", "pbkdf2": "^3.1.2", @@ -81,13 +81,13 @@ "ts-matches": "^5.2.1", "tslib": "^2.3.0", "uuid": "^8.3.2", - "zone.js": "^0.13.1" + "zone.js": "^0.14.2" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.1.4", - "@angular/cli": "^16.1.4", - "@angular/compiler-cli": "^16.1.4", - "@angular/language-service": "^16.1.4", + "@angular-devkit/build-angular": "^17.0.6", + "@angular/cli": "^17.0.6", + "@angular/compiler-cli": "^17.0.6", + "@angular/language-service": "^17.0.6", "@ionic/cli": "^6.19.0", "@types/dompurify": "^2.3.3", "@types/estree": "^0.0.51", @@ -101,14 +101,14 @@ "autoprefixer": "^10.4.14", "husky": "^4.3.8", "lint-staged": "^13.2.0", - "ng-packagr": "^16.1.0", + "ng-packagr": "^17.0.2", "node-html-parser": "^5.3.3", "postcss": "^8.4.21", - "prettier": "^2.6.1", + "prettier": "^3.1.1", "raw-loader": "^4.0.2", "ts-node": "^10.7.0", "tslint": "^6.1.3", - "typescript": "^5.1.6", + "typescript": "^5.2.2", "webpack-bundle-analyzer": "^4.8.0" }, "husky": { diff --git a/web/projects/install-wizard/src/polyfills.ts b/web/projects/install-wizard/src/polyfills.ts deleted file mode 100644 index 4437ced44..000000000 --- a/web/projects/install-wizard/src/polyfills.ts +++ /dev/null @@ -1,64 +0,0 @@ -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/guide/browser-support - */ - -/*************************************************************************************************** - * BROWSER POLYFILLS - */ - -/** IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. - -/** - * Web Animations `@angular/platform-browser/animations` - * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. - * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). - */ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - -/** - * By default, zone.js will patch all possible macroTask and DomEvents - * user can disable parts of macroTask/DomEvents patch by setting following flags - * because those flags need to be set before `zone.js` being loaded, and webpack - * will put import in the top of bundle, so user need to create a separate file - * in this directory (for example: zone-flags.ts), and put the following flags - * into that file, and then add the following code before importing zone.js. - * import './zone-flags'; - * - * The flags allowed in zone-flags.ts are listed here. - * - * The following flags will work for all browsers. - * - * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame - * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick - * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames - * - * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js - * with the following flag, it will bypass `zone.js` patch for IE/Edge - * - * (window as any).__Zone_enable_cross_context_check = true; - * - */ - -import './zone-flags' - -/*************************************************************************************************** - * Zone JS is required by default for Angular itself. - */ -import 'zone.js/dist/zone' // Included with Angular CLI. - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ diff --git a/web/projects/install-wizard/src/zone-flags.ts b/web/projects/install-wizard/src/zone-flags.ts deleted file mode 100644 index 24ca60fe2..000000000 --- a/web/projects/install-wizard/src/zone-flags.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Prevents Angular change detection from - * running with certain Web Component callbacks - */ -// eslint-disable-next-line no-underscore-dangle -(window as any).__Zone_disable_customElements = true diff --git a/web/projects/install-wizard/tsconfig.json b/web/projects/install-wizard/tsconfig.json index f642f09b3..c1643dea3 100644 --- a/web/projects/install-wizard/tsconfig.json +++ b/web/projects/install-wizard/tsconfig.json @@ -4,6 +4,6 @@ "compilerOptions": { "baseUrl": "./" }, - "files": ["src/main.ts", "src/polyfills.ts"], + "files": ["src/main.ts"], "include": ["src/**/*.d.ts"] } diff --git a/web/projects/setup-wizard/src/polyfills.ts b/web/projects/setup-wizard/src/polyfills.ts deleted file mode 100644 index 219f4a27d..000000000 --- a/web/projects/setup-wizard/src/polyfills.ts +++ /dev/null @@ -1,65 +0,0 @@ -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/guide/browser-support - */ - -/*************************************************************************************************** - * BROWSER POLYFILLS - */ - -/** IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. - -/** - * Web Animations `@angular/platform-browser/animations` - * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. - * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). - */ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - -/** - * By default, zone.js will patch all possible macroTask and DomEvents - * user can disable parts of macroTask/DomEvents patch by setting following flags - * because those flags need to be set before `zone.js` being loaded, and webpack - * will put import in the top of bundle, so user need to create a separate file - * in this directory (for example: zone-flags.ts), and put the following flags - * into that file, and then add the following code before importing zone.js. - * import './zone-flags'; - * - * The flags allowed in zone-flags.ts are listed here. - * - * The following flags will work for all browsers. - * - * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame - * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick - * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames - * - * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js - * with the following flag, it will bypass `zone.js` patch for IE/Edge - * - * (window as any).__Zone_enable_cross_context_check = true; - * - */ - -import './zone-flags' - -/*************************************************************************************************** - * Zone JS is required by default for Angular itself. - */ -import 'zone.js/dist/zone' // Included with Angular CLI. - - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ diff --git a/web/projects/setup-wizard/src/zone-flags.ts b/web/projects/setup-wizard/src/zone-flags.ts deleted file mode 100644 index 24ca60fe2..000000000 --- a/web/projects/setup-wizard/src/zone-flags.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Prevents Angular change detection from - * running with certain Web Component callbacks - */ -// eslint-disable-next-line no-underscore-dangle -(window as any).__Zone_disable_customElements = true diff --git a/web/projects/setup-wizard/tsconfig.json b/web/projects/setup-wizard/tsconfig.json index f642f09b3..c1643dea3 100644 --- a/web/projects/setup-wizard/tsconfig.json +++ b/web/projects/setup-wizard/tsconfig.json @@ -4,6 +4,6 @@ "compilerOptions": { "baseUrl": "./" }, - "files": ["src/main.ts", "src/polyfills.ts"], + "files": ["src/main.ts"], "include": ["src/**/*.d.ts"] } diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/email/email.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/email/email.component.ts index 4a006e165..f70e30f2a 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/email/email.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/email/email.component.ts @@ -47,7 +47,7 @@ import { EmailInfoComponent } from './info.component' [(ngModel)]="testAddress" [ngModelOptions]="{ standalone: true }" > - Firstname Lastname <email@example.com> + Firstname Lastname <email@example.com>
    diff --git a/web/projects/ui/src/app/apps/ui/pages/system/email/email.page.html b/web/projects/ui/src/app/apps/ui/pages/system/email/email.page.html index 4ccb053d9..6159b8cfe 100644 --- a/web/projects/ui/src/app/apps/ui/pages/system/email/email.page.html +++ b/web/projects/ui/src/app/apps/ui/pages/system/email/email.page.html @@ -44,7 +44,7 @@ [(ngModel)]="testAddress" [ngModelOptions]="{standalone: true}" > - Firstname Lastname <email@example.com> + Firstname Lastname <email@example.com>
    diff --git a/web/projects/ui/src/main.ts b/web/projects/ui/src/main.ts index 3d8855b64..52e051587 100644 --- a/web/projects/ui/src/main.ts +++ b/web/projects/ui/src/main.ts @@ -4,9 +4,12 @@ import { platformBrowserDynamic } from '@angular/platform-browser-dynamic' import { AppModule } from './app/app.module' import { environment } from './environments/environment' +; (window as any).global = window + if (environment.production) { enableProdMode() } -platformBrowserDynamic().bootstrapModule(AppModule) +platformBrowserDynamic() + .bootstrapModule(AppModule) .catch(err => console.error(err)) diff --git a/web/projects/ui/src/polyfills.ts b/web/projects/ui/src/polyfills.ts deleted file mode 100644 index a392d45cf..000000000 --- a/web/projects/ui/src/polyfills.ts +++ /dev/null @@ -1,68 +0,0 @@ -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/guide/browser-support - */ - -/*************************************************************************************************** - * BROWSER POLYFILLS - */ - -/** IE10 and IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. - -/** - * Web Animations `@angular/platform-browser/animations` - * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. - * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). - */ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - -/** - * By default, zone.js will patch all possible macroTask and DomEvents - * user can disable parts of macroTask/DomEvents patch by setting following flags - * because those flags need to be set before `zone.js` being loaded, and webpack - * will put import in the top of bundle, so user need to create a separate file - * in this directory (for example: zone-flags.ts), and put the following flags - * into that file, and then add the following code before importing zone.js. - * import './zone-flags.ts'; - * - * The flags allowed in zone-flags.ts are listed here. - * - * The following flags will work for all browsers. - * - * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame - * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick - * (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames - * - * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js - * with the following flag, it will bypass `zone.js` patch for IE/Edge - * - * (window as any).__Zone_enable_cross_context_check = true; - * - */ - -(window as any).global = window -; (window as any).process = { env: { DEBUG: undefined }, browser: true } - -import './zone-flags' - -/*************************************************************************************************** - * Zone JS is required by default for Angular itself. - */ - -import 'zone.js/dist/zone' // Included with Angular CLI. - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ diff --git a/web/projects/ui/src/zone-flags.ts b/web/projects/ui/src/zone-flags.ts deleted file mode 100644 index 07aca7176..000000000 --- a/web/projects/ui/src/zone-flags.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Prevents Angular change detection from - * running with certain Web Component callbacks - */ -(window as any).__Zone_disable_customElements = true diff --git a/web/projects/ui/tsconfig.json b/web/projects/ui/tsconfig.json index ea09595fb..6978bd46f 100644 --- a/web/projects/ui/tsconfig.json +++ b/web/projects/ui/tsconfig.json @@ -3,6 +3,6 @@ "compilerOptions": { "baseUrl": "./" }, - "files": ["src/main.ts", "src/polyfills.ts"], + "files": ["src/main.ts"], "include": ["src/**/*.d.ts"] } From e47f126bd5f930d8ce5b556388cb82dcc8c32ffe Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Tue, 19 Dec 2023 01:43:59 +0400 Subject: [PATCH 040/169] feat(portal): refactor marketplace for new portal (#2539) * feat(portal): refactor marketplace for new portal * fix background position * chore: refactor sidebar * chore: small fix --------- Co-authored-by: Lucy Cifferello <12953208+elvece@users.noreply.github.com> --- .../src/components/menu/menu.component.html | 2 +- .../src/components/menu/menu.component.scss | 13 ++ .../src/components/menu/menu.component.ts | 5 - web/projects/shared/styles/taiga.scss | 106 +++------ .../components/card/card.component.html | 6 +- .../portal/components/card/card.component.ts | 9 +- .../navigation/navigation.component.html | 8 +- .../navigation/navigation.component.ts | 6 +- .../apps/portal/constants/system-utilities.ts | 14 +- .../service/components/menu.component.ts | 34 ++- .../routes/service/pipes/to-menu.pipe.ts | 24 +- .../components/controls.component.ts | 189 +++++++++++++++ .../marketplace/components/menu.component.ts | 47 ++++ .../components/notification.component.ts | 77 ++++++ .../components/registry.component.ts | 37 +++ .../components/sidebars.component.ts | 30 +++ .../marketplace/components/tile.component.ts | 111 +++++++++ .../marketplace/marketplace.component.ts | 89 +++++++ .../system/marketplace/marketplace.routes.ts | 12 + .../marketplace/modals/preview.component.ts | 98 ++++++++ .../marketplace/modals/registry.component.ts | 221 ++++++++++++++++++ .../system/marketplace/pipes/to-local.pipe.ts | 17 ++ .../marketplace/services/alerts.service.ts | 84 +++++++ .../marketplace/services/sidebar.service.ts | 5 + .../system/marketplace/utils/registry.ts | 50 ++++ .../system/sideload/package.component.ts | 11 +- .../portal/routes/system/system.module.ts | 6 + .../updates/components/item.component.ts | 21 +- .../marketplace-show-controls.component.ts | 10 +- .../marketplace-show-preview.module.ts | 2 +- .../services/api/embassy-mock-api.service.ts | 6 +- web/projects/ui/src/styles.scss | 6 +- 32 files changed, 1201 insertions(+), 155 deletions(-) create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/marketplace/components/controls.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/marketplace/components/menu.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/marketplace/components/notification.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/marketplace/components/registry.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/marketplace/components/sidebars.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/marketplace/components/tile.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/marketplace/marketplace.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/marketplace/marketplace.routes.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/marketplace/modals/preview.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/marketplace/modals/registry.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/marketplace/pipes/to-local.pipe.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/marketplace/services/alerts.service.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/marketplace/services/sidebar.service.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/marketplace/utils/registry.ts diff --git a/web/projects/marketplace/src/components/menu/menu.component.html b/web/projects/marketplace/src/components/menu/menu.component.html index d1a8bac4e..84170e4c1 100644 --- a/web/projects/marketplace/src/components/menu/menu.component.html +++ b/web/projects/marketplace/src/components/menu/menu.component.html @@ -1,5 +1,5 @@
    - +
    `, standalone: true, diff --git a/web/projects/ui/src/app/apps/portal/routes/system/system.module.ts b/web/projects/ui/src/app/apps/portal/routes/system/system.module.ts index dc6f224ad..c8000e851 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/system.module.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/system.module.ts @@ -11,6 +11,12 @@ const ROUTES: Routes = [ import('./backups/backups.component').then(m => m.BackupsComponent), data: toNavigationItem('/portal/system/backups'), }, + { + title: systemTabResolver, + path: 'marketplace', + loadChildren: () => import('./marketplace/marketplace.routes'), + data: toNavigationItem('/portal/system/marketplace'), + }, { title: systemTabResolver, path: 'settings', diff --git a/web/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts index e5e2dfb82..22aeb6b4e 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/updates/components/item.component.ts @@ -16,9 +16,12 @@ import { TuiDialogService, TuiLinkModule, TuiLoaderModule, - TuiSvgModule, } from '@taiga-ui/core' -import { TuiAvatarModule, TuiButtonModule } from '@taiga-ui/experimental' +import { + TuiAvatarModule, + TuiButtonModule, + TuiIconModule, +} from '@taiga-ui/experimental' import { TUI_PROMPT, TuiAccordionModule, @@ -35,27 +38,25 @@ import { InstallProgressPipe } from '../pipes/install-progress.pipe' template: `
    - +
    {{ marketplacePkg.manifest.title }}
    {{ localPkg.manifest.version || '' | displayEmver }} - + {{ marketplacePkg.manifest.version | displayEmver }}
    -
    - {{ errors }} -
    +
    {{ errors }}
    + />
    @@ -116,7 +117,7 @@ import { InstallProgressPipe } from '../pipes/install-progress.pipe' TuiProgressModule, TuiAccordionModule, TuiAvatarModule, - TuiSvgModule, + TuiIconModule, TuiButtonModule, TuiLinkModule, TuiLoaderModule, diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/components/marketplace-show-controls.component.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/components/marketplace-show-controls.component.ts index 98d89492a..8bf8b0548 100644 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/components/marketplace-show-controls.component.ts +++ b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/components/marketplace-show-controls.component.ts @@ -44,7 +44,7 @@ import { CommonModule } from '@angular/common' import { IonicModule } from '@ionic/angular' import { RouterModule } from '@angular/router' -import { TuiButtonModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' @Component({ selector: 'marketplace-show-controls', @@ -67,7 +67,7 @@ import { TuiButtonModule } from '@taiga-ui/core' type="button" class="mr-2" appearance="warning-solid" - *ngIf="(localVersion | compareEmver : pkg.manifest.version) === -1" + *ngIf="(localVersion | compareEmver: pkg.manifest.version) === -1" (click)="tryInstall()" > Update @@ -77,7 +77,7 @@ import { TuiButtonModule } from '@taiga-ui/core' type="button" class="mr-2" appearance="secondary-solid" - *ngIf="(localVersion | compareEmver : pkg.manifest.version) === 1" + *ngIf="(localVersion | compareEmver: pkg.manifest.version) === 1" (click)="tryInstall()" > Downgrade @@ -88,7 +88,7 @@ import { TuiButtonModule } from '@taiga-ui/core' type="button" class="mr-2" appearance="tertiary-solid" - *ngIf="(localVersion | compareEmver : pkg.manifest.version) === 0" + *ngIf="(localVersion | compareEmver: pkg.manifest.version) === 0" (click)="tryInstall()" > Reinstall @@ -101,7 +101,7 @@ import { TuiButtonModule } from '@taiga-ui/core' + + + `, + styles: [ + ` + .title { + margin: 0; + padding: 0 0.5rem 0.25rem; + white-space: nowrap; + font: var(--tui-font-text-l); + font-weight: bold; + } + + .item { + justify-content: flex-start; + gap: 0.75rem; + } + + .icon { + opacity: var(--tui-disabled-opacity); + } + `, + ], + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [TuiDataListModule, CommonModule, TuiIconModule], +}) +export class ActionsComponent { + @Input() + actions: Record = {} + + asIsOrder(a: any, b: any) { + return 0 + } +} diff --git a/web/projects/ui/src/app/apps/portal/components/actions/actions.component.html b/web/projects/ui/src/app/apps/portal/components/actions/actions.component.html deleted file mode 100644 index 9be2e154e..000000000 --- a/web/projects/ui/src/app/apps/portal/components/actions/actions.component.html +++ /dev/null @@ -1,17 +0,0 @@ - -

    - - - -
    diff --git a/web/projects/ui/src/app/apps/portal/components/actions/actions.component.scss b/web/projects/ui/src/app/apps/portal/components/actions/actions.component.scss deleted file mode 100644 index 2cfd2d78a..000000000 --- a/web/projects/ui/src/app/apps/portal/components/actions/actions.component.scss +++ /dev/null @@ -1,16 +0,0 @@ -.title { - margin: 0; - padding: 0 0.5rem 0.25rem; - white-space: nowrap; - font: var(--tui-font-text-l); - font-weight: bold; -} - -.item { - justify-content: flex-start; - gap: 0.75rem; -} - -.icon { - opacity: var(--tui-disabled-opacity); -} diff --git a/web/projects/ui/src/app/apps/portal/components/actions/actions.component.ts b/web/projects/ui/src/app/apps/portal/components/actions/actions.component.ts deleted file mode 100644 index d560545a7..000000000 --- a/web/projects/ui/src/app/apps/portal/components/actions/actions.component.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { ChangeDetectionStrategy, Component, Input } from '@angular/core' -import { TuiDataListModule, TuiSvgModule } from '@taiga-ui/core' -import { CommonModule } from '@angular/common' - -export interface Action { - icon: string - label: string - action: () => void -} - -@Component({ - selector: 'app-actions', - templateUrl: './actions.component.html', - styleUrls: ['./actions.component.scss'], - standalone: true, - changeDetection: ChangeDetectionStrategy.OnPush, - imports: [TuiDataListModule, TuiSvgModule, CommonModule], -}) -export class ActionsComponent { - @Input() - actions: Record = {} - - asIsOrder(a: any, b: any) { - return 0 - } -} diff --git a/web/projects/ui/src/app/apps/portal/components/card.component.ts b/web/projects/ui/src/app/apps/portal/components/card.component.ts new file mode 100644 index 000000000..ac89aca04 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/components/card.component.ts @@ -0,0 +1,158 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + HostListener, + inject, + Input, +} from '@angular/core' +import { + TuiBadgedContentModule, + TuiBadgeNotificationModule, + TuiButtonModule, + TuiIconModule, +} from '@taiga-ui/experimental' +import { RouterLink } from '@angular/router' +import { TickerModule } from '@start9labs/shared' +import { TuiDataListModule, TuiHostedDropdownModule } from '@taiga-ui/core' +import { NavigationService } from '../services/navigation.service' +import { Action, ActionsComponent } from './actions.component' +import { toRouterLink } from '../utils/to-router-link' + +@Component({ + selector: '[appCard]', + template: ` + + + @if (badge) { + + {{ badge }} + + } + @if (icon?.startsWith('tuiIcon')) { + + } @else { + + } + + + + @if (isService) { + + + + + + {{ title }} + + + + + } + `, + styles: [ + ` + :host { + display: flex; + height: 5.5rem; + width: 12.5rem; + border-radius: var(--tui-radius-l); + overflow: hidden; + box-shadow: 0 0.25rem 0.25rem rgb(0 0 0 / 25%); + // TODO: Theme + background: rgb(111 109 109); + } + + .link { + display: flex; + flex: 1; + flex-direction: column; + align-items: center; + justify-content: center; + color: white; + gap: 0.25rem; + padding: 0 0.5rem; + font: var(--tui-font-text-m); + white-space: nowrap; + overflow: hidden; + } + + .icon { + width: 2.5rem; + height: 2.5rem; + border-radius: 100%; + color: var(--tui-text-01-night); + } + + .side { + width: 3rem; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 0.25rem 0.25rem rgb(0 0 0 / 25%); + // TODO: Theme + background: #4b4a4a; + } + `, + ], + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + CommonModule, + RouterLink, + TuiButtonModule, + TuiHostedDropdownModule, + TuiDataListModule, + TuiIconModule, + TickerModule, + TuiBadgedContentModule, + TuiBadgeNotificationModule, + ActionsComponent, + ], +}) +export class CardComponent { + private readonly navigation = inject(NavigationService) + + @Input({ required: true }) + id!: string + + @Input({ required: true }) + icon!: string + + @Input({ required: true }) + title!: string + + @Input() + actions: Record = {} + + @Input() + badge: number | null = null + + get isService(): boolean { + return !this.id.includes('/') + } + + @HostListener('click') + onClick() { + const { id, icon, title } = this + const routerLink = toRouterLink(id) + + this.navigation.addTab({ icon, title, routerLink }) + } + + // Prevents Firefox from starting a native drag + @HostListener('pointerdown.prevent') + onDown() {} +} diff --git a/web/projects/ui/src/app/apps/portal/components/card/card.component.html b/web/projects/ui/src/app/apps/portal/components/card/card.component.html deleted file mode 100644 index 3c092b3f7..000000000 --- a/web/projects/ui/src/app/apps/portal/components/card/card.component.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - {{ badge }} - - - - - - - - - - - - - - {{ title }} - - - - diff --git a/web/projects/ui/src/app/apps/portal/components/card/card.component.scss b/web/projects/ui/src/app/apps/portal/components/card/card.component.scss deleted file mode 100644 index 8cddd4339..000000000 --- a/web/projects/ui/src/app/apps/portal/components/card/card.component.scss +++ /dev/null @@ -1,49 +0,0 @@ -:host { - display: flex; - height: 5.5rem; - width: 12.5rem; - border-radius: var(--tui-radius-l); - overflow: hidden; - box-shadow: 0 0.25rem 0.25rem rgb(0 0 0 / 25%); - // TODO: Theme - background: rgb(111 109 109); -} - -.link { - display: flex; - flex: 1; - flex-direction: column; - align-items: center; - justify-content: center; - color: white; - gap: 0.25rem; - padding: 0 0.5rem; - font: var(--tui-font-text-m); - white-space: nowrap; - overflow: hidden; -} - -.icon { - width: 2.5rem; - height: 2.5rem; - border-radius: 100%; - color: var(--tui-text-01-night); -} - -tui-svg.icon { - transform: scale(1.5); -} - -.title { - max-width: 100%; -} - -.side { - width: 3rem; - display: flex; - align-items: center; - justify-content: center; - box-shadow: 0 0.25rem 0.25rem rgb(0 0 0 / 25%); - // TODO: Theme - background: #4b4a4a; -} diff --git a/web/projects/ui/src/app/apps/portal/components/card/card.component.ts b/web/projects/ui/src/app/apps/portal/components/card/card.component.ts deleted file mode 100644 index 4138aca3c..000000000 --- a/web/projects/ui/src/app/apps/portal/components/card/card.component.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { CommonModule } from '@angular/common' -import { - ChangeDetectionStrategy, - Component, - HostListener, - inject, - Input, -} from '@angular/core' -import { - TuiBadgedContentModule, - TuiBadgeNotificationModule, - TuiButtonModule, - TuiIconModule, -} from '@taiga-ui/experimental' -import { RouterLink } from '@angular/router' -import { TickerModule } from '@start9labs/shared' -import { TuiDataListModule, TuiHostedDropdownModule } from '@taiga-ui/core' -import { NavigationService } from '../../services/navigation.service' -import { Action, ActionsComponent } from '../actions/actions.component' -import { toRouterLink } from '../../utils/to-router-link' - -@Component({ - selector: '[appCard]', - templateUrl: 'card.component.html', - styleUrls: ['card.component.scss'], - standalone: true, - changeDetection: ChangeDetectionStrategy.OnPush, - imports: [ - CommonModule, - RouterLink, - TuiButtonModule, - TuiHostedDropdownModule, - TuiDataListModule, - TuiIconModule, - TickerModule, - TuiBadgedContentModule, - TuiBadgeNotificationModule, - ActionsComponent, - ], -}) -export class CardComponent { - private readonly navigation = inject(NavigationService) - - @Input({ required: true }) - id!: string - - @Input({ required: true }) - icon!: string - - @Input({ required: true }) - title!: string - - @Input() - actions: Record = {} - - @Input() - badge: number | null = null - - get isService(): boolean { - return !this.id.includes('/') - } - - @HostListener('click') - onClick() { - const { id, icon, title } = this - const routerLink = toRouterLink(id) - - this.navigation.addTab({ icon, title, routerLink }) - } - - @HostListener('pointerdown.prevent') - onDown() { - // Prevents Firefox from starting a native drag - } -} diff --git a/web/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html b/web/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html index 5b1a3c1f7..35a941eba 100644 --- a/web/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html +++ b/web/projects/ui/src/app/apps/portal/components/drawer/drawer.component.html @@ -1,6 +1,6 @@

    System Utilities

    - + @for ( + item of system | keyvalue | tuiFilter: bySearch : search; + track $index + ) { + + } @empty { + Nothing found + }

    Installed services

    - + @for ( + item of (services$ | async) || [] | tuiFilter: bySearch : search; + track $index + ) { + + } @empty { + Nothing found + }
    - Nothing found
    diff --git a/web/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts b/web/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts index 9bfca5632..5f2cc0b78 100644 --- a/web/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts +++ b/web/projects/ui/src/app/apps/portal/components/drawer/drawer.component.ts @@ -15,11 +15,11 @@ import { } from '@taiga-ui/cdk' import { TuiScrollbarModule, - TuiSvgModule, TuiTextfieldControllerModule, } from '@taiga-ui/core' +import { TuiIconModule } from '@taiga-ui/experimental' import { TuiInputModule } from '@taiga-ui/kit' -import { CardComponent } from '../card/card.component' +import { CardComponent } from '../card.component' import { ServicesService } from '../../services/services.service' import { toRouterLink } from '../../utils/to-router-link' import { DrawerItemDirective } from './drawer-item.directive' @@ -36,7 +36,6 @@ import { ToBadgePipe } from '../../pipes/to-badge' CommonModule, FormsModule, RouterLink, - TuiSvgModule, TuiScrollbarModule, TuiActiveZoneModule, TuiInputModule, @@ -46,6 +45,7 @@ import { ToBadgePipe } from '../../pipes/to-badge' CardComponent, DrawerItemDirective, ToBadgePipe, + TuiIconModule, ], }) export class DrawerComponent { diff --git a/web/projects/ui/src/app/apps/portal/components/header/header-connection.component.ts b/web/projects/ui/src/app/apps/portal/components/header/header-connection.component.ts new file mode 100644 index 000000000..30bf666c2 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/components/header/header-connection.component.ts @@ -0,0 +1,70 @@ +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { TuiIconModule } from '@taiga-ui/experimental' +import { PatchDB } from 'patch-db-client' +import { combineLatest, map, Observable, startWith } from 'rxjs' +import { ConnectionService } from 'src/app/services/connection.service' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { AsyncPipe } from '@angular/common' + +@Component({ + standalone: true, + selector: 'header-connection', + template: ` + @if (connection$ | async; as connection) { + + } + `, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [TuiIconModule, AsyncPipe], +}) +export class HeaderConnectionComponent { + readonly connection$: Observable<{ + message: string + color: string + icon: string + }> = combineLatest([ + inject(ConnectionService).networkConnected$, + inject(ConnectionService).websocketConnected$.pipe(startWith(false)), + inject(PatchDB) + .watch$('server-info', 'status-info') + .pipe(startWith({ restarting: false, 'shutting-down': false })), + ]).pipe( + map(([network, websocket, status]) => { + if (!network) + return { + message: 'No Internet', + color: 'var(--tui-error-fill)', + icon: 'tuiIconCloudOff', + } + if (!websocket) + return { + message: 'Connecting', + color: 'var(--tui-warning-fill)', + icon: 'tuiIconCloudOff', + } + if (status['shutting-down']) + return { + message: 'Shutting Down', + color: 'var(--tui-neutral-fill)', + icon: 'tuiIconPower', + } + if (status.restarting) + return { + message: 'Restarting', + color: 'var(--tui-neutral-fill)', + icon: 'tuiIconPower', + } + + return { + message: 'Connected', + color: 'var(--tui-success-fill)', + icon: 'tuiIconCloud', + } + }), + ) +} diff --git a/web/projects/ui/src/app/apps/portal/components/header/header-menu.component.ts b/web/projects/ui/src/app/apps/portal/components/header/header-menu.component.ts index f7154028c..253a3b0a7 100644 --- a/web/projects/ui/src/app/apps/portal/components/header/header-menu.component.ts +++ b/web/projects/ui/src/app/apps/portal/components/header/header-menu.component.ts @@ -1,24 +1,26 @@ import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { ErrorService, LoadingService } from '@start9labs/shared' import { TuiDataListModule, + TuiDialogOptions, TuiDialogService, TuiHostedDropdownModule, TuiSvgModule, } from '@taiga-ui/core' -import { TuiButtonModule } from '@taiga-ui/experimental' +import { TuiButtonModule, TuiIconModule } from '@taiga-ui/experimental' +import { TUI_PROMPT, TuiPromptData } from '@taiga-ui/kit' +import { PatchDB } from 'patch-db-client' +import { filter } from 'rxjs' import { ApiService } from 'src/app/services/api/embassy-api.service' import { AuthService } from 'src/app/services/auth.service' import { ABOUT } from './about.component' +import { getAllPackages } from 'src/app/util/get-package-data' +import { DataModel } from 'src/app/services/patch-db/data-model' @Component({ selector: 'header-menu', template: ` - + @@ -26,43 +28,35 @@ import { ABOUT } from './about.component'

    StartOS

    - - - + @for (link of links; track $index) { + + + {{ link.name }} + + + } - - - + @for (item of system; track $index) { + + } @@ -72,6 +66,10 @@ import { ABOUT } from './about.component' `, styles: [ ` + tui-icon { + font-size: 1rem; + } + .item { justify-content: flex-start; gap: 0.75rem; @@ -80,7 +78,6 @@ import { ABOUT } from './about.component' .title { margin: 0; padding: 0 0.5rem 0.25rem; - white-space: nowrap; font: var(--tui-font-text-l); font-weight: bold; } @@ -98,13 +95,50 @@ import { ABOUT } from './about.component' TuiDataListModule, TuiSvgModule, TuiButtonModule, + TuiIconModule, ], }) export class HeaderMenuComponent { private readonly api = inject(ApiService) + private readonly errorService = inject(ErrorService) + private readonly loader = inject(LoadingService) private readonly auth = inject(AuthService) + private readonly patch = inject(PatchDB) private readonly dialogs = inject(TuiDialogService) + readonly links = [ + { + name: 'User Manual', + icon: 'tuiIconBookOpen', + href: 'https://docs.start9.com/0.3.5.x/user-manual', + }, + { + name: 'Contact Support', + icon: 'tuiIconHeadphones', + href: 'https://start9.com/contact', + }, + { + name: 'Donate to Start9', + icon: 'tuiIconDollarSign', + href: 'https://donate.start9.com', + }, + ] + + readonly system = [ + { + icon: 'tuiIconTool', + action: 'System Rebuild', + }, + { + icon: 'tuiIconRefreshCw', + action: 'Restart', + }, + { + icon: 'tuiIconPower', + action: 'Shutdown', + }, + ] as const + about() { this.dialogs.open(ABOUT, { label: 'About this server' }).subscribe() } @@ -113,4 +147,72 @@ export class HeaderMenuComponent { this.api.logout({}).catch(e => console.error('Failed to log out', e)) this.auth.setUnverified() } + + async prompt(action: keyof typeof METHODS) { + const minutes = + action === 'System Rebuild' + ? Object.keys(await getAllPackages(this.patch)).length * 2 + : '' + + this.dialogs + .open(TUI_PROMPT, getOptions(action, minutes)) + .pipe(filter(Boolean)) + .subscribe(async () => { + const loader = this.loader.open(`Beginning ${action}...`).subscribe() + + try { + await this.api[METHODS[action]]({}) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + }) + } +} + +const METHODS = { + Restart: 'restartServer', + Shutdown: 'shutdownServer', + 'System Rebuild': 'systemRebuild', +} as const + +function getOptions( + key: keyof typeof METHODS, + minutes: unknown, +): Partial> { + switch (key) { + case 'Restart': + return { + label: 'Restart', + size: 's', + data: { + content: + 'Are you sure you want to restart your server? It can take several minutes to come back online.', + yes: 'Restart', + no: 'Cancel', + }, + } + case 'Shutdown': + return { + label: 'Warning', + size: 's', + data: { + content: + 'Are you sure you want to power down your server? This can take several minutes, and your server will not come back online automatically. To power on again, You will need to physically unplug your server and plug it back in', + yes: 'Shutdown', + no: 'Cancel', + }, + } + default: + return { + label: 'Warning', + size: 's', + data: { + content: `This action will tear down all service containers and rebuild them from scratch. No data will be deleted. This action is useful if your system gets into a bad state, and it should only be performed if you are experiencing general performance or reliability issues. It may take up to ${minutes} minutes to complete. During this time, you will lose all connectivity to your server.`, + yes: 'Rebuild', + no: 'Cancel', + }, + } + } } diff --git a/web/projects/ui/src/app/apps/portal/components/header/header.component.ts b/web/projects/ui/src/app/apps/portal/components/header/header.component.ts index eb9e1fe8b..3e052c1a2 100644 --- a/web/projects/ui/src/app/apps/portal/components/header/header.component.ts +++ b/web/projects/ui/src/app/apps/portal/components/header/header.component.ts @@ -25,19 +25,13 @@ import { SidebarDirective } from '../../../../app/sidebar-host.component' import { HeaderMenuComponent } from './header-menu.component' import { HeaderNotificationsComponent } from './header-notifications.component' import { NotificationService } from '../../services/notification.service' +import { HeaderConnectionComponent } from './header-connection.component' @Component({ selector: 'header[appHeader]', template: ` - + + + + @for (tab of tabs$ | async; track tab) { + + @if (tab.icon.startsWith('tuiIcon')) { + + } @else { + + } + + + } + `, + styles: [ + ` + @import '@taiga-ui/core/styles/taiga-ui-local'; + + :host { + @include scrollbar-hidden; + + height: 3rem; + display: flex; + overflow: auto; + // TODO: Theme + background: rgb(97 95 95 / 84%); + } + + .tab { + position: relative; + display: flex; + flex-shrink: 0; + align-items: center; + justify-content: center; + width: 7.5rem; + + &_active { + position: sticky; + left: 0; + right: 0; + z-index: 1; + // TODO: Theme + background: #373a3f; + } + } + + .icon { + width: 2rem; + height: 2rem; + border-radius: 100%; + color: var(--tui-base-08); + } + + .close { + position: absolute; + top: 0; + right: 0; + } + `, + ], + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [CommonModule, RouterModule, TuiButtonModule, TuiIconModule], +}) +export class NavigationComponent { + private readonly router = inject(Router) + private readonly navigation = inject(NavigationService) + + readonly tabs$ = this.navigation.getTabs() + + removeTab(routerLink: string, active: boolean) { + this.navigation.removeTab(routerLink) + + if (active) this.router.navigate(['/portal/desktop']) + } +} diff --git a/web/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html b/web/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html deleted file mode 100644 index a40a5c3c2..000000000 --- a/web/projects/ui/src/app/apps/portal/components/navigation/navigation.component.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - diff --git a/web/projects/ui/src/app/apps/portal/components/navigation/navigation.component.scss b/web/projects/ui/src/app/apps/portal/components/navigation/navigation.component.scss deleted file mode 100644 index ee4d6a05e..000000000 --- a/web/projects/ui/src/app/apps/portal/components/navigation/navigation.component.scss +++ /dev/null @@ -1,42 +0,0 @@ -@import '@taiga-ui/core/styles/taiga-ui-local'; - -:host { - @include scrollbar-hidden; - - height: 3rem; - display: flex; - // TODO: Theme - background: rgb(97 95 95 / 84%); - overflow: auto; -} - -.tab { - position: relative; - display: flex; - flex-shrink: 0; - align-items: center; - justify-content: center; - width: 7.5rem; - - &_active { - position: sticky; - left: 0; - right: 0; - z-index: 1; - // TODO: Theme - background: #373a3f; - } -} - -.icon { - width: 2rem; - height: 2rem; - border-radius: 100%; - color: var(--tui-base-08); -} - -.close { - position: absolute; - top: 0; - right: 0; -} diff --git a/web/projects/ui/src/app/apps/portal/components/navigation/navigation.component.ts b/web/projects/ui/src/app/apps/portal/components/navigation/navigation.component.ts deleted file mode 100644 index 18ad56ce7..000000000 --- a/web/projects/ui/src/app/apps/portal/components/navigation/navigation.component.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { CommonModule } from '@angular/common' -import { ChangeDetectionStrategy, Component, inject } from '@angular/core' -import { Router, RouterModule } from '@angular/router' -import { TuiButtonModule, TuiIconModule } from '@taiga-ui/experimental' -import { NavigationService } from '../../services/navigation.service' - -@Component({ - selector: 'nav[appNavigation]', - templateUrl: 'navigation.component.html', - styleUrls: ['navigation.component.scss'], - standalone: true, - changeDetection: ChangeDetectionStrategy.OnPush, - imports: [CommonModule, RouterModule, TuiButtonModule, TuiIconModule], -}) -export class NavigationComponent { - private readonly router = inject(Router) - private readonly navigation = inject(NavigationService) - - readonly tabs$ = this.navigation.getTabs() - - removeTab(routerLink: string, active: boolean) { - this.navigation.removeTab(routerLink) - - if (active) this.router.navigate(['/portal/desktop']) - } -} diff --git a/web/projects/ui/src/app/apps/portal/portal.component.html b/web/projects/ui/src/app/apps/portal/portal.component.html deleted file mode 100644 index a66dfd1b1..000000000 --- a/web/projects/ui/src/app/apps/portal/portal.component.html +++ /dev/null @@ -1,6 +0,0 @@ -
    My server
    - -
    - -
    - diff --git a/web/projects/ui/src/app/apps/portal/portal.component.scss b/web/projects/ui/src/app/apps/portal/portal.component.scss deleted file mode 100644 index 821a6ccf5..000000000 --- a/web/projects/ui/src/app/apps/portal/portal.component.scss +++ /dev/null @@ -1,10 +0,0 @@ -:host { - // TODO: Theme - background: url(/assets/img/background_dark.jpeg); - background-size: cover; -} - -main { - flex: 1; - overflow: hidden; -} diff --git a/web/projects/ui/src/app/apps/portal/portal.component.ts b/web/projects/ui/src/app/apps/portal/portal.component.ts index 7c57f5662..53bfe3d6a 100644 --- a/web/projects/ui/src/app/apps/portal/portal.component.ts +++ b/web/projects/ui/src/app/apps/portal/portal.component.ts @@ -1,10 +1,43 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { RouterOutlet } from '@angular/router' import { tuiDropdownOptionsProvider } from '@taiga-ui/core' +import { PatchDB } from 'patch-db-client' +import { HeaderComponent } from './components/header/header.component' +import { NavigationComponent } from './components/navigation.component' +import { DrawerComponent } from './components/drawer/drawer.component' +import { DataModel } from 'src/app/services/patch-db/data-model' @Component({ - templateUrl: 'portal.component.html', - styleUrls: ['portal.component.scss'], + standalone: true, + template: ` +
    {{ name$ | async }}
    + +
    + + `, + styles: [ + ` + :host { + // TODO: Theme + background: url(/assets/img/background_dark.jpeg); + background-size: cover; + } + + main { + flex: 1; + overflow: hidden; + } + `, + ], changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + CommonModule, + RouterOutlet, + HeaderComponent, + NavigationComponent, + DrawerComponent, + ], providers: [ // TODO: Move to global tuiDropdownOptionsProvider({ @@ -12,4 +45,6 @@ import { tuiDropdownOptionsProvider } from '@taiga-ui/core' }), ], }) -export class PortalComponent {} +export class PortalComponent { + readonly name$ = inject(PatchDB).watch$('ui', 'name') +} diff --git a/web/projects/ui/src/app/apps/portal/portal.module.ts b/web/projects/ui/src/app/apps/portal/portal.module.ts deleted file mode 100644 index ef6abe620..000000000 --- a/web/projects/ui/src/app/apps/portal/portal.module.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { NgModule } from '@angular/core' -import { RouterModule, Routes } from '@angular/router' -import { HeaderComponent } from './components/header/header.component' -import { PortalComponent } from './portal.component' -import { NavigationComponent } from './components/navigation/navigation.component' -import { DrawerComponent } from './components/drawer/drawer.component' - -const ROUTES: Routes = [ - { - path: '', - component: PortalComponent, - children: [ - { - redirectTo: 'desktop', - pathMatch: 'full', - path: '', - }, - { - path: 'desktop', - loadChildren: () => - import('./routes/desktop/desktop.module').then(m => m.DesktopModule), - }, - { - path: 'service', - loadChildren: () => - import('./routes/service/service.module').then(m => m.ServiceModule), - }, - { - path: 'system', - loadChildren: () => - import('./routes/system/system.module').then(m => m.SystemModule), - }, - ], - }, -] - -@NgModule({ - imports: [ - RouterModule.forChild(ROUTES), - HeaderComponent, - NavigationComponent, - DrawerComponent, - ], - declarations: [PortalComponent], - exports: [PortalComponent], -}) -export class PortalModule {} diff --git a/web/projects/ui/src/app/apps/portal/portal.routes.ts b/web/projects/ui/src/app/apps/portal/portal.routes.ts new file mode 100644 index 000000000..20db07d63 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/portal.routes.ts @@ -0,0 +1,35 @@ +import { Routes } from '@angular/router' +import { PortalComponent } from './portal.component' + +const ROUTES: Routes = [ + { + path: '', + component: PortalComponent, + children: [ + { + redirectTo: 'desktop', + pathMatch: 'full', + path: '', + }, + { + path: 'desktop', + loadComponent: () => + import('./routes/desktop/desktop.component').then( + m => m.DesktopComponent, + ), + }, + { + path: 'service', + loadChildren: () => + import('./routes/service/service.module').then(m => m.ServiceModule), + }, + { + path: 'system', + loadChildren: () => + import('./routes/system/system.module').then(m => m.SystemModule), + }, + ], + }, +] + +export default ROUTES diff --git a/web/projects/ui/src/app/apps/portal/routes/desktop/desktop-item.directive.ts b/web/projects/ui/src/app/apps/portal/routes/desktop/desktop-item.directive.ts index 4ebcc0edf..f54fc39fa 100644 --- a/web/projects/ui/src/app/apps/portal/routes/desktop/desktop-item.directive.ts +++ b/web/projects/ui/src/app/apps/portal/routes/desktop/desktop-item.directive.ts @@ -4,7 +4,6 @@ import { HostBinding, inject, Input, - OnDestroy, OnInit, } from '@angular/core' import { TuiTilesComponent } from '@taiga-ui/kit' @@ -17,7 +16,7 @@ import { TuiTilesComponent } from '@taiga-ui/kit' selector: '[desktopItem]', standalone: true, }) -export class DesktopItemDirective implements OnInit, OnDestroy { +export class DesktopItemDirective implements OnInit { private readonly element: Element = inject(ElementRef).nativeElement private readonly tiles = inject(TuiTilesComponent) @@ -32,9 +31,4 @@ export class DesktopItemDirective implements OnInit, OnDestroy { ngOnInit() { if (this.empty) this.tiles.element = this.element } - - // TODO: Remove after Taiga UI updated to 3.40.0 - ngOnDestroy() { - if (this.tiles.element === this.element) this.tiles.element = null - } } diff --git a/web/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts b/web/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts index 913d8d24f..589146a7e 100644 --- a/web/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/desktop/desktop.component.ts @@ -1,3 +1,4 @@ +import { CommonModule } from '@angular/common' import { Component, ElementRef, @@ -6,18 +7,48 @@ import { ViewChild, ViewChildren, } from '@angular/core' +import { RouterModule } from '@angular/router' +import { DragScrollerDirective } from '@start9labs/shared' import { EMPTY_QUERY, TUI_PARENT_STOP } from '@taiga-ui/cdk' -import { tuiFadeIn, tuiScaleIn } from '@taiga-ui/core' -import { TuiTileComponent, TuiTilesComponent } from '@taiga-ui/kit' +import { + tuiFadeIn, + TuiLoaderModule, + tuiScaleIn, + TuiSvgModule, +} from '@taiga-ui/core' +import { TuiFadeModule } from '@taiga-ui/experimental' +import { + TuiTileComponent, + TuiTilesComponent, + TuiTilesModule, +} from '@taiga-ui/kit' import { PatchDB } from 'patch-db-client' import { DataModel } from 'src/app/services/patch-db/data-model' import { DesktopService } from '../../services/desktop.service' import { DektopLoadingService } from './dektop-loading.service' +import { CardComponent } from '../../components/card.component' +import { DesktopItemDirective } from './desktop-item.directive' +import { ToNavigationItemPipe } from '../../pipes/to-navigation-item' +import { ToBadgePipe } from '../../pipes/to-badge' @Component({ + standalone: true, templateUrl: 'desktop.component.html', styleUrls: ['desktop.component.scss'], animations: [TUI_PARENT_STOP, tuiScaleIn, tuiFadeIn], + imports: [ + CommonModule, + RouterModule, + CardComponent, + DesktopItemDirective, + TuiSvgModule, + TuiLoaderModule, + TuiTilesModule, + ToNavigationItemPipe, + TuiFadeModule, + DragScrollerDirective, + ToBadgePipe, + ], }) export class DesktopComponent { @ViewChildren(TuiTileComponent, { read: ElementRef }) diff --git a/web/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts b/web/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts deleted file mode 100644 index 34932972c..000000000 --- a/web/projects/ui/src/app/apps/portal/routes/desktop/desktop.module.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { CommonModule } from '@angular/common' -import { NgModule } from '@angular/core' -import { RouterModule, Routes } from '@angular/router' -import { DragScrollerDirective } from '@start9labs/shared' -import { TuiLoaderModule, TuiSvgModule } from '@taiga-ui/core' -import { TuiFadeModule } from '@taiga-ui/experimental' -import { TuiTilesModule } from '@taiga-ui/kit' -import { DesktopComponent } from './desktop.component' -import { CardComponent } from '../../components/card/card.component' -import { ToNavigationItemPipe } from '../../pipes/to-navigation-item' -import { ToBadgePipe } from '../../pipes/to-badge' -import { DesktopItemDirective } from './desktop-item.directive' - -const ROUTES: Routes = [ - { - path: '', - component: DesktopComponent, - }, -] - -@NgModule({ - imports: [ - CommonModule, - CardComponent, - DesktopItemDirective, - TuiSvgModule, - TuiLoaderModule, - TuiTilesModule, - ToNavigationItemPipe, - RouterModule.forChild(ROUTES), - TuiFadeModule, - DragScrollerDirective, - ToBadgePipe, - ], - declarations: [DesktopComponent], - exports: [DesktopComponent], -}) -export class DesktopModule {} diff --git a/web/projects/ui/src/app/apps/portal/routes/service/pipes/to-menu.pipe.ts b/web/projects/ui/src/app/apps/portal/routes/service/pipes/to-menu.pipe.ts index 94f4885c3..1b4a19a18 100644 --- a/web/projects/ui/src/app/apps/portal/routes/service/pipes/to-menu.pipe.ts +++ b/web/projects/ui/src/app/apps/portal/routes/service/pipes/to-menu.pipe.ts @@ -1,5 +1,5 @@ import { inject, Pipe, PipeTransform, Type } from '@angular/core' -import { ActivatedRoute, Params, Router } from '@angular/router' +import { Params } from '@angular/router' import { Manifest } from '@start9labs/marketplace' import { MarkdownComponent } from '@start9labs/shared' import { TuiDialogService } from '@taiga-ui/core' @@ -33,8 +33,6 @@ export class ToMenuPipe implements PipeTransform { private readonly api = inject(ApiService) private readonly dialogs = inject(TuiDialogService) private readonly formDialog = inject(FormDialogService) - private readonly route = inject(ActivatedRoute) - private readonly router = inject(Router) private readonly proxyService = inject(ProxyService) transform({ manifest, installed }: PackageDataEntry): ServiceMenu[] { diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/components/button.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/components/button.component.ts index 80fabf1f2..e53d7fdae 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/settings/components/button.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/components/button.component.ts @@ -10,15 +10,6 @@ import { SettingBtn } from '../settings.types' - - -
    - `, styles: [ diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.service.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.service.ts index a5dc9634c..e069ab3d3 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.service.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.service.ts @@ -111,26 +111,6 @@ export class SettingsService { routerLink: 'sessions', }, ], - Support: [ - { - title: 'User Manual', - description: 'Discover what StartOS can do', - icon: 'tuiIconMap', - href: 'https://docs.start9.com/0.3.5.x/user-manual', - }, - { - title: 'Contact Support', - description: 'Get help from the Start9 team and community', - icon: 'tuiIconMessageSquare', - href: 'https://start9.com/contact', - }, - { - title: 'Donate to Start9', - description: `Support StartOS development`, - icon: 'tuiIconDollarSign', - href: 'https://donate.start9.com', - }, - ], } private async setBrowserTab(): Promise { diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.types.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.types.ts index 9f3474208..5ae9b4048 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.types.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.types.ts @@ -6,7 +6,6 @@ export interface SettingBtn { description: string icon: string action?: Function - href?: string routerLink?: string } diff --git a/web/projects/ui/src/app/routing.module.ts b/web/projects/ui/src/app/routing.module.ts index f713d6fa8..be417216d 100644 --- a/web/projects/ui/src/app/routing.module.ts +++ b/web/projects/ui/src/app/routing.module.ts @@ -26,8 +26,7 @@ const routes: Routes = [ path: 'portal', canActivate: [AuthGuard], canActivateChild: [AuthGuard], - loadChildren: () => - import('./apps/portal/portal.module').then(m => m.PortalModule), + loadChildren: () => import('./apps/portal/portal.routes').then(m => m), }, { path: '', From 92aa70182d452b168f3d2ece053387822d56e2c2 Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Tue, 23 Jan 2024 10:32:11 +0800 Subject: [PATCH 042/169] refactor: implement breadcrumbs (#2552) --- web/projects/shared/assets/img/icons/home.svg | 7 + web/projects/ui/src/app/app.component.html | 14 ++ web/projects/ui/src/app/app.component.scss | 9 +- web/projects/ui/src/app/app.providers.ts | 5 - .../apps/portal/components/card.component.ts | 13 -- .../components/header/breadcrumb.component.ts | 91 ++++++++++ ...n.component.ts => connection.component.ts} | 16 +- .../components/header/corner.component.ts | 108 +++++++++++ .../components/header/header.component.ts | 170 ++++++++---------- .../components/header/home.component.ts | 46 +++++ ...er-menu.component.ts => menu.component.ts} | 0 ...component.ts => notification.component.ts} | 0 ...omponent.ts => notifications.component.ts} | 2 +- .../portal/components/navigation.component.ts | 104 ----------- .../src/app/apps/portal/portal.component.ts | 28 +-- .../service/routes/actions.component.ts | 9 +- .../service/routes/interface.component.ts | 5 - .../routes/service/routes/logs.component.ts | 5 - .../routes/service/routes/outlet.component.ts | 23 +-- .../service/routes/service.component.ts | 7 - .../portal/routes/service/utils/update-tab.ts | 9 - .../system/sideload/package.component.ts | 4 - .../portal/services/breadcrumbs.service.ts | 88 +++++++++ .../portal/services/navigation.service.ts | 48 ----- .../services/routing-strategy.service.ts | 57 ------ .../apps/portal/utils/system-tab-resolver.ts | 5 - 26 files changed, 467 insertions(+), 406 deletions(-) create mode 100644 web/projects/shared/assets/img/icons/home.svg create mode 100644 web/projects/ui/src/app/apps/portal/components/header/breadcrumb.component.ts rename web/projects/ui/src/app/apps/portal/components/header/{header-connection.component.ts => connection.component.ts} (91%) create mode 100644 web/projects/ui/src/app/apps/portal/components/header/corner.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/components/header/home.component.ts rename web/projects/ui/src/app/apps/portal/components/header/{header-menu.component.ts => menu.component.ts} (100%) rename web/projects/ui/src/app/apps/portal/components/header/{header-notification.component.ts => notification.component.ts} (100%) rename web/projects/ui/src/app/apps/portal/components/header/{header-notifications.component.ts => notifications.component.ts} (98%) delete mode 100644 web/projects/ui/src/app/apps/portal/components/navigation.component.ts delete mode 100644 web/projects/ui/src/app/apps/portal/routes/service/utils/update-tab.ts create mode 100644 web/projects/ui/src/app/apps/portal/services/breadcrumbs.service.ts delete mode 100644 web/projects/ui/src/app/apps/portal/services/navigation.service.ts delete mode 100644 web/projects/ui/src/app/apps/portal/services/routing-strategy.service.ts diff --git a/web/projects/shared/assets/img/icons/home.svg b/web/projects/shared/assets/img/icons/home.svg new file mode 100644 index 000000000..90547de82 --- /dev/null +++ b/web/projects/shared/assets/img/icons/home.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/web/projects/ui/src/app/app.component.html b/web/projects/ui/src/app/app.component.html index 9c4a8f685..0742fad74 100644 --- a/web/projects/ui/src/app/app.component.html +++ b/web/projects/ui/src/app/app.component.html @@ -1,3 +1,17 @@ + + + + + + + + + + } @else if (item.icon) { + + } + + {{ item.title }} + @if (item.subtitle) { + {{ item.subtitle }} + } + + + `, + styles: [ + ` + :host { + display: flex; + align-items: center; + gap: 1rem; + min-width: 1.25rem; + white-space: nowrap; + text-transform: capitalize; + --clip-path: polygon( + calc(100% - 1.75rem) 0%, + calc(100% - 0.875rem) 50%, + 100% 100%, + 0% 100%, + 0.875rem 50%, + 0% 0% + ); + + &:not(.active) { + --clip-path: polygon( + calc(100% - 1.75rem) 0%, + calc(100% - 0.875rem) 50%, + calc(100% - 1.75rem) 100%, + 0% 100%, + 0.875rem 50%, + 0% 0% + ); + } + + & > * { + font-weight: bold; + gap: 0; + border-radius: 100%; + } + + &::before, + &::after { + content: ''; + margin: 0.5rem; + } + + &::before { + margin: 0.25rem; + } + } + `, + ], + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [TuiIconModule, TuiTitleModule], + animations: [tuiWidthCollapse, tuiFadeIn], +}) +export class HeaderBreadcrumbComponent { + @Input({ required: true, alias: 'headerBreadcrumb' }) + item!: Breadcrumb + + @HostBinding('@tuiFadeIn') + @HostBinding('@tuiWidthCollapse') + readonly animation = inject(TUI_ANIMATION_OPTIONS) +} diff --git a/web/projects/ui/src/app/apps/portal/components/header/header-connection.component.ts b/web/projects/ui/src/app/apps/portal/components/header/connection.component.ts similarity index 91% rename from web/projects/ui/src/app/apps/portal/components/header/header-connection.component.ts rename to web/projects/ui/src/app/apps/portal/components/header/connection.component.ts index 30bf666c2..cdf9a4377 100644 --- a/web/projects/ui/src/app/apps/portal/components/header/header-connection.component.ts +++ b/web/projects/ui/src/app/apps/portal/components/header/connection.component.ts @@ -1,24 +1,34 @@ +import { AsyncPipe } from '@angular/common' import { ChangeDetectionStrategy, Component, inject } from '@angular/core' import { TuiIconModule } from '@taiga-ui/experimental' import { PatchDB } from 'patch-db-client' import { combineLatest, map, Observable, startWith } from 'rxjs' import { ConnectionService } from 'src/app/services/connection.service' import { DataModel } from 'src/app/services/patch-db/data-model' -import { AsyncPipe } from '@angular/common' @Component({ standalone: true, selector: 'header-connection', template: ` + @if (connection$ | async; as connection) { + {{ connection.message }} } `, + styles: [ + ` + :host { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0 2rem; + } + `, + ], changeDetection: ChangeDetectionStrategy.OnPush, imports: [TuiIconModule, AsyncPipe], }) diff --git a/web/projects/ui/src/app/apps/portal/components/header/corner.component.ts b/web/projects/ui/src/app/apps/portal/components/header/corner.component.ts new file mode 100644 index 000000000..80652611a --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/components/header/corner.component.ts @@ -0,0 +1,108 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + ElementRef, + HostListener, + inject, + ViewChild, +} from '@angular/core' +import { Router } from '@angular/router' +import { TuiSidebarModule } from '@taiga-ui/addon-mobile' +import { tuiContainsOrAfter, tuiIsElement, TuiLetModule } from '@taiga-ui/cdk' +import { + TuiBadgedContentModule, + TuiBadgeNotificationModule, + TuiButtonModule, +} from '@taiga-ui/experimental' +import { Subject } from 'rxjs' +import { HeaderMenuComponent } from './menu.component' +import { HeaderNotificationsComponent } from './notifications.component' +import { SidebarDirective } from '../../../../app/sidebar-host.component' +import { NotificationService } from '../../services/notification.service' + +@Component({ + standalone: true, + selector: 'header-corner', + template: ` + + + + {{ unread }} + + + + + + `, + styles: [ + ` + :host { + display: flex; + align-items: center; + gap: 0.25rem; + padding: 0 0.5rem 0 1.75rem; + --clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 1.75rem 100%); + } + `, + ], + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + CommonModule, + HeaderMenuComponent, + HeaderNotificationsComponent, + SidebarDirective, + TuiBadgeNotificationModule, + TuiBadgedContentModule, + TuiButtonModule, + TuiLetModule, + TuiSidebarModule, + ], +}) +export class HeaderCornerComponent { + private readonly router = inject(Router) + readonly notificationService = inject(NotificationService) + + @ViewChild(HeaderNotificationsComponent, { read: ElementRef }) + private readonly panel?: ElementRef + + private readonly _ = this.router.events.subscribe(() => { + this.open$.next(false) + }) + + readonly open$ = new Subject() + + @HostListener('document:click.capture', ['$event.target']) + onClick(target: EventTarget | null) { + if ( + tuiIsElement(target) && + this.panel?.nativeElement && + !tuiContainsOrAfter(this.panel.nativeElement, target) + ) { + this.open$.next(false) + } + } + + handleNotificationsClick(unread: number) { + if (unread) { + this.open$.next(true) + } else { + this.router.navigateByUrl('/portal/system/notifications') + } + } +} diff --git a/web/projects/ui/src/app/apps/portal/components/header/header.component.ts b/web/projects/ui/src/app/apps/portal/components/header/header.component.ts index 3e052c1a2..6823d6f37 100644 --- a/web/projects/ui/src/app/apps/portal/components/header/header.component.ts +++ b/web/projects/ui/src/app/apps/portal/components/header/header.component.ts @@ -1,119 +1,93 @@ -import { CommonModule } from '@angular/common' -import { Router } from '@angular/router' -import { TuiSidebarModule } from '@taiga-ui/addon-mobile' -import { - ChangeDetectionStrategy, - Component, - ElementRef, - HostListener, - inject, - ViewChild, -} from '@angular/core' -import { tuiContainsOrAfter, tuiIsElement, TuiLetModule } from '@taiga-ui/cdk' -import { - TuiDataListModule, - TuiHostedDropdownModule, - TuiSvgModule, -} from '@taiga-ui/core' -import { - TuiBadgedContentModule, - TuiBadgeNotificationModule, - TuiButtonModule, -} from '@taiga-ui/experimental' -import { Subject } from 'rxjs' -import { SidebarDirective } from '../../../../app/sidebar-host.component' -import { HeaderMenuComponent } from './header-menu.component' -import { HeaderNotificationsComponent } from './header-notifications.component' -import { NotificationService } from '../../services/notification.service' -import { HeaderConnectionComponent } from './header-connection.component' +import { AsyncPipe } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { RouterLink, RouterLinkActive } from '@angular/router' +import { HeaderConnectionComponent } from './connection.component' +import { HeaderHomeComponent } from './home.component' +import { HeaderCornerComponent } from './corner.component' +import { HeaderBreadcrumbComponent } from './breadcrumb.component' +import { BreadcrumbsService } from '../../services/breadcrumbs.service' @Component({ selector: 'header[appHeader]', template: ` - - - - - {{ unread }} - - - - - +
    +
    + } +
    +
    +
    `, styles: [ ` + @import '@taiga-ui/core/styles/taiga-ui-local'; + :host { display: flex; - align-items: center; - height: 4.5rem; - padding: 0 1rem 0 2rem; - font-size: 1.5rem; - // TODO: Theme - background: rgb(51 51 51 / 84%); + height: 3.5rem; + padding: 0.375rem; + --clip-path: polygon( + 0% 0%, + calc(100% - 1.75rem) 0%, + 100% 100%, + 1.75rem 100% + ); + + > * { + @include transition(clip-path); + position: relative; + margin-left: -1.25rem; + backdrop-filter: blur(1rem); + clip-path: var(--clip-path); + } + } + + .plank { + @include transition(opacity); + position: absolute; + inset: 0; + z-index: -1; + filter: url(#round-corners); + opacity: 0.5; + + .active & { + opacity: 0.25; + } + + &::before { + @include transition(clip-path); + content: ''; + position: absolute; + inset: 0; + clip-path: var(--clip-path); + // TODO: Theme + background: #5f5f5f; + box-shadow: inset 0 1px rgb(255 255 255 / 25%); + } } `, ], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [ - CommonModule, - TuiBadgedContentModule, - TuiBadgeNotificationModule, - TuiButtonModule, - TuiHostedDropdownModule, - TuiDataListModule, - TuiSvgModule, - TuiSidebarModule, - SidebarDirective, - HeaderMenuComponent, - HeaderNotificationsComponent, + RouterLink, + RouterLinkActive, HeaderConnectionComponent, - TuiLetModule, + HeaderHomeComponent, + HeaderCornerComponent, + AsyncPipe, + HeaderBreadcrumbComponent, ], }) export class HeaderComponent { - private readonly router = inject(Router) - readonly notificationService = inject(NotificationService) - - @ViewChild(HeaderNotificationsComponent, { read: ElementRef }) - private readonly panel?: ElementRef - - private readonly _ = this.router.events.subscribe(() => { - this.open$.next(false) - }) - - readonly open$ = new Subject() - - @HostListener('document:click.capture', ['$event.target']) - onClick(target: EventTarget | null) { - if ( - tuiIsElement(target) && - this.panel?.nativeElement && - !tuiContainsOrAfter(this.panel.nativeElement, target) - ) { - this.open$.next(false) - } - } - - handleNotificationsClick(unread: number) { - if (unread) { - this.open$.next(true) - } else { - this.router.navigateByUrl('/portal/system/notifications') - } - } + readonly breadcrumbs$ = inject(BreadcrumbsService) } diff --git a/web/projects/ui/src/app/apps/portal/components/header/home.component.ts b/web/projects/ui/src/app/apps/portal/components/header/home.component.ts new file mode 100644 index 000000000..79fe59211 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/components/header/home.component.ts @@ -0,0 +1,46 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core' +import { TuiIconModule } from '@taiga-ui/experimental' + +@Component({ + standalone: true, + selector: 'a[headerHome]', + template: ` + + + `, + styles: [ + ` + @import '@taiga-ui/core/styles/taiga-ui-local'; + + :host { + display: flex; + align-items: center; + justify-content: center; + height: 100%; + padding: 0 2.5rem 0 1rem; + margin: 0 !important; + + --clip-path: polygon( + calc(100% - 1.75rem) 0%, + calc(100% - 0.875rem) 50%, + calc(100% - 1.75rem) 100%, + 0% 100%, + 0% 0% + ); + + &.active { + --clip-path: polygon( + calc(100% - 1.75rem) 0%, + calc(100% - 0.875rem) 50%, + 100% 100%, + 0% 100%, + 0% 0% + ); + } + } + `, + ], + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [TuiIconModule], +}) +export class HeaderHomeComponent {} diff --git a/web/projects/ui/src/app/apps/portal/components/header/header-menu.component.ts b/web/projects/ui/src/app/apps/portal/components/header/menu.component.ts similarity index 100% rename from web/projects/ui/src/app/apps/portal/components/header/header-menu.component.ts rename to web/projects/ui/src/app/apps/portal/components/header/menu.component.ts diff --git a/web/projects/ui/src/app/apps/portal/components/header/header-notification.component.ts b/web/projects/ui/src/app/apps/portal/components/header/notification.component.ts similarity index 100% rename from web/projects/ui/src/app/apps/portal/components/header/header-notification.component.ts rename to web/projects/ui/src/app/apps/portal/components/header/notification.component.ts diff --git a/web/projects/ui/src/app/apps/portal/components/header/header-notifications.component.ts b/web/projects/ui/src/app/apps/portal/components/header/notifications.component.ts similarity index 98% rename from web/projects/ui/src/app/apps/portal/components/header/header-notifications.component.ts rename to web/projects/ui/src/app/apps/portal/components/header/notifications.component.ts index afe60b05e..e0e219738 100644 --- a/web/projects/ui/src/app/apps/portal/components/header/header-notifications.component.ts +++ b/web/projects/ui/src/app/apps/portal/components/header/notifications.component.ts @@ -18,7 +18,7 @@ import { import { PatchDB } from 'patch-db-client' import { Subject, first, tap } from 'rxjs' import { DataModel } from 'src/app/services/patch-db/data-model' -import { HeaderNotificationComponent } from './header-notification.component' +import { HeaderNotificationComponent } from './notification.component' import { toRouterLink } from '../../utils/to-router-link' import { ServerNotification, diff --git a/web/projects/ui/src/app/apps/portal/components/navigation.component.ts b/web/projects/ui/src/app/apps/portal/components/navigation.component.ts deleted file mode 100644 index 028055238..000000000 --- a/web/projects/ui/src/app/apps/portal/components/navigation.component.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { CommonModule } from '@angular/common' -import { ChangeDetectionStrategy, Component, inject } from '@angular/core' -import { Router, RouterModule } from '@angular/router' -import { TuiButtonModule, TuiIconModule } from '@taiga-ui/experimental' -import { NavigationService } from '../services/navigation.service' - -@Component({ - selector: 'nav[appNavigation]', - template: ` - - - - @for (tab of tabs$ | async; track tab) { - - @if (tab.icon.startsWith('tuiIcon')) { - - } @else { - - } - - - } - `, - styles: [ - ` - @import '@taiga-ui/core/styles/taiga-ui-local'; - - :host { - @include scrollbar-hidden; - - height: 3rem; - display: flex; - overflow: auto; - // TODO: Theme - background: rgb(97 95 95 / 84%); - } - - .tab { - position: relative; - display: flex; - flex-shrink: 0; - align-items: center; - justify-content: center; - width: 7.5rem; - - &_active { - position: sticky; - left: 0; - right: 0; - z-index: 1; - // TODO: Theme - background: #373a3f; - } - } - - .icon { - width: 2rem; - height: 2rem; - border-radius: 100%; - color: var(--tui-base-08); - } - - .close { - position: absolute; - top: 0; - right: 0; - } - `, - ], - standalone: true, - changeDetection: ChangeDetectionStrategy.OnPush, - imports: [CommonModule, RouterModule, TuiButtonModule, TuiIconModule], -}) -export class NavigationComponent { - private readonly router = inject(Router) - private readonly navigation = inject(NavigationService) - - readonly tabs$ = this.navigation.getTabs() - - removeTab(routerLink: string, active: boolean) { - this.navigation.removeTab(routerLink) - - if (active) this.router.navigate(['/portal/desktop']) - } -} diff --git a/web/projects/ui/src/app/apps/portal/portal.component.ts b/web/projects/ui/src/app/apps/portal/portal.component.ts index 53bfe3d6a..b609af43e 100644 --- a/web/projects/ui/src/app/apps/portal/portal.component.ts +++ b/web/projects/ui/src/app/apps/portal/portal.component.ts @@ -1,18 +1,19 @@ import { CommonModule } from '@angular/common' import { ChangeDetectionStrategy, Component, inject } from '@angular/core' -import { RouterOutlet } from '@angular/router' +import { takeUntilDestroyed } from '@angular/core/rxjs-interop' +import { NavigationEnd, Router, RouterOutlet } from '@angular/router' import { tuiDropdownOptionsProvider } from '@taiga-ui/core' import { PatchDB } from 'patch-db-client' +import { filter } from 'rxjs' +import { DataModel } from 'src/app/services/patch-db/data-model' import { HeaderComponent } from './components/header/header.component' -import { NavigationComponent } from './components/navigation.component' import { DrawerComponent } from './components/drawer/drawer.component' -import { DataModel } from 'src/app/services/patch-db/data-model' +import { BreadcrumbsService } from './services/breadcrumbs.service' @Component({ standalone: true, template: `
    {{ name$ | async }}
    -
    `, @@ -31,13 +32,7 @@ import { DataModel } from 'src/app/services/patch-db/data-model' `, ], changeDetection: ChangeDetectionStrategy.OnPush, - imports: [ - CommonModule, - RouterOutlet, - HeaderComponent, - NavigationComponent, - DrawerComponent, - ], + imports: [CommonModule, RouterOutlet, HeaderComponent, DrawerComponent], providers: [ // TODO: Move to global tuiDropdownOptionsProvider({ @@ -46,5 +41,16 @@ import { DataModel } from 'src/app/services/patch-db/data-model' ], }) export class PortalComponent { + private readonly breadcrumbs = inject(BreadcrumbsService) + // TODO: Refactor to (activate) on when routing structure becomes flat + private readonly _ = inject(Router) + .events.pipe( + filter((event): event is NavigationEnd => event instanceof NavigationEnd), + takeUntilDestroyed(), + ) + .subscribe(e => { + this.breadcrumbs.update(e.url.replace('/portal/service/', '')) + }) + readonly name$ = inject(PatchDB).watch$('ui', 'name') } diff --git a/web/projects/ui/src/app/apps/portal/routes/service/routes/actions.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/routes/actions.component.ts index b99b827b4..3a2856529 100644 --- a/web/projects/ui/src/app/apps/portal/routes/service/routes/actions.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/service/routes/actions.component.ts @@ -27,9 +27,6 @@ import { ServiceActionComponent } from '../components/action.component' import { ServiceActionSuccessComponent } from '../components/action-success.component' import { DesktopService } from '../../../services/desktop.service' import { GroupActionsPipe } from '../pipes/group-actions.pipe' -import { updateTab } from '../utils/update-tab' -import { NavigationService } from '../../../services/navigation.service' -import { toRouterLink } from '../../../utils/to-router-link' @Component({ template: ` @@ -88,10 +85,7 @@ export class ServiceActionsRoute { private readonly patch: PatchDB, private readonly formDialog: FormDialogService, private readonly desktop: DesktopService, - private readonly navigation: NavigationService, - ) { - updateTab('/actions') - } + ) {} async handleAction(action: WithId) { if (action.disabled) { @@ -168,7 +162,6 @@ export class ServiceActionsRoute { this.embassyApi .setDbValue(['ack-instructions', this.id], false) .catch(e => console.error('Failed to mark instructions as unseen', e)) - this.navigation.removeTab(toRouterLink(this.id)) this.desktop.remove(this.id) this.router.navigate(['portal', 'desktop']) } catch (e: any) { diff --git a/web/projects/ui/src/app/apps/portal/routes/service/routes/interface.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/routes/interface.component.ts index e1efc4305..e49c0e01b 100644 --- a/web/projects/ui/src/app/apps/portal/routes/service/routes/interface.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/service/routes/interface.component.ts @@ -5,7 +5,6 @@ import { InterfaceAddressesComponentModule } from 'src/app/common/interface-addr import { DataModel } from 'src/app/services/patch-db/data-model' import { ActivatedRoute } from '@angular/router' import { getPkgId } from '@start9labs/shared' -import { updateTab } from '../utils/update-tab' @Component({ template: ` @@ -35,8 +34,4 @@ export class ServiceInterfaceRoute { 'interfaceInfo', this.context.interfaceId, ) - - constructor() { - updateTab(`/interface/${this.context.interfaceId}`) - } } diff --git a/web/projects/ui/src/app/apps/portal/routes/service/routes/logs.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/routes/logs.component.ts index 01da49b52..207317b85 100644 --- a/web/projects/ui/src/app/apps/portal/routes/service/routes/logs.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/service/routes/logs.component.ts @@ -4,7 +4,6 @@ import { getPkgId } from '@start9labs/shared' import { LogsComponentModule } from 'src/app/common/logs/logs.component.module' import { ApiService } from 'src/app/services/api/embassy-api.service' import { RR } from 'src/app/services/api/api.types' -import { updateTab } from '../utils/update-tab' @Component({ template: '', @@ -36,8 +35,4 @@ export class ServiceLogsRoute { readonly fetch = async (params: RR.GetServerLogsReq) => this.api.getPackageLogs({ id: this.id, ...params }) - - constructor() { - updateTab('/logs') - } } diff --git a/web/projects/ui/src/app/apps/portal/routes/service/routes/outlet.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/routes/outlet.component.ts index 920e2e288..a0a1f4121 100644 --- a/web/projects/ui/src/app/apps/portal/routes/service/routes/outlet.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/service/routes/outlet.component.ts @@ -4,12 +4,8 @@ import { ActivatedRoute, Router, RouterModule } from '@angular/router' import { TuiIconModule } from '@taiga-ui/experimental' import { PatchDB } from 'patch-db-client' import { distinctUntilChanged, filter, map, switchMap, tap } from 'rxjs' -import { - DataModel, - PackageDataEntry, -} from 'src/app/services/patch-db/data-model' +import { DataModel } from 'src/app/services/patch-db/data-model' import { toRouterLink } from '../../../utils/to-router-link' -import { NavigationService } from '../../../services/navigation.service' @Component({ template: ` @@ -18,7 +14,6 @@ import { NavigationService } from '../../../services/navigation.service' routerLinkActive="_current" [routerLinkActiveOptions]="{ exact: true }" [routerLink]="getLink(service.manifest.id)" - (isActiveChange)="onActive(service, $event)" > {{ service.manifest.title }} @@ -50,7 +45,6 @@ export class ServiceOutletComponent { private readonly patch = inject(PatchDB) private readonly route = inject(ActivatedRoute) private readonly router = inject(Router) - private readonly navigation = inject(NavigationService) readonly service$ = this.router.events.pipe( map(() => this.route.firstChild?.snapshot.paramMap?.get('pkgId')), @@ -61,11 +55,6 @@ export class ServiceOutletComponent { // if package disappears, navigate to list page if (!pkg) { this.router.navigate(['./portal/desktop']) - } else { - this.onActive( - pkg, - !this.navigation.hasSubtab(this.getLink(pkg.manifest.id)), - ) } }), ) @@ -73,14 +62,4 @@ export class ServiceOutletComponent { getLink(id: string): string { return toRouterLink(id) } - - onActive({ icon, manifest }: PackageDataEntry, active: boolean): void { - if (!active) return - - this.navigation.addTab({ - icon, - title: manifest.title, - routerLink: this.getLink(manifest.id), - }) - } } diff --git a/web/projects/ui/src/app/apps/portal/routes/service/routes/service.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/routes/service.component.ts index 0e5ff0cd0..21f6ca148 100644 --- a/web/projects/ui/src/app/apps/portal/routes/service/routes/service.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/service/routes/service.component.ts @@ -36,7 +36,6 @@ import { } from 'src/app/services/dep-error.service' import { DependencyInfo } from '../types/dependency-info' import { Manifest } from '@start9labs/marketplace' -import { NavigationService } from '../../../services/navigation.service' import { toRouterLink } from '../../../utils/to-router-link' import { PackageConfigData } from '../types/package-config-data' import { ServiceConfigModal } from '../modals/config.component' @@ -108,7 +107,6 @@ export class ServiceRoute { private readonly patch = inject(PatchDB) private readonly pkgId = getPkgId(inject(ActivatedRoute)) private readonly depErrorService = inject(DepErrorService) - private readonly navigation = inject(NavigationService) private readonly router = inject(Router) private readonly formDialog = inject(FormDialogService) @@ -193,11 +191,6 @@ export class ServiceRoute { action: fixAction || (() => { - this.navigation.addTab({ - icon: depInfo.icon, - title: depInfo.title, - routerLink: toRouterLink(depId), - }) this.router.navigate([`portal`, `service`, depId]) }), } diff --git a/web/projects/ui/src/app/apps/portal/routes/service/utils/update-tab.ts b/web/projects/ui/src/app/apps/portal/routes/service/utils/update-tab.ts deleted file mode 100644 index cbc717315..000000000 --- a/web/projects/ui/src/app/apps/portal/routes/service/utils/update-tab.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { inject } from '@angular/core' -import { ActivatedRoute } from '@angular/router' -import { getPkgId } from '@start9labs/shared' -import { NavigationService } from 'src/app/apps/portal/services/navigation.service' -import { toRouterLink } from 'src/app/apps/portal/utils/to-router-link' - -export function updateTab(path: string, id = getPkgId(inject(ActivatedRoute))) { - inject(NavigationService).updateTab(toRouterLink(id), toRouterLink(id) + path) -} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts index c415ec61e..9851f1ef3 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts @@ -23,8 +23,6 @@ import { DataModel } from 'src/app/services/patch-db/data-model' import { ApiService } from 'src/app/services/api/embassy-api.service' import { ClientStorageService } from 'src/app/services/client-storage.service' -import { NavigationService } from '../../../services/navigation.service' - @Component({ selector: 'sideload-package', template: ` @@ -83,7 +81,6 @@ export class SideloadPackageComponent { private readonly api = inject(ApiService) private readonly errorService = inject(ErrorService) private readonly router = inject(Router) - private readonly navigation = inject(NavigationService) private readonly alerts = inject(TuiAlertService) private readonly emver = inject(Emver) @@ -133,7 +130,6 @@ export class SideloadPackageComponent { await this.api.uploadPackage(pkg, this.file) await this.router.navigate(['/portal/service', manifest.id]) - this.navigation.removeTab('/portal/system/sideload') this.alerts .open('Package uploaded successfully', { status: 'success' }) .subscribe() diff --git a/web/projects/ui/src/app/apps/portal/services/breadcrumbs.service.ts b/web/projects/ui/src/app/apps/portal/services/breadcrumbs.service.ts new file mode 100644 index 000000000..631ee0605 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/services/breadcrumbs.service.ts @@ -0,0 +1,88 @@ +import { inject, Injectable } from '@angular/core' +import { PatchDB } from 'patch-db-client' +import { BehaviorSubject } from 'rxjs' +import { + DataModel, + PackageDataEntry, +} from 'src/app/services/patch-db/data-model' +import { SYSTEM_UTILITIES } from '../constants/system-utilities' +import { toRouterLink } from '../utils/to-router-link' +import { getAllPackages } from '../../../util/get-package-data' + +export interface Breadcrumb { + title: string + routerLink: string + subtitle?: string + icon?: string +} + +@Injectable({ + providedIn: 'root', +}) +export class BreadcrumbsService extends BehaviorSubject { + private readonly patch = inject(PatchDB) + + constructor() { + super([]) + } + + async update(page: string) { + const packages = await getAllPackages(this.patch) + + try { + this.next(toBreadcrumbs(page, packages)) + } catch (e) { + this.next([]) + } + } +} + +function toBreadcrumbs( + id: string, + packages: Record = {}, +): Breadcrumb[] { + const item = SYSTEM_UTILITIES[id] + const routerLink = toRouterLink(id) + + if (id.startsWith('/portal/system/')) { + const [page, ...path] = id.replace('/portal/system/', '').split('/') + const service = `/portal/system/${page}` + const { icon, title } = SYSTEM_UTILITIES[service] + const breadcrumbs: Breadcrumb[] = [ + { + icon, + title, + routerLink: toRouterLink(service), + }, + ] + + if (path.length) { + breadcrumbs.push({ + title: path.join(': '), + routerLink: breadcrumbs[0].routerLink + '/' + path.join('/'), + }) + } + + return breadcrumbs + } + + const [service, ...path] = id.split('/') + const { icon, manifest } = packages[service] + const breadcrumbs: Breadcrumb[] = [ + { + icon, + title: manifest.title, + subtitle: manifest.version, + routerLink: toRouterLink(service), + }, + ] + + if (path.length) { + breadcrumbs.push({ + title: path.join(': '), + routerLink: breadcrumbs[0].routerLink + '/' + path.join('/'), + }) + } + + return breadcrumbs +} diff --git a/web/projects/ui/src/app/apps/portal/services/navigation.service.ts b/web/projects/ui/src/app/apps/portal/services/navigation.service.ts deleted file mode 100644 index a4a789d22..000000000 --- a/web/projects/ui/src/app/apps/portal/services/navigation.service.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Injectable } from '@angular/core' -import { BehaviorSubject, Observable } from 'rxjs' -import { NavigationItem } from '../types/navigation-item' - -@Injectable({ - providedIn: 'root', -}) -export class NavigationService { - private readonly tabs = new BehaviorSubject([]) - - getTabs(): Observable { - return this.tabs - } - - removeTab(routerLink: string) { - this.tabs.next( - this.tabs.value.filter(t => !t.routerLink.startsWith(routerLink)), - ) - } - - addTab(tab: NavigationItem) { - const current = this.tabs.value.find(t => - t.routerLink.startsWith(tab.routerLink), - ) - - this.tabs.next( - current - ? this.tabs.value.map(t => (t === current ? tab : t)) - : this.tabs.value.concat(tab), - ) - } - - updateTab(old: string, routerLink: string) { - this.tabs.next( - this.tabs.value.map(t => - t.routerLink === old ? { ...t, routerLink } : t, - ), - ) - } - - hasTab(path: string): boolean { - return this.tabs.value.some(t => t.routerLink === path) - } - - hasSubtab(path: string): boolean { - return this.tabs.value.some(t => t.routerLink.startsWith(path)) - } -} diff --git a/web/projects/ui/src/app/apps/portal/services/routing-strategy.service.ts b/web/projects/ui/src/app/apps/portal/services/routing-strategy.service.ts deleted file mode 100644 index aa1778667..000000000 --- a/web/projects/ui/src/app/apps/portal/services/routing-strategy.service.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { inject, Injectable } from '@angular/core' -import { - ActivatedRouteSnapshot, - BaseRouteReuseStrategy, - createUrlTreeFromSnapshot, - DetachedRouteHandle, - UrlSerializer, -} from '@angular/router' -import { NavigationService } from './navigation.service' - -@Injectable({ - providedIn: 'root', -}) -export class RoutingStrategyService extends BaseRouteReuseStrategy { - private readonly url = inject(UrlSerializer) - private readonly navigation = inject(NavigationService) - private readonly handlers = new Map() - - override shouldDetach(route: ActivatedRouteSnapshot): boolean { - const path = this.getPath(route) - const store = this.navigation.hasTab(path) - - if (!store) this.handlers.delete(path) - - return store && path.startsWith('/portal/service') - } - - override store( - route: ActivatedRouteSnapshot, - handle: DetachedRouteHandle, - ): void { - this.handlers.set(this.getPath(route), handle) - } - - override shouldAttach(route: ActivatedRouteSnapshot): boolean { - return !!this.handlers.get(this.getPath(route)) - } - - override retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle | null { - return this.handlers.get(this.getPath(route)) || null - } - - override shouldReuseRoute( - { routeConfig, params }: ActivatedRouteSnapshot, - current: ActivatedRouteSnapshot, - ): boolean { - return ( - routeConfig === current.routeConfig && - Object.keys(params).length === Object.keys(current.params).length && - Object.keys(params).every(key => current.params[key] === params[key]) - ) - } - - private getPath(route: ActivatedRouteSnapshot): string { - return this.url.serialize(createUrlTreeFromSnapshot(route, ['.'])) - } -} diff --git a/web/projects/ui/src/app/apps/portal/utils/system-tab-resolver.ts b/web/projects/ui/src/app/apps/portal/utils/system-tab-resolver.ts index 02d355d3c..ff5bd5ee1 100644 --- a/web/projects/ui/src/app/apps/portal/utils/system-tab-resolver.ts +++ b/web/projects/ui/src/app/apps/portal/utils/system-tab-resolver.ts @@ -1,10 +1,5 @@ import { ActivatedRouteSnapshot } from '@angular/router' -import { inject } from '@angular/core' -import { NavigationService } from '../services/navigation.service' -import { NavigationItem } from '../types/navigation-item' export function systemTabResolver({ data }: ActivatedRouteSnapshot): string { - inject(NavigationService).addTab(data as NavigationItem) - return data['title'] } From 4410d7f19586584d279297868c7ab66b37044f4d Mon Sep 17 00:00:00 2001 From: Lucy <12953208+elvece@users.noreply.github.com> Date: Wed, 31 Jan 2024 11:25:25 -0500 Subject: [PATCH 043/169] update angular in shared (#2556) --- web/projects/shared/package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/web/projects/shared/package.json b/web/projects/shared/package.json index c2c3a59da..b0063e302 100644 --- a/web/projects/shared/package.json +++ b/web/projects/shared/package.json @@ -1,10 +1,10 @@ { "name": "@start9labs/shared", - "version": "0.3.5", + "version": "0.3.6", "peerDependencies": { - "@angular/common": "^14.1.0", - "@angular/core": "^14.1.0", - "@angular/router": "^14.1.0", + "@angular/common": "^17.0.6", + "@angular/core": "^17.0.6", + "@angular/router": "^17.0.6", "@ionic/angular": ">=6.0.0", "@ng-web-apis/mutation-observer": ">=2.0.0", "@ng-web-apis/resize-observer": ">=2.0.0", From 9a0ae549f65915dfd4dd74e3873a10b6df9fd2f3 Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Tue, 6 Feb 2024 06:26:00 +0400 Subject: [PATCH 044/169] feat: refactor logs (#2555) * feat: refactor logs * chore: comments * feat: add system logs * feat: update shared logs --- .../src/app/pages/success/success.page.ts | 1 - .../initializing/initializing.component.html | 4 +- .../initializing/initializing.component.scss | 14 ++- .../initializing/initializing.module.ts | 6 +- .../initializing/logs-window.component.ts | 53 +++++++++ .../logs-window/logs-window.component.html | 11 -- .../logs-window/logs-window.component.scss | 10 -- .../logs-window/logs-window.component.ts | 67 ----------- web/projects/shared/src/public-api.ts | 3 +- .../src/services/download-html.service.ts | 4 +- .../shared/src/services/setup-logs.service.ts | 8 +- web/projects/shared/src/util/convert-ansi.ts | 20 ++++ web/projects/shared/styles/taiga.scss | 1 + .../components/header/header.component.ts | 15 ++- .../logs/logs-download.directive.ts | 52 +++++++++ .../components/logs/logs-fetch.directive.ts | 36 ++++++ .../components/logs/logs.component.html | 66 +++++++++++ .../components/logs/logs.component.scss | 43 ++++++++ .../portal/components/logs/logs.component.ts | 104 ++++++++++++++++++ .../apps/portal/components/logs/logs.pipe.ts | 87 +++++++++++++++ .../apps/portal/constants/system-utilities.ts | 4 + .../routes/service/routes/logs.component.ts | 19 +--- .../routes/service/routes/outlet.component.ts | 36 +----- .../system/backups/backups.component.ts | 2 +- .../routes/system/logs/logs.component.ts | 95 ++++++++++++++++ .../notifications/notifications.component.ts | 2 +- .../routes/system/settings/settings.routes.ts | 4 +- .../system/sideload/sideload.component.ts | 2 +- .../routes/system/snek/snek.component.ts | 2 +- .../portal/routes/system/system.module.ts | 26 ++--- .../system/updates/updates.component.ts | 4 +- .../ui/src/app/common/logs/logs.component.ts | 2 +- web/projects/ui/src/styles.scss | 53 +++++++++ 33 files changed, 676 insertions(+), 180 deletions(-) create mode 100644 web/projects/shared/src/components/initializing/logs-window.component.ts delete mode 100644 web/projects/shared/src/components/initializing/logs-window/logs-window.component.html delete mode 100644 web/projects/shared/src/components/initializing/logs-window/logs-window.component.scss delete mode 100644 web/projects/shared/src/components/initializing/logs-window/logs-window.component.ts create mode 100644 web/projects/shared/src/util/convert-ansi.ts create mode 100644 web/projects/ui/src/app/apps/portal/components/logs/logs-download.directive.ts create mode 100644 web/projects/ui/src/app/apps/portal/components/logs/logs-fetch.directive.ts create mode 100644 web/projects/ui/src/app/apps/portal/components/logs/logs.component.html create mode 100644 web/projects/ui/src/app/apps/portal/components/logs/logs.component.scss create mode 100644 web/projects/ui/src/app/apps/portal/components/logs/logs.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/components/logs/logs.pipe.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/logs/logs.component.ts diff --git a/web/projects/setup-wizard/src/app/pages/success/success.page.ts b/web/projects/setup-wizard/src/app/pages/success/success.page.ts index 7dc4b9add..9847c0e67 100644 --- a/web/projects/setup-wizard/src/app/pages/success/success.page.ts +++ b/web/projects/setup-wizard/src/app/pages/success/success.page.ts @@ -8,7 +8,6 @@ import { StateService } from 'src/app/services/state.service' selector: 'success', templateUrl: 'success.page.html', styleUrls: ['success.page.scss'], - providers: [DownloadHTMLService], }) export class SuccessPage { @ViewChild('canvas', { static: true }) diff --git a/web/projects/shared/src/components/initializing/initializing.component.html b/web/projects/shared/src/components/initializing/initializing.component.html index b58ee2f74..0722943bf 100644 --- a/web/projects/shared/src/components/initializing/initializing.component.html +++ b/web/projects/shared/src/components/initializing/initializing.component.html @@ -25,9 +25,7 @@ -
    - -
    + diff --git a/web/projects/shared/src/components/initializing/initializing.component.scss b/web/projects/shared/src/components/initializing/initializing.component.scss index f21705ce5..e394fa18e 100644 --- a/web/projects/shared/src/components/initializing/initializing.component.scss +++ b/web/projects/shared/src/components/initializing/initializing.component.scss @@ -8,11 +8,15 @@ ion-card-title { margin: auto auto 40px; } -.logs-container { - margin-top: 24px; - height: 280px; +.logs { + display: flex; + flex-direction: column; + height: 18rem; + padding: 1rem; + margin: 1.5rem 0.75rem; text-align: left; overflow: hidden; - border-radius: 31px; - margin-inline: 10px; + border-radius: 2rem; + // TODO: Theme + background: #181818; } diff --git a/web/projects/shared/src/components/initializing/initializing.module.ts b/web/projects/shared/src/components/initializing/initializing.module.ts index daa025aa3..c72a7e978 100644 --- a/web/projects/shared/src/components/initializing/initializing.module.ts +++ b/web/projects/shared/src/components/initializing/initializing.module.ts @@ -3,12 +3,12 @@ import { CommonModule } from '@angular/common' import { IonicModule } from '@ionic/angular' import { TuiLetModule } from '@taiga-ui/cdk' -import { LogsWindowComponent } from './logs-window/logs-window.component' +import { LogsWindowComponent } from './logs-window.component' import { InitializingComponent } from './initializing.component' @NgModule({ - imports: [CommonModule, IonicModule, TuiLetModule], - declarations: [InitializingComponent, LogsWindowComponent], + imports: [CommonModule, IonicModule, TuiLetModule, LogsWindowComponent], + declarations: [InitializingComponent], exports: [InitializingComponent], }) export class InitializingModule {} diff --git a/web/projects/shared/src/components/initializing/logs-window.component.ts b/web/projects/shared/src/components/initializing/logs-window.component.ts new file mode 100644 index 000000000..131fd1709 --- /dev/null +++ b/web/projects/shared/src/components/initializing/logs-window.component.ts @@ -0,0 +1,53 @@ +import { AsyncPipe } from '@angular/common' +import { Component, ElementRef, inject } from '@angular/core' +import { + IntersectionObserverModule, + INTERSECTION_ROOT, +} from '@ng-web-apis/intersection-observer' +import { MutationObserverModule } from '@ng-web-apis/mutation-observer' +import { TuiScrollbarModule } from '@taiga-ui/core' +import { NgDompurifyModule } from '@tinkoff/ng-dompurify' +import { SetupLogsService } from '../../services/setup-logs.service' + +@Component({ + standalone: true, + selector: 'logs-window', + template: ` + + @for (log of logs$ | async; track log) { +
    
    +      }
    +      
    +
    + `, + imports: [ + AsyncPipe, + MutationObserverModule, + IntersectionObserverModule, + NgDompurifyModule, + TuiScrollbarModule, + ], + providers: [ + { + provide: INTERSECTION_ROOT, + useExisting: ElementRef, + }, + ], +}) +export class LogsWindowComponent { + readonly logs$ = inject(SetupLogsService) + scroll = true + + scrollTo(bottom: HTMLElement) { + if (this.scroll) bottom.scrollIntoView({ behavior: 'smooth' }) + } + + onBottom([{ isIntersecting }]: readonly IntersectionObserverEntry[]) { + this.scroll = isIntersecting + } +} diff --git a/web/projects/shared/src/components/initializing/logs-window/logs-window.component.html b/web/projects/shared/src/components/initializing/logs-window/logs-window.component.html deleted file mode 100644 index 4c6866ff1..000000000 --- a/web/projects/shared/src/components/initializing/logs-window/logs-window.component.html +++ /dev/null @@ -1,11 +0,0 @@ - -
    -
    - -
    diff --git a/web/projects/shared/src/components/initializing/logs-window/logs-window.component.scss b/web/projects/shared/src/components/initializing/logs-window/logs-window.component.scss deleted file mode 100644 index 032ba006f..000000000 --- a/web/projects/shared/src/components/initializing/logs-window/logs-window.component.scss +++ /dev/null @@ -1,10 +0,0 @@ -// Hide scrollbar for Chrome, Safari and Opera -ion-content::part(scroll)::-webkit-scrollbar { - display: none; -} - -// Hide scrollbar for IE, Edge and Firefox -ion-content::part(scroll) { - -ms-overflow-style: none; // IE and Edge - scrollbar-width: none; // Firefox -} \ No newline at end of file diff --git a/web/projects/shared/src/components/initializing/logs-window/logs-window.component.ts b/web/projects/shared/src/components/initializing/logs-window/logs-window.component.ts deleted file mode 100644 index 449b89dcc..000000000 --- a/web/projects/shared/src/components/initializing/logs-window/logs-window.component.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Component, ViewChild } from '@angular/core' -import { IonContent } from '@ionic/angular' -import { map, takeUntil } from 'rxjs' -import { TuiDestroyService } from '@taiga-ui/cdk' -import { SetupLogsService } from '../../../services/setup-logs.service' -import { Log } from '../../../types/api' -import { toLocalIsoString } from '../../../util/to-local-iso-string' -import Convert from 'ansi-to-html' -const convert = new Convert({ - bg: 'transparent', -}) - -@Component({ - selector: 'logs-window', - templateUrl: 'logs-window.component.html', - styleUrls: ['logs-window.component.scss'], - providers: [TuiDestroyService], -}) -export class LogsWindowComponent { - @ViewChild(IonContent) - private content?: IonContent - - autoScroll = true - - constructor( - private readonly logs: SetupLogsService, - private readonly destroy$: TuiDestroyService, - ) {} - - ngOnInit() { - this.logs - .pipe( - map(log => this.convertToAnsi(log)), - takeUntil(this.destroy$), - ) - .subscribe(innerHTML => { - const container = document.getElementById('container') - const newLogs = document.getElementById('template')?.cloneNode() - - if (!(newLogs instanceof HTMLElement)) return - - newLogs.innerHTML = innerHTML - container?.append(newLogs) - - if (this.autoScroll) { - setTimeout(() => this.content?.scrollToBottom(250)) - } - }) - } - - handleScroll(e: any) { - if (e.detail.deltaY < 0) this.autoScroll = false - } - - async handleScrollEnd() { - const elem = await this.content?.getScrollElement() - if (elem && elem.scrollHeight - elem.scrollTop - elem.clientHeight < 64) { - this.autoScroll = true - } - } - - private convertToAnsi(log: Log) { - return `${toLocalIsoString( - new Date(log.timestamp), - )}  ${convert.toHtml(log.message)}
    ` - } -} diff --git a/web/projects/shared/src/public-api.ts b/web/projects/shared/src/public-api.ts index 31846b93e..f926e0da9 100644 --- a/web/projects/shared/src/public-api.ts +++ b/web/projects/shared/src/public-api.ts @@ -5,7 +5,7 @@ export * from './classes/http-error' export * from './classes/rpc-error' -export * from './components/initializing/logs-window/logs-window.component' +export * from './components/initializing/logs-window.component' export * from './components/initializing/initializing.module' export * from './components/initializing/initializing.component' export * from './components/loading/loading.component' @@ -63,6 +63,7 @@ export * from './tokens/relative-url' export * from './tokens/theme' export * from './util/base-64' +export * from './util/convert-ansi' export * from './util/copy-to-clipboard' export * from './util/get-new-entries' export * from './util/get-pkg-id' diff --git a/web/projects/shared/src/services/download-html.service.ts b/web/projects/shared/src/services/download-html.service.ts index 81f7b945b..13a146186 100644 --- a/web/projects/shared/src/services/download-html.service.ts +++ b/web/projects/shared/src/services/download-html.service.ts @@ -1,7 +1,9 @@ import { DOCUMENT } from '@angular/common' import { Inject, Injectable } from '@angular/core' -@Injectable() +@Injectable({ + providedIn: 'root', +}) export class DownloadHTMLService { constructor(@Inject(DOCUMENT) private readonly document: Document) {} diff --git a/web/projects/shared/src/services/setup-logs.service.ts b/web/projects/shared/src/services/setup-logs.service.ts index cf1ce7738..3d27811ce 100644 --- a/web/projects/shared/src/services/setup-logs.service.ts +++ b/web/projects/shared/src/services/setup-logs.service.ts @@ -1,8 +1,9 @@ import { StaticClassProvider } from '@angular/core' -import { defer, Observable, switchMap } from 'rxjs' +import { bufferTime, defer, map, Observable, scan, switchMap } from 'rxjs' import { WebSocketSubjectConfig } from 'rxjs/webSocket' import { FollowLogsReq, FollowLogsRes, Log } from '../types/api' import { Constructor } from '../types/constructor' +import { convertAnsi } from '../util/convert-ansi' interface Api { followServerLogs: (params: FollowLogsReq) => Promise @@ -19,11 +20,14 @@ export function provideSetupLogsService( } } -export class SetupLogsService extends Observable { +export class SetupLogsService extends Observable { private readonly log$ = defer(() => this.api.followServerLogs({})).pipe( switchMap(({ guid }) => this.api.openLogsWebsocket$({ url: `/rpc/${guid}` }), ), + bufferTime(1000), + map(convertAnsi), + scan((logs: readonly string[], log) => [...logs, log], []), ) constructor(private readonly api: Api) { diff --git a/web/projects/shared/src/util/convert-ansi.ts b/web/projects/shared/src/util/convert-ansi.ts new file mode 100644 index 000000000..67d934456 --- /dev/null +++ b/web/projects/shared/src/util/convert-ansi.ts @@ -0,0 +1,20 @@ +import { Log } from '../types/api' +import { toLocalIsoString } from './to-local-iso-string' + +const Convert = require('ansi-to-html') +const CONVERT = new Convert({ + bg: 'transparent', + colors: { 4: 'Cyan' }, + escapeXML: true, +}) + +export function convertAnsi(entries: readonly Log[]): string { + return entries + .map( + ({ timestamp, message }) => + `${toLocalIsoString( + new Date(timestamp), + )}  ${CONVERT.toHtml(message)}`, + ) + .join('
    ') +} diff --git a/web/projects/shared/styles/taiga.scss b/web/projects/shared/styles/taiga.scss index 064ecc855..f2566adfa 100644 --- a/web/projects/shared/styles/taiga.scss +++ b/web/projects/shared/styles/taiga.scss @@ -168,6 +168,7 @@ tui-hint[data-appearance='onDark'] { tui-dropdown[data-appearance='start-os'][data-appearance='start-os'] { border: 0; + backdrop-filter: blur(0.25rem); box-shadow: 0 0.25rem 0.25rem rgb(0 0 0 / 25%); // TODO: Replace --tui-elevation-02 when Taiga UI is updated background: rgb(63 63 63 / 95%); diff --git a/web/projects/ui/src/app/apps/portal/components/header/header.component.ts b/web/projects/ui/src/app/apps/portal/components/header/header.component.ts index 6823d6f37..8d9599943 100644 --- a/web/projects/ui/src/app/apps/portal/components/header/header.component.ts +++ b/web/projects/ui/src/app/apps/portal/components/header/header.component.ts @@ -43,11 +43,15 @@ import { BreadcrumbsService } from '../../services/breadcrumbs.service' ); > * { - @include transition(clip-path); + @include transition(all); position: relative; margin-left: -1.25rem; backdrop-filter: blur(1rem); clip-path: var(--clip-path); + + &:active { + backdrop-filter: blur(2rem) brightness(0.75) saturate(0.75); + } } } @@ -60,11 +64,16 @@ import { BreadcrumbsService } from '../../services/breadcrumbs.service' opacity: 0.5; .active & { - opacity: 0.25; + opacity: 0.75; + + &::before { + // TODO: Theme + background: #363636; + } } &::before { - @include transition(clip-path); + @include transition(all); content: ''; position: absolute; inset: 0; diff --git a/web/projects/ui/src/app/apps/portal/components/logs/logs-download.directive.ts b/web/projects/ui/src/app/apps/portal/components/logs/logs-download.directive.ts new file mode 100644 index 000000000..b983579f1 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/components/logs/logs-download.directive.ts @@ -0,0 +1,52 @@ +import { Directive, HostListener, inject, Input } from '@angular/core' +import { + convertAnsi, + DownloadHTMLService, + ErrorService, + FetchLogsReq, + FetchLogsRes, + LoadingService, +} from '@start9labs/shared' +import { LogsComponent } from './logs.component' + +@Directive({ + standalone: true, + selector: 'button[logsDownload]', +}) +export class LogsDownloadDirective { + private readonly component = inject(LogsComponent) + private readonly loader = inject(LoadingService) + private readonly errorService = inject(ErrorService) + private readonly downloadHtml = inject(DownloadHTMLService) + + @Input({ required: true }) + logsDownload!: (params: FetchLogsReq) => Promise + + @HostListener('click') + async download() { + const loader = this.loader.open('Processing 10,000 logs...').subscribe() + + try { + const { entries } = await this.logsDownload({ + before: true, + limit: 10000, + }) + + this.downloadHtml.download( + `${this.component.context}-logs.html`, + convertAnsi(entries), + STYLES, + ) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } +} + +const STYLES = { + 'background-color': '#222428', + color: '#e0e0e0', + 'font-family': 'monospace', +} diff --git a/web/projects/ui/src/app/apps/portal/components/logs/logs-fetch.directive.ts b/web/projects/ui/src/app/apps/portal/components/logs/logs-fetch.directive.ts new file mode 100644 index 000000000..17128ff47 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/components/logs/logs-fetch.directive.ts @@ -0,0 +1,36 @@ +import { Directive, inject, Output } from '@angular/core' +import { IntersectionObserveeService } from '@ng-web-apis/intersection-observer' +import { convertAnsi, ErrorService } from '@start9labs/shared' +import { catchError, defer, filter, from, map, of, switchMap, tap } from 'rxjs' +import { LogsComponent } from './logs.component' + +@Directive({ + standalone: true, + selector: '[logsFetch]', +}) +export class LogsFetchDirective { + private readonly observer = inject(IntersectionObserveeService) + private readonly component = inject(LogsComponent) + private readonly errors = inject(ErrorService) + + @Output() + readonly logsFetch = defer(() => this.observer).pipe( + filter(([{ isIntersecting }]) => isIntersecting && !this.component.scroll), + switchMap(() => + from( + this.component.fetchLogs({ + cursor: this.component.startCursor, + before: true, + limit: 400, + }), + ), + ), + tap(res => this.component.setCursor(res['start-cursor'])), + map(({ entries }) => convertAnsi(entries)), + catchError(e => { + this.errors.handleError(e) + + return of('') + }), + ) +} diff --git a/web/projects/ui/src/app/apps/portal/components/logs/logs.component.html b/web/projects/ui/src/app/apps/portal/components/logs/logs.component.html new file mode 100644 index 000000000..0f1424d0b --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/components/logs/logs.component.html @@ -0,0 +1,66 @@ + +
    + @if (loading) { + + } +
    + +
    + @for (log of previous; track log) { +
    
    +    }
    +  
    + + @if (followLogs | logs | async; as logs) { +
    + @for (log of logs; track log) { +
    
    +      }
    +
    +      @if ((status$ | async) !== 'connected') {
    +        

    + {{ + status$.value === 'reconnecting' + ? 'Reconnecting' + : 'Waiting for network connectivity' + }} +

    + } +
    + } @else { + + } + +
    +
    + +
    + + +
    diff --git a/web/projects/ui/src/app/apps/portal/components/logs/logs.component.scss b/web/projects/ui/src/app/apps/portal/components/logs/logs.component.scss new file mode 100644 index 000000000..cdca063f1 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/components/logs/logs.component.scss @@ -0,0 +1,43 @@ +:host { + display: flex; + flex-direction: column; + height: 100%; + overflow: hidden; +} + +.scrollbar { + flex: 1; +} + +.loading-dots { + text-align: center; +} + +.top { + height: 10rem; + margin-bottom: -5rem; +} + +.bottom { + height: 3rem; +} + +.footer { + display: flex; + align-items: center; + justify-content: space-between; + padding-top: 1rem; + border-top: 1px solid var(--tui-clear); +} + +[data-status='reconnecting'] { + color: var(--tui-success-fill); +} + +[data-status='disconnected'] { + color: var(--tui-warning-fill); +} + +pre { + overflow: visible; +} diff --git a/web/projects/ui/src/app/apps/portal/components/logs/logs.component.ts b/web/projects/ui/src/app/apps/portal/components/logs/logs.component.ts new file mode 100644 index 000000000..ce36eed3a --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/components/logs/logs.component.ts @@ -0,0 +1,104 @@ +import { CommonModule } from '@angular/common' +import { Component, ElementRef, Input, ViewChild } from '@angular/core' +import { + INTERSECTION_ROOT, + IntersectionObserverModule, +} from '@ng-web-apis/intersection-observer' +import { MutationObserverModule } from '@ng-web-apis/mutation-observer' +import { FetchLogsReq, FetchLogsRes } from '@start9labs/shared' +import { + TuiLoaderModule, + TuiScrollbarComponent, + TuiScrollbarModule, +} from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' +import { NgDompurifyModule } from '@tinkoff/ng-dompurify' +import { RR } from 'src/app/services/api/api.types' +import { LogsDownloadDirective } from './logs-download.directive' +import { LogsFetchDirective } from './logs-fetch.directive' +import { LogsPipe } from './logs.pipe' +import { BehaviorSubject } from 'rxjs' + +@Component({ + standalone: true, + selector: 'logs', + templateUrl: './logs.component.html', + styleUrls: ['./logs.component.scss'], + imports: [ + CommonModule, + IntersectionObserverModule, + MutationObserverModule, + NgDompurifyModule, + TuiButtonModule, + TuiLoaderModule, + TuiScrollbarModule, + LogsDownloadDirective, + LogsFetchDirective, + LogsPipe, + ], + providers: [ + { + provide: INTERSECTION_ROOT, + useExisting: ElementRef, + }, + ], +}) +export class LogsComponent { + @ViewChild('bottom') + private readonly bottom?: ElementRef + + @ViewChild(TuiScrollbarComponent, { read: ElementRef }) + private readonly scrollbar?: ElementRef + + @Input({ required: true }) followLogs!: ( + params: RR.FollowServerLogsReq, + ) => Promise + + @Input({ required: true }) fetchLogs!: ( + params: FetchLogsReq, + ) => Promise + + @Input({ required: true }) context!: string + + scrollTop = 0 + startCursor?: string + scroll = true + loading = false + previous: readonly string[] = [] + + readonly status$ = new BehaviorSubject< + 'connected' | 'disconnected' | 'reconnecting' + >('connected') + + onLoading(loading: boolean) { + this.loading = loading && !this.scroll + } + + onPrevious(previous: string) { + this.onLoading(false) + this.scrollTop = this.scrollbar?.nativeElement.scrollTop || 0 + this.previous = [previous, ...this.previous] + } + + setCursor(startCursor = this.startCursor) { + this.startCursor = startCursor + } + + setScroll(scroll: boolean) { + this.scroll = scroll + } + + restoreScroll({ firstElementChild }: HTMLElement) { + this.scrollbar?.nativeElement.scrollTo( + this.scrollbar?.nativeElement.scrollLeft || 0, + this.scrollTop + (firstElementChild?.clientHeight || 0), + ) + } + + scrollToBottom() { + if (this.scroll) + this.bottom?.nativeElement.scrollIntoView({ + behavior: 'smooth', + }) + } +} diff --git a/web/projects/ui/src/app/apps/portal/components/logs/logs.pipe.ts b/web/projects/ui/src/app/apps/portal/components/logs/logs.pipe.ts new file mode 100644 index 000000000..4c3df9c4c --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/components/logs/logs.pipe.ts @@ -0,0 +1,87 @@ +import { inject, Pipe, PipeTransform } from '@angular/core' +import { convertAnsi, toLocalIsoString } from '@start9labs/shared' +import { + bufferTime, + catchError, + defer, + filter, + ignoreElements, + map, + merge, + Observable, + repeat, + scan, + skipWhile, + startWith, + switchMap, + take, + tap, +} from 'rxjs' +import { RR } from 'src/app/services/api/api.types' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { ConnectionService } from 'src/app/services/connection.service' +import { LogsComponent } from './logs.component' + +@Pipe({ + name: 'logs', + standalone: true, +}) +export class LogsPipe implements PipeTransform { + private readonly api = inject(ApiService) + private readonly logs = inject(LogsComponent) + private readonly connection = inject(ConnectionService) + + transform( + followLogs: ( + params: RR.FollowServerLogsReq, + ) => Promise, + ): Observable { + return merge( + this.logs.status$.pipe( + skipWhile(value => value === 'connected'), + filter(value => value === 'connected'), + map(() => getMessage(true)), + ), + defer(() => followLogs(this.options)).pipe( + tap(r => this.logs.setCursor(r['start-cursor'])), + switchMap(r => this.api.openLogsWebsocket$(this.toConfig(r.guid))), + bufferTime(1000), + filter(logs => !!logs.length), + map(convertAnsi), + ), + ).pipe( + catchError(() => + this.connection.connected$.pipe( + tap(v => this.logs.status$.next(v ? 'reconnecting' : 'disconnected')), + filter(Boolean), + take(1), + ignoreElements(), + startWith(getMessage(false)), + ), + ), + repeat(), + scan((logs: string[], log) => [...logs, log], []), + ) + } + + private get options() { + return this.logs.status$.value === 'connected' ? { limit: 400 } : {} + } + + private toConfig(guid: string) { + return { + url: `/rpc/${guid}`, + openObserver: { + next: () => this.logs.status$.next('connected'), + }, + } + } +} + +function getMessage(success: boolean): string { + return `

    ${ + success ? 'Reconnected' : 'Disconnected' + } at ${toLocalIsoString(new Date())}

    ` +} diff --git a/web/projects/ui/src/app/apps/portal/constants/system-utilities.ts b/web/projects/ui/src/app/apps/portal/constants/system-utilities.ts index 361cc319d..b71ee8e01 100644 --- a/web/projects/ui/src/app/apps/portal/constants/system-utilities.ts +++ b/web/projects/ui/src/app/apps/portal/constants/system-utilities.ts @@ -4,6 +4,10 @@ export const SYSTEM_UTILITIES: Record = icon: 'tuiIconSave', title: 'Backups', }, + '/portal/system/logs': { + icon: 'tuiIconFileText', + title: 'Logs', + }, '/portal/system/marketplace': { icon: 'tuiIconShoppingCart', title: 'Marketplace', diff --git a/web/projects/ui/src/app/apps/portal/routes/service/routes/logs.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/routes/logs.component.ts index 207317b85..719eab01a 100644 --- a/web/projects/ui/src/app/apps/portal/routes/service/routes/logs.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/service/routes/logs.component.ts @@ -1,29 +1,16 @@ import { ChangeDetectionStrategy, Component, inject } from '@angular/core' import { ActivatedRoute } from '@angular/router' import { getPkgId } from '@start9labs/shared' -import { LogsComponentModule } from 'src/app/common/logs/logs.component.module' import { ApiService } from 'src/app/services/api/embassy-api.service' import { RR } from 'src/app/services/api/api.types' +import { LogsComponent } from 'src/app/apps/portal/components/logs/logs.component' @Component({ template: '', - styles: [ - ` - logs { - display: block; - height: calc(100% - 9rem); - min-height: 20rem; - margin-bottom: 5rem; - - ::ng-deep ion-header { - display: none; - } - } - `, - ], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, - imports: [LogsComponentModule], + styles: [':host { height: 100%}'], + imports: [LogsComponent], }) export class ServiceLogsRoute { private readonly api = inject(ApiService) diff --git a/web/projects/ui/src/app/apps/portal/routes/service/routes/outlet.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/routes/outlet.component.ts index a0a1f4121..6dcd7a26a 100644 --- a/web/projects/ui/src/app/apps/portal/routes/service/routes/outlet.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/service/routes/outlet.component.ts @@ -1,45 +1,19 @@ import { CommonModule } from '@angular/common' import { ChangeDetectionStrategy, Component, inject } from '@angular/core' -import { ActivatedRoute, Router, RouterModule } from '@angular/router' -import { TuiIconModule } from '@taiga-ui/experimental' +import { ActivatedRoute, Router, RouterOutlet } from '@angular/router' import { PatchDB } from 'patch-db-client' import { distinctUntilChanged, filter, map, switchMap, tap } from 'rxjs' import { DataModel } from 'src/app/services/patch-db/data-model' -import { toRouterLink } from '../../../utils/to-router-link' @Component({ template: ` - - - {{ service.manifest.title }} - + `, - styles: [ - ` - a { - display: inline-flex; - align-items: center; - gap: 0.5rem; - margin: 1rem 0; - font-size: 1rem; - color: var(--tui-text-01); - } - - ._current { - display: none; - } - `, - ], host: { class: 'g-page' }, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, - imports: [CommonModule, RouterModule, TuiIconModule], + imports: [CommonModule, RouterOutlet], }) export class ServiceOutletComponent { private readonly patch = inject(PatchDB) @@ -58,8 +32,4 @@ export class ServiceOutletComponent { } }), ) - - getLink(id: string): string { - return toRouterLink(id) - } } diff --git a/web/projects/ui/src/app/apps/portal/routes/system/backups/backups.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/backups.component.ts index 59e5af346..01f29e551 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/backups/backups.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/backups/backups.component.ts @@ -40,7 +40,7 @@ import { JOBS } from './modals/jobs.component' BackupsUpcomingComponent, ], }) -export class BackupsComponent { +export default class BackupsComponent { private readonly dialogs = inject(TuiDialogService) readonly options = [ diff --git a/web/projects/ui/src/app/apps/portal/routes/system/logs/logs.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/logs/logs.component.ts new file mode 100644 index 000000000..0ea32aa6f --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/logs/logs.component.ts @@ -0,0 +1,95 @@ +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { FormsModule } from '@angular/forms' +import { TuiTextfieldControllerModule } from '@taiga-ui/core' +import { TuiSelectModule } from '@taiga-ui/kit' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { RR } from 'src/app/services/api/api.types' +import { LogsComponent } from '../../../components/logs/logs.component' + +@Component({ + template: ` +
    + + {{ subtitle }} + + + @switch (logs) { + @case ('OS Logs') { + + } + @case ('Kernel Logs') { + + } + @case ('Tor Logs') { + + } + } + `, + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + host: { class: 'g-edged' }, + styles: [ + ` + tui-select { + margin: -0.5rem 0 1rem; + } + + logs { + height: calc(100% - 4rem); + } + `, + ], + imports: [ + FormsModule, + TuiSelectModule, + TuiTextfieldControllerModule, + LogsComponent, + ], +}) +export default class SystemLogsComponent { + private readonly api = inject(ApiService) + readonly items = ['OS Logs', 'Kernel Logs', 'Tor Logs'] + logs = 'OS Logs' + + readonly followOS = async (params: RR.FollowServerLogsReq) => + this.api.followServerLogs(params) + readonly fetchOS = async (params: RR.GetServerLogsReq) => + this.api.getServerLogs(params) + + readonly followKernel = async (params: RR.FollowServerLogsReq) => + this.api.followKernelLogs(params) + readonly fetchKernel = async (params: RR.GetServerLogsReq) => + this.api.getKernelLogs(params) + + readonly followTor = async (params: RR.FollowServerLogsReq) => + this.api.followTorLogs(params) + readonly fetchTor = async (params: RR.GetServerLogsReq) => + this.api.getTorLogs(params) + + get subtitle(): string { + switch (this.logs) { + case 'OS Logs': + return 'Raw, unfiltered operating system logs' + case 'Kernel Logs': + return 'Diagnostic log stream for device drivers and other kernel processes' + default: + return 'Diagnostic log stream for the Tor daemon on StartOS' + } + } +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/notifications/notifications.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/notifications/notifications.component.ts index 59a95ce2a..7a54eb8da 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/notifications/notifications.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/notifications/notifications.component.ts @@ -63,7 +63,7 @@ import { NotificationsTableComponent } from './table.component' TuiLetModule, ], }) -export class NotificationsComponent { +export default class NotificationsComponent { readonly service = inject(NotificationService) readonly api = inject(ApiService) readonly errorService = inject(ErrorService) diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.routes.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.routes.ts index cdab4fd56..3b5c37a37 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.routes.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.routes.ts @@ -1,8 +1,6 @@ -import { Routes } from '@angular/router' - import { SettingsComponent } from './settings.component' -export const SETTINGS_ROUTES: Routes = [ +export default [ { path: '', component: SettingsComponent, diff --git a/web/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.component.ts index a6d5c84d4..dfd08b16a 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/sideload/sideload.component.ts @@ -93,7 +93,7 @@ import { SideloadPackageComponent } from './package.component' SideloadPackageComponent, ], }) -export class SideloadComponent { +export default class SideloadComponent { readonly refresh$ = new Subject() readonly isTor = inject(ConfigService).isTor() diff --git a/web/projects/ui/src/app/apps/portal/routes/system/snek/snek.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/snek/snek.component.ts index 57f7c2653..6eb12a532 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/snek/snek.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/snek/snek.component.ts @@ -5,4 +5,4 @@ import { ChangeDetectionStrategy, Component } from '@angular/core' standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, }) -export class SnekComponent {} +export default class SnekComponent {} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/system.module.ts b/web/projects/ui/src/app/apps/portal/routes/system/system.module.ts index c8000e851..92691e6e2 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/system.module.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/system.module.ts @@ -7,10 +7,15 @@ const ROUTES: Routes = [ { title: systemTabResolver, path: 'backups', - loadComponent: () => - import('./backups/backups.component').then(m => m.BackupsComponent), + loadComponent: () => import('./backups/backups.component'), data: toNavigationItem('/portal/system/backups'), }, + { + title: systemTabResolver, + path: 'logs', + loadComponent: () => import('./logs/logs.component'), + data: toNavigationItem('/portal/system/logs'), + }, { title: systemTabResolver, path: 'marketplace', @@ -20,38 +25,31 @@ const ROUTES: Routes = [ { title: systemTabResolver, path: 'settings', - loadChildren: () => - import('./settings/settings.routes').then(m => m.SETTINGS_ROUTES), + loadChildren: () => import('./settings/settings.routes'), data: toNavigationItem('/portal/system/settings'), }, { title: systemTabResolver, path: 'notifications', - loadComponent: () => - import('./notifications/notifications.component').then( - m => m.NotificationsComponent, - ), + loadComponent: () => import('./notifications/notifications.component'), data: toNavigationItem('/portal/system/notifications'), }, { title: systemTabResolver, path: 'sideload', - loadComponent: () => - import('./sideload/sideload.component').then(m => m.SideloadComponent), + loadComponent: () => import('./sideload/sideload.component'), data: toNavigationItem('/portal/system/sideload'), }, { title: systemTabResolver, path: 'updates', - loadComponent: () => - import('./updates/updates.component').then(m => m.UpdatesComponent), + loadComponent: () => import('./updates/updates.component'), data: toNavigationItem('/portal/system/updates'), }, { title: systemTabResolver, path: 'snek', - loadComponent: () => - import('./snek/snek.component').then(m => m.SnekComponent), + loadComponent: () => import('./snek/snek.component'), data: toNavigationItem('/portal/system/snek'), }, ] diff --git a/web/projects/ui/src/app/apps/portal/routes/system/updates/updates.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/updates/updates.component.ts index 1b4b48434..1f8de4437 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/updates/updates.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/updates/updates.component.ts @@ -34,7 +34,7 @@ import { SkeletonListComponent } from '../../../components/skeleton-list.compone

    Date: Tue, 13 Feb 2024 20:03:09 +0400 Subject: [PATCH 045/169] feat: implement mobile header (#2559) * feat: implement mobile header * chore: remove remaining ties to old ui project * chore: remove ionic from login page * chore: address comments --- web/package-lock.json | 195 ++++++------ web/package.json | 17 +- web/projects/marketplace/package.json | 1 - .../store-icon/store-icon.component.html | 10 - .../store-icon/store-icon.component.module.ts | 4 +- .../store-icon/store-icon.component.scss | 0 .../store-icon/store-icon.component.ts | 14 +- .../list/categories/categories.module.ts | 3 +- .../list/skeleton/skeleton.component.html | 69 ---- .../pages/list/skeleton/skeleton.component.ts | 8 - .../pages/list/skeleton/skeleton.module.ts | 13 - .../release-notes.component.html | 6 +- .../release-notes/release-notes.module.ts | 17 +- .../show/screenshots/screenshots.component.ts | 11 +- .../initializing/initializing.component.html | 43 +-- .../initializing/initializing.component.scss | 23 +- .../initializing/initializing.module.ts | 4 +- .../markdown/markdown.component.html | 10 +- .../markdown/markdown.component.module.ts | 7 +- web/projects/shared/styles/taiga.scss | 1 + web/projects/ui/src/app/app.module.ts | 43 ++- web/projects/ui/src/app/app.providers.ts | 22 +- .../ui/src/app/apps/loading/loading.module.ts | 4 +- .../ui/src/app/apps/loading/loading.page.html | 4 - .../ui/src/app/apps/loading/loading.page.ts | 10 +- .../login/ca-wizard/ca-wizard.component.html | 202 ++++++------ .../login/ca-wizard/ca-wizard.component.scss | 87 ++--- .../login/ca-wizard/ca-wizard.component.ts | 43 +-- .../ui/src/app/apps/login/login.module.ts | 31 +- .../ui/src/app/apps/login/login.page.html | 115 ++----- .../ui/src/app/apps/login/login.page.scss | 81 ++--- .../ui/src/app/apps/login/login.page.ts | 8 - .../src/app/apps/login/warning.component.ts | 60 ++++ .../apps/portal/components/form.component.ts | 166 ++++++++++ .../components/header/connection.component.ts | 14 + .../components/header/header.component.ts | 97 +++++- .../components/header/menu.component.ts | 17 +- .../components/header/mobile.component.ts | 68 ++++ .../components/header/snek.component.ts | 300 ++++++++++++++++++ .../components/header/snek.directive.ts | 47 +++ .../apps/portal/modals/prompt.component.ts | 124 ++++++++ .../routes/service/modals/config.component.ts | 16 +- .../service/routes/actions.component.ts | 4 +- .../backups/components/physical.component.ts | 4 +- .../backups/modals/targets.component.ts | 10 +- .../backups/services/restore.service.ts | 6 +- .../routes/system/backups/types/target.ts | 121 +++++++ .../components/sidebars.component.ts | 2 +- .../marketplace/modals/registry.component.ts | 4 +- .../routes/domains/domains.component.ts | 18 +- .../settings/routes/email/email.component.ts | 42 ++- .../settings/routes/proxies/menu.component.ts | 7 +- .../routes/proxies/proxies.component.ts | 7 +- .../settings/routes/ssh/table.component.ts | 6 +- .../settings/routes/wifi/table.component.ts | 7 +- .../settings/routes/wifi/wifi.component.ts | 13 +- .../system/settings/settings.service.ts | 6 +- .../routes/system/snek/snek.component.ts | 8 - .../portal/routes/system/system.module.ts | 6 - .../portal/services/breadcrumbs.service.ts | 2 +- .../app/services/patch-db/patch-db.module.ts | 20 -- .../services/patch-db/patch-db.providers.ts | 16 + web/projects/ui/src/styles.scss | 10 +- 63 files changed, 1543 insertions(+), 791 deletions(-) delete mode 100644 web/projects/marketplace/src/components/store-icon/store-icon.component.html delete mode 100644 web/projects/marketplace/src/components/store-icon/store-icon.component.scss delete mode 100644 web/projects/marketplace/src/pages/list/skeleton/skeleton.component.html delete mode 100644 web/projects/marketplace/src/pages/list/skeleton/skeleton.component.ts delete mode 100644 web/projects/marketplace/src/pages/list/skeleton/skeleton.module.ts delete mode 100644 web/projects/ui/src/app/apps/loading/loading.page.html create mode 100644 web/projects/ui/src/app/apps/login/warning.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/components/form.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/components/header/mobile.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/components/header/snek.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/components/header/snek.directive.ts create mode 100644 web/projects/ui/src/app/apps/portal/modals/prompt.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/backups/types/target.ts delete mode 100644 web/projects/ui/src/app/apps/portal/routes/system/snek/snek.component.ts delete mode 100644 web/projects/ui/src/app/services/patch-db/patch-db.module.ts create mode 100644 web/projects/ui/src/app/services/patch-db/patch-db.providers.ts diff --git a/web/package-lock.json b/web/package-lock.json index f77d5be5e..0a28b4f8f 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -24,14 +24,15 @@ "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc8.beta2", - "@taiga-ui/addon-charts": "3.57.0", - "@taiga-ui/addon-mobile": "3.57.0", - "@taiga-ui/cdk": "3.57.0", - "@taiga-ui/core": "3.57.0", - "@taiga-ui/experimental": "3.57.0", - "@taiga-ui/icons": "3.57.0", - "@taiga-ui/kit": "3.57.0", - "@taiga-ui/styles": "3.57.0", + "@taiga-ui/addon-charts": "^3.65.0", + "@taiga-ui/addon-commerce": "^3.65.0", + "@taiga-ui/addon-mobile": "^3.65.0", + "@taiga-ui/cdk": "^3.65.0", + "@taiga-ui/core": "^3.65.0", + "@taiga-ui/experimental": "^3.65.0", + "@taiga-ui/icons": "^3.65.0", + "@taiga-ui/kit": "^3.65.0", + "@taiga-ui/styles": "^3.65.0", "@tinkoff/ng-dompurify": "4.0.0", "@tinkoff/ng-event-plugins": "3.1.0", "ansi-to-html": "^0.7.2", @@ -3983,9 +3984,9 @@ } }, "node_modules/@ng-web-apis/intersection-observer": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@ng-web-apis/intersection-observer/-/intersection-observer-3.1.6.tgz", - "integrity": "sha512-Pzk0ycnYpq+EUf60kz+/A7nvCmhYzThc4ArwONwZzJqRF5xOS97CVWObs8hesorXxQdqlsrDNiu+JWuGxEvpzQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@ng-web-apis/intersection-observer/-/intersection-observer-3.2.0.tgz", + "integrity": "sha512-EhwqEZJFKR9pz55TWp82qyWTXdg8TZeMP6bUw26bVHz8CTkgrpzaXdtxurMTvJ/+gwuFy4JSJLjBeV9nfZ/SXA==", "dependencies": { "tslib": "^2.2.0" }, @@ -3995,9 +3996,9 @@ } }, "node_modules/@ng-web-apis/mutation-observer": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-3.0.6.tgz", - "integrity": "sha512-UW1qoUi2whH0uWkVz5qpdYCLs1u2T0E0QoCMQKZfLEkBpsWRTkT0PTCa9WWX/BhehaSPg23nZZm8BEixd6PI9w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-3.1.0.tgz", + "integrity": "sha512-MFN0TLLBMFJJPpXkGFe9ChRCSOKvMHZRRtBq5jHWS7tv5/CtdUkqW5CU7RC9KTzZjGeMzYe0cXO4JRkjL5aZ9g==", "dependencies": { "tslib": "^2.2.0" }, @@ -4671,9 +4672,9 @@ } }, "node_modules/@taiga-ui/addon-charts": { - "version": "3.57.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.57.0.tgz", - "integrity": "sha512-/x/yVHafSmNA3GSR9cSo6KSkzDNzDGew0JCD5cCNOb6vRZOe1QiXUQwMHvdj9eZlrjZzbV67eiV13NNvWolGwg==", + "version": "3.65.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.65.0.tgz", + "integrity": "sha512-HNKUeK0ippIvLRF6wsuCiyJ4d98K4uIhkGwK1fWaTVOCN26Z+AnFKk9AryTyhocEZctyc4PMpJ7BP7h3CA4dZA==", "dependencies": { "tslib": "2.6.2" }, @@ -4681,16 +4682,15 @@ "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@ng-web-apis/common": "3.0.6", - "@taiga-ui/cdk": ">=3.57.0", - "@taiga-ui/core": ">=3.57.0", + "@taiga-ui/cdk": "^3.65.0", + "@taiga-ui/core": "^3.65.0", "@tinkoff/ng-polymorpheus": "4.3.0" } }, "node_modules/@taiga-ui/addon-commerce": { - "version": "3.57.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-commerce/-/addon-commerce-3.57.0.tgz", - "integrity": "sha512-9msjwr/8tzlmbcv6MDxZTYvW9+sbURAq2Olrs4zJhHvw69tA3XYt2MCrDYUSrej/oj5jE2GFjtyio7wqQviLzA==", - "peer": true, + "version": "3.65.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-commerce/-/addon-commerce-3.65.0.tgz", + "integrity": "sha512-D98M3nkPKVFz9TFiMxCmMtmJs9vDc69RlPv5M03ZF+qXHqbthfpVss/p2MSzs4Cr2vgoECaZWPLNcWBOO5mzCw==", "dependencies": { "tslib": "2.6.2" }, @@ -4702,18 +4702,18 @@ "@maskito/core": "1.9.0", "@maskito/kit": "1.9.0", "@ng-web-apis/common": "3.0.6", - "@taiga-ui/cdk": ">=3.57.0", - "@taiga-ui/core": ">=3.57.0", - "@taiga-ui/i18n": ">=3.57.0", - "@taiga-ui/kit": ">=3.57.0", + "@taiga-ui/cdk": "^3.65.0", + "@taiga-ui/core": "^3.65.0", + "@taiga-ui/i18n": "^3.65.0", + "@taiga-ui/kit": "^3.65.0", "@tinkoff/ng-polymorpheus": "4.3.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/addon-mobile": { - "version": "3.57.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-mobile/-/addon-mobile-3.57.0.tgz", - "integrity": "sha512-fxtmOqf8qcWbDeKKHukP+Iw0Ida8onKlg0L4UkeqF5AHT1f9QnpDtIQxyEUw4DXwUQdFhMT+64FWeA4acwa+kA==", + "version": "3.65.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-mobile/-/addon-mobile-3.65.0.tgz", + "integrity": "sha512-nKEf5Lb7yfR7vqkAIQQLoUEzSpKftdPpAsmco6FNfN4FDlvDFYTKE8MqqXAxzEqrXviDXv8/CKPv+nc6xd4VXg==", "dependencies": { "tslib": "2.6.2" }, @@ -4722,27 +4722,27 @@ "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@ng-web-apis/common": "3.0.6", - "@taiga-ui/cdk": ">=3.57.0", - "@taiga-ui/core": ">=3.57.0", - "@taiga-ui/kit": ">=3.57.0", + "@taiga-ui/cdk": "^3.65.0", + "@taiga-ui/core": "^3.65.0", + "@taiga-ui/kit": "^3.65.0", "@tinkoff/ng-polymorpheus": "4.3.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/cdk": { - "version": "3.57.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.57.0.tgz", - "integrity": "sha512-igfgPZh7sUaElX4dehDPkbPL66LFc6qmirfEQ6f2deNnezYm4EZTTIdHebU1ibiKTqWBxWVTHKC2pQ3nxhwkNA==", + "version": "3.65.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.65.0.tgz", + "integrity": "sha512-hiFC9RlRng7pUv84YPZbqieKIYsFEzsMKCjMIckHBASBBU6qQ4OY6irKszFvTGqMe9KJgBh6sJU1hkQOBwFSaA==", "dependencies": { "@ng-web-apis/common": "3.0.6", - "@ng-web-apis/mutation-observer": "3.0.6", + "@ng-web-apis/mutation-observer": "3.1.0", "@ng-web-apis/resize-observer": "3.0.6", "@tinkoff/ng-event-plugins": "3.1.0", "@tinkoff/ng-polymorpheus": "4.3.0", "tslib": "2.6.2" }, "optionalDependencies": { - "ng-morph": "4.0.3", + "ng-morph": "4.0.5", "parse5": "6.0.1" }, "peerDependencies": { @@ -4760,11 +4760,11 @@ "optional": true }, "node_modules/@taiga-ui/core": { - "version": "3.57.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.57.0.tgz", - "integrity": "sha512-RUO//9C9+CdEPX1nV0hKRhKu3vmuAx+miszZHv5LAITK3jpTJKpd2jQ2Ib2z5O20v5vKrwkJ0DawT7EWU2v2TA==", + "version": "3.65.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.65.0.tgz", + "integrity": "sha512-zNctTTsrW73fhmYirWE/mZs32UUvv6gV5CoIFm0BzVos0X7ZkN+x7PLXd9R+3CEgL6Kv/OxY92p+pJRvqc5jHg==", "dependencies": { - "@taiga-ui/i18n": "^3.57.0", + "@taiga-ui/i18n": "^3.65.0", "tslib": "2.6.2" }, "peerDependencies": { @@ -4775,36 +4775,36 @@ "@angular/platform-browser": ">=12.0.0", "@angular/router": ">=12.0.0", "@ng-web-apis/common": "3.0.6", - "@ng-web-apis/mutation-observer": "3.0.6", - "@taiga-ui/cdk": ">=3.57.0", - "@taiga-ui/i18n": ">=3.57.0", + "@ng-web-apis/mutation-observer": "3.1.0", + "@taiga-ui/cdk": "^3.65.0", + "@taiga-ui/i18n": "^3.65.0", "@tinkoff/ng-event-plugins": "3.1.0", "@tinkoff/ng-polymorpheus": "4.3.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/experimental": { - "version": "3.57.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/experimental/-/experimental-3.57.0.tgz", - "integrity": "sha512-A0u/Cn0tHUjl6sTSfF6G9YvzuEJafBoVbHuDpw1mnSOw/TkWLXpkoYzeyJ6U9+nBIFBOSl4o+14olrYvsUg9CA==", + "version": "3.65.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/experimental/-/experimental-3.65.0.tgz", + "integrity": "sha512-LZYR+XeJ2n+vE4AHBiIolzlqDrDGUx/bmE0ypmKO7dPgvHWu5Al8OXRrnhyqmAVO48FNpkSZ07YoqCG/aoxu6g==", "dependencies": { "tslib": "2.6.2" }, "peerDependencies": { "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", - "@taiga-ui/addon-commerce": ">=3.57.0", - "@taiga-ui/cdk": ">=3.57.0", - "@taiga-ui/core": ">=3.57.0", - "@taiga-ui/kit": ">=3.57.0", + "@taiga-ui/addon-commerce": "^3.65.0", + "@taiga-ui/cdk": "^3.65.0", + "@taiga-ui/core": "^3.65.0", + "@taiga-ui/kit": "^3.65.0", "@tinkoff/ng-polymorpheus": "4.3.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/i18n": { - "version": "3.57.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.57.0.tgz", - "integrity": "sha512-FhE3eMD5g+i0/SbRgq4zoA7pBVY1mw4/gwndOJvCFkcWhjYxOJXJ4g/sjTyQmZ4QXmONM0OeIOMBxuMMCeJkGQ==", + "version": "3.65.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.65.0.tgz", + "integrity": "sha512-lHy9VDKc5IXbm40eJnnAyOlmm3vDgmWhGbr5woGe9bV/tTqsBBDATY7Rkhz7Bu1nbX7X+MI0TDfQh9ayoCCKRQ==", "dependencies": { "tslib": "2.6.2" }, @@ -4815,25 +4815,25 @@ } }, "node_modules/@taiga-ui/icons": { - "version": "3.57.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.57.0.tgz", - "integrity": "sha512-uXch0AX8DQMCrv2ldQIYmUUjMmhP2tgOLxX08GrPZCWsz6zHq8stgUJR6kgvZYwO1JZSFlwvCgv/32MoDEdI3w==", + "version": "3.65.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.65.0.tgz", + "integrity": "sha512-8iE6EuK+QBzcNiRM1ThZOOkZpal7V6dBouMXMj+QphRWiIp8Znj58mtY3L+uwQFpGnxt3DRs4p4eEA9ZuGFssw==", "dependencies": { "tslib": "2.6.2" }, "peerDependencies": { - "@taiga-ui/cdk": ">=3.57.0" + "@taiga-ui/cdk": "^3.65.0" } }, "node_modules/@taiga-ui/kit": { - "version": "3.57.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.57.0.tgz", - "integrity": "sha512-vZNMKlPku5E1wCiPdRV3GbNKba4molyd6F2Zc4EMJvHAlWybFpVPQOw67Z7VsSLGwWpzZXBC+5M5Ov3UNOUSJQ==", + "version": "3.65.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.65.0.tgz", + "integrity": "sha512-Nh6pMSAFR7yScF7acj8WdCpKQUgDatW2jObqts0z4hy9BJ8gl9BAWRBgSlbp3Oen5c2WAIC316Gb9OcttC8nbw==", "dependencies": { "@maskito/angular": "1.9.0", "@maskito/core": "1.9.0", "@maskito/kit": "1.9.0", - "@ng-web-apis/intersection-observer": "3.1.6", + "@ng-web-apis/intersection-observer": "3.2.0", "text-mask-core": "5.1.2", "tslib": "2.6.2" }, @@ -4843,21 +4843,21 @@ "@angular/forms": ">=12.0.0", "@angular/router": ">=12.0.0", "@ng-web-apis/common": "3.0.6", - "@ng-web-apis/mutation-observer": "3.0.6", + "@ng-web-apis/mutation-observer": "3.1.0", "@ng-web-apis/resize-observer": "3.0.6", - "@taiga-ui/cdk": ">=3.57.0", - "@taiga-ui/core": ">=3.57.0", - "@taiga-ui/i18n": ">=3.57.0", + "@taiga-ui/cdk": "^3.65.0", + "@taiga-ui/core": "^3.65.0", + "@taiga-ui/i18n": "^3.65.0", "@tinkoff/ng-polymorpheus": "4.3.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/styles": { - "version": "3.57.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/styles/-/styles-3.57.0.tgz", - "integrity": "sha512-jxSAZHL+QrjTHH5tEQ2EJXmNpRvKUN/8fHh5Fw+O71Y50I9IENN2CVXdB01YmjtNvn0tQE2sUy1RFausIQLyBA==", + "version": "3.65.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/styles/-/styles-3.65.0.tgz", + "integrity": "sha512-HO2sZPxNOGj2BPQpWkrM6HgZV/QxaEMEemye3sJvsfuttvk6bmxoL8NF331I63tlp/Zx7woD8AusH5ATuUniqg==", "peerDependencies": { - "@taiga-ui/cdk": ">=3.57.0", + "@taiga-ui/cdk": "^3.65.0", "tslib": "2.6.2" } }, @@ -4910,36 +4910,37 @@ } }, "node_modules/@ts-morph/common": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.21.0.tgz", - "integrity": "sha512-ES110Mmne5Vi4ypUKrtVQfXFDtCsDXiUiGxF6ILVlE90dDD4fdpC1LSjydl/ml7xJWKSDZwUYD2zkOePMSrPBA==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.22.0.tgz", + "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", "optional": true, "dependencies": { - "fast-glob": "^3.2.12", - "minimatch": "^7.4.3", - "mkdirp": "^2.1.6", + "fast-glob": "^3.3.2", + "minimatch": "^9.0.3", + "mkdirp": "^3.0.1", "path-browserify": "^1.0.1" } }, - "node_modules/@ts-morph/common/node_modules/minimatch": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "node_modules/@ts-morph/common/node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "optional": true, "dependencies": { - "brace-expansion": "^2.0.1" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8.6.0" } }, "node_modules/@ts-morph/common/node_modules/mkdirp": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", - "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "optional": true, "bin": { "mkdirp": "dist/cjs/src/bin.js" @@ -11981,15 +11982,15 @@ } }, "node_modules/ng-morph": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/ng-morph/-/ng-morph-4.0.3.tgz", - "integrity": "sha512-4voBApzsUs0/1zJsV2sSVPoOKxWt0gBd+3yqE/q8oYOX87RN3HwcJmqQLtWEU4tbmhk11gSRIFIl61+z32cnNw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/ng-morph/-/ng-morph-4.0.5.tgz", + "integrity": "sha512-5tnlb5WrGKeo2E7VRcV7ZHhScyNgliYqpbXqt103kynmfj6Ic8kzhJAhHu9iLkF1yRnKv2kyCE+O7UGZx5RraQ==", "optional": true, "dependencies": { "jsonc-parser": "3.2.0", "minimatch": "9.0.3", "multimatch": "5.0.0", - "ts-morph": "20.0.0", + "ts-morph": "21.0.1", "tslib": "2.6.2" }, "peerDependencies": { @@ -16605,12 +16606,12 @@ "integrity": "sha512-kXrY75F0s0WD15N2bWKDScKlKgwnusN6dTRzGs1N7LlxQRnazrsBISC1HL4sy2adsyk65Zbx3Ui3IGN8leAFOQ==" }, "node_modules/ts-morph": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-20.0.0.tgz", - "integrity": "sha512-JVmEJy2Wow5n/84I3igthL9sudQ8qzjh/6i4tmYCm6IqYyKFlNbJZi7oBdjyqcWSWYRu3CtL0xbT6fS03ESZIg==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-21.0.1.tgz", + "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", "optional": true, "dependencies": { - "@ts-morph/common": "~0.21.0", + "@ts-morph/common": "~0.22.0", "code-block-writer": "^12.0.0" } }, diff --git a/web/package.json b/web/package.json index d2a401bd3..a6498057f 100644 --- a/web/package.json +++ b/web/package.json @@ -46,14 +46,15 @@ "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc8.beta2", - "@taiga-ui/addon-charts": "3.57.0", - "@taiga-ui/addon-mobile": "3.57.0", - "@taiga-ui/cdk": "3.57.0", - "@taiga-ui/core": "3.57.0", - "@taiga-ui/experimental": "3.57.0", - "@taiga-ui/icons": "3.57.0", - "@taiga-ui/kit": "3.57.0", - "@taiga-ui/styles": "3.57.0", + "@taiga-ui/addon-charts": "3.65.0", + "@taiga-ui/addon-commerce": "3.65.0", + "@taiga-ui/addon-mobile": "3.65.0", + "@taiga-ui/cdk": "3.65.0", + "@taiga-ui/core": "3.65.0", + "@taiga-ui/experimental": "3.65.0", + "@taiga-ui/icons": "3.65.0", + "@taiga-ui/kit": "3.65.0", + "@taiga-ui/styles": "3.65.0", "@tinkoff/ng-dompurify": "4.0.0", "@tinkoff/ng-event-plugins": "3.1.0", "ansi-to-html": "^0.7.2", diff --git a/web/projects/marketplace/package.json b/web/projects/marketplace/package.json index 87d7c574d..8df1f559b 100644 --- a/web/projects/marketplace/package.json +++ b/web/projects/marketplace/package.json @@ -4,7 +4,6 @@ "peerDependencies": { "@angular/common": ">=13.2.0", "@angular/core": ">=13.2.0", - "@ionic/angular": ">=6.0.0", "@start9labs/shared": ">=0.3.2", "@taiga-ui/cdk": ">=3.0.0", "@tinkoff/ng-dompurify": ">=4.0.0", diff --git a/web/projects/marketplace/src/components/store-icon/store-icon.component.html b/web/projects/marketplace/src/components/store-icon/store-icon.component.html deleted file mode 100644 index 2000f287d..000000000 --- a/web/projects/marketplace/src/components/store-icon/store-icon.component.html +++ /dev/null @@ -1,10 +0,0 @@ -Service Icon - - - diff --git a/web/projects/marketplace/src/components/store-icon/store-icon.component.module.ts b/web/projects/marketplace/src/components/store-icon/store-icon.component.module.ts index 5006663eb..e9d24c022 100644 --- a/web/projects/marketplace/src/components/store-icon/store-icon.component.module.ts +++ b/web/projects/marketplace/src/components/store-icon/store-icon.component.module.ts @@ -1,11 +1,11 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' +import { TuiIconModule } from '@taiga-ui/experimental' import { StoreIconComponent } from './store-icon.component' @NgModule({ declarations: [StoreIconComponent], - imports: [CommonModule, IonicModule], + imports: [CommonModule, TuiIconModule], exports: [StoreIconComponent], }) export class StoreIconComponentModule {} diff --git a/web/projects/marketplace/src/components/store-icon/store-icon.component.scss b/web/projects/marketplace/src/components/store-icon/store-icon.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/marketplace/src/components/store-icon/store-icon.component.ts b/web/projects/marketplace/src/components/store-icon/store-icon.component.ts index b8e13c7ad..97e0088ea 100644 --- a/web/projects/marketplace/src/components/store-icon/store-icon.component.ts +++ b/web/projects/marketplace/src/components/store-icon/store-icon.component.ts @@ -3,8 +3,18 @@ import { MarketplaceConfig, sameUrl } from '@start9labs/shared' @Component({ selector: 'store-icon', - templateUrl: './store-icon.component.html', - styleUrls: ['./store-icon.component.scss'], + template: ` + Service Icon + + + + `, changeDetection: ChangeDetectionStrategy.OnPush, }) export class StoreIconComponent { diff --git a/web/projects/marketplace/src/pages/list/categories/categories.module.ts b/web/projects/marketplace/src/pages/list/categories/categories.module.ts index b792ae891..567a16467 100644 --- a/web/projects/marketplace/src/pages/list/categories/categories.module.ts +++ b/web/projects/marketplace/src/pages/list/categories/categories.module.ts @@ -1,11 +1,10 @@ import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' -import { IonicModule } from '@ionic/angular' import { CategoriesComponent } from './categories.component' @NgModule({ - imports: [CommonModule, IonicModule], + imports: [CommonModule], declarations: [CategoriesComponent], exports: [CategoriesComponent], }) diff --git a/web/projects/marketplace/src/pages/list/skeleton/skeleton.component.html b/web/projects/marketplace/src/pages/list/skeleton/skeleton.component.html deleted file mode 100644 index 0e8fdfa2a..000000000 --- a/web/projects/marketplace/src/pages/list/skeleton/skeleton.component.html +++ /dev/null @@ -1,69 +0,0 @@ -
    - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/web/projects/marketplace/src/pages/list/skeleton/skeleton.component.ts b/web/projects/marketplace/src/pages/list/skeleton/skeleton.component.ts deleted file mode 100644 index 8903a8e3e..000000000 --- a/web/projects/marketplace/src/pages/list/skeleton/skeleton.component.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' - -@Component({ - selector: 'marketplace-skeleton', - templateUrl: 'skeleton.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class SkeletonComponent {} diff --git a/web/projects/marketplace/src/pages/list/skeleton/skeleton.module.ts b/web/projects/marketplace/src/pages/list/skeleton/skeleton.module.ts deleted file mode 100644 index 9df2a3596..000000000 --- a/web/projects/marketplace/src/pages/list/skeleton/skeleton.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CommonModule } from '@angular/common' -import { NgModule } from '@angular/core' -import { IonicModule } from '@ionic/angular' -import { ResponsiveColDirective } from '@start9labs/shared' - -import { SkeletonComponent } from './skeleton.component' - -@NgModule({ - imports: [CommonModule, IonicModule, ResponsiveColDirective], - declarations: [SkeletonComponent], - exports: [SkeletonComponent], -}) -export class SkeletonModule {} diff --git a/web/projects/marketplace/src/pages/release-notes/release-notes.component.html b/web/projects/marketplace/src/pages/release-notes/release-notes.component.html index bb9e750e1..b4d6baa79 100644 --- a/web/projects/marketplace/src/pages/release-notes/release-notes.component.html +++ b/web/projects/marketplace/src/pages/release-notes/release-notes.component.html @@ -10,7 +10,7 @@

    What's new

    > Latest Release  -  - {{ published | date : 'medium' }} + {{ published | date: 'medium' }}

    @@ -41,7 +41,7 @@

    What's new

    {{ note.key | displayEmver }} @@ -53,6 +53,6 @@

    What's new

    - + diff --git a/web/projects/marketplace/src/pages/release-notes/release-notes.module.ts b/web/projects/marketplace/src/pages/release-notes/release-notes.module.ts index 88d5b074e..816b0c709 100644 --- a/web/projects/marketplace/src/pages/release-notes/release-notes.module.ts +++ b/web/projects/marketplace/src/pages/release-notes/release-notes.module.ts @@ -1,26 +1,25 @@ -import { NgModule } from "@angular/core"; -import { CommonModule } from "@angular/common"; +import { NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' import { EmverPipesModule, MarkdownPipeModule, SafeLinksDirective, - TextSpinnerComponentModule, -} from "@start9labs/shared"; -import { NgDompurifyModule } from "@tinkoff/ng-dompurify"; -import { ReleaseNotesComponent } from "./release-notes.component"; -import { TuiButtonModule } from "@taiga-ui/core"; -import { TuiAccordionModule } from "@taiga-ui/kit"; +} from '@start9labs/shared' +import { TuiAccordionModule } from '@taiga-ui/kit' +import { TuiButtonModule, TuiLoaderModule } from '@taiga-ui/core' +import { NgDompurifyModule } from '@tinkoff/ng-dompurify' +import { ReleaseNotesComponent } from './release-notes.component' @NgModule({ imports: [ CommonModule, - TextSpinnerComponentModule, EmverPipesModule, MarkdownPipeModule, NgDompurifyModule, SafeLinksDirective, TuiButtonModule, TuiAccordionModule, + TuiLoaderModule, ], declarations: [ReleaseNotesComponent], exports: [ReleaseNotesComponent], diff --git a/web/projects/marketplace/src/pages/show/screenshots/screenshots.component.ts b/web/projects/marketplace/src/pages/show/screenshots/screenshots.component.ts index 28d748f8e..a7d3c4fb2 100644 --- a/web/projects/marketplace/src/pages/show/screenshots/screenshots.component.ts +++ b/web/projects/marketplace/src/pages/show/screenshots/screenshots.component.ts @@ -2,9 +2,10 @@ import { CommonModule } from '@angular/common' import { ChangeDetectionStrategy, Component, - Inject, + inject, Input, } from '@angular/core' +import { TUI_IS_MOBILE } from '@taiga-ui/cdk' import { TuiButtonModule, TuiDialogContext, @@ -13,7 +14,6 @@ import { import { TuiCarouselModule } from '@taiga-ui/kit' import { MarketplacePkg } from '../../../types' import { PolymorpheusContent } from '@tinkoff/ng-polymorpheus' -import { isPlatform } from '@ionic/angular' @Component({ selector: 'marketplace-package-screenshots', @@ -77,15 +77,14 @@ import { isPlatform } from '@ionic/angular' imports: [CommonModule, TuiCarouselModule, TuiButtonModule], }) export class MarketplacePackageScreenshotComponent { + private readonly dialogs = inject(TuiDialogService) + @Input({ required: true }) pkg!: MarketplacePkg - constructor( - @Inject(TuiDialogService) private readonly dialogs: TuiDialogService, - ) {} index = 0 - isMobile = isPlatform(window, 'ios') || isPlatform(window, 'android') + isMobile = inject(TUI_IS_MOBILE) presentModalImg(content: PolymorpheusContent) { this.dialogs diff --git a/web/projects/shared/src/components/initializing/initializing.component.html b/web/projects/shared/src/components/initializing/initializing.component.html index 0722943bf..836caf38c 100644 --- a/web/projects/shared/src/components/initializing/initializing.component.html +++ b/web/projects/shared/src/components/initializing/initializing.component.html @@ -1,32 +1,15 @@ - - - - - - - Initializing StartOS -
    - - Progress: {{ (progress * 100).toFixed(0) }}% - -
    -
    +
    +

    Initializing StartOS

    +
    + Progress: {{ (progress * 100).toFixed(0) }}% +
    - - -

    {{ getMessage(progress) }}

    -
    - + +

    {{ getMessage(progress) }}

    +
    - -
    -
    -
    -
    + diff --git a/web/projects/shared/src/components/initializing/initializing.component.scss b/web/projects/shared/src/components/initializing/initializing.component.scss index e394fa18e..0675add7d 100644 --- a/web/projects/shared/src/components/initializing/initializing.component.scss +++ b/web/projects/shared/src/components/initializing/initializing.component.scss @@ -1,11 +1,22 @@ -ion-card-title { - font-size: 42px; +.card { + border-radius: 0.25rem; + padding: 1rem; + margin: 1.5rem; + text-align: center; + // TODO: Theme + background: #e0e0e0; + color: #333; + --tui-clear-inverse: rgba(0, 0, 0, 0.1); +} + +.title { + font-size: 2.5rem; + margin: 1rem; } .progress { - max-width: 700px; - padding-bottom: 20px; - margin: auto auto 40px; + max-width: 40rem; + margin: 1rem auto; } .logs { @@ -13,7 +24,7 @@ ion-card-title { flex-direction: column; height: 18rem; padding: 1rem; - margin: 1.5rem 0.75rem; + margin: 0 1.5rem auto; text-align: left; overflow: hidden; border-radius: 2rem; diff --git a/web/projects/shared/src/components/initializing/initializing.module.ts b/web/projects/shared/src/components/initializing/initializing.module.ts index c72a7e978..93c5c99d4 100644 --- a/web/projects/shared/src/components/initializing/initializing.module.ts +++ b/web/projects/shared/src/components/initializing/initializing.module.ts @@ -1,13 +1,13 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' import { TuiLetModule } from '@taiga-ui/cdk' +import { TuiProgressModule } from '@taiga-ui/kit' import { LogsWindowComponent } from './logs-window.component' import { InitializingComponent } from './initializing.component' @NgModule({ - imports: [CommonModule, IonicModule, TuiLetModule, LogsWindowComponent], + imports: [CommonModule, TuiLetModule, LogsWindowComponent, TuiProgressModule], declarations: [InitializingComponent], exports: [InitializingComponent], }) diff --git a/web/projects/shared/src/components/markdown/markdown.component.html b/web/projects/shared/src/components/markdown/markdown.component.html index 45271946d..8e5e7b026 100644 --- a/web/projects/shared/src/components/markdown/markdown.component.html +++ b/web/projects/shared/src/components/markdown/markdown.component.html @@ -1,8 +1,6 @@ - - - {{ error }} - - + + {{ error }} +
    - + diff --git a/web/projects/shared/src/components/markdown/markdown.component.module.ts b/web/projects/shared/src/components/markdown/markdown.component.module.ts index e643ee2e8..ddb1722bc 100644 --- a/web/projects/shared/src/components/markdown/markdown.component.module.ts +++ b/web/projects/shared/src/components/markdown/markdown.component.module.ts @@ -1,22 +1,21 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' +import { TuiLoaderModule, TuiNotificationModule } from '@taiga-ui/core' import { NgDompurifyModule } from '@tinkoff/ng-dompurify' import { MarkdownPipeModule } from '../../pipes/markdown/markdown.module' import { SafeLinksDirective } from '../../directives/safe-links.directive' -import { TextSpinnerComponentModule } from '../text-spinner/text-spinner.component.module' import { MarkdownComponent } from './markdown.component' @NgModule({ declarations: [MarkdownComponent], imports: [ CommonModule, - IonicModule, MarkdownPipeModule, - TextSpinnerComponentModule, SafeLinksDirective, NgDompurifyModule, + TuiLoaderModule, + TuiNotificationModule, ], exports: [MarkdownComponent], }) diff --git a/web/projects/shared/styles/taiga.scss b/web/projects/shared/styles/taiga.scss index f2566adfa..ed89a5be9 100644 --- a/web/projects/shared/styles/taiga.scss +++ b/web/projects/shared/styles/taiga.scss @@ -40,6 +40,7 @@ [tuiAppearance][data-appearance='primary'] { @include appearance-disabled { background: #eaecee; + color: #333; } } diff --git a/web/projects/ui/src/app/app.module.ts b/web/projects/ui/src/app/app.module.ts index e573debd4..1f4ae70f1 100644 --- a/web/projects/ui/src/app/app.module.ts +++ b/web/projects/ui/src/app/app.module.ts @@ -1,40 +1,38 @@ -import { - TuiAlertModule, - TuiDialogModule, - TuiModeModule, - TuiRootModule, - TuiThemeNightModule, -} from '@taiga-ui/core' import { HttpClientModule } from '@angular/common/http' import { NgModule } from '@angular/core' import { BrowserAnimationsModule } from '@angular/platform-browser/animations' +import { ServiceWorkerModule } from '@angular/service-worker' import { IonicModule } from '@ionic/angular' import { MonacoEditorModule } from '@materia-ui/ngx-monaco-editor' import { DarkThemeModule, - SharedPipesModule, + EnterModule, LightThemeModule, LoadingModule, - ResponsiveColViewportDirective, - EnterModule, MarkdownModule, + ResponsiveColViewportDirective, + SharedPipesModule, } from '@start9labs/shared' - +import { + TuiAlertModule, + TuiDialogModule, + TuiModeModule, + TuiRootModule, + TuiThemeNightModule, +} from '@taiga-ui/core' +import { WidgetsPageModule } from 'src/app/apps/ui/pages/widgets/widgets.module' +import { environment } from '../environments/environment' import { AppComponent } from './app.component' -import { RoutingModule } from './routing.module' -import { OSWelcomePageModule } from './common/os-welcome/os-welcome.module' -import { QRComponentModule } from './common/qr/qr.module' -import { PreloaderModule } from './app/preloader/preloader.module' -import { FooterModule } from './app/footer/footer.module' -import { MenuModule } from './app/menu/menu.module' import { APP_PROVIDERS } from './app.providers' -import { PatchDbModule } from './services/patch-db/patch-db.module' -import { ToastContainerModule } from './common/toast-container/toast-container.module' import { ConnectionBarComponentModule } from './app/connection-bar/connection-bar.component.module' -import { WidgetsPageModule } from 'src/app/apps/ui/pages/widgets/widgets.module' -import { ServiceWorkerModule } from '@angular/service-worker' -import { environment } from '../environments/environment' +import { FooterModule } from './app/footer/footer.module' +import { MenuModule } from './app/menu/menu.module' +import { PreloaderModule } from './app/preloader/preloader.module' import { SidebarHostComponent } from './app/sidebar-host.component' +import { OSWelcomePageModule } from './common/os-welcome/os-welcome.module' +import { QRComponentModule } from './common/qr/qr.module' +import { ToastContainerModule } from './common/toast-container/toast-container.module' +import { RoutingModule } from './routing.module' @NgModule({ declarations: [AppComponent], @@ -53,7 +51,6 @@ import { SidebarHostComponent } from './app/sidebar-host.component' MarkdownModule, MonacoEditorModule, SharedPipesModule, - PatchDbModule, ToastContainerModule, ConnectionBarComponentModule, TuiRootModule, diff --git a/web/projects/ui/src/app/app.providers.ts b/web/projects/ui/src/app/app.providers.ts index 2c612f320..400fa0e92 100644 --- a/web/projects/ui/src/app/app.providers.ts +++ b/web/projects/ui/src/app/app.providers.ts @@ -1,7 +1,13 @@ import { APP_INITIALIZER, Provider } from '@angular/core' import { UntypedFormBuilder } from '@angular/forms' -import { Router, RouteReuseStrategy } from '@angular/router' +import { Router } from '@angular/router' import { IonNav } from '@ionic/angular' +import { + AbstractCategoryService, + AbstractMarketplaceService, + FilterPackagesPipe, +} from '@start9labs/marketplace' +import { RELATIVE_URL, THEME, WorkspaceConfig } from '@start9labs/shared' import { TUI_DATE_FORMAT, TUI_DATE_SEPARATOR } from '@taiga-ui/cdk' import { tuiNumberFormatProvider, @@ -12,22 +18,17 @@ import { TUI_DATE_TIME_VALUE_TRANSFORMER, TUI_DATE_VALUE_TRANSFORMER, } from '@taiga-ui/kit' -import { RELATIVE_URL, THEME, WorkspaceConfig } from '@start9labs/shared' -import { - AbstractCategoryService, - AbstractMarketplaceService, -} from '@start9labs/marketplace' +import { PATCH_DB_PROVIDERS } from 'src/app/services/patch-db/patch-db.providers' import { ApiService } from './services/api/embassy-api.service' -import { MockApiService } from './services/api/embassy-mock-api.service' import { LiveApiService } from './services/api/embassy-live-api.service' +import { MockApiService } from './services/api/embassy-mock-api.service' import { AuthService } from './services/auth.service' +import { CategoryService } from './services/category.service' import { ClientStorageService } from './services/client-storage.service' -import { FilterPackagesPipe } from '../../../marketplace/src/pipes/filter-packages.pipe' -import { ThemeSwitcherService } from './services/theme-switcher.service' import { DateTransformerService } from './services/date-transformer.service' import { DatetimeTransformerService } from './services/datetime-transformer.service' import { MarketplaceService } from './services/marketplace.service' -import { CategoryService } from './services/category.service' +import { ThemeSwitcherService } from './services/theme-switcher.service' const { useMocks, @@ -35,6 +36,7 @@ const { } = require('../../../../config.json') as WorkspaceConfig export const APP_PROVIDERS: Provider[] = [ + PATCH_DB_PROVIDERS, FilterPackagesPipe, UntypedFormBuilder, IonNav, diff --git a/web/projects/ui/src/app/apps/loading/loading.module.ts b/web/projects/ui/src/app/apps/loading/loading.module.ts index 3de110846..223f8db47 100644 --- a/web/projects/ui/src/app/apps/loading/loading.module.ts +++ b/web/projects/ui/src/app/apps/loading/loading.module.ts @@ -1,6 +1,5 @@ import { NgModule } from '@angular/core' import { RouterModule, Routes } from '@angular/router' -import { InitializingModule } from '@start9labs/shared' import { LoadingPage } from './loading.page' const routes: Routes = [ @@ -11,7 +10,6 @@ const routes: Routes = [ ] @NgModule({ - imports: [InitializingModule, RouterModule.forChild(routes)], - declarations: [LoadingPage], + imports: [RouterModule.forChild(routes)], }) export class LoadingPageModule {} diff --git a/web/projects/ui/src/app/apps/loading/loading.page.html b/web/projects/ui/src/app/apps/loading/loading.page.html deleted file mode 100644 index c4ac56866..000000000 --- a/web/projects/ui/src/app/apps/loading/loading.page.html +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/web/projects/ui/src/app/apps/loading/loading.page.ts b/web/projects/ui/src/app/apps/loading/loading.page.ts index 14fcbeb22..da6970de8 100644 --- a/web/projects/ui/src/app/apps/loading/loading.page.ts +++ b/web/projects/ui/src/app/apps/loading/loading.page.ts @@ -1,6 +1,7 @@ import { Component, inject } from '@angular/core' import { NavController } from '@ionic/angular' import { + InitializingModule, provideSetupLogsService, provideSetupService, } from '@start9labs/shared' @@ -8,11 +9,18 @@ import { import { ApiService } from 'src/app/services/api/embassy-api.service' @Component({ - templateUrl: 'loading.page.html', + standalone: true, + template: ` + + `, providers: [ provideSetupService(ApiService), provideSetupLogsService(ApiService), ], + imports: [InitializingModule], }) export class LoadingPage { readonly navCtrl = inject(NavController) diff --git a/web/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.html b/web/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.html index 73f0b1e21..adf9c75ed 100644 --- a/web/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.html +++ b/web/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.html @@ -1,100 +1,106 @@ -
    - - - -

    Trust Your Root CA

    -

    - Download and trust your server's Root Certificate Authority to establish - a secure (HTTPS) connection. You will need to repeat this on every - device you use to connect to your server. -

    -
      -
    1. - Bookmark this page - - Save this page so you can access it later. You can also find the - address in the - StartOS-info.html - file downloaded at the end of initial setup. -
    2. -
    3. - Download your server's Root CA - - Your server uses its Root CA to generate SSL/TLS certificates for - itself and installed services. These certificates are then used to - encrypt network traffic with your client devices. -
      - - Download - - -
    4. -
    5. - Trust your server's Root CA - - Follow instructions for your OS. By trusting your server's Root CA, - your device can verify the authenticity of encrypted communications - with your server. -
      - - View Instructions - - -
    6. -
    7. - Test - - Refresh the page. If refreshing the page does not work, you may need - to quit and re-open your browser, then revisit this page. -
      - - Refresh - - -
    8. -
    - - Skip - - - (not recommended) -
    -
    - - - - -

    Root CA Trusted!

    -

    - You have successfully trusted your server's Root CA and may now log in - securely. -

    - - Go to login - - -
    -
    +
    + +

    Trust Your Root CA

    +

    + Download and trust your server's Root Certificate Authority to establish a + secure (HTTPS) connection. You will need to repeat this on every device you + use to connect to your server. +

    +
      +
    1. + Bookmark this page + - Save this page so you can access it later. You can also find the address + in the + StartOS-info.html + file downloaded at the end of initial setup. +
    2. +
    3. + Download your server's Root CA + - Your server uses its Root CA to generate SSL/TLS certificates for itself + and installed services. These certificates are then used to encrypt + network traffic with your client devices. +
      + + Download + +
    4. +
    5. + Trust your server's Root CA + - Follow instructions for your OS. By trusting your server's Root CA, your + device can verify the authenticity of encrypted communications with your + server. +
      + + View Instructions + +
    6. +
    7. + Test + - Refresh the page. If refreshing the page does not work, you may need to + quit and re-open your browser, then revisit this page. +
      + +
    8. +
    + +
    (not recommended)
    - + +
    + +

    Root CA Trusted!

    +

    + You have successfully trusted your server's Root CA and may now log in + securely. +

    + +
    +
    diff --git a/web/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.scss b/web/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.scss index 48b198525..9ee892c79 100644 --- a/web/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.scss +++ b/web/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.scss @@ -1,12 +1,4 @@ -#trusted { - max-width: 40%; -} - -#untrusted { - max-width: 50%; -} - -.center-container { +:host { padding: 1rem; display: flex; flex-direction: column; @@ -15,69 +7,38 @@ min-height: 100vh; } -ion-card { - color: var(--ion-color-dark); - background: #414141; - box-shadow: 0 4px 4px rgba(17, 17, 17, 0.144); - border-radius: 35px; - padding: 1.5rem; - width: 100%; - - h1 { - font-weight: bold; - font-size: 1.5rem; - padding-bottom: 1.5rem; - } - - p { - font-size: 21px; - line-height: 25px; - margin-bottom: 30px; - margin-top: 0; - } +[tuiButton] { + text-transform: uppercase; + font-weight: bold; + border-radius: 10rem; + margin-top: 1rem; } -.text-center { +.card { + max-width: max(70%, 40rem); text-align: center; + align-items: center !important; + gap: 0 !important; } -ol { - font-size: 17px; - line-height: 25px; - text-align: left; - - li { - padding-bottom: 24px; - } - - ion-button { - margin-top: 10px; - } -} - -.refresh { - --background: var(--ion-color-success-shade); +h1 { + margin: 1rem; + font-weight: bold; + font-size: 1.5rem; } -.wiz-icon { - font-size: 64px; +p { + font-size: 1.3rem; + line-height: 1.5rem; + margin: 0 0 2rem; } -.skip_detail { - display: block; - font-size: 0.8rem; - margin-top: -13px; - padding-bottom: 0.5rem; +ol { + font-size: 1rem; + line-height: 1.5rem; + text-align: left; } -@media (max-width: 700px) { - #trusted, #untrusted { - max-width: 100%; - } +li { + padding-bottom: 1.5rem; } - -@media (min-width: 701px) and (max-width: 1200px) { - #trusted, #untrusted { - max-width: 75%; - } -} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.ts b/web/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.ts index fde1c968f..0d6b71b6b 100644 --- a/web/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.ts +++ b/web/projects/ui/src/app/apps/login/ca-wizard/ca-wizard.component.ts @@ -1,25 +1,37 @@ -import { Component, Inject } from '@angular/core' +import { CommonModule, DOCUMENT } from '@angular/common' +import { Component, inject } from '@angular/core' +import { RELATIVE_URL } from '@start9labs/shared' +import { + TuiAppearanceModule, + TuiButtonModule, + TuiCardModule, + TuiIconModule, + TuiSurfaceModule, +} from '@taiga-ui/experimental' import { ApiService } from 'src/app/services/api/embassy-api.service' import { ConfigService } from 'src/app/services/config.service' -import { RELATIVE_URL } from '@start9labs/shared' -import { DOCUMENT } from '@angular/common' -import { WINDOW } from '@ng-web-apis/common' @Component({ + standalone: true, selector: 'ca-wizard', templateUrl: './ca-wizard.component.html', styleUrls: ['./ca-wizard.component.scss'], + imports: [ + CommonModule, + TuiIconModule, + TuiButtonModule, + TuiAppearanceModule, + TuiCardModule, + TuiSurfaceModule, + ], }) export class CAWizardComponent { - caTrusted = false + private readonly api = inject(ApiService) + private readonly relativeUrl = inject(RELATIVE_URL) + private readonly document = inject(DOCUMENT) - constructor( - private readonly api: ApiService, - public readonly config: ConfigService, - @Inject(RELATIVE_URL) private readonly relativeUrl: string, - @Inject(DOCUMENT) public readonly document: Document, - @Inject(WINDOW) private readonly windowRef: Window, - ) {} + readonly config = inject(ConfigService) + caTrusted = false async ngOnInit() { await this.testHttps().catch(e => @@ -27,17 +39,12 @@ export class CAWizardComponent { ) } - download() { - this.document.getElementById('install-cert')?.click() - } - refresh() { this.document.location.reload() } launchHttps() { - const host = this.config.getHost() - this.windowRef.open(`https://${host}`, '_self') + this.document.defaultView?.open(`https://${this.config.getHost()}`, '_self') } private async testHttps() { diff --git a/web/projects/ui/src/app/apps/login/login.module.ts b/web/projects/ui/src/app/apps/login/login.module.ts index 753bfe94e..82b683ff7 100644 --- a/web/projects/ui/src/app/apps/login/login.module.ts +++ b/web/projects/ui/src/app/apps/login/login.module.ts @@ -1,12 +1,17 @@ -import { NgModule } from '@angular/core' -import { RouterModule, Routes } from '@angular/router' import { CommonModule } from '@angular/common' +import { NgModule } from '@angular/core' import { FormsModule } from '@angular/forms' -import { IonicModule } from '@ionic/angular' -import { LoginPage } from './login.page' +import { RouterModule, Routes } from '@angular/router' +import { TuiErrorModule, TuiTextfieldControllerModule } from '@taiga-ui/core' +import { + TuiButtonModule, + TuiCardModule, + TuiSurfaceModule, +} from '@taiga-ui/experimental' +import { TuiInputPasswordModule } from '@taiga-ui/kit' import { CAWizardComponent } from './ca-wizard/ca-wizard.component' -import { SharedPipesModule } from '@start9labs/shared' -import { TuiHintModule, TuiTooltipModule } from '@taiga-ui/core' +import { LoginPage } from './login.page' +import { LoginWarningComponent } from './warning.component' const routes: Routes = [ { @@ -19,12 +24,16 @@ const routes: Routes = [ imports: [ CommonModule, FormsModule, - IonicModule, - SharedPipesModule, + CAWizardComponent, + LoginWarningComponent, + TuiButtonModule, + TuiCardModule, + TuiSurfaceModule, + TuiInputPasswordModule, + TuiTextfieldControllerModule, + TuiErrorModule, RouterModule.forChild(routes), - TuiTooltipModule, - TuiHintModule, ], - declarations: [LoginPage, CAWizardComponent], + declarations: [LoginPage], }) export class LoginPageModule {} diff --git a/web/projects/ui/src/app/apps/login/login.page.html b/web/projects/ui/src/app/apps/login/login.page.html index 99f6abbe8..1343a9316 100644 --- a/web/projects/ui/src/app/apps/login/login.page.html +++ b/web/projects/ui/src/app/apps/login/login.page.html @@ -1,93 +1,26 @@ - - - - - + + - - - + + + - - - - - StartOS Icon - - Login to StartOS - - -
    - - - - - - - -

    - {{ error }} -

    - -
    -
    -
    -
    -
    -
    -
    -
    +
    + +

    Login to StartOS

    +
    + + Password + + + + +
    + diff --git a/web/projects/ui/src/app/apps/login/login.page.scss b/web/projects/ui/src/app/apps/login/login.page.scss index 690d97591..65bc582b1 100644 --- a/web/projects/ui/src/app/apps/login/login.page.scss +++ b/web/projects/ui/src/app/apps/login/login.page.scss @@ -1,76 +1,35 @@ -.content { - --background: #333333; -} +@import '@taiga-ui/core/styles/taiga-ui-local'; -.grid { - height: 100%; - max-width: 540px; +:host { + background: var(--tui-base-02); } -.row { - height: 100%; +.card { + @include center-all(); + overflow: visible; align-items: center; text-align: center; + width: max(50%, 20rem); } -.banner { - position: absolute; - padding: 20px; - width: 100%; - display: inline-block; - - ion-item { - max-width: 800px; - margin: auto; - } -} - -ion-card { - background: #414141; - box-shadow: 0 4px 4px rgba(17, 17, 17, 0.144); - border-radius: 35px; - min-height: 16rem; - contain: unset; - overflow: unset; - position: relative; -} - -ion-item { - --background: transparent; - --border-radius: 0px; -} - -.title { - padding-top: 55px; - color: #e0e0e0; - font-size: 1.3rem; +.logo { + @include center-left(); + top: -17%; + width: 6rem; } .header { - &-icon { - width: 100px; - position: absolute; - left: 50%; - margin-left: -50px; - top: -17%; - z-index: 100; - } -} - -.login-button { - height: 45px; - width: 120px; - --border-radius: 50px; - margin: 0 auto; - margin-top: 27px; - margin-bottom: 10px; + margin: 2rem 0 1rem; + text-align: center; + font-size: 2rem; } -.item-interactive { - --highlight-background: #5260ff !important; +.error { + min-height: 2.5rem; } -.error { - display: block; - padding-top: 4px; +.button { + width: 10rem; + border-radius: 10rem; + margin-bottom: 1rem; } diff --git a/web/projects/ui/src/app/apps/login/login.page.ts b/web/projects/ui/src/app/apps/login/login.page.ts index 86430ff36..b910c0c62 100644 --- a/web/projects/ui/src/app/apps/login/login.page.ts +++ b/web/projects/ui/src/app/apps/login/login.page.ts @@ -8,7 +8,6 @@ import { LoadingService } from '@start9labs/shared' import { TuiDestroyService } from '@taiga-ui/cdk' import { takeUntil } from 'rxjs' import { DOCUMENT } from '@angular/common' -import { WINDOW } from '@ng-web-apis/common' @Component({ selector: 'login', @@ -18,7 +17,6 @@ import { WINDOW } from '@ng-web-apis/common' }) export class LoginPage { password = '' - unmasked = false error = '' constructor( @@ -29,14 +27,8 @@ export class LoginPage { private readonly api: ApiService, public readonly config: ConfigService, @Inject(DOCUMENT) public readonly document: Document, - @Inject(WINDOW) private readonly windowRef: Window, ) {} - launchHttps() { - const host = this.config.getHost() - this.windowRef.open(`https://${host}`, '_self') - } - async submit() { this.error = '' diff --git a/web/projects/ui/src/app/apps/login/warning.component.ts b/web/projects/ui/src/app/apps/login/warning.component.ts new file mode 100644 index 000000000..9166a3b9a --- /dev/null +++ b/web/projects/ui/src/app/apps/login/warning.component.ts @@ -0,0 +1,60 @@ +import { NgIf } from '@angular/common' +import { Component, inject } from '@angular/core' +import { WINDOW } from '@ng-web-apis/common' +import { TuiNotificationModule } from '@taiga-ui/core' +import { TuiButtonModule, TuiIconsModule } from '@taiga-ui/experimental' +import { ConfigService } from 'src/app/services/config.service' + +@Component({ + standalone: true, + selector: 'login-warning', + template: ` + + +

    Http detected

    +

    + Tor is faster over https. Your Root CA must be trusted. + + View instructions + +

    +
    + `, + styles: [ + ` + @import '@taiga-ui/core/styles/taiga-ui-local'; + + :host { + @include center-left(); + top: 1rem; + width: max(50%, 20rem); + } + + button { + float: right; + margin: 0.5rem 0 0.5rem 1rem; + } + `, + ], + imports: [NgIf, TuiButtonModule, TuiIconsModule, TuiNotificationModule], +}) +export class LoginWarningComponent { + private readonly windowRef = inject(WINDOW) + readonly config = inject(ConfigService) + + launchHttps() { + this.windowRef.open(`https://${this.config.getHost()}`, '_self') + } +} diff --git a/web/projects/ui/src/app/apps/portal/components/form.component.ts b/web/projects/ui/src/app/apps/portal/components/form.component.ts new file mode 100644 index 000000000..9c7295520 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/components/form.component.ts @@ -0,0 +1,166 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + inject, + Input, + OnInit, +} from '@angular/core' +import { FormGroup, ReactiveFormsModule } from '@angular/forms' +import { RouterModule } from '@angular/router' +import { InputSpec } from '@start9labs/start-sdk/lib/config/configTypes' +import { + tuiMarkControlAsTouchedAndValidate, + TuiValueChangesModule, +} from '@taiga-ui/cdk' +import { TuiDialogContext, TuiModeModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' +import { TuiDialogFormService } from '@taiga-ui/kit' +import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' +import { compare, Operation } from 'fast-json-patch' +import { FormModule } from 'src/app/common/form/form.module' +import { InvalidService } from 'src/app/common/form/invalid.service' +import { FormService } from 'src/app/services/form.service' + +export interface ActionButton { + text: string + handler?: (value: T) => Promise | void + link?: string +} + +export interface FormContext { + spec: InputSpec + buttons: ActionButton[] + value?: T + patch?: Operation[] +} + +@Component({ + standalone: true, + selector: 'app-form', + template: ` +
    + + + + `, + styles: [ + ` + footer { + position: sticky; + bottom: 0; + z-index: 10; + display: flex; + justify-content: flex-end; + padding: 1rem 0; + margin: 1rem 0 -1rem; + gap: 1rem; + background: var(--tui-elevation-01); + border-top: 1px solid var(--tui-base-02); + } + `, + ], + imports: [ + CommonModule, + ReactiveFormsModule, + RouterModule, + TuiValueChangesModule, + TuiButtonModule, + TuiModeModule, + FormModule, + ], + providers: [InvalidService], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class FormComponent> implements OnInit { + private readonly dialogFormService = inject(TuiDialogFormService) + private readonly formService = inject(FormService) + private readonly invalidService = inject(InvalidService) + private readonly context = inject>>( + POLYMORPHEUS_CONTEXT, + { optional: true }, + ) + + @Input() spec = this.context?.data.spec || {} + @Input() buttons = this.context?.data.buttons || [] + @Input() patch = this.context?.data.patch || [] + @Input() value?: T = this.context?.data.value + + form = new FormGroup({}) + + ngOnInit() { + this.dialogFormService.markAsPristine() + this.form = this.formService.createForm(this.spec, this.value) + this.process(this.patch) + } + + onReset() { + const { value } = this.form + + this.form = this.formService.createForm(this.spec) + this.process(compare(this.form.value, value)) + tuiMarkControlAsTouchedAndValidate(this.form) + this.markAsDirty() + } + + async onClick(handler: Required>['handler']) { + tuiMarkControlAsTouchedAndValidate(this.form) + this.invalidService.scrollIntoView() + + if (this.form.valid && (await handler(this.form.value as T))) { + this.close() + } + } + + markAsDirty() { + this.dialogFormService.markAsDirty() + } + + close() { + this.context?.$implicit.complete() + } + + private process(patch: Operation[]) { + patch.forEach(({ op, path }) => { + const control = this.form.get(path.substring(1).split('/')) + + if (!control || !control.parent) return + + if (op !== 'remove') { + control.markAsDirty() + control.markAsTouched() + } + + control.parent.markAsDirty() + control.parent.markAsTouched() + }) + } +} diff --git a/web/projects/ui/src/app/apps/portal/components/header/connection.component.ts b/web/projects/ui/src/app/apps/portal/components/header/connection.component.ts index cdf9a4377..3bf249263 100644 --- a/web/projects/ui/src/app/apps/portal/components/header/connection.component.ts +++ b/web/projects/ui/src/app/apps/portal/components/header/connection.component.ts @@ -12,9 +12,12 @@ import { DataModel } from 'src/app/services/patch-db/data-model' template: ` @if (connection$ | async; as connection) { + {{ connection.message }} } @@ -27,6 +30,11 @@ import { DataModel } from 'src/app/services/patch-db/data-model' gap: 0.5rem; padding: 0 2rem; } + + :host-context(tui-root._mobile) { + display: none; + font-size: 1rem; + } `, ], changeDetection: ChangeDetectionStrategy.OnPush, @@ -37,6 +45,7 @@ export class HeaderConnectionComponent { message: string color: string icon: string + status: string }> = combineLatest([ inject(ConnectionService).networkConnected$, inject(ConnectionService).websocketConnected$.pipe(startWith(false)), @@ -50,30 +59,35 @@ export class HeaderConnectionComponent { message: 'No Internet', color: 'var(--tui-error-fill)', icon: 'tuiIconCloudOff', + status: 'error', } if (!websocket) return { message: 'Connecting', color: 'var(--tui-warning-fill)', icon: 'tuiIconCloudOff', + status: 'warning', } if (status['shutting-down']) return { message: 'Shutting Down', color: 'var(--tui-neutral-fill)', icon: 'tuiIconPower', + status: 'neutral', } if (status.restarting) return { message: 'Restarting', color: 'var(--tui-neutral-fill)', icon: 'tuiIconPower', + status: 'neutral', } return { message: 'Connected', color: 'var(--tui-success-fill)', icon: 'tuiIconCloud', + status: 'success', } }), ) diff --git a/web/projects/ui/src/app/apps/portal/components/header/header.component.ts b/web/projects/ui/src/app/apps/portal/components/header/header.component.ts index 8d9599943..3da3472d6 100644 --- a/web/projects/ui/src/app/apps/portal/components/header/header.component.ts +++ b/web/projects/ui/src/app/apps/portal/components/header/header.component.ts @@ -1,31 +1,47 @@ import { AsyncPipe } from '@angular/common' import { ChangeDetectionStrategy, Component, inject } from '@angular/core' -import { RouterLink, RouterLinkActive } from '@angular/router' +import { + IsActiveMatchOptions, + RouterLink, + RouterLinkActive, +} from '@angular/router' +import { PatchDB } from 'patch-db-client' import { HeaderConnectionComponent } from './connection.component' import { HeaderHomeComponent } from './home.component' import { HeaderCornerComponent } from './corner.component' import { HeaderBreadcrumbComponent } from './breadcrumb.component' +import { HeaderSnekDirective } from './snek.directive' +import { HeaderMobileComponent } from './mobile.component' +import { DataModel } from 'src/app/services/patch-db/data-model' import { BreadcrumbsService } from '../../services/breadcrumbs.service' @Component({ selector: 'header[appHeader]', template: ` -
    +
    @for (item of breadcrumbs$ | async; track $index) { -
    +
    } -
    -
    -
    +
    +
    + Play Snake +
    +
    +
    `, styles: [ ` @@ -53,9 +69,43 @@ import { BreadcrumbsService } from '../../services/breadcrumbs.service' backdrop-filter: blur(2rem) brightness(0.75) saturate(0.75); } } + + &:has([data-connection='error']) { + --status: var(--tui-error-fill); + } + + &:has([data-connection='warning']) { + --status: var(--tui-warning-fill); + } + + &:has([data-connection='neutral']) { + --status: var(--tui-neutral-fill); + } + + &:has([data-connection='success']) { + --status: var(--tui-success-fill); + } + } + + header-connection .plaque::before { + box-shadow: + inset 0 1px rgba(255, 255, 255, 0.25), + inset 0 -0.25rem var(--tui-success-fill); + } + + :host-context(tui-root._mobile) { + a { + display: none; + } + + header-corner .plaque::before { + box-shadow: + inset 0 1px rgb(255 255 255 / 25%), + inset -0.375rem 0 var(--status); + } } - .plank { + .plaque { @include transition(opacity); position: absolute; inset: 0; @@ -83,6 +133,19 @@ import { BreadcrumbsService } from '../../services/breadcrumbs.service' box-shadow: inset 0 1px rgb(255 255 255 / 25%); } } + + .snek { + @include center-top(); + @include transition(opacity); + right: 2rem; + width: 1rem; + opacity: 0.2; + cursor: pointer; + + &:hover { + opacity: 1; + } + } `, ], standalone: true, @@ -90,13 +153,29 @@ import { BreadcrumbsService } from '../../services/breadcrumbs.service' imports: [ RouterLink, RouterLinkActive, + AsyncPipe, HeaderConnectionComponent, HeaderHomeComponent, HeaderCornerComponent, - AsyncPipe, + HeaderSnekDirective, HeaderBreadcrumbComponent, + HeaderMobileComponent, ], }) export class HeaderComponent { + readonly options = OPTIONS readonly breadcrumbs$ = inject(BreadcrumbsService) + readonly snekScore$ = inject(PatchDB).watch$( + 'ui', + 'gaming', + 'snake', + 'high-score', + ) +} + +const OPTIONS: IsActiveMatchOptions = { + paths: 'exact', + queryParams: 'ignored', + fragment: 'ignored', + matrixParams: 'ignored', } diff --git a/web/projects/ui/src/app/apps/portal/components/header/menu.component.ts b/web/projects/ui/src/app/apps/portal/components/header/menu.component.ts index 253a3b0a7..0df040ae8 100644 --- a/web/projects/ui/src/app/apps/portal/components/header/menu.component.ts +++ b/web/projects/ui/src/app/apps/portal/components/header/menu.component.ts @@ -16,6 +16,7 @@ import { AuthService } from 'src/app/services/auth.service' import { ABOUT } from './about.component' import { getAllPackages } from 'src/app/util/get-package-data' import { DataModel } from 'src/app/services/patch-db/data-model' +import { HeaderConnectionComponent } from './connection.component' @Component({ selector: 'header-menu', @@ -26,7 +27,9 @@ import { DataModel } from 'src/app/services/patch-db/data-model' -

    StartOS

    + +

    StartOS

    +
    + + `, + styles: [ + ` + .canvas-center { + min-height: 50vh; + padding-top: 20px; + display: flex; + align-items: center; + justify-content: center; + } + + .footer { + display: flex; + align-items: center; + justify-content: space-between; + padding-top: 32px; + } + `, + ], + imports: [TuiButtonModule], +}) +export class HeaderSnekComponent implements AfterViewInit, OnDestroy { + private readonly document = inject(DOCUMENT) + private readonly dialog = inject(POLYMORPHEUS_CONTEXT) as TuiDialogContext< + number, + number + > + + highScore: number = this.dialog.data + score = 0 + + private readonly speed = 45 + private readonly width = 40 + private readonly height = 26 + private grid = NaN + + private readonly startingLength = 4 + + private xDown?: number + private yDown?: number + private canvas!: HTMLCanvasElement + private image!: HTMLImageElement + private context!: CanvasRenderingContext2D + + private snake: any + private bitcoin: { x: number; y: number } = { x: NaN, y: NaN } + + private moveQueue: String[] = [] + private destroyed = false + + dismiss() { + this.dialog.completeWith(this.highScore) + } + + @HostListener('document:keydown', ['$event']) + keyEvent(e: KeyboardEvent) { + this.moveQueue.push(e.key) + } + + @HostListener('touchstart', ['$event']) + touchStart(e: TouchEvent) { + this.handleTouchStart(e) + } + + @HostListener('touchmove', ['$event']) + touchMove(e: TouchEvent) { + this.handleTouchMove(e) + } + + @HostListener('window:resize') + sizeChange() { + this.init() + } + + ngOnDestroy() { + this.destroyed = true + } + + ngAfterViewInit() { + this.init() + + this.image = new Image() + this.image.onload = () => { + requestAnimationFrame(async () => await this.loop()) + } + this.image.src = '../../../../../../assets/img/icons/bitcoin.svg' + } + + init() { + this.canvas = this.document.querySelector('canvas#game')! + this.canvas.style.border = '1px solid #e0e0e0' + this.context = this.canvas.getContext('2d')! + const container = this.document.querySelector('.canvas-center')! + this.grid = Math.min( + Math.floor(container.clientWidth / this.width), + Math.floor(container.clientHeight / this.height), + ) + this.snake = { + x: this.grid * (Math.floor(this.width / 2) - this.startingLength), + y: this.grid * Math.floor(this.height / 2), + // snake velocity. moves one grid length every frame in either the x or y direction + dx: this.grid, + dy: 0, + // keep track of all grids the snake body occupies + cells: [], + // length of the snake. grows when eating an bitcoin + maxCells: this.startingLength, + } + this.bitcoin = { + x: this.getRandomInt(0, this.width) * this.grid, + y: this.getRandomInt(0, this.height) * this.grid, + } + + this.canvas.width = this.grid * this.width + this.canvas.height = this.grid * this.height + this.context.imageSmoothingEnabled = false + } + + getTouches(evt: TouchEvent) { + return evt.touches + } + + handleTouchStart(evt: TouchEvent) { + const firstTouch = this.getTouches(evt)[0] + this.xDown = firstTouch.clientX + this.yDown = firstTouch.clientY + } + + handleTouchMove(evt: TouchEvent) { + if (!this.xDown || !this.yDown) { + return + } + + var xUp = evt.touches[0].clientX + var yUp = evt.touches[0].clientY + + var xDiff = this.xDown - xUp + var yDiff = this.yDown - yUp + + if (Math.abs(xDiff) > Math.abs(yDiff)) { + /*most significant*/ + if (xDiff > 0) { + this.moveQueue.push('ArrowLeft') + } else { + this.moveQueue.push('ArrowRight') + } + } else { + if (yDiff > 0) { + this.moveQueue.push('ArrowUp') + } else { + this.moveQueue.push('ArrowDown') + } + } + /* reset values */ + this.xDown = undefined + this.yDown = undefined + } + + // game loop + async loop() { + if (this.destroyed) return + + await pauseFor(this.speed) + + requestAnimationFrame(async () => await this.loop()) + + this.context.clearRect(0, 0, this.canvas.width, this.canvas.height) + + // move snake by its velocity + this.snake.x += this.snake.dx + this.snake.y += this.snake.dy + + if (this.moveQueue.length) { + const move = this.moveQueue.shift() + // left arrow key + if (move === 'ArrowLeft' && this.snake.dx === 0) { + this.snake.dx = -this.grid + this.snake.dy = 0 + } + // up arrow key + else if (move === 'ArrowUp' && this.snake.dy === 0) { + this.snake.dy = -this.grid + this.snake.dx = 0 + } + // right arrow key + else if (move === 'ArrowRight' && this.snake.dx === 0) { + this.snake.dx = this.grid + this.snake.dy = 0 + } + // down arrow key + else if (move === 'ArrowDown' && this.snake.dy === 0) { + this.snake.dy = this.grid + this.snake.dx = 0 + } + } + + // edge death + if ( + this.snake.x < 0 || + this.snake.y < 0 || + this.snake.x >= this.canvas.width || + this.snake.y >= this.canvas.height + ) { + this.death() + } + + // keep track of where snake has been. front of the array is always the head + this.snake.cells.unshift({ x: this.snake.x, y: this.snake.y }) + + // remove cells as we move away from them + if (this.snake.cells.length > this.snake.maxCells) { + this.snake.cells.pop() + } + + // draw bitcoin + this.context.fillStyle = '#ff4961' + this.context.drawImage( + this.image, + this.bitcoin.x - 1, + this.bitcoin.y - 1, + this.grid + 2, + this.grid + 2, + ) + + // draw snake one cell at a time + this.context.fillStyle = '#2fdf75' + + const firstCell = this.snake.cells[0] + + for (let index = 0; index < this.snake.cells.length; index++) { + const cell = this.snake.cells[index] + + // drawing 1 px smaller than the grid creates a grid effect in the snake body so you can see how long it is + this.context.fillRect(cell.x, cell.y, this.grid - 1, this.grid - 1) + + // snake ate bitcoin + if (cell.x === this.bitcoin.x && cell.y === this.bitcoin.y) { + this.score++ + this.highScore = Math.max(this.score, this.highScore) + this.snake.maxCells++ + + this.bitcoin.x = this.getRandomInt(0, this.width) * this.grid + this.bitcoin.y = this.getRandomInt(0, this.height) * this.grid + } + + if (index > 0) { + // check collision with all cells after this one (modified bubble sort) + // snake occupies same space as a body part. reset game + if ( + firstCell.x === this.snake.cells[index].x && + firstCell.y === this.snake.cells[index].y + ) { + this.death() + } + } + } + } + + death() { + this.snake.x = + this.grid * (Math.floor(this.width / 2) - this.startingLength) + this.snake.y = this.grid * Math.floor(this.height / 2) + this.snake.cells = [] + this.snake.maxCells = this.startingLength + this.snake.dx = this.grid + this.snake.dy = 0 + + this.bitcoin.x = this.getRandomInt(0, 25) * this.grid + this.bitcoin.y = this.getRandomInt(0, 25) * this.grid + this.score = 0 + } + + getRandomInt(min: number, max: number) { + return Math.floor(Math.random() * (max - min)) + min + } +} diff --git a/web/projects/ui/src/app/apps/portal/components/header/snek.directive.ts b/web/projects/ui/src/app/apps/portal/components/header/snek.directive.ts new file mode 100644 index 000000000..d7321d508 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/components/header/snek.directive.ts @@ -0,0 +1,47 @@ +import { Directive, HostListener, inject, Input } from '@angular/core' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { TuiDialogService } from '@taiga-ui/core' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' +import { filter } from 'rxjs' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { HeaderSnekComponent } from './snek.component' + +@Directive({ + standalone: true, + selector: 'img[appSnek]', +}) +export class HeaderSnekDirective { + private readonly dialogs = inject(TuiDialogService) + private readonly loader = inject(LoadingService) + private readonly errorService = inject(ErrorService) + private readonly api = inject(ApiService) + + @Input() + appSnek = 0 + + @HostListener('click') + async onClick() { + this.dialogs + .open(new PolymorpheusComponent(HeaderSnekComponent), { + label: 'Snake!', + closeable: false, + dismissible: false, + data: this.appSnek, + }) + .pipe(filter(score => score > this.appSnek)) + .subscribe(async score => { + const loader = this.loader.open('Saving high score...').subscribe() + + try { + await this.api.setDbValue( + ['gaming', 'snake', 'high-score'], + score, + ) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + }) + } +} diff --git a/web/projects/ui/src/app/apps/portal/modals/prompt.component.ts b/web/projects/ui/src/app/apps/portal/modals/prompt.component.ts new file mode 100644 index 000000000..b039048e5 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/modals/prompt.component.ts @@ -0,0 +1,124 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, Inject } from '@angular/core' +import { FormsModule } from '@angular/forms' +import { TuiAutoFocusModule } from '@taiga-ui/cdk' +import { TuiDialogContext, TuiTextfieldControllerModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' +import { TuiInputModule } from '@taiga-ui/kit' +import { + POLYMORPHEUS_CONTEXT, + PolymorpheusComponent, +} from '@tinkoff/ng-polymorpheus' + +@Component({ + standalone: true, + template: ` +

    {{ options.message }}

    +

    {{ options.warning }}

    +
    + + {{ options.label }} + * + + +
    + + +
    +
    + + + + + `, + styles: [ + ` + .warning { + color: var(--tui-warning-fill); + } + + .button { + pointer-events: auto; + margin-left: 0.25rem; + } + + .masked { + font-family: text-security-disc; + -webkit-text-security: disc; + } + `, + ], + imports: [ + CommonModule, + FormsModule, + TuiInputModule, + TuiButtonModule, + TuiTextfieldControllerModule, + TuiAutoFocusModule, + ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class PromptComponent { + masked = this.options.useMask + value = this.options.initialValue || '' + + constructor( + @Inject(POLYMORPHEUS_CONTEXT) + private readonly context: TuiDialogContext, + ) {} + + get options(): PromptOptions { + return this.context.data + } + + cancel() { + this.context.$implicit.complete() + } + + submit(value: string) { + if (value || !this.options.required) { + this.context.$implicit.next(value) + } + } +} + +export const PROMPT = new PolymorpheusComponent(PromptComponent) + +export interface PromptOptions { + message: string + label?: string + warning?: string + buttonText?: string + placeholder?: string + required?: boolean + useMask?: boolean + initialValue?: string | null +} diff --git a/web/projects/ui/src/app/apps/portal/routes/service/modals/config.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/modals/config.component.ts index f5c095f35..43f874c47 100644 --- a/web/projects/ui/src/app/apps/portal/routes/service/modals/config.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/service/modals/config.component.ts @@ -29,8 +29,10 @@ import { hasCurrentDeps } from 'src/app/util/has-deps' import { getAllPackages, getPackage } from 'src/app/util/get-package-data' import { Breakages } from 'src/app/services/api/api.types' import { InvalidService } from 'src/app/common/form/invalid.service' -import { ActionButton, FormPage } from 'src/app/apps/ui/modals/form/form.page' -import { FormPageModule } from 'src/app/apps/ui/modals/form/form.module' +import { + ActionButton, + FormComponent, +} from 'src/app/apps/portal/components/form.component' import { PackageConfigData } from '../types/package-config-data' import { ConfigDepComponent } from '../components/config-dep.component' @@ -68,7 +70,7 @@ import { ConfigDepComponent } from '../components/config-dep.component' {{ pkg.manifest.version }}. - Reset Defaults - + `, styles: [ @@ -97,7 +99,7 @@ import { ConfigDepComponent } from '../components/config-dep.component' standalone: true, imports: [ CommonModule, - FormPageModule, + FormComponent, TuiLoaderModule, TuiNotificationModule, TuiButtonModule, @@ -107,8 +109,8 @@ import { ConfigDepComponent } from '../components/config-dep.component' providers: [InvalidService], }) export class ServiceConfigModal { - @ViewChild(FormPage) - private readonly form?: FormPage> + @ViewChild(FormComponent) + private readonly form?: FormComponent> readonly pkgId = this.context.data.pkgId readonly dependentInfo = this.context.data.dependentInfo diff --git a/web/projects/ui/src/app/apps/portal/routes/service/routes/actions.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/routes/actions.component.ts index 3a2856529..52e6371da 100644 --- a/web/projects/ui/src/app/apps/portal/routes/service/routes/actions.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/service/routes/actions.component.ts @@ -13,6 +13,7 @@ import { TUI_PROMPT } from '@taiga-ui/kit' import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' import { PatchDB } from 'patch-db-client' import { filter, switchMap, timer } from 'rxjs' +import { FormComponent } from 'src/app/apps/portal/components/form.component' import { ApiService } from 'src/app/services/api/embassy-api.service' import { Action, @@ -22,7 +23,6 @@ import { } from 'src/app/services/patch-db/data-model' import { hasCurrentDeps } from 'src/app/util/has-deps' import { FormDialogService } from 'src/app/services/form-dialog.service' -import { FormPage } from 'src/app/apps/ui/modals/form/form.page' import { ServiceActionComponent } from '../components/action.component' import { ServiceActionSuccessComponent } from '../components/action-success.component' import { DesktopService } from '../../../services/desktop.service' @@ -97,7 +97,7 @@ export class ServiceActionsRoute { .subscribe() } else { if (action['input-spec'] && !isEmptyObject(action['input-spec'])) { - this.formDialog.open(FormPage, { + this.formDialog.open(FormComponent, { label: action.name, data: { spec: action['input-spec'], diff --git a/web/projects/ui/src/app/apps/portal/routes/system/backups/components/physical.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/components/physical.component.ts index 019db58ee..5b6357993 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/backups/components/physical.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/backups/components/physical.component.ts @@ -9,9 +9,8 @@ import { import { TuiForModule } from '@taiga-ui/cdk' import { TuiSvgModule } from '@taiga-ui/core' import { TuiButtonModule } from '@taiga-ui/experimental' -import { UnknownDisk } from 'src/app/services/api/api.types' -import { IonicModule } from '@ionic/angular' import { UnitConversionPipesModule } from '@start9labs/shared' +import { UnknownDisk } from 'src/app/services/api/api.types' @Component({ selector: 'table[backupsPhysical]', @@ -69,7 +68,6 @@ import { UnitConversionPipesModule } from '@start9labs/shared' TuiForModule, TuiSvgModule, TuiButtonModule, - IonicModule, UnitConversionPipesModule, ], }) diff --git a/web/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts index 4c93e3a0d..ce89c9566 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/backups/modals/targets.component.ts @@ -9,7 +9,7 @@ import { TuiNotificationModule } from '@taiga-ui/core' import { TuiButtonModule, TuiFadeModule } from '@taiga-ui/experimental' import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' import { BehaviorSubject } from 'rxjs' -import { FormPage } from 'src/app/apps/ui/modals/form/form.page' +import { FormComponent } from 'src/app/apps/portal/components/form.component' import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' import { cifsSpec, @@ -17,7 +17,7 @@ import { dropboxSpec, googleDriveSpec, remoteBackupTargetSpec, -} from 'src/app/apps/ui/pages/backups/types/target-types' +} from '../types/target' import { FormDialogService } from 'src/app/services/form-dialog.service' import { BackupTarget, @@ -126,7 +126,7 @@ export class BackupsTargetsModal implements OnInit { } async onUpdate(value: BackupTarget) { - this.formDialog.open(FormPage, { + this.formDialog.open(FormComponent, { label: 'Update Target', data: { value, @@ -147,7 +147,7 @@ export class BackupsTargetsModal implements OnInit { } async addPhysical(disk: UnknownDisk) { - this.formDialog.open(FormPage, { + this.formDialog.open(FormComponent, { label: 'New Physical Target', data: { spec: await configBuilderToSpec(diskBackupTargetSpec), @@ -173,7 +173,7 @@ export class BackupsTargetsModal implements OnInit { } async addRemote() { - this.formDialog.open(FormPage, { + this.formDialog.open(FormComponent, { label: 'New Remote Target', data: { spec: await configBuilderToSpec(remoteBackupTargetSpec), diff --git a/web/projects/ui/src/app/apps/portal/routes/system/backups/services/restore.service.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/services/restore.service.ts index b1f6b3faf..72c37c877 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/backups/services/restore.service.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/backups/services/restore.service.ts @@ -14,12 +14,12 @@ import { take, tap, } from 'rxjs' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { BackupTarget } from 'src/app/services/api/api.types' import { PROMPT, PromptOptions, -} from 'src/app/apps/ui/modals/prompt/prompt.component' +} from 'src/app/apps/portal/modals/prompt.component' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { BackupTarget } from 'src/app/services/api/api.types' import { TARGET, TARGET_RESTORE } from '../modals/target.component' import { RECOVER } from '../modals/recover.component' import { RecoverData } from '../types/recover-data' diff --git a/web/projects/ui/src/app/apps/portal/routes/system/backups/types/target.ts b/web/projects/ui/src/app/apps/portal/routes/system/backups/types/target.ts new file mode 100644 index 000000000..fa129fdef --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/backups/types/target.ts @@ -0,0 +1,121 @@ +import { Config } from '@start9labs/start-sdk/lib/config/builder/config' +import { Value } from '@start9labs/start-sdk/lib/config/builder/value' +import { Variants } from '@start9labs/start-sdk/lib/config/builder/variants' + +export const dropboxSpec = Config.of({ + name: Value.text({ + name: 'Name', + description: 'A friendly name for this Dropbox target', + placeholder: 'My Dropbox', + required: { default: null }, + }), + token: Value.text({ + name: 'Access Token', + description: 'The secret access token for your custom Dropbox app', + required: { default: null }, + masked: true, + }), + path: Value.text({ + name: 'Path', + description: 'The fully qualified path to the backup directory', + placeholder: 'e.g. /Desktop/my-folder', + required: { default: null }, + }), +}) + +export const googleDriveSpec = Config.of({ + name: Value.text({ + name: 'Name', + description: 'A friendly name for this Google Drive target', + placeholder: 'My Google Drive', + required: { default: null }, + }), + path: Value.text({ + name: 'Path', + description: 'The fully qualified path to the backup directory', + placeholder: 'e.g. /Desktop/my-folder', + required: { default: null }, + }), + key: Value.file({ + name: 'Private Key File', + description: + 'Your Google Drive service account private key file (.json file)', + required: { default: null }, + extensions: ['json'], + }), +}) + +export const cifsSpec = Config.of({ + name: Value.text({ + name: 'Name', + description: 'A friendly name for this Network Folder', + placeholder: 'My Network Folder', + required: { default: null }, + }), + hostname: Value.text({ + name: 'Hostname', + description: + 'The hostname of your target device on the Local Area Network.', + warning: null, + placeholder: `e.g. 'My Computer' OR 'my-computer.local'`, + required: { default: null }, + patterns: [], + }), + path: Value.text({ + name: 'Path', + description: `On Windows, this is the fully qualified path to the shared folder, (e.g. /Desktop/my-folder).\n\n On Linux and Mac, this is the literal name of the shared folder (e.g. my-shared-folder).`, + placeholder: 'e.g. my-shared-folder or /Desktop/my-folder', + required: { default: null }, + }), + username: Value.text({ + name: 'Username', + description: `On Linux, this is the samba username you created when sharing the folder.\n\n On Mac and Windows, this is the username of the user who is sharing the folder.`, + required: { default: null }, + placeholder: 'My Network Folder', + }), + password: Value.text({ + name: 'Password', + description: `On Linux, this is the samba password you created when sharing the folder.\n\n On Mac and Windows, this is the password of the user who is sharing the folder.`, + required: false, + masked: true, + placeholder: 'My Network Folder', + }), +}) + +export const remoteBackupTargetSpec = Config.of({ + type: Value.union( + { + name: 'Target Type', + required: { default: 'dropbox' }, + }, + Variants.of({ + dropbox: { + name: 'Dropbox', + spec: dropboxSpec, + }, + 'google-drive': { + name: 'Google Drive', + spec: googleDriveSpec, + }, + cifs: { + name: 'Network Folder', + spec: cifsSpec, + }, + }), + ), +}) + +export const diskBackupTargetSpec = Config.of({ + name: Value.text({ + name: 'Name', + description: 'A friendly name for this physical target', + placeholder: 'My Physical Target', + required: { default: null }, + }), + path: Value.text({ + name: 'Path', + description: 'The fully qualified path to the backup directory', + placeholder: 'e.g. /Backups/my-folder', + required: { default: null }, + }), +}) diff --git a/web/projects/ui/src/app/apps/portal/routes/system/marketplace/components/sidebars.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/marketplace/components/sidebars.component.ts index 2a74e64b8..71439d651 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/marketplace/components/sidebars.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/marketplace/components/sidebars.component.ts @@ -13,7 +13,7 @@ import { MarketplaceSidebarService } from '../services/sidebar.service' ` :host { position: fixed; - inset: 7.5rem 0 0; + inset: 3.5rem 0 0; pointer-events: none; transform: translate3d(0, 0, 0); } diff --git a/web/projects/ui/src/app/apps/portal/routes/system/marketplace/modals/registry.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/marketplace/modals/registry.component.ts index 79c1150e0..d6c656507 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/marketplace/modals/registry.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/marketplace/modals/registry.component.ts @@ -21,11 +21,11 @@ import { TUI_PROMPT } from '@taiga-ui/kit' import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' import { PatchDB } from 'patch-db-client' import { combineLatest, filter, firstValueFrom, map, Subscription } from 'rxjs' +import { FormComponent } from 'src/app/apps/portal/components/form.component' import { ApiService } from 'src/app/services/api/embassy-api.service' import { DataModel, UIStore } from 'src/app/services/patch-db/data-model' import { MarketplaceService } from 'src/app/services/marketplace.service' import { FormDialogService } from 'src/app/services/form-dialog.service' -import { FormPage } from 'src/app/apps/ui/modals/form/form.page' import { MarketplaceRegistryComponent } from '../components/registry.component' import { getMarketplaceValueSpec, getPromptOptions } from '../utils/registry' @@ -112,7 +112,7 @@ export class MarketplaceRegistryModal { add() { const { name, spec } = getMarketplaceValueSpec() - this.formDialog.open(FormPage, { + this.formDialog.open(FormComponent, { label: name, data: { spec, diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/domains/domains.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/domains/domains.component.ts index 9bff2a680..0ec33bbf9 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/domains/domains.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/domains/domains.component.ts @@ -6,14 +6,16 @@ import { TuiButtonModule } from '@taiga-ui/experimental' import { TUI_PROMPT } from '@taiga-ui/kit' import { PatchDB } from 'patch-db-client' import { filter, firstValueFrom, map } from 'rxjs' -import { DataModel } from 'src/app/services/patch-db/data-model' -import { FormContext, FormPage } from 'src/app/apps/ui/modals/form/form.page' -import { FormDialogService } from 'src/app/services/form-dialog.service' +import { + FormComponent, + FormContext, +} from 'src/app/apps/portal/components/form.component' import { ApiService } from 'src/app/services/api/embassy-api.service' -import { getCustomSpec } from 'src/app/apps/ui/pages/system/domains/domain.const' -import { getStart9ToSpec } from './constants' -import { DomainsTableComponent } from './table.component' +import { FormDialogService } from 'src/app/services/form-dialog.service' +import { DataModel } from 'src/app/services/patch-db/data-model' +import { getCustomSpec, getStart9ToSpec } from './constants' import { DomainsInfoComponent } from './info.component' +import { DomainsTableComponent } from './table.component' @Component({ template: ` @@ -121,7 +123,7 @@ export class SettingsDomainsComponent { }, } - this.formDialog.open(FormPage, options) + this.formDialog.open(FormComponent, options) } async claim() { @@ -146,7 +148,7 @@ export class SettingsDomainsComponent { }, } - this.formDialog.open(FormPage, options) + this.formDialog.open(FormComponent, options) } private getNetworkStrategy(strategy: any) { diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/email/email.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/email/email.component.ts index f70e30f2a..c29a9213b 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/email/email.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/email/email.component.ts @@ -24,24 +24,22 @@ import { EmailInfoComponent } from './info.component' template: ` -
    +

    SMTP Credentials

    -
    - -
    +
    -
    +

    Test Email

    -
    - -
    +
    `, diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/menu.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/menu.component.ts index 66f7b2474..bff56bfcc 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/menu.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/menu.component.ts @@ -17,9 +17,12 @@ import { } from '@taiga-ui/core' import { TUI_PROMPT } from '@taiga-ui/kit' import { filter } from 'rxjs' +import { + FormComponent, + FormContext, +} from 'src/app/apps/portal/components/form.component' import { Proxy } from 'src/app/services/patch-db/data-model' import { ApiService } from 'src/app/services/api/embassy-api.service' -import { FormContext, FormPage } from 'src/app/apps/ui/modals/form/form.page' import { FormDialogService } from 'src/app/services/form-dialog.service' import { DELETE_OPTIONS, ProxyUpdate } from './constants' @@ -132,6 +135,6 @@ export class ProxiesMenuComponent { }, } - this.formDialog.open(FormPage, options) + this.formDialog.open(FormComponent, options) } } diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/proxies.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/proxies.component.ts index 6ca2f6595..3dfc3ae29 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/proxies.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/proxies/proxies.component.ts @@ -4,8 +4,11 @@ import { ErrorService, LoadingService } from '@start9labs/shared' import { TuiDialogOptions, TuiDialogService } from '@taiga-ui/core' import { TuiButtonModule } from '@taiga-ui/experimental' import { PatchDB } from 'patch-db-client' +import { + FormComponent, + FormContext, +} from 'src/app/apps/portal/components/form.component' import { DataModel } from 'src/app/services/patch-db/data-model' -import { FormContext, FormPage } from 'src/app/apps/ui/modals/form/form.page' import { FormDialogService } from 'src/app/services/form-dialog.service' import { ApiService } from 'src/app/services/api/embassy-api.service' import { ProxiesTableComponent } from './table.component' @@ -58,7 +61,7 @@ export class SettingsProxiesComponent { }, } - this.formDialog.open(FormPage, options) + this.formDialog.open(FormComponent, options) } private async save({ name, config }: WireguardSpec): Promise { diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/ssh/table.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/ssh/table.component.ts index e9195ccb6..729baaae1 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/ssh/table.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/ssh/table.component.ts @@ -12,11 +12,11 @@ import { TuiLinkModule, } from '@taiga-ui/core' import { TuiButtonModule } from '@taiga-ui/experimental' +import { PROMPT } from 'src/app/apps/portal/modals/prompt.component' import { SSHKey } from 'src/app/services/api/api.types' -import { PROMPT } from '../../../../../../ui/modals/prompt/prompt.component' import { filter, take } from 'rxjs' import { ErrorService, LoadingService } from '@start9labs/shared' -import { ApiService } from '../../../../../../../services/api/embassy-api.service' +import { ApiService } from 'src/app/services/api/embassy-api.service' import { TUI_PROMPT, TuiPromptData } from '@taiga-ui/kit' import { TuiForModule } from '@taiga-ui/cdk' @@ -35,7 +35,7 @@ import { TuiForModule } from '@taiga-ui/cdk' {{ key.hostname }} - {{ key['created-at'] | date : 'medium' }} + {{ key['created-at'] | date: 'medium' }} {{ key.alg }} {{ key.fingerprint }} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/table.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/table.component.ts index 8e9e0cd16..c25991f45 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/table.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/table.component.ts @@ -15,9 +15,12 @@ import { TuiIconModule, TuiTitleModule, } from '@taiga-ui/experimental' +import { + FormComponent, + FormContext, +} from 'src/app/apps/portal/components/form.component' import { ApiService } from 'src/app/services/api/embassy-api.service' import { FormDialogService } from 'src/app/services/form-dialog.service' -import { FormContext, FormPage } from 'src/app/apps/ui/modals/form/form.page' import { Wifi, WiFiForm, wifiSpec } from './utils' import { SettingsWifiComponent } from './wifi.component' @@ -142,7 +145,7 @@ export class WifiTableComponent { }, } - this.formDialog.open(FormPage, options) + this.formDialog.open(FormComponent, options) } } } diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/wifi.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/wifi.component.ts index 53c7ee378..68c8ef5ef 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/wifi.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/wifi.component.ts @@ -25,18 +25,17 @@ import { } from '@taiga-ui/experimental' import { PatchDB } from 'patch-db-client' import { catchError, defer, merge, Observable, of, Subject, map } from 'rxjs' +import { + FormComponent, + FormContext, +} from 'src/app/apps/portal/components/form.component' import { ApiService } from 'src/app/services/api/embassy-api.service' import { DataModel } from 'src/app/services/patch-db/data-model' import { WifiInfoComponent } from './info.component' import { WifiTableComponent } from './table.component' import { parseWifi, WifiData, WiFiForm } from './utils' -import { RR } from '../../../../../../../services/api/api.types' -import { - FormContext, - FormPage, -} from '../../../../../../ui/modals/form/form.page' import { wifiSpec } from '../../../../../../ui/pages/system/wifi/wifi.const' -import { FormDialogService } from '../../../../../../../services/form-dialog.service' +import { FormDialogService } from 'src/app/services/form-dialog.service' @Component({ template: ` @@ -143,7 +142,7 @@ export class SettingsWifiComponent { }, } - this.formDialog.open(FormPage, options) + this.formDialog.open(FormComponent, options) } async saveAndConnect(ssid: string, password?: string): Promise { diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.service.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.service.ts index e069ab3d3..f8884cd70 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.service.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/settings.service.ts @@ -6,14 +6,14 @@ import { TUI_PROMPT } from '@taiga-ui/kit' import { PatchDB } from 'patch-db-client' import { filter, from, take } from 'rxjs' import { switchMap } from 'rxjs/operators' +import { FormComponent } from 'src/app/apps/portal/components/form.component' +import { PROMPT } from 'src/app/apps/portal/modals/prompt.component' import { ProxyService } from 'src/app/services/proxy.service' -import { FormPage } from 'src/app/apps/ui/modals/form/form.page' import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' import { getServerInfo } from 'src/app/util/get-server-info' import { FormDialogService } from 'src/app/services/form-dialog.service' import { DataModel } from 'src/app/services/patch-db/data-model' import { ApiService } from 'src/app/services/api/embassy-api.service' -import { PROMPT } from 'src/app/apps/ui/modals/prompt/prompt.component' import { passwordSpec, PasswordSpec, SettingBtn } from './settings.types' @@ -160,7 +160,7 @@ export class SettingsService { switchMap(() => from(configBuilderToSpec(passwordSpec))), ) .subscribe(spec => { - this.formDialog.open(FormPage, { + this.formDialog.open(FormComponent, { label: 'Change Master Password', data: { spec, diff --git a/web/projects/ui/src/app/apps/portal/routes/system/snek/snek.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/snek/snek.component.ts deleted file mode 100644 index 6eb12a532..000000000 --- a/web/projects/ui/src/app/apps/portal/routes/system/snek/snek.component.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' - -@Component({ - template: 'Here be snek', - standalone: true, - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export default class SnekComponent {} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/system.module.ts b/web/projects/ui/src/app/apps/portal/routes/system/system.module.ts index 92691e6e2..9b0c6768c 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/system.module.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/system.module.ts @@ -46,12 +46,6 @@ const ROUTES: Routes = [ loadComponent: () => import('./updates/updates.component'), data: toNavigationItem('/portal/system/updates'), }, - { - title: systemTabResolver, - path: 'snek', - loadComponent: () => import('./snek/snek.component'), - data: toNavigationItem('/portal/system/snek'), - }, ] @NgModule({ imports: [RouterModule.forChild(ROUTES)] }) diff --git a/web/projects/ui/src/app/apps/portal/services/breadcrumbs.service.ts b/web/projects/ui/src/app/apps/portal/services/breadcrumbs.service.ts index 631ee0605..89593a545 100644 --- a/web/projects/ui/src/app/apps/portal/services/breadcrumbs.service.ts +++ b/web/projects/ui/src/app/apps/portal/services/breadcrumbs.service.ts @@ -30,7 +30,7 @@ export class BreadcrumbsService extends BehaviorSubject { const packages = await getAllPackages(this.patch) try { - this.next(toBreadcrumbs(page, packages)) + this.next(toBreadcrumbs(page.split('?')[0], packages)) } catch (e) { this.next([]) } diff --git a/web/projects/ui/src/app/services/patch-db/patch-db.module.ts b/web/projects/ui/src/app/services/patch-db/patch-db.module.ts deleted file mode 100644 index 3c816e339..000000000 --- a/web/projects/ui/src/app/services/patch-db/patch-db.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { PatchDB } from 'patch-db-client' -import { Injector, NgModule } from '@angular/core' -import { PATCH_SOURCE, sourceFactory } from './patch-db.factory' - -// This module is purely for providers organization purposes -@NgModule({ - providers: [ - { - provide: PATCH_SOURCE, - deps: [Injector], - useFactory: sourceFactory, - }, - { - provide: PatchDB, - deps: [PATCH_SOURCE], - useClass: PatchDB, - }, - ], -}) -export class PatchDbModule {} diff --git a/web/projects/ui/src/app/services/patch-db/patch-db.providers.ts b/web/projects/ui/src/app/services/patch-db/patch-db.providers.ts new file mode 100644 index 000000000..e47f1a9a5 --- /dev/null +++ b/web/projects/ui/src/app/services/patch-db/patch-db.providers.ts @@ -0,0 +1,16 @@ +import { PatchDB } from 'patch-db-client' +import { Injector } from '@angular/core' +import { PATCH_SOURCE, sourceFactory } from './patch-db.factory' + +export const PATCH_DB_PROVIDERS = [ + { + provide: PATCH_SOURCE, + deps: [Injector], + useFactory: sourceFactory, + }, + { + provide: PatchDB, + deps: [PATCH_SOURCE], + useClass: PatchDB, + }, +] diff --git a/web/projects/ui/src/styles.scss b/web/projects/ui/src/styles.scss index 0ebb45238..2a92038a5 100644 --- a/web/projects/ui/src/styles.scss +++ b/web/projects/ui/src/styles.scss @@ -369,15 +369,21 @@ ul { } .g-page { + @include customize-scroll(); + display: block; - height: 100%; + height: calc(100% - 0.375rem); padding: 1px 2rem 3rem; box-sizing: border-box; overflow: auto; isolation: isolate; + backdrop-filter: blur(2rem); + margin: 0 0.375rem; + border-radius: 0.375rem; // TODO: Theme - background: #373a3f; + background: rgb(55 58 63 / 90%); + box-shadow: inset 0 1px rgb(255 255 255 / 10%); } .g-edged { From c0a55142b5dcb3916f64ac447bdec301f072c1b5 Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Sat, 17 Feb 2024 00:45:30 +0400 Subject: [PATCH 046/169] chore: refactor interfaces and remove UI routes (#2560) --- web/projects/ui/src/app/app.component.html | 1 - web/projects/ui/src/app/app.module.ts | 2 - .../interface-clearnet.component.ts | 157 ++++ .../interfaces/interface-local.component.ts | 59 ++ .../interfaces/interface-tor.component.ts | 31 + .../interfaces/interface.component.ts | 79 ++ .../components/interfaces/interface.utils.ts | 46 ++ .../interfaces/interfaces.component.ts | 55 ++ .../service/routes/interface.component.ts | 12 +- .../routes/interfaces/interfaces.component.ts | 8 +- .../settings/routes/wifi/wifi.component.ts | 6 +- .../settings/routes}/wifi/wifi.const.ts | 0 .../backup-report.component.html | 32 - .../backup-report/backup-report.component.ts | 52 -- .../backup-report/backup-report.module.ts | 11 - .../app/apps/ui/modals/form/form.module.ts | 24 - .../app/apps/ui/modals/form/form.page.html | 32 - .../app/apps/ui/modals/form/form.page.scss | 12 - .../src/app/apps/ui/modals/form/form.page.ts | 101 --- .../ui/modals/prompt/prompt.component.html | 40 - .../ui/modals/prompt/prompt.component.scss | 13 - .../apps/ui/modals/prompt/prompt.component.ts | 49 -- .../apps/ui/modals/prompt/prompt.module.ts | 22 - .../apps/ui/pages/backups/backups.module.ts | 37 - .../backing-up/backing-up.component.html | 60 -- .../backing-up/backing-up.component.ts | 47 -- .../directives/backup-create.directive.ts | 60 -- .../directives/backup-restore.directive.ts | 124 ---- .../backup-select/backup-select.module.ts | 20 - .../backup-select/backup-select.page.html | 31 - .../backup-select/backup-select.page.scss | 25 - .../backup-select/backup-select.page.ts | 70 -- .../recover-select/recover-select.module.ts | 21 - .../recover-select/recover-select.page.html | 36 - .../recover-select/recover-select.page.scss | 31 - .../recover-select/recover-select.page.ts | 63 -- .../modals/recover-select/to-options.pipe.ts | 49 -- .../target-select/target-select.module.ts | 20 - .../target-select/target-select.page.html | 40 - .../target-select/target-select.page.scss | 3 - .../target-select/target-select.page.ts | 79 -- .../target-status.component.html | 30 - .../backup-history/backup-history.module.ts | 31 - .../backup-history/backup-history.page.html | 93 --- .../backup-history/backup-history.page.scss | 3 - .../backup-history/backup-history.page.ts | 109 --- .../pages/backup-jobs/backup-jobs.module.ts | 39 - .../pages/backup-jobs/backup-jobs.page.html | 88 --- .../pages/backup-jobs/backup-jobs.page.scss | 0 .../pages/backup-jobs/backup-jobs.page.ts | 96 --- .../edit-job/edit-job.component.html | 47 -- .../edit-job/edit-job.component.scss | 34 - .../edit-job/edit-job.component.ts | 75 -- .../pages/backup-jobs/edit-job/job-builder.ts | 41 -- .../pages/backups/pages/backup-jobs/pipes.ts | 34 - .../backup-targets/backup-targets.module.ts | 30 - .../backup-targets/backup-targets.page.html | 162 ---- .../backup-targets/backup-targets.page.scss | 0 .../backup-targets/backup-targets.page.ts | 240 ------ .../backups/pages/backups/backups.module.ts | 46 -- .../backups/pages/backups/backups.page.html | 112 --- .../backups/pages/backups/backups.page.scss | 0 .../backups/pages/backups/backups.page.ts | 42 -- .../backups/pipes/get-display-info.pipe.ts | 42 -- .../backups/pipes/has-valid-backup.pipe.ts | 15 - .../backups/pipes/target-pipes.module.ts | 11 - .../ui/pages/backups/types/target-types.ts | 121 --- .../src/app/apps/ui/pages/home/home.module.ts | 26 - .../src/app/apps/ui/pages/home/home.page.html | 13 - .../src/app/apps/ui/pages/home/home.page.scss | 9 - .../src/app/apps/ui/pages/home/home.page.ts | 8 - .../marketplace-item-toggle.component.ts | 134 ---- .../marketplace-menu.component.html | 29 - .../marketplace-menu.component.scss | 0 .../marketplace-menu.component.ts | 31 - .../marketplace-menu.module.ts | 11 - .../marketplace-list.module.ts | 37 - .../marketplace-list.page.html | 112 --- .../marketplace-list.page.scss | 4 - .../marketplace-list/marketplace-list.page.ts | 57 -- .../marketplace-settings.module.ts | 27 - .../marketplace-settings.page.html | 84 --- .../marketplace-settings.page.scss | 16 - .../marketplace-settings.page.ts | 236 ------ .../marketplace-show-controls.component.ts | 317 -------- .../marketplace-show-preview.component.html | 47 -- .../marketplace-show-preview.component.scss | 0 .../marketplace-show-preview.component.ts | 59 -- .../marketplace-show-preview.module.ts | 35 - .../marketplace-status.component.html | 32 - .../marketplace-status.component.scss | 3 - .../marketplace-status.component.ts | 21 - .../marketplace-status.module.ts | 18 - .../pages/marketplace/marketplace.module.ts | 19 - .../notifications/notifications.module.ts | 30 - .../notifications/notifications.page.html | 142 ---- .../notifications/notifications.page.scss | 11 - .../pages/notifications/notifications.page.ts | 151 ---- .../action-success/action-success.module.ts | 13 - .../action-success/action-success.page.html | 22 - .../action-success/action-success.page.ts | 21 - .../app-actions-item.component.html | 7 - .../app-actions/app-actions.module.ts | 32 - .../app-actions/app-actions.page.html | 39 - .../app-actions/app-actions.page.scss | 0 .../services/app-actions/app-actions.page.ts | 220 ------ .../app-credentials/app-credentials.module.ts | 30 - .../app-credentials/app-credentials.page.html | 58 -- .../app-credentials/app-credentials.page.scss | 4 - .../app-credentials/app-credentials.page.ts | 57 -- .../app-interface/app-interface.module.ts | 24 - .../app-interface/app-interface.page.html | 20 - .../app-interface/app-interface.page.scss | 0 .../app-interface/app-interface.page.ts | 29 - .../app-list-icon.component.html | 29 - .../app-list-icon.component.scss | 22 - .../app-list-icon/app-list-icon.component.ts | 18 - .../app-list-pkg/app-list-pkg.component.html | 46 -- .../app-list-pkg/app-list-pkg.component.scss | 3 - .../app-list-pkg/app-list-pkg.component.ts | 45 -- .../launch-menu/launch-menu.component.html | 25 - .../launch-menu/launch-menu.component.scss | 3 - .../launch-menu/launch-menu.component.ts | 38 - .../launch-menu/launch-menu.module.ts | 11 - .../launchable-interfaces.pipe.ts | 26 - .../services/app-list/app-list.module.ts | 50 -- .../services/app-list/app-list.page.html | 43 -- .../services/app-list/app-list.page.scss | 9 - .../pages/services/app-list/app-list.page.ts | 31 - .../services/app-list/package-info.pipe.ts | 25 - .../services/app-logs/app-logs.module.ts | 24 - .../services/app-logs/app-logs.page.html | 8 - .../services/app-logs/app-logs.page.scss | 0 .../pages/services/app-logs/app-logs.page.ts | 37 - .../services/app-show/app-show.module.ts | 65 -- .../services/app-show/app-show.page.html | 41 -- .../pages/services/app-show/app-show.page.ts | 232 ------ .../app-show-additional.component.html | 109 --- .../app-show-additional.component.ts | 41 -- .../app-show-dependencies.component.html | 29 - .../app-show-dependencies.component.scss | 7 - .../app-show-dependencies.component.ts | 13 - .../app-show-header.component.html | 19 - .../app-show-header.component.scss | 17 - .../app-show-header.component.ts | 13 - .../app-show-health-checks.component.html | 82 --- .../app-show-health-checks.component.scss | 24 - .../app-show-health-checks.component.ts | 47 -- .../app-show-interfaces.component.html | 25 - .../app-show-interfaces.component.scss | 0 .../app-show-interfaces.component.ts | 83 --- .../app-show-menu.component.html | 96 --- .../app-show-menu.component.scss | 6 - .../app-show-menu/app-show-menu.component.ts | 92 --- .../app-show-progress.component.html | 20 - .../app-show-progress.component.scss | 4 - .../app-show-progress.component.ts | 38 - .../app-show-status.component.html | 59 -- .../app-show-status.component.scss | 9 - .../app-show-status.component.ts | 221 ------ .../app-config/app-config-dep.component.ts | 100 --- .../modals/app-config/app-config.module.ts | 28 - .../modals/app-config/app-config.page.html | 58 -- .../modals/app-config/app-config.page.scss | 8 - .../modals/app-config/app-config.page.ts | 185 ----- .../app-show/pipes/health-color.pipe.ts | 21 - .../app-show/pipes/progress-data.pipe.ts | 13 - .../apps/ui/pages/services/services.module.ts | 52 -- .../services/status/status.component.html | 30 - .../status/status.component.module.ts | 18 - .../services/status/status.component.scss | 0 .../pages/services/status/status.component.ts | 29 - .../ui/pages/system/domains/domain.const.ts | 152 ---- .../ui/pages/system/domains/domains.module.ts | 26 - .../ui/pages/system/domains/domains.page.html | 135 ---- .../ui/pages/system/domains/domains.page.scss | 0 .../ui/pages/system/domains/domains.page.ts | 228 ------ .../ui/pages/system/email/email.module.ts | 33 - .../ui/pages/system/email/email.page.html | 63 -- .../ui/pages/system/email/email.page.scss | 11 - .../apps/ui/pages/system/email/email.page.ts | 75 -- .../experimental-features.module.ts | 29 - .../experimental-features.page.html | 51 -- .../experimental-features.page.scss | 0 .../experimental-features.page.ts | 105 --- .../system/kernel-logs/kernel-logs.module.ts | 24 - .../system/kernel-logs/kernel-logs.page.html | 8 - .../system/kernel-logs/kernel-logs.page.scss | 0 .../system/kernel-logs/kernel-logs.page.ts | 24 - .../ui/pages/system/proxies/proxies.module.ts | 42 -- .../ui/pages/system/proxies/proxies.page.html | 141 ---- .../ui/pages/system/proxies/proxies.page.scss | 0 .../ui/pages/system/proxies/proxies.page.ts | 180 ----- .../ui/pages/system/router/router.module.ts | 26 - .../ui/pages/system/router/router.page.html | 153 ---- .../ui/pages/system/router/router.page.scss | 26 - .../ui/pages/system/router/router.page.ts | 46 -- .../system/server-logs/server-logs.module.ts | 24 - .../system/server-logs/server-logs.page.html | 8 - .../system/server-logs/server-logs.page.scss | 0 .../system/server-logs/server-logs.page.ts | 24 - .../server-metrics/server-metrics.module.ts | 26 - .../server-metrics/server-metrics.page.html | 157 ---- .../server-metrics/server-metrics.page.scss | 3 - .../server-metrics/server-metrics.page.ts | 76 -- .../system/server-show/backup-color.pipe.ts | 23 - .../server-show/os-update/os-update.page.html | 13 - .../os-update/os-update.page.module.ts | 23 - .../server-show/os-update/os-update.page.scss | 24 - .../server-show/os-update/os-update.page.ts | 49 -- .../system/server-show/server-show.module.ts | 37 - .../system/server-show/server-show.page.html | 124 ---- .../system/server-show/server-show.page.scss | 15 - .../system/server-show/server-show.page.ts | 691 ------------------ .../server-specs/server-specs.module.ts | 26 - .../server-specs/server-specs.page.html | 53 -- .../server-specs/server-specs.page.scss | 3 - .../system/server-specs/server-specs.page.ts | 25 - .../pages/system/sessions/sessions.module.ts | 26 - .../pages/system/sessions/sessions.page.html | 128 ---- .../pages/system/sessions/sessions.page.scss | 3 - .../ui/pages/system/sessions/sessions.page.ts | 125 ---- .../ui/pages/system/sideload/dnd.directive.ts | 39 - .../pages/system/sideload/sideload.module.ts | 39 - .../pages/system/sideload/sideload.page.html | 88 --- .../pages/system/sideload/sideload.page.scss | 44 -- .../ui/pages/system/sideload/sideload.page.ts | 240 ------ .../pages/system/ssh-keys/ssh-keys.module.ts | 28 - .../pages/system/ssh-keys/ssh-keys.page.html | 77 -- .../pages/system/ssh-keys/ssh-keys.page.scss | 0 .../ui/pages/system/ssh-keys/ssh-keys.page.ts | 92 --- .../app/apps/ui/pages/system/system.module.ts | 103 --- .../theme-switcher.component.html | 23 - .../theme-switcher.component.ts | 23 - .../theme-switcher/theme-switcher.module.ts | 14 - .../pages/system/tor-logs/tor-logs.module.ts | 24 - .../pages/system/tor-logs/tor-logs.page.html | 8 - .../pages/system/tor-logs/tor-logs.page.scss | 0 .../ui/pages/system/tor-logs/tor-logs.page.ts | 24 - .../system/ui-details/ui-details.module.ts | 24 - .../system/ui-details/ui-details.page.html | 14 - .../system/ui-details/ui-details.page.scss | 0 .../system/ui-details/ui-details.page.ts | 15 - .../apps/ui/pages/system/wifi/wifi.module.ts | 28 - .../apps/ui/pages/system/wifi/wifi.page.html | 159 ---- .../apps/ui/pages/system/wifi/wifi.page.scss | 36 - .../apps/ui/pages/system/wifi/wifi.page.ts | 279 ------- .../ui/pages/updates/filter-updates.pipe.ts | 24 - .../ui/pages/updates/install-progress.pipe.ts | 12 - .../apps/ui/pages/updates/updates.module.ts | 49 -- .../apps/ui/pages/updates/updates.page.html | 124 ---- .../apps/ui/pages/updates/updates.page.scss | 26 - .../app/apps/ui/pages/updates/updates.page.ts | 139 ---- .../widgets/built-in/add/add.component.html | 13 - .../widgets/built-in/add/add.component.scss | 16 - .../widgets/built-in/add/add.component.ts | 31 - .../pages/widgets/built-in/add/add.module.ts | 12 - .../favorites/favorites.component.html | 1 - .../favorites/favorites.component.scss | 3 - .../built-in/favorites/favorites.component.ts | 9 - .../built-in/favorites/favorites.module.ts | 10 - .../built-in/health/health.component.html | 11 - .../built-in/health/health.component.scss | 19 - .../built-in/health/health.component.ts | 73 -- .../widgets/built-in/health/health.module.ts | 12 - .../built-in/metrics/metrics.component.html | 30 - .../built-in/metrics/metrics.component.scss | 34 - .../built-in/metrics/metrics.component.ts | 9 - .../built-in/metrics/metrics.module.ts | 10 - .../built-in/network/network.component.html | 7 - .../built-in/network/network.component.scss | 13 - .../built-in/network/network.component.ts | 9 - .../built-in/network/network.module.ts | 9 - .../built-in/uptime/uptime.component.html | 1 - .../built-in/uptime/uptime.component.scss | 0 .../built-in/uptime/uptime.component.ts | 9 - .../widgets/built-in/uptime/uptime.module.ts | 9 - .../apps/ui/pages/widgets/built-in/widgets.ts | 54 -- .../apps/ui/pages/widgets/widgets.module.ts | 40 - .../apps/ui/pages/widgets/widgets.page.html | 55 -- .../apps/ui/pages/widgets/widgets.page.scss | 112 --- .../app/apps/ui/pages/widgets/widgets.page.ts | 136 ---- web/projects/ui/src/app/apps/ui/ui.module.ts | 54 -- .../badge-menu.component.html | 24 - .../badge-menu.component.module.ts | 11 - .../badge-menu.component.scss | 33 - .../badge-menu-button/badge-menu.component.ts | 50 -- .../interface-addresses-item.component.html | 18 - .../interface-addresses.component.html | 125 ---- .../interface-addresses.component.scss | 15 - .../interface-addresses.component.ts | 214 ------ .../interface-addresses.module.ts | 19 - web/projects/ui/src/app/routing.module.ts | 5 +- .../ui/src/app/services/api/mock-patch.ts | 9 +- .../ui/src/app/services/proxy.service.ts | 41 +- 295 files changed, 465 insertions(+), 13902 deletions(-) create mode 100644 web/projects/ui/src/app/apps/portal/components/interfaces/interface-clearnet.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/components/interfaces/interface-local.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/components/interfaces/interface-tor.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/components/interfaces/interface.component.ts create mode 100644 web/projects/ui/src/app/apps/portal/components/interfaces/interface.utils.ts create mode 100644 web/projects/ui/src/app/apps/portal/components/interfaces/interfaces.component.ts rename web/projects/ui/src/app/apps/{ui/pages/system => portal/routes/system/settings/routes}/wifi/wifi.const.ts (100%) delete mode 100644 web/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/modals/form/form.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/modals/form/form.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/modals/form/form.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/modals/form/form.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/modals/prompt/prompt.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/backups.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/components/backing-up/backing-up.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/components/backing-up/backing-up.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/directives/backup-create.directive.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/directives/backup-restore.directive.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/to-options.pipe.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-status.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/job-builder.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/pipes.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pipes/get-display-info.pipe.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pipes/has-valid-backup.pipe.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/pipes/target-pipes.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/backups/types/target-types.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/home/home.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/home/home.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/home/home.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/home/home.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-item-toggle.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-menu/marketplace-menu.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-menu/marketplace-menu.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-menu/marketplace-menu.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-menu/marketplace-menu.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/components/marketplace-show-controls.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/notifications/notifications.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions-item.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launchable-interfaces.pipe.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-list/package-info.pipe.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config-dep.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/health-color.pipe.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/progress-data.pipe.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/services.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/status/status.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/status/status.component.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/status/status.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/services/status/status.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/domains/domains.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/email/email.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/email/email.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/email/email.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/email/email.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/router/router.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/router/router.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/router/router.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/router/router.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/server-show/backup-color.pipe.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/sideload/dnd.directive.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/system.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/updates/filter-updates.pipe.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/updates/install-progress.pipe.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/updates/updates.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/updates/updates.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/updates/updates.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/built-in/widgets.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/widgets.module.ts delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.html delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.scss delete mode 100644 web/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.ts delete mode 100644 web/projects/ui/src/app/apps/ui/ui.module.ts delete mode 100644 web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.html delete mode 100644 web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.module.ts delete mode 100644 web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.scss delete mode 100644 web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.ts delete mode 100644 web/projects/ui/src/app/common/interface-addresses/interface-addresses-item.component.html delete mode 100644 web/projects/ui/src/app/common/interface-addresses/interface-addresses.component.html delete mode 100644 web/projects/ui/src/app/common/interface-addresses/interface-addresses.component.scss delete mode 100644 web/projects/ui/src/app/common/interface-addresses/interface-addresses.component.ts delete mode 100644 web/projects/ui/src/app/common/interface-addresses/interface-addresses.module.ts diff --git a/web/projects/ui/src/app/app.component.html b/web/projects/ui/src/app/app.component.html index 0742fad74..f26e0cee2 100644 --- a/web/projects/ui/src/app/app.component.html +++ b/web/projects/ui/src/app/app.component.html @@ -53,7 +53,6 @@ (click)="onResize(drawer)" >
    - + Add clearnet to expose this interface to the public Internet. + + View instructions + +
    + + +
    + + +
    +
    + + + + `, + imports: [InterfaceComponent, NgIf, TuiButtonModule], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class InterfaceClearnetComponent { + private readonly formDialog = inject(FormDialogService) + private readonly loader = inject(LoadingService) + private readonly errorService = inject(ErrorService) + private readonly api = inject(ApiService) + private readonly dialogs = inject(TuiDialogService) + readonly interfaces = inject(InterfacesComponent) + + @Input({ required: true }) network!: NetworkInfo + + getClearnet(clearnet: DomainInfo): string { + return getClearnetAddress('https', clearnet) + } + + async add() { + const { domainInfo } = this.interfaces.addressInfo + const { domain = '', subdomain = '' } = domainInfo || {} + const options: Partial>> = { + label: 'Select Domain/Subdomain', + data: { + value: { domain, subdomain }, + spec: await getClearnetSpec(this.network), + buttons: [ + { + text: 'Manage domains', + link: 'portal/system/settings/domains', + }, + { + text: 'Save', + handler: async value => this.save(value), + }, + ], + }, + } + this.formDialog.open(FormComponent, options) + } + + remove() { + this.dialogs + .open(TUI_PROMPT, REMOVE) + .pipe(filter(Boolean)) + .subscribe(async () => { + const loader = this.loader.open('Removing...').subscribe() + + try { + if (this.interfaces.packageContext) { + await this.api.setInterfaceClearnetAddress({ + ...this.interfaces.packageContext, + domainInfo: null, + }) + } else { + await this.api.setServerClearnetAddress({ domainInfo: null }) + } + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + }) + } + + private async save(domainInfo: ClearnetForm): Promise { + const loader = this.loader.open('Saving...').subscribe() + + try { + if (this.interfaces.packageContext) { + await this.api.setInterfaceClearnetAddress({ + ...this.interfaces.packageContext, + domainInfo, + }) + } else { + await this.api.setServerClearnetAddress({ domainInfo }) + } + return true + } catch (e: any) { + this.errorService.handleError(e) + return false + } finally { + loader.unsubscribe() + } + } +} diff --git a/web/projects/ui/src/app/apps/portal/components/interfaces/interface-local.component.ts b/web/projects/ui/src/app/apps/portal/components/interfaces/interface-local.component.ts new file mode 100644 index 000000000..73a21a1d5 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/components/interfaces/interface-local.component.ts @@ -0,0 +1,59 @@ +import { CommonModule } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { TuiButtonModule } from '@taiga-ui/experimental' +import { InterfacesComponent } from './interfaces.component' +import { InterfaceComponent } from './interface.component' + +@Component({ + standalone: true, + selector: 'app-interface-local', + template: ` + + Local addresses can only be accessed while connected to the same Local + Area Network (LAN) as your server, either directly or using a VPN. + + View instructions + + + + Download Root CA + + + + + + + `, + imports: [InterfaceComponent, CommonModule, TuiButtonModule], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class InterfaceLocalComponent { + readonly interfaces = inject(InterfacesComponent) +} diff --git a/web/projects/ui/src/app/apps/portal/components/interfaces/interface-tor.component.ts b/web/projects/ui/src/app/apps/portal/components/interfaces/interface-tor.component.ts new file mode 100644 index 000000000..a15f93e2a --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/components/interfaces/interface-tor.component.ts @@ -0,0 +1,31 @@ +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { InterfaceComponent } from './interface.component' +import { InterfacesComponent } from './interfaces.component' + +@Component({ + standalone: true, + selector: 'app-interface-tor', + template: ` + + Use a Tor-enabled browser to access this address. Tor connections can be + slow and unreliable. + + View instructions + + + + `, + imports: [InterfaceComponent], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class InterfaceTorComponent { + readonly interfaces = inject(InterfacesComponent) +} diff --git a/web/projects/ui/src/app/apps/portal/components/interfaces/interface.component.ts b/web/projects/ui/src/app/apps/portal/components/interfaces/interface.component.ts new file mode 100644 index 000000000..33a2d5f62 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/components/interfaces/interface.component.ts @@ -0,0 +1,79 @@ +import { NgIf } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + inject, + Input, +} from '@angular/core' +import { WINDOW } from '@ng-web-apis/common' +import { CopyService } from '@start9labs/shared' +import { TuiDialogService } from '@taiga-ui/core' +import { + TuiButtonModule, + TuiCellModule, + TuiTitleModule, +} from '@taiga-ui/experimental' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' +import { QRComponent } from 'src/app/common/qr/qr.component' + +@Component({ + standalone: true, + selector: 'app-interface', + template: ` +
    +

    + {{ label }} + {{ hostname }} +

    + + + +
    + `, + imports: [NgIf, TuiCellModule, TuiTitleModule, TuiButtonModule], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class InterfaceComponent { + private readonly window = inject(WINDOW) + private readonly dialogs = inject(TuiDialogService) + readonly copyService = inject(CopyService) + + @Input({ required: true }) label = '' + @Input({ required: true }) hostname = '' + @Input({ required: true }) isUi = false + + launch(url: string): void { + this.window.open(url, '_blank', 'noreferrer') + } + + showQR(data: string) { + this.dialogs + .open(new PolymorpheusComponent(QRComponent), { + size: 'auto', + data, + }) + .subscribe() + } +} diff --git a/web/projects/ui/src/app/apps/portal/components/interfaces/interface.utils.ts b/web/projects/ui/src/app/apps/portal/components/interfaces/interface.utils.ts new file mode 100644 index 000000000..461b1a984 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/components/interfaces/interface.utils.ts @@ -0,0 +1,46 @@ +import { Config } from '@start9labs/start-sdk/lib/config/builder/config' +import { Value } from '@start9labs/start-sdk/lib/config/builder/value' +import { InputSpec } from '@start9labs/start-sdk/lib/config/configTypes' +import { TuiDialogOptions } from '@taiga-ui/core' +import { TuiPromptData } from '@taiga-ui/kit' +import { NetworkInfo } from 'src/app/services/patch-db/data-model' +import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' + +export const REMOVE: Partial> = { + label: 'Confirm', + size: 's', + data: { + content: 'Remove clearnet address?', + yes: 'Remove', + no: 'Cancel', + }, +} + +export function getClearnetSpec({ + domains, + start9ToSubdomain, +}: NetworkInfo): Promise { + const start9ToDomain = `${start9ToSubdomain?.value}.start9.to` + const base = start9ToSubdomain ? { [start9ToDomain]: start9ToDomain } : {} + + const values = domains.reduce((prev, curr) => { + return { + [curr.value]: curr.value, + ...prev, + } + }, base) + + return configBuilderToSpec( + Config.of({ + domain: Value.select({ + name: 'Domain', + required: { default: null }, + values, + }), + subdomain: Value.text({ + name: 'Subdomain', + required: false, + }), + }), + ) +} diff --git a/web/projects/ui/src/app/apps/portal/components/interfaces/interfaces.component.ts b/web/projects/ui/src/app/apps/portal/components/interfaces/interfaces.component.ts new file mode 100644 index 000000000..635f62486 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/components/interfaces/interfaces.component.ts @@ -0,0 +1,55 @@ +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + inject, + Input, +} from '@angular/core' +import { TuiCardModule, TuiSurfaceModule } from '@taiga-ui/experimental' +import { PatchDB } from 'patch-db-client' +import { InterfaceClearnetComponent } from 'src/app/apps/portal/components/interfaces/interface-clearnet.component' +import { InterfaceLocalComponent } from 'src/app/apps/portal/components/interfaces/interface-local.component' +import { InterfaceTorComponent } from 'src/app/apps/portal/components/interfaces/interface-tor.component' +import { AddressInfo, DataModel } from 'src/app/services/patch-db/data-model' + +@Component({ + standalone: true, + selector: 'app-interfaces', + template: ` +

    Clearnet

    + + +

    Tor

    + + +

    Local

    + + `, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + CommonModule, + InterfaceTorComponent, + InterfaceLocalComponent, + InterfaceClearnetComponent, + TuiCardModule, + TuiSurfaceModule, + ], +}) +export class InterfacesComponent { + readonly network$ = inject(PatchDB).watch$( + 'server-info', + 'network', + ) + + @Input() packageContext?: { + packageId: string + interfaceId: string + } + @Input({ required: true }) addressInfo!: AddressInfo + @Input({ required: true }) isUi!: boolean +} diff --git a/web/projects/ui/src/app/apps/portal/routes/service/routes/interface.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/routes/interface.component.ts index e49c0e01b..1212d4875 100644 --- a/web/projects/ui/src/app/apps/portal/routes/service/routes/interface.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/service/routes/interface.component.ts @@ -1,23 +1,23 @@ import { CommonModule } from '@angular/common' import { ChangeDetectionStrategy, Component, inject } from '@angular/core' -import { PatchDB } from 'patch-db-client' -import { InterfaceAddressesComponentModule } from 'src/app/common/interface-addresses/interface-addresses.module' -import { DataModel } from 'src/app/services/patch-db/data-model' import { ActivatedRoute } from '@angular/router' import { getPkgId } from '@start9labs/shared' +import { PatchDB } from 'patch-db-client' +import { InterfacesComponent } from 'src/app/apps/portal/components/interfaces/interfaces.component' +import { DataModel } from 'src/app/services/patch-db/data-model' @Component({ template: ` - + /> `, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, - imports: [CommonModule, InterfaceAddressesComponentModule], + imports: [CommonModule, InterfacesComponent], }) export class ServiceInterfaceRoute { private readonly route = inject(ActivatedRoute) diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/interfaces/interfaces.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/interfaces/interfaces.component.ts index e2595a4d1..53c4d4853 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/interfaces/interfaces.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/interfaces/interfaces.component.ts @@ -1,21 +1,21 @@ import { CommonModule } from '@angular/common' import { ChangeDetectionStrategy, Component, inject } from '@angular/core' import { PatchDB } from 'patch-db-client' -import { InterfaceAddressesComponentModule } from 'src/app/common/interface-addresses/interface-addresses.module' +import { InterfacesComponent } from 'src/app/apps/portal/components/interfaces/interfaces.component' import { DataModel } from 'src/app/services/patch-db/data-model' @Component({ template: ` - + /> `, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, - imports: [CommonModule, InterfaceAddressesComponentModule], + imports: [CommonModule, InterfacesComponent], }) export class SettingsInterfacesComponent { readonly ui$ = inject(PatchDB).watch$('server-info', 'ui') diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/wifi.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/wifi.component.ts index 68c8ef5ef..fad13a89e 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/wifi.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/wifi.component.ts @@ -24,18 +24,18 @@ import { TuiToggleModule, } from '@taiga-ui/experimental' import { PatchDB } from 'patch-db-client' -import { catchError, defer, merge, Observable, of, Subject, map } from 'rxjs' +import { catchError, defer, map, merge, Observable, of, Subject } from 'rxjs' import { FormComponent, FormContext, } from 'src/app/apps/portal/components/form.component' import { ApiService } from 'src/app/services/api/embassy-api.service' +import { FormDialogService } from 'src/app/services/form-dialog.service' import { DataModel } from 'src/app/services/patch-db/data-model' import { WifiInfoComponent } from './info.component' import { WifiTableComponent } from './table.component' import { parseWifi, WifiData, WiFiForm } from './utils' -import { wifiSpec } from '../../../../../../ui/pages/system/wifi/wifi.const' -import { FormDialogService } from 'src/app/services/form-dialog.service' +import { wifiSpec } from './wifi.const' @Component({ template: ` diff --git a/web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.const.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/wifi.const.ts similarity index 100% rename from web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.const.ts rename to web/projects/ui/src/app/apps/portal/routes/system/settings/routes/wifi/wifi.const.ts diff --git a/web/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.html b/web/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.html deleted file mode 100644 index e0dac9074..000000000 --- a/web/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.html +++ /dev/null @@ -1,32 +0,0 @@ - - - Completed: {{ timestamp | date : 'medium' }} - - - -

    System data

    -

    - {{ system.result }} -

    -
    - -
    - - -

    {{ pkg.key }}

    -

    - - {{ pkg.value.error ? 'Failed: ' + pkg.value.error : 'Succeeded' }} - -

    -
    - -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.ts b/web/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.ts deleted file mode 100644 index bbf0ceff4..000000000 --- a/web/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.component.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Component, Inject } from '@angular/core' -import { BackupReport } from 'src/app/services/api/api.types' -import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' -import { TuiDialogContext } from '@taiga-ui/core' - -@Component({ - selector: 'backup-report', - templateUrl: './backup-report.component.html', -}) -export class BackupReportComponent { - readonly system: { - result: string - icon: 'remove' | 'remove-circle-outline' | 'checkmark' - color: 'dark' | 'danger' | 'success' - } - - constructor( - @Inject(POLYMORPHEUS_CONTEXT) - private readonly context: TuiDialogContext< - void, - { report: BackupReport; timestamp: string } - >, - ) { - if (!this.report.server.attempted) { - this.system = { - result: 'Not Attempted', - icon: 'remove', - color: 'dark', - } - } else if (this.report.server.error) { - this.system = { - result: `Failed: ${this.report.server.error}`, - icon: 'remove-circle-outline', - color: 'danger', - } - } else { - this.system = { - result: 'Succeeded', - icon: 'checkmark', - color: 'success', - } - } - } - - get report(): BackupReport { - return this.context.data.report - } - - get timestamp(): string { - return this.context.data.timestamp - } -} diff --git a/web/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.module.ts b/web/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.module.ts deleted file mode 100644 index a41a63e53..000000000 --- a/web/projects/ui/src/app/apps/ui/modals/backup-report/backup-report.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { BackupReportComponent } from './backup-report.component' - -@NgModule({ - declarations: [BackupReportComponent], - imports: [CommonModule, IonicModule], - exports: [BackupReportComponent], -}) -export class BackupReportPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/modals/form/form.module.ts b/web/projects/ui/src/app/apps/ui/modals/form/form.module.ts deleted file mode 100644 index 4b7009137..000000000 --- a/web/projects/ui/src/app/apps/ui/modals/form/form.module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { ReactiveFormsModule } from '@angular/forms' -import { RouterModule } from '@angular/router' -import { TuiValueChangesModule } from '@taiga-ui/cdk' -import { TuiButtonModule } from '@taiga-ui/experimental' -import { TuiModeModule } from '@taiga-ui/core' -import { FormModule } from 'src/app/common/form/form.module' -import { FormPage } from './form.page' - -@NgModule({ - imports: [ - CommonModule, - ReactiveFormsModule, - RouterModule, - TuiValueChangesModule, - TuiButtonModule, - TuiModeModule, - FormModule, - ], - declarations: [FormPage], - exports: [FormPage], -}) -export class FormPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/modals/form/form.page.html b/web/projects/ui/src/app/apps/ui/modals/form/form.page.html deleted file mode 100644 index 3bd7567a9..000000000 --- a/web/projects/ui/src/app/apps/ui/modals/form/form.page.html +++ /dev/null @@ -1,32 +0,0 @@ -
    - - -
    diff --git a/web/projects/ui/src/app/apps/ui/modals/form/form.page.scss b/web/projects/ui/src/app/apps/ui/modals/form/form.page.scss deleted file mode 100644 index fc2a2b19d..000000000 --- a/web/projects/ui/src/app/apps/ui/modals/form/form.page.scss +++ /dev/null @@ -1,12 +0,0 @@ -footer { - position: sticky; - bottom: 0; - z-index: 10; - display: flex; - justify-content: flex-end; - padding: 1rem 0; - margin: 1rem 0 -1rem; - gap: 1rem; - background: var(--tui-elevation-01); - border-top: 1px solid var(--tui-base-02); -} diff --git a/web/projects/ui/src/app/apps/ui/modals/form/form.page.ts b/web/projects/ui/src/app/apps/ui/modals/form/form.page.ts deleted file mode 100644 index f7fcb1def..000000000 --- a/web/projects/ui/src/app/apps/ui/modals/form/form.page.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - inject, - Input, - OnInit, -} from '@angular/core' -import { InputSpec } from '@start9labs/start-sdk/lib/config/configTypes' -import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' -import { TuiDialogContext } from '@taiga-ui/core' -import { tuiMarkControlAsTouchedAndValidate } from '@taiga-ui/cdk' -import { TuiDialogFormService } from '@taiga-ui/kit' -import { FormGroup } from '@angular/forms' -import { compare, Operation } from 'fast-json-patch' -import { InvalidService } from 'src/app/common/form/invalid.service' -import { FormService } from 'src/app/services/form.service' - -export interface ActionButton { - text: string - handler?: (value: T) => Promise | void - link?: string -} - -export interface FormContext { - spec: InputSpec - buttons: ActionButton[] - value?: T - patch?: Operation[] -} - -@Component({ - selector: 'form-page', - templateUrl: './form.page.html', - styleUrls: ['./form.page.scss'], - providers: [InvalidService], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class FormPage> implements OnInit { - private readonly dialogFormService = inject(TuiDialogFormService) - private readonly formService = inject(FormService) - private readonly invalidService = inject(InvalidService) - private readonly context = inject>>( - POLYMORPHEUS_CONTEXT, - { optional: true }, - ) - - @Input() spec = this.context?.data.spec || {} - @Input() buttons = this.context?.data.buttons || [] - @Input() patch = this.context?.data.patch || [] - @Input() value?: T = this.context?.data.value - - form = new FormGroup({}) - - ngOnInit() { - this.dialogFormService.markAsPristine() - this.form = this.formService.createForm(this.spec, this.value) - this.process(this.patch) - } - - onReset() { - const { value } = this.form - - this.form = this.formService.createForm(this.spec) - this.process(compare(this.form.value, value)) - tuiMarkControlAsTouchedAndValidate(this.form) - this.markAsDirty() - } - - async onClick(handler: Required>['handler']) { - tuiMarkControlAsTouchedAndValidate(this.form) - this.invalidService.scrollIntoView() - - if (this.form.valid && (await handler(this.form.value as T))) { - this.close() - } - } - - markAsDirty() { - this.dialogFormService.markAsDirty() - } - - close() { - this.context?.$implicit.complete() - } - - private process(patch: Operation[]) { - patch.forEach(({ op, path }) => { - const control = this.form.get(path.substring(1).split('/')) - - if (!control || !control.parent) return - - if (op !== 'remove') { - control.markAsDirty() - control.markAsTouched() - } - - control.parent.markAsDirty() - control.parent.markAsTouched() - }) - } -} diff --git a/web/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html b/web/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html deleted file mode 100644 index daf261009..000000000 --- a/web/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.html +++ /dev/null @@ -1,40 +0,0 @@ -

    {{ options.message }}

    -

    {{ options.warning }}

    -
    - - {{ options.label }} - * - - -
    - - -
    -
    - - - - diff --git a/web/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.scss b/web/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.scss deleted file mode 100644 index d95d85925..000000000 --- a/web/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.scss +++ /dev/null @@ -1,13 +0,0 @@ -.warning { - color: var(--tui-warning-fill); -} - -.button { - pointer-events: auto; - margin-left: 0.25rem; -} - -.masked { - font-family: text-security-disc; - -webkit-text-security: disc; -} diff --git a/web/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.ts b/web/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.ts deleted file mode 100644 index 9842afe02..000000000 --- a/web/projects/ui/src/app/apps/ui/modals/prompt/prompt.component.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { ChangeDetectionStrategy, Component, Inject } from '@angular/core' -import { - POLYMORPHEUS_CONTEXT, - PolymorpheusComponent, -} from '@tinkoff/ng-polymorpheus' -import { TuiDialogContext } from '@taiga-ui/core' - -@Component({ - selector: 'prompt', - templateUrl: 'prompt.component.html', - styleUrls: ['prompt.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class PromptComponent { - masked = this.options.useMask - value = this.options.initialValue || '' - - constructor( - @Inject(POLYMORPHEUS_CONTEXT) - private readonly context: TuiDialogContext, - ) {} - - get options(): PromptOptions { - return this.context.data - } - - cancel() { - this.context.$implicit.complete() - } - - submit(value: string) { - if (value || !this.options.required) { - this.context.$implicit.next(value) - } - } -} - -export const PROMPT = new PolymorpheusComponent(PromptComponent) - -export interface PromptOptions { - message: string - label?: string - warning?: string - buttonText?: string - placeholder?: string - required?: boolean - useMask?: boolean - initialValue?: string | null -} diff --git a/web/projects/ui/src/app/apps/ui/modals/prompt/prompt.module.ts b/web/projects/ui/src/app/apps/ui/modals/prompt/prompt.module.ts deleted file mode 100644 index d872cb565..000000000 --- a/web/projects/ui/src/app/apps/ui/modals/prompt/prompt.module.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { CommonModule } from '@angular/common' -import { NgModule } from '@angular/core' -import { FormsModule } from '@angular/forms' -import { TuiTextfieldControllerModule } from '@taiga-ui/core' -import { TuiButtonModule } from '@taiga-ui/experimental' -import { TuiInputModule } from '@taiga-ui/kit' -import { TuiAutoFocusModule } from '@taiga-ui/cdk' -import { PromptComponent } from './prompt.component' - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - TuiInputModule, - TuiButtonModule, - TuiTextfieldControllerModule, - TuiAutoFocusModule, - ], - declarations: [PromptComponent], - exports: [PromptComponent], -}) -export class PromptModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/backups.module.ts b/web/projects/ui/src/app/apps/ui/pages/backups/backups.module.ts deleted file mode 100644 index bcb252335..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/backups.module.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { NgModule } from '@angular/core' -import { Routes, RouterModule } from '@angular/router' - -const routes: Routes = [ - { - path: '', - loadChildren: () => - import('./pages/backups/backups.module').then(m => m.BackupsPageModule), - }, - { - path: 'jobs', - loadChildren: () => - import('./pages/backup-jobs/backup-jobs.module').then( - m => m.BackupJobsPageModule, - ), - }, - { - path: 'targets', - loadChildren: () => - import('./pages/backup-targets/backup-targets.module').then( - m => m.BackupTargetsPageModule, - ), - }, - { - path: 'history', - loadChildren: () => - import('./pages/backup-history/backup-history.module').then( - m => m.BackupHistoryPageModule, - ), - }, -] - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class BackupsModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/components/backing-up/backing-up.component.html b/web/projects/ui/src/app/apps/ui/pages/backups/components/backing-up/backing-up.component.html deleted file mode 100644 index 153de04c0..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/components/backing-up/backing-up.component.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - Backup Progress - - - - - - - - - - - - - - {{ pkg.value.manifest.title }} - - - -   - Complete - - - - - - - - Backing up - - - - Waiting... - - - - - - - - - - diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/components/backing-up/backing-up.component.ts b/web/projects/ui/src/app/apps/ui/pages/backups/components/backing-up/backing-up.component.ts deleted file mode 100644 index 4e297019e..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/components/backing-up/backing-up.component.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - Pipe, - PipeTransform, -} from '@angular/core' -import { PatchDB } from 'patch-db-client' -import { take, Observable } from 'rxjs' -import { - DataModel, - PackageMainStatus, -} from 'src/app/services/patch-db/data-model' - -@Component({ - selector: 'backing-up', - templateUrl: './backing-up.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class BackingUpComponent { - readonly pkgs$ = this.patch.watch$('package-data').pipe(take(1)) - readonly backupProgress$ = this.patch.watch$( - 'server-info', - 'status-info', - 'current-backup', - 'backup-progress', - ) - - constructor(private readonly patch: PatchDB) {} -} - -@Pipe({ - name: 'pkgMainStatus', -}) -export class PkgMainStatusPipe implements PipeTransform { - transform(pkgId: string): Observable { - return this.patch.watch$( - 'package-data', - pkgId, - 'installed', - 'status', - 'main', - 'status', - ) - } - - constructor(private readonly patch: PatchDB) {} -} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/directives/backup-create.directive.ts b/web/projects/ui/src/app/apps/ui/pages/backups/directives/backup-create.directive.ts deleted file mode 100644 index 91769e709..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/directives/backup-create.directive.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Directive, HostListener } from '@angular/core' -import { LoadingService } from '@start9labs/shared' -import { TuiDialogService } from '@taiga-ui/core' -import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' -import { BackupTarget } from 'src/app/services/api/api.types' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { TargetSelectPage } from '../modals/target-select/target-select.page' -import { BackupSelectPage } from '../modals/backup-select/backup-select.page' - -@Directive({ - selector: '[backupCreate]', -}) -export class BackupCreateDirective { - constructor( - private readonly loader: LoadingService, - private readonly dialogs: TuiDialogService, - private readonly embassyApi: ApiService, - ) {} - - @HostListener('click') - onClick() { - this.presentModalTarget() - } - - presentModalTarget() { - this.dialogs - .open(new PolymorpheusComponent(TargetSelectPage), { - label: 'Select Backup Target', - data: { type: 'create' }, - }) - .subscribe(({ id }) => { - this.presentModalSelect(id) - }) - } - - private presentModalSelect(targetId: string) { - this.dialogs - .open(new PolymorpheusComponent(BackupSelectPage), { - label: 'Select Services to Back Up', - data: { btnText: 'Create Backup' }, - }) - .subscribe(pkgIds => { - this.createBackup(targetId, pkgIds) - }) - } - - private async createBackup( - targetId: string, - pkgIds: string[], - ): Promise { - const loader = this.loader.open('Beginning backup...').subscribe() - - await this.embassyApi - .createBackup({ - 'target-id': targetId, - 'package-ids': pkgIds, - }) - .finally(() => loader.unsubscribe()) - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/directives/backup-restore.directive.ts b/web/projects/ui/src/app/apps/ui/pages/backups/directives/backup-restore.directive.ts deleted file mode 100644 index b762c6fe0..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/directives/backup-restore.directive.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { Directive, HostListener } from '@angular/core' -import { NavController } from '@ionic/angular' -import { TuiDialogService } from '@taiga-ui/core' -import { ErrorService, LoadingService } from '@start9labs/shared' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { BackupInfo, BackupTarget } from 'src/app/services/api/api.types' -import * as argon2 from '@start9labs/argon2' -import { TargetSelectPage } from '../modals/target-select/target-select.page' -import { - RecoverData, - RecoverSelectPage, -} from '../modals/recover-select/recover-select.page' -import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' -import { - PROMPT, - PromptOptions, -} from 'src/app/apps/ui/modals/prompt/prompt.component' -import { - catchError, - EMPTY, - exhaustMap, - map, - Observable, - of, - switchMap, - take, - tap, -} from 'rxjs' - -@Directive({ - selector: '[backupRestore]', -}) -export class BackupRestoreDirective { - constructor( - private readonly errorService: ErrorService, - private readonly dialogs: TuiDialogService, - private readonly navCtrl: NavController, - private readonly embassyApi: ApiService, - private readonly loader: LoadingService, - ) {} - - @HostListener('click') onClick() { - this.presentModalTarget() - } - - async presentModalTarget() { - this.dialogs - .open(new PolymorpheusComponent(TargetSelectPage), { - label: 'Select Backup Source', - data: { type: 'restore' }, - }) - .subscribe(data => { - this.presentModalPassword(data) - }) - } - - presentModalPassword(target: BackupTarget) { - const data: PromptOptions = { - message: - 'Enter the master password that was used to encrypt this backup. On the next screen, you will select the individual services you want to restore.', - label: 'Master Password', - placeholder: 'Enter master password', - useMask: true, - } - - this.dialogs - .open(PROMPT, { - label: 'Password Required', - data, - }) - .pipe( - exhaustMap(password => - this.getRecoverData( - target.id, - password, - target['embassy-os']?.['password-hash'] || '', - ), - ), - take(1), - switchMap(data => this.presentModalSelect(data)), - ) - .subscribe(() => { - this.navCtrl.navigateRoot('/services') - }) - } - - private getRecoverData( - targetId: string, - password: string, - hash: string, - ): Observable { - return of(password).pipe( - tap(() => argon2.verify(hash, password)), - switchMap(() => this.getBackupInfo(targetId, password)), - catchError(e => { - this.errorService.handleError(e) - - return EMPTY - }), - map(backupInfo => ({ targetId, password, backupInfo })), - ) - } - - private async getBackupInfo( - targetId: string, - password: string, - ): Promise { - const loader = this.loader.open('Decrypting drive...').subscribe() - - return this.embassyApi - .getBackupInfo({ - 'target-id': targetId, - password, - }) - .finally(() => loader.unsubscribe()) - } - - private presentModalSelect(data: RecoverData): Observable { - return this.dialogs.open(new PolymorpheusComponent(RecoverSelectPage), { - label: 'Select Services to Restore', - data, - }) - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.module.ts b/web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.module.ts deleted file mode 100644 index 4d5d6dbcd..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { FormsModule } from '@angular/forms' -import { TuiGroupModule } from '@taiga-ui/core' -import { TuiButtonModule } from '@taiga-ui/experimental' -import { TuiCheckboxBlockModule } from '@taiga-ui/kit' -import { BackupSelectPage } from './backup-select.page' - -@NgModule({ - declarations: [BackupSelectPage], - imports: [ - CommonModule, - FormsModule, - TuiButtonModule, - TuiGroupModule, - TuiCheckboxBlockModule, - ], - exports: [BackupSelectPage], -}) -export class BackupSelectPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.html b/web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.html deleted file mode 100644 index f79a9d0f8..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.html +++ /dev/null @@ -1,31 +0,0 @@ -
    - -
    - - {{ pkg.title }} -
    -
    -
    - - -

    No services installed!

    -
    - -
    - - -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.scss b/web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.scss deleted file mode 100644 index 89ba0a7aa..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.scss +++ /dev/null @@ -1,25 +0,0 @@ -.center { - display: flex; - align-items: center; - justify-content: center; -} - -.pkgs { - width: 100%; - margin-top: 24px; -} - -.label { - display: flex; - align-items: center; - gap: 16px; -} - -.icon { - width: 40px; - height: 40px; -} - -ion-item { - --background: transparent; -} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.ts b/web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.ts deleted file mode 100644 index f21a5ca7f..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/modals/backup-select/backup-select.page.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { Component, Inject, Input } from '@angular/core' -import { PatchDB } from 'patch-db-client' -import { firstValueFrom, map } from 'rxjs' -import { DataModel, PackageState } from 'src/app/services/patch-db/data-model' -import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' -import { TuiDialogContext } from '@taiga-ui/core' - -@Component({ - selector: 'backup-select', - templateUrl: './backup-select.page.html', - styleUrls: ['./backup-select.page.scss'], -}) -export class BackupSelectPage { - @Input() selectedIds: string[] = [] - - hasSelection = false - pkgs: { - id: string - title: string - icon: string - disabled: boolean - checked: boolean - }[] = [] - - constructor( - @Inject(POLYMORPHEUS_CONTEXT) - private readonly context: TuiDialogContext, - private readonly patch: PatchDB, - ) {} - - get btnText(): string { - return this.context.data.btnText - } - - async ngOnInit() { - this.pkgs = await firstValueFrom( - this.patch.watch$('package-data').pipe( - map(pkgs => { - return Object.values(pkgs) - .map(pkg => { - const { id, title } = pkg.manifest - return { - id, - title, - icon: pkg.icon, - disabled: pkg.state !== PackageState.Installed, - checked: this.selectedIds.includes(id), - } - }) - .sort((a, b) => - b.title.toLowerCase() > a.title.toLowerCase() ? -1 : 1, - ) - }), - ), - ) - } - - done() { - this.context.completeWith(this.pkgs.filter(p => p.checked).map(p => p.id)) - } - - handleChange() { - this.hasSelection = this.pkgs.some(p => p.checked) - } - - toggleSelectAll() { - this.pkgs.forEach(pkg => (pkg.checked = !this.hasSelection)) - this.hasSelection = !this.hasSelection - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.module.ts b/web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.module.ts deleted file mode 100644 index ab1eabf6b..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.module.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { FormsModule } from '@angular/forms' -import { TuiGroupModule } from '@taiga-ui/core' -import { TuiButtonModule } from '@taiga-ui/experimental' -import { TuiCheckboxBlockModule } from '@taiga-ui/kit' -import { RecoverSelectPage } from './recover-select.page' -import { ToOptionsPipe } from './to-options.pipe' - -@NgModule({ - declarations: [RecoverSelectPage, ToOptionsPipe], - imports: [ - CommonModule, - FormsModule, - TuiButtonModule, - TuiGroupModule, - TuiCheckboxBlockModule, - ], - exports: [RecoverSelectPage], -}) -export class RecoverSelectPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.html b/web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.html deleted file mode 100644 index 8fd2e77ce..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.html +++ /dev/null @@ -1,36 +0,0 @@ - -
    - -
    - {{ option.title }} -
    Version {{ option.version }}
    -
    Backup made: {{ option.timestamp | date : 'medium' }}
    -
    - Ready to restore -
    -
    - Unavailable. {{ option.title }} is already installed. -
    -
    - Unavailable. Backup was made on a newer version of StartOS. -
    -
    -
    -
    - - -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.scss b/web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.scss deleted file mode 100644 index 4897866d3..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.scss +++ /dev/null @@ -1,31 +0,0 @@ -.items { - width: 100%; - margin: 12px 0 24px; -} - -.label { - padding: 8px 0; - font-size: 14px; -} - -.title { - font-size: 16px; - margin-bottom: 4px; - display: block; -} - -.success { - color: var(--tui-success-fill); -} - -.warning { - color: var(--tui-warning-fill); -} - -.danger { - color: var(--tui-error-fill); -} - -.button { - float: right; -} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.ts b/web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.ts deleted file mode 100644 index 5052d9eb9..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/recover-select.page.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Component, Inject } from '@angular/core' -import { ErrorService, LoadingService } from '@start9labs/shared' -import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' -import { TuiDialogContext } from '@taiga-ui/core' -import { BackupInfo } from 'src/app/services/api/api.types' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { PatchDB } from 'patch-db-client' -import { AppRecoverOption } from './to-options.pipe' -import { DataModel } from 'src/app/services/patch-db/data-model' -import { take } from 'rxjs' - -export interface RecoverData { - targetId: string - backupInfo: BackupInfo - password: string -} - -@Component({ - selector: 'recover-select', - templateUrl: './recover-select.page.html', - styleUrls: ['./recover-select.page.scss'], -}) -export class RecoverSelectPage { - readonly packageData$ = this.patch.watch$('package-data').pipe(take(1)) - - hasSelection = false - - constructor( - @Inject(POLYMORPHEUS_CONTEXT) - private readonly context: TuiDialogContext, - private readonly loader: LoadingService, - private readonly errorService: ErrorService, - private readonly embassyApi: ApiService, - private readonly patch: PatchDB, - ) {} - - get backupInfo(): BackupInfo { - return this.context.data.backupInfo - } - - handleChange(options: AppRecoverOption[]) { - this.hasSelection = options.some(o => o.checked) - } - - async restore(options: AppRecoverOption[]): Promise { - const ids = options.filter(({ checked }) => !!checked).map(({ id }) => id) - const loader = this.loader.open('Initializing...').subscribe() - - try { - await this.embassyApi.restorePackages({ - ids, - 'target-id': this.context.data.targetId, - password: this.context.data.password, - }) - - this.context.completeWith(undefined) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/to-options.pipe.ts b/web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/to-options.pipe.ts deleted file mode 100644 index 59a5644bb..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/modals/recover-select/to-options.pipe.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core' -import { Emver } from '@start9labs/shared' -import { map, Observable } from 'rxjs' -import { PackageBackupInfo } from 'src/app/services/api/api.types' -import { ConfigService } from 'src/app/services/config.service' -import { PackageDataEntry } from 'src/app/services/patch-db/data-model' - -export interface AppRecoverOption extends PackageBackupInfo { - id: string - checked: boolean - installed: boolean - 'newer-eos': boolean -} - -@Pipe({ - name: 'toOptions', -}) -export class ToOptionsPipe implements PipeTransform { - constructor( - private readonly config: ConfigService, - private readonly emver: Emver, - ) {} - - transform( - packageData$: Observable>, - packageBackups: Record = {}, - ): Observable { - return packageData$.pipe( - map(packageData => - Object.keys(packageBackups) - .map(id => ({ - ...packageBackups[id], - id, - installed: !!packageData[id], - checked: false, - 'newer-eos': this.compare(packageBackups[id]['os-version']), - })) - .sort((a, b) => - b.title.toLowerCase() > a.title.toLowerCase() ? -1 : 1, - ), - ), - ) - } - - private compare(version: string): boolean { - // checks to see if backup was made on a newer version of eOS - return this.emver.compare(version, this.config.version) === 1 - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.module.ts b/web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.module.ts deleted file mode 100644 index 6ea234db5..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { TuiButtonModule } from '@taiga-ui/experimental' -import { TargetSelectPage, TargetStatusComponent } from './target-select.page' -import { TargetPipesModule } from '../../pipes/target-pipes.module' -import { TextSpinnerComponentModule } from '@start9labs/shared' - -@NgModule({ - declarations: [TargetSelectPage, TargetStatusComponent], - imports: [ - CommonModule, - IonicModule, - TargetPipesModule, - TextSpinnerComponentModule, - TuiButtonModule, - ], - exports: [TargetSelectPage], -}) -export class TargetSelectPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.html b/web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.html deleted file mode 100644 index 8aa08a50a..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - Saved Targets - - - - -

    {{ displayInfo.name }}

    - -

    {{ displayInfo.description }}

    -

    {{ displayInfo.path }}

    -
    -
    -
    - -
    -

    No saved targets

    - -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.scss b/web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.scss deleted file mode 100644 index bfffad405..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.scss +++ /dev/null @@ -1,3 +0,0 @@ -ion-item { - --background: transparent; -} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.ts b/web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.ts deleted file mode 100644 index 8a2ca1733..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-select.page.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - Inject, - Input, -} from '@angular/core' -import { NavController } from '@ionic/angular' -import { BehaviorSubject } from 'rxjs' -import { BackupTarget } from 'src/app/services/api/api.types' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { ErrorService } from '@start9labs/shared' -import { BackupType } from '../../pages/backup-targets/backup-targets.page' -import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' -import { TuiDialogContext } from '@taiga-ui/core' - -@Component({ - selector: 'target-select', - templateUrl: './target-select.page.html', - styleUrls: ['./target-select.page.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class TargetSelectPage { - targets: BackupTarget[] = [] - - loading$ = new BehaviorSubject(true) - - constructor( - @Inject(POLYMORPHEUS_CONTEXT) - private readonly context: TuiDialogContext< - BackupTarget, - { type: BackupType } - >, - private readonly navCtrl: NavController, - private readonly api: ApiService, - private readonly errorService: ErrorService, - ) {} - - get type(): BackupType { - return this.context.data.type - } - - async ngOnInit() { - await this.getTargets() - } - - select(target: BackupTarget): void { - this.context.completeWith(target) - } - - goToTargets() { - this.context.$implicit.complete() - this.navCtrl.navigateForward(`/backups/targets`) - } - - async refresh() { - await this.getTargets() - } - - private async getTargets(): Promise { - this.loading$.next(true) - try { - this.targets = (await this.api.getBackupTargets({})).saved - } catch (e: any) { - this.errorService.handleError(e) - } finally { - this.loading$.next(false) - } - } -} - -@Component({ - selector: 'target-status', - templateUrl: './target-status.component.html', - styleUrls: ['./target-select.page.scss'], -}) -export class TargetStatusComponent { - @Input({ required: true }) type!: BackupType - @Input({ required: true }) target!: BackupTarget -} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-status.component.html b/web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-status.component.html deleted file mode 100644 index fb6942e86..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/modals/target-select/target-status.component.html +++ /dev/null @@ -1,30 +0,0 @@ -
    -

    - - Unable to connect -

    - - -

    - - {{ - (target | hasValidBackup) - ? 'Available, contains existing backup' - : 'Available for fresh backup' - }} -

    - - -

    - - Embassy backup detected -

    - -

    - - No Embassy backup -

    -
    -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.module.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.module.ts deleted file mode 100644 index f620cd13e..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.module.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { NgModule } from '@angular/core' -import { RouterModule, Routes } from '@angular/router' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { - BackupHistoryPage, - DurationPipe, - HasErrorPipe, -} from './backup-history.page' -import { TargetPipesModule } from '../../pipes/target-pipes.module' -import { BackupReportPageModule } from 'src/app/apps/ui/modals/backup-report/backup-report.module' - -const routes: Routes = [ - { - path: '', - component: BackupHistoryPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - TargetPipesModule, - BackupReportPageModule, - RouterModule.forChild(routes), - ], - declarations: [BackupHistoryPage, DurationPipe, HasErrorPipe], - exports: [DurationPipe, HasErrorPipe], -}) -export class BackupHistoryPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.html b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.html deleted file mode 100644 index 2e4801e5e..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - Backup History - - - - - - Past Events - - Delete Selected - - -
    - - - -
    - -
    - Started At -
    - Duration - Result - Job - Target -
    - - - - - - - - - - - - - -
    - -
    - {{ run['started-at'] | date : 'medium' }} -
    - - {{ run['started-at']| duration : run['completed-at'] }} Minutes - - - - - - - Report - - {{ run.job.name || 'No job' }} - - -   {{ run.job.target.name }} - -
    -
    -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.scss b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.scss deleted file mode 100644 index 05b3f2393..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.scss +++ /dev/null @@ -1,3 +0,0 @@ -.highlighted { - background-color: var(--ion-color-medium-shade); -} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.ts deleted file mode 100644 index 0cec0874d..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-history/backup-history.page.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { Component } from '@angular/core' -import { Pipe, PipeTransform } from '@angular/core' -import { ErrorService, LoadingService } from '@start9labs/shared' -import { TuiDialogService } from '@taiga-ui/core' -import { BackupReport, BackupRun } from 'src/app/services/api/api.types' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { BehaviorSubject } from 'rxjs' -import { BackupReportComponent } from '../../../../modals/backup-report/backup-report.component' -import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' - -@Component({ - selector: 'backup-history', - templateUrl: './backup-history.page.html', - styleUrls: ['./backup-history.page.scss'], -}) -export class BackupHistoryPage { - selected: Record = {} - runs: BackupRun[] = [] - loading$ = new BehaviorSubject(true) - - constructor( - private readonly dialogs: TuiDialogService, - private readonly loader: LoadingService, - private readonly errorService: ErrorService, - private readonly api: ApiService, - ) {} - - async ngOnInit() { - try { - this.runs = await this.api.getBackupRuns({}) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - this.loading$.next(false) - } - } - - get empty() { - return this.count === 0 - } - - get count() { - return Object.keys(this.selected).length - } - - presentModalReport(run: BackupRun) { - this.dialogs - .open(new PolymorpheusComponent(BackupReportComponent), { - label: 'Backup Report', - data: { - report: run.report, - timestamp: run['completed-at'], - }, - }) - .subscribe() - } - - async toggleChecked(id: string) { - if (this.selected[id]) { - delete this.selected[id] - } else { - this.selected[id] = true - } - } - - async toggleAll(runs: BackupRun[]) { - if (this.empty) { - runs.forEach(r => (this.selected[r.id] = true)) - } else { - this.selected = {} - } - } - - async deleteSelected(): Promise { - const ids = Object.keys(this.selected) - const loader = this.loader.open('Deleting...').subscribe() - - try { - await this.api.deleteBackupRuns({ ids }) - this.selected = {} - this.runs = this.runs.filter(r => !ids.includes(r.id)) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } -} - -@Pipe({ - name: 'duration', -}) -export class DurationPipe implements PipeTransform { - transform(start: string, finish: string): number { - const diffMs = new Date(finish).valueOf() - new Date(start).valueOf() - return diffMs / 100 - } -} - -@Pipe({ - name: 'hasError', -}) -export class HasErrorPipe implements PipeTransform { - transform(report: BackupReport): boolean { - const osErr = !!report.server.error - const pkgErr = !!Object.values(report.packages).find(pkg => pkg.error) - return osErr || pkgErr - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts deleted file mode 100644 index f5c833049..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.module.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { CommonModule } from '@angular/common' -import { NgModule } from '@angular/core' -import { FormsModule } from '@angular/forms' -import { RouterModule, Routes } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { TuiNotificationModule, TuiWrapperModule } from '@taiga-ui/core' -import { TuiButtonModule } from '@taiga-ui/experimental' -import { TuiInputModule, TuiToggleModule } from '@taiga-ui/kit' -import { BackupJobsPage } from './backup-jobs.page' -import { EditJobComponent } from './edit-job/edit-job.component' -import { ToHumanCronPipe } from './pipes' -import { TargetSelectPageModule } from '../../modals/target-select/target-select.module' -import { TargetPipesModule } from '../../pipes/target-pipes.module' - -const routes: Routes = [ - { - path: '', - component: BackupJobsPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - FormsModule, - TargetSelectPageModule, - TargetPipesModule, - TuiNotificationModule, - TuiButtonModule, - TuiInputModule, - TuiToggleModule, - TuiWrapperModule, - ], - declarations: [BackupJobsPage, ToHumanCronPipe, EditJobComponent], - exports: [ToHumanCronPipe], -}) -export class BackupJobsPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.html b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.html deleted file mode 100644 index 871fc55eb..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Backup Jobs - - - - -
    - - Scheduling automatic backups is an excellent way to ensure your Embassy - data is safely backed up. Your Embassy will issue a notification whenever - one of your scheduled backups succeeds or fails. - View instructions - -
    - - - - Saved Jobs - - - Create New Job - - - -
    - - - Name - Target - Packages - Schedule - - - - - - - - - - - - - - {{ job.name }} - - -   {{ job.target.name }} - - {{ job['package-ids'].length }} Packages - {{ (job.cron | toHumanCron).message }} - - - - - - - - - - - - - -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.scss b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.ts deleted file mode 100644 index 2399239c0..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/backup-jobs.page.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { Component } from '@angular/core' -import { TuiDialogService } from '@taiga-ui/core' -import { TUI_PROMPT } from '@taiga-ui/kit' -import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' -import { BehaviorSubject, filter } from 'rxjs' -import { BackupJob } from 'src/app/services/api/api.types' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { ErrorService, LoadingService } from '@start9labs/shared' -import { EditJobComponent } from './edit-job/edit-job.component' -import { BackupJobBuilder } from './edit-job/job-builder' - -@Component({ - selector: 'backup-jobs', - templateUrl: './backup-jobs.page.html', - styleUrls: ['./backup-jobs.page.scss'], -}) -export class BackupJobsPage { - readonly docsUrl = - 'https://docs.start9.com/latest/user-manual/backups/backup-jobs' - - jobs: BackupJob[] = [] - - loading$ = new BehaviorSubject(true) - - constructor( - private readonly dialogs: TuiDialogService, - private readonly loader: LoadingService, - private readonly errorService: ErrorService, - private readonly api: ApiService, - ) {} - - async ngOnInit() { - try { - this.jobs = await this.api.getBackupJobs({}) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - this.loading$.next(false) - } - } - - presentModalCreate() { - this.dialogs - .open(new PolymorpheusComponent(EditJobComponent), { - label: 'Create New Job', - data: new BackupJobBuilder({ - name: `Backup Job ${this.jobs.length + 1}`, - }), - }) - .subscribe(job => this.jobs.push(job)) - } - - presentModalUpdate(data: BackupJob) { - this.dialogs - .open(new PolymorpheusComponent(EditJobComponent), { - label: 'Edit Job', - data: new BackupJobBuilder(data), - }) - .subscribe(job => { - data.name = job.name - data.target = job.target - data.cron = job.cron - data['package-ids'] = job['package-ids'] - }) - } - - presentAlertDelete(id: string, index: number) { - this.dialogs - .open(TUI_PROMPT, { - label: 'Confirm', - size: 's', - data: { - content: 'Delete backup job? This action cannot be undone.', - yes: 'Delete', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => { - this.delete(id, index) - }) - } - - private async delete(id: string, i: number): Promise { - const loader = this.loader.open('Deleting...').subscribe() - - try { - await this.api.removeBackupTarget({ id }) - this.jobs.splice(i, 1) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.html b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.html deleted file mode 100644 index 1e599bfb3..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.html +++ /dev/null @@ -1,47 +0,0 @@ -
    - - Job Name - - - - - - - - - Schedule - - - -

    - {{ human.message }} -

    - -
    - Also Execute Now - -
    - -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.scss b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.scss deleted file mode 100644 index 083cd95d8..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.scss +++ /dev/null @@ -1,34 +0,0 @@ -.button { - width: 100%; - height: var(--tui-height-l); - display: flex; - align-items: center; - justify-content: space-between; - margin: 1rem 0; - padding: 0 1rem; - border-radius: var(--tui-radius-m); - font: var(--tui-font-text-l); - font-weight: bold; -} - -.value { - font: var(--tui-font-text-m); - color: var(--tui-positive); -} - -.toggle { - height: var(--tui-height-l); - display: flex; - align-items: center; - justify-content: space-between; - padding: 0 1rem; - box-shadow: inset 0 0 0 1px var(--tui-base-03); - font: var(--tui-font-text-l); - font-weight: bold; - border-radius: var(--tui-radius-m); -} - -.submit { - float: right; - margin-top: 1rem; -} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.ts deleted file mode 100644 index 1553dd541..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/edit-job.component.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { Component, Inject } from '@angular/core' -import { TuiDialogContext, TuiDialogService } from '@taiga-ui/core' -import { - POLYMORPHEUS_CONTEXT, - PolymorpheusComponent, -} from '@tinkoff/ng-polymorpheus' -import { ErrorService, LoadingService } from '@start9labs/shared' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { BackupJob, BackupTarget } from 'src/app/services/api/api.types' -import { TargetSelectPage } from '../../../modals/target-select/target-select.page' -import { BackupSelectPage } from '../../../modals/backup-select/backup-select.page' -import { BackupJobBuilder } from './job-builder' - -@Component({ - selector: 'edit-job', - templateUrl: './edit-job.component.html', - styleUrls: ['./edit-job.component.scss'], -}) -export class EditJobComponent { - constructor( - @Inject(POLYMORPHEUS_CONTEXT) - private readonly context: TuiDialogContext, - private readonly dialogs: TuiDialogService, - private readonly loader: LoadingService, - private readonly api: ApiService, - private readonly errorService: ErrorService, - ) {} - - get job() { - return this.context.data - } - - async save() { - const loader = this.loader.open('Saving Job').subscribe() - - try { - const { id } = this.job.job - let job: BackupJob - - if (id) { - job = await this.api.updateBackupJob(this.job.buildUpdate(id)) - } else { - job = await this.api.createBackupJob(this.job.buildCreate()) - } - - this.context.completeWith(job) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } - - presentModalTarget() { - this.dialogs - .open(new PolymorpheusComponent(TargetSelectPage), { - label: 'Select Backup Target', - data: { type: 'create' }, - }) - .subscribe(target => { - this.job.target = target - }) - } - - presentModalPackages() { - this.dialogs - .open(new PolymorpheusComponent(BackupSelectPage), { - label: 'Select Services to Back Up', - data: { btnText: 'Done' }, - }) - .subscribe(id => { - this.job['package-ids'] = id - }) - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/job-builder.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/job-builder.ts deleted file mode 100644 index b84e4d369..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/edit-job/job-builder.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { BackupJob, BackupTarget, RR } from 'src/app/services/api/api.types' - -export class BackupJobBuilder { - name: string - target: BackupTarget - cron: string - 'package-ids': string[] - now = false - - constructor(readonly job: Partial) { - const { name, target, cron } = job - this.name = name || '' - this.target = target || ({} as BackupTarget) - this.cron = cron || '0 2 * * *' - this['package-ids'] = job['package-ids'] || [] - } - - buildCreate(): RR.CreateBackupJobReq { - const { name, target, cron, now } = this - - return { - name, - 'target-id': target.id, - cron, - 'package-ids': this['package-ids'], - now, - } - } - - buildUpdate(id: string): RR.UpdateBackupJobReq { - const { name, target, cron } = this - - return { - id, - name, - 'target-id': target.id, - cron, - 'package-ids': this['package-ids'], - } - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/pipes.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/pipes.ts deleted file mode 100644 index 0e756aa9a..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-jobs/pipes.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core' -import cronstrue from 'cronstrue' - -@Pipe({ - name: 'toHumanCron', -}) -export class ToHumanCronPipe implements PipeTransform { - transform(cron: string): { message: string; color: string } { - const toReturn = { - message: '', - color: 'var(--tui-positive)', - } - - try { - const human = cronstrue.toString(cron, { - verbose: true, - throwExceptionOnParseError: true, - }) - const zero = Number(cron[0]) - const one = Number(cron[1]) - if (Number.isNaN(zero) || Number.isNaN(one)) { - throw new Error( - `${human}. Cannot run cron jobs more than once per hour`, - ) - } - toReturn.message = human - } catch (e) { - toReturn.message = e as string - toReturn.color = 'var(--tui-negative)' - } - - return toReturn - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.module.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.module.ts deleted file mode 100644 index fb507215d..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { NgModule } from '@angular/core' -import { RouterModule, Routes } from '@angular/router' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { UnitConversionPipesModule } from '@start9labs/shared' -import { SkeletonListComponentModule } from 'src/app/common/skeleton-list/skeleton-list.component.module' -import { FormPageModule } from 'src/app/apps/ui/modals/form/form.module' -import { BackupTargetsPage } from './backup-targets.page' -import { TuiNotificationModule } from '@taiga-ui/core' - -const routes: Routes = [ - { - path: '', - component: BackupTargetsPage, - }, -] - -@NgModule({ - declarations: [BackupTargetsPage], - imports: [ - CommonModule, - IonicModule, - SkeletonListComponentModule, - UnitConversionPipesModule, - FormPageModule, - RouterModule.forChild(routes), - TuiNotificationModule, - ], -}) -export class BackupTargetsPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.html b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.html deleted file mode 100644 index 655bf28e6..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - Backup Targets - - - - -
    - - Backup targets are physical or virtual locations for storing encrypted - backups. They can be physical drives plugged into your server, shared - folders on your Local Area Network (LAN), or third party clouds such as - Dropbox or Google Drive. - View instructions - -
    - - - - - Unknown Physical Drives - - - Refresh - - - -
    - - - Make/Model - Label - Capacity - Used - - - - - - - - - - - - - {{ disk.vendor || 'unknown make' }}, {{ disk.model || 'unknown - model' }} - - {{ disk.label }} - {{ disk.capacity | convertBytes }} - - {{ disk.used ? (disk.used | convertBytes) : 'unknown' }} - - - - - Save - - - - -

    - To add a new physical backup target, connect the drive and click - refresh. -

    -
    -
    -
    - - - - Saved Targets - - - Add Target - - - -
    - - - Name - Type - Available - Path - - - - - - - - - - - - - - {{ target.name }} - - -   {{ target.type | titlecase }} - - - - - {{ target.path }} - - - - - - - - - - - - -

    No saved backup targets.

    -
    -
    -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.scss b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.ts deleted file mode 100644 index fb5e193a3..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backup-targets/backup-targets.page.ts +++ /dev/null @@ -1,240 +0,0 @@ -import { Component } from '@angular/core' -import { - BackupTarget, - BackupTargetType, - RR, - UnknownDisk, -} from 'src/app/services/api/api.types' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { - cifsSpec, - diskBackupTargetSpec, - dropboxSpec, - googleDriveSpec, - remoteBackupTargetSpec, -} from '../../types/target-types' -import { BehaviorSubject, filter } from 'rxjs' -import { TuiDialogService } from '@taiga-ui/core' -import { TUI_PROMPT } from '@taiga-ui/kit' -import { ErrorService, LoadingService } from '@start9labs/shared' -import { - InputSpec, - unionSelectKey, - unionValueKey, -} from '@start9labs/start-sdk/lib/config/configTypes' -import { FormDialogService } from 'src/app/services/form-dialog.service' -import { FormPage } from 'src/app/apps/ui/modals/form/form.page' -import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' - -type BackupConfig = - | { - type: { - [unionSelectKey]: 'dropbox' | 'google-drive' - [unionValueKey]: RR.AddCloudBackupTargetReq - } - } - | { - type: { - [unionSelectKey]: 'cifs' - [unionValueKey]: RR.AddCifsBackupTargetReq - } - } - -export type BackupType = 'create' | 'restore' - -@Component({ - selector: 'backup-targets', - templateUrl: './backup-targets.page.html', - styleUrls: ['./backup-targets.page.scss'], -}) -export class BackupTargetsPage { - readonly docsUrl = - 'https://docs.start9.com/latest/user-manual/backups/backup-targets' - targets: RR.GetBackupTargetsRes = { - 'unknown-disks': [], - saved: [], - } - - loading$ = new BehaviorSubject(true) - - constructor( - private readonly dialogs: TuiDialogService, - private readonly loader: LoadingService, - private readonly errorService: ErrorService, - private readonly api: ApiService, - private readonly formDialog: FormDialogService, - ) {} - - ngOnInit() { - this.getTargets() - } - - async presentModalAddPhysical(disk: UnknownDisk, index: number) { - this.formDialog.open(FormPage, { - label: 'New Physical Target', - data: { - spec: await configBuilderToSpec(diskBackupTargetSpec), - value: { - name: disk.label || disk.logicalname, - }, - buttons: [ - { - text: 'Save', - handler: (value: Omit) => - this.add('disk', { - logicalname: disk.logicalname, - ...value, - }).then(disk => { - this.targets['unknown-disks'].splice(index, 1) - this.targets.saved.push(disk) - - return true - }), - }, - ], - }, - }) - } - - async presentModalAddRemote() { - this.formDialog.open(FormPage, { - label: 'New Remote Target', - data: { - spec: await configBuilderToSpec(remoteBackupTargetSpec), - buttons: [ - { - text: 'Save', - handler: ({ type }: BackupConfig) => - this.add( - type[unionSelectKey] === 'cifs' ? 'cifs' : 'cloud', - type[unionValueKey], - ), - }, - ], - }, - }) - } - - async presentModalUpdate(target: BackupTarget) { - let spec: InputSpec - - switch (target.type) { - case 'cifs': - spec = await configBuilderToSpec(cifsSpec) - break - case 'cloud': - spec = await configBuilderToSpec( - target.provider === 'dropbox' ? dropboxSpec : googleDriveSpec, - ) - break - case 'disk': - spec = await configBuilderToSpec(diskBackupTargetSpec) - break - } - - this.formDialog.open(FormPage, { - label: 'Update Target', - data: { - spec, - value: target, - buttons: [ - { - text: 'Save', - handler: ( - value: - | RR.UpdateCifsBackupTargetReq - | RR.UpdateCloudBackupTargetReq - | RR.UpdateDiskBackupTargetReq, - ) => this.update(target.type, { ...value, id: target.id }), - }, - ], - }, - }) - } - - presentAlertDelete(id: string, index: number) { - this.dialogs - .open(TUI_PROMPT, { - label: 'Confirm', - size: 's', - data: { - content: 'Forget backup target? This actions cannot be undone.', - no: 'Cancel', - yes: 'Delete', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => this.delete(id, index)) - } - - async delete(id: string, index: number): Promise { - const loader = this.loader.open('Removing...').subscribe() - - try { - await this.api.removeBackupTarget({ id }) - this.targets.saved.splice(index, 1) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } - - async refresh() { - this.loading$.next(true) - await this.getTargets() - } - - getIcon(type: BackupTargetType) { - switch (type) { - case 'disk': - return 'save-outline' - case 'cifs': - return 'folder-open-outline' - case 'cloud': - return 'cloud-outline' - } - } - - private async getTargets(): Promise { - try { - this.targets = await this.api.getBackupTargets({}) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - this.loading$.next(false) - } - } - - private async add( - type: BackupTargetType, - value: - | RR.AddCifsBackupTargetReq - | RR.AddCloudBackupTargetReq - | RR.AddDiskBackupTargetReq, - ): Promise { - const loader = this.loader.open('Saving target...').subscribe() - - try { - return await this.api.addBackupTarget(type, value) - } finally { - loader.unsubscribe() - } - } - - private async update( - type: BackupTargetType, - value: - | RR.UpdateCifsBackupTargetReq - | RR.UpdateCloudBackupTargetReq - | RR.UpdateDiskBackupTargetReq, - ): Promise { - const loader = this.loader.open('Saving target...').subscribe() - - try { - return await this.api.updateBackupTarget(type, value) - } finally { - loader.unsubscribe() - } - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.module.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.module.ts deleted file mode 100644 index c4c53f140..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.module.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { NgModule } from '@angular/core' -import { RouterModule, Routes } from '@angular/router' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { BadgeMenuComponentModule } from 'src/app/common/badge-menu-button/badge-menu.component.module' -import { InsecureWarningComponentModule } from 'src/app/common/insecure-warning/insecure-warning.module' -import { BackupCreateDirective } from '../../directives/backup-create.directive' -import { BackupRestoreDirective } from '../../directives/backup-restore.directive' -import { - BackingUpComponent, - PkgMainStatusPipe, -} from '../../components/backing-up/backing-up.component' -import { BackupSelectPageModule } from '../../modals/backup-select/backup-select.module' -import { RecoverSelectPageModule } from '../../modals/recover-select/recover-select.module' -import { TargetPipesModule } from '../../pipes/target-pipes.module' -import { BackupsPage } from './backups.page' -import { PromptModule } from 'src/app/apps/ui/modals/prompt/prompt.module' - -const routes: Routes = [ - { - path: '', - component: BackupsPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - BackupSelectPageModule, - RecoverSelectPageModule, - BadgeMenuComponentModule, - InsecureWarningComponentModule, - TargetPipesModule, - PromptModule, - ], - declarations: [ - BackupsPage, - BackupCreateDirective, - BackupRestoreDirective, - BackingUpComponent, - PkgMainStatusPipe, - ], -}) -export class BackupsPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.html b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.html deleted file mode 100644 index 4dca2133c..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.html +++ /dev/null @@ -1,112 +0,0 @@ - - - Backups - - - - - - - - - - - Options - - - - -

    Create a Backup

    -

    Create a one-time backup

    -
    -
    - - - -

    Restore From Backup

    -

    Restore services from backup

    -
    -
    - - - -

    Jobs

    -

    Manage backup jobs

    -
    -
    - - - -

    Targets

    -

    Manage backup targets

    -
    -
    - - - -

    History

    -

    View your entire backup history

    -
    -
    - - Upcoming Jobs - -
    - - - Scheduled - Job - Target - Packages - - - - - - - - Running - - - {{ upcoming.next | date : 'MMM d, y, h:mm a' }} - - - {{ upcoming.name }} - - -   {{ upcoming.target.name }} - - - {{ upcoming['package-ids'].length }} Packages - - - -

    - You have no active or upcoming backup jobs. -

    -
    -
    - - - - - - - - -
    -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.scss b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.ts deleted file mode 100644 index 4b8f2978b..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/pages/backups/backups.page.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' -import { PatchDB } from 'patch-db-client' -import { from, map } from 'rxjs' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { ConfigService } from 'src/app/services/config.service' -import { DataModel } from 'src/app/services/patch-db/data-model' -import { CronJob } from 'cron' - -@Component({ - selector: 'backups', - templateUrl: './backups.page.html', - styleUrls: ['./backups.page.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class BackupsPage { - readonly secure = this.config.isSecure() - readonly current$ = this.patch - .watch$('server-info', 'status-info', 'current-backup', 'job') - .pipe(map(job => job || {})) - readonly upcoming$ = from(this.api.getBackupJobs({})).pipe( - map(jobs => - jobs - .map(job => { - const nextDate = new CronJob(job.cron, () => {}).nextDate() - const next = nextDate.toISO() - const diff = nextDate.diffNow().milliseconds - return { - ...job, - next, - diff, - } - }) - .sort((a, b) => a.diff - b.diff), - ), - ) - - constructor( - private readonly patch: PatchDB, - private readonly config: ConfigService, - private readonly api: ApiService, - ) {} -} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pipes/get-display-info.pipe.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pipes/get-display-info.pipe.ts deleted file mode 100644 index fe5a927bf..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/pipes/get-display-info.pipe.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core' -import { BackupTarget } from 'src/app/services/api/api.types' - -@Pipe({ - name: 'getDisplayInfo', -}) -export class GetDisplayInfoPipe implements PipeTransform { - transform(target: BackupTarget): DisplayInfo { - const toReturn: DisplayInfo = { - name: target.name, - path: `Path: ${target.path}`, - description: '', - icon: '', - } - - switch (target.type) { - case 'cifs': - toReturn.description = `Network Folder: ${target.hostname}` - toReturn.icon = 'folder-open-outline' - break - case 'disk': - toReturn.description = `Physical Drive: ${ - target.vendor || 'Unknown Vendor' - }, ${target.model || 'Unknown Model'}` - toReturn.icon = 'save-outline' - break - case 'cloud': - toReturn.description = `Provider: ${target.provider}` - toReturn.icon = 'cloud-outline' - break - } - - return toReturn - } -} - -interface DisplayInfo { - name: string - path: string - description: string - icon: string -} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pipes/has-valid-backup.pipe.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pipes/has-valid-backup.pipe.ts deleted file mode 100644 index ff1b6237d..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/pipes/has-valid-backup.pipe.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core' -import { BackupTarget } from 'src/app/services/api/api.types' -import { Emver } from '@start9labs/shared' - -@Pipe({ - name: 'hasValidBackup', -}) -export class HasValidBackupPipe implements PipeTransform { - constructor(private readonly emver: Emver) {} - - transform(target: BackupTarget): boolean { - const backup = target['embassy-os'] - return !!backup && this.emver.compare(backup.version, '0.3.0') !== -1 - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/pipes/target-pipes.module.ts b/web/projects/ui/src/app/apps/ui/pages/backups/pipes/target-pipes.module.ts deleted file mode 100644 index 111ad834e..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/pipes/target-pipes.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { HasValidBackupPipe } from './has-valid-backup.pipe' -import { GetDisplayInfoPipe } from './get-display-info.pipe' - -@NgModule({ - declarations: [HasValidBackupPipe, GetDisplayInfoPipe], - imports: [CommonModule], - exports: [HasValidBackupPipe, GetDisplayInfoPipe], -}) -export class TargetPipesModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/backups/types/target-types.ts b/web/projects/ui/src/app/apps/ui/pages/backups/types/target-types.ts deleted file mode 100644 index fa129fdef..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/backups/types/target-types.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { Config } from '@start9labs/start-sdk/lib/config/builder/config' -import { Value } from '@start9labs/start-sdk/lib/config/builder/value' -import { Variants } from '@start9labs/start-sdk/lib/config/builder/variants' - -export const dropboxSpec = Config.of({ - name: Value.text({ - name: 'Name', - description: 'A friendly name for this Dropbox target', - placeholder: 'My Dropbox', - required: { default: null }, - }), - token: Value.text({ - name: 'Access Token', - description: 'The secret access token for your custom Dropbox app', - required: { default: null }, - masked: true, - }), - path: Value.text({ - name: 'Path', - description: 'The fully qualified path to the backup directory', - placeholder: 'e.g. /Desktop/my-folder', - required: { default: null }, - }), -}) - -export const googleDriveSpec = Config.of({ - name: Value.text({ - name: 'Name', - description: 'A friendly name for this Google Drive target', - placeholder: 'My Google Drive', - required: { default: null }, - }), - path: Value.text({ - name: 'Path', - description: 'The fully qualified path to the backup directory', - placeholder: 'e.g. /Desktop/my-folder', - required: { default: null }, - }), - key: Value.file({ - name: 'Private Key File', - description: - 'Your Google Drive service account private key file (.json file)', - required: { default: null }, - extensions: ['json'], - }), -}) - -export const cifsSpec = Config.of({ - name: Value.text({ - name: 'Name', - description: 'A friendly name for this Network Folder', - placeholder: 'My Network Folder', - required: { default: null }, - }), - hostname: Value.text({ - name: 'Hostname', - description: - 'The hostname of your target device on the Local Area Network.', - warning: null, - placeholder: `e.g. 'My Computer' OR 'my-computer.local'`, - required: { default: null }, - patterns: [], - }), - path: Value.text({ - name: 'Path', - description: `On Windows, this is the fully qualified path to the shared folder, (e.g. /Desktop/my-folder).\n\n On Linux and Mac, this is the literal name of the shared folder (e.g. my-shared-folder).`, - placeholder: 'e.g. my-shared-folder or /Desktop/my-folder', - required: { default: null }, - }), - username: Value.text({ - name: 'Username', - description: `On Linux, this is the samba username you created when sharing the folder.\n\n On Mac and Windows, this is the username of the user who is sharing the folder.`, - required: { default: null }, - placeholder: 'My Network Folder', - }), - password: Value.text({ - name: 'Password', - description: `On Linux, this is the samba password you created when sharing the folder.\n\n On Mac and Windows, this is the password of the user who is sharing the folder.`, - required: false, - masked: true, - placeholder: 'My Network Folder', - }), -}) - -export const remoteBackupTargetSpec = Config.of({ - type: Value.union( - { - name: 'Target Type', - required: { default: 'dropbox' }, - }, - Variants.of({ - dropbox: { - name: 'Dropbox', - spec: dropboxSpec, - }, - 'google-drive': { - name: 'Google Drive', - spec: googleDriveSpec, - }, - cifs: { - name: 'Network Folder', - spec: cifsSpec, - }, - }), - ), -}) - -export const diskBackupTargetSpec = Config.of({ - name: Value.text({ - name: 'Name', - description: 'A friendly name for this physical target', - placeholder: 'My Physical Target', - required: { default: null }, - }), - path: Value.text({ - name: 'Path', - description: 'The fully qualified path to the backup directory', - placeholder: 'e.g. /Backups/my-folder', - required: { default: null }, - }), -}) diff --git a/web/projects/ui/src/app/apps/ui/pages/home/home.module.ts b/web/projects/ui/src/app/apps/ui/pages/home/home.module.ts deleted file mode 100644 index 8e5ba887d..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/home/home.module.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { RouterModule, Routes } from '@angular/router' -import { HomePage } from './home.page' -import { BadgeMenuComponentModule } from 'src/app/common/badge-menu-button/badge-menu.component.module' -import { WidgetListComponentModule } from 'src/app/common/widget-list/widget-list.component.module' - -const routes: Routes = [ - { - path: '', - component: HomePage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - BadgeMenuComponentModule, - WidgetListComponentModule, - ], - declarations: [HomePage], -}) -export class HomePageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/home/home.page.html b/web/projects/ui/src/app/apps/ui/pages/home/home.page.html deleted file mode 100644 index 1f6300ad7..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/home/home.page.html +++ /dev/null @@ -1,13 +0,0 @@ - - - Home - - - - - - -
    - -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/home/home.page.scss b/web/projects/ui/src/app/apps/ui/pages/home/home.page.scss deleted file mode 100644 index 7efcd5161..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/home/home.page.scss +++ /dev/null @@ -1,9 +0,0 @@ -.padding-top { - padding-top: 2rem; -} - -@media (min-width: 2000px) { - .padding-top { - padding-top: 10rem; - } -} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/home/home.page.ts b/web/projects/ui/src/app/apps/ui/pages/home/home.page.ts deleted file mode 100644 index c90e99489..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/home/home.page.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Component } from '@angular/core' - -@Component({ - selector: 'home', - templateUrl: 'home.page.html', - styleUrls: ['home.page.scss'], -}) -export class HomePage {} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-item-toggle.component.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-item-toggle.component.ts deleted file mode 100644 index c96500e82..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-item-toggle.component.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { CommonModule, DOCUMENT } from '@angular/common' -import { - ChangeDetectionStrategy, - Component, - HostListener, - Inject, - Input, - inject, -} from '@angular/core' -import { TuiButtonModule } from '@taiga-ui/core' -import { TuiActiveZoneModule } from '@taiga-ui/cdk' -import { TuiSidebarModule } from '@taiga-ui/addon-mobile' -import { ItemModule, MarketplacePkg } from '@start9labs/marketplace' -import { MarketplaceShowControlsComponent } from '../marketplace-show-preview/components/marketplace-show-controls.component' -import { MarketplaceShowPreviewModule } from '../marketplace-show-preview/marketplace-show-preview.module' -import { - DataModel, - PackageDataEntry, -} from 'src/app/services/patch-db/data-model' -import { BehaviorSubject, filter, Observable, shareReplay } from 'rxjs' -import { PatchDB } from 'patch-db-client' -import { SidebarService } from 'src/app/services/sidebar.service' -import { ActivatedRoute } from '@angular/router' - -@Component({ - selector: 'marketplace-item-toggle', - template: ` -
    - - - - - -
    - `, - styles: [ - ` - .animate { - animation-name: animateIn; - animation-duration: 400ms; - animation-delay: calc(var(--animation-order) * 200ms); - animation-fill-mode: both; - animation-timing-function: ease-in-out; - } - - @keyframes animateIn { - 0% { - opacity: 0; - transform: scale(0.6) translateY(-20px); - } - - 100% { - opacity: 1; - } - } - `, - ], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, - imports: [ - CommonModule, - TuiActiveZoneModule, - TuiButtonModule, - TuiSidebarModule, - MarketplaceShowPreviewModule, - ItemModule, - MarketplaceShowControlsComponent, - ], -}) -export class MarketplaceItemToggleComponent { - @Input({ required: true }) - pkg!: MarketplacePkg - - @Input({ required: true }) - index!: number - - constructor( - private readonly patch: PatchDB, - private readonly activatedRoute: ActivatedRoute, - @Inject(DOCUMENT) private readonly document: Document, - ) {} - readonly sidebarService = inject(SidebarService) - localPkg$!: Observable - pkgIdQueryParam = new BehaviorSubject('') - readonly pkgId = this.activatedRoute.queryParamMap.subscribe(params => { - this.pkgIdQueryParam.next(params.get('id')!) - }) - - ngOnChanges() { - this.localPkg$ = this.patch - .watch$('package-data', this.pkg.manifest.id) - .pipe(filter(Boolean), shareReplay({ bufferSize: 1, refCount: true })) - } - - @HostListener('animationend', ['$event.target']) - async onAnimationEnd(_target: EventTarget | null) { - if (this.pkgIdQueryParam.value === this.pkg.manifest.id) { - this.toggle(true) - } - } - - toggle(open: boolean) { - this.sidebarService.toggleState(this.pkg.manifest.id, open) - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-menu/marketplace-menu.component.html b/web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-menu/marketplace-menu.component.html deleted file mode 100644 index e67ee1988..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-menu/marketplace-menu.component.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - Change Registry Icon - - Change Registry - - - diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-menu/marketplace-menu.component.scss b/web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-menu/marketplace-menu.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-menu/marketplace-menu.component.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-menu/marketplace-menu.component.ts deleted file mode 100644 index cdcda451b..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-menu/marketplace-menu.component.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { ChangeDetectionStrategy, Component, Inject } from '@angular/core' -import { TuiDialogService } from '@taiga-ui/core' -import { ConfigService } from 'src/app/services/config.service' -import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' -import { MarketplaceSettingsPage } from '../../marketplace-list/marketplace-settings/marketplace-settings.page' - -@Component({ - selector: 'marketplace-menu', - templateUrl: 'marketplace-menu.component.html', - styleUrls: ['./marketplace-menu.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class MarketplaceMenuComponent { - constructor( - @Inject(TuiDialogService) private readonly dialogs: TuiDialogService, - readonly config: ConfigService, - ) {} - - readonly marketplace = this.config.marketplace - - async presentModalMarketplaceSettings() { - this.dialogs - .open( - new PolymorpheusComponent(MarketplaceSettingsPage), - { - label: 'Change Registry', - }, - ) - .subscribe() - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-menu/marketplace-menu.module.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-menu/marketplace-menu.module.ts deleted file mode 100644 index c6963c8f1..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/components/marketplace-menu/marketplace-menu.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { NgModule } from '@angular/core' -import { MarketplaceMenuComponent } from './marketplace-menu.component' -import { MenuModule } from '@start9labs/marketplace' -import { TuiButtonModule } from '@taiga-ui/core' - -@NgModule({ - imports: [MenuModule, TuiButtonModule], - exports: [MarketplaceMenuComponent], - declarations: [MarketplaceMenuComponent], -}) -export class MarketplaceMenuModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.module.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.module.ts deleted file mode 100644 index 49580cbd3..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.module.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { RouterModule, Routes } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { ResponsiveColDirective, SharedPipesModule } from '@start9labs/shared' -import { FilterPackagesPipeModule } from '@start9labs/marketplace' -import { MarketplaceMenuModule } from '../components/marketplace-menu/marketplace-menu.module' -import { MarketplaceListPage } from './marketplace-list.page' -import { MarketplaceSettingsPageModule } from './marketplace-settings/marketplace-settings.module' -import { TuiNotificationModule } from '@taiga-ui/core' -import { TuiLetModule } from '@taiga-ui/cdk' -import { MarketplaceItemToggleComponent } from '../components/marketplace-item-toggle.component' -const routes: Routes = [ - { - path: '', - component: MarketplaceListPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - SharedPipesModule, - FilterPackagesPipeModule, - MarketplaceMenuModule, - MarketplaceSettingsPageModule, - TuiNotificationModule, - TuiLetModule, - ResponsiveColDirective, - MarketplaceItemToggleComponent, - ], - declarations: [MarketplaceListPage], - exports: [MarketplaceListPage], -}) -export class MarketplaceListPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.html b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.html deleted file mode 100644 index c7dae83b8..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.html +++ /dev/null @@ -1,112 +0,0 @@ - -
    -
    - - - -

    - Services from this registry are packaged and maintained by the Start9 - team. If you experience an issue or have questions related to a - service from this registry, one of our dedicated support staff will be - happy to assist you. -

    -
    - -

    - Services from this registry are packaged and maintained by members of - the Start9 community. - Install at your own risk - . If you experience an issue or have a question related to a service - in this marketplace, please reach out to the package developer for - assistance. -

    -
    - -

    - Services from this registry are undergoing - beta - testing and may contain bugs. - Install at your own risk - . -

    -
    - -

    - Services from this registry are undergoing - alpha - testing. They are expected to contain bugs and could damage your - system. - Install at your own risk - . -

    -
    - -

    - This is a Custom Registry. Start9 cannot verify the integrity or - functionality of services from this registry, and they could damage - your system. - Install at your own risk - . -

    -
    -
    -
    -

    - {{ category$ | async | titlecase }} -

    -
    - -
    -
      -
    • - -
    • -
    -
    -
    - -

    - Loading - -

    -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.scss b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.scss deleted file mode 100644 index 6a6700581..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.scss +++ /dev/null @@ -1,4 +0,0 @@ -.background { - background: url('/assets/img/background.png') no-repeat center center fixed; - z-index: -100; -} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.ts deleted file mode 100644 index 1402d1c11..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-list.page.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { ChangeDetectionStrategy, Component, Inject } from '@angular/core' -import { - AbstractCategoryService, - AbstractMarketplaceService, -} from '@start9labs/marketplace' -import { TuiDialogService } from '@taiga-ui/core' -import { PatchDB } from 'patch-db-client' -import { map } from 'rxjs' -import { ConfigService } from 'src/app/services/config.service' -import { MarketplaceService } from 'src/app/services/marketplace.service' -import { DataModel } from 'src/app/services/patch-db/data-model' -import { CategoryService } from 'src/app/services/category.service' -import { SidebarService } from 'src/app/services/sidebar.service' -import { MarketplaceSettingsPage } from './marketplace-settings/marketplace-settings.page' -import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' - -@Component({ - selector: 'marketplace-list', - templateUrl: 'marketplace-list.page.html', - styleUrls: ['./marketplace-list.page.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class MarketplaceListPage { - constructor( - private readonly patch: PatchDB, - @Inject(AbstractMarketplaceService) - private readonly marketplaceService: MarketplaceService, - @Inject(AbstractCategoryService) - private readonly categoryService: CategoryService, - @Inject(TuiDialogService) private readonly dialogs: TuiDialogService, - readonly config: ConfigService, - readonly sidebarService: SidebarService, - ) {} - - readonly packages$ = this.marketplaceService.getSelectedStore$().pipe( - map(({ packages }) => { - this.sidebarService.setMap(packages.map(p => p.manifest.id)) - return packages - }), - ) - readonly localPkgs$ = this.patch.watch$('package-data') - readonly category$ = this.categoryService.getCategory$() - readonly query$ = this.categoryService.getQuery$() - readonly details$ = this.marketplaceService.getSelectedHost$() - readonly marketplace = this.config.marketplace - - async presentModalMarketplaceSettings() { - this.dialogs - .open( - new PolymorpheusComponent(MarketplaceSettingsPage), - { - label: 'Change Registry', - }, - ) - .subscribe() - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.module.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.module.ts deleted file mode 100644 index 0304046c2..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.module.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { SharedPipesModule } from '@start9labs/shared' -import { - TuiDataListModule, - TuiHostedDropdownModule, - TuiSvgModule, -} from '@taiga-ui/core' -import { FormPageModule } from 'src/app/apps/ui/modals/form/form.module' -import { MarketplaceSettingsPage } from './marketplace-settings.page' -import { StoreIconComponentModule } from '@start9labs/marketplace' - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - SharedPipesModule, - StoreIconComponentModule, - TuiHostedDropdownModule, - TuiDataListModule, - TuiSvgModule, - FormPageModule, - ], - declarations: [MarketplaceSettingsPage], -}) -export class MarketplaceSettingsPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.html b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.html deleted file mode 100644 index 77dde15e7..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.html +++ /dev/null @@ -1,84 +0,0 @@ -
    - - Default Registries - - - - - -

    {{ s.name }}

    -

    {{ s.url }}

    -
    - -
    - - Custom Registries - - - - - Add custom registry - - - - - - - - - - -

    {{ a.name }}

    -

    {{ a.url }}

    -
    - -
    - - - - - - -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.scss b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.scss deleted file mode 100644 index c0655db59..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.scss +++ /dev/null @@ -1,16 +0,0 @@ -ion-item { - --background: transparent; -} - -.host { - display: flex; -} - -.delete { - background: var(--tui-error-bg); - color: var(--tui-error-fill); - - &:focus { - background: var(--tui-error-bg-hover); - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.ts deleted file mode 100644 index d09e7cded..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-list/marketplace-settings/marketplace-settings.page.ts +++ /dev/null @@ -1,236 +0,0 @@ -import { ChangeDetectionStrategy, Component, Inject } from '@angular/core' -import { - ErrorService, - LoadingService, - sameUrl, - toUrl, -} from '@start9labs/shared' -import { AbstractMarketplaceService } from '@start9labs/marketplace' -import { ValueSpecObject } from '@start9labs/start-sdk/lib/config/configTypes' -import { TuiDialogService } from '@taiga-ui/core' -import { TUI_PROMPT } from '@taiga-ui/kit' -import { PatchDB } from 'patch-db-client' -import { combineLatest, filter, firstValueFrom, map, Subscription } from 'rxjs' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { DataModel, UIStore } from 'src/app/services/patch-db/data-model' -import { MarketplaceService } from 'src/app/services/marketplace.service' -import { FormDialogService } from 'src/app/services/form-dialog.service' -import { FormPage } from 'src/app/apps/ui/modals/form/form.page' -import { ConfigService } from 'src/app/services/config.service' - -@Component({ - selector: 'marketplace-settings', - templateUrl: 'marketplace-settings.page.html', - styleUrls: ['marketplace-settings.page.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class MarketplaceSettingsPage { - constructor( - private readonly api: ApiService, - private readonly loader: LoadingService, - private readonly formDialog: FormDialogService, - private readonly errorService: ErrorService, - @Inject(AbstractMarketplaceService) - private readonly marketplaceService: MarketplaceService, - private readonly patch: PatchDB, - private readonly dialogs: TuiDialogService, - readonly config: ConfigService, - ) {} - - stores$ = combineLatest([ - this.marketplaceService.getKnownHosts$(), - this.marketplaceService.getSelectedHost$(), - ]).pipe( - map(([stores, selected]) => { - const toSlice = stores.map(s => ({ - ...s, - selected: sameUrl(s.url, selected.url), - })) - // 0 and 1 are prod and community - const standard = toSlice.slice(0, 2) - // 2 and beyond are alts - const alt = toSlice.slice(2) - - return { standard, alt } - }), - ) - - async presentModalAdd() { - const { name, spec } = getMarketplaceValueSpec() - - this.formDialog.open(FormPage, { - label: name, - data: { - spec, - buttons: [ - { - text: 'Save for Later', - handler: async (value: { url: string }) => this.saveOnly(value.url), - }, - { - text: 'Save and Connect', - handler: async (value: { url: string }) => - this.saveAndConnect(value.url), - isSubmit: true, - }, - ], - }, - }) - } - - async presentAlertDelete(url: string, name: string = '') { - this.dialogs - .open(TUI_PROMPT, { - label: 'Confirm', - size: 's', - data: { - content: `Are you sure you want to delete ${name}?`, - yes: 'Delete', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => this.delete(url)) - } - - async connect( - url: string, - loader: Subscription = new Subscription(), - ): Promise { - loader.unsubscribe() - loader.closed = false - loader.add(this.loader.open('Changing Registry...').subscribe()) - - try { - await this.api.setDbValue(['marketplace', 'selected-url'], url) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } - - private async saveOnly(rawUrl: string): Promise { - const loader = this.loader.open('Loading').subscribe() - - try { - const url = new URL(rawUrl).toString() - await this.validateAndSave(url, loader) - return true - } catch (e: any) { - this.errorService.handleError(e) - return false - } finally { - loader.unsubscribe() - } - } - - private async saveAndConnect(rawUrl: string): Promise { - const loader = this.loader.open('Loading').subscribe() - - try { - const url = new URL(rawUrl).toString() - await this.validateAndSave(url, loader) - await this.connect(url, loader) - return true - } catch (e: any) { - this.errorService.handleError(e) - return false - } finally { - loader.unsubscribe() - } - } - - private async validateAndSave( - url: string, - loader: Subscription, - ): Promise { - // Error on duplicates - const hosts = await firstValueFrom( - this.patch.watch$('ui', 'marketplace', 'known-hosts'), - ) - const currentUrls = Object.keys(hosts).map(toUrl) - if (currentUrls.includes(url)) throw new Error('marketplace already added') - - // Validate - loader.unsubscribe() - loader.closed = false - loader.add(this.loader.open('Validating marketplace...').subscribe()) - - const { name } = await firstValueFrom( - this.marketplaceService.fetchInfo$(url), - ) - - // Save - loader.unsubscribe() - loader.closed = false - loader.add(this.loader.open('Saving...').subscribe()) - - await this.api.setDbValue<{ name: string }>( - ['marketplace', 'known-hosts', url], - { name }, - ) - } - - private async delete(url: string): Promise { - const loader = this.loader.open('Deleting...').subscribe() - - const hosts = await firstValueFrom( - this.patch.watch$('ui', 'marketplace', 'known-hosts'), - ) - - const filtered: { [url: string]: UIStore } = Object.keys(hosts) - .filter(key => !sameUrl(key, url)) - .reduce((prev, curr) => { - const name = hosts[curr] - return { - ...prev, - [curr]: name, - } - }, {}) - - try { - await this.api.setDbValue<{ [url: string]: UIStore }>( - ['marketplace', 'known-hosts'], - filtered, - ) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } -} - -function getMarketplaceValueSpec(): ValueSpecObject { - return { - type: 'object', - name: 'Add Custom Registry', - description: null, - warning: null, - spec: { - url: { - type: 'text', - name: 'URL', - description: 'A fully-qualified URL of the custom registry', - inputmode: 'url', - required: true, - masked: false, - minLength: null, - maxLength: null, - patterns: [ - { - regex: `https?:\/\/[a-zA-Z0-9][a-zA-Z0-9-\.]+[a-zA-Z0-9]\.[^\s]{2,}`, - description: 'Must be a valid URL', - }, - ], - placeholder: 'e.g. https://example.org', - default: null, - warning: null, - disabled: false, - immutable: false, - generate: null, - }, - }, - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/components/marketplace-show-controls.component.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/components/marketplace-show-controls.component.ts deleted file mode 100644 index 8bf8b0548..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/components/marketplace-show-controls.component.ts +++ /dev/null @@ -1,317 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - Inject, - inject, - Input, -} from '@angular/core' -import { - AbstractMarketplaceService, - MarketplacePkg, - AboutModule, - AdditionalModule, - DependenciesModule, -} from '@start9labs/marketplace' -import { - Emver, - ErrorService, - isEmptyObject, - LoadingService, - pauseFor, - sameUrl, - EmverPipesModule, - MarkdownPipeModule, - SharedPipesModule, - TextSpinnerComponentModule, -} from '@start9labs/shared' -import { TuiDialogService } from '@taiga-ui/core' -import { filter, firstValueFrom, of, Subscription, switchMap } from 'rxjs' -import { - DataModel, - PackageDataEntry, - PackageState, -} from 'src/app/services/patch-db/data-model' -import { ClientStorageService } from 'src/app/services/client-storage.service' -import { MarketplaceService } from 'src/app/services/marketplace.service' -import { hasCurrentDeps } from 'src/app/util/has-deps' -import { PatchDB } from 'patch-db-client' -import { getAllPackages } from 'src/app/util/get-package-data' -import { TUI_PROMPT } from '@taiga-ui/kit' -import { dryUpdate } from 'src/app/util/dry-update' -import { Router } from '@angular/router' -import { SidebarService } from 'src/app/services/sidebar.service' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { RouterModule } from '@angular/router' - -import { TuiButtonModule } from '@taiga-ui/experimental' - -@Component({ - selector: 'marketplace-show-controls', - template: ` -
    - - - - - - - - - - - - - - -
    - `, - styles: [ - ` - button { - --tui-padding: 1.5rem; - } - `, - ], - standalone: true, - changeDetection: ChangeDetectionStrategy.OnPush, - imports: [ - CommonModule, - IonicModule, - RouterModule, - TextSpinnerComponentModule, - SharedPipesModule, - EmverPipesModule, - MarkdownPipeModule, - AboutModule, - DependenciesModule, - AdditionalModule, - TuiButtonModule, - ], -}) -export class MarketplaceShowControlsComponent { - @Input() - url?: string - - @Input({ required: true }) - pkg!: MarketplacePkg - - @Input() - localPkg!: PackageDataEntry | null - - readonly showDevTools$ = this.ClientStorageService.showDevTools$ - readonly PackageState = PackageState - private readonly router = inject(Router) - readonly sidebarService = inject(SidebarService) - - constructor( - private readonly dialogs: TuiDialogService, - private readonly ClientStorageService: ClientStorageService, - @Inject(AbstractMarketplaceService) - private readonly marketplaceService: MarketplaceService, - private readonly loader: LoadingService, - private readonly emver: Emver, - private readonly errorService: ErrorService, - private readonly patch: PatchDB, - ) {} - - get localVersion(): string { - return this.localPkg?.manifest.version || '' - } - - async tryInstall() { - this.sidebarService.toggleState(this.pkg.manifest.id, false) - const currentMarketplace = await firstValueFrom( - this.marketplaceService.getSelectedHost$(), - ) - const url = this.url || currentMarketplace.url - - if (!this.localPkg) { - this.alertInstall(url) - } else { - const originalUrl = this.localPkg.installed?.['marketplace-url'] - - if (!sameUrl(url, originalUrl)) { - const proceed = await this.presentAlertDifferentMarketplace( - url, - originalUrl, - ) - if (!proceed) return - } - - const currentDeps = hasCurrentDeps(this.localPkg) - if ( - currentDeps && - this.emver.compare(this.localVersion, this.pkg.manifest.version) !== 0 - ) { - this.dryInstall(url) - } else { - this.install(url) - } - } - } - - async showService() { - this.sidebarService.toggleState(this.pkg.manifest.id, false) - // @TODO code smell - needed to close preview - likely due to sidebar animation - await pauseFor(300) - this.router.navigate(['/services', this.pkg.manifest.id]) - } - - private async presentAlertDifferentMarketplace( - url: string, - originalUrl: string | null | undefined, - ): Promise { - const marketplaces = await firstValueFrom( - this.patch.watch$('ui', 'marketplace'), - ) - - const name: string = marketplaces['known-hosts'][url]?.name || url - - let originalName: string | undefined - if (originalUrl) { - originalName = - marketplaces['known-hosts'][originalUrl]?.name || originalUrl - } - - return new Promise(async resolve => { - this.dialogs - .open(TUI_PROMPT, { - label: 'Warning', - size: 's', - data: { - content: `This service was originally ${ - originalName ? 'installed from ' + originalName : 'side loaded' - }, but you are currently connected to ${name}. To install from ${name} anyway, click "Continue".`, - yes: 'Continue', - no: 'Cancel', - }, - }) - .subscribe(response => resolve(response)) - }) - } - - private async dryInstall(url: string) { - const breakages = dryUpdate( - this.pkg.manifest, - await getAllPackages(this.patch), - this.emver, - ) - - if (isEmptyObject(breakages)) { - this.install(url) - } else { - const proceed = await this.presentAlertBreakages(breakages) - if (proceed) { - this.install(url) - } - } - } - - private alertInstall(url: string) { - of(this.pkg.manifest.alerts.install) - .pipe( - switchMap(content => - !content - ? of(true) - : this.dialogs.open(TUI_PROMPT, { - label: 'Alert', - size: 's', - data: { - content, - yes: 'Install', - no: 'Cancel', - }, - }), - ), - filter(Boolean), - ) - .subscribe(() => this.install(url)) - } - - private async install(url: string, loader?: Subscription) { - const message = 'Beginning Install...' - - if (loader) { - loader.unsubscribe() - loader.closed = false - loader.add(this.loader.open(message).subscribe()) - } else { - loader = this.loader.open(message).subscribe() - } - - const { id, version } = this.pkg.manifest - - try { - await this.marketplaceService.installPackage(id, version, url) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } - - private async presentAlertBreakages(breakages: string[]): Promise { - let content: string = - 'As a result of this update, the following services will no longer work properly and may crash:
      ' - const bullets = breakages.map(title => `
    • ${title}
    • `) - content = `${content}${bullets.join('')}
    ` - - return new Promise(async resolve => { - this.dialogs - .open(TUI_PROMPT, { - label: 'Warning', - size: 's', - data: { - content, - yes: 'Continue', - no: 'Cancel', - }, - }) - .subscribe(response => resolve(response)) - }) - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.component.html b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.component.html deleted file mode 100644 index e9b39e0ce..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.component.html +++ /dev/null @@ -1,47 +0,0 @@ -
    - - - - - - - - View more details - -
    - -
    -
    -

    Dependencies

    -
    -
    - -
    -
    -
    -
    - - -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.component.scss b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.component.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.component.ts deleted file mode 100644 index 74118a4e6..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.component.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - Inject, - inject, - Input, -} from '@angular/core' -import { BehaviorSubject, map } from 'rxjs' -import { - TuiDialogContext, - TuiDialogService, - TuiDurationOptions, - tuiFadeIn, -} from '@taiga-ui/core' -import { tuiPure } from '@taiga-ui/cdk' -import { PolymorpheusContent } from '@tinkoff/ng-polymorpheus' -import { isPlatform } from '@ionic/angular' -import { - AbstractMarketplaceService, - MarketplacePkg, -} from '@start9labs/marketplace' -import { SidebarService } from 'src/app/services/sidebar.service' - -@Component({ - selector: 'marketplace-show-preview', - templateUrl: './marketplace-show-preview.component.html', - styleUrls: ['./marketplace-show-preview.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, - animations: [tuiFadeIn], -}) -export class MarketplaceShowPreviewComponent { - @Input({ required: true }) - pkg!: MarketplacePkg - - constructor( - @Inject(TuiDialogService) private readonly dialogs: TuiDialogService, - ) {} - - readonly sidebarService = inject(SidebarService) - private readonly marketplaceService = inject(AbstractMarketplaceService) - readonly version$ = new BehaviorSubject('*') - index = 0 - speed = 1000 - isMobile = isPlatform(window, 'ios') || isPlatform(window, 'android') - url$ = this.marketplaceService.getSelectedHost$().pipe(map(({ url }) => url)) - - @tuiPure - getAnimation(duration: number): TuiDurationOptions { - return { value: '', params: { duration } } - } - - presentModalImg(content: PolymorpheusContent) { - this.dialogs - .open(content, { - size: 'l', - }) - .subscribe() - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.module.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.module.ts deleted file mode 100644 index 58bc3bf88..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-show-preview/marketplace-show-preview.module.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { CommonModule } from '@angular/common' -import { NgModule } from '@angular/core' -import { - SharedPipesModule, - TextSpinnerComponentModule, -} from '@start9labs/shared' -import { - AboutModule, - AdditionalModule, - DependenciesModule, - MarketplacePackageHeroComponent, - ReleaseNotesModule, -} from '@start9labs/marketplace' -import { MarketplaceShowPreviewComponent } from './marketplace-show-preview.component' - -import { TuiButtonModule } from '@taiga-ui/experimental' -import { RouterModule } from '@angular/router' - -@NgModule({ - declarations: [MarketplaceShowPreviewComponent], - exports: [MarketplaceShowPreviewComponent], - imports: [ - CommonModule, - SharedPipesModule, - TextSpinnerComponentModule, - RouterModule, - DependenciesModule, - AdditionalModule, - ReleaseNotesModule, - TuiButtonModule, - AboutModule, - MarketplacePackageHeroComponent, - ], -}) -export class MarketplaceShowPreviewModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.html b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.html deleted file mode 100644 index 15837d03d..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.html +++ /dev/null @@ -1,32 +0,0 @@ - -
    - - Installed - - - Update Available - -
    -
    - - Removing - - -
    -
    - - Installing - - {{ progress }} - -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.scss b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.scss deleted file mode 100644 index c1ad62772..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -ion-text { - font-weight: bold; -} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.ts deleted file mode 100644 index 3c4ad7c8a..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.component.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Component, Input } from '@angular/core' -import { - PackageDataEntry, - PackageState, -} from 'src/app/services/patch-db/data-model' - -@Component({ - selector: 'marketplace-status', - templateUrl: 'marketplace-status.component.html', - styleUrls: ['marketplace-status.component.scss'], -}) -export class MarketplaceStatusComponent { - @Input({ required: true }) version!: string - @Input() localPkg?: PackageDataEntry - - PackageState = PackageState - - get localVersion(): string { - return this.localPkg?.manifest.version || '' - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.module.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.module.ts deleted file mode 100644 index 5f19ea352..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace-status/marketplace-status.module.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { CommonModule } from '@angular/common' -import { NgModule } from '@angular/core' -import { IonicModule } from '@ionic/angular' -import { EmverPipesModule } from '@start9labs/shared' -import { InstallProgressPipeModule } from 'src/app/common/install-progress/install-progress.module' -import { MarketplaceStatusComponent } from './marketplace-status.component' - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - EmverPipesModule, - InstallProgressPipeModule, - ], - declarations: [MarketplaceStatusComponent], - exports: [MarketplaceStatusComponent], -}) -export class MarketplaceStatusModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace.module.ts b/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace.module.ts deleted file mode 100644 index cbe1a5afb..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/marketplace/marketplace.module.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { NgModule } from '@angular/core' -import { RouterModule, Routes } from '@angular/router' - -const routes: Routes = [ - { - path: '', - pathMatch: 'full', - loadChildren: () => - import('./marketplace-list/marketplace-list.module').then( - m => m.MarketplaceListPageModule, - ), - }, -] - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class MarketplaceModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/notifications/notifications.module.ts b/web/projects/ui/src/app/apps/ui/pages/notifications/notifications.module.ts deleted file mode 100644 index 2f50677a3..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/notifications/notifications.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { RouterModule, Routes } from '@angular/router' -import { SharedPipesModule } from '@start9labs/shared' -import { TuiPromptModule } from '@taiga-ui/kit' -import { NotificationsPage } from './notifications.page' -import { BadgeMenuComponentModule } from 'src/app/common/badge-menu-button/badge-menu.component.module' -import { BackupReportPageModule } from '../../modals/backup-report/backup-report.module' - -const routes: Routes = [ - { - path: '', - component: NotificationsPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - BadgeMenuComponentModule, - SharedPipesModule, - BackupReportPageModule, - TuiPromptModule, - ], - declarations: [NotificationsPage], -}) -export class NotificationsPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.html b/web/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.html deleted file mode 100644 index a09112cd5..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - Notifications - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -

    - Important system alerts and notifications from StartOS will display - here -

    -
    -
    - - - - - - - Delete All - - - - -

    - - - {{ $any(packageData[pkgId])?.manifest.title || pkgId }} - - - {{ not.title }} - -

    -

    {{ truncate(not.message) }}

    -

    - - View Full Message - -

    -

    {{ not['created-at'] | date: 'medium' }}

    -
    - - View Report - - - View Service - - - - -
    -
    - - - - -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.scss b/web/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.scss deleted file mode 100644 index 0dee98ade..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.scss +++ /dev/null @@ -1,11 +0,0 @@ -.notification-message { - margin: 6px 0 8px 0; -} - -.view-message-tag { - margin-bottom: 8px; - font-size: 16px; - a { - cursor: pointer; - } -} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.ts b/web/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.ts deleted file mode 100644 index a057aaf6d..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/notifications/notifications.page.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { Component } from '@angular/core' -import { ActivatedRoute } from '@angular/router' -import { ErrorService, LoadingService } from '@start9labs/shared' -import { TuiDialogService } from '@taiga-ui/core' -import { TUI_PROMPT } from '@taiga-ui/kit' -import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' -import { PatchDB } from 'patch-db-client' -import { filter, first } from 'rxjs' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { - ServerNotifications, - NotificationLevel, - ServerNotification, -} from 'src/app/services/api/api.types' -import { BackupReportComponent } from '../../modals/backup-report/backup-report.component' -import { DataModel } from 'src/app/services/patch-db/data-model' - -@Component({ - selector: 'notifications', - templateUrl: 'notifications.page.html', - styleUrls: ['notifications.page.scss'], -}) -export class NotificationsPage { - loading = true - notifications: ServerNotifications = [] - beforeCursor?: number - needInfinite = false - fromToast = !!this.route.snapshot.queryParamMap.get('toast') - readonly perPage = 40 - readonly packageData$ = this.patch.watch$('package-data').pipe(first()) - - constructor( - private readonly embassyApi: ApiService, - private readonly loader: LoadingService, - private readonly dialogs: TuiDialogService, - private readonly errorService: ErrorService, - private readonly route: ActivatedRoute, - private readonly patch: PatchDB, - ) {} - - async ngOnInit() { - this.notifications = await this.getNotifications() - this.loading = false - } - - async doInfinite(e: any) { - const notifications = await this.getNotifications() - this.notifications = this.notifications.concat(notifications) - e.target.complete() - } - - async getNotifications(): Promise { - try { - const notifications = await this.embassyApi.getNotifications({ - before: this.beforeCursor, - limit: this.perPage, - }) - - if (!notifications) return [] - - this.beforeCursor = notifications[notifications.length - 1]?.id - this.needInfinite = notifications.length >= this.perPage - - return notifications - } catch (e: any) { - this.errorService.handleError(e) - } - - return [] - } - - async delete(id: number, index: number): Promise { - const loader = this.loader.open('Deleting...').subscribe() - - try { - // await this.embassyApi.deleteNotification({ id }) - this.notifications.splice(index, 1) - this.beforeCursor = this.notifications[this.notifications.length - 1]?.id - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } - - presentAlertDeleteAll() { - this.dialogs - .open(TUI_PROMPT, { - label: 'Delete All?', - size: 's', - data: { - content: 'Are you sure you want to delete all notifications?', - yes: 'Delete', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => this.deleteAll()) - } - - async viewBackupReport(notification: ServerNotification) { - this.dialogs - .open(new PolymorpheusComponent(BackupReportComponent), { - label: 'Backup Report', - data: { - report: notification.data, - timestamp: notification['created-at'], - }, - }) - .subscribe() - } - - viewFullMessage(label: string, message: string) { - this.dialogs.open(message, { label }).subscribe() - } - - truncate(message: string): string { - return message.length <= 240 ? message : '...' + message.substr(-240) - } - - getColor({ level }: ServerNotification): string { - switch (level) { - case NotificationLevel.Info: - return 'primary' - case NotificationLevel.Success: - return 'success' - case NotificationLevel.Warning: - return 'warning' - case NotificationLevel.Error: - return 'danger' - default: - return '' - } - } - - private async deleteAll(): Promise { - const loader = this.loader.open('Deleting...').subscribe() - - try { - // await this.embassyApi.deleteAllNotifications({ - // before: this.notifications[0].id + 1, - // }) - this.notifications = [] - this.beforeCursor = undefined - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.module.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.module.ts deleted file mode 100644 index 248dd430e..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { QrCodeModule } from 'ng-qrcode' - -import { ActionSuccessPage } from './action-success.page' - -@NgModule({ - declarations: [ActionSuccessPage], - imports: [CommonModule, IonicModule, QrCodeModule], - exports: [ActionSuccessPage], -}) -export class ActionSuccessPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.html b/web/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.html deleted file mode 100644 index ed8babcc0..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.html +++ /dev/null @@ -1,22 +0,0 @@ -

    {{ actionRes.message }}

    - -
    -
    - -
    - -

    {{ actionRes.value }}

    - - {{ actionRes.value }} - - - - -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.ts deleted file mode 100644 index f4b390269..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-actions/action-success/action-success.page.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Component, Inject } from '@angular/core' -import { CopyService } from '@start9labs/shared' -import { TuiDialogContext } from '@taiga-ui/core' -import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' -import { ActionResponse } from 'src/app/services/api/api.types' - -@Component({ - selector: 'action-success', - templateUrl: './action-success.page.html', -}) -export class ActionSuccessPage { - constructor( - @Inject(POLYMORPHEUS_CONTEXT) - private readonly context: TuiDialogContext, - readonly copyService: CopyService, - ) {} - - get actionRes(): ActionResponse { - return this.context.data - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions-item.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions-item.component.html deleted file mode 100644 index 71bcc6e40..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions-item.component.html +++ /dev/null @@ -1,7 +0,0 @@ - - - -

    {{ action.name }}

    -

    {{ action.description }}

    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.module.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.module.ts deleted file mode 100644 index 6e25ca6c9..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.module.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { Routes, RouterModule } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { SharedPipesModule } from '@start9labs/shared' -import { FormPageModule } from 'src/app/apps/ui/modals/form/form.module' -import { ActionSuccessPageModule } from './action-success/action-success.module' -import { - AppActionsPage, - AppActionsItemComponent, - GroupActionsPipe, -} from './app-actions.page' - -const routes: Routes = [ - { - path: '', - component: AppActionsPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - SharedPipesModule, - ActionSuccessPageModule, - FormPageModule, - RouterModule.forChild(routes), - ], - declarations: [AppActionsPage, AppActionsItemComponent, GroupActionsPipe], -}) -export class AppActionsPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.html b/web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.html deleted file mode 100644 index beb8bb339..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - Actions - - - - - - - Standard Actions - - - - - Actions for {{ pkg.manifest.title }} -
    - -
    -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.ts deleted file mode 100644 index f3ee07539..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-actions/app-actions.page.ts +++ /dev/null @@ -1,220 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - Input, - Pipe, - PipeTransform, -} from '@angular/core' -import { ActivatedRoute } from '@angular/router' -import { NavController } from '@ionic/angular' -import { - isEmptyObject, - getPkgId, - WithId, - ErrorService, - LoadingService, -} from '@start9labs/shared' -import { TuiDialogService } from '@taiga-ui/core' -import { PatchDB } from 'patch-db-client' -import { filter, switchMap, timer } from 'rxjs' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { - Action, - DataModel, - PackageDataEntry, - PackageState, -} from 'src/app/services/patch-db/data-model' -import { ActionSuccessPage } from './action-success/action-success.page' -import { hasCurrentDeps } from 'src/app/util/has-deps' -import { FormDialogService } from 'src/app/services/form-dialog.service' -import { FormPage } from 'src/app/apps/ui/modals/form/form.page' -import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' -import { TUI_PROMPT } from '@taiga-ui/kit' - -@Component({ - selector: 'app-actions', - templateUrl: './app-actions.page.html', - styleUrls: ['./app-actions.page.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AppActionsPage { - readonly pkgId = getPkgId(this.route) - readonly pkg$ = this.patch - .watch$('package-data', this.pkgId) - .pipe(filter(pkg => pkg.state === PackageState.Installed)) - - constructor( - private readonly route: ActivatedRoute, - private readonly embassyApi: ApiService, - private readonly dialogs: TuiDialogService, - private readonly errorService: ErrorService, - private readonly loader: LoadingService, - private readonly navCtrl: NavController, - private readonly patch: PatchDB, - private readonly formDialog: FormDialogService, - ) {} - - async handleAction(action: WithId) { - if (action.disabled) { - this.dialogs - .open(action.disabled, { - label: 'Forbidden', - size: 's', - }) - .subscribe() - } else { - if (action['input-spec'] && !isEmptyObject(action['input-spec'])) { - this.formDialog.open(FormPage, { - label: action.name, - data: { - spec: action['input-spec'], - buttons: [ - { - text: 'Execute', - handler: async (value: any) => - this.executeAction(action.id, value), - }, - ], - }, - }) - } else { - this.dialogs - .open(TUI_PROMPT, { - label: 'Confirm', - size: 's', - data: { - content: `Are you sure you want to execute action "${ - action.name - }"? ${action.warning || ''}`, - yes: 'Execute', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => this.executeAction(action.id)) - } - } - } - - async tryUninstall(pkg: PackageDataEntry): Promise { - const { title, alerts, id } = pkg.manifest - - let content = - alerts.uninstall || - `Uninstalling ${title} will permanently delete its data` - - if (hasCurrentDeps(pkg)) { - content = `${content}. Services that depend on ${title} will no longer work properly and may crash` - } - - this.dialogs - .open(TUI_PROMPT, { - label: 'Warning', - size: 's', - data: { - content, - yes: 'Uninstall', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => this.uninstall()) - } - - private async uninstall() { - const loader = this.loader.open(`Beginning uninstall...`).subscribe() - - try { - await this.embassyApi.uninstallPackage({ id: this.pkgId }) - this.embassyApi - .setDbValue(['ack-instructions', this.pkgId], false) - .catch(e => console.error('Failed to mark instructions as unseen', e)) - this.navCtrl.navigateRoot('/services') - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } - - private async executeAction( - actionId: string, - input?: object, - ): Promise { - const loader = this.loader.open('Executing action...').subscribe() - - try { - const data = await this.embassyApi.executePackageAction({ - id: this.pkgId, - 'action-id': actionId, - input, - }) - - timer(500) - .pipe( - switchMap(() => - this.dialogs.open(new PolymorpheusComponent(ActionSuccessPage), { - label: 'Execution Complete', - data, - }), - ), - ) - .subscribe() - - return true - } catch (e: any) { - this.errorService.handleError(e) - return false - } finally { - loader.unsubscribe() - } - } - - asIsOrder() { - return 0 - } -} - -interface LocalAction { - name: string - description: string - icon: string -} - -@Component({ - selector: 'app-actions-item', - templateUrl: './app-actions-item.component.html', - styleUrls: ['./app-actions.page.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AppActionsItemComponent { - @Input({ required: true }) action!: LocalAction -} - -@Pipe({ - name: 'groupActions', -}) -export class GroupActionsPipe implements PipeTransform { - transform( - actions: PackageDataEntry['actions'], - ): Array>> | null { - if (!actions) return null - const noGroup = 'noGroup' - const grouped = Object.entries(actions).reduce< - Record[]> - >((groups, [id, action]) => { - const actionWithId = { id, ...action } - const groupKey = action.group || noGroup - if (!groups[groupKey]) { - groups[groupKey] = [actionWithId] - } else { - groups[groupKey].push(actionWithId) - } - return groups - }, {}) - - return Object.values(grouped).map(group => - group.sort((a, b) => a.name.localeCompare(b.name)), - ) - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.module.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.module.ts deleted file mode 100644 index 26e01e0ed..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { Routes, RouterModule } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { AppCredentialsPage } from './app-credentials.page' -import { - SharedPipesModule, - TextSpinnerComponentModule, -} from '@start9labs/shared' -import { SkeletonListComponentModule } from 'src/app/common/skeleton-list/skeleton-list.component.module' - -const routes: Routes = [ - { - path: '', - component: AppCredentialsPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - SharedPipesModule, - TextSpinnerComponentModule, - SkeletonListComponentModule, - ], - declarations: [AppCredentialsPage], -}) -export class AppCredentialsPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.html b/web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.html deleted file mode 100644 index f2f9ecb18..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - Credentials - - - - Refresh - - - - - - - - - - - - - - -

    No credentials

    -
    -
    - - - - - -

    {{ cred.key }}

    -

    - {{ unmasked[cred.key] ? cred.value : mask(cred.value) }} -

    -
    -
    - - - - - - -
    -
    -
    -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.scss deleted file mode 100644 index 36fb91260..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.scss +++ /dev/null @@ -1,4 +0,0 @@ -ion-note { - font-size: 16px; - color: white; -} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.ts deleted file mode 100644 index b19350897..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-credentials/app-credentials.page.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Component } from '@angular/core' -import { ActivatedRoute } from '@angular/router' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { getPkgId, CopyService, ErrorService } from '@start9labs/shared' -import { mask } from 'src/app/util/mask' - -@Component({ - selector: 'app-credentials', - templateUrl: './app-credentials.page.html', - styleUrls: ['./app-credentials.page.scss'], -}) -export class AppCredentialsPage { - readonly pkgId = getPkgId(this.route) - credentials: Record = {} - unmasked: { [key: string]: boolean } = {} - loading = true - - constructor( - private readonly route: ActivatedRoute, - private readonly embassyApi: ApiService, - private readonly errorService: ErrorService, - readonly copyService: CopyService, - ) {} - - async ngOnInit() { - await this.getCredentials() - } - - async refresh() { - await this.getCredentials() - } - - mask(value: string) { - return mask(value, 64) - } - - toggleMask(key: string) { - this.unmasked[key] = !this.unmasked[key] - } - - private async getCredentials(): Promise { - this.loading = true - try { - this.credentials = await this.embassyApi.getPackageCredentials({ - id: this.pkgId, - }) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - this.loading = false - } - } - - asIsOrder(a: any, b: any) { - return 0 - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.module.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.module.ts deleted file mode 100644 index 7d418114b..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { Routes, RouterModule } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { AppInterfacePage } from './app-interface.page' -import { InterfaceAddressesComponentModule } from 'src/app/common/interface-addresses/interface-addresses.module' - -const routes: Routes = [ - { - path: '', - component: AppInterfacePage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - InterfaceAddressesComponentModule, - ], - declarations: [AppInterfacePage], -}) -export class AppInterfacePageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.html b/web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.html deleted file mode 100644 index 21f4b6c18..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - {{ interfaceInfo.name }} - - - - -
    - -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.ts deleted file mode 100644 index a9d57952a..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-interface/app-interface.page.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' -import { ActivatedRoute } from '@angular/router' -import { PatchDB } from 'patch-db-client' -import { DataModel } from 'src/app/services/patch-db/data-model' -import { getPkgId } from '@start9labs/shared' - -@Component({ - selector: 'app-interface', - templateUrl: './app-interface.page.html', - styleUrls: ['./app-interface.page.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AppInterfacePage { - readonly pkgId = getPkgId(this.route) - readonly interfaceId = this.route.snapshot.paramMap.get('interfaceId')! - - readonly interfaceInfo$ = this.patch.watch$( - 'package-data', - this.pkgId, - 'installed', - 'interfaceInfo', - this.interfaceId, - ) - - constructor( - private readonly route: ActivatedRoute, - private readonly patch: PatchDB, - ) {} -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.html deleted file mode 100644 index 90bda33b9..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -
    -
    -
    -
    - - -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.scss deleted file mode 100644 index d189732b5..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.scss +++ /dev/null @@ -1,22 +0,0 @@ -.bulb { - position: absolute !important; - top: 9px !important; - height: 14px; - width: 14px; - border-radius: 100%; -} - -.warning-icon { - position: absolute !important; - top: 8px !important; - left: 11px !important; - font-size: 12px; - border-radius: 100%; - padding: 1px; -} - -.spinner { - position: absolute !important; - top: 6px !important; - width: 18px; -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.ts deleted file mode 100644 index 2692a91fe..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-icon/app-list-icon.component.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { ChangeDetectionStrategy, Component, Input } from '@angular/core' -import { ConnectionService } from 'src/app/services/connection.service' -import { PkgInfo } from 'src/app/types/pkg-info' - -@Component({ - selector: 'app-list-icon', - templateUrl: 'app-list-icon.component.html', - styleUrls: ['app-list-icon.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AppListIconComponent { - @Input({ required: true }) - pkg!: PkgInfo - - readonly connected$ = this.connectionService.connected$ - - constructor(private readonly connectionService: ConnectionService) {} -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.html deleted file mode 100644 index 52c2bf14a..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - -

    {{ manifest.title }}

    -

    {{ manifest.version | displayEmver }}

    - -
    - - - - - - - - -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.scss deleted file mode 100644 index c7a3fb9de..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -img { - border-radius: 100%; -} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.ts deleted file mode 100644 index dcb792718..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/app-list-pkg.component.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - Inject, - Input, - ViewChild, -} from '@angular/core' -import { LaunchMenuComponent } from './launch-menu/launch-menu.component' -import { PackageMainStatus } from 'src/app/services/patch-db/data-model' -import { PkgInfo } from 'src/app/types/pkg-info' -import { DOCUMENT } from '@angular/common' - -@Component({ - selector: 'app-list-pkg', - templateUrl: 'app-list-pkg.component.html', - styleUrls: ['app-list-pkg.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AppListPkgComponent { - @ViewChild('launchMenu') launchMenu!: LaunchMenuComponent - - @Input({ required: true }) - pkg!: PkgInfo - - get status(): PackageMainStatus { - return ( - this.pkg.entry.installed?.status.main.status || PackageMainStatus.Stopped - ) - } - - constructor(@Inject(DOCUMENT) private readonly document: Document) {} - - openPopover(e: Event): void { - e.stopPropagation() - e.preventDefault() - this.launchMenu.event = e - this.launchMenu.isOpen = true - } - - launchUI(address: string, e: Event) { - e.stopPropagation() - e.preventDefault() - this.document.defaultView?.open(address, '_blank', 'noreferrer') - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.html deleted file mode 100644 index c54aa4b25..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - -

    {{ iface.name }}

    -

    {{ iface.address }}

    -
    - -
    -
    -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.scss deleted file mode 100644 index 70adf02c0..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -ion-popover { - --min-width: 360px; -} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.ts deleted file mode 100644 index b6f4bfd22..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.component.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { DOCUMENT } from '@angular/common' -import { - ChangeDetectionStrategy, - Component, - Inject, - Input, - ViewChild, -} from '@angular/core' -import { InstalledPackageInfo } from 'src/app/services/patch-db/data-model' -import { LaunchableInterface } from '../launchable-interfaces.pipe' - -@Component({ - selector: 'launch-menu', - templateUrl: 'launch-menu.component.html', - styleUrls: ['launch-menu.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class LaunchMenuComponent { - @ViewChild('popover') popover!: HTMLIonPopoverElement - - @Input({ required: true }) - launchableInterfaces!: LaunchableInterface[] - - set isOpen(open: boolean) { - this.popover.isOpen = open - } - - set event(event: Event) { - this.popover.event = event - } - - constructor(@Inject(DOCUMENT) private readonly document: Document) {} - - launchUI(address: string) { - this.document.defaultView?.open(address, '_blank', 'noreferrer') - this.popover.isOpen = false - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.module.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.module.ts deleted file mode 100644 index eba343572..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launch-menu/launch-menu.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { LaunchMenuComponent } from './launch-menu.component' - -@NgModule({ - declarations: [LaunchMenuComponent], - imports: [CommonModule, IonicModule], - exports: [LaunchMenuComponent], -}) -export class LaunchMenuComponentModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launchable-interfaces.pipe.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launchable-interfaces.pipe.ts deleted file mode 100644 index 8da2a0319..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list-pkg/launchable-interfaces.pipe.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core' -import { ConfigService } from 'src/app/services/config.service' -import { InstalledPackageInfo } from 'src/app/services/patch-db/data-model' - -@Pipe({ - name: 'launchableInterfaces', -}) -export class LaunchableInterfacesPipe implements PipeTransform { - constructor(private readonly config: ConfigService) {} - - transform( - interfaceInfo: InstalledPackageInfo['interfaceInfo'], - ): LaunchableInterface[] { - return Object.values(interfaceInfo) - .filter(info => info.type === 'ui') - .map(info => ({ - name: info.name, - address: this.config.launchableAddress(info), - })) - } -} - -export type LaunchableInterface = { - name: string - address: string -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.module.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.module.ts deleted file mode 100644 index 87b65a33c..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.module.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { Routes, RouterModule } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { AppListPage } from './app-list.page' -import { - EmverPipesModule, - ResponsiveColDirective, - TextSpinnerComponentModule, - TickerModule, -} from '@start9labs/shared' -import { BadgeMenuComponentModule } from 'src/app/common/badge-menu-button/badge-menu.component.module' -import { WidgetListComponentModule } from 'src/app/common/widget-list/widget-list.component.module' -import { StatusComponentModule } from '../status/status.component.module' -import { AppListIconComponent } from './app-list-icon/app-list-icon.component' -import { AppListPkgComponent } from './app-list-pkg/app-list-pkg.component' -import { PackageInfoPipe } from './package-info.pipe' -import { LaunchMenuComponentModule } from './app-list-pkg/launch-menu/launch-menu.module' -import { LaunchableInterfacesPipe } from './app-list-pkg/launchable-interfaces.pipe' - -const routes: Routes = [ - { - path: '', - component: AppListPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - StatusComponentModule, - EmverPipesModule, - TextSpinnerComponentModule, - IonicModule, - RouterModule.forChild(routes), - BadgeMenuComponentModule, - WidgetListComponentModule, - ResponsiveColDirective, - TickerModule, - LaunchMenuComponentModule, - ], - declarations: [ - AppListPage, - AppListIconComponent, - AppListPkgComponent, - PackageInfoPipe, - LaunchableInterfacesPipe, - ], -}) -export class AppListPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.html b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.html deleted file mode 100644 index 3bc38f762..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.html +++ /dev/null @@ -1,43 +0,0 @@ - - - Installed Services - - - - - - - - - - -
    -

    Welcome to StartOS

    -
    - -
    - - - - - - - - - - -
    - - - - - -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.scss deleted file mode 100644 index 360689817..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.scss +++ /dev/null @@ -1,9 +0,0 @@ -.welcome-header { - padding-bottom: 1rem; - text-align: center; - - h1 { - font-weight: bold; - font-size: 2rem; - } -} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.ts deleted file mode 100644 index a16ae01e4..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-list/app-list.page.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' -import { PatchDB } from 'patch-db-client' -import { filter, map, pairwise, startWith } from 'rxjs' -import { DataModel } from 'src/app/services/patch-db/data-model' - -@Component({ - selector: 'app-list', - templateUrl: './app-list.page.html', - styleUrls: ['./app-list.page.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AppListPage { - readonly pkgs$ = this.patch.watch$('package-data').pipe( - map(pkgs => Object.values(pkgs)), - startWith([]), - pairwise(), - filter(([prev, next]) => { - const length = next.length - return !length || prev.length !== length - }), - map(([_, pkgs]) => - pkgs.sort((a, b) => - b.manifest.title.toLowerCase() > a.manifest.title.toLowerCase() - ? -1 - : 1, - ), - ), - ) - - constructor(private readonly patch: PatchDB) {} -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-list/package-info.pipe.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-list/package-info.pipe.ts deleted file mode 100644 index 96b28172e..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-list/package-info.pipe.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core' -import { Observable, combineLatest } from 'rxjs' -import { filter, map } from 'rxjs/operators' -import { DataModel } from 'src/app/services/patch-db/data-model' -import { getPackageInfo } from 'src/app/util/get-package-info' -import { PkgInfo } from 'src/app/types/pkg-info' -import { PatchDB } from 'patch-db-client' -import { DepErrorService } from 'src/app/services/dep-error.service' - -@Pipe({ - name: 'packageInfo', -}) -export class PackageInfoPipe implements PipeTransform { - constructor( - private readonly patch: PatchDB, - private readonly depErrorService: DepErrorService, - ) {} - - transform(pkgId: string): Observable { - return combineLatest([ - this.patch.watch$('package-data', pkgId).pipe(filter(Boolean)), - this.depErrorService.getPkgDepErrors$(pkgId), - ]).pipe(map(([pkg, depErrors]) => getPackageInfo(pkg, depErrors))) - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.module.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.module.ts deleted file mode 100644 index cbaa4b59a..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { Routes, RouterModule } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { AppLogsPage } from './app-logs.page' -import { LogsComponentModule } from 'src/app/common/logs/logs.component.module' - -const routes: Routes = [ - { - path: '', - component: AppLogsPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - LogsComponentModule, - ], - declarations: [AppLogsPage], -}) -export class AppLogsPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.html b/web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.html deleted file mode 100644 index 4617646f5..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.html +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.ts deleted file mode 100644 index 103d0bc0e..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-logs/app-logs.page.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Component } from '@angular/core' -import { ActivatedRoute } from '@angular/router' -import { getPkgId } from '@start9labs/shared' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { RR } from 'src/app/services/api/api.types' - -@Component({ - selector: 'app-logs', - templateUrl: './app-logs.page.html', - styleUrls: ['./app-logs.page.scss'], -}) -export class AppLogsPage { - readonly pkgId = getPkgId(this.route) - - constructor( - private readonly route: ActivatedRoute, - private readonly embassyApi: ApiService, - ) {} - - followLogs() { - return async (params: RR.FollowServerLogsReq) => { - return this.embassyApi.followPackageLogs({ - id: this.pkgId, - ...params, - }) - } - } - - fetchLogs() { - return async (params: RR.GetServerLogsReq) => { - return this.embassyApi.getPackageLogs({ - id: this.pkgId, - ...params, - }) - } - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts deleted file mode 100644 index 43c95b522..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.module.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { Routes, RouterModule } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { AppShowPage } from './app-show.page' -import { - EmverPipesModule, - ResponsiveColDirective, - SharedPipesModule, -} from '@start9labs/shared' -import { StatusComponentModule } from '../status/status.component.module' -import { AppConfigPageModule } from './modals/app-config/app-config.module' -import { AppShowHeaderComponent } from './components/app-show-header/app-show-header.component' -import { AppShowProgressComponent } from './components/app-show-progress/app-show-progress.component' -import { AppShowStatusComponent } from './components/app-show-status/app-show-status.component' -import { AppShowDependenciesComponent } from './components/app-show-dependencies/app-show-dependencies.component' -import { AppShowMenuComponent } from './components/app-show-menu/app-show-menu.component' -import { - AppShowInterfacesComponent, - InterfaceInfoPipe, -} from './components/app-show-interfaces/app-show-interfaces.component' -import { AppShowHealthChecksComponent } from './components/app-show-health-checks/app-show-health-checks.component' -import { AppShowAdditionalComponent } from './components/app-show-additional/app-show-additional.component' -import { HealthColorPipe } from './pipes/health-color.pipe' -import { ProgressDataPipe } from './pipes/progress-data.pipe' -import { InsecureWarningComponentModule } from 'src/app/common/insecure-warning/insecure-warning.module' -import { LaunchMenuComponentModule } from '../app-list/app-list-pkg/launch-menu/launch-menu.module' - -const routes: Routes = [ - { - path: '', - component: AppShowPage, - }, -] - -@NgModule({ - declarations: [ - AppShowPage, - HealthColorPipe, - ProgressDataPipe, - AppShowHeaderComponent, - AppShowProgressComponent, - AppShowStatusComponent, - AppShowDependenciesComponent, - AppShowMenuComponent, - AppShowInterfacesComponent, - AppShowHealthChecksComponent, - AppShowAdditionalComponent, - InterfaceInfoPipe, - ], - imports: [ - CommonModule, - StatusComponentModule, - IonicModule, - RouterModule.forChild(routes), - AppConfigPageModule, - EmverPipesModule, - ResponsiveColDirective, - SharedPipesModule, - InsecureWarningComponentModule, - LaunchMenuComponentModule, - ], - exports: [InterfaceInfoPipe], -}) -export class AppShowPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.page.html b/web/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.page.html deleted file mode 100644 index 0f23cb8e9..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.page.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.page.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.page.ts deleted file mode 100644 index 6952a1c9f..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/app-show.page.ts +++ /dev/null @@ -1,232 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' -import { NavController } from '@ionic/angular' -import { PatchDB } from 'patch-db-client' -import { - DataModel, - PackageDataEntry, - PackageState, - InstalledPackageInfo, -} from 'src/app/services/patch-db/data-model' -import { - PackageStatus, - PrimaryStatus, - renderPkgStatus, -} from 'src/app/services/pkg-status-rendering.service' -import { map, tap } from 'rxjs/operators' -import { ActivatedRoute, NavigationExtras } from '@angular/router' -import { getPkgId } from '@start9labs/shared' -import { DependentInfo } from 'src/app/types/dependent-info' -import { - DepErrorService, - DependencyErrorType, - PkgDependencyErrors, -} from 'src/app/services/dep-error.service' -import { Observable, combineLatest } from 'rxjs' -import { Manifest } from '@start9labs/marketplace' -import { - AppConfigPage, - PackageConfigData, -} from './modals/app-config/app-config.page' -import { FormDialogService } from 'src/app/services/form-dialog.service' - -export interface DependencyInfo { - id: string - title: string - icon: string - version: string - errorText: string - actionText: string - action: () => any -} - -const STATES = [ - PackageState.Installing, - PackageState.Updating, - PackageState.Restoring, -] - -@Component({ - selector: 'app-show', - templateUrl: './app-show.page.html', - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AppShowPage { - readonly pkgId = getPkgId(this.route) - - readonly pkgPlus$ = combineLatest([ - this.patch.watch$('package-data', this.pkgId), - this.depErrorService.getPkgDepErrors$(this.pkgId), - ]).pipe( - tap(([pkg, _]) => { - // if package disappears, navigate to list page - if (!pkg) this.navCtrl.navigateRoot('/services') - }), - map(([pkg, depErrors]) => { - return { - pkg, - dependencies: this.getDepInfo(pkg, depErrors), - status: renderPkgStatus(pkg, depErrors), - } - }), - ) - - constructor( - private readonly route: ActivatedRoute, - private readonly navCtrl: NavController, - private readonly patch: PatchDB, - private readonly depErrorService: DepErrorService, - private readonly formDialog: FormDialogService, - ) {} - - isInstalled({ state }: PackageDataEntry): boolean { - return state === PackageState.Installed - } - - isRunning({ primary }: PackageStatus): boolean { - return primary === PrimaryStatus.Running - } - - isBackingUp({ primary }: PackageStatus): boolean { - return primary === PrimaryStatus.BackingUp - } - - showProgress({ state }: PackageDataEntry): boolean { - return STATES.includes(state) - } - - private getDepInfo( - pkg: PackageDataEntry, - depErrors: PkgDependencyErrors, - ): DependencyInfo[] { - const pkgInstalled = pkg.installed - - if (!pkgInstalled) return [] - - const pkgManifest = pkg.manifest - - return Object.keys(pkgInstalled['current-dependencies']) - .filter(depId => !!pkg.manifest.dependencies[depId]) - .map(depId => - this.getDepValues(pkgInstalled, pkgManifest, depId, depErrors), - ) - } - - private getDepValues( - pkgInstalled: InstalledPackageInfo, - pkgManifest: Manifest, - depId: string, - depErrors: PkgDependencyErrors, - ): DependencyInfo { - const { errorText, fixText, fixAction } = this.getDepErrors( - pkgManifest, - depId, - depErrors, - ) - - const depInfo = pkgInstalled['dependency-info'][depId] - - return { - id: depId, - version: pkgManifest.dependencies[depId].version, // do we want this version range? - title: depInfo?.title || depId, - icon: depInfo?.icon || '', - errorText: errorText - ? `${errorText}. ${pkgManifest.title} will not work as expected.` - : '', - actionText: fixText || 'View', - action: - fixAction || (() => this.navCtrl.navigateForward(`/services/${depId}`)), - } - } - - private getDepErrors( - pkgManifest: Manifest, - depId: string, - depErrors: PkgDependencyErrors, - ) { - const depError = (depErrors[pkgManifest.id] as any)?.[depId] // @TODO fix - - let errorText: string | null = null - let fixText: string | null = null - let fixAction: (() => any) | null = null - - if (depError) { - if (depError.type === DependencyErrorType.NotInstalled) { - errorText = 'Not installed' - fixText = 'Install' - fixAction = () => this.fixDep(pkgManifest, 'install', depId) - } else if (depError.type === DependencyErrorType.IncorrectVersion) { - errorText = 'Incorrect version' - fixText = 'Update' - fixAction = () => this.fixDep(pkgManifest, 'update', depId) - } else if (depError.type === DependencyErrorType.ConfigUnsatisfied) { - errorText = 'Config not satisfied' - fixText = 'Auto config' - fixAction = () => this.fixDep(pkgManifest, 'configure', depId) - } else if (depError.type === DependencyErrorType.NotRunning) { - errorText = 'Not running' - fixText = 'Start' - } else if (depError.type === DependencyErrorType.HealthChecksFailed) { - errorText = 'Required health check not passing' - } else if (depError.type === DependencyErrorType.Transitive) { - errorText = 'Dependency has a dependency issue' - } - } - - return { - errorText, - fixText, - fixAction, - } - } - - private async fixDep( - pkgManifest: Manifest, - action: 'install' | 'update' | 'configure', - id: string, - ): Promise { - switch (action) { - case 'install': - case 'update': - return this.installDep(pkgManifest, id) - case 'configure': - return this.configureDep(pkgManifest, id) - } - } - - private async installDep(manifest: Manifest, depId: string): Promise { - const version = manifest.dependencies[depId].version - - const dependentInfo: DependentInfo = { - id: manifest.id, - title: manifest.title, - version, - } - const navigationExtras: NavigationExtras = { - state: { dependentInfo }, - } - - await this.navCtrl.navigateForward( - `/marketplace/${depId}`, - navigationExtras, - ) - } - - private async configureDep( - manifest: Manifest, - dependencyId: string, - ): Promise { - const dependentInfo: DependentInfo = { - id: manifest.id, - title: manifest.title, - } - - return this.formDialog.open(AppConfigPage, { - label: 'Config', - data: { - pkgId: dependencyId, - dependentInfo, - }, - }) - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.html deleted file mode 100644 index e337dd202..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.html +++ /dev/null @@ -1,109 +0,0 @@ -Additional Info - - - - - - -

    Installed

    -

    {{ pkg.installed?.['installed-at'] | date : 'medium' }}

    -
    -
    - - -

    Git Hash

    -

    {{ gitHash }}

    -
    - -
    - - - -

    Git Hash

    -

    Unknown

    -
    -
    -
    - - -

    License

    -

    {{ manifest.license }}

    -
    - -
    - - -

    Website

    -

    {{ manifest['marketing-site'] || 'Not provided' }}

    -
    - -
    -
    -
    - - - - -

    Source Repository

    -

    {{ manifest['upstream-repo'] }}

    -
    - -
    - - -

    Wrapper Repository

    -

    {{ manifest['wrapper-repo'] }}

    -
    - -
    - - -

    Support Site

    -

    {{ manifest['support-site'] || 'Not provided' }}

    -
    - -
    - - -

    Donation Link

    -

    {{ manifest['donation-url'] || 'Not provided' }}

    -
    - -
    -
    -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.ts deleted file mode 100644 index bd35ee3ae..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-additional/app-show-additional.component.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { ChangeDetectionStrategy, Component, Input } from '@angular/core' -import { CopyService, MarkdownComponent } from '@start9labs/shared' -import { TuiDialogService } from '@taiga-ui/core' -import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' -import { from } from 'rxjs' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { PackageDataEntry } from 'src/app/services/patch-db/data-model' - -@Component({ - selector: 'app-show-additional', - templateUrl: 'app-show-additional.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AppShowAdditionalComponent { - @Input({ required: true }) - pkg!: PackageDataEntry - - constructor( - readonly copyService: CopyService, - private readonly dialogs: TuiDialogService, - private readonly api: ApiService, - ) {} - - presentModalLicense() { - const { id, version } = this.pkg.manifest - - this.dialogs - .open(new PolymorpheusComponent(MarkdownComponent), { - label: 'License', - size: 'l', - data: { - content: from( - this.api.getStatic( - `/public/package-data/${id}/${version}/LICENSE.md`, - ), - ), - }, - }) - .subscribe() - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.html deleted file mode 100644 index e9f7b97d7..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.html +++ /dev/null @@ -1,29 +0,0 @@ -Dependencies - - - - - - -

    - - {{ dep.title }} -

    -

    {{ dep.version | displayEmver }}

    -

    - - {{ dep.errorText || 'satisfied' }} - -

    -
    - - {{ dep.actionText }} - - -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.scss deleted file mode 100644 index b1f9a952f..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.scss +++ /dev/null @@ -1,7 +0,0 @@ -.icon { - padding-right: 4px; -} - -img { - border-radius: 100%; -} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.ts deleted file mode 100644 index 3a2fee53b..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-dependencies/app-show-dependencies.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ChangeDetectionStrategy, Component, Input } from '@angular/core' -import { DependencyInfo } from '../../app-show.page' - -@Component({ - selector: 'app-show-dependencies', - templateUrl: './app-show-dependencies.component.html', - styleUrls: ['./app-show-dependencies.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AppShowDependenciesComponent { - @Input() - dependencies: DependencyInfo[] = [] -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.html deleted file mode 100644 index ff3602986..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - -
    - - -

    - {{ pkg.manifest.title }} -

    -

    {{ pkg.manifest.version | displayEmver }}

    -
    -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.scss deleted file mode 100644 index 49557dd5b..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.scss +++ /dev/null @@ -1,17 +0,0 @@ -.less-large { - font-size: 18px !important; -} - -.header { - display: flex; -} - -.logo { - height: 54px; - width: 54px; - margin: 0 16px; -} - -img { - border-radius: 100%; -} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.ts deleted file mode 100644 index 0d37b9af1..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-header/app-show-header.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ChangeDetectionStrategy, Component, Input } from '@angular/core' -import { PackageDataEntry } from 'src/app/services/patch-db/data-model' - -@Component({ - selector: 'app-show-header', - templateUrl: './app-show-header.component.html', - styleUrls: ['./app-show-header.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AppShowHeaderComponent { - @Input({ required: true }) - pkg!: PackageDataEntry -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.html deleted file mode 100644 index 209056834..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.html +++ /dev/null @@ -1,82 +0,0 @@ - - Health Checks - - - - - - - - - - -

    - {{ check.name }} -

    - -

    - {{ result | titlecase }} - ... - - {{ $any(check).error }} - - - {{ $any(check).message }} - - - : - {{ $any(check).message }} - -

    -
    -
    -
    - - - - -

    - {{ check.name }} -

    -

    Awaiting result...

    -
    -
    -
    -
    - - - - - - - - - - - - -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.scss deleted file mode 100644 index db58b129d..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.scss +++ /dev/null @@ -1,24 +0,0 @@ -.icon-spinner { - height: 20px; - width: 20px; -} - -.avatar { - width: 20px; - height: 20px; - border-radius: 0; -} - -.label { - width: 100px; - margin-bottom: 10px; -} - -.description { - width: 150px; - margin-bottom: 10px; -} - -.bold { - font-weight: bold; -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.ts deleted file mode 100644 index f2b5e96ce..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-health-checks/app-show-health-checks.component.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { ChangeDetectionStrategy, Component, Input } from '@angular/core' -import { PatchDB } from 'patch-db-client' -import { map } from 'rxjs' -import { ConnectionService } from 'src/app/services/connection.service' -import { DataModel, HealthResult } from 'src/app/services/patch-db/data-model' -import { isEmptyObject } from '@start9labs/shared' - -@Component({ - selector: 'app-show-health-checks', - templateUrl: './app-show-health-checks.component.html', - styleUrls: ['./app-show-health-checks.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AppShowHealthChecksComponent { - @Input({ required: true }) pkgId!: string - - readonly connected$ = this.connectionService.connected$ - - get healthChecks$() { - return this.patch - .watch$('package-data', this.pkgId, 'installed', 'status', 'main') - .pipe( - map(main => { - if (main.status !== 'running' || isEmptyObject(main.health)) - return null - return Object.values(main.health) - }), - ) - } - - constructor( - private readonly connectionService: ConnectionService, - private readonly patch: PatchDB, - ) {} - - isLoading(result: HealthResult): boolean { - return result === HealthResult.Starting || result === HealthResult.Loading - } - - isReady(result: HealthResult): boolean { - return result !== HealthResult.Failure && result !== HealthResult.Loading - } - - asIsOrder() { - return 0 - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.html deleted file mode 100644 index 737b5bbc1..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.html +++ /dev/null @@ -1,25 +0,0 @@ -Interfaces - - - -

    {{ info.name }}

    -

    {{ info.description }}

    -

    - {{ info.typeDetail }} -

    -
    - - - -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.ts deleted file mode 100644 index d248a0a3a..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-interfaces/app-show-interfaces.component.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { DOCUMENT } from '@angular/common' -import { - ChangeDetectionStrategy, - Component, - Inject, - Input, -} from '@angular/core' -import { ConfigService } from 'src/app/services/config.service' -import { - InstalledPackageInfo, - InterfaceInfo, -} from 'src/app/services/patch-db/data-model' -import { Pipe, PipeTransform } from '@angular/core' - -@Component({ - selector: 'app-show-interfaces', - templateUrl: './app-show-interfaces.component.html', - styleUrls: ['./app-show-interfaces.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AppShowInterfacesComponent { - @Input({ required: true }) - pkg!: InstalledPackageInfo - - constructor( - private readonly config: ConfigService, - @Inject(DOCUMENT) private readonly document: Document, - ) {} - - launchUI(info: InterfaceInfo, e: Event) { - e.stopPropagation() - e.preventDefault() - this.document.defaultView?.open( - this.config.launchableAddress(info), - '_blank', - 'noreferrer', - ) - } -} - -@Pipe({ - name: 'interfaceInfo', -}) -export class InterfaceInfoPipe implements PipeTransform { - transform(info: InstalledPackageInfo['interfaceInfo']) { - return Object.entries(info).map(([id, val]) => { - let color: string - let icon: string - let typeDetail: string - - switch (val.type) { - case 'ui': - color = 'primary' - icon = 'desktop-outline' - typeDetail = 'User Interface (UI)' - break - case 'p2p': - color = 'secondary' - icon = 'people-outline' - typeDetail = 'Peer-To-Peer Interface (P2P)' - break - case 'api': - color = 'tertiary' - icon = 'terminal-outline' - typeDetail = 'Application Program Interface (API)' - break - case 'other': - color = 'dark' - icon = 'cube-outline' - typeDetail = 'Unknown Interface Type' - break - } - - return { - ...val, - id, - color, - icon, - typeDetail, - } - }) - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.html deleted file mode 100644 index c57070d8c..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.html +++ /dev/null @@ -1,96 +0,0 @@ -Menu - - - - - -

    Instructions

    -

    Understand how to use {{ pkg.manifest.title }}

    -
    -
    - - - - - -

    Config

    -

    Customize {{ pkg.manifest.title }}

    -
    -
    - - - - - -

    Credentials

    -

    Password, keys, or other credentials of interest

    -
    -
    - - - - - -

    Actions

    -

    Uninstall and other commands specific to {{ pkg.manifest.title }}

    -
    -
    - - - - - -

    Outbound Proxy

    -

    Proxy all outbound traffic from {{ pkg.manifest.title }}

    -

    - - {{ - !proxy.value - ? 'None' - : proxy.value === 'primary' - ? 'System Primary' - : proxy.value === 'mirror' - ? 'Mirror P2P' - : proxy.value.proxyId - }} - -

    -
    -
    - - - - - -

    Logs

    -

    Raw, unfiltered logs

    -
    -
    - - - - - -

    Marketplace Listing

    -

    View service in the marketplace

    -
    -
    - - - - -

    Marketplace Listing

    -

    This package was not installed from the marketplace

    -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.scss deleted file mode 100644 index f31b84ed5..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.scss +++ /dev/null @@ -1,6 +0,0 @@ -.highlighted { - * { - color: var(--ion-color-dark); - font-weight: bold; - } -} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.ts deleted file mode 100644 index 237429bd2..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-menu/app-show-menu.component.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { ChangeDetectionStrategy, Component, Input } from '@angular/core' -import { - DataModel, - PackageDataEntry, -} from 'src/app/services/patch-db/data-model' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { TuiDialogService } from '@taiga-ui/core' -import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' -import { MarkdownComponent } from '@start9labs/shared' -import { from, map } from 'rxjs' -import { PatchDB } from 'patch-db-client' -import { NavController } from '@ionic/angular' -import { ActivatedRoute, Params } from '@angular/router' -import { FormDialogService } from 'src/app/services/form-dialog.service' -import { ProxyService } from 'src/app/services/proxy.service' -import { - AppConfigPage, - PackageConfigData, -} from '../../modals/app-config/app-config.page' - -@Component({ - selector: 'app-show-menu', - templateUrl: './app-show-menu.component.html', - styleUrls: ['./app-show-menu.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AppShowMenuComponent { - @Input({ required: true }) - pkg!: PackageDataEntry - - get highlighted$() { - return this.patch - .watch$('ui', 'ack-instructions', this.pkg.manifest.id) - .pipe(map(seen => !seen)) - } - - constructor( - private readonly route: ActivatedRoute, - private readonly navCtrl: NavController, - private readonly dialogs: TuiDialogService, - private readonly formDialog: FormDialogService, - private readonly api: ApiService, - readonly patch: PatchDB, - private readonly proxyService: ProxyService, - ) {} - - async presentModalInstructions() { - const { id, version } = this.pkg.manifest - - this.api - .setDbValue(['ack-instructions', id], true) - .catch(e => console.error('Failed to mark instructions as seen', e)) - - this.dialogs - .open(new PolymorpheusComponent(MarkdownComponent), { - label: 'Instructions', - size: 'l', - data: { - content: from( - this.api.getStatic( - `/public/package-data/${id}/${version}/INSTRUCTIONS.md`, - ), - ), - }, - }) - .subscribe() - } - - openConfig() { - this.formDialog.open(AppConfigPage, { - label: `${this.pkg.manifest.title} configuration`, - data: { pkgId: this.pkg.manifest.id }, - }) - } - - setOutboundProxy() { - this.proxyService.presentModalSetOutboundProxy({ - packageId: this.pkg.manifest.id, - outboundProxy: this.pkg.installed!.outboundProxy, - hasP2P: Object.values(this.pkg.installed!.interfaceInfo).some( - i => i.type === 'p2p', - ), - }) - } - - navigate(path: string, qp?: Params) { - return this.navCtrl.navigateForward([path], { - relativeTo: this.route, - queryParams: qp, - }) - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.html deleted file mode 100644 index 3134cee5e..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.html +++ /dev/null @@ -1,20 +0,0 @@ -

    Downloading: {{ progressData.downloadProgress }}%

    - - -

    Validating: {{ progressData.validateProgress }}%

    - - -

    Unpacking: {{ progressData.unpackProgress }}%

    - diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.scss deleted file mode 100644 index 7ffd8ed70..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.scss +++ /dev/null @@ -1,4 +0,0 @@ -:host { - display: block; - padding: 16px; -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.ts deleted file mode 100644 index f902d42f0..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-progress/app-show-progress.component.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { ChangeDetectionStrategy, Component, Input } from '@angular/core' -import { - InstallProgress, - PackageDataEntry, -} from 'src/app/services/patch-db/data-model' -import { ProgressData } from 'src/app/types/progress-data' - -@Component({ - selector: 'app-show-progress', - templateUrl: './app-show-progress.component.html', - styleUrls: ['./app-show-progress.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AppShowProgressComponent { - @Input({ required: true }) - pkg!: PackageDataEntry - - @Input({ required: true }) - progressData!: ProgressData - - get unpackingBuffer(): number { - return this.progressData.validateProgress === 100 && - !this.progressData.unpackProgress - ? 0 - : 1 - } - - get validationBuffer(): number { - return this.progressData.downloadProgress === 100 && - !this.progressData.validateProgress - ? 0 - : 1 - } - - getColor(action: keyof InstallProgress): string { - return this.pkg['install-progress']?.[action] ? 'success' : 'secondary' - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.html b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.html deleted file mode 100644 index e8cc07e66..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.html +++ /dev/null @@ -1,59 +0,0 @@ -Status - - - - - - - - - - - - - Stop - - - - - Restart - - - - - - Start - - - - - Configure - - - - - diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.scss deleted file mode 100644 index d6b8b47fb..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.scss +++ /dev/null @@ -1,9 +0,0 @@ -.label { - overflow: visible; -} - -.action-button { - margin: 12px 20px 10px 0; - min-height: 42px; - min-width: 140px; -} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.ts deleted file mode 100644 index 164edd6f4..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/components/app-show-status/app-show-status.component.ts +++ /dev/null @@ -1,221 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - Input, - ViewChild, -} from '@angular/core' -import { ErrorService, LoadingService } from '@start9labs/shared' -import { TuiDialogService } from '@taiga-ui/core' -import { TUI_PROMPT } from '@taiga-ui/kit' -import { PatchDB } from 'patch-db-client' -import { filter } from 'rxjs' -import { - PackageStatus, - PrimaryRendering, - PrimaryStatus, - StatusRendering, -} from 'src/app/services/pkg-status-rendering.service' -import { - DataModel, - InterfaceInfo, - PackageDataEntry, - PackageState, -} from 'src/app/services/patch-db/data-model' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { FormDialogService } from 'src/app/services/form-dialog.service' -import { - AppConfigPage, - PackageConfigData, -} from '../../modals/app-config/app-config.page' -import { hasCurrentDeps } from 'src/app/util/has-deps' -import { ConnectionService } from 'src/app/services/connection.service' -import { LaunchMenuComponent } from '../../../app-list/app-list-pkg/launch-menu/launch-menu.component' - -@Component({ - selector: 'app-show-status', - templateUrl: './app-show-status.component.html', - styleUrls: ['./app-show-status.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AppShowStatusComponent { - @ViewChild('launchMenu') launchMenu!: LaunchMenuComponent - - @Input({ required: true }) - pkg!: PackageDataEntry - - @Input({ required: true }) - status!: PackageStatus - - PR = PrimaryRendering - - readonly connected$ = this.connectionService.connected$ - - constructor( - private readonly dialogs: TuiDialogService, - private readonly errorService: ErrorService, - private readonly loader: LoadingService, - private readonly embassyApi: ApiService, - private readonly formDialog: FormDialogService, - private readonly connectionService: ConnectionService, - private readonly patch: PatchDB, - ) {} - - private get id(): string { - return this.pkg.manifest.id - } - - get interfaceInfo(): Record { - return this.pkg.installed!['interfaceInfo'] - } - - get isConfigured(): boolean { - return this.pkg.installed!.status.configured - } - - get isInstalled(): boolean { - return this.pkg.state === PackageState.Installed - } - - get isRunning(): boolean { - return this.status.primary === PrimaryStatus.Running - } - - get canStop(): boolean { - return [ - PrimaryStatus.Running, - PrimaryStatus.Starting, - PrimaryStatus.Restarting, - ].includes(this.status.primary as PrimaryStatus) - } - - get isStopped(): boolean { - return this.status.primary === PrimaryStatus.Stopped - } - - get rendering(): StatusRendering { - return PrimaryRendering[this.status.primary] - } - - presentModalConfig(): void { - this.formDialog.open(AppConfigPage, { - label: `${this.pkg.manifest.title} configuration`, - data: { pkgId: this.id }, - }) - } - - async tryStart(): Promise { - if (this.status.dependency === 'warning') { - const depErrMsg = `${this.pkg.manifest.title} has unmet dependencies. It will not work as expected.` - const proceed = await this.presentAlertStart(depErrMsg) - - if (!proceed) return - } - - const alertMsg = this.pkg.manifest.alerts.start - - if (alertMsg) { - const proceed = await this.presentAlertStart(alertMsg) - - if (!proceed) return - } - - this.start() - } - - async tryStop(): Promise { - const { title, alerts } = this.pkg.manifest - - let content = alerts.stop || '' - if (hasCurrentDeps(this.pkg)) { - const depMessage = `Services that depend on ${title} will no longer work properly and may crash` - content = content ? `${content}.\n\n${depMessage}` : depMessage - } - - if (content) { - this.dialogs - .open(TUI_PROMPT, { - label: 'Warning', - size: 's', - data: { - content, - yes: 'Stop', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => this.stop()) - } else { - this.stop() - } - } - - async tryRestart(): Promise { - if (hasCurrentDeps(this.pkg)) { - this.dialogs - .open(TUI_PROMPT, { - label: 'Warning', - size: 's', - data: { - content: `Services that depend on ${this.pkg.manifest} may temporarily experiences issues`, - yes: 'Restart', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => this.restart()) - } else { - this.restart() - } - } - - private async start(): Promise { - const loader = this.loader.open(`Starting...`).subscribe() - - try { - await this.embassyApi.startPackage({ id: this.id }) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } - - private async stop(): Promise { - const loader = this.loader.open(`Stopping...`).subscribe() - - try { - await this.embassyApi.stopPackage({ id: this.id }) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } - - private async restart(): Promise { - const loader = this.loader.open(`Restarting...`).subscribe() - - try { - await this.embassyApi.restartPackage({ id: this.id }) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } - private async presentAlertStart(content: string): Promise { - return new Promise(async resolve => { - this.dialogs - .open(TUI_PROMPT, { - label: 'Warning', - size: 's', - data: { - content, - yes: 'Continue', - no: 'Cancel', - }, - }) - .subscribe(response => resolve(response)) - }) - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config-dep.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config-dep.component.ts deleted file mode 100644 index a895ac222..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config-dep.component.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - Input, - OnChanges, -} from '@angular/core' -import { compare, getValueByPointer, Operation } from 'fast-json-patch' -import { isObject } from '@start9labs/shared' -import { tuiIsNumber } from '@taiga-ui/cdk' - -@Component({ - selector: 'app-config-dep', - template: ` - -

    - {{ package }} -

    - The following modifications have been made to {{ package }} to satisfy - {{ dep }}: -
      -
    • -
    - To accept these modifications, click "Save". -
    - `, - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AppConfigDepComponent implements OnChanges { - @Input() - package = '' - - @Input() - dep = '' - - @Input() - original: object = {} - - @Input() - value: object = {} - - diff: string[] = [] - - ngOnChanges() { - this.diff = compare(this.original, this.value).map( - op => `${this.getPath(op)}: ${this.getMessage(op)}`, - ) - } - - private getPath(operation: Operation): string { - const path = operation.path - .substring(1) - .split('/') - .map(node => { - const num = Number(node) - return isNaN(num) ? node : num - }) - - if (tuiIsNumber(path[path.length - 1])) { - path.pop() - } - - return path.join(' → ') - } - - private getMessage(operation: Operation): string { - switch (operation.op) { - case 'add': - return `Added ${this.getNewValue(operation.value)}` - case 'remove': - return `Removed ${this.getOldValue(operation.path)}` - case 'replace': - return `Changed from ${this.getOldValue( - operation.path, - )} to ${this.getNewValue(operation.value)}` - default: - return `Unknown operation` - } - } - - private getOldValue(path: any): string { - const val = getValueByPointer(this.original, path) - if (['string', 'number', 'boolean'].includes(typeof val)) { - return val - } else if (isObject(val)) { - return 'entry' - } else { - return 'list' - } - } - - private getNewValue(val: any): string { - if (['string', 'number', 'boolean'].includes(typeof val)) { - return val - } else if (isObject(val)) { - return 'new entry' - } else { - return 'new list' - } - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.module.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.module.ts deleted file mode 100644 index 3279dd8bb..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.module.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { ReactiveFormsModule } from '@angular/forms' -import { - TuiLoaderModule, - TuiModeModule, - TuiNotificationModule, -} from '@taiga-ui/core' -import { TuiButtonModule } from '@taiga-ui/experimental' -import { FormPageModule } from 'src/app/apps/ui/modals/form/form.module' - -import { AppConfigPage } from './app-config.page' -import { AppConfigDepComponent } from './app-config-dep.component' - -@NgModule({ - imports: [ - CommonModule, - ReactiveFormsModule, - FormPageModule, - TuiLoaderModule, - TuiNotificationModule, - TuiButtonModule, - TuiModeModule, - ], - declarations: [AppConfigPage, AppConfigDepComponent], - exports: [AppConfigPage], -}) -export class AppConfigPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.html b/web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.html deleted file mode 100644 index bf400b392..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - {{ pkg.manifest.title }} has been automatically configured with - recommended defaults. Make whatever changes you want, then click "Save". - - - - - - - - No config options for {{ pkg.manifest.title }} {{ pkg.manifest.version }}. - - - - - - - - - - -
    -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.scss b/web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.scss deleted file mode 100644 index d29fc1ffa..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.scss +++ /dev/null @@ -1,8 +0,0 @@ -.notification { - font-size: 1rem; - margin-bottom: 1rem; -} - -.reset { - margin-right: auto; -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.ts deleted file mode 100644 index c901d96d7..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/modals/app-config/app-config.page.ts +++ /dev/null @@ -1,185 +0,0 @@ -import { Component, Inject } from '@angular/core' -import { endWith, firstValueFrom, Subscription } from 'rxjs' -import { TuiDialogContext, TuiDialogService } from '@taiga-ui/core' -import { TUI_PROMPT, TuiPromptData } from '@taiga-ui/kit' -import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { - ErrorService, - getErrorMessage, - isEmptyObject, - LoadingService, -} from '@start9labs/shared' -import { InputSpec } from '@start9labs/start-sdk/lib/config/configTypes' -import { - DataModel, - PackageDataEntry, -} from 'src/app/services/patch-db/data-model' -import { PatchDB } from 'patch-db-client' -import { compare, Operation } from 'fast-json-patch' -import { hasCurrentDeps } from 'src/app/util/has-deps' -import { getAllPackages, getPackage } from 'src/app/util/get-package-data' -import { Breakages } from 'src/app/services/api/api.types' -import { InvalidService } from 'src/app/common/form/invalid.service' -import { DependentInfo } from 'src/app/types/dependent-info' -import { ActionButton } from 'src/app/apps/ui/modals/form/form.page' - -export interface PackageConfigData { - readonly pkgId: string - readonly dependentInfo?: DependentInfo -} - -@Component({ - selector: 'app-config', - templateUrl: './app-config.page.html', - styleUrls: ['./app-config.page.scss'], - providers: [InvalidService], -}) -export class AppConfigPage { - readonly pkgId = this.context.data.pkgId - readonly dependentInfo = this.context.data.dependentInfo - - loadingError = '' - loadingText = this.dependentInfo - ? `Setting properties to accommodate ${this.dependentInfo.title}` - : 'Loading Config' - - pkg?: PackageDataEntry - spec: InputSpec = {} - patch: Operation[] = [] - buttons: ActionButton[] = [ - { - text: 'Save', - handler: value => this.save(value), - }, - ] - - original: object | null = null - value: object | null = null - - constructor( - @Inject(POLYMORPHEUS_CONTEXT) - private readonly context: TuiDialogContext, - private readonly dialogs: TuiDialogService, - private readonly errorService: ErrorService, - private readonly loader: LoadingService, - private readonly embassyApi: ApiService, - private readonly patchDb: PatchDB, - ) {} - - async ngOnInit() { - try { - this.pkg = await getPackage(this.patchDb, this.pkgId) - - if (!this.pkg) { - this.loadingError = 'This service does not exist' - - return - } - - if (this.dependentInfo) { - const depConfig = await this.embassyApi.dryConfigureDependency({ - 'dependency-id': this.pkgId, - 'dependent-id': this.dependentInfo.id, - }) - - this.original = depConfig['old-config'] - this.value = depConfig['new-config'] || this.original - this.spec = depConfig.spec - this.patch = compare(this.original, this.value) - } else { - const { config, spec } = await this.embassyApi.getPackageConfig({ - id: this.pkgId, - }) - - this.original = config - this.value = config - this.spec = spec - } - } catch (e: any) { - this.loadingError = getErrorMessage(e) - } finally { - this.loadingText = '' - } - } - - private async save(config: any) { - const loader = new Subscription() - - try { - await this.uploadFiles(config, loader) - - if (hasCurrentDeps(this.pkg!)) { - await this.configureDeps(config, loader) - } else { - await this.configure(config, loader) - } - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } - - private async uploadFiles(config: Record, loader: Subscription) { - loader.unsubscribe() - loader.closed = false - - // TODO: Could be nested files - const keys = Object.keys(config).filter(key => config[key] instanceof File) - const message = `Uploading File${keys.length > 1 ? 's' : ''}...` - - if (!keys.length) return - - loader.add(this.loader.open(message).subscribe()) - - const hashes = await Promise.all( - keys.map(key => this.embassyApi.uploadFile(config[key])), - ) - keys.forEach((key, i) => (config[key] = hashes[i])) - } - - private async configureDeps( - config: Record, - loader: Subscription, - ) { - loader.unsubscribe() - loader.closed = false - loader.add(this.loader.open('Checking dependent services...').subscribe()) - - const breakages = await this.embassyApi.drySetPackageConfig({ - id: this.pkgId, - config, - }) - - loader.unsubscribe() - loader.closed = false - - if (isEmptyObject(breakages) || (await this.approveBreakages(breakages))) { - await this.configure(config, loader) - } - } - - private async configure(config: Record, loader: Subscription) { - loader.unsubscribe() - loader.closed = false - loader.add(this.loader.open('Saving...').subscribe()) - - await this.embassyApi.setPackageConfig({ id: this.pkgId, config }) - this.context.$implicit.complete() - } - - private async approveBreakages(breakages: Breakages): Promise { - const packages = await getAllPackages(this.patchDb) - const message = - 'As a result of this change, the following services will no longer work properly and may crash:
      ' - const content = `${message}${Object.keys(breakages).map( - id => `
    • ${packages[id].manifest.title}
    • `, - )}
    ` - const data: TuiPromptData = { content, yes: 'Continue', no: 'Cancel' } - - return firstValueFrom( - this.dialogs.open(TUI_PROMPT, { data }).pipe(endWith(false)), - ) - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/health-color.pipe.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/health-color.pipe.ts deleted file mode 100644 index a274aa8c0..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/health-color.pipe.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core' -import { HealthResult } from 'src/app/services/patch-db/data-model' - -@Pipe({ - name: 'healthColor', -}) -export class HealthColorPipe implements PipeTransform { - transform(val: HealthResult): string { - switch (val) { - case HealthResult.Success: - return 'success' - case HealthResult.Failure: - return 'warning' - case HealthResult.Disabled: - return 'dark' - case HealthResult.Starting: - case HealthResult.Loading: - return 'primary' - } - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/progress-data.pipe.ts b/web/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/progress-data.pipe.ts deleted file mode 100644 index 1e5397648..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/app-show/pipes/progress-data.pipe.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core' -import { PackageDataEntry } from 'src/app/services/patch-db/data-model' -import { ProgressData } from 'src/app/types/progress-data' -import { packageLoadingProgress } from 'src/app/util/package-loading-progress' - -@Pipe({ - name: 'progressData', -}) -export class ProgressDataPipe implements PipeTransform { - transform(pkg: PackageDataEntry): ProgressData | null { - return packageLoadingProgress(pkg['install-progress']) - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/services.module.ts b/web/projects/ui/src/app/apps/ui/pages/services/services.module.ts deleted file mode 100644 index 6f2b8c9ff..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/services.module.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { NgModule } from '@angular/core' -import { Routes, RouterModule } from '@angular/router' - -const routes: Routes = [ - { - path: '', - redirectTo: 'list', - pathMatch: 'full', - }, - { - path: 'list', - loadChildren: () => - import('./app-list/app-list.module').then(m => m.AppListPageModule), - }, - { - path: ':pkgId', - loadChildren: () => - import('./app-show/app-show.module').then(m => m.AppShowPageModule), - }, - { - path: ':pkgId/actions', - loadChildren: () => - import('./app-actions/app-actions.module').then( - m => m.AppActionsPageModule, - ), - }, - { - path: ':pkgId/logs', - loadChildren: () => - import('./app-logs/app-logs.module').then(m => m.AppLogsPageModule), - }, - { - path: ':pkgId/credentials', - loadChildren: () => - import('./app-credentials/app-credentials.module').then( - m => m.AppCredentialsPageModule, - ), - }, - { - path: ':pkgId/interfaces/:interfaceId', - loadChildren: () => - import('./app-interface/app-interface.module').then( - m => m.AppInterfacePageModule, - ), - }, -] - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class ServicesModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/status/status.component.html b/web/projects/ui/src/app/apps/ui/pages/services/status/status.component.html deleted file mode 100644 index fd265fd96..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/status/status.component.html +++ /dev/null @@ -1,30 +0,0 @@ -

    - {{ (connected$ | async) ? rendering.display : 'Unknown' }} - - - this may take a while - - - - - {{ progress }} - - - - -

    diff --git a/web/projects/ui/src/app/apps/ui/pages/services/status/status.component.module.ts b/web/projects/ui/src/app/apps/ui/pages/services/status/status.component.module.ts deleted file mode 100644 index d70f22c4c..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/status/status.component.module.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { UnitConversionPipesModule } from '@start9labs/shared' -import { InstallProgressPipeModule } from 'src/app/common/install-progress/install-progress.module' -import { StatusComponent } from './status.component' - -@NgModule({ - declarations: [StatusComponent], - imports: [ - CommonModule, - IonicModule, - UnitConversionPipesModule, - InstallProgressPipeModule, - ], - exports: [StatusComponent], -}) -export class StatusComponentModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/services/status/status.component.scss b/web/projects/ui/src/app/apps/ui/pages/services/status/status.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/ui/src/app/apps/ui/pages/services/status/status.component.ts b/web/projects/ui/src/app/apps/ui/pages/services/status/status.component.ts deleted file mode 100644 index 156dc9e6c..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/services/status/status.component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Component, Input } from '@angular/core' -import { ConnectionService } from 'src/app/services/connection.service' -import { InstallProgress } from 'src/app/services/patch-db/data-model' -import { - PrimaryRendering, - PrimaryStatus, - StatusRendering, -} from 'src/app/services/pkg-status-rendering.service' - -@Component({ - selector: 'status', - templateUrl: './status.component.html', - styleUrls: ['./status.component.scss'], -}) -export class StatusComponent { - PS = PrimaryStatus - PR = PrimaryRendering - - @Input({ required: true }) rendering!: StatusRendering - @Input() size?: string - @Input() style?: string = 'regular' - @Input() weight?: string = 'normal' - @Input() installProgress?: InstallProgress - @Input() sigtermTimeout?: string | null = null - - readonly connected$ = this.connectionService.connected$ - - constructor(private readonly connectionService: ConnectionService) {} -} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts b/web/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts deleted file mode 100644 index 2d93ab758..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/domains/domain.const.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { Config } from '@start9labs/start-sdk/lib/config/builder/config' -import { Value } from '@start9labs/start-sdk/lib/config/builder/value' -import { Variants } from '@start9labs/start-sdk/lib/config/builder/variants' -import { Proxy } from 'src/app/services/patch-db/data-model' -import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' - -const auth = Config.of({ - username: Value.text({ - name: 'Username', - required: { default: null }, - }), - password: Value.text({ - name: 'Password', - required: { default: null }, - masked: true, - }), -}) - -function getStrategyUnion(proxies: Proxy[]) { - const inboundProxies = proxies - .filter(p => p.type === 'inbound-outbound') - .reduce((prev, curr) => { - return { - [curr.id]: curr.name, - ...prev, - } - }, {}) - - return Value.union( - { - name: 'Networking Strategy', - required: { default: null }, - description: `
    Local
    Select this option if you do not mind exposing your home/business IP address to the Internet. This option requires configuring router settings, which StartOS can do automatically if you have an OpenWRT router -
    Proxy
    Select this option is you prefer to hide your home/business IP address from the Internet. This option requires running your own Virtual Private Server (VPS) or paying service provider such as Static Wire -`, - }, - Variants.of({ - local: { - name: 'Local', - spec: Config.of({ - ipStrategy: Value.select({ - name: 'IP Strategy', - description: `
    IPv6 Only (recommended)
    Requirements:
    1. ISP IPv6 support
    2. OpenWRT (recommended) or Linksys router
    Pros: Ready for IPv6 Internet. Enhanced privacy. Run multiple clearnet servers from the same network -Cons: Interfaces using this domain will only be accessible to people whose ISP supports IPv6 -
    IPv6 and IPv4
    Pros: Ready for IPv6 Internet. Accessible by anyone -Cons: Less private, as IPv4 addresses are closely correlated with geographic areas. Cannot run multiple clearnet servers from the same network -
    IPv4 Only
    Pros: Accessible by anyone -Cons: Less private, as IPv4 addresses are closely correlated with geographic areas. Cannot run multiple clearnet servers from the same network -`, - required: { default: 'ipv6' }, - values: { - ipv6: 'IPv6 Only', - ipv4: 'IPv4 Only', - dualstack: 'IPv6 and IPv4', - }, - }), - }), - }, - proxy: { - name: 'Proxy', - spec: Config.of({ - proxyStrategy: Value.union( - { - name: 'Proxy Strategy', - required: { default: 'primary' }, - description: `
    Primary
    Use the Primary Inbound proxy from your proxy settings. If you do not have any inbound proxies, no proxy will be used -
    Other
    Use a specific proxy from your proxy settings -`, - }, - Variants.of({ - primary: { - name: 'Primary', - spec: Config.of({}), - }, - other: { - name: 'Specific', - spec: Config.of({ - proxyId: Value.select({ - name: 'Select Proxy', - required: { default: null }, - values: inboundProxies, - }), - }), - }, - }), - ), - }), - }, - }), - ) -} - -export async function getStart9ToSpec(proxies: Proxy[]) { - return configBuilderToSpec( - Config.of({ - strategy: getStrategyUnion(proxies), - }), - ) -} - -export async function getCustomSpec(proxies: Proxy[]) { - return configBuilderToSpec( - Config.of({ - hostname: Value.text({ - name: 'Hostname', - required: { default: null }, - placeholder: 'yourdomain.com', - }), - provider: Value.union( - { - name: 'Dynamic DNS Provider', - required: { default: 'start9' }, - }, - Variants.of({ - start9: { - name: 'Start9', - spec: Config.of({}), - }, - njalla: { - name: 'Njalla', - spec: auth, - }, - duckdns: { - name: 'Duck DNS', - spec: auth, - }, - dyn: { - name: 'DynDNS', - spec: auth, - }, - easydns: { - name: 'easyDNS', - spec: auth, - }, - zoneedit: { - name: 'Zoneedit', - spec: auth, - }, - googledomains: { - name: 'Google Domains (IPv4 or IPv6)', - spec: auth, - }, - namecheap: { - name: 'Namecheap (IPv4 only)', - spec: auth, - }, - }), - ), - strategy: getStrategyUnion(proxies), - }), - ) -} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/domains/domains.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/domains/domains.module.ts deleted file mode 100644 index 39af70e92..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/domains/domains.module.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { RouterModule, Routes } from '@angular/router' -import { DomainsPage } from './domains.page' -import { TuiNotificationModule } from '@taiga-ui/core' -import { SharedPipesModule } from '@start9labs/shared' - -const routes: Routes = [ - { - path: '', - component: DomainsPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - TuiNotificationModule, - RouterModule.forChild(routes), - SharedPipesModule, - ], - declarations: [DomainsPage], -}) -export class DomainsPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html b/web/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html deleted file mode 100644 index a14af00d1..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - Domains - - - - -
    - - Adding domains permits accessing your server and services over clearnet. - View instructions - -
    - - - - Start9.to - - - Claim - - - -
    - - - Domain - Added - DDNS Provider - Network Strategy - Used By - - - - {{ start9To.value }} - {{ start9To.createdAt| date: 'short' }} - Start9 - - {{ $any(start9To.networkStrategy).ipStrategy || - $any(start9To.networkStrategy).proxyId || 'Primary Proxy' }} - - - - {{ qty }} Interfaces - - - N/A - - - - - - - - - - - -
    - - - Custom Domains - - - Add Domain - - - -
    - - - Domain - Added - DDNS Provider - Network Strategy - Used By - - - - {{ domain.value }} - {{ domain.createdAt| date: 'short' }} - {{ domain.provider }} - - {{ $any(domain.networkStrategy).ipStrategy || - $any(domain.networkStrategy).proxyId || 'Primary Proxy' }} - - - - {{ qty }} Interfaces - - - N/A - - - - - - - - - - - -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.ts deleted file mode 100644 index 605fb8a2e..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/domains/domains.page.ts +++ /dev/null @@ -1,228 +0,0 @@ -import { Component } from '@angular/core' -import { ErrorService, LoadingService } from '@start9labs/shared' -import { TuiDialogOptions, TuiDialogService } from '@taiga-ui/core' -import { TUI_PROMPT } from '@taiga-ui/kit' -import { filter, firstValueFrom, map } from 'rxjs' -import { PatchDB } from 'patch-db-client' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { DataModel, Domain } from 'src/app/services/patch-db/data-model' -import { FormDialogService } from 'src/app/services/form-dialog.service' -import { FormContext, FormPage } from '../../../modals/form/form.page' -import { getCustomSpec, getStart9ToSpec } from './domain.const' - -@Component({ - selector: 'domains', - templateUrl: 'domains.page.html', - styleUrls: ['domains.page.scss'], -}) -export class DomainsPage { - readonly docsUrl = 'https://docs.start9.com/latest/user-manual/domains' - - readonly domains$ = this.patch.watch$('server-info', 'network').pipe( - map(network => { - const start9ToSubdomain = network.start9ToSubdomain - const start9To = !start9ToSubdomain - ? null - : { - ...start9ToSubdomain, - value: `${start9ToSubdomain.value}.start9.to`, - provider: 'Start9', - } - - return { start9To, custom: network.domains } - }), - ) - - constructor( - private readonly errorService: ErrorService, - private readonly dialogs: TuiDialogService, - private readonly api: ApiService, - private readonly loader: LoadingService, - private readonly formDialog: FormDialogService, - private readonly patch: PatchDB, - ) {} - - async presentModalAdd() { - const proxies = await firstValueFrom( - this.patch.watch$('server-info', 'network', 'proxies'), - ) - - const options: Partial>> = { - label: 'Custom Domain', - data: { - spec: await getCustomSpec(proxies), - buttons: [ - { - text: 'Manage proxies', - link: '/system/proxies', - }, - { - text: 'Save', - handler: async value => this.save(value), - }, - ], - }, - } - this.formDialog.open(FormPage, options) - } - - async presentModalClaimStart9To() { - const proxies = await firstValueFrom( - this.patch.watch$('server-info', 'network', 'proxies'), - ) - - const options: Partial>> = { - label: 'start9.to', - data: { - spec: await getStart9ToSpec(proxies), - buttons: [ - { - text: 'Manage proxies', - link: '/system/proxies', - }, - { - text: 'Save', - handler: async value => this.claimStart9ToDomain(value), - }, - ], - }, - } - this.formDialog.open(FormPage, options) - } - - presentAlertDelete(hostname: string) { - this.dialogs - .open(TUI_PROMPT, { - label: 'Confirm', - size: 's', - data: { - content: 'Delete domain?', - yes: 'Delete', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => this.delete(hostname)) - } - - presentAlertDeleteStart9To() { - this.dialogs - .open(TUI_PROMPT, { - label: 'Confirm', - size: 's', - data: { - content: 'Delete start9.to domain?', - yes: 'Delete', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => this.deleteStart9ToDomain()) - } - - presentAlertUsedBy(domain: string, usedBy: Domain['usedBy']) { - this.dialogs - .open( - `${domain} is currently being used by:
      ${usedBy.map(u => - u.interfaces.map(i => `
    • ${u.service.title} - ${i.title}
    • `), - )}
    `, - { - label: 'Used by', - size: 's', - }, - ) - .subscribe() - } - - private async claimStart9ToDomain(value: any): Promise { - const loader = this.loader.open('Saving...').subscribe() - - const strategy = value.strategy.unionValueKey - - const networkStrategy = - value.strategy.unionSelectKey === 'local' - ? { ipStrategy: strategy.ipStrategy } - : { - proxyId: - strategy.proxyStrategy.unionSelectKey === 'primary' - ? null - : strategy.proxyStrategy.unionValueKey.proxyId, - } - - try { - await this.api.claimStart9ToDomain({ networkStrategy }) - return true - } catch (e: any) { - this.errorService.handleError(e) - return false - } finally { - loader.unsubscribe() - } - } - - private async save(value: any): Promise { - const loader = this.loader.open('Saving...').subscribe() - - const providerName = value.provider.unionSelectKey - - const strategy = value.strategy.unionValueKey - - const networkStrategy = - value.strategy.unionSelectKey === 'local' - ? { ipStrategy: strategy.ipStrategy } - : { - proxyId: - strategy.proxyStrategy.unionSelectKey === 'primary' - ? null - : strategy.proxyStrategy.unionValueKey.proxyId, - } - - try { - await this.api.addDomain({ - hostname: value.hostname, - provider: { - name: providerName, - username: - providerName === 'start9' - ? null - : value.provider.unionValueKey.username, - password: - providerName === 'start9' - ? null - : value.provider.unionValueKey.password, - }, - networkStrategy, - }) - return true - } catch (e: any) { - this.errorService.handleError(e) - return false - } finally { - loader.unsubscribe() - } - } - - private async delete(hostname: string): Promise { - const loader = this.loader.open('Deleting...').subscribe() - - try { - await this.api.deleteDomain({ hostname }) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } - - private async deleteStart9ToDomain(): Promise { - const loader = this.loader.open('Deleting...').subscribe() - - try { - await this.api.deleteStart9ToDomain({}) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/email/email.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/email/email.module.ts deleted file mode 100644 index f86ad248a..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/email/email.module.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { TuiNotificationModule } from '@taiga-ui/core' -import { TuiButtonModule } from '@taiga-ui/experimental' -import { EmailPage } from './email.page' -import { Routes, RouterModule } from '@angular/router' -import { FormsModule, ReactiveFormsModule } from '@angular/forms' -import { FormModule } from 'src/app/common/form/form.module' -import { TuiInputModule } from '@taiga-ui/kit' - -const routes: Routes = [ - { - path: '', - component: EmailPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - TuiButtonModule, - FormModule, - FormsModule, - ReactiveFormsModule, - TuiInputModule, - TuiNotificationModule, - RouterModule.forChild(routes), - ], - declarations: [EmailPage], -}) -export class EmailPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/email/email.page.html b/web/projects/ui/src/app/apps/ui/pages/system/email/email.page.html deleted file mode 100644 index 6159b8cfe..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/email/email.page.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Email - - - - -
    - - Adding SMTP credentials to StartOS enables StartOS and some services to - send you emails. - - View instructions - - - -
    - SMTP Credentials - -
    - -
    -
    -
    - Test Email - - Firstname Lastname <email@example.com> - - -
    - -
    -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/system/email/email.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/email/email.page.scss deleted file mode 100644 index 4cceda182..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/email/email.page.scss +++ /dev/null @@ -1,11 +0,0 @@ -ion-item-divider { - text-transform: unset; - padding-bottom: 12px; - padding-left: 0; -} - -ion-item-group { - background-color: #1e2024; - border: 1px solid #717171; - border-radius: 6px; -} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/email/email.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/email/email.page.ts deleted file mode 100644 index fb8ae298e..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/email/email.page.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { Component } from '@angular/core' -import { UntypedFormGroup } from '@angular/forms' -import { ErrorService, LoadingService } from '@start9labs/shared' -import { InputSpec } from '@start9labs/start-sdk/lib/config/configTypes' -import { customSmtp } from '@start9labs/start-sdk/lib/config/configConstants' -import { TuiDialogService } from '@taiga-ui/core' -import { PatchDB } from 'patch-db-client' -import { switchMap } from 'rxjs' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { DataModel } from 'src/app/services/patch-db/data-model' -import { FormService } from 'src/app/services/form.service' -import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' - -@Component({ - selector: 'email', - templateUrl: './email.page.html', - styleUrls: ['./email.page.scss'], -}) -export class EmailPage { - spec: Promise = configBuilderToSpec(customSmtp) - testAddress = '' - readonly form$ = this.patch - .watch$('server-info', 'smtp') - .pipe( - switchMap(async value => - this.formService.createForm(await this.spec, value), - ), - ) - - constructor( - private readonly dialogs: TuiDialogService, - private readonly loader: LoadingService, - private readonly errorService: ErrorService, - private readonly patch: PatchDB, - private readonly api: ApiService, - private readonly formService: FormService, - ) {} - - async save(value: unknown): Promise { - const loader = this.loader.open('Saving...').subscribe() - - try { - await this.api.configureEmail(customSmtp.validator.unsafeCast(value)) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } - - async sendTestEmail(form: UntypedFormGroup) { - const loader = this.loader.open('Sending...').subscribe() - - try { - await this.api.testEmail({ - to: this.testAddress, - ...form.value, - }) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - - this.dialogs - .open( - `A test email has been sent to ${this.testAddress}.

    Check your spam folder and mark as not spam`, - { - label: 'Success', - size: 's', - }, - ) - .subscribe() - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.module.ts deleted file mode 100644 index 436a9ed06..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.module.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { Routes, RouterModule } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { EmverPipesModule } from '@start9labs/shared' -import { TuiCheckboxLabeledModule, TuiPromptModule } from '@taiga-ui/kit' -import { ExperimentalFeaturesPage } from './experimental-features.page' -import { FormsModule } from '@angular/forms' - -const routes: Routes = [ - { - path: '', - component: ExperimentalFeaturesPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - TuiPromptModule, - RouterModule.forChild(routes), - EmverPipesModule, - TuiCheckboxLabeledModule, - FormsModule, - ], - declarations: [ExperimentalFeaturesPage], -}) -export class ExperimentalFeaturesPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.html b/web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.html deleted file mode 100644 index 00ed011f6..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - Experimental Features - - - - - - - - -

    Reset Tor

    -

    - Resetting the Tor daemon on your server may resolve Tor connectivity - issues. -

    -
    -
    - - - -

    {{ server.zram ? 'Disable' : 'Enable' }} zram

    -

    - Zram creates compressed swap in memory, resulting in faster I/O for - low RAM devices -

    -
    -
    -
    -
    - - -

    - You are currently connected over Tor. If you reset the Tor daemon, you will - lose connectivity until it comes back online. -

    -

    Reset Tor?

    -

    - Optionally wipe state to forcibly acquire new guard nodes. It is recommended - to try without wiping state first. -

    - - Wipe state - -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.ts deleted file mode 100644 index 2861ca199..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/experimental-features/experimental-features.page.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - TemplateRef, - ViewChild, -} from '@angular/core' -import { PatchDB } from 'patch-db-client' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { ConfigService } from 'src/app/services/config.service' -import { DataModel } from 'src/app/services/patch-db/data-model' -import { ErrorService, LoadingService } from '@start9labs/shared' -import { TuiAlertService, TuiDialogService } from '@taiga-ui/core' -import { TUI_PROMPT } from '@taiga-ui/kit' -import { filter } from 'rxjs' - -@Component({ - selector: 'experimental-features', - templateUrl: './experimental-features.page.html', - styleUrls: ['./experimental-features.page.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class ExperimentalFeaturesPage { - readonly server$ = this.patch.watch$('server-info') - - @ViewChild('tor') - template?: TemplateRef - - wipe = false - - constructor( - private readonly alerts: TuiAlertService, - private readonly patch: PatchDB, - private readonly config: ConfigService, - private readonly dialogs: TuiDialogService, - private readonly loader: LoadingService, - private readonly api: ApiService, - private readonly errorService: ErrorService, - ) {} - - get isTor(): boolean { - return this.config.isTor() - } - - async presentAlertResetTor() { - this.wipe = false - this.dialogs - .open(TUI_PROMPT, { - label: this.isTor ? 'Warning' : 'Confirm', - data: { - content: this.template, - yes: 'Reset', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => this.resetTor(this.wipe)) - } - - presentAlertZram(enabled: boolean) { - this.dialogs - .open(TUI_PROMPT, { - label: 'Confirm', - data: { - content: enabled - ? 'Are you sure you want to disable zram? It provides significant performance benefits on low RAM devices.' - : 'Enable zram? It will only make a difference on lower RAM devices.', - yes: enabled ? 'Disable' : 'Enable', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => this.toggleZram(enabled)) - } - - private async resetTor(wipeState: boolean) { - const loader = this.loader.open('Resetting Tor...').subscribe() - - try { - await this.api.resetTor({ - 'wipe-state': wipeState, - reason: 'User triggered', - }) - this.alerts.open('Tor reset in progress').subscribe() - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } - - private async toggleZram(enabled: boolean) { - const loader = this.loader - .open(enabled ? 'Disabling zram...' : 'Enabling zram...') - .subscribe() - - try { - await this.api.toggleZram({ enable: !enabled }) - this.alerts.open(`Zram ${enabled ? 'disabled' : 'enabled'}`).subscribe() - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.module.ts deleted file mode 100644 index c1b88603d..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { Routes, RouterModule } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { KernelLogsPage } from './kernel-logs.page' -import { LogsComponentModule } from 'src/app/common/logs/logs.component.module' - -const routes: Routes = [ - { - path: '', - component: KernelLogsPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - LogsComponentModule, - ], - declarations: [KernelLogsPage], -}) -export class KernelLogsPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.html b/web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.html deleted file mode 100644 index e744ec68f..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.html +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.ts deleted file mode 100644 index 42118d02c..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/kernel-logs/kernel-logs.page.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Component } from '@angular/core' -import { RR } from 'src/app/services/api/api.types' -import { ApiService } from 'src/app/services/api/embassy-api.service' - -@Component({ - selector: 'kernel-logs', - templateUrl: './kernel-logs.page.html', - styleUrls: ['./kernel-logs.page.scss'], -}) -export class KernelLogsPage { - constructor(private readonly embassyApi: ApiService) {} - - followLogs() { - return async (params: RR.FollowServerLogsReq) => { - return this.embassyApi.followKernelLogs(params) - } - } - - fetchLogs() { - return async (params: RR.GetServerLogsReq) => { - return this.embassyApi.getKernelLogs(params) - } - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.module.ts deleted file mode 100644 index a18c8cbbe..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.module.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { CommonModule } from '@angular/common' -import { NgModule } from '@angular/core' -import { FormsModule } from '@angular/forms' -import { RouterModule, Routes } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { - TuiDataListModule, - TuiHostedDropdownModule, - TuiNotificationModule, - TuiSvgModule, - TuiWrapperModule, -} from '@taiga-ui/core' -import { TuiButtonModule } from '@taiga-ui/experimental' -import { TuiBadgeModule, TuiInputModule, TuiToggleModule } from '@taiga-ui/kit' -import { ProxiesPage } from './proxies.page' - -const routes: Routes = [ - { - path: '', - component: ProxiesPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - FormsModule, - TuiNotificationModule, - TuiButtonModule, - TuiInputModule, - TuiToggleModule, - TuiWrapperModule, - TuiBadgeModule, - TuiSvgModule, - TuiHostedDropdownModule, - TuiDataListModule, - ], - declarations: [ProxiesPage], -}) -export class ProxiesPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html b/web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html deleted file mode 100644 index 2e15ce50f..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - Proxies - - - - -
    - - Currently, StartOS only supports Wireguard proxies, which can be used for: -
      -
    1. - Proxying - outbound - traffic to mask your home/business IP from other servers accessed by - your server/services -
    2. -
    3. - Proxying - inbound - traffic to mask your home/business IP from anyone accessing your - server/services over clearnet -
    4. -
    5. - Creating a Virtual Local Area Network (VLAN) to enable private, remote - VPN access to your server/services -
    6. -
    - View instructions -
    -
    - - - - Proxies - - - Add Proxy - - - -
    - - - Name - Created - Type - Primary - Used By - - - - {{ proxy.name }} - {{ proxy.createdAt| date: 'short' }} - {{ proxy.type }} - - - - - - - {{ usedBy.domains.length + usedBy.services.length }} Connections - - - N/A - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.ts deleted file mode 100644 index 6ba862396..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/proxies/proxies.page.ts +++ /dev/null @@ -1,180 +0,0 @@ -import { Component, ViewChild } from '@angular/core' -import { - TuiDialogOptions, - TuiDialogService, - TuiHostedDropdownComponent, -} from '@taiga-ui/core' -import { TUI_PROMPT } from '@taiga-ui/kit' -import { filter } from 'rxjs' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { ErrorService, LoadingService } from '@start9labs/shared' -import { PatchDB } from 'patch-db-client' -import { DataModel, Proxy } from 'src/app/services/patch-db/data-model' -import { FormContext, FormPage } from '../../../modals/form/form.page' -import { FormDialogService } from 'src/app/services/form-dialog.service' -import { Config } from '@start9labs/start-sdk/lib/config/builder/config' -import { Value } from '@start9labs/start-sdk/lib/config/builder/value' - -@Component({ - selector: 'proxies', - templateUrl: './proxies.page.html', - styleUrls: ['./proxies.page.scss'], -}) -export class ProxiesPage { - @ViewChild(TuiHostedDropdownComponent) - menuComponent?: TuiHostedDropdownComponent - - menuOpen = false - - readonly docsUrl = 'https://docs.start9.com/latest/user-manual/vpns/' - - readonly proxies$ = this.patch.watch$('server-info', 'network', 'proxies') - - constructor( - private readonly dialogs: TuiDialogService, - private readonly loader: LoadingService, - private readonly errorService: ErrorService, - private readonly api: ApiService, - private readonly patch: PatchDB, - private readonly formDialog: FormDialogService, - ) {} - - async presentModalAdd() { - const options: Partial>> = { - label: 'Add Proxy', - data: { - spec: await wireguardSpec.build({} as any), - buttons: [ - { - text: 'Save', - handler: value => this.save(value).then(() => true), - }, - ], - }, - } - this.formDialog.open(FormPage, options) - } - - async presentModalRename(proxy: Proxy) { - const options: Partial>> = { - label: `Rename ${proxy.name}`, - data: { - spec: { - name: await Value.text({ - name: 'Name', - required: { default: proxy.name }, - }).build({} as any), - }, - buttons: [ - { - text: 'Save', - handler: value => this.update(value).then(() => true), - }, - ], - }, - } - this.formDialog.open(FormPage, options) - } - - presentAlertDelete(id: string) { - this.dialogs - .open(TUI_PROMPT, { - label: 'Confirm', - size: 's', - data: { - content: 'Delete proxy? This action cannot be undone.', - yes: 'Delete', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => { - this.delete(id) - }) - } - - presentAlertUsedBy(name: string, usedBy: Proxy['usedBy']) { - let message = `Proxy "${name}" is currently used by:` - if (usedBy.domains.length) { - message = `${message}

    Domains (inbound)

      ${usedBy.domains.map( - d => `
    • ${d}
    • `, - )}
    ` - } - if (usedBy.services.length) { - message = `${message}

    Services (outbound)

    ${usedBy.services.map( - s => `
  • ${s.title}
  • `, - )}` - } - - this.dialogs - .open(message, { - label: 'Used by', - size: 's', - }) - .subscribe() - } - - private async save(value: WireguardSpec): Promise { - const loader = this.loader.open('Saving...').subscribe() - - try { - await this.api.addProxy({ - name: value.name, - config: value.config?.filePath || '', - }) - return true - } catch (e: any) { - this.errorService.handleError(e) - return false - } finally { - loader.unsubscribe() - } - } - - async update( - value: Partial<{ - name: string - primaryInbound: true - primaryOutbound: true - }>, - ): Promise { - const loader = this.loader.open('Saving...').subscribe() - - try { - await this.api.updateProxy(value) - return true - } catch (e: any) { - this.errorService.handleError(e) - return false - } finally { - loader.unsubscribe() - } - } - - private async delete(id: string): Promise { - const loader = this.loader.open('Deleting...').subscribe() - - try { - await this.api.deleteProxy({ id }) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } -} - -const wireguardSpec = Config.of({ - name: Value.text({ - name: 'Name', - description: 'A friendly name to help you remember and identify this proxy', - required: { default: null }, - }), - config: Value.file({ - name: 'Wiregaurd Config', - required: { default: null }, - extensions: ['.conf'], - }), -}) - -type WireguardSpec = typeof wireguardSpec.validator._TYPE diff --git a/web/projects/ui/src/app/apps/ui/pages/system/router/router.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/router/router.module.ts deleted file mode 100644 index 1f745495b..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/router/router.module.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { Routes, RouterModule } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { RouterPage } from './router.page' -import { PrimaryIpPipeModule } from 'src/app/common/primary-ip/primary-ip.module' -import { FormsModule } from '@angular/forms' - -const routes: Routes = [ - { - path: '', - component: RouterPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - PrimaryIpPipeModule, - FormsModule, - ], - declarations: [RouterPage], -}) -export class RouterPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/router/router.page.html b/web/projects/ui/src/app/apps/ui/pages/system/router/router.page.html deleted file mode 100644 index a25127a9a..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/router/router.page.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - Port Forwards - - - - -
    - - - - -

    - UPnP Disabled -

    -

    - Below are a list of ports that must be - manually - forwarded in your router in order to enable clearnet access. -
    -
    - Alternatively, you can enable UPnP in your router for automatic - configuration. - - View instructions - -

    -
    - - -

    - UPnP Enabled! -

    -

    - The ports below have been - automatically - forwarded in your router. -
    -
    - If you are running multiple servers, you may want to override - specific ports to suite your needs. - - View instructions - -

    -
    -
    -
    - - - - - Port - - - Target - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    {{ ip }}:{{ pf.target }}

    -
    - - - -
    -
    -
    -
    -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/system/router/router.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/router/router.page.scss deleted file mode 100644 index 50f21298d..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/router/router.page.scss +++ /dev/null @@ -1,26 +0,0 @@ -ion-item-divider { - padding-bottom: 8px; - padding-left: 0px; -} - -ion-item-group { - background-color: #1e2024; - border: 1px solid #717171; - border-radius: 6px; -} - -ion-item { - --inner-padding-end: 0; -} - -ion-buttons { - margin-left: 0; - margin-right: 8px; - ion-button::part(native) { - padding: 0 2px; - } -} - -.larger-icon { - font-size: 20px; -} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/system/router/router.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/router/router.page.ts deleted file mode 100644 index c02027ab1..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/router/router.page.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' -import { PatchDB } from 'patch-db-client' -import { DataModel, PortForward } from 'src/app/services/patch-db/data-model' -import { LoadingService, CopyService, ErrorService } from '@start9labs/shared' -import { ApiService } from 'src/app/services/api/embassy-api.service' - -@Component({ - selector: 'router', - templateUrl: './router.page.html', - styleUrls: ['./router.page.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class RouterPage { - readonly server$ = this.patch.watch$('server-info') - editing: Record = {} - overrides: Record = {} - - constructor( - readonly copyService: CopyService, - private readonly patch: PatchDB, - private readonly loader: LoadingService, - private readonly errorService: ErrorService, - private readonly api: ApiService, - ) {} - - async editPort(pf: PortForward) { - this.editing[pf.target] = !this.editing[pf.target] - this.overrides[pf.target] = pf.override || pf.assigned - } - - async saveOverride(pf: PortForward) { - const loader = this.loader.open('Saving...').subscribe() - - try { - await this.api.overridePortForward({ - target: pf.target, - port: this.overrides[pf.target], - }) - delete this.editing[pf.target] - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.module.ts deleted file mode 100644 index 4b14f215c..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { Routes, RouterModule } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { ServerLogsPage } from './server-logs.page' -import { LogsComponentModule } from 'src/app/common/logs/logs.component.module' - -const routes: Routes = [ - { - path: '', - component: ServerLogsPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - LogsComponentModule, - ], - declarations: [ServerLogsPage], -}) -export class ServerLogsPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.html b/web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.html deleted file mode 100644 index c41ab6461..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.html +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.ts deleted file mode 100644 index 5fa903876..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/server-logs/server-logs.page.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Component } from '@angular/core' -import { RR } from 'src/app/services/api/api.types' -import { ApiService } from 'src/app/services/api/embassy-api.service' - -@Component({ - selector: 'server-logs', - templateUrl: './server-logs.page.html', - styleUrls: ['./server-logs.page.scss'], -}) -export class ServerLogsPage { - constructor(private readonly embassyApi: ApiService) {} - - followLogs() { - return async (params: RR.FollowServerLogsReq) => { - return this.embassyApi.followServerLogs(params) - } - } - - fetchLogs() { - return async (params: RR.GetServerLogsReq) => { - return this.embassyApi.getServerLogs(params) - } - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.module.ts deleted file mode 100644 index 4b6d12b89..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.module.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { Routes, RouterModule } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { ServerMetricsPage } from './server-metrics.page' -import { SkeletonListComponentModule } from 'src/app/common/skeleton-list/skeleton-list.component.module' -import { SharedPipesModule } from '@start9labs/shared' - -const routes: Routes = [ - { - path: '', - component: ServerMetricsPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - SkeletonListComponentModule, - SharedPipesModule, - ], - declarations: [ServerMetricsPage], -}) -export class ServerMetricsPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.html b/web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.html deleted file mode 100644 index 58be4b196..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - Monitor - - - - - -

    - Websocket Failed. Reconnecting -

    - - - -

    Current Time (UTC)

    -

    - {{ serverData[0].value | date : 'MMMM d, y, h:mm:ss a' : 'UTC' }} -

    -

    - - NTP not synced, time could be wrong - -

    -
    -
    - - - -

    Uptime

    -

    - {{ uptime.days }} - Days, - {{ uptime.hours }} - Hours, - {{ uptime.minutes }} - Minutes, - {{ uptime.seconds }} - Seconds -

    -
    -
    - - - - General - - Temperature - - - {{ general.temperature.value }} °C - - N/A - - - - - - Memory - - Percentage Used - - {{ memory['percentage-used'].value }} % - - - - Total - - {{ memory.total.value }} MiB - - - - Used - - {{ memory.used.value }} MiB - - - - Available - {{ memory.available.value }} MiB - - - zram Used - {{ memory['zram-used'].value }} MiB - - - zram Total - {{ memory['zram-total'].value }} MiB - - - zram Available - - {{ memory['zram-available'].value }} MiB - - - - - - CPU - - Percentage Used - {{ cpu['percentage-used'].value }} % - - - User Space - - {{ cpu['user-space'].value }} % - - - - Kernel Space - - {{ cpu['kernel-space'].value }} % - - - - Idle - {{ cpu.idle.value }} % - - - I/O Wait - {{ cpu.wait.value }} % - - - - - Disk - - Percentage Used - {{ disk['percentage-used'].value }} % - - - Capacity - - {{ disk.capacity.value }} GB - - - - Used - - {{ disk.used.value }} GB - - - - Available - {{ disk.available.value }} GB - - - -
    - - - - -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.scss deleted file mode 100644 index 17a33cb9c..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.scss +++ /dev/null @@ -1,3 +0,0 @@ -ion-note { - font-size: medium; -} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.ts deleted file mode 100644 index 5209ee91e..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/server-metrics/server-metrics.page.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { Component } from '@angular/core' -import { Metrics } from 'src/app/services/api/api.types' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { TimeService } from 'src/app/services/time-service' -import { - catchError, - combineLatest, - filter, - from, - Observable, - startWith, - switchMap, -} from 'rxjs' -import { ConnectionService } from 'src/app/services/connection.service' - -@Component({ - selector: 'server-metrics', - templateUrl: './server-metrics.page.html', - styleUrls: ['./server-metrics.page.scss'], -}) -export class ServerMetricsPage { - websocketFail = false - - readonly serverData$ = this.getServerData$() - - constructor( - private readonly api: ApiService, - private readonly timeService: TimeService, - private readonly connectionService: ConnectionService, - ) {} - - private getServerData$(): Observable< - [ - { - value: number - synced: boolean - }, - { - days: number - hours: number - minutes: number - seconds: number - }, - Metrics, - ] - > { - return combineLatest([ - this.timeService.now$, - this.timeService.uptime$, - this.getMetrics$(), - ]).pipe( - catchError(() => { - this.websocketFail = true - return this.connectionService.connected$.pipe( - filter(Boolean), - switchMap(() => this.getServerData$()), - ) - }), - ) - } - - private getMetrics$(): Observable { - return from(this.api.getServerMetrics({})).pipe( - switchMap(({ metrics, guid }) => - this.api - .openMetricsWebsocket$({ - url: `/rpc/${guid}`, - openObserver: { - next: () => (this.websocketFail = false), - }, - }) - .pipe(startWith(metrics)), - ), - ) - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/server-show/backup-color.pipe.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-show/backup-color.pipe.ts deleted file mode 100644 index 461afa03e..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/server-show/backup-color.pipe.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core' - -@Pipe({ - name: 'backupColor', -}) -export class BackupColorPipe implements PipeTransform { - transform(lastBackup: string | null): 'success' | 'warning' | 'danger' { - if (!lastBackup) return 'danger' - - const currentDate = new Date().valueOf() - const backupDate = new Date(lastBackup).valueOf() - const diff = currentDate - backupDate - const week = 604800000 - - if (diff <= week) { - return 'success' - } else if (diff > week && diff <= week * 2) { - return 'warning' - } else { - return 'danger' - } - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.html b/web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.html deleted file mode 100644 index e2eaebcfb..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.html +++ /dev/null @@ -1,13 +0,0 @@ -

    StartOS {{ versions[0].version }}

    -

    Release Notes

    - - - -

    {{ v.version }}

    -
    -
    -
    - - diff --git a/web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts deleted file mode 100644 index 95c7c02d2..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.module.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { MarkdownPipeModule, SafeLinksDirective } from '@start9labs/shared' -import { TuiScrollbarModule } from '@taiga-ui/core' -import { TuiButtonModule } from '@taiga-ui/experimental' -import { TuiAutoFocusModule } from '@taiga-ui/cdk' -import { NgDompurifyModule } from '@tinkoff/ng-dompurify' -import { OSUpdatePage } from './os-update.page' - -@NgModule({ - declarations: [OSUpdatePage], - imports: [ - CommonModule, - MarkdownPipeModule, - TuiButtonModule, - TuiAutoFocusModule, - TuiScrollbarModule, - SafeLinksDirective, - NgDompurifyModule, - ], - exports: [OSUpdatePage], -}) -export class OSUpdatePageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.scss deleted file mode 100644 index d2f78caf7..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.scss +++ /dev/null @@ -1,24 +0,0 @@ -.title { - margin-top: 0; - font-weight: bold; -} - -.subtitle { - color: var(--tui-text-02); - font-weight: normal; -} - -.scrollbar { - margin: 24px 0; - max-height: 50vh; -} - -.version { - box-shadow: 0 1px var(--tui-base-02); - margin: 0 24px 0 0; - padding: 6px 0; -} - -.button { - float: right; -} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.ts deleted file mode 100644 index d87a3856e..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/server-show/os-update/os-update.page.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { ChangeDetectionStrategy, Component, Inject } from '@angular/core' -import { ErrorService, LoadingService } from '@start9labs/shared' -import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' -import { TuiDialogContext } from '@taiga-ui/core' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { EOSService } from 'src/app/services/eos.service' - -@Component({ - selector: 'os-update', - templateUrl: './os-update.page.html', - styleUrls: ['./os-update.page.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class OSUpdatePage { - versions: { version: string; notes: string }[] = [] - - constructor( - @Inject(POLYMORPHEUS_CONTEXT) private readonly context: TuiDialogContext, - private readonly loader: LoadingService, - private readonly errorService: ErrorService, - private readonly embassyApi: ApiService, - private readonly eosService: EOSService, - ) {} - - ngOnInit() { - const releaseNotes = this.eosService.eos?.['release-notes']! - - this.versions = Object.keys(releaseNotes) - .sort() - .reverse() - .map(version => ({ - version, - notes: releaseNotes[version], - })) - } - - async updateEOS() { - const loader = this.loader.open('Beginning update...').subscribe() - - try { - await this.embassyApi.updateServer() - this.context.$implicit.complete() - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.module.ts deleted file mode 100644 index 18799d6b5..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.module.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { RouterModule, Routes } from '@angular/router' -import { ServerShowPage } from './server-show.page' -import { FormsModule } from '@angular/forms' -import { TextSpinnerComponentModule } from '@start9labs/shared' -import { BadgeMenuComponentModule } from 'src/app/common/badge-menu-button/badge-menu.component.module' -import { InsecureWarningComponentModule } from 'src/app/common/insecure-warning/insecure-warning.module' -import { OSUpdatePageModule } from './os-update/os-update.page.module' -import { PromptModule } from 'src/app/apps/ui/modals/prompt/prompt.module' -import { ThemeSwitcherModule } from '../theme-switcher/theme-switcher.module' -import { BackupColorPipe } from './backup-color.pipe' - -const routes: Routes = [ - { - path: '', - component: ServerShowPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - IonicModule, - TextSpinnerComponentModule, - BadgeMenuComponentModule, - OSUpdatePageModule, - ThemeSwitcherModule, - InsecureWarningComponentModule, - PromptModule, - RouterModule.forChild(routes), - ], - declarations: [ServerShowPage, BackupColorPipe], -}) -export class ServerShowPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.html b/web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.html deleted file mode 100644 index a508924f5..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.html +++ /dev/null @@ -1,124 +0,0 @@ - - - System - - - - - - - - - - - - - - - - - -

    Clock sync failure

    -

    - This will cause connectivity issues. Refer to the StartOS docs to - resolve the issue. -

    -
    - - Open Docs - - -
    - - - - -

    Http detected

    -

    - Tor is faster over https. - - Download and trust your server's Root CA - - , then switch to https. -

    -
    - - Open Https - - -
    - -
    - - - {{ cat.key }} - - - - - - - -

    {{ button.title }}

    -

    {{ button.description }}

    - - -

    - - Update Complete. Restart to apply changes - - - - - - Update Available - - - - - - Check for updates - - - -

    - -

    - - {{ !server.network.outboundProxy ? 'None' : - server.network.outboundProxy === 'primary' ? 'System Primary' : - server.network.outboundProxy.proxyId }} - -

    -
    -
    -
    -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.scss deleted file mode 100644 index 84f709c07..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.scss +++ /dev/null @@ -1,15 +0,0 @@ -ion-item-divider { - text-transform: unset; - padding-bottom: 12px; - padding-left: 0; -} - -ion-item-group { - background-color: #1e2024; - border: 1px solid #717171; - border-radius: 6px; -} - -ion-item { - --background: #1e2024; -} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.ts deleted file mode 100644 index bd241d64f..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/server-show/server-show.page.ts +++ /dev/null @@ -1,691 +0,0 @@ -import { Component, Inject } from '@angular/core' -import { NavController } from '@ionic/angular' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { ActivatedRoute } from '@angular/router' -import { PatchDB } from 'patch-db-client' -import { filter, Observable, of, switchMap, take } from 'rxjs' -import { ErrorService, LoadingService } from '@start9labs/shared' -import { EOSService } from 'src/app/services/eos.service' -import { ClientStorageService } from 'src/app/services/client-storage.service' -import { OSUpdatePage } from './os-update/os-update.page' -import { getAllPackages } from 'src/app/util/get-package-data' -import { AuthService } from 'src/app/services/auth.service' -import { DataModel } from 'src/app/services/patch-db/data-model' -import { FormDialogService } from 'src/app/services/form-dialog.service' -import { FormPage } from '../../../modals/form/form.page' -import { Config } from '@start9labs/start-sdk/lib/config/builder/config' -import { Value } from '@start9labs/start-sdk/lib/config/builder/value' -import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' -import { ConfigService } from 'src/app/services/config.service' -import { TuiAlertService, TuiDialogService } from '@taiga-ui/core' -import { PROMPT } from 'src/app/apps/ui/modals/prompt/prompt.component' -import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' -import { TUI_PROMPT } from '@taiga-ui/kit' -import { WINDOW } from '@ng-web-apis/common' -import { getServerInfo } from 'src/app/util/get-server-info' -import * as argon2 from '@start9labs/argon2' -import { ProxyService } from 'src/app/services/proxy.service' - -@Component({ - selector: 'server-show', - templateUrl: 'server-show.page.html', - styleUrls: ['server-show.page.scss'], -}) -export class ServerShowPage { - manageClicks = 0 - powerClicks = 0 - - readonly server$ = this.patch.watch$('server-info') - readonly showUpdate$ = this.eosService.showUpdate$ - readonly showDiskRepair$ = this.clientStorageService.showDiskRepair$ - - readonly isTorHttp = this.config.isTorHttp() - - constructor( - private readonly dialogs: TuiDialogService, - private readonly loader: LoadingService, - private readonly errorService: ErrorService, - private readonly api: ApiService, - private readonly navCtrl: NavController, - private readonly route: ActivatedRoute, - private readonly patch: PatchDB, - private readonly eosService: EOSService, - private readonly clientStorageService: ClientStorageService, - private readonly authService: AuthService, - private readonly alerts: TuiAlertService, - private readonly config: ConfigService, - private readonly formDialog: FormDialogService, - private readonly proxyService: ProxyService, - @Inject(WINDOW) private readonly windowRef: Window, - ) {} - - addClick(title: string) { - switch (title) { - case 'Security': - this.addSecurityClick() - break - case 'Power': - this.addPowerClick() - break - default: - return - } - } - - private async setBrowserTab(): Promise { - this.patch - .watch$('ui', 'name') - .pipe( - switchMap(initialValue => - this.dialogs.open(PROMPT, { - label: 'Browser Tab Title', - data: { - message: `This value will be displayed as the title of your browser tab.`, - label: 'Device Name', - placeholder: 'StartOS', - required: false, - buttonText: 'Save', - initialValue, - }, - }), - ), - take(1), - ) - .subscribe(name => this.setName(name || null)) - } - - private updateEos() { - this.dialogs.open(new PolymorpheusComponent(OSUpdatePage)).subscribe() - } - - private presentAlertResetPassword() { - this.dialogs - .open(TUI_PROMPT, { - label: 'Warning', - size: 's', - data: { - content: - 'You will still need your current password to decrypt existing backups!', - yes: 'Continue', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => this.presentModalResetPassword()) - } - - async presentModalResetPassword(): Promise { - this.formDialog.open(FormPage, { - label: 'Change Master Password', - data: { - spec: await configBuilderToSpec(passwordSpec), - buttons: [ - { - text: 'Save', - handler: (value: PasswordSpec) => this.resetPassword(value), - }, - ], - }, - }) - } - - private async resetPassword(value: PasswordSpec): Promise { - let err = '' - - if (value.newPassword1 !== value.newPassword2) { - err = 'New passwords do not match' - } else if (value.newPassword1.length < 12) { - err = 'New password must be 12 characters or greater' - } else if (value.newPassword1.length > 64) { - err = 'New password must be less than 65 characters' - } - - // confirm current password is correct - const { 'password-hash': passwordHash } = await getServerInfo(this.patch) - try { - argon2.verify(passwordHash, value.currentPassword) - } catch (e) { - err = 'Current password is invalid' - } - - if (err) { - this.errorService.handleError(err) - return false - } - - const loader = this.loader.open('Saving...').subscribe() - - try { - await this.api.resetPassword({ - 'old-password': value.currentPassword, - 'new-password': value.newPassword1, - }) - - this.alerts.open('Password changed!').subscribe() - - return true - } catch (e: any) { - this.errorService.handleError(e) - return false - } finally { - loader.unsubscribe() - } - } - - private presentAlertLogout() { - this.dialogs - .open(TUI_PROMPT, { - label: 'Confirm', - size: 's', - data: { - content: 'Are you sure you want to log out?', - yes: 'Logout', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => this.logout()) - } - - private presentAlertRestart() { - this.dialogs - .open(TUI_PROMPT, { - label: 'Restart', - size: 's', - data: { - content: - 'Are you sure you want to restart your server? It can take several minutes to come back online.', - yes: 'Restart', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => this.restart()) - } - - private presentAlertShutdown() { - this.dialogs - .open(TUI_PROMPT, { - label: 'Warning', - size: 's', - data: { - content: - 'Are you sure you want to power down your server? This can take several minutes, and your server will not come back online automatically. To power on again, You will need to physically unplug your server and plug it back in', - yes: 'Shutdown', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => this.shutdown()) - } - - private async presentAlertSystemRebuild() { - const localPkgs = await getAllPackages(this.patch) - const minutes = Object.keys(localPkgs).length * 2 - - this.dialogs - .open(TUI_PROMPT, { - label: 'Warning', - size: 's', - data: { - content: `This action will tear down all service containers and rebuild them from scratch. No data will be deleted. This action is useful if your system gets into a bad state, and it should only be performed if you are experiencing general performance or reliability issues. It may take up to ${minutes} minutes to complete. During this time, you will lose all connectivity to your server.`, - yes: 'Rebuild', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => this.systemRebuild()) - } - - private presentAlertRepairDisk() { - this.dialogs - .open(TUI_PROMPT, { - label: 'Warning', - size: 's', - data: { - content: `This action should only be executed if directed by a Start9 support specialist. We recommend backing up your device before preforming this action.

    If anything happens to the device during the reboot, such as losing power or unplugging the drive, the filesystem will be in an unrecoverable state. Please proceed with caution.

    `, - yes: 'Rebuild', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => this.systemRebuild()) - } - - async launchHttps() { - const info = await getServerInfo(this.patch) - this.windowRef.open(`https://${info.ui.torHostname}`, '_self') - } - - private async setName(value: string | null): Promise { - const loader = this.loader.open('Saving...').subscribe() - - try { - await this.api.setDbValue(['name'], value) - } finally { - loader.unsubscribe() - } - } - - // should wipe cache independent of actual BE logout - private logout() { - this.api.logout({}).catch(e => console.error('Failed to log out', e)) - this.authService.setUnverified() - } - - private async restart() { - const action = 'Restart' - const loader = this.loader.open(`Beginning ${action}...`).subscribe() - - try { - await this.api.restartServer({}) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } - - private async shutdown() { - const action = 'Shutdown' - const loader = this.loader.open(`Beginning ${action}...`).subscribe() - - try { - await this.api.shutdownServer({}) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } - - private async systemRebuild() { - const action = 'System Rebuild' - const loader = this.loader.open(`Beginning ${action}...`).subscribe() - - try { - await this.api.systemRebuild({}) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } - - private async checkForEosUpdate(): Promise { - const loader = this.loader.open('Checking for updates').subscribe() - - try { - await this.eosService.loadEos() - - loader.unsubscribe() - - if (this.eosService.updateAvailable$.value) { - this.updateEos() - } else { - this.presentAlertLatest() - } - } catch (e: any) { - loader.unsubscribe() - this.errorService.handleError(e) - } - } - - private presentAlertLatest() { - this.dialogs - .open('You are on the latest version of StartOS.', { - label: 'Up to date!', - size: 's', - }) - .subscribe() - } - - settings: ServerSettings = { - General: [ - { - title: 'About', - description: 'Basic information about your server', - icon: 'information-circle-outline', - action: () => - this.navCtrl.navigateForward(['specs'], { relativeTo: this.route }), - detail: true, - disabled$: of(false), - }, - { - title: 'Software Update', - description: 'Get the latest version of StartOS', - icon: 'cloud-download-outline', - action: () => - this.eosService.updateAvailable$.getValue() - ? this.updateEos() - : this.checkForEosUpdate(), - detail: false, - disabled$: this.eosService.updatingOrBackingUp$, - }, - { - title: 'Email', - description: - 'Connect to an external SMTP server to send yourself emails', - icon: 'mail-outline', - action: () => - this.navCtrl.navigateForward(['email'], { relativeTo: this.route }), - detail: true, - disabled$: of(false), - }, - { - title: 'Sideload a Service', - description: `Manually install a service`, - icon: 'push-outline', - action: () => - this.navCtrl.navigateForward(['sideload'], { - relativeTo: this.route, - }), - detail: true, - disabled$: of(false), - }, - { - title: 'Change Master Password', - description: `Change your StartOS master password`, - icon: 'key-outline', - action: () => this.presentAlertResetPassword(), - detail: false, - disabled$: of(false), - }, - { - title: 'Experimental Features', - description: 'Try out new and potentially unstable new features', - icon: 'flask-outline', - action: () => - this.navCtrl.navigateForward(['experimental-features'], { - relativeTo: this.route, - }), - detail: true, - disabled$: of(false), - }, - ], - Network: [ - { - title: 'Domains', - description: 'Manage domains for clearnet connectivity', - icon: 'globe-outline', - action: () => - this.navCtrl.navigateForward(['domains'], { relativeTo: this.route }), - detail: true, - disabled$: of(false), - }, - { - title: 'Proxies', - description: 'Manage proxies for inbound and outbound connections', - icon: 'shuffle-outline', - action: () => - this.navCtrl.navigateForward(['proxies'], { relativeTo: this.route }), - detail: true, - disabled$: of(false), - }, - { - title: 'Router Config', - description: 'Connect or configure your router for clearnet', - icon: 'radio-outline', - action: () => - this.navCtrl.navigateForward(['router-config'], { - relativeTo: this.route, - }), - detail: true, - disabled$: of(false), - }, - { - title: 'WiFi', - description: 'Add or remove WiFi networks', - icon: 'wifi', - action: () => - this.navCtrl.navigateForward(['wifi'], { relativeTo: this.route }), - detail: true, - disabled$: of(false), - }, - ], - 'User Interface': [ - { - title: 'Browser Tab Title', - description: `Customize the display name of your browser tab`, - icon: 'pricetag-outline', - action: () => this.setBrowserTab(), - detail: false, - disabled$: of(false), - }, - { - title: 'Web Addresses', - description: 'View and manage web addresses for accessing this UI', - icon: 'desktop-outline', - action: () => - this.navCtrl.navigateForward(['interfaces', 'ui'], { - relativeTo: this.route, - }), - detail: true, - disabled$: of(false), - }, - ], - 'Privacy and Security': [ - { - title: 'Outbound Proxy', - description: 'Proxy outbound traffic from the StartOS main process', - icon: 'shield-outline', - action: () => this.proxyService.presentModalSetOutboundProxy(), - detail: false, - disabled$: of(false), - }, - { - title: 'SSH', - description: - 'Manage your SSH keys to access your server from the command line', - icon: 'terminal-outline', - action: () => - this.navCtrl.navigateForward(['ssh'], { relativeTo: this.route }), - detail: true, - disabled$: of(false), - }, - { - title: 'Active Sessions', - description: 'View and manage device access', - icon: 'stopwatch-outline', - action: () => - this.navCtrl.navigateForward(['sessions'], { - relativeTo: this.route, - }), - detail: true, - disabled$: of(false), - }, - ], - Logs: [ - { - title: 'Activity Monitor', - description: 'CPU, disk, memory, and other useful metrics', - icon: 'pulse', - action: () => - this.navCtrl.navigateForward(['metrics'], { relativeTo: this.route }), - detail: true, - disabled$: of(false), - }, - { - title: 'OS Logs', - description: 'Raw, unfiltered operating system logs', - icon: 'receipt-outline', - action: () => - this.navCtrl.navigateForward(['logs'], { relativeTo: this.route }), - detail: true, - disabled$: of(false), - }, - { - title: 'Kernel Logs', - description: - 'Diagnostic log stream for device drivers and other kernel processes', - icon: 'receipt-outline', - action: () => - this.navCtrl.navigateForward(['kernel-logs'], { - relativeTo: this.route, - }), - detail: true, - disabled$: of(false), - }, - { - title: 'Tor Logs', - description: 'Diagnostic log stream for the Tor daemon on StartOS', - icon: 'receipt-outline', - action: () => - this.navCtrl.navigateForward(['tor-logs'], { - relativeTo: this.route, - }), - detail: true, - disabled$: of(false), - }, - ], - Support: [ - { - title: 'User Manual', - description: 'Discover what StartOS can do', - icon: 'map-outline', - action: () => - this.windowRef.open( - 'https://docs.start9.com/0.3.5.x/user-manual', - '_blank', - 'noreferrer', - ), - detail: true, - disabled$: of(false), - }, - { - title: 'Contact Support', - description: 'Get help from the Start9 team and community', - icon: 'chatbubbles-outline', - action: () => - this.windowRef.open( - 'https://start9.com/contact', - '_blank', - 'noreferrer', - ), - detail: true, - disabled$: of(false), - }, - { - title: 'Donate to Start9', - description: `Support StartOS development`, - icon: 'logo-bitcoin', - action: () => - this.windowRef.open( - 'https://donate.start9.com', - '_blank', - 'noreferrer', - ), - detail: true, - disabled$: of(false), - }, - ], - Power: [ - { - title: 'Log Out', - description: '', - icon: 'log-out-outline', - action: () => this.presentAlertLogout(), - detail: false, - disabled$: of(false), - }, - { - title: 'Restart', - description: '', - icon: 'reload', - action: () => this.presentAlertRestart(), - detail: false, - disabled$: of(false), - }, - { - title: 'Shutdown', - description: '', - icon: 'power', - action: () => this.presentAlertShutdown(), - detail: false, - disabled$: of(false), - }, - { - title: 'System Rebuild', - description: '', - icon: 'construct-outline', - action: () => this.presentAlertSystemRebuild(), - detail: false, - disabled$: of(false), - }, - { - title: 'Repair Disk', - description: '', - icon: 'medkit-outline', - action: () => this.presentAlertRepairDisk(), - detail: false, - disabled$: of(false), - }, - ], - } - - private addSecurityClick() { - this.manageClicks++ - - if (this.manageClicks === 5) { - this.manageClicks = 0 - this.alerts - .open( - this.clientStorageService.toggleShowDevTools() - ? 'Dev tools unlocked' - : 'Dev tools hidden', - ) - .subscribe() - } - } - - private addPowerClick() { - this.powerClicks++ - if (this.powerClicks === 5) { - this.powerClicks = 0 - this.clientStorageService.toggleShowDiskRepair() - } - } - - asIsOrder() { - return 0 - } -} - -interface ServerSettings { - [key: string]: SettingBtn[] -} - -interface SettingBtn { - title: string - description: string - icon: string - action: Function - detail: boolean - disabled$: Observable -} - -export const passwordSpec = Config.of({ - currentPassword: Value.text({ - name: 'Current Password', - required: { - default: null, - }, - masked: true, - }), - newPassword1: Value.text({ - name: 'New Password', - required: { - default: null, - }, - masked: true, - }), - newPassword2: Value.text({ - name: 'Retype New Password', - required: { - default: null, - }, - masked: true, - }), -}) - -type PasswordSpec = typeof passwordSpec.validator._TYPE diff --git a/web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.module.ts deleted file mode 100644 index 2393527ac..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.module.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { Routes, RouterModule } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { ServerSpecsPage } from './server-specs.page' -import { EmverPipesModule } from '@start9labs/shared' -import { TuiLetModule } from '@taiga-ui/cdk' - -const routes: Routes = [ - { - path: '', - component: ServerSpecsPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - EmverPipesModule, - TuiLetModule, - ], - declarations: [ServerSpecsPage], -}) -export class ServerSpecsPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.html b/web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.html deleted file mode 100644 index 0c3b24f92..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - About - - - - - - StartOS Info - - -

    Version

    -

    {{ server.version | displayEmver }}

    -
    -
    - - -

    Git Hash

    -

    {{ gitHash }}

    -
    - - - -
    - - Device Credentials - - - -

    CA fingerprint

    -

    {{ server['ca-fingerprint'] }}

    -
    - - - -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.scss deleted file mode 100644 index 61ead3b94..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.scss +++ /dev/null @@ -1,3 +0,0 @@ -p { - font-family: 'Courier New'; -} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.ts deleted file mode 100644 index 7e836bc4c..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/server-specs/server-specs.page.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' -import { PatchDB } from 'patch-db-client' -import { ConfigService } from 'src/app/services/config.service' -import { CopyService } from '@start9labs/shared' -import { DataModel } from 'src/app/services/patch-db/data-model' - -@Component({ - selector: 'server-specs', - templateUrl: './server-specs.page.html', - styleUrls: ['./server-specs.page.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class ServerSpecsPage { - readonly server$ = this.patch.watch$('server-info') - - constructor( - readonly copyService: CopyService, - private readonly patch: PatchDB, - private readonly config: ConfigService, - ) {} - - get gitHash(): string { - return this.config.gitHash - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.module.ts deleted file mode 100644 index 444321c36..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.module.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { RouterModule, Routes } from '@angular/router' -import { PlatformInfoPipe, SessionsPage } from './sessions.page' -import { SharedPipesModule } from '@start9labs/shared' -import { TuiLetModule } from '@taiga-ui/cdk' - -const routes: Routes = [ - { - path: '', - component: SessionsPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - SharedPipesModule, - TuiLetModule, - ], - declarations: [SessionsPage, PlatformInfoPipe], -}) -export class SessionsPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.html b/web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.html deleted file mode 100644 index d8579c6fa..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - Active Sessions - - - - - - - Current Session -
    - - - User Agent - Platform - Last Active - - - - - {{ currentSession['user-agent'] }} - - - -   {{ info.name }} - - - - {{ currentSession['last-active']| date: 'medium' }} - - - - - - - - - - - - -
    - - - - - Other Sessions - - Terminate Selected - - - -
    - - - -
    - -
    - User Agent -
    - Platform - Last Active -
    - - - - -
    - -
    - {{ session['user-agent'] }} -
    - - - -   {{ info.name }} - - - - {{ session['last-active']| date: 'medium' }} - -
    -

    - You are not logged in anywhere else -

    -
    - - - - - - - - -
    -
    -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.scss deleted file mode 100644 index 05b3f2393..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.scss +++ /dev/null @@ -1,3 +0,0 @@ -.highlighted { - background-color: var(--ion-color-medium-shade); -} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.ts deleted file mode 100644 index 607d4ce29..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/sessions/sessions.page.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { Component } from '@angular/core' -import { Pipe, PipeTransform } from '@angular/core' -import { ErrorService, LoadingService } from '@start9labs/shared' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { PlatformType, Session } from 'src/app/services/api/api.types' -import { Observable, Subject, from, map, merge, shareReplay } from 'rxjs' - -@Component({ - selector: 'sessions', - templateUrl: 'sessions.page.html', - styleUrls: ['sessions.page.scss'], -}) -export class SessionsPage { - private readonly sessions$ = from(this.api.getSessions({})) - private readonly localOther$ = new Subject() - private readonly remoteOther$: Observable = - this.sessions$.pipe( - map(s => - Object.entries(s.sessions) - .filter(([id, _]) => id !== s.current) - .map(([id, session]) => ({ - id, - ...session, - })) - .sort( - (a, b) => - new Date(b['last-active']).valueOf() - - new Date(a['last-active']).valueOf(), - ), - ), - ) - - readonly currentSession$ = this.sessions$.pipe( - map(s => s.sessions[s.current]), - shareReplay(), - ) - - readonly otherSessions$ = merge(this.localOther$, this.remoteOther$) - - selected: Record = {} - - constructor( - private readonly loader: LoadingService, - private readonly errorService: ErrorService, - private readonly api: ApiService, - ) {} - - get empty() { - return this.count === 0 - } - - get count() { - return Object.keys(this.selected).length - } - - async toggleChecked(id: string) { - if (this.selected[id]) { - delete this.selected[id] - } else { - this.selected[id] = true - } - } - - async toggleAll(otherSessions: SessionWithId[]) { - if (this.empty) { - otherSessions.forEach(s => (this.selected[s.id] = true)) - } else { - this.selected = {} - } - } - - async kill(otherSessions: SessionWithId[]): Promise { - const ids = Object.keys(this.selected) - - const loader = this.loader - .open(`Terminating session${ids.length > 1 ? 's' : ''}...`) - .subscribe() - - try { - await this.api.killSessions({ ids }) - this.selected = {} - this.localOther$.next(otherSessions.filter(s => !ids.includes(s.id))) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } -} - -interface SessionWithId extends Session { - id: string -} - -@Pipe({ - name: 'platformInfo', -}) -export class PlatformInfoPipe implements PipeTransform { - transform(platforms: PlatformType[]): { name: string; icon: string } { - const info = { - name: '', - icon: 'phone-portrait-outline', - } - - if (platforms.includes('cli')) { - info.name = 'CLI' - info.icon = 'terminal-outline' - } else if (platforms.includes('desktop')) { - info.name = 'Desktop/Laptop' - info.icon = 'desktop-outline' - } else if (platforms.includes('android')) { - info.name = 'Android Device' - } else if (platforms.includes('iphone')) { - info.name = 'iPhone' - } else if (platforms.includes('ipad')) { - info.name = 'iPad' - } else if (platforms.includes('ios')) { - info.name = 'iOS Device' - } else { - info.name = 'Unknown Device' - } - - return info - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/sideload/dnd.directive.ts b/web/projects/ui/src/app/apps/ui/pages/system/sideload/dnd.directive.ts deleted file mode 100644 index 35daf09ef..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/sideload/dnd.directive.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { - Directive, - ElementRef, - EventEmitter, - HostBinding, - HostListener, - Output, -} from '@angular/core' -import { DomSanitizer } from '@angular/platform-browser' - -@Directive({ - selector: '[appDnd]', -}) -export class DragNDropDirective { - @Output() onFileDropped: EventEmitter = new EventEmitter() - - @HostBinding('style.background') private background = 'rgba(24, 24, 24, 0.5)' - - constructor(el: ElementRef, private sanitizer: DomSanitizer) {} - - @HostListener('dragover', ['$event']) public onDragOver(evt: DragEvent) { - evt.preventDefault() - evt.stopPropagation() - this.background = '#6a937b3c' - } - - @HostListener('dragleave', ['$event']) public onDragLeave(evt: DragEvent) { - evt.preventDefault() - evt.stopPropagation() - this.background = 'rgba(24, 24, 24, 0.5)' - } - - @HostListener('drop', ['$event']) public onDrop(evt: DragEvent) { - evt.preventDefault() - evt.stopPropagation() - this.background = ' rgba(24, 24, 24, 0.5)' - this.onFileDropped.emit(evt) - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.module.ts deleted file mode 100644 index a38c4c7b9..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.module.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { SideloadPage } from './sideload.page' -import { RouterModule, Routes } from '@angular/router' -import { EmverPipesModule, SharedPipesModule } from '@start9labs/shared' -import { DragNDropDirective } from './dnd.directive' -import { - AboutModule, - AdditionalModule, - DependenciesModule, - MarketplacePackageHeroComponent, -} from '@start9labs/marketplace' -// TODO: Find a way to not tie two routes together -import { MarketplaceShowControlsComponent } from '../../marketplace/marketplace-show-preview/components/marketplace-show-controls.component' - -const routes: Routes = [ - { - path: '', - component: SideloadPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - SharedPipesModule, - EmverPipesModule, - AboutModule, - AdditionalModule, - MarketplaceShowControlsComponent, - DependenciesModule, - MarketplacePackageHeroComponent, - ], - declarations: [SideloadPage, DragNDropDirective], -}) -export class SideloadPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.html b/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.html deleted file mode 100644 index 3ff228fbd..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Sideload Service - - - - - -
    -

    - - Invalid package file -

    - Try again -
    - - - - -
    -
    - - - -
    -
    - - - - -
    -
    -

    Dependencies

    -
    -
    - -
    -
    -
    -
    - -
    -
    - - -
    - -

    Upload .s9pk package file

    -

    - - Tip: switch to LAN for faster uploads. - -

    - - - - -
    -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.scss deleted file mode 100644 index 3155e4585..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.scss +++ /dev/null @@ -1,44 +0,0 @@ -.inline { - vertical-align: initial; -} - -.drop-area { - display: flex; - background-color: rgba(24, 24, 24, 0.5); - flex-direction: column; - justify-content: center; - align-items: center; - border-style: dashed; - border-width: 2px; - border-color: var(--ion-color-dark); - color: var(--ion-color-dark); - border-radius: 5px; - margin: 20px; - padding: 30px; - min-height: 600px; - - &_filled { - display: flex; - background-color: rgba(24, 24, 24, 0.5); - flex-direction: column; - justify-content: center; - align-items: center; - border-style: solid; - border-width: 2px; - border-color: var(--ion-color-dark); - color: var(--ion-color-dark); - border-radius: 5px; - margin: 60px; - padding: 30px; - min-height: 600px; - min-width: 400px; - } - - &_mobile { - border-width: 0px !important; - } - - ion-input { - color: var(--ion-color-dark); - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.ts deleted file mode 100644 index f60b62ca9..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/sideload/sideload.page.ts +++ /dev/null @@ -1,240 +0,0 @@ -import { Component } from '@angular/core' -import { isPlatform, NavController } from '@ionic/angular' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { Manifest, MarketplacePkg } from '@start9labs/marketplace' -import { ConfigService } from 'src/app/services/config.service' -import { ErrorService, LoadingService } from '@start9labs/shared' -import cbor from 'cbor' - -interface Positions { - [key: string]: [bigint, bigint] // [position, length] -} - -const MAGIC = new Uint8Array([59, 59]) -const VERSION = new Uint8Array([1]) - -@Component({ - selector: 'sideload', - templateUrl: './sideload.page.html', - styleUrls: ['./sideload.page.scss'], -}) -export class SideloadPage { - isMobile = isPlatform(window, 'ios') || isPlatform(window, 'android') - pkgData?: { - pkg: MarketplacePkg - file: File - } - onTor = this.config.isTor() - invalid = false - - constructor( - private readonly loader: LoadingService, - private readonly api: ApiService, - private readonly navCtrl: NavController, - private readonly errorService: ErrorService, - private readonly config: ConfigService, - ) {} - - handleFileDrop(e: any) { - const files = e.dataTransfer.files - this.setFile(files) - } - - handleFileInput(e: any) { - const files = e.target.files - this.setFile(files) - } - - clear() { - this.pkgData = undefined - this.invalid = false - } - - async handleUpload() { - if (!this.pkgData) return - const loader = this.loader.open('Uploading package').subscribe() - const { pkg, file } = this.pkgData - - try { - const guid = await this.api.sideloadPackage({ - manifest: pkg.manifest, - icon: pkg.icon, - size: file.size, - }) - this.api.uploadPackage(guid, file!).catch(e => console.error(e)) - - this.navCtrl.navigateRoot('/services') - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - this.clear() - } - } - - private async setFile(files?: File[]) { - if (!files || !files.length) return - const file = files[0] - if (!file) return - - await this.validateS9pk(file) - } - - private async validateS9pk(file: File) { - const magic = new Uint8Array(await blobToBuffer(file.slice(0, 2))) - const version = new Uint8Array(await blobToBuffer(file.slice(2, 3))) - if (compare(magic, MAGIC) && compare(version, VERSION)) { - this.pkgData = { - pkg: await this.parseS9pk(file), - file, - } - } else { - this.invalid = true - } - } - - private async parseS9pk(file: File): Promise { - const positions: Positions = {} - // magic=2bytes, version=1bytes, pubkey=32bytes, signature=64bytes, toc_length=4bytes = 103byte is starting point - let start = 103 - let end = start + 1 // 104 - const tocLength = new DataView( - await blobToBuffer(file.slice(99, 103) ?? new Blob()), - ).getUint32(0, false) - await getPositions(start, end, file, positions, tocLength as any) - - const manifest = await this.getAsset(positions, file, 'manifest') - const [icon] = await Promise.all([ - this.getIcon(positions, file, manifest), - // this.getAsset(positions, file, 'license'), - // this.getAsset(positions, file, 'instructions'), - ]) - - return { - manifest, - icon, - license: '', - instructions: '', - categories: [], - versions: [], - 'dependency-metadata': {}, - 'published-at': '', - } - } - - private async getAsset( - positions: Positions, - file: Blob, - asset: 'manifest' | 'license' | 'instructions', - ): Promise { - const data = await blobToBuffer( - file.slice( - Number(positions[asset][0]), - Number(positions[asset][0]) + Number(positions[asset][1]), - ), - ) - return cbor.decode(data, true) - } - - private async getIcon( - positions: Positions, - file: Blob, - manifest: Manifest, - ): Promise { - const contentType = `image/${manifest.assets.icon.split('.').pop()}` - const data = file.slice( - Number(positions['icon'][0]), - Number(positions['icon'][0]) + Number(positions['icon'][1]), - contentType, - ) - return blobToDataURL(data) - } -} - -async function getPositions( - initialStart: number, - initialEnd: number, - file: Blob, - positions: Positions, - tocLength: number, -) { - let start = initialStart - let end = initialEnd - const titleLength = new Uint8Array( - await blobToBuffer(file.slice(start, end)), - )[0] - const tocTitle = await file.slice(end, end + titleLength).text() - start = end + titleLength - end = start + 8 - const chapterPosition = new DataView( - await blobToBuffer(file.slice(start, end)), - ).getBigUint64(0, false) - start = end - end = start + 8 - const chapterLength = new DataView( - await blobToBuffer(file.slice(start, end)), - ).getBigUint64(0, false) - - positions[tocTitle] = [chapterPosition, chapterLength] - start = end - end = start + 1 - if (end <= tocLength + (initialStart - 1)) { - await getPositions(start, end, file, positions, tocLength) - } -} - -async function readBlobAsDataURL( - f: Blob | File, -): Promise { - const reader = new FileReader() - return new Promise((resolve, reject) => { - reader.onloadend = () => { - resolve(reader.result) - } - reader.readAsDataURL(f) - reader.onerror = _ => reject(new Error('error reading blob')) - }) -} -async function blobToDataURL(data: Blob | File): Promise { - const res = await readBlobAsDataURL(data) - if (res instanceof ArrayBuffer) { - throw new Error('readBlobAsDataURL response should not be an array buffer') - } - if (res == null) { - throw new Error('readBlobAsDataURL response should not be null') - } - if (typeof res === 'string') return res - throw new Error('no possible blob to data url resolution found') -} - -async function blobToBuffer(data: Blob | File): Promise { - const res = await readBlobToArrayBuffer(data) - if (res instanceof String) { - throw new Error('readBlobToArrayBuffer response should not be a string') - } - if (res == null) { - throw new Error('readBlobToArrayBuffer response should not be null') - } - if (res instanceof ArrayBuffer) return res - throw new Error('no possible blob to array buffer resolution found') -} - -async function readBlobToArrayBuffer( - f: Blob | File, -): Promise { - const reader = new FileReader() - return new Promise((resolve, reject) => { - reader.onloadend = () => { - resolve(reader.result) - } - reader.readAsArrayBuffer(f) - reader.onerror = _ => reject(new Error('error reading blob')) - }) -} - -function compare(a: Uint8Array, b: Uint8Array) { - for (let i = 0; i < a.length; i++) { - if (a[i] !== b[i]) return false - } - return true -} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.module.ts deleted file mode 100644 index 84114149a..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.module.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { RouterModule, Routes } from '@angular/router' -import { SharedPipesModule } from '@start9labs/shared' -import { PromptModule } from 'src/app/apps/ui/modals/prompt/prompt.module' -import { SSHKeysPage } from './ssh-keys.page' -import { TuiNotificationModule } from '@taiga-ui/core' - -const routes: Routes = [ - { - path: '', - component: SSHKeysPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - SharedPipesModule, - PromptModule, - TuiNotificationModule, - RouterModule.forChild(routes), - ], - declarations: [SSHKeysPage], -}) -export class SSHKeysPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.html b/web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.html deleted file mode 100644 index ff61301a0..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - SSH Keys - - - - -
    - - Adding domains to StartOS enables you to access your server and service - interfaces over clearnet. - View instructions - -
    - - - - Saved Keys - - - Add Key - - - -
    - - - Hostname - Created At - Algorithm - Fingerprint - - - - - - - - - - - - - - {{ ssh.hostname }} - - {{ ssh['created-at'] | date: 'medium' }} - - {{ ssh.alg }} - {{ ssh.fingerprint }} - - - - - - - - - - -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.ts deleted file mode 100644 index 67c10271b..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/ssh-keys/ssh-keys.page.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { Component } from '@angular/core' -import { ErrorService, LoadingService } from '@start9labs/shared' -import { TuiDialogService } from '@taiga-ui/core' -import { BehaviorSubject, filter, take } from 'rxjs' -import { SSHKey } from 'src/app/services/api/api.types' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { PROMPT } from 'src/app/apps/ui/modals/prompt/prompt.component' -import { TUI_PROMPT } from '@taiga-ui/kit' - -@Component({ - selector: 'ssh-keys', - templateUrl: 'ssh-keys.page.html', - styleUrls: ['ssh-keys.page.scss'], -}) -export class SSHKeysPage { - readonly docsUrl = 'https://docs.start9.com/0.3.5.x/user-manual/ssh' - sshKeys: SSHKey[] = [] - loading$ = new BehaviorSubject(true) - - constructor( - private readonly loader: LoadingService, - private readonly dialogs: TuiDialogService, - private readonly errorService: ErrorService, - private readonly embassyApi: ApiService, - ) {} - - async ngOnInit() { - await this.getKeys() - } - - async getKeys(): Promise { - try { - this.sshKeys = await this.embassyApi.getSshKeys({}) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - this.loading$.next(false) - } - } - - async presentModalAdd() { - this.dialogs - .open(PROMPT, { - label: 'SSH Key', - data: { - message: - 'Enter the SSH public key you would like to authorize for root access to your Embassy.', - }, - }) - .pipe(take(1)) - .subscribe(pk => this.add(pk)) - } - - presentAlertDelete(key: SSHKey, i: number) { - this.dialogs - .open(TUI_PROMPT, { - label: 'Confirm', - size: 's', - data: { - content: 'Delete key? This action cannot be undone.', - yes: 'Delete', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => this.delete(key, i)) - } - - private async add(pubkey: string): Promise { - const loader = this.loader.open('Saving...').subscribe() - - try { - const key = await this.embassyApi.addSshKey({ key: pubkey }) - this.sshKeys.push(key) - } finally { - loader.unsubscribe() - } - } - - private async delete(key: SSHKey, i: number): Promise { - const loader = this.loader.open('Deleting...').subscribe() - - try { - await this.embassyApi.deleteSshKey({ fingerprint: key.fingerprint }) - this.sshKeys.splice(i, 1) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/system.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/system.module.ts deleted file mode 100644 index b7096753f..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/system.module.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { NgModule } from '@angular/core' -import { Routes, RouterModule } from '@angular/router' - -const routes: Routes = [ - { - path: '', - loadChildren: () => - import('./server-show/server-show.module').then( - m => m.ServerShowPageModule, - ), - }, - { - path: 'interfaces/ui', - loadChildren: () => - import('./ui-details/ui-details.module').then(m => m.UIDetailsPageModule), - }, - { - path: 'router-config', - loadChildren: () => - import('./router/router.module').then(m => m.RouterPageModule), - }, - { - path: 'logs', - loadChildren: () => - import('./server-logs/server-logs.module').then( - m => m.ServerLogsPageModule, - ), - }, - { - path: 'kernel-logs', - loadChildren: () => - import('./kernel-logs/kernel-logs.module').then( - m => m.KernelLogsPageModule, - ), - }, - { - path: 'tor-logs', - loadChildren: () => - import('./tor-logs/tor-logs.module').then(m => m.TorLogsPageModule), - }, - { - path: 'metrics', - loadChildren: () => - import('./server-metrics/server-metrics.module').then( - m => m.ServerMetricsPageModule, - ), - }, - { - path: 'sessions', - loadChildren: () => - import('./sessions/sessions.module').then(m => m.SessionsPageModule), - }, - { - path: 'sideload', - loadChildren: () => - import('./sideload/sideload.module').then(m => m.SideloadPageModule), - }, - { - path: 'specs', - loadChildren: () => - import('./server-specs/server-specs.module').then( - m => m.ServerSpecsPageModule, - ), - }, - { - path: 'domains', - loadChildren: () => - import('./domains/domains.module').then(m => m.DomainsPageModule), - }, - { - path: 'proxies', - loadChildren: () => - import('./proxies/proxies.module').then(m => m.ProxiesPageModule), - }, - { - path: 'ssh', - loadChildren: () => - import('./ssh-keys/ssh-keys.module').then(m => m.SSHKeysPageModule), - }, - { - path: 'wifi', - loadChildren: () => - import('./wifi/wifi.module').then(m => m.WifiPageModule), - }, - { - path: 'experimental-features', - loadChildren: () => - import('./experimental-features/experimental-features.module').then( - m => m.ExperimentalFeaturesPageModule, - ), - }, - { - path: 'email', - loadChildren: () => - import('./email/email.module').then(m => m.EmailPageModule), - }, -] - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class SystemModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.component.html b/web/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.component.html deleted file mode 100644 index e475a729a..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.component.html +++ /dev/null @@ -1,23 +0,0 @@ - - - -

    Theme

    -

    {{ value }}

    -
    -
    - - - - diff --git a/web/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.component.ts b/web/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.component.ts deleted file mode 100644 index dc8e0e329..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.component.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' - -import { ThemeSwitcherService } from 'src/app/services/theme-switcher.service' - -@Component({ - selector: 'theme-switcher', - templateUrl: './theme-switcher.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class ThemeSwitcherComponent { - value = this.switcher.value - - open = false - - readonly themes = ['Dark', 'Light'] - - constructor(private readonly switcher: ThemeSwitcherService) {} - - onChange(value: string): void { - this.value = value - this.switcher.next(value) - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.module.ts deleted file mode 100644 index 4d817e933..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/theme-switcher/theme-switcher.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NgModule } from '@angular/core' -import { FormsModule } from '@angular/forms' -import { IonicModule } from '@ionic/angular' -import { TuiDialogModule } from '@taiga-ui/core' -import { TuiRadioListModule } from '@taiga-ui/kit' - -import { ThemeSwitcherComponent } from './theme-switcher.component' - -@NgModule({ - imports: [IonicModule, FormsModule, TuiDialogModule, TuiRadioListModule], - declarations: [ThemeSwitcherComponent], - exports: [ThemeSwitcherComponent], -}) -export class ThemeSwitcherModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.module.ts deleted file mode 100644 index 9e4f29130..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { Routes, RouterModule } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { TorLogsPage } from './tor-logs.page' -import { LogsComponentModule } from 'src/app/common/logs/logs.component.module' - -const routes: Routes = [ - { - path: '', - component: TorLogsPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - LogsComponentModule, - ], - declarations: [TorLogsPage], -}) -export class TorLogsPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.html b/web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.html deleted file mode 100644 index 43fb6ff18..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.html +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.ts deleted file mode 100644 index 4fc304715..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/tor-logs/tor-logs.page.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Component } from '@angular/core' -import { RR } from 'src/app/services/api/api.types' -import { ApiService } from 'src/app/services/api/embassy-api.service' - -@Component({ - selector: 'tor-logs', - templateUrl: './tor-logs.page.html', - styleUrls: ['./tor-logs.page.scss'], -}) -export class TorLogsPage { - constructor(private readonly api: ApiService) {} - - followLogs() { - return async (params: RR.FollowServerLogsReq) => { - return this.api.followTorLogs(params) - } - } - - fetchLogs() { - return async (params: RR.GetServerLogsReq) => { - return this.api.getTorLogs(params) - } - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.module.ts deleted file mode 100644 index c347dd42b..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { Routes, RouterModule } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { UIDetailsPage } from './ui-details.page' -import { InterfaceAddressesComponentModule } from 'src/app/common/interface-addresses/interface-addresses.module' - -const routes: Routes = [ - { - path: '', - component: UIDetailsPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - InterfaceAddressesComponentModule, - ], - declarations: [UIDetailsPage], -}) -export class UIDetailsPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.html b/web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.html deleted file mode 100644 index 0b7f18ccb..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - StartOS UI - - - - -
    - -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.ts deleted file mode 100644 index 51c1297a6..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/ui-details/ui-details.page.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' -import { PatchDB } from 'patch-db-client' -import { DataModel } from 'src/app/services/patch-db/data-model' - -@Component({ - selector: 'ui-details', - templateUrl: './ui-details.page.html', - styleUrls: ['./ui-details.page.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class UIDetailsPage { - readonly ui$ = this.patch.watch$('server-info', 'ui') - - constructor(private readonly patch: PatchDB) {} -} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.module.ts b/web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.module.ts deleted file mode 100644 index 92323a129..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.module.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { RouterModule, Routes } from '@angular/router' -import { SharedPipesModule } from '@start9labs/shared' -import { TuiLetModule } from '@taiga-ui/cdk' -import { FormPageModule } from 'src/app/apps/ui/modals/form/form.module' -import { WifiPage, ToWifiIconPipe } from './wifi.page' - -const routes: Routes = [ - { - path: '', - component: WifiPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - SharedPipesModule, - TuiLetModule, - FormPageModule, - RouterModule.forChild(routes), - ], - declarations: [WifiPage, ToWifiIconPipe], -}) -export class WifiPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.html b/web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.html deleted file mode 100644 index 5680a3696..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - WiFi Settings - - - - -
    - - - -

    - Adding WiFi credentials to StartOS allows you to remove the Ethernet - cable and move the device anywhere you want. StartOS will - automatically connect to available networks. - - View instructions - -

    -
    -
    - - Wi-Fi - - -
    - - - - - - Known Networks - - - - -

    {{ ssid.key }}

    -

    - - Connected -

    -
    -
    - - - - -
    - - - - - Connect - - - Forget this network - - - - -
    -
    - - Other Networks - - - - {{ avWifi.ssid }} -
    - - Connect - - - -
    -
    -
    -
    -
    - - Other... - -
    -
    - - - - Known Networks - - - - - - - - Other Networks - - - - - - - - -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.scss b/web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.scss deleted file mode 100644 index e2b0409c1..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.scss +++ /dev/null @@ -1,36 +0,0 @@ -.no-padding { - padding-right: 0; -} - -.skeleton-parts { - ion-button::part(native) { - padding-inline-start: 0; - padding-inline-end: 0; - }; -} - -.connect-button { - font-size: 10px; - font-weight: bold; - margin-right: 12px; -} - -.slot-end { - margin-left: 4px; -} - -ion-item-divider { - text-transform: unset; - padding-bottom: 12px; - padding-left: 0; -} - -ion-item-group { - background-color: #1e2024; - border: 1px solid #717171; - border-radius: 6px; -} - -ion-item { - --background: #1e2024; -} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.ts b/web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.ts deleted file mode 100644 index 842853177..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/system/wifi/wifi.page.ts +++ /dev/null @@ -1,279 +0,0 @@ -import { Component, Pipe, PipeTransform } from '@angular/core' -import { - TuiAlertService, - TuiDialogOptions, - TuiNotification, -} from '@taiga-ui/core' -import { ToggleCustomEvent } from '@ionic/core' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { AvailableWifi, RR } from 'src/app/services/api/api.types' -import { ErrorService, LoadingService, pauseFor } from '@start9labs/shared' -import { FormDialogService } from 'src/app/services/form-dialog.service' -import { FormContext, FormPage } from 'src/app/apps/ui/modals/form/form.page' -import { PatchDB } from 'patch-db-client' -import { DataModel } from 'src/app/services/patch-db/data-model' -import { ConnectionService } from 'src/app/services/connection.service' -import { - BehaviorSubject, - catchError, - distinctUntilChanged, - filter, - from, - merge, - Observable, - Subject, - switchMap, - tap, -} from 'rxjs' -import { wifiSpec } from './wifi.const' - -interface WiFiForm { - ssid: string - password: string -} - -@Component({ - selector: 'wifi', - templateUrl: 'wifi.page.html', - styleUrls: ['wifi.page.scss'], -}) -export class WifiPage { - readonly connected$ = this.connectionService.connected$.pipe(filter(Boolean)) - readonly enabled$ = this.patch - .watch$('server-info', 'network', 'wifi', 'enabled') - .pipe( - distinctUntilChanged(), - tap(enabled => { - if (enabled) this.trigger$.next('') - }), - ) - readonly trigger$ = new BehaviorSubject('') - readonly localChanges$ = new Subject() - readonly wifi$ = merge( - this.trigger$.pipe(switchMap(() => this.getWifi$())), - this.localChanges$, - ) - - constructor( - private readonly api: ApiService, - private readonly alerts: TuiAlertService, - private readonly loader: LoadingService, - private readonly formDialog: FormDialogService, - private readonly errorService: ErrorService, - private readonly patch: PatchDB, - private readonly connectionService: ConnectionService, - ) {} - - async toggleWifi(e: ToggleCustomEvent): Promise { - const enable = e.detail.checked - const loader = this.loader - .open(enable ? 'Enabling Wifi' : 'Disabling WiFi') - .subscribe() - - try { - await this.api.enableWifi({ enable }) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } - - async connect(ssid: string): Promise { - const loader = this.loader - .open('Connecting. This could take a while...') - .subscribe() - - try { - await this.api.connectWifi({ ssid }) - await this.confirmWifi(ssid) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } - - async forget(ssid: string, wifi: RR.GetWifiRes): Promise { - const loader = this.loader.open('Deleting...').subscribe() - - try { - await this.api.deleteWifi({ ssid }) - delete wifi.ssids[ssid] - this.localChanges$.next(wifi) - this.trigger$.next('') - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } - - async presentModalAdd(network: AvailableWifi) { - if (!network.security.length) { - this.connect(network.ssid) - } else { - const options: Partial>> = { - label: 'Password Needed', - data: { - spec: wifiSpec.spec, - buttons: [ - { - text: 'Connect', - handler: async ({ ssid, password }) => - this.saveAndConnect(ssid, password), - }, - ], - }, - } - this.formDialog.open(FormPage, options) - } - } - - presentModalAddOther(wifi: RR.GetWifiRes) { - const options: Partial>> = { - label: wifiSpec.name, - data: { - spec: wifiSpec.spec, - buttons: [ - { - text: 'Save for Later', - handler: async ({ ssid, password }) => - this.save(ssid, password, wifi), - }, - { - text: 'Save and Connect', - handler: async ({ ssid, password }) => - this.saveAndConnect(ssid, password), - }, - ], - }, - } - this.formDialog.open(FormPage, options) - } - - private getWifi$(): Observable { - return from(this.api.getWifi({}, 10000)).pipe( - catchError((e: any) => { - this.errorService.handleError(e) - return [] - }), - ) - } - - private presentToastSuccess() { - this.alerts - .open('Connection successful!', { - status: TuiNotification.Success, - }) - .subscribe() - } - - private async presentToastFail(): Promise { - this.alerts - .open('Check credentials and try again', { - label: 'Failed to connect', - status: TuiNotification.Warning, - }) - .subscribe() - } - - private async save( - ssid: string, - password: string, - wifi: RR.GetWifiRes, - ): Promise { - const loader = this.loader.open('Saving...').subscribe() - - try { - await this.api.addWifi({ - ssid, - password, - priority: 0, - connect: false, - }) - wifi.ssids[ssid] = 0 - this.localChanges$.next(wifi) - this.trigger$.next('') - return true - } catch (e: any) { - this.errorService.handleError(e) - return false - } finally { - loader.unsubscribe() - } - } - - private async saveAndConnect( - ssid: string, - password: string, - ): Promise { - const loader = this.loader - .open('Connecting. This could take a while...') - .subscribe() - - try { - await this.api.addWifi({ - ssid, - password, - priority: 0, - connect: true, - }) - await this.confirmWifi(ssid) - return true - } catch (e: any) { - this.errorService.handleError(e) - return false - } finally { - loader.unsubscribe() - } - } - - private async confirmWifi(ssid: string): Promise { - const maxAttempts = 5 - let attempts = 0 - - while (true) { - if (attempts > maxAttempts) { - this.presentToastFail() - break - } - - try { - const start = new Date().valueOf() - const newWifi = await this.api.getWifi({}, 10000) - const end = new Date().valueOf() - if (newWifi.connected === ssid) { - this.localChanges$.next(newWifi) - this.presentToastSuccess() - break - } else { - attempts++ - const diff = end - start - // depending on the response time, wait a min of 1000 ms, and a max of 4000 ms in between retries. Both 1000 and 4000 are arbitrary - await pauseFor(Math.max(1000, 4000 - diff)) - } - } catch (e) { - attempts++ - console.warn(e) - } - } - } -} - -@Pipe({ - name: 'toWifiIcon', -}) -export class ToWifiIconPipe implements PipeTransform { - transform(signal: number): string { - if (signal >= 0 && signal < 5) { - return 'assets/img/icons/wifi-0.png' - } else if (signal >= 5 && signal < 50) { - return 'assets/img/icons/wifi-1.png' - } else if (signal >= 50 && signal < 90) { - return 'assets/img/icons/wifi-2.png' - } else { - return 'assets/img/icons/wifi-3.png' - } - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/updates/filter-updates.pipe.ts b/web/projects/ui/src/app/apps/ui/pages/updates/filter-updates.pipe.ts deleted file mode 100644 index ab2497b5b..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/updates/filter-updates.pipe.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core' -import { Emver } from '@start9labs/shared' -import { MarketplacePkg } from '@start9labs/marketplace' -import { PackageDataEntry } from 'src/app/services/patch-db/data-model' - -@Pipe({ - name: 'filterUpdates', -}) -export class FilterUpdatesPipe implements PipeTransform { - constructor(private readonly emver: Emver) {} - - transform( - pkgs: MarketplacePkg[], - local: Record, - ): MarketplacePkg[] { - return pkgs.filter( - ({ manifest }) => - this.emver.compare( - manifest.version, - local[manifest.id]?.manifest.version, // @TODO this won't work, need old version - ) === 1, - ) - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/updates/install-progress.pipe.ts b/web/projects/ui/src/app/apps/ui/pages/updates/install-progress.pipe.ts deleted file mode 100644 index 9ecf86dc3..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/updates/install-progress.pipe.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core' -import { InstallProgress } from 'src/app/services/patch-db/data-model' -import { packageLoadingProgress } from 'src/app/util/package-loading-progress' - -@Pipe({ - name: 'installProgress', -}) -export class InstallProgressPipe implements PipeTransform { - transform(installProgress?: InstallProgress): number { - return packageLoadingProgress(installProgress)?.totalProgress || 0 - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts b/web/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts deleted file mode 100644 index 28b881b41..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/updates/updates.module.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { RouterModule, Routes } from '@angular/router' -import { - MimeTypePipeModule, - StoreIconComponentModule, -} from '@start9labs/marketplace' -import { - EmverPipesModule, - MarkdownPipeModule, - SafeLinksDirective, - SharedPipesModule, -} from '@start9labs/shared' -import { NgDompurifyModule } from '@tinkoff/ng-dompurify' -import { TuiProgressModule } from '@taiga-ui/kit' -import { BadgeMenuComponentModule } from 'src/app/common/badge-menu-button/badge-menu.component.module' -import { SkeletonListComponentModule } from 'src/app/common/skeleton-list/skeleton-list.component.module' -import { UpdatesPage } from './updates.page' -import { InstallProgressPipe } from './install-progress.pipe' -import { FilterUpdatesPipe } from './filter-updates.pipe' - -const routes: Routes = [ - { - path: '', - component: UpdatesPage, - }, -] - -@NgModule({ - declarations: [UpdatesPage, FilterUpdatesPipe, InstallProgressPipe], - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - BadgeMenuComponentModule, - SharedPipesModule, - SkeletonListComponentModule, - MarkdownPipeModule, - StoreIconComponentModule, - EmverPipesModule, - MimeTypePipeModule, - SafeLinksDirective, - NgDompurifyModule, - TuiProgressModule, - ], - exports: [FilterUpdatesPipe, InstallProgressPipe], -}) -export class UpdatesPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/updates/updates.page.html b/web/projects/ui/src/app/apps/ui/pages/updates/updates.page.html deleted file mode 100644 index 33c3a8a68..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/updates/updates.page.html +++ /dev/null @@ -1,124 +0,0 @@ - - - Updates - - - - - - - - -
    - - -   - - {{ host.name }} - - - - - Request Failed - - - - - -
    - - - - - - -

    {{ pkg.manifest.title }}

    -

    - - - {{ local.manifest.version || '' | displayEmver }} - -   - -   - - {{ pkg.manifest.version | displayEmver }} - -

    -

    - {{ error }} -

    -
    -
    - - - - - - {{ marketplaceService.updateErrors[pkg.manifest.id] ? - 'Retry' : 'Update' }} - - - -
    -
    -
    -
    -
    What's new
    -

    -
    - - View listing - - -
    -
    -
    -
    - - All services are up to date! - -
    -
    - - -
    - -
    -
    -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/updates/updates.page.scss b/web/projects/ui/src/app/apps/ui/pages/updates/updates.page.scss deleted file mode 100644 index 11f135fda..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/updates/updates.page.scss +++ /dev/null @@ -1,26 +0,0 @@ -.item-container { - border-bottom: 1px solid #373737; - padding: 12px 0; -} - -.notes { - margin-left: 20px; - - h5 { - font-weight: 600; - } -} - -ion-item-divider { - --padding-top: 8px; - --padding-bottom: 8px; - --background: var(--ion-color-medium-tint); -} - -ion-item { - --background-hover: none; - - &::part(native) { - cursor: context-menu; - } -} \ No newline at end of file diff --git a/web/projects/ui/src/app/apps/ui/pages/updates/updates.page.ts b/web/projects/ui/src/app/apps/ui/pages/updates/updates.page.ts deleted file mode 100644 index ca0ff1f87..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/updates/updates.page.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { Component, Inject } from '@angular/core' -import { PatchDB } from 'patch-db-client' -import { - DataModel, - PackageDataEntry, -} from 'src/app/services/patch-db/data-model' -import { MarketplaceService } from 'src/app/services/marketplace.service' -import { - AbstractMarketplaceService, - Manifest, - Marketplace, - StoreIdentity, -} from '@start9labs/marketplace' -import { LoadingService } from '@start9labs/shared' -import { TuiDialogService } from '@taiga-ui/core' -import { NavController } from '@ionic/angular' -import { hasCurrentDeps } from 'src/app/util/has-deps' -import { getAllPackages } from 'src/app/util/get-package-data' -import { ConfigService } from 'src/app/services/config.service' -import { TUI_PROMPT } from '@taiga-ui/kit' -import { Emver, isEmptyObject } from '@start9labs/shared' -import { combineLatest, Observable } from 'rxjs' -import { dryUpdate } from 'src/app/util/dry-update' - -interface UpdatesData { - hosts: StoreIdentity[] - marketplace: Marketplace - localPkgs: Record - errors: string[] -} - -@Component({ - selector: 'updates', - templateUrl: 'updates.page.html', - styleUrls: ['updates.page.scss'], -}) -export class UpdatesPage { - readonly data$: Observable = combineLatest({ - hosts: this.marketplaceService.getKnownHosts$(true), - marketplace: this.marketplaceService.getMarketplace$(), - localPkgs: this.patch.watch$('package-data'), - errors: this.marketplaceService.getRequestErrors$(), - }) - - constructor( - @Inject(AbstractMarketplaceService) - readonly marketplaceService: MarketplaceService, - private readonly patch: PatchDB, - private readonly navCtrl: NavController, - private readonly loader: LoadingService, - private readonly dialogs: TuiDialogService, - private readonly emver: Emver, - readonly config: ConfigService, - ) {} - - viewInMarketplace(event: Event, url: string, id: string) { - event.stopPropagation() - - this.navCtrl.navigateForward([`marketplace/${id}`], { - queryParams: { url }, - }) - } - - async tryUpdate( - manifest: Manifest, - url: string, - local: PackageDataEntry, - e: Event, - ): Promise { - e.stopPropagation() - - const { id, version } = manifest - - delete this.marketplaceService.updateErrors[id] - this.marketplaceService.updateQueue[id] = true - - if (hasCurrentDeps(local)) { - this.dryInstall(manifest, url) - } else { - this.install(id, version, url) - } - } - - private async dryInstall(manifest: Manifest, url: string) { - const { id, version, title } = manifest - - const breakages = dryUpdate( - manifest, - await getAllPackages(this.patch), - this.emver, - ) - - if (isEmptyObject(breakages)) { - this.install(id, version, url) - } else { - const proceed = await this.presentAlertBreakages(title, breakages) - if (proceed) { - this.install(id, version, url) - } else { - delete this.marketplaceService.updateQueue[id] - } - } - } - - private async presentAlertBreakages( - title: string, - breakages: string[], - ): Promise { - let content: string = `As a result of updating ${title}, the following services will no longer work properly and may crash:
      ` - const bullets = breakages.map(depTitle => { - return `
    • ${depTitle}
    • ` - }) - content = `${content}${bullets.join('')}
    ` - - return new Promise(async resolve => { - this.dialogs - .open(TUI_PROMPT, { - label: 'Warning', - size: 's', - data: { - content, - yes: 'Continue', - no: 'Cancel', - }, - }) - .subscribe(response => resolve(response)) - }) - } - - private async install(id: string, version: string, url: string) { - try { - await this.marketplaceService.installPackage(id, version, url) - delete this.marketplaceService.updateQueue[id] - } catch (e: any) { - delete this.marketplaceService.updateQueue[id] - this.marketplaceService.updateErrors[id] = e.message - } - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.html b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.html deleted file mode 100644 index bef3063ad..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.html +++ /dev/null @@ -1,13 +0,0 @@ -
    - - No additional widgets found -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.scss b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.scss deleted file mode 100644 index f4c4a3171..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.scss +++ /dev/null @@ -1,16 +0,0 @@ -.wrapper { - display: flex; - flex-direction: column; - gap: 12px; -} - -.button { - background: transparent; - text-align: left; - font-size: 18px; - font-weight: bold; - border: none; - border-radius: 16px; - padding: 16px; - box-shadow: inset 0 0 0 1px var(--tui-base-03); -} diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.ts deleted file mode 100644 index 9feb5dee6..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.component.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { ChangeDetectionStrategy, Component, inject } from '@angular/core' -import { PatchDB } from 'patch-db-client' -import { DataModel, Widget } from 'src/app/services/patch-db/data-model' -import { - POLYMORPHEUS_CONTEXT, - PolymorpheusComponent, -} from '@tinkoff/ng-polymorpheus' -import { TuiDialogContext } from '@taiga-ui/core' -import { BUILT_IN_WIDGETS } from '../widgets' - -@Component({ - selector: 'add-widget', - templateUrl: './add.component.html', - styleUrls: ['./add.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AddWidgetComponent { - readonly context = inject>(POLYMORPHEUS_CONTEXT) - - readonly installed$ = inject(PatchDB).watch$('ui', 'widgets') - - readonly widgets = BUILT_IN_WIDGETS - - readonly filter = (widget: Widget, installed: readonly Widget[]) => - !installed.find(({ id }) => id === widget.id) -} - -export const ADD_WIDGET = new PolymorpheusComponent< - AddWidgetComponent, - TuiDialogContext ->(AddWidgetComponent) diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.module.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.module.ts deleted file mode 100644 index 94db46596..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/add/add.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { TuiFilterPipeModule, TuiForModule } from '@taiga-ui/cdk' - -import { AddWidgetComponent } from './add.component' - -@NgModule({ - imports: [CommonModule, TuiFilterPipeModule, TuiForModule], - declarations: [AddWidgetComponent], - exports: [AddWidgetComponent], -}) -export class AddWidgetModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.html b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.html deleted file mode 100644 index e45790dc8..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.html +++ /dev/null @@ -1 +0,0 @@ -Add to quick launch diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.scss b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.scss deleted file mode 100644 index d5ef561a9..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -.add { - font-size: 13px; -} diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.ts deleted file mode 100644 index 40a238158..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.component.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' - -@Component({ - selector: 'widget-favorites', - templateUrl: './favorites.component.html', - styleUrls: ['./favorites.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class FavoritesComponent {} diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.module.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.module.ts deleted file mode 100644 index 2f60117c3..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/favorites/favorites.module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { NgModule } from '@angular/core' -import { FavoritesComponent } from './favorites.component' -import { IonicModule } from '@ionic/angular' - -@NgModule({ - imports: [IonicModule], - declarations: [FavoritesComponent], - exports: [FavoritesComponent], -}) -export class FavoritesModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.html b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.html deleted file mode 100644 index b10313ac3..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.html +++ /dev/null @@ -1,11 +0,0 @@ -

    Service health overview

    - - - {{ labels[index] }}: {{ data[index] }} - - diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.scss b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.scss deleted file mode 100644 index 8ba371967..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.scss +++ /dev/null @@ -1,19 +0,0 @@ -:host { - /* index order must match labels array */ - --tui-chart-0: var(--ion-color-danger-tint); // error - --tui-chart-1: var(--ion-color-success-tint); // healthy - --tui-chart-2: var(--ion-color-warning-tint); // needs attention - --tui-chart-3: var(--ion-color-step-600); // stopped - --tui-chart-4: var(--ion-color-primary-tint); // transitioning -} - -.widget-title { - margin: 0; - font-size: 18px; - font-weight: bold; -} - -.ring-chart { - transform: scale(0.85); - margin: 0.6rem auto; -} diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.ts deleted file mode 100644 index 4a1213d9b..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.component.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { ChangeDetectionStrategy, Component, inject } from '@angular/core' -import { PatchDB } from 'patch-db-client' -import { map } from 'rxjs/operators' -import { - DataModel, - PackageDataEntry, -} from 'src/app/services/patch-db/data-model' -import { PrimaryStatus } from 'src/app/services/pkg-status-rendering.service' -import { getPackageInfo } from 'src/app/util/get-package-info' -import { PkgInfo } from 'src/app/types/pkg-info' -import { combineLatest } from 'rxjs' -import { DepErrorService } from 'src/app/services/dep-error.service' - -@Component({ - selector: 'widget-health', - templateUrl: './health.component.html', - styleUrls: ['./health.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class HealthComponent { - readonly labels = [ - 'Error', - 'Healthy', - 'Needs Attention', - 'Stopped', - 'Transitioning', - ] as const - - readonly data$ = combineLatest([ - inject(PatchDB).watch$('package-data'), - inject(DepErrorService).depErrors$, - ]).pipe( - map(([data, depErrors]) => { - const pkgs = Object.values(data).map(pkg => - getPackageInfo(pkg, depErrors[pkg.manifest.id]), - ) - const result = this.labels.reduce>( - (acc, label) => ({ - ...acc, - [label]: this.getCount(label, pkgs), - }), - {}, - ) - - result['Healthy'] = - pkgs.length - - result['Error'] - - result['Needs Attention'] - - result['Stopped'] - - result['Transitioning'] - - return this.labels.map(label => result[label]) - }), - ) - - private getCount(label: string, pkgs: PkgInfo[]): number { - switch (label) { - case 'Error': - return pkgs.filter( - a => a.primaryStatus !== PrimaryStatus.Stopped && a.error, - ).length - case 'Needs Attention': - return pkgs.filter(a => a.warning).length - case 'Stopped': - return pkgs.filter(a => a.primaryStatus === PrimaryStatus.Stopped) - .length - case 'Transitioning': - return pkgs.filter(a => a.transitioning).length - default: - return 0 - } - } -} diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.module.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.module.ts deleted file mode 100644 index 31f5f0107..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/health/health.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { NgModule } from '@angular/core' -import { HealthComponent } from './health.component' -import { TuiRingChartModule } from '@taiga-ui/addon-charts' -import { TuiHintModule } from '@taiga-ui/core' -import { CommonModule } from '@angular/common' - -@NgModule({ - imports: [CommonModule, TuiRingChartModule, TuiHintModule], - declarations: [HealthComponent], - exports: [HealthComponent], -}) -export class HealthModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.html b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.html deleted file mode 100644 index 1d80ce23d..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.html +++ /dev/null @@ -1,30 +0,0 @@ -
    -
    - -
    - 30% -
    Storage
    -
    -
    -
    - -
    - 10% -
    CPU
    -
    -
    -
    - -
    - 10% -
    Memory
    -
    -
    -
    - -
    - 50.6⁰C -
    Temp
    -
    -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.scss b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.scss deleted file mode 100644 index 3af62e77e..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.scss +++ /dev/null @@ -1,34 +0,0 @@ -.stats { - display: flex; - align-items: center; - justify-content: space-around; - flex-wrap: wrap; - height: 100%; - text-align: center; - - &_mobile .stat { - width: 50%; - } -} - -.stat { - display: flex; - align-items: center; - justify-content: center; - - :host-context(.wrapper_mobile) & { - width: 50%; - } -} - -.stat-icon { - font-size: 32px; - margin: 12px; -} - -.description { - color: #3a7be0; - text-transform: uppercase; - font-weight: bold; - font-size: 12px; -} diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.ts deleted file mode 100644 index 813fff9f2..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.component.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' - -@Component({ - selector: 'widget-metrics', - templateUrl: './metrics.component.html', - styleUrls: ['./metrics.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class MetricsComponent {} diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.module.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.module.ts deleted file mode 100644 index b55748b4c..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/metrics/metrics.module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { NgModule } from '@angular/core' -import { IonicModule } from '@ionic/angular' -import { MetricsComponent } from './metrics.component' - -@NgModule({ - imports: [IonicModule], - declarations: [MetricsComponent], - exports: [MetricsComponent], -}) -export class MetricsModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.html b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.html deleted file mode 100644 index 9bd377f68..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.html +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.scss b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.scss deleted file mode 100644 index 2fd308dc3..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.scss +++ /dev/null @@ -1,13 +0,0 @@ -:host { - border-radius: inherit; -} - -.iframe { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - border: 0; - border-radius: inherit; -} diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.ts deleted file mode 100644 index a7711fd93..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.component.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' - -@Component({ - selector: 'widget-network', - templateUrl: './network.component.html', - styleUrls: ['./network.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class NetworkComponent {} diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.module.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.module.ts deleted file mode 100644 index 7ffb7a1ef..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/network/network.module.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { NgModule } from '@angular/core' -import { NetworkComponent } from './network.component' - -@NgModule({ - imports: [], - declarations: [NetworkComponent], - exports: [NetworkComponent], -}) -export class NetworkModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.html b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.html deleted file mode 100644 index 3a1e58c95..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.html +++ /dev/null @@ -1 +0,0 @@ -System time and uptime diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.scss b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.ts deleted file mode 100644 index f669a7363..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.component.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' - -@Component({ - selector: 'widget-uptime', - templateUrl: './uptime.component.html', - styleUrls: ['./uptime.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class UptimeComponent {} diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.module.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.module.ts deleted file mode 100644 index 497e1b0cc..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/uptime/uptime.module.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { NgModule } from '@angular/core' -import { UptimeComponent } from './uptime.component' - -@NgModule({ - imports: [], - declarations: [UptimeComponent], - exports: [UptimeComponent], -}) -export class UptimeModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/widgets.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/widgets.ts deleted file mode 100644 index 8b94a37aa..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/built-in/widgets.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Widget } from 'src/app/services/patch-db/data-model' - -export const BUILT_IN_WIDGETS: readonly Widget[] = [ - { - id: 'favorites', - meta: { - name: 'Favorites', - width: 2, - height: 2, - mobileWidth: 2, - mobileHeight: 2, - }, - }, - { - id: 'health', - meta: { - name: 'Service health overview', - width: 2, - height: 2, - mobileWidth: 2, - mobileHeight: 2, - }, - }, - { - id: 'metrics', - meta: { - name: 'Server metrics', - width: 4, - height: 1, - mobileWidth: 2, - mobileHeight: 2, - }, - }, - { - id: 'network', - meta: { - name: 'Network', - width: 4, - height: 2, - mobileWidth: 2, - mobileHeight: 3, - }, - }, - { - id: 'uptime', - meta: { - name: 'System time and uptime', - width: 2, - height: 2, - mobileWidth: 2, - mobileHeight: 2, - }, - }, -] diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/widgets.module.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/widgets.module.ts deleted file mode 100644 index de8f92c3f..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/widgets.module.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { RouterModule, Routes } from '@angular/router' -import { TuiLoaderModule } from '@taiga-ui/core' -import { TuiTilesModule } from '@taiga-ui/kit' - -import { WidgetsPage } from './widgets.page' -import { AddWidgetModule } from './built-in/add/add.module' -import { FavoritesModule } from './built-in/favorites/favorites.module' -import { HealthModule } from './built-in/health/health.module' -import { MetricsModule } from './built-in/metrics/metrics.module' -import { NetworkModule } from './built-in/network/network.module' -import { UptimeModule } from './built-in/uptime/uptime.module' - -const routes: Routes = [ - { - path: '', - component: WidgetsPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - TuiTilesModule, - AddWidgetModule, - FavoritesModule, - HealthModule, - MetricsModule, - NetworkModule, - UptimeModule, - RouterModule.forChild(routes), - TuiLoaderModule, - ], - declarations: [WidgetsPage], - exports: [WidgetsPage], -}) -export class WidgetsPageModule {} diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.html b/web/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.html deleted file mode 100644 index 4ae2d9430..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.html +++ /dev/null @@ -1,55 +0,0 @@ -

    - - - - - {{ edit ? 'Save' : 'Edit'}} - - - - Add - - -

    - - - -
    - -
    -
    - - - - - -
    -
    diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.scss b/web/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.scss deleted file mode 100644 index cf27b504b..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.scss +++ /dev/null @@ -1,112 +0,0 @@ -:host { - overflow: auto; -} - -.title { - margin-right: auto; -} - -.loader { - width: 24px; - color: var(--ion-color-tertiary); -} - -.heading { - display: flex; - align-items: center; - height: 44px; - font-size: 20px; - margin: 14px 0 -20px; - padding: 0 40px; - - :host.dialog & { - margin: 0 0 -24px; - padding: 0; - font-size: 24px; - } -} - -.button { - width: 50%; - - ion-icon { - margin-right: 8px; - } -} - -.wrapper { - gap: 24px; - grid-auto-rows: 100px; - grid-auto-columns: 1fr; - margin: 40px; - - &_wide { - grid-template-columns: repeat(4, 1fr); - } - - :host.dialog & { - margin: 40px 0; - } -} - -.item { - box-shadow: inset 0 0 0 3px rgba(255, 255, 255, 0.1); - border-radius: 24px; -} - -.content { - height: 100%; - text-align: center; - background: var(--tui-base-02); - border-radius: 24px; - padding: 24px; - box-sizing: border-box; - overflow: hidden; - box-shadow: 0 3px 5px -2px rgba(0, 0, 0, 0.5); - transition: opacity 0.3s; - - .item_edit & { - opacity: var(--tui-disabled-opacity); - pointer-events: none; - } -} - -.handle { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - cursor: move; - - .item:not(.item_edit) & { - pointer-events: none; - } -} - -.remove, -.settings, -.pending { - position: absolute; - right: 24px; - top: 50%; - width: 24px; - height: 24px; - transform: translateY(-50%); - padding: 10px; - box-sizing: content-box; - border-radius: 100%; - background: rgba(0, 0, 0, 0.5); - pointer-events: none; - opacity: 0; - transition: opacity 0.3s; - - .item_edit & { - pointer-events: auto; - opacity: 1; - } -} - -.settings { - left: 24px; -} diff --git a/web/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.ts b/web/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.ts deleted file mode 100644 index 570071f0f..000000000 --- a/web/projects/ui/src/app/apps/ui/pages/widgets/widgets.page.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { - ChangeDetectionStrategy, - ChangeDetectorRef, - Component, - Inject, - Input, - Optional, - Type, -} from '@angular/core' -import { TuiDialogContext, TuiDialogService } from '@taiga-ui/core' -import { - POLYMORPHEUS_CONTEXT, - PolymorpheusComponent, -} from '@tinkoff/ng-polymorpheus' -import { PatchDB } from 'patch-db-client' -import { DataModel, Widget } from 'src/app/services/patch-db/data-model' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { ADD_WIDGET } from './built-in/add/add.component' -import { FavoritesComponent } from './built-in/favorites/favorites.component' -import { HealthComponent } from './built-in/health/health.component' -import { NetworkComponent } from './built-in/network/network.component' -import { MetricsComponent } from './built-in/metrics/metrics.component' -import { UptimeComponent } from './built-in/uptime/uptime.component' -import { take } from 'rxjs' - -@Component({ - selector: 'widgets', - templateUrl: 'widgets.page.html', - styleUrls: ['widgets.page.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, - host: { - '[class.dialog]': 'context', - }, -}) -export class WidgetsPage { - @Input() - wide = false - - edit = false - - order = new Map() - - items: readonly Widget[] = [] - - pending = true - - readonly components: Record> = { - health: HealthComponent, - favorites: FavoritesComponent, - metrics: MetricsComponent, - network: NetworkComponent, - uptime: UptimeComponent, - } - - constructor( - @Optional() - @Inject(POLYMORPHEUS_CONTEXT) - readonly context: TuiDialogContext | null, - private readonly dialog: TuiDialogService, - private readonly patch: PatchDB, - private readonly cdr: ChangeDetectorRef, - private readonly api: ApiService, - ) { - this.patch - .watch$('ui', 'widgets') - .pipe(take(1)) - .subscribe(items => { - this.updateItems(items) - this.pending = false - }) - } - - trackBy(_: number, { id }: Widget) { - return id - } - - toggle() { - if (this.edit) { - this.updateItems(this.getReordered()) - } - - this.edit = !this.edit - } - - add() { - this.dialog.open(ADD_WIDGET, { label: 'Add widget' }).subscribe(widget => { - this.addWidget(widget!) - }) - } - - remove(index: number) { - this.removeWidget(index) - } - - private removeWidget(index: number) { - this.updateItems( - this.getReordered().filter((_, i) => i !== this.order.get(index)), - ) - } - - private addWidget(widget: Widget) { - this.updateItems(this.getReordered().concat(widget)) - } - - private getReordered(): Widget[] { - const items: Widget[] = [] - - Array.from(this.order.entries()).forEach(([index, order]) => { - items[order] = this.items[index] - }) - - return items - } - - private updateItems(items: readonly Widget[]) { - const previous = this.items - - if (!this.pending) { - this.pending = true - this.api - .setDbValue(['widgets'], items) - .catch(() => { - this.updateItems(previous) - }) - .finally(() => { - this.pending = false - this.cdr.markForCheck() - }) - } - - this.items = items - this.order = new Map(items.map((_, index) => [index, index])) - } -} - -export const WIDGETS_COMPONENT = new PolymorpheusComponent(WidgetsPage) diff --git a/web/projects/ui/src/app/apps/ui/ui.module.ts b/web/projects/ui/src/app/apps/ui/ui.module.ts deleted file mode 100644 index 0688c8f0d..000000000 --- a/web/projects/ui/src/app/apps/ui/ui.module.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { NgModule } from '@angular/core' -import { RouterModule, Routes } from '@angular/router' - -const ROUTES: Routes = [ - { - redirectTo: 'services', - pathMatch: 'full', - path: '', - }, - { - path: 'home', - loadChildren: () => - import('./pages/home/home.module').then(m => m.HomePageModule), - }, - { - path: 'system', - loadChildren: () => - import('./pages/system/system.module').then(m => m.SystemModule), - }, - { - path: 'updates', - loadChildren: () => - import('./pages/updates/updates.module').then(m => m.UpdatesPageModule), - }, - { - path: 'marketplace', - loadChildren: () => - import('./pages/marketplace/marketplace.module').then( - m => m.MarketplaceModule, - ), - }, - { - path: 'notifications', - loadChildren: () => - import('./pages/notifications/notifications.module').then( - m => m.NotificationsPageModule, - ), - }, - { - path: 'services', - loadChildren: () => - import('./pages/services/services.module').then(m => m.ServicesModule), - }, - { - path: 'backups', - loadChildren: () => - import('./pages/backups/backups.module').then(m => m.BackupsModule), - }, -] - -@NgModule({ - imports: [RouterModule.forChild(ROUTES)], -}) -export class UiModule {} diff --git a/web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.html b/web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.html deleted file mode 100644 index 46da84a76..000000000 --- a/web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - -
    - - {{ unreadCount }} - - -
    diff --git a/web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.module.ts b/web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.module.ts deleted file mode 100644 index 1ad6c0e93..000000000 --- a/web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { BadgeMenuComponent } from './badge-menu.component' - -@NgModule({ - imports: [CommonModule, IonicModule], - declarations: [BadgeMenuComponent], - exports: [BadgeMenuComponent], -}) -export class BadgeMenuComponentModule {} diff --git a/web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.scss b/web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.scss deleted file mode 100644 index 1e9265e5a..000000000 --- a/web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.scss +++ /dev/null @@ -1,33 +0,0 @@ -:host { - display: flex; - align-items: center; - padding-right: 8px; -} - -.sidebar { - display: none; -} - -@media screen and (min-width: 992px) { - .widgets { - display: none; - } - - .sidebar { - display: inline-block; - } -} - -.wrapper { - position: relative; -} - -.md-badge { - background-color: var(--ion-color-danger); - position: absolute; - top: -8px; - left: 56%; - border-radius: 6px; - z-index: 1; - font-size: 80%; -} diff --git a/web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.ts b/web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.ts deleted file mode 100644 index 6e3406375..000000000 --- a/web/projects/ui/src/app/common/badge-menu-button/badge-menu.component.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' -import { SplitPaneTracker } from 'src/app/services/split-pane.service' -import { PatchDB } from 'patch-db-client' -import { DataModel } from 'src/app/services/patch-db/data-model' -import { TuiDialogService } from '@taiga-ui/core' -import { WIDGETS_COMPONENT } from 'src/app/apps/ui/pages/widgets/widgets.page' -import { WorkspaceConfig } from '@start9labs/shared' -import { - ClientStorageService, - WidgetDrawer, -} from 'src/app/services/client-storage.service' - -const { enableWidgets } = - require('../../../../../../config.json') as WorkspaceConfig - -@Component({ - selector: 'badge-menu-button', - templateUrl: './badge-menu.component.html', - styleUrls: ['./badge-menu.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class BadgeMenuComponent { - readonly unreadCount$ = this.patch.watch$( - 'server-info', - 'unreadNotifications', - 'count', - ) - readonly sidebarOpen$ = this.splitPane.sidebarOpen$ - readonly widgetDrawer$ = this.clientStorageService.widgetDrawer$ - - readonly enableWidgets = enableWidgets - - constructor( - private readonly splitPane: SplitPaneTracker, - private readonly patch: PatchDB, - private readonly dialog: TuiDialogService, - private readonly clientStorageService: ClientStorageService, - ) {} - - onSidebar(drawer: WidgetDrawer) { - this.clientStorageService.updateWidgetDrawer({ - ...drawer, - open: !drawer.open, - }) - } - - onWidgets() { - this.dialog.open(WIDGETS_COMPONENT, { label: 'Widgets' }).subscribe() - } -} diff --git a/web/projects/ui/src/app/common/interface-addresses/interface-addresses-item.component.html b/web/projects/ui/src/app/common/interface-addresses/interface-addresses-item.component.html deleted file mode 100644 index 3b5669a64..000000000 --- a/web/projects/ui/src/app/common/interface-addresses/interface-addresses-item.component.html +++ /dev/null @@ -1,18 +0,0 @@ - - -

    {{ label }}

    -

    {{ hostname }}

    - -
    -
    - - - - - - - - - -
    -
    diff --git a/web/projects/ui/src/app/common/interface-addresses/interface-addresses.component.html b/web/projects/ui/src/app/common/interface-addresses/interface-addresses.component.html deleted file mode 100644 index 3e80a3c8c..000000000 --- a/web/projects/ui/src/app/common/interface-addresses/interface-addresses.component.html +++ /dev/null @@ -1,125 +0,0 @@ - - -

    Clearnet

    - - - -

    - Add clearnet to expose this interface to the public Internet. - - View instructions - -

    -
    -
    - - -
    - - Update - - - Remove - -
    -
    -
    - -
    - - - Add Clearnet - -
    -
    -
    - - -

    Tor

    - - - -

    - Use a Tor-enabled browser to access this address. Tor connections can - be slow and unreliable. - - View instructions - -

    -
    -
    - -
    - - -

    Local

    - - - -

    - Local addresses can only be accessed while connected to the same Local - Area Network (LAN) as your server, either directly or using a VPN. - - View instructions - -

    -
    - - - Download Root CA - -
    -
    -
    - - - - - -
    - - - -
    diff --git a/web/projects/ui/src/app/common/interface-addresses/interface-addresses.component.scss b/web/projects/ui/src/app/common/interface-addresses/interface-addresses.component.scss deleted file mode 100644 index fab7b4db2..000000000 --- a/web/projects/ui/src/app/common/interface-addresses/interface-addresses.component.scss +++ /dev/null @@ -1,15 +0,0 @@ -ion-item-divider { - text-transform: unset; - padding-bottom: 12px; - padding-left: 0; -} - -ion-item-group { - background-color: #1e2024; - border: 1px solid #717171; - border-radius: 6px; -} - -ion-item { - --background: #1e2024; -} diff --git a/web/projects/ui/src/app/common/interface-addresses/interface-addresses.component.ts b/web/projects/ui/src/app/common/interface-addresses/interface-addresses.component.ts deleted file mode 100644 index 623bd1d50..000000000 --- a/web/projects/ui/src/app/common/interface-addresses/interface-addresses.component.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - Inject, - Input, -} from '@angular/core' -import { LoadingService, CopyService, ErrorService } from '@start9labs/shared' -import { Config } from '@start9labs/start-sdk/lib/config/builder/config' -import { Value } from '@start9labs/start-sdk/lib/config/builder/value' -import { InputSpec } from '@start9labs/start-sdk/lib/config/configTypes' -import { TuiDialogOptions, TuiDialogService } from '@taiga-ui/core' -import { filter } from 'rxjs' -import { - AddressInfo, - DataModel, - DomainInfo, - NetworkInfo, -} from 'src/app/services/patch-db/data-model' -import { FormDialogService } from 'src/app/services/form-dialog.service' -import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { TUI_PROMPT } from '@taiga-ui/kit' -import { Pipe, PipeTransform } from '@angular/core' -import { getClearnetAddress } from 'src/app/util/clearnetAddress' -import { DOCUMENT } from '@angular/common' -import { FormContext, FormPage } from 'src/app/apps/ui/modals/form/form.page' -import { PatchDB } from 'patch-db-client' -import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' -import { QRComponent } from 'src/app/common/qr/qr.component' - -export type ClearnetForm = { - domain: string - subdomain: string | null -} - -@Component({ - selector: 'interface-addresses', - templateUrl: './interface-addresses.component.html', - styleUrls: ['./interface-addresses.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class InterfaceAddressesComponent { - @Input() packageContext?: { - packageId: string - interfaceId: string - } - @Input({ required: true }) addressInfo!: AddressInfo - @Input({ required: true }) isUi!: boolean - - readonly network$ = this.patch.watch$('server-info', 'network') - - constructor( - private readonly loader: LoadingService, - private readonly formDialog: FormDialogService, - private readonly errorService: ErrorService, - private readonly api: ApiService, - private readonly dialogs: TuiDialogService, - private readonly patch: PatchDB, - @Inject(DOCUMENT) private readonly document: Document, - ) {} - - installCert(): void { - this.document.getElementById('install-cert')?.click() - } - - async presentModalAddClearnet(networkInfo: NetworkInfo) { - const domainInfo = this.addressInfo.domainInfo - const options: Partial>> = { - label: 'Select Domain/Subdomain', - data: { - value: { - domain: domainInfo?.domain || '', - subdomain: domainInfo?.subdomain || '', - }, - spec: await getClearnetSpec(networkInfo), - buttons: [ - { - text: 'Manage domains', - link: '/system/domains', - }, - { - text: 'Save', - handler: async value => this.saveClearnet(value), - }, - ], - }, - } - this.formDialog.open(FormPage, options) - } - - presentAlertRemoveClearnet() { - this.dialogs - .open(TUI_PROMPT, { - label: 'Confirm', - size: 's', - data: { - content: 'Remove clearnet address?', - yes: 'Remove', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => this.removeClearnet()) - } - - private async saveClearnet(domainInfo: ClearnetForm): Promise { - const loader = this.loader.open('Saving...').subscribe() - - try { - if (this.packageContext) { - await this.api.setInterfaceClearnetAddress({ - ...this.packageContext, - domainInfo, - }) - } else { - await this.api.setServerClearnetAddress({ domainInfo }) - } - return true - } catch (e: any) { - this.errorService.handleError(e) - return false - } finally { - loader.unsubscribe() - } - } - - private async removeClearnet(): Promise { - const loader = this.loader.open('Removing...').subscribe() - - try { - if (this.packageContext) { - await this.api.setInterfaceClearnetAddress({ - ...this.packageContext, - domainInfo: null, - }) - } else { - await this.api.setServerClearnetAddress({ domainInfo: null }) - } - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } -} - -function getClearnetSpec({ - domains, - start9ToSubdomain, -}: NetworkInfo): Promise { - const start9ToDomain = `${start9ToSubdomain?.value}.start9.to` - const base = start9ToSubdomain ? { [start9ToDomain]: start9ToDomain } : {} - - const values = domains.reduce((prev, curr) => { - return { - [curr.value]: curr.value, - ...prev, - } - }, base) - - return configBuilderToSpec( - Config.of({ - domain: Value.select({ - name: 'Domain', - required: { default: null }, - values, - }), - subdomain: Value.text({ - name: 'Subdomain', - required: false, - }), - }), - ) -} - -@Component({ - selector: 'interface-addresses-item', - templateUrl: './interface-addresses-item.component.html', - styleUrls: ['./interface-addresses.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class InterfaceAddressItemComponent { - @Input({ required: true }) label!: string - @Input({ required: true }) hostname!: string - @Input({ required: true }) isUi!: boolean - - constructor( - readonly copyService: CopyService, - private readonly dialogs: TuiDialogService, - @Inject(DOCUMENT) private readonly document: Document, - ) {} - - launch(url: string): void { - this.document.defaultView?.open(url, '_blank', 'noreferrer') - } - - showQR(data: string) { - this.dialogs - .open(new PolymorpheusComponent(QRComponent), { - size: 'auto', - data, - }) - .subscribe() - } -} - -@Pipe({ - name: 'interfaceClearnetPipe', -}) -export class InterfaceClearnetPipe implements PipeTransform { - transform(clearnet: DomainInfo): string { - return getClearnetAddress('https', clearnet) - } -} diff --git a/web/projects/ui/src/app/common/interface-addresses/interface-addresses.module.ts b/web/projects/ui/src/app/common/interface-addresses/interface-addresses.module.ts deleted file mode 100644 index 5ca092095..000000000 --- a/web/projects/ui/src/app/common/interface-addresses/interface-addresses.module.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { - InterfaceAddressesComponent, - InterfaceAddressItemComponent, - InterfaceClearnetPipe, -} from './interface-addresses.component' - -@NgModule({ - imports: [CommonModule, IonicModule], - declarations: [ - InterfaceAddressesComponent, - InterfaceAddressItemComponent, - InterfaceClearnetPipe, - ], - exports: [InterfaceAddressesComponent], -}) -export class InterfaceAddressesComponentModule {} diff --git a/web/projects/ui/src/app/routing.module.ts b/web/projects/ui/src/app/routing.module.ts index be417216d..ebea48dd2 100644 --- a/web/projects/ui/src/app/routing.module.ts +++ b/web/projects/ui/src/app/routing.module.ts @@ -30,9 +30,8 @@ const routes: Routes = [ }, { path: '', - canActivate: [AuthGuard], - canActivateChild: [AuthGuard], - loadChildren: () => import('./apps/ui/ui.module').then(m => m.UiModule), + redirectTo: 'portal', + pathMatch: 'full', }, ] diff --git a/web/projects/ui/src/app/services/api/mock-patch.ts b/web/projects/ui/src/app/services/api/mock-patch.ts index 663496214..944a08183 100644 --- a/web/projects/ui/src/app/services/api/mock-patch.ts +++ b/web/projects/ui/src/app/services/api/mock-patch.ts @@ -1,5 +1,4 @@ import { DataModel } from 'src/app/services/patch-db/data-model' -import { BUILT_IN_WIDGETS } from 'src/app/apps/ui/pages/widgets/built-in/widgets' import { Mock } from './api.fixures' export const mockPatchData: DataModel = { @@ -8,13 +7,7 @@ export const mockPatchData: DataModel = { 'ack-welcome': '1.0.0', theme: 'Dark', desktop: ['lnd'], - widgets: BUILT_IN_WIDGETS.filter( - ({ id }) => - id === 'favorites' || - id === 'health' || - id === 'network' || - id === 'metrics', - ), + widgets: [], marketplace: { 'selected-url': 'https://registry.start9.com/', 'known-hosts': { diff --git a/web/projects/ui/src/app/services/proxy.service.ts b/web/projects/ui/src/app/services/proxy.service.ts index be9349689..2cb09ac97 100644 --- a/web/projects/ui/src/app/services/proxy.service.ts +++ b/web/projects/ui/src/app/services/proxy.service.ts @@ -1,20 +1,23 @@ import { Injectable } from '@angular/core' -import { PatchDB } from 'patch-db-client' -import { - DataModel, - OsOutboundProxy, - ServiceOutboundProxy, -} from './patch-db/data-model' -import { firstValueFrom } from 'rxjs' +import { ErrorService, LoadingService } from '@start9labs/shared' import { Config } from '@start9labs/start-sdk/lib/config/builder/config' import { Value } from '@start9labs/start-sdk/lib/config/builder/value' import { Variants } from '@start9labs/start-sdk/lib/config/builder/variants' -import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' import { TuiDialogOptions } from '@taiga-ui/core' +import { PatchDB } from 'patch-db-client' +import { firstValueFrom } from 'rxjs' +import { + FormComponent, + FormContext, +} from 'src/app/apps/portal/components/form.component' import { FormDialogService } from 'src/app/services/form-dialog.service' -import { FormContext, FormPage } from '../apps/ui/modals/form/form.page' +import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' import { ApiService } from './api/embassy-api.service' -import { ErrorService, LoadingService } from '@start9labs/shared' +import { + DataModel, + OsOutboundProxy, + ServiceOutboundProxy, +} from './patch-db/data-model' @Injectable({ providedIn: 'root', @@ -42,10 +45,10 @@ export class ProxyService { const defaultValue = !outboundProxy ? 'none' : outboundProxy === 'primary' - ? 'primary' - : outboundProxy === 'mirror' - ? 'mirror' - : 'other' + ? 'primary' + : outboundProxy === 'mirror' + ? 'mirror' + : 'other' let variants: Record }> = {} @@ -126,10 +129,10 @@ export class ProxyService { value.proxy.unionSelectKey === 'none' ? null : value.proxy.unionSelectKey === 'primary' - ? 'primary' - : value.proxy.unionSelectKey === 'mirror' - ? 'mirror' - : { proxyId: value.proxy.unionValueKey.proxyId } + ? 'primary' + : value.proxy.unionSelectKey === 'mirror' + ? 'mirror' + : { proxyId: value.proxy.unionValueKey.proxyId } await this.saveOutboundProxy(proxy, serviceContext?.packageId) return true }, @@ -137,7 +140,7 @@ export class ProxyService { ], }, } - this.formDialog.open(FormPage, options) + this.formDialog.open(FormComponent, options) } private async saveOutboundProxy( From 69d5f521a58776107c71659ef9785410b90f8147 Mon Sep 17 00:00:00 2001 From: Matt Hill Date: Fri, 16 Feb 2024 14:12:10 -0700 Subject: [PATCH 047/169] remove tor http warnings --- .../ui/src/app/app/menu/menu.component.ts | 9 +-- .../ui/src/app/apps/login/login.module.ts | 2 - .../ui/src/app/apps/login/login.page.html | 2 - .../src/app/apps/login/warning.component.ts | 60 ------------------- .../service/components/status.component.ts | 2 +- .../settings/components/http.component.ts | 43 ------------- .../settings/components/menu.component.ts | 22 +------ .../insecure-warning.component.html | 15 ----- .../insecure-warning.component.scss | 8 --- .../insecure-warning.component.ts | 18 ------ .../insecure-warning.module.ts | 11 ---- .../ui/src/app/services/config.service.ts | 16 ++--- 12 files changed, 13 insertions(+), 195 deletions(-) delete mode 100644 web/projects/ui/src/app/apps/login/warning.component.ts delete mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/components/http.component.ts delete mode 100644 web/projects/ui/src/app/common/insecure-warning/insecure-warning.component.html delete mode 100644 web/projects/ui/src/app/common/insecure-warning/insecure-warning.component.scss delete mode 100644 web/projects/ui/src/app/common/insecure-warning/insecure-warning.component.ts delete mode 100644 web/projects/ui/src/app/common/insecure-warning/insecure-warning.module.ts diff --git a/web/projects/ui/src/app/app/menu/menu.component.ts b/web/projects/ui/src/app/app/menu/menu.component.ts index 48a2ee6f7..268a7167d 100644 --- a/web/projects/ui/src/app/app/menu/menu.component.ts +++ b/web/projects/ui/src/app/app/menu/menu.component.ts @@ -11,9 +11,7 @@ import { filter, first, map, - merge, Observable, - of, pairwise, startWith, switchMap, @@ -114,10 +112,9 @@ export class MenuComponent { readonly theme$ = inject(THEME) - readonly warning$ = merge( - of(this.config.isTorHttp()), - this.patch.watch$('server-info', 'ntp-synced').pipe(map(synced => !synced)), - ) + readonly warning$ = this.patch + .watch$('server-info', 'ntp-synced') + .pipe(map(synced => !synced)) constructor( private readonly patch: PatchDB, diff --git a/web/projects/ui/src/app/apps/login/login.module.ts b/web/projects/ui/src/app/apps/login/login.module.ts index 82b683ff7..9d2dcb3b5 100644 --- a/web/projects/ui/src/app/apps/login/login.module.ts +++ b/web/projects/ui/src/app/apps/login/login.module.ts @@ -11,7 +11,6 @@ import { import { TuiInputPasswordModule } from '@taiga-ui/kit' import { CAWizardComponent } from './ca-wizard/ca-wizard.component' import { LoginPage } from './login.page' -import { LoginWarningComponent } from './warning.component' const routes: Routes = [ { @@ -25,7 +24,6 @@ const routes: Routes = [ CommonModule, FormsModule, CAWizardComponent, - LoginWarningComponent, TuiButtonModule, TuiCardModule, TuiSurfaceModule, diff --git a/web/projects/ui/src/app/apps/login/login.page.html b/web/projects/ui/src/app/apps/login/login.page.html index 1343a9316..0cfb4e20e 100644 --- a/web/projects/ui/src/app/apps/login/login.page.html +++ b/web/projects/ui/src/app/apps/login/login.page.html @@ -3,8 +3,6 @@ - -

    Login to StartOS

    diff --git a/web/projects/ui/src/app/apps/login/warning.component.ts b/web/projects/ui/src/app/apps/login/warning.component.ts deleted file mode 100644 index 9166a3b9a..000000000 --- a/web/projects/ui/src/app/apps/login/warning.component.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { NgIf } from '@angular/common' -import { Component, inject } from '@angular/core' -import { WINDOW } from '@ng-web-apis/common' -import { TuiNotificationModule } from '@taiga-ui/core' -import { TuiButtonModule, TuiIconsModule } from '@taiga-ui/experimental' -import { ConfigService } from 'src/app/services/config.service' - -@Component({ - standalone: true, - selector: 'login-warning', - template: ` - - -

    Http detected

    -

    - Tor is faster over https. Your Root CA must be trusted. - - View instructions - -

    -
    - `, - styles: [ - ` - @import '@taiga-ui/core/styles/taiga-ui-local'; - - :host { - @include center-left(); - top: 1rem; - width: max(50%, 20rem); - } - - button { - float: right; - margin: 0.5rem 0 0.5rem 1rem; - } - `, - ], - imports: [NgIf, TuiButtonModule, TuiIconsModule, TuiNotificationModule], -}) -export class LoginWarningComponent { - private readonly windowRef = inject(WINDOW) - readonly config = inject(ConfigService) - - launchHttps() { - this.windowRef.open(`https://${this.config.getHost()}`, '_self') - } -} diff --git a/web/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts index d97e5523c..c5e8aeb22 100644 --- a/web/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts @@ -14,7 +14,7 @@ import { InstallProgressPipeModule } from 'src/app/common/install-progress/insta template: ` {{ connected ? rendering.display : 'Unknown' }} - + diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/components/http.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/components/http.component.ts deleted file mode 100644 index 515cab2fa..000000000 --- a/web/projects/ui/src/app/apps/portal/routes/system/settings/components/http.component.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' -import { TuiNotificationModule } from '@taiga-ui/core' -import { - TuiButtonModule, - TuiCellModule, - TuiTitleModule, -} from '@taiga-ui/experimental' - -@Component({ - selector: 'settings-http', - template: ` - -
    -
    - Http detected -
    -
    - Tor is faster over https. - - Download and trust your server's Root CA - - , then switch to https. -
    -
    -
    - -
    -
    - `, - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, - imports: [ - TuiButtonModule, - TuiCellModule, - TuiNotificationModule, - TuiTitleModule, - ], -}) -export class SettingsHttpsComponent {} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/components/menu.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/components/menu.component.ts index d49b9ad1b..66a13c4d5 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/settings/components/menu.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/components/menu.component.ts @@ -3,12 +3,10 @@ import { ChangeDetectionStrategy, Component, inject } from '@angular/core' import { TuiAlertService, TuiLoaderModule } from '@taiga-ui/core' import { TuiButtonModule } from '@taiga-ui/experimental' import { PatchDB } from 'patch-db-client' -import { ConfigService } from 'src/app/services/config.service' import { DataModel } from 'src/app/services/patch-db/data-model' import { ClientStorageService } from 'src/app/services/client-storage.service' import { SettingsService } from '../settings.service' import { SettingsSyncComponent } from './sync.component' -import { SettingsHttpsComponent } from './http.component' import { SettingsButtonComponent } from './button.component' import { SettingsUpdateComponent } from './update.component' @@ -17,19 +15,7 @@ import { SettingsUpdateComponent } from './update.component' template: ` - - - Open Https - - -
    +

    {{ cat.key }}

    @@ -46,8 +32,8 @@ import { SettingsUpdateComponent } from './update.component' !server.network.outboundProxy ? 'None' : server.network.outboundProxy === 'primary' - ? 'System Primary' - : server.network.outboundProxy.proxyId + ? 'System Primary' + : server.network.outboundProxy.proxyId }}
    @@ -82,7 +68,6 @@ import { SettingsUpdateComponent } from './update.component' TuiLoaderModule, TuiButtonModule, SettingsSyncComponent, - SettingsHttpsComponent, SettingsButtonComponent, SettingsUpdateComponent, ], @@ -91,7 +76,6 @@ export class SettingsMenuComponent { private readonly clientStorageService = inject(ClientStorageService) private readonly alerts = inject(TuiAlertService) - readonly isTorHttp = inject(ConfigService).isTorHttp() readonly server$ = inject(PatchDB).watch$('server-info') readonly service = inject(SettingsService) diff --git a/web/projects/ui/src/app/common/insecure-warning/insecure-warning.component.html b/web/projects/ui/src/app/common/insecure-warning/insecure-warning.component.html deleted file mode 100644 index 4301b35b5..000000000 --- a/web/projects/ui/src/app/common/insecure-warning/insecure-warning.component.html +++ /dev/null @@ -1,15 +0,0 @@ - - - -

    You are using unencrypted http

    -

    - Click the button on the right to switch to https. Your browser may warn - you that the page is insecure. You can safely bypass this warning. It will - go away after you download and trust your Embassy's certificate -

    -
    - - Open Https - - -
    diff --git a/web/projects/ui/src/app/common/insecure-warning/insecure-warning.component.scss b/web/projects/ui/src/app/common/insecure-warning/insecure-warning.component.scss deleted file mode 100644 index dc544f671..000000000 --- a/web/projects/ui/src/app/common/insecure-warning/insecure-warning.component.scss +++ /dev/null @@ -1,8 +0,0 @@ -.warn-label { - h2 { - font-weight: 700; - } - p { - font-weight: 600; - } -} \ No newline at end of file diff --git a/web/projects/ui/src/app/common/insecure-warning/insecure-warning.component.ts b/web/projects/ui/src/app/common/insecure-warning/insecure-warning.component.ts deleted file mode 100644 index 59d5cf9bd..000000000 --- a/web/projects/ui/src/app/common/insecure-warning/insecure-warning.component.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { DOCUMENT } from '@angular/common' -import { ChangeDetectionStrategy, Component, Inject } from '@angular/core' - -@Component({ - selector: 'insecure-warning', - templateUrl: './insecure-warning.component.html', - styleUrls: ['./insecure-warning.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class InsecureWarningComponent { - constructor(@Inject(DOCUMENT) private readonly document: Document) {} - - launchHttps() { - this.document.defaultView?.open( - this.document.location.href.replace('http', 'https'), - ) - } -} diff --git a/web/projects/ui/src/app/common/insecure-warning/insecure-warning.module.ts b/web/projects/ui/src/app/common/insecure-warning/insecure-warning.module.ts deleted file mode 100644 index 92429893f..000000000 --- a/web/projects/ui/src/app/common/insecure-warning/insecure-warning.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { InsecureWarningComponent } from './insecure-warning.component' - -@NgModule({ - declarations: [InsecureWarningComponent], - imports: [CommonModule, IonicModule], - exports: [InsecureWarningComponent], -}) -export class InsecureWarningComponentModule {} diff --git a/web/projects/ui/src/app/services/config.service.ts b/web/projects/ui/src/app/services/config.service.ts index a55c21d88..7756c0ba4 100644 --- a/web/projects/ui/src/app/services/config.service.ts +++ b/web/projects/ui/src/app/services/config.service.ts @@ -64,10 +64,6 @@ export class ConfigService { ) } - isTorHttp(): boolean { - return this.isTor() && !this.isHttps() - } - isLanHttp(): boolean { return !this.isTor() && !this.isLocalhost() && !this.isHttps() } @@ -80,12 +76,12 @@ export class ConfigService { return this.isTor() ? info.addressInfo.torHostname : this.isLocalhost() - ? `https://${info.addressInfo.lanHostname}` - : this.isLocal() || this.isIpv4() || this.isIpv6() - ? `https://${this.hostname}` - : info.addressInfo.domainInfo?.subdomain - ? `https://${info.addressInfo.domainInfo.subdomain}${info.addressInfo.domainInfo.domain}` - : `https://${info.addressInfo.domainInfo?.domain}` + ? `https://${info.addressInfo.lanHostname}` + : this.isLocal() || this.isIpv4() || this.isIpv6() + ? `https://${this.hostname}` + : info.addressInfo.domainInfo?.subdomain + ? `https://${info.addressInfo.domainInfo.subdomain}${info.addressInfo.domainInfo.domain}` + : `https://${info.addressInfo.domainInfo?.domain}` } getHost(): string { From fab13db4b428a6b5a9e525094e3052c785f8fb3e Mon Sep 17 00:00:00 2001 From: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com> Date: Sat, 17 Feb 2024 11:14:14 -0700 Subject: [PATCH 048/169] Feature/lxc container runtime (#2514) * wip: static-server errors * wip: fix wifi * wip: Fix the service_effects * wip: Fix cors in the middleware * wip(chore): Auth clean up the lint. * wip(fix): Vhost * wip: continue manager refactor Co-authored-by: J H * wip: service manager refactor * wip: Some fixes * wip(fix): Fix the lib.rs * wip * wip(fix): Logs * wip: bins * wip(innspect): Add in the inspect * wip: config * wip(fix): Diagnostic * wip(fix): Dependencies * wip: context * wip(fix) Sorta auth * wip: warnings * wip(fix): registry/admin * wip(fix) marketplace * wip(fix) Some more converted and fixed with the linter and config * wip: Working on the static server * wip(fix)static server * wip: Remove some asynnc * wip: Something about the request and regular rpc * wip: gut install Co-authored-by: J H * wip: Convert the static server into the new system * wip delete file * test * wip(fix) vhost does not need the with safe defaults * wip: Adding in the wifi * wip: Fix the developer and the verify * wip: new install flow Co-authored-by: J H * fix middleware * wip * wip: Fix the auth * wip * continue service refactor * feature: Service get_config * feat: Action * wip: Fighting the great fight against the borrow checker * wip: Remove an error in a file that I just need to deel with later * chore: Add in some more lifetime stuff to the services * wip: Install fix on lifetime * cleanup * wip: Deal with the borrow later * more cleanup * resolve borrowchecker errors * wip(feat): add in the handler for the socket, for now * wip(feat): Update the service_effect_handler::action * chore: Add in the changes to make sure the from_service goes to context * chore: Change the * refactor service map * fix references to service map * fill out restore * wip: Before I work on the store stuff * fix backup module * handle some warnings * feat: add in the ui components on the rust side * feature: Update the procedures * chore: Update the js side of the main and a few of the others * chore: Update the rpc listener to match the persistant container * wip: Working on updating some things to have a better name * wip(feat): Try and get the rpc to return the correct shape? * lxc wip * wip(feat): Try and get the rpc to return the correct shape? * build for container runtime wip * remove container-init * fix build * fix error * chore: Update to work I suppose * lxc wip * remove docker module and feature * download alpine squashfs automatically * overlays effect Co-authored-by: Jade * chore: Add the overlay effect * feat: Add the mounter in the main * chore: Convert to use the mounts, still need to work with the sandbox * install fixes * fix ssl * fixes from testing * implement tmpfile for upload * wip * misc fixes * cleanup * cleanup * better progress reporting * progress for sideload * return real guid * add devmode script * fix lxc rootfs path * fix percentage bar * fix progress bar styling * fix build for unstable * tweaks * label progress * tweaks * update progress more often * make symlink in rpc_client * make socket dir * fix parent path * add start-cli to container * add echo and gitInfo commands * wip: Add the init + errors * chore: Add in the exit effect for the system * chore: Change the type to null for failure to parse * move sigterm timeout to stopping status * update order * chore: Update the return type * remove dbg * change the map error * chore: Update the thing to capture id * chore add some life changes * chore: Update the loging * chore: Update the package to run module * us From for RpcError * chore: Update to use import instead * chore: update * chore: Use require for the backup * fix a default * update the type that is wrong * chore: Update the type of the manifest * chore: Update to make null * only symlink if not exists * get rid of double result * better debug info for ErrorCollection * chore: Update effects * chore: fix * mount assets and volumes * add exec instead of spawn * fix mounting in image * fix overlay mounts Co-authored-by: Jade * misc fixes * feat: Fix two * fix: systemForEmbassy main * chore: Fix small part of main loop * chore: Modify the bundle * merge * fixMain loop" * move tsc to makefile * chore: Update the return types of the health check * fix client * chore: Convert the todo to use tsmatches * add in the fixes for the seen and create the hack to allow demo * chore: Update to include the systemForStartOs * chore UPdate to the latest types from the expected outout * fixes * fix typo * Don't emit if failure on tsc * wip Co-authored-by: Jade * add s9pk api * add inspection * add inspect manifest * newline after display serializable * fix squashfs in image name * edit manifest Co-authored-by: Jade * wait for response on repl * ignore sig for now * ignore sig for now * re-enable sig verification * fix * wip * env and chroot * add profiling logs * set uid & gid in squashfs to 100000 * set uid of sqfs to 100000 * fix mksquashfs args * add env to compat * fix * re-add docker feature flag * fix docker output format being stupid * here be dragons * chore: Add in the cross compiling for something * fix npm link * extract logs from container on exit * chore: Update for testing * add log capture to drop trait * chore: add in the modifications that I make * chore: Update small things for no updates * chore: Update the types of something * chore: Make main not complain * idmapped mounts * idmapped volumes * re-enable kiosk * chore: Add in some logging for the new system * bring in start-sdk * remove avahi * chore: Update the deps * switch to musl * chore: Update the version of prettier * chore: Organize' * chore: Update some of the headers back to the standard of fetch * fix musl build * fix idmapped mounts * fix cross build * use cross compiler for correct arch * feat: Add in the faked ssl stuff for the effects * @dr_bonez Did a solution here * chore: Something that DrBonez * chore: up * wip: We have a working server!!! * wip * uninstall * wip * tes --------- Co-authored-by: J H Co-authored-by: J H Co-authored-by: J H <2364004+Blu-J@users.noreply.github.com> --- .github/workflows/startos-iso.yaml | 3 - .gitignore | 3 +- Makefile | 61 +- build-cargo-dep.sh | 4 +- build/.gitignore | 5 +- build/dpkg-deps/depends | 2 +- build/dpkg-deps/docker.depends | 5 - build/lib/firmware.json | 8 +- container-runtime/.gitignore | 4 +- container-runtime/Dockerfile | 4 + container-runtime/RPCSpec.md | 59 + container-runtime/containerRuntime.rc | 10 + container-runtime/download-base-image.sh | 18 + container-runtime/initSrc/CallbackHolder.ts | 22 - container-runtime/initSrc/Effects.ts | 184 - container-runtime/initSrc/Runtime.ts | 177 - container-runtime/install-dist-deps.sh | 10 + container-runtime/mkcontainer.sh | 28 + container-runtime/package-lock.json | 2791 +++++++++-- container-runtime/package.json | 17 +- container-runtime/rmcontainer.sh | 12 + .../src/Adapters/HostSystemStartOs.ts | 320 ++ container-runtime/src/Adapters/RpcListener.ts | 303 ++ .../DockerProcedureContainer.ts | 76 + .../Systems/SystemForEmbassy/MainLoop.ts | 150 + .../Systems/SystemForEmbassy/index.ts | 900 ++++ .../Systems/SystemForEmbassy/matchManifest.ts | 119 + .../Systems/SystemForEmbassy/matchVolume.ts | 35 + .../SystemForEmbassy/oldEmbassyTypes.ts | 482 ++ .../SystemForEmbassy/polyfillEffects.ts | 215 + .../src/Adapters/Systems/SystemForStartOs.ts | 150 + .../src/Adapters/Systems/index.ts | 6 + .../src/Interfaces/AllGetDependencies.ts | 6 + .../src/Interfaces/GetDependency.ts | 3 + .../src/Interfaces/HostSystem.ts | 7 + container-runtime/src/Interfaces/System.ts | 31 + .../src/Models/CallbackHolder.ts | 18 + .../src/Models/DockerProcedure.ts | 45 + container-runtime/src/Models/Effects.ts | 5 + container-runtime/src/Models/JsonPath.ts | 42 + container-runtime/src/Models/Volume.ts | 19 + container-runtime/{initSrc => src}/index.ts | 15 +- container-runtime/tsconfig.json | 25 +- container-runtime/update-image.sh | 41 + core/Cargo.lock | 2977 +++++------- core/Cargo.toml | 2 +- core/README.md | 5 - core/build-prod.sh | 18 +- core/build-v8-snapshot.sh | 39 - core/container-init/Cargo.toml | 39 - core/container-init/src/lib.rs | 214 - core/container-init/src/main.rs | 428 -- core/helpers/Cargo.toml | 2 +- core/helpers/src/lib.rs | 2 - core/{install-sdk.sh => install-cli.sh} | 5 +- core/models/Cargo.toml | 1 + core/models/src/errors.rs | 138 +- core/models/src/id/image.rs | 6 + core/models/src/procedure_name.rs | 67 +- core/snapshot-creator/Cargo.toml | 11 - core/snapshot-creator/src/main.rs | 11 - core/startos/Cargo.toml | 54 +- core/startos/deny.toml | 10 +- core/startos/src/action.rs | 156 +- core/startos/src/auth.rs | 257 +- core/startos/src/backup/backup_bulk.rs | 164 +- core/startos/src/backup/mod.rs | 201 +- core/startos/src/backup/restore.rs | 424 +- core/startos/src/backup/target/cifs.rs | 96 +- core/startos/src/backup/target/mod.rs | 116 +- core/startos/src/bins/avahi_alias.rs | 163 - core/startos/src/bins/container_cli.rs | 38 + core/startos/src/bins/mod.rs | 55 +- core/startos/src/bins/start_cli.rs | 61 +- core/startos/src/bins/start_deno.rs | 142 - core/startos/src/bins/start_init.rs | 58 +- core/startos/src/bins/start_sdk.rs | 61 - core/startos/src/bins/startd.rs | 39 +- core/startos/src/config/action.rs | 98 +- core/startos/src/config/mod.rs | 206 +- core/startos/src/config/spec.rs | 40 +- core/startos/src/context/cli.rs | 194 +- core/startos/src/context/config.rs | 175 + core/startos/src/context/diagnostic.rs | 43 +- core/startos/src/context/install.rs | 25 +- core/startos/src/context/mod.rs | 34 +- core/startos/src/context/rpc.rs | 244 +- core/startos/src/context/sdk.rs | 28 +- core/startos/src/context/setup.rs | 62 +- core/startos/src/control.rs | 87 +- core/startos/src/core/rpc_continuations.rs | 83 +- core/startos/src/db/mod.rs | 254 +- core/startos/src/db/model.rs | 52 +- core/startos/src/db/package.rs | 22 - core/startos/src/db/prelude.rs | 3 +- core/startos/src/dependencies.rs | 310 +- core/startos/src/developer/mod.rs | 12 +- core/startos/src/diagnostic.rs | 77 +- core/startos/src/disk/main.rs | 12 +- core/startos/src/disk/mod.rs | 48 +- core/startos/src/disk/mount/backup.rs | 97 +- .../startos/src/disk/mount/filesystem/bind.rs | 27 +- .../src/disk/mount/filesystem/block_dev.rs | 30 +- .../startos/src/disk/mount/filesystem/cifs.rs | 6 +- .../src/disk/mount/filesystem/ecryptfs.rs | 65 +- .../src/disk/mount/filesystem/efivarfs.rs | 28 +- .../src/disk/mount/filesystem/httpdirfs.rs | 4 +- .../src/disk/mount/filesystem/idmapped.rs | 88 + .../src/disk/mount/filesystem/label.rs | 33 +- .../src/disk/mount/filesystem/loop_dev.rs | 56 +- core/startos/src/disk/mount/filesystem/mod.rs | 86 +- .../src/disk/mount/filesystem/overlayfs.rs | 153 + core/startos/src/disk/mount/guard.rs | 94 +- core/startos/src/disk/mount/util.rs | 2 +- core/startos/src/disk/util.rs | 5 +- core/startos/src/error.rs | 14 +- core/startos/src/firmware.rs | 9 +- core/startos/src/init.rs | 83 +- core/startos/src/inspect.rs | 93 +- core/startos/src/install/cleanup.rs | 241 - core/startos/src/install/mod.rs | 1439 ++---- core/startos/src/install/progress.rs | 228 - core/startos/src/install/update.rs | 2 +- core/startos/src/lib.rs | 269 +- core/startos/src/logs.rs | 200 +- core/startos/src/lxc/config.template | 19 + core/startos/src/lxc/mod.rs | 536 ++ core/startos/src/manager/health.rs | 56 - core/startos/src/manager/manager_container.rs | 282 -- core/startos/src/manager/manager_map.rs | 96 - core/startos/src/manager/manager_seed.rs | 37 - core/startos/src/manager/mod.rs | 854 ---- .../src/manager/persistent_container.rs | 187 - core/startos/src/manager/transition_state.rs | 35 - core/startos/src/middleware/auth.rs | 303 +- core/startos/src/middleware/cors.rs | 112 +- core/startos/src/middleware/db.rs | 90 +- core/startos/src/middleware/diagnostic.rs | 72 +- core/startos/src/middleware/encrypt.rs | 115 - core/startos/src/middleware/mod.rs | 1 - core/startos/src/migration.rs | 141 - core/startos/src/net/dhcp.rs | 30 +- core/startos/src/net/interface.rs | 2 +- core/startos/src/net/keys.rs | 82 +- core/startos/src/net/mdns.rs | 68 - core/startos/src/net/mod.rs | 28 +- core/startos/src/net/net_controller.rs | 32 +- core/startos/src/net/ssl.rs | 12 +- core/startos/src/net/static_server.rs | 329 +- core/startos/src/net/tor.rs | 130 +- core/startos/src/net/utils.rs | 54 +- core/startos/src/net/vhost.rs | 104 +- core/startos/src/net/web_server.rs | 45 +- core/startos/src/net/wifi.rs | 161 +- core/startos/src/net/ws_server.rs | 94 - core/startos/src/notifications.rs | 117 +- core/startos/src/os_install/mod.rs | 80 +- core/startos/src/prelude.rs | 1 + core/startos/src/procedure/build.rs | 0 core/startos/src/procedure/docker.rs | 533 -- core/startos/src/procedure/js_scripts.rs | 51 - core/startos/src/procedure/mod.rs | 139 - core/startos/src/progress.rs | 442 ++ core/startos/src/properties.rs | 56 +- core/startos/src/registry/admin.rs | 45 +- core/startos/src/registry/marketplace.rs | 21 +- .../s9pk/merkle_archive/directory_contents.rs | 189 +- .../src/s9pk/merkle_archive/file_contents.rs | 7 +- core/startos/src/s9pk/merkle_archive/mod.rs | 104 +- .../src/s9pk/merkle_archive/source/http.rs | 22 +- .../src/s9pk/merkle_archive/source/mod.rs | 86 +- .../source/multi_cursor_file.rs | 52 +- .../src/s9pk/merkle_archive/write_queue.rs | 1 - core/startos/src/s9pk/mod.rs | 36 +- core/startos/src/s9pk/rpc.rs | 227 + core/startos/src/s9pk/v1/manifest.rs | 106 +- core/startos/src/s9pk/v1/mod.rs | 240 +- core/startos/src/s9pk/v1/reader.rs | 113 +- core/startos/src/s9pk/v2/compat.rs | 358 ++ core/startos/src/s9pk/v2/manifest.rs | 95 + core/startos/src/s9pk/v2/mod.rs | 205 +- core/startos/src/service/cli.rs | 66 + core/startos/src/service/config.rs | 22 + core/startos/src/service/control.rs | 45 + core/startos/src/service/fake.cert.key | 5 + core/startos/src/service/fake.cert.pem | 13 + core/startos/src/service/mod.rs | 542 +++ .../src/service/persistent_container.rs | 365 ++ core/startos/src/service/rpc.rs | 96 + .../src/service/service_effect_handler.rs | 684 +++ core/startos/src/service/service_map.rs | 384 ++ .../src/{manager => service}/start_stop.rs | 2 +- core/startos/src/service/transition/backup.rs | 1 + core/startos/src/service/transition/mod.rs | 74 + .../startos/src/service/transition/restart.rs | 39 + core/startos/src/service/util.rs | 14 + core/startos/src/setup.rs | 132 +- core/startos/src/shutdown.rs | 36 +- core/startos/src/ssh.rs | 87 +- core/startos/src/status/health_check.rs | 102 - core/startos/src/status/mod.rs | 37 +- core/startos/src/system.rs | 229 +- core/startos/src/update/mod.rs | 21 +- core/startos/src/upload.rs | 272 ++ core/startos/src/util/actor.rs | 192 + core/startos/src/util/clap.rs | 36 + core/startos/src/util/config.rs | 58 - core/startos/src/util/crypto.rs | 116 + core/startos/src/util/docker.rs | 239 - core/startos/src/util/future.rs | 119 + core/startos/src/util/http_reader.rs | 23 +- core/startos/src/util/io.rs | 79 +- core/startos/src/util/mod.rs | 35 +- .../src => startos/src/util}/rpc_client.rs | 67 +- core/startos/src/util/serde.rs | 305 +- core/startos/src/version/mod.rs | 7 +- core/startos/src/volume.rs | 2 +- core/startos/startd.service | 3 - debian/postinst | 6 + devmode.sh | 4 + image-recipe/README.md | 6 +- image-recipe/build.sh | 37 +- image-recipe/prepare.sh | 13 + patch-db | 2 +- sdk/.gitignore | 5 + sdk/LICENSE | 21 + sdk/Makefile | 44 + sdk/README.md | 18 + sdk/jest.config.js | 8 + sdk/lib/StartSdk.ts | 534 ++ sdk/lib/actions/createAction.ts | 101 + sdk/lib/actions/index.ts | 3 + sdk/lib/actions/setupActions.ts | 42 + sdk/lib/backup/Backups.ts | 181 + sdk/lib/backup/index.ts | 3 + sdk/lib/backup/setupBackups.ts | 43 + sdk/lib/config/builder/config.ts | 139 + sdk/lib/config/builder/index.ts | 4 + sdk/lib/config/builder/list.ts | 279 ++ sdk/lib/config/builder/value.ts | 783 +++ sdk/lib/config/builder/variants.ts | 120 + sdk/lib/config/configConstants.ts | 80 + sdk/lib/config/configDependencies.ts | 25 + sdk/lib/config/configTypes.ts | 249 + sdk/lib/config/index.ts | 5 + sdk/lib/config/setupConfig.ts | 98 + sdk/lib/dependency/mountDependencies.ts | 43 + sdk/lib/dependency/setupDependencyMounts.ts | 72 + sdk/lib/dependencyConfig/DependencyConfig.ts | 47 + sdk/lib/dependencyConfig/index.ts | 9 + .../dependencyConfig/setupDependencyConfig.ts | 22 + sdk/lib/emverLite/mod.ts | 307 ++ sdk/lib/health/HealthCheck.ts | 65 + sdk/lib/health/HealthReceipt.ts | 4 + sdk/lib/health/checkFns/CheckResult.ts | 6 + sdk/lib/health/checkFns/checkPortListening.ts | 67 + sdk/lib/health/checkFns/checkWebUrl.ts | 32 + sdk/lib/health/checkFns/index.ts | 11 + sdk/lib/health/checkFns/runHealthScript.ts | 38 + sdk/lib/health/index.ts | 3 + sdk/lib/index.ts | 23 + sdk/lib/inits/index.ts | 3 + sdk/lib/inits/migrations/Migration.ts | 48 + sdk/lib/inits/migrations/setupMigrations.ts | 76 + sdk/lib/inits/setupExports.ts | 18 + sdk/lib/inits/setupInit.ts | 42 + sdk/lib/inits/setupInstall.ts | 33 + sdk/lib/inits/setupUninstall.ts | 33 + sdk/lib/interfaces/AddressReceipt.ts | 4 + sdk/lib/interfaces/Host.ts | 205 + sdk/lib/interfaces/NetworkInterfaceBuilder.ts | 73 + sdk/lib/interfaces/Origin.ts | 33 + sdk/lib/interfaces/interfaceReceipt.ts | 4 + sdk/lib/interfaces/setupInterfaces.ts | 28 + sdk/lib/mainFn/Daemons.ts | 155 + sdk/lib/mainFn/index.ts | 35 + sdk/lib/manifest/ManifestTypes.ts | 105 + sdk/lib/manifest/index.ts | 2 + sdk/lib/manifest/setupManifest.ts | 20 + sdk/lib/store/getStore.ts | 61 + sdk/lib/test/configBuilder.test.ts | 818 ++++ sdk/lib/test/configTypes.test.ts | 32 + sdk/lib/test/emverList.test.ts | 262 + sdk/lib/test/health.readyCheck.test.ts | 17 + sdk/lib/test/host.test.ts | 27 + sdk/lib/test/makeOutput.ts | 428 ++ sdk/lib/test/mountDependencies.test.ts | 125 + sdk/lib/test/output.sdk.ts | 45 + sdk/lib/test/output.test.ts | 152 + sdk/lib/test/setupDependencyConfig.test.ts | 27 + sdk/lib/test/store.test.ts | 115 + sdk/lib/test/util.deepMerge.test.ts | 26 + sdk/lib/test/util.getNetworkInterface.test.ts | 20 + sdk/lib/test/utils.splitCommand.test.ts | 42 + sdk/lib/trigger/TriggerInput.ts | 6 + sdk/lib/trigger/changeOnFirstSuccess.ts | 30 + sdk/lib/trigger/cooldownTrigger.ts | 8 + sdk/lib/trigger/defaultTrigger.ts | 8 + sdk/lib/trigger/index.ts | 7 + sdk/lib/trigger/successFailure.ts | 32 + sdk/lib/types.ts | 526 ++ sdk/lib/util/GetSystemSmtp.ts | 37 + sdk/lib/util/Overlay.ts | 154 + sdk/lib/util/deepEqual.ts | 19 + sdk/lib/util/deepMerge.ts | 17 + sdk/lib/util/fileHelper.ts | 147 + sdk/lib/util/getDefaultString.ts | 10 + sdk/lib/util/getNetworkInterface.ts | 313 ++ sdk/lib/util/getNetworkInterfaces.ts | 120 + sdk/lib/util/getRandomCharInSet.ts | 98 + sdk/lib/util/getRandomString.ts | 11 + sdk/lib/util/index.ts | 36 + sdk/lib/util/nullIfEmpty.ts | 12 + sdk/lib/util/once.ts | 9 + sdk/lib/util/patterns.ts | 59 + sdk/lib/util/regexes.ts | 34 + sdk/lib/util/splitCommand.ts | 17 + sdk/lib/util/stringFromStdErrOut.ts | 6 + sdk/lib/util/utils.ts | 293 ++ sdk/package-lock.json | 4320 +++++++++++++++++ sdk/package.json | 59 + sdk/scripts/oldSpecToBuilder.ts | 413 ++ sdk/tsconfig-base.json | 19 + sdk/tsconfig-cjs.json | 8 + sdk/tsconfig.json | 8 + system-images/compat/Cargo.lock | 2320 +++++---- 326 files changed, 31768 insertions(+), 14047 deletions(-) delete mode 100644 build/dpkg-deps/docker.depends create mode 100644 container-runtime/Dockerfile create mode 100644 container-runtime/RPCSpec.md create mode 100644 container-runtime/containerRuntime.rc create mode 100755 container-runtime/download-base-image.sh delete mode 100644 container-runtime/initSrc/CallbackHolder.ts delete mode 100644 container-runtime/initSrc/Effects.ts delete mode 100644 container-runtime/initSrc/Runtime.ts create mode 100755 container-runtime/install-dist-deps.sh create mode 100644 container-runtime/mkcontainer.sh create mode 100644 container-runtime/rmcontainer.sh create mode 100644 container-runtime/src/Adapters/HostSystemStartOs.ts create mode 100644 container-runtime/src/Adapters/RpcListener.ts create mode 100644 container-runtime/src/Adapters/Systems/SystemForEmbassy/DockerProcedureContainer.ts create mode 100644 container-runtime/src/Adapters/Systems/SystemForEmbassy/MainLoop.ts create mode 100644 container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts create mode 100644 container-runtime/src/Adapters/Systems/SystemForEmbassy/matchManifest.ts create mode 100644 container-runtime/src/Adapters/Systems/SystemForEmbassy/matchVolume.ts create mode 100644 container-runtime/src/Adapters/Systems/SystemForEmbassy/oldEmbassyTypes.ts create mode 100644 container-runtime/src/Adapters/Systems/SystemForEmbassy/polyfillEffects.ts create mode 100644 container-runtime/src/Adapters/Systems/SystemForStartOs.ts create mode 100644 container-runtime/src/Adapters/Systems/index.ts create mode 100644 container-runtime/src/Interfaces/AllGetDependencies.ts create mode 100644 container-runtime/src/Interfaces/GetDependency.ts create mode 100644 container-runtime/src/Interfaces/HostSystem.ts create mode 100644 container-runtime/src/Interfaces/System.ts create mode 100644 container-runtime/src/Models/CallbackHolder.ts create mode 100644 container-runtime/src/Models/DockerProcedure.ts create mode 100644 container-runtime/src/Models/Effects.ts create mode 100644 container-runtime/src/Models/JsonPath.ts create mode 100644 container-runtime/src/Models/Volume.ts rename container-runtime/{initSrc => src}/index.ts (65%) create mode 100755 container-runtime/update-image.sh delete mode 100755 core/build-v8-snapshot.sh delete mode 100644 core/container-init/Cargo.toml delete mode 100644 core/container-init/src/lib.rs delete mode 100644 core/container-init/src/main.rs rename core/{install-sdk.sh => install-cli.sh} (61%) delete mode 100644 core/snapshot-creator/Cargo.toml delete mode 100644 core/snapshot-creator/src/main.rs delete mode 100644 core/startos/src/bins/avahi_alias.rs create mode 100644 core/startos/src/bins/container_cli.rs delete mode 100644 core/startos/src/bins/start_deno.rs delete mode 100644 core/startos/src/bins/start_sdk.rs create mode 100644 core/startos/src/context/config.rs delete mode 100644 core/startos/src/db/package.rs create mode 100644 core/startos/src/disk/mount/filesystem/idmapped.rs create mode 100644 core/startos/src/disk/mount/filesystem/overlayfs.rs delete mode 100644 core/startos/src/install/cleanup.rs delete mode 100644 core/startos/src/install/progress.rs create mode 100644 core/startos/src/lxc/config.template create mode 100644 core/startos/src/lxc/mod.rs delete mode 100644 core/startos/src/manager/health.rs delete mode 100644 core/startos/src/manager/manager_container.rs delete mode 100644 core/startos/src/manager/manager_map.rs delete mode 100644 core/startos/src/manager/manager_seed.rs delete mode 100644 core/startos/src/manager/mod.rs delete mode 100644 core/startos/src/manager/persistent_container.rs delete mode 100644 core/startos/src/manager/transition_state.rs delete mode 100644 core/startos/src/middleware/encrypt.rs delete mode 100644 core/startos/src/migration.rs delete mode 100644 core/startos/src/net/ws_server.rs delete mode 100644 core/startos/src/procedure/build.rs delete mode 100644 core/startos/src/procedure/docker.rs delete mode 100644 core/startos/src/procedure/js_scripts.rs delete mode 100644 core/startos/src/procedure/mod.rs create mode 100644 core/startos/src/progress.rs create mode 100644 core/startos/src/s9pk/rpc.rs create mode 100644 core/startos/src/s9pk/v2/compat.rs create mode 100644 core/startos/src/s9pk/v2/manifest.rs create mode 100644 core/startos/src/service/cli.rs create mode 100644 core/startos/src/service/config.rs create mode 100644 core/startos/src/service/control.rs create mode 100644 core/startos/src/service/fake.cert.key create mode 100644 core/startos/src/service/fake.cert.pem create mode 100644 core/startos/src/service/mod.rs create mode 100644 core/startos/src/service/persistent_container.rs create mode 100644 core/startos/src/service/rpc.rs create mode 100644 core/startos/src/service/service_effect_handler.rs create mode 100644 core/startos/src/service/service_map.rs rename core/startos/src/{manager => service}/start_stop.rs (93%) create mode 100644 core/startos/src/service/transition/backup.rs create mode 100644 core/startos/src/service/transition/mod.rs create mode 100644 core/startos/src/service/transition/restart.rs create mode 100644 core/startos/src/service/util.rs create mode 100644 core/startos/src/upload.rs create mode 100644 core/startos/src/util/actor.rs create mode 100644 core/startos/src/util/clap.rs delete mode 100644 core/startos/src/util/config.rs delete mode 100644 core/startos/src/util/docker.rs create mode 100644 core/startos/src/util/future.rs rename core/{helpers/src => startos/src/util}/rpc_client.rs (69%) create mode 100755 devmode.sh create mode 100644 sdk/.gitignore create mode 100644 sdk/LICENSE create mode 100644 sdk/Makefile create mode 100644 sdk/README.md create mode 100644 sdk/jest.config.js create mode 100644 sdk/lib/StartSdk.ts create mode 100644 sdk/lib/actions/createAction.ts create mode 100644 sdk/lib/actions/index.ts create mode 100644 sdk/lib/actions/setupActions.ts create mode 100644 sdk/lib/backup/Backups.ts create mode 100644 sdk/lib/backup/index.ts create mode 100644 sdk/lib/backup/setupBackups.ts create mode 100644 sdk/lib/config/builder/config.ts create mode 100644 sdk/lib/config/builder/index.ts create mode 100644 sdk/lib/config/builder/list.ts create mode 100644 sdk/lib/config/builder/value.ts create mode 100644 sdk/lib/config/builder/variants.ts create mode 100644 sdk/lib/config/configConstants.ts create mode 100644 sdk/lib/config/configDependencies.ts create mode 100644 sdk/lib/config/configTypes.ts create mode 100644 sdk/lib/config/index.ts create mode 100644 sdk/lib/config/setupConfig.ts create mode 100644 sdk/lib/dependency/mountDependencies.ts create mode 100644 sdk/lib/dependency/setupDependencyMounts.ts create mode 100644 sdk/lib/dependencyConfig/DependencyConfig.ts create mode 100644 sdk/lib/dependencyConfig/index.ts create mode 100644 sdk/lib/dependencyConfig/setupDependencyConfig.ts create mode 100644 sdk/lib/emverLite/mod.ts create mode 100644 sdk/lib/health/HealthCheck.ts create mode 100644 sdk/lib/health/HealthReceipt.ts create mode 100644 sdk/lib/health/checkFns/CheckResult.ts create mode 100644 sdk/lib/health/checkFns/checkPortListening.ts create mode 100644 sdk/lib/health/checkFns/checkWebUrl.ts create mode 100644 sdk/lib/health/checkFns/index.ts create mode 100644 sdk/lib/health/checkFns/runHealthScript.ts create mode 100644 sdk/lib/health/index.ts create mode 100644 sdk/lib/index.ts create mode 100644 sdk/lib/inits/index.ts create mode 100644 sdk/lib/inits/migrations/Migration.ts create mode 100644 sdk/lib/inits/migrations/setupMigrations.ts create mode 100644 sdk/lib/inits/setupExports.ts create mode 100644 sdk/lib/inits/setupInit.ts create mode 100644 sdk/lib/inits/setupInstall.ts create mode 100644 sdk/lib/inits/setupUninstall.ts create mode 100644 sdk/lib/interfaces/AddressReceipt.ts create mode 100644 sdk/lib/interfaces/Host.ts create mode 100644 sdk/lib/interfaces/NetworkInterfaceBuilder.ts create mode 100644 sdk/lib/interfaces/Origin.ts create mode 100644 sdk/lib/interfaces/interfaceReceipt.ts create mode 100644 sdk/lib/interfaces/setupInterfaces.ts create mode 100644 sdk/lib/mainFn/Daemons.ts create mode 100644 sdk/lib/mainFn/index.ts create mode 100644 sdk/lib/manifest/ManifestTypes.ts create mode 100644 sdk/lib/manifest/index.ts create mode 100644 sdk/lib/manifest/setupManifest.ts create mode 100644 sdk/lib/store/getStore.ts create mode 100644 sdk/lib/test/configBuilder.test.ts create mode 100644 sdk/lib/test/configTypes.test.ts create mode 100644 sdk/lib/test/emverList.test.ts create mode 100644 sdk/lib/test/health.readyCheck.test.ts create mode 100644 sdk/lib/test/host.test.ts create mode 100644 sdk/lib/test/makeOutput.ts create mode 100644 sdk/lib/test/mountDependencies.test.ts create mode 100644 sdk/lib/test/output.sdk.ts create mode 100644 sdk/lib/test/output.test.ts create mode 100644 sdk/lib/test/setupDependencyConfig.test.ts create mode 100644 sdk/lib/test/store.test.ts create mode 100644 sdk/lib/test/util.deepMerge.test.ts create mode 100644 sdk/lib/test/util.getNetworkInterface.test.ts create mode 100644 sdk/lib/test/utils.splitCommand.test.ts create mode 100644 sdk/lib/trigger/TriggerInput.ts create mode 100644 sdk/lib/trigger/changeOnFirstSuccess.ts create mode 100644 sdk/lib/trigger/cooldownTrigger.ts create mode 100644 sdk/lib/trigger/defaultTrigger.ts create mode 100644 sdk/lib/trigger/index.ts create mode 100644 sdk/lib/trigger/successFailure.ts create mode 100644 sdk/lib/types.ts create mode 100644 sdk/lib/util/GetSystemSmtp.ts create mode 100644 sdk/lib/util/Overlay.ts create mode 100644 sdk/lib/util/deepEqual.ts create mode 100644 sdk/lib/util/deepMerge.ts create mode 100644 sdk/lib/util/fileHelper.ts create mode 100644 sdk/lib/util/getDefaultString.ts create mode 100644 sdk/lib/util/getNetworkInterface.ts create mode 100644 sdk/lib/util/getNetworkInterfaces.ts create mode 100644 sdk/lib/util/getRandomCharInSet.ts create mode 100644 sdk/lib/util/getRandomString.ts create mode 100644 sdk/lib/util/index.ts create mode 100644 sdk/lib/util/nullIfEmpty.ts create mode 100644 sdk/lib/util/once.ts create mode 100644 sdk/lib/util/patterns.ts create mode 100644 sdk/lib/util/regexes.ts create mode 100644 sdk/lib/util/splitCommand.ts create mode 100644 sdk/lib/util/stringFromStdErrOut.ts create mode 100644 sdk/lib/util/utils.ts create mode 100644 sdk/package-lock.json create mode 100644 sdk/package.json create mode 100644 sdk/scripts/oldSpecToBuilder.ts create mode 100644 sdk/tsconfig-base.json create mode 100644 sdk/tsconfig-cjs.json create mode 100644 sdk/tsconfig.json diff --git a/.github/workflows/startos-iso.yaml b/.github/workflows/startos-iso.yaml index 60b642e19..47e0266cd 100644 --- a/.github/workflows/startos-iso.yaml +++ b/.github/workflows/startos-iso.yaml @@ -12,9 +12,6 @@ on: - dev - unstable - dev-unstable - - docker - - dev-docker - - dev-unstable-docker runner: type: choice description: Runner diff --git a/.gitignore b/.gitignore index d33151e91..1df3692ee 100644 --- a/.gitignore +++ b/.gitignore @@ -28,4 +28,5 @@ secrets.db /dpkg-workdir /compiled.tar /compiled-*.tar -/firmware \ No newline at end of file +/firmware +/tmp \ No newline at end of file diff --git a/Makefile b/Makefile index 65d4d79dd..f28bc8d5c 100644 --- a/Makefile +++ b/Makefile @@ -6,10 +6,10 @@ BASENAME := $(shell ./basename.sh) PLATFORM := $(shell if [ -f ./PLATFORM.txt ]; then cat ./PLATFORM.txt; else echo unknown; fi) ARCH := $(shell if [ "$(PLATFORM)" = "raspberrypi" ]; then echo aarch64; else echo $(PLATFORM) | sed 's/-nonfree$$//g'; fi) IMAGE_TYPE=$(shell if [ "$(PLATFORM)" = raspberrypi ]; then echo img; else echo iso; fi) -BINS := core/target/$(ARCH)-unknown-linux-gnu/release/startbox core/target/aarch64-unknown-linux-musl/release/container-init core/target/x86_64-unknown-linux-musl/release/container-init +BINS := core/target/$(ARCH)-unknown-linux-musl/release/startbox core/target/$(ARCH)-unknown-linux-musl/release/containerbox WEB_UIS := web/dist/raw/ui web/dist/raw/setup-wizard web/dist/raw/diagnostic-ui web/dist/raw/install-wizard FIRMWARE_ROMS := ./firmware/$(PLATFORM) $(shell jq --raw-output '.[] | select(.platform[] | contains("$(PLATFORM)")) | "./firmware/$(PLATFORM)/" + .id + ".rom.gz"' build/lib/firmware.json) -BUILD_SRC := $(shell git ls-files build) build/lib/depends build/lib/conflicts $(FIRMWARE_ROMS) +BUILD_SRC := $(shell git ls-files build) build/lib/depends build/lib/conflicts build/lib/container-runtime/rootfs.squashfs $(FIRMWARE_ROMS) DEBIAN_SRC := $(shell git ls-files debian/) IMAGE_RECIPE_SRC := $(shell git ls-files image-recipe/) STARTD_SRC := core/startos/startd.service $(BUILD_SRC) @@ -26,7 +26,7 @@ PATCH_DB_CLIENT_SRC := $(shell git ls-files --recurse-submodules patch-db/client GZIP_BIN := $(shell which pigz || which gzip) TAR_BIN := $(shell which gtar || which tar) COMPILED_TARGETS := $(BINS) system-images/compat/docker-images/$(ARCH).tar system-images/utils/docker-images/$(ARCH).tar system-images/binfmt/docker-images/$(ARCH).tar -ALL_TARGETS := $(STARTD_SRC) $(ENVIRONMENT_FILE) $(GIT_HASH_FILE) $(VERSION_FILE) $(COMPILED_TARGETS) $(shell if [ "$(PLATFORM)" = "raspberrypi" ]; then echo cargo-deps/aarch64-unknown-linux-gnu/release/pi-beep; fi) $(shell /bin/bash -c 'if [[ "${ENVIRONMENT}" =~ (^|-)unstable($$|-) ]]; then echo cargo-deps/$(ARCH)-unknown-linux-gnu/release/tokio-console; fi') $(PLATFORM_FILE) +ALL_TARGETS := $(STARTD_SRC) $(ENVIRONMENT_FILE) $(GIT_HASH_FILE) $(VERSION_FILE) $(COMPILED_TARGETS) $(shell if [ "$(PLATFORM)" = "raspberrypi" ]; then echo cargo-deps/aarch64-unknown-linux-musl/release/pi-beep; fi) $(shell /bin/bash -c 'if [[ "${ENVIRONMENT}" =~ (^|-)unstable($$|-) ]]; then echo cargo-deps/$(ARCH)-unknown-linux-musl/release/tokio-console; fi') $(PLATFORM_FILE) ifeq ($(REMOTE),) mkdir = mkdir -p $1 @@ -49,7 +49,7 @@ endif .DELETE_ON_ERROR: -.PHONY: all metadata install clean format sdk snapshots uis ui reflash deb $(IMAGE_TYPE) squashfs sudo wormhole test +.PHONY: all metadata install clean format cli uis ui reflash deb $(IMAGE_TYPE) squashfs sudo wormhole test all: $(ALL_TARGETS) @@ -74,6 +74,11 @@ clean: rm -rf image-recipe/deb rm -rf results rm -rf build/lib/firmware + rm -rf container-runtime/dist + rm -rf container-runtime/node_modules + rm -f build/lib/container-runtime/rootfs.squashfs + rm -rf sdk/dist + rm -rf sdk/node_modules rm -f ENVIRONMENT.txt rm -f PLATFORM.txt rm -f GIT_HASH.txt @@ -85,8 +90,8 @@ format: test: $(CORE_SRC) $(ENVIRONMENT_FILE) cd core && cargo build && cargo test -sdk: - cd core && ./install-sdk.sh +cli: + cd core && ./install-cli.sh deb: results/$(BASENAME).deb @@ -106,15 +111,13 @@ results/$(BASENAME).$(IMAGE_TYPE) results/$(BASENAME).squashfs: $(IMAGE_RECIPE_S # For creating os images. DO NOT USE install: $(ALL_TARGETS) $(call mkdir,$(DESTDIR)/usr/bin) - $(call cp,core/target/$(ARCH)-unknown-linux-gnu/release/startbox,$(DESTDIR)/usr/bin/startbox) + $(call cp,core/target/$(ARCH)-unknown-linux-musl/release/startbox,$(DESTDIR)/usr/bin/startbox) $(call ln,/usr/bin/startbox,$(DESTDIR)/usr/bin/startd) $(call ln,/usr/bin/startbox,$(DESTDIR)/usr/bin/start-cli) $(call ln,/usr/bin/startbox,$(DESTDIR)/usr/bin/start-sdk) - $(call ln,/usr/bin/startbox,$(DESTDIR)/usr/bin/start-deno) - $(call ln,/usr/bin/startbox,$(DESTDIR)/usr/bin/avahi-alias) $(call ln,/usr/bin/startbox,$(DESTDIR)/usr/bin/embassy-cli) - if [ "$(PLATFORM)" = "raspberrypi" ]; then $(call cp,cargo-deps/aarch64-unknown-linux-gnu/release/pi-beep,$(DESTDIR)/usr/bin/pi-beep); fi - if /bin/bash -c '[[ "${ENVIRONMENT}" =~ (^|-)unstable($$|-) ]]'; then $(call cp,cargo-deps/$(ARCH)-unknown-linux-gnu/release/tokio-console,$(DESTDIR)/usr/bin/tokio-console); fi + if [ "$(PLATFORM)" = "raspberrypi" ]; then $(call cp,cargo-deps/aarch64-unknown-linux-musl/release/pi-beep,$(DESTDIR)/usr/bin/pi-beep); fi + if /bin/bash -c '[[ "${ENVIRONMENT}" =~ (^|-)unstable($$|-) ]]'; then $(call cp,cargo-deps/$(ARCH)-unknown-linux-musl/release/tokio-console,$(DESTDIR)/usr/bin/tokio-console); fi $(call mkdir,$(DESTDIR)/lib/systemd/system) $(call cp,core/startos/startd.service,$(DESTDIR)/lib/systemd/system/startd.service) @@ -128,10 +131,6 @@ install: $(ALL_TARGETS) $(call cp,GIT_HASH.txt,$(DESTDIR)/usr/lib/startos/GIT_HASH.txt) $(call cp,VERSION.txt,$(DESTDIR)/usr/lib/startos/VERSION.txt) - $(call mkdir,$(DESTDIR)/usr/lib/startos/container) - $(call cp,core/target/aarch64-unknown-linux-musl/release/container-init,$(DESTDIR)/usr/lib/startos/container/container-init.arm64) - $(call cp,core/target/x86_64-unknown-linux-musl/release/container-init,$(DESTDIR)/usr/lib/startos/container/container-init.amd64) - $(call mkdir,$(DESTDIR)/usr/lib/startos/system-images) $(call cp,system-images/compat/docker-images/$(ARCH).tar,$(DESTDIR)/usr/lib/startos/system-images/compat.tar) $(call cp,system-images/utils/docker-images/$(ARCH).tar,$(DESTDIR)/usr/lib/startos/system-images/utils.tar) @@ -148,8 +147,8 @@ update-overlay: $(ALL_TARGETS) $(MAKE) install REMOTE=$(REMOTE) SSHPASS=$(SSHPASS) PLATFORM=$(PLATFORM) $(call ssh,"sudo systemctl start startd") -wormhole: core/target/$(ARCH)-unknown-linux-gnu/release/startbox - @wormhole send core/target/$(ARCH)-unknown-linux-gnu/release/startbox 2>&1 | awk -Winteractive '/wormhole receive/ { printf "sudo /usr/lib/startos/scripts/chroot-and-upgrade \"cd /usr/bin && rm startbox && wormhole receive --accept-file %s && chmod +x startbox\"\n", $$3 }' +wormhole: core/target/$(ARCH)-unknown-linux-musl/release/startbox + @wormhole send core/target/$(ARCH)-unknown-linux-musl/release/startbox 2>&1 | awk -Winteractive '/wormhole receive/ { printf "sudo /usr/lib/startos/scripts/chroot-and-upgrade \"cd /usr/bin && rm startbox && wormhole receive --accept-file %s && chmod +x startbox\"\n", $$3 }' update: $(ALL_TARGETS) @if [ -z "$(REMOTE)" ]; then >&2 echo "Must specify REMOTE" && false; fi @@ -166,6 +165,26 @@ emulate-reflash: $(ALL_TARGETS) upload-ota: results/$(BASENAME).squashfs TARGET=$(TARGET) KEY=$(KEY) ./upload-ota.sh +container-runtime/alpine.squashfs: $(PLATFORM_FILE) + ARCH=$(ARCH) ./container-runtime/download-base-image.sh + +container-runtime/node_modules: container-runtime/package.json container-runtime/package-lock.json sdk/dist + npm --prefix container-runtime ci + touch container-runtime/node_modules + +sdk/dist: $(shell git ls-files sdk) + (cd sdk && make bundle) + +container-runtime/dist: container-runtime/node_modules $(shell git ls-files container-runtime/src) container-runtime/package.json container-runtime/tsconfig.json + npm --prefix container-runtime run build + +container-runtime/dist/node_modules container-runtime/dist/package.json container-runtime/dist/package-lock.json: container-runtime/package.json container-runtime/package-lock.json sdk/dist container-runtime/install-dist-deps.sh + ./container-runtime/install-dist-deps.sh + touch container-runtime/dist/node_modules + +build/lib/container-runtime/rootfs.squashfs: container-runtime/alpine.squashfs container-runtime/containerRuntime.rc container-runtime/update-image.sh container-runtime/dist container-runtime/dist/node_modules core/target/$(ARCH)-unknown-linux-musl/release/containerbox $(PLATFORM_FILE) | sudo + ARCH=$(ARCH) ./container-runtime/update-image.sh + build/lib/depends build/lib/conflicts: build/dpkg-deps/* build/dpkg-deps/generate.sh @@ -181,10 +200,6 @@ system-images/utils/docker-images/$(ARCH).tar: $(UTILS_SRC) system-images/binfmt/docker-images/$(ARCH).tar: $(BINFMT_SRC) cd system-images/binfmt && make docker-images/$(ARCH).tar && touch docker-images/$(ARCH).tar -snapshots: core/snapshot-creator/Cargo.toml - cd core/ && ARCH=aarch64 ./build-v8-snapshot.sh - cd core/ && ARCH=x86_64 ./build-v8-snapshot.sh - $(BINS): $(CORE_SRC) $(ENVIRONMENT_FILE) cd core && ARCH=$(ARCH) ./build-prod.sh touch $(BINS) @@ -231,8 +246,8 @@ uis: $(WEB_UIS) # this is a convenience step to build the UI ui: web/dist/raw/ui -cargo-deps/aarch64-unknown-linux-gnu/release/pi-beep: +cargo-deps/aarch64-unknown-linux-musl/release/pi-beep: ARCH=aarch64 ./build-cargo-dep.sh pi-beep -cargo-deps/$(ARCH)-unknown-linux-gnu/release/tokio-console: +cargo-deps/$(ARCH)-unknown-linux-musl/release/tokio-console: ARCH=$(ARCH) ./build-cargo-dep.sh tokio-console \ No newline at end of file diff --git a/build-cargo-dep.sh b/build-cargo-dep.sh index f3cb8e969..5c8f9ceed 100755 --- a/build-cargo-dep.sh +++ b/build-cargo-dep.sh @@ -18,8 +18,8 @@ if [ -z "$ARCH" ]; then fi mkdir -p cargo-deps -alias 'rust-arm64-builder'='docker run $USE_TTY --rm -v "$HOME/.cargo/registry":/usr/local/cargo/registry -v "$(pwd)"/cargo-deps:/home/rust/src -P start9/rust-arm-cross:aarch64' +alias 'rust-musl-builder'='docker run $USE_TTY --rm -e "RUSTFLAGS=$RUSTFLAGS" -v "$HOME/.cargo/registry":/root/.cargo/registry -v "$(pwd)":/home/rust/src -w /home/rust/src -P messense/rust-musl-cross:$ARCH-musl' -rust-arm64-builder cargo install "$1" --target-dir /home/rust/src --target=$ARCH-unknown-linux-gnu +rust-musl-builder cargo install "$1" --target-dir /home/rust/src --target=$ARCH-unknown-linux-musl sudo chown -R $USER cargo-deps sudo chown -R $USER ~/.cargo \ No newline at end of file diff --git a/build/.gitignore b/build/.gitignore index 357c0e49f..f24aa0255 100644 --- a/build/.gitignore +++ b/build/.gitignore @@ -1,2 +1,3 @@ -lib/depends -lib/conflicts \ No newline at end of file +/lib/depends +/lib/conflicts +/lib/container-runtime/rootfs.squashfs \ No newline at end of file diff --git a/build/dpkg-deps/depends b/build/dpkg-deps/depends index a712d4a52..5438432e4 100644 --- a/build/dpkg-deps/depends +++ b/build/dpkg-deps/depends @@ -20,12 +20,12 @@ httpdirfs iotop iw jq -libavahi-client3 libyajl2 linux-cpupower lm-sensors lshw lvm2 +lxc magic-wormhole man-db ncdu diff --git a/build/dpkg-deps/docker.depends b/build/dpkg-deps/docker.depends deleted file mode 100644 index dd78be8a1..000000000 --- a/build/dpkg-deps/docker.depends +++ /dev/null @@ -1,5 +0,0 @@ -+ containerd.io -+ docker-ce -+ docker-ce-cli -+ docker-compose-plugin -- podman \ No newline at end of file diff --git a/build/lib/firmware.json b/build/lib/firmware.json index 9637aa70a..07def2c1e 100644 --- a/build/lib/firmware.json +++ b/build/lib/firmware.json @@ -1,13 +1,13 @@ [ { - "id": "pureboot-librem_mini_v2-basic_usb_autoboot_blob_jail-Release-28.3", + "id": "pureboot-librem_mini_v2-basic_usb_autoboot_blob_jail-Release-29", "platform": ["x86_64"], "system-product-name": "librem_mini_v2", "bios-version": { "semver-prefix": "PureBoot-Release-", - "semver-range": "<28.3" + "semver-range": "<29" }, - "url": "https://source.puri.sm/firmware/releases/-/raw/master/librem_mini_v2/custom/pureboot-librem_mini_v2-basic_usb_autoboot_blob_jail-Release-28.3.rom.gz", - "shasum": "5019bcf53f7493c7aa74f8ef680d18b5fc26ec156c705a841433aaa2fdef8f35" + "url": "https://source.puri.sm/firmware/releases/-/raw/master/librem_mini_v2/custom/pureboot-librem_mini_v2-basic_usb_autoboot_blob_jail-Release-29.rom.gz", + "shasum": "96ec04f21b1cfe8e28d9a2418f1ff533efe21f9bbbbf16e162f7c814761b068b" } ] diff --git a/container-runtime/.gitignore b/container-runtime/.gitignore index e1584097d..1764c1d17 100644 --- a/container-runtime/.gitignore +++ b/container-runtime/.gitignore @@ -3,4 +3,6 @@ dist/ bundle.js startInit.js service/ -service.js \ No newline at end of file +service.js +alpine.squashfs +/tmp \ No newline at end of file diff --git a/container-runtime/Dockerfile b/container-runtime/Dockerfile new file mode 100644 index 000000000..f936ee11b --- /dev/null +++ b/container-runtime/Dockerfile @@ -0,0 +1,4 @@ +FROM node:18-alpine + +ADD ./startInit.js /usr/local/lib/startInit.js +ADD ./entrypoint.sh /usr/local/bin/entrypoint.sh \ No newline at end of file diff --git a/container-runtime/RPCSpec.md b/container-runtime/RPCSpec.md new file mode 100644 index 000000000..679671614 --- /dev/null +++ b/container-runtime/RPCSpec.md @@ -0,0 +1,59 @@ +# Container RPC SERVER Specification + +## Methods + +### init +initialize runtime (mount `/proc`, `/sys`, `/dev`, and `/run` to each image in `/media/images`) + +called after os has mounted js and images to the container +#### args +`[]` +#### response +`null` + +### exit +shutdown runtime +#### args +`[]` +#### response +`null` + +### start +run main method if not already running +#### args +`[]` +#### response +`null` + +### stop +stop main method by sending SIGTERM to child processes, and SIGKILL after timeout +#### args +`{ timeout: millis }` +#### response +`null` + +### execute +run a specific package procedure +#### args +```ts +{ + procedure: JsonPath, + input: any, + timeout: millis, +} +``` +#### response +`any` + +### sandbox +run a specific package procedure in sandbox mode +#### args +```ts +{ + procedure: JsonPath, + input: any, + timeout: millis, +} +``` +#### response +`any` diff --git a/container-runtime/containerRuntime.rc b/container-runtime/containerRuntime.rc new file mode 100644 index 000000000..203b99659 --- /dev/null +++ b/container-runtime/containerRuntime.rc @@ -0,0 +1,10 @@ +#!/sbin/openrc-run + +name=containerRuntime +#cfgfile="/etc/containerRuntime/containerRuntime.conf" +command="/usr/bin/node" +command_args="--experimental-detect-module --unhandled-rejections=warn /usr/lib/startos/init/index.js" +pidfile="/run/containerRuntime.pid" +command_background="yes" +output_log="/var/log/containerRuntime.log" +error_log="/var/log/containerRuntime.err" diff --git a/container-runtime/download-base-image.sh b/container-runtime/download-base-image.sh new file mode 100755 index 000000000..e708478e1 --- /dev/null +++ b/container-runtime/download-base-image.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +cd "$(dirname "${BASH_SOURCE[0]}")" + +set -e + +DISTRO=alpine +VERSION=3.19 +ARCH=${ARCH:-$(uname -m)} +FLAVOR=default + +if [ "$ARCH" = "x86_64" ]; then + ARCH=amd64 +elif [ "$ARCH" = "aarch64" ]; then + ARCH=arm64 +fi + +curl https://images.linuxcontainers.org/$(curl --silent https://images.linuxcontainers.org/meta/1.0/index-system | grep "^$DISTRO;$VERSION;$ARCH;$FLAVOR;" | head -n1 | sed 's/^.*;//g')/rootfs.squashfs --output alpine.squashfs \ No newline at end of file diff --git a/container-runtime/initSrc/CallbackHolder.ts b/container-runtime/initSrc/CallbackHolder.ts deleted file mode 100644 index 16d4ac264..000000000 --- a/container-runtime/initSrc/CallbackHolder.ts +++ /dev/null @@ -1,22 +0,0 @@ - - -export class CallbackHolder { - constructor() { - - } - private root = (Math.random() + 1).toString(36).substring(7); - private inc = 0 - private callbacks = new Map() - private newId() { - return this.root + (this.inc++).toString(36) - } - addCallback(callback: Function) { - return this.callbacks.set(this.newId(), callback); - } - callCallback(index: string, args: any[]): Promise { - const callback = this.callbacks.get(index) - if (!callback) throw new Error(`Callback ${index} does not exist`) - this.callbacks.delete(index) - return Promise.resolve().then(() => callback(...args)) - } -} \ No newline at end of file diff --git a/container-runtime/initSrc/Effects.ts b/container-runtime/initSrc/Effects.ts deleted file mode 100644 index 7c376b0be..000000000 --- a/container-runtime/initSrc/Effects.ts +++ /dev/null @@ -1,184 +0,0 @@ -import * as T from "@start9labs/start-sdk/lib/types" -import * as net from "net" -import { CallbackHolder } from "./CallbackHolder" - -const SOCKET_PATH = "/start9/sockets/startDaemon.sock" -const MAIN = "main" as const -export class Effects implements T.Effects { - constructor(readonly method: string, readonly callbackHolder: CallbackHolder) {} - id = 0 - rpcRound(method: string, params: unknown) { - const id = this.id++; - const client = net.createConnection(SOCKET_PATH, () => { - client.write(JSON.stringify({ - id, - method, - params - })); - }); - return new Promise((resolve, reject) => { - client.on('data', (data) => { - try { - resolve(JSON.parse(data.toString())?.result) - } catch (error) { - reject(error) - } - client.end(); - }); - }) - } - started= this.method !== MAIN ? null : ()=> { - return this.rpcRound('started', null) - } - bind(...[options]: Parameters) { - return this.rpcRound('bind', (options)) as ReturnType - } - clearBindings(...[]: Parameters) { - return this.rpcRound('clearBindings', null) as ReturnType - } - clearNetworkInterfaces( - ...[]: Parameters - ) { - return this.rpcRound('clearNetworkInterfaces', null) as ReturnType - } - executeAction(...[options]: Parameters) { - return this.rpcRound('executeAction', options) as ReturnType - } - exists(...[packageId]: Parameters) { - return this.rpcRound('exists', packageId) as ReturnType - } - exportAction(...[options]: Parameters) { - return this.rpcRound('exportAction', (options)) as ReturnType - } - exportNetworkInterface( - ...[options]: Parameters - ) { - return this.rpcRound('exportNetworkInterface', (options)) as ReturnType - } - exposeForDependents(...[options]: any) { - - return this.rpcRound('exposeForDependents', (null)) as ReturnType - } - exposeUi(...[options]: Parameters) { - - return this.rpcRound('exposeUi', (options)) as ReturnType - } - getConfigured(...[]: Parameters) { - - return this.rpcRound('getConfigured',null) as ReturnType - } - getContainerIp(...[]: Parameters) { - - return this.rpcRound('getContainerIp', null) as ReturnType - } - getHostnames: any = (...[allOptions]: any[]) => { - const options = { - ...allOptions, - callback: this.callbackHolder.addCallback(allOptions.callback) - } - return this.rpcRound('getHostnames', options) as ReturnType - } - getInterface(...[options]: Parameters) { - - return this.rpcRound('getInterface', {...options, callback: this.callbackHolder.addCallback(options.callback)}) as ReturnType - } - getIPHostname(...[]: Parameters) { - - return this.rpcRound('getIPHostname', (null)) as ReturnType - } - getLocalHostname(...[]: Parameters) { - - return this.rpcRound('getLocalHostname', null) as ReturnType - } - getPrimaryUrl(...[options]: Parameters) { - - return this.rpcRound('getPrimaryUrl', {...options, callback: this.callbackHolder.addCallback(options.callback)}) as ReturnType - } - getServicePortForward( - ...[options]: Parameters - ) { - - return this.rpcRound('getServicePortForward', (options)) as ReturnType - } - getServiceTorHostname( - ...[interfaceId, packageId]: Parameters - ) { - - return this.rpcRound('getServiceTorHostname', ({interfaceId, packageId})) as ReturnType - } - getSslCertificate(...[packageId, algorithm]: Parameters) { - - return this.rpcRound('getSslCertificate', ({packageId, algorithm})) as ReturnType - } - getSslKey(...[packageId, algorithm]: Parameters) { - - return this.rpcRound('getSslKey', ({packageId, algorithm})) as ReturnType - } - getSystemSmtp(...[options]: Parameters) { - - return this.rpcRound('getSystemSmtp', {...options, callback: this.callbackHolder.addCallback(options.callback)}) as ReturnType - } - is_sandboxed(...[]: Parameters) { - - return this.rpcRound('is_sandboxed', (null)) as ReturnType - } - listInterface(...[options]: Parameters) { - - return this.rpcRound('listInterface', {...options, callback: this.callbackHolder.addCallback(options.callback)}) as ReturnType - } - mount(...[options]: Parameters) { - - return this.rpcRound('mount', options) as ReturnType - } - removeAction(...[options]: Parameters) { - - return this.rpcRound('removeAction', options) as ReturnType - } - removeAddress(...[options]: Parameters) { - - return this.rpcRound('removeAddress', options) as ReturnType - } - restart(...[]: Parameters) { - - this.rpcRound('restart', null) - } - reverseProxy(...[options]: Parameters) { - - return this.rpcRound('reverseProxy', options) as ReturnType - } - running(...[packageId]: Parameters) { - - return this.rpcRound('running', {packageId}) as ReturnType - } - // runRsync(...[options]: Parameters) { - // - // return this.rpcRound('executeAction', options) as ReturnType - // - // return this.rpcRound('executeAction', options) as ReturnType - // } - setConfigured(...[configured]: Parameters) { - - return this.rpcRound('setConfigured', {configured}) as ReturnType - } - setDependencies(...[dependencies]: Parameters) { - - return this.rpcRound('setDependencies', {dependencies}) as ReturnType - } - setHealth(...[options]: Parameters) { - - return this.rpcRound('setHealth', options) as ReturnType - } - shutdown(...[]: Parameters) { - - return this.rpcRound('shutdown', null) - } - stopped(...[packageId]: Parameters) { - - return this.rpcRound('stopped', {packageId}) as ReturnType - } - store: T.Effects['store'] = { - get:(options) => this.rpcRound('getStore', {...options, callback: this.callbackHolder.addCallback(options.callback)}) as ReturnType, - set:(options) => this.rpcRound('setStore', options) as ReturnType - - } -} diff --git a/container-runtime/initSrc/Runtime.ts b/container-runtime/initSrc/Runtime.ts deleted file mode 100644 index 0c4b764c2..000000000 --- a/container-runtime/initSrc/Runtime.ts +++ /dev/null @@ -1,177 +0,0 @@ -// @ts-check - -import * as net from "net" -import { - object, - some, - string, - literal, - array, - number, - matches, -} from "ts-matches" -import { Effects } from "./Effects" -import { CallbackHolder } from "./CallbackHolder" - -import * as CP from "child_process" -import * as Mod from "module" - - -const SOCKET_PATH = "/start9/sockets/rpc.sock" -const LOCATION_OF_SERVICE_JS = "/services/service.js" - -const childProcesses = new Map() -let childProcessIndex = 0 -const require = Mod.prototype.require -const setupRequire = () => { - const requireChildProcessIndex = childProcessIndex++ - // @ts-ignore - Mod.prototype.require = (name, ...rest) => { - if (["child_process", "node:child_process"].indexOf(name) !== -1) { - return { - exec(...args: any[]) { - const returning = CP.exec.apply(null, args as any) - const childProcessArray = - childProcesses.get(requireChildProcessIndex) ?? [] - childProcessArray.push(returning) - childProcesses.set(requireChildProcessIndex, childProcessArray) - return returning - }, - execFile(...args: any[]) { - const returning = CP.execFile.apply(null, args as any) - const childProcessArray = - childProcesses.get(requireChildProcessIndex) ?? [] - childProcessArray.push(returning) - childProcesses.set(requireChildProcessIndex, childProcessArray) - return returning - }, - execFileSync: CP.execFileSync, - execSync: CP.execSync, - fork(...args: any[]) { - const returning = CP.fork.apply(null, args as any) - const childProcessArray = - childProcesses.get(requireChildProcessIndex) ?? [] - childProcessArray.push(returning) - childProcesses.set(requireChildProcessIndex, childProcessArray) - return returning - }, - spawn(...args: any[]) { - const returning = CP.spawn.apply(null, args as any) - const childProcessArray = - childProcesses.get(requireChildProcessIndex) ?? [] - childProcessArray.push(returning) - childProcesses.set(requireChildProcessIndex, childProcessArray) - return returning - }, - spawnSync: CP.spawnSync, - } as typeof CP - } - console.log("require", name) - return require(name, ...rest) - } - return requireChildProcessIndex -} - -const cleanupRequire = (requireChildProcessIndex: number) => { - const foundChildren = childProcesses.get(requireChildProcessIndex) - if (!foundChildren) return - childProcesses.delete(requireChildProcessIndex) - foundChildren.forEach((x) => x.kill()) -} - -const idType = some(string, number) -const runType = object({ - id: idType, - method: literal("run"), - params: object({ - methodName: string.map((x) => { - const splitValue = x.split("/") - if (splitValue.length === 1) - throw new Error(`X (${x}) is not a valid path`) - return splitValue.slice(1) - }), - methodArgs: object, - }), -}) -const callbackType = object({ - id: idType, - method: literal("callback"), - params: object({ - callback: string, - args: array, - }), -}) -const dealWithInput = async (callbackHolder: CallbackHolder, input: unknown) => - matches(input) - .when(runType, async ({ id, params: { methodName, methodArgs } }) => { - const index = setupRequire() - const effects = new Effects(`/${methodName.join("/")}`, callbackHolder) - // @ts-ignore - return import(LOCATION_OF_SERVICE_JS) - .then((x) => methodName.reduce(reduceMethod(methodArgs, effects), x)) - .then() - .then((result) => ({ id, result })) - .catch((error) => ({ - id, - error: { message: error?.message ?? String(error) }, - })) - .finally(() => cleanupRequire(index)) - }) - .when(callbackType, async ({ id, params: { callback, args } }) => - Promise.resolve(callbackHolder.callCallback(callback, args)) - .then((result) => ({ id, result })) - .catch((error) => ({ - id, - error: { message: error?.message ?? String(error) }, - })), - ) - - .defaultToLazy(() => { - console.warn(`Coudln't parse the following input ${input}`) - return { - error: { message: "Could not figure out shape" }, - } - }) - -const jsonParse = (x: Buffer) => JSON.parse(x.toString()) -export class Runtime { - unixSocketServer = net.createServer(async (server) => {}) - private callbacks = new CallbackHolder() - constructor() { - this.unixSocketServer.listen(SOCKET_PATH) - - this.unixSocketServer.on("connection", (s) => { - s.on("data", (a) => - Promise.resolve(a) - .then(jsonParse) - .then(dealWithInput.bind(null, this.callbacks)) - .then((x) => { - console.log("x", JSON.stringify(x), typeof x) - return x - }) - .catch((error) => ({ - error: { message: error?.message ?? String(error) }, - })) - .then(JSON.stringify) - .then((x) => new Promise((resolve) => s.write("" + x, resolve))) - .finally(() => void s.end()), - ) - }) - } -} -function reduceMethod( - methodArgs: object, - effects: Effects, -): (previousValue: any, currentValue: string) => any { - return (x: any, method: string) => - Promise.resolve(x) - .then((x) => x[method]) - .then((x) => - typeof x !== "function" - ? x - : x({ - ...methodArgs, - effects, - }), - ) -} \ No newline at end of file diff --git a/container-runtime/install-dist-deps.sh b/container-runtime/install-dist-deps.sh new file mode 100755 index 000000000..d155ed4f2 --- /dev/null +++ b/container-runtime/install-dist-deps.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +cd "$(dirname "${BASH_SOURCE[0]}")" + +set -e + +cat ./package.json | sed 's/file:\.\([.\/]\)/file:..\/.\1/g' > ./dist/package.json +cat ./package-lock.json | sed 's/"\.\([.\/]\)/"..\/.\1/g' > ./dist/package-lock.json + +npm --prefix dist ci --omit=dev \ No newline at end of file diff --git a/container-runtime/mkcontainer.sh b/container-runtime/mkcontainer.sh new file mode 100644 index 000000000..90de54671 --- /dev/null +++ b/container-runtime/mkcontainer.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +set -e + +IMAGE=$1 + +if [ -z "$IMAGE" ]; then + >&2 echo "usage: $0 " + exit 1 +fi + +if ! [ -d "/media/images/$IMAGE" ]; then + >&2 echo "image does not exist" + exit 1 +fi + +container=$(mktemp -d) +mkdir -p $container/rootfs $container/upper $container/work +mount -t overlay -olowerdir=/media/images/$IMAGE,upperdir=$container/upper,workdir=$container/work overlay $container/rootfs + +rootfs=$container/rootfs + +for special in dev sys proc run; do + mkdir -p $rootfs/$special + mount --bind /$special $rootfs/$special +done + +echo $rootfs \ No newline at end of file diff --git a/container-runtime/package-lock.json b/container-runtime/package-lock.json index 2ccaca591..74551217e 100644 --- a/container-runtime/package-lock.json +++ b/container-runtime/package-lock.json @@ -1,7 +1,7 @@ { "name": "start-init", "version": "0.0.0", - "lockfileVersion": 3, + "lockfileVersion": 2, "requires": true, "packages": { "": { @@ -9,11 +9,11 @@ "version": "0.0.0", "dependencies": { "@iarna/toml": "^2.2.5", - "@start9labs/start-sdk": "=0.4.0-rev0.lib0.rc8.alpha3", - "esbuild": "0.18.4", + "@start9labs/start-sdk": "file:../sdk/dist", "esbuild-plugin-resolve": "^2.0.0", "filebrowser": "^1.0.0", "isomorphic-fetch": "^3.0.0", + "node-fetch": "^3.1.0", "ts-matches": "^5.4.1", "tslib": "^2.5.3", "typescript": "^5.1.3", @@ -22,18 +22,19 @@ "devDependencies": { "@swc/cli": "^0.1.62", "@swc/core": "^1.3.65", - "@types/node": "^20.2.5", - "prettier": "^2.8.8", - "rollup": "^3.25.1" + "@types/node": "^20.11.13", + "esbuild": "^0.20.0", + "prettier": "^3.2.5", + "typescript": ">5.2" } }, - "../start-sdk": { + "../sdk/dist": { "name": "@start9labs/start-sdk", - "version": "0.4.0-rev0.lib0.rc5", - "extraneous": true, + "version": "0.4.0-rev0.lib0.rc8.beta7", "license": "MIT", "dependencies": { "@iarna/toml": "^2.2.5", + "isomorphic-fetch": "^3.0.0", "ts-matches": "^5.4.1", "yaml": "^2.2.2" }, @@ -42,36 +43,34 @@ "jest": "^29.4.3", "ts-jest": "^29.0.5", "ts-node": "^10.9.1", - "tsc-multi": "^0.6.1", - "tsconfig-paths": "^3.14.2", - "typescript": "^5.0.4", - "vitest": "^0.29.2" + "tsx": "^4.7.1", + "typescript": "^5.0.4" } }, - "../tmp/service": { - "extraneous": true, - "dependencies": { - "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc7", - "filebrowser": "git+https://github.com/start9labs/filebrowser-wrapper.git#32e05d3d2157038b099329c11453b00d29ccca78", - "ts-matches": "^5.4.1" - }, - "devDependencies": { - "@types/node": "^20.0.0", - "@vercel/ncc": "^0.36.1", - "prettier": "^2.8.4", - "typescript": "^5.1.3" + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.0.tgz", + "integrity": "sha512-fGFDEctNh0CcSwsiRPxiaqX0P5rq+AqE0SRhYGZ4PX46Lg1FNR6oCxJghf8YgY0WQEgQuh3lErUFE4KxLeRmmw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" } }, - "@start9labs/start-sdk@0.4.0-rev0.lib0.rc8.alpha1": { - "extraneous": true - }, "node_modules/@esbuild/android-arm": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.4.tgz", - "integrity": "sha512-yKmQC9IiuvHdsNEbPHSprnMHg6OhL1cSeQZLzPpgzJBJ9ppEg9GAZN8MKj1TcmB4tZZUrq5xjK7KCmhwZP8iDA==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.0.tgz", + "integrity": "sha512-3bMAfInvByLHfJwYPJRlpTeaQA75n8C/QKpEaiS4HrFWFiJlNI0vzq/zCjBrhAYcPyVPG7Eo9dMrcQXuqmNk5g==", "cpu": [ "arm" ], + "dev": true, "optional": true, "os": [ "android" @@ -81,12 +80,13 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.4.tgz", - "integrity": "sha512-yQVgO+V307hA2XhzELQ6F91CBGX7gSnlVGAj5YIqjQOxThDpM7fOcHT2YLJbE6gNdPtgRSafQrsK8rJ9xHCaZg==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.0.tgz", + "integrity": "sha512-aVpnM4lURNkp0D3qPoAzSG92VXStYmoVPOgXveAUoQBWRSuQzt51yvSju29J6AHPmwY1BjH49uR29oyfH1ra8Q==", "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "android" @@ -96,12 +96,13 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.4.tgz", - "integrity": "sha512-yLKXMxQg6sk1ntftxQ5uwyVgG4/S2E7UoOCc5N4YZW7fdkfRiYEXqm7CMuIfY2Vs3FTrNyKmSfNevIuIvJnMww==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.0.tgz", + "integrity": "sha512-uK7wAnlRvjkCPzh8jJ+QejFyrP8ObKuR5cBIsQZ+qbMunwR8sbd8krmMbxTLSrDhiPZaJYKQAU5Y3iMDcZPhyQ==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "android" @@ -111,12 +112,13 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.4.tgz", - "integrity": "sha512-MVPEoZjZpk2xQ1zckZrb8eQuQib+QCzdmMs3YZAYEQPg+Rztk5pUxGyk8htZOC8Z38NMM29W+MqY9Sqo/sDGKw==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.0.tgz", + "integrity": "sha512-AjEcivGAlPs3UAcJedMa9qYg9eSfU6FnGHJjT8s346HSKkrcWlYezGE8VaO2xKfvvlZkgAhyvl06OJOxiMgOYQ==", "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "darwin" @@ -126,12 +128,13 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.4.tgz", - "integrity": "sha512-uEsRtYRUDsz7i2tXg/t/SyF+5gU1cvi9B6B8i5ebJgtUUHJYWyIPIesmIOL4/+bywjxsDMA/XrNFMgMffLnh5A==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.0.tgz", + "integrity": "sha512-bsgTPoyYDnPv8ER0HqnJggXK6RyFy4PH4rtsId0V7Efa90u2+EifxytE9pZnsDgExgkARy24WUQGv9irVbTvIw==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "darwin" @@ -141,12 +144,13 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.4.tgz", - "integrity": "sha512-I8EOigqWnOHRin6Zp5Y1cfH3oT54bd7Sdz/VnpUNksbOtfp8IWRTH4pgkgO5jWaRQPjCpJcOpdRjYAMjPt8wXg==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.0.tgz", + "integrity": "sha512-kQ7jYdlKS335mpGbMW5tEe3IrQFIok9r84EM3PXB8qBFJPSc6dpWfrtsC/y1pyrz82xfUIn5ZrnSHQQsd6jebQ==", "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "freebsd" @@ -156,12 +160,13 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.4.tgz", - "integrity": "sha512-1bHfgMz/cNMjbpsYxjVgMJ1iwKq+NdDPlACBrWULD7ZdFmBQrhMicMaKb5CdmdVyvIwXmasOuF4r6Iq574kUTA==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.0.tgz", + "integrity": "sha512-uG8B0WSepMRsBNVXAQcHf9+Ko/Tr+XqmK7Ptel9HVmnykupXdS4J7ovSQUIi0tQGIndhbqWLaIL/qO/cWhXKyQ==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "freebsd" @@ -171,12 +176,13 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.4.tgz", - "integrity": "sha512-4XCGqM/Ay1LCXUBH59bL4JbSbbTK1K22dWHymWMGaEh2sQCDOUw+OQxozYV/YdBb91leK2NbuSrE2BRamwgaYw==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.0.tgz", + "integrity": "sha512-2ezuhdiZw8vuHf1HKSf4TIk80naTbP9At7sOqZmdVwvvMyuoDiZB49YZKLsLOfKIr77+I40dWpHVeY5JHpIEIg==", "cpu": [ "arm" ], + "dev": true, "optional": true, "os": [ "linux" @@ -186,12 +192,13 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.4.tgz", - "integrity": "sha512-J42vLHaYREyiBwH0eQE4/7H1DTfZx8FuxyWSictx4d7ezzuKE3XOkIvOg+SQzRz7T9HLVKzq2tvbAov4UfufBw==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.0.tgz", + "integrity": "sha512-uTtyYAP5veqi2z9b6Gr0NUoNv9F/rOzI8tOD5jKcCvRUn7T60Bb+42NDBCWNhMjkQzI0qqwXkQGo1SY41G52nw==", "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -201,12 +208,13 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.4.tgz", - "integrity": "sha512-4ksIqFwhq7OExty7Sl1n0vqQSCqTG4sU6i99G2yuMr28CEOUZ/60N+IO9hwI8sIxBqmKmDgncE1n5CMu/3m0IA==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.0.tgz", + "integrity": "sha512-c88wwtfs8tTffPaoJ+SQn3y+lKtgTzyjkD8NgsyCtCmtoIC8RDL7PrJU05an/e9VuAke6eJqGkoMhJK1RY6z4w==", "cpu": [ "ia32" ], + "dev": true, "optional": true, "os": [ "linux" @@ -216,12 +224,13 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.4.tgz", - "integrity": "sha512-bsWtoVHkGQgAsFXioDueXRiUIfSGrVkJjBBz4gcBJxXcD461cWFQFyu8Fxdj9TP+zEeqJ8C/O4LFFMBNi6Fscw==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.0.tgz", + "integrity": "sha512-lR2rr/128/6svngnVta6JN4gxSXle/yZEZL3o4XZ6esOqhyR4wsKyfu6qXAL04S4S5CgGfG+GYZnjFd4YiG3Aw==", "cpu": [ "loong64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -231,12 +240,13 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.4.tgz", - "integrity": "sha512-LRD9Fu8wJQgIOOV1o3nRyzrheFYjxA0C1IVWZ93eNRRWBKgarYFejd5WBtrp43cE4y4D4t3qWWyklm73Mrsd/g==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.0.tgz", + "integrity": "sha512-9Sycc+1uUsDnJCelDf6ZNqgZQoK1mJvFtqf2MUz4ujTxGhvCWw+4chYfDLPepMEvVL9PDwn6HrXad5yOrNzIsQ==", "cpu": [ "mips64el" ], + "dev": true, "optional": true, "os": [ "linux" @@ -246,12 +256,13 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.4.tgz", - "integrity": "sha512-jtQgoZjM92gauVRxNaaG/TpL3Pr4WcL3Pwqi9QgdrBGrEXzB+twohQiWNSTycs6lUygakos4mm2h0B9/SHveng==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.0.tgz", + "integrity": "sha512-CoWSaaAXOZd+CjbUTdXIJE/t7Oz+4g90A3VBCHLbfuc5yUQU/nFDLOzQsN0cdxgXd97lYW/psIIBdjzQIwTBGw==", "cpu": [ "ppc64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -261,12 +272,13 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.4.tgz", - "integrity": "sha512-7WaU/kRZG0VCV09Xdlkg6LNAsfU9SAxo6XEdaZ8ffO4lh+DZoAhGTx7+vTMOXKxa+r2w1LYDGxfJa2rcgagMRA==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.0.tgz", + "integrity": "sha512-mlb1hg/eYRJUpv8h/x+4ShgoNLL8wgZ64SUr26KwglTYnwAWjkhR2GpoKftDbPOCnodA9t4Y/b68H4J9XmmPzA==", "cpu": [ "riscv64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -276,12 +288,13 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.4.tgz", - "integrity": "sha512-D19ed0xreKQvC5t+ArE2njSnm18WPpE+1fhwaiJHf+Xwqsq+/SUaV8Mx0M27nszdU+Atq1HahrgCOZCNNEASUg==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.0.tgz", + "integrity": "sha512-fgf9ubb53xSnOBqyvWEY6ukBNRl1mVX1srPNu06B6mNsNK20JfH6xV6jECzrQ69/VMiTLvHMicQR/PgTOgqJUQ==", "cpu": [ "s390x" ], + "dev": true, "optional": true, "os": [ "linux" @@ -291,12 +304,13 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.4.tgz", - "integrity": "sha512-Rx3AY1sxyiO/gvCGP00nL69L60dfmWyjKWY06ugpB8Ydpdsfi3BHW58HWC24K3CAjAPSwxcajozC2PzA9JBS1g==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.0.tgz", + "integrity": "sha512-H9Eu6MGse++204XZcYsse1yFHmRXEWgadk2N58O/xd50P9EvFMLJTQLg+lB4E1cF2xhLZU5luSWtGTb0l9UeSg==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -306,12 +320,13 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.4.tgz", - "integrity": "sha512-AaShPmN9c6w1mKRpliKFlaWcSkpBT4KOlk93UfFgeI3F3cbjzdDKGsbKnOZozmYbE1izZKLmNJiW0sFM+A5JPA==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.0.tgz", + "integrity": "sha512-lCT675rTN1v8Fo+RGrE5KjSnfY0x9Og4RN7t7lVrN3vMSjy34/+3na0q7RIfWDAj0e0rCh0OL+P88lu3Rt21MQ==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "netbsd" @@ -321,12 +336,13 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.4.tgz", - "integrity": "sha512-tRGvGwou3BrvHVvF8HxTqEiC5VtPzySudS9fh2jBIKpLX7HCW8jIkW+LunkFDNwhslx4xMAgh0jAHsx/iCymaQ==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.0.tgz", + "integrity": "sha512-HKoUGXz/TOVXKQ+67NhxyHv+aDSZf44QpWLa3I1lLvAwGq8x1k0T+e2HHSRvxWhfJrFxaaqre1+YyzQ99KixoA==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "openbsd" @@ -336,12 +352,13 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.4.tgz", - "integrity": "sha512-acORFDI95GKhmAnlH8EarBeuqoy/j3yxIU+FDB91H3+ZON+8HhTadtT450YkaMzX6lEWbhi+mjVUCj00M5yyOQ==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.0.tgz", + "integrity": "sha512-GDwAqgHQm1mVoPppGsoq4WJwT3vhnz/2N62CzhvApFD1eJyTroob30FPpOZabN+FgCjhG+AgcZyOPIkR8dfD7g==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "sunos" @@ -351,12 +368,13 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.4.tgz", - "integrity": "sha512-1NxP+iOk8KSvS1L9SSxEvBAJk39U0GiGZkiiJGbuDF9G4fG7DSDw6XLxZMecAgmvQrwwx7yVKdNN3GgNh0UfKg==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.0.tgz", + "integrity": "sha512-0vYsP8aC4TvMlOQYozoksiaxjlvUcQrac+muDqj1Fxy6jh9l9CZJzj7zmh8JGfiV49cYLTorFLxg7593pGldwQ==", "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "win32" @@ -366,12 +384,13 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.4.tgz", - "integrity": "sha512-OKr8jze93vbgqZ/r23woWciTixUwLa976C9W7yNBujtnVHyvsL/ocYG61tsktUfJOpyIz5TsohkBZ6Lo2+PCcQ==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.0.tgz", + "integrity": "sha512-p98u4rIgfh4gdpV00IqknBD5pC84LCub+4a3MO+zjqvU5MVXOc3hqR2UgT2jI2nh3h8s9EQxmOsVI3tyzv1iFg==", "cpu": [ "ia32" ], + "dev": true, "optional": true, "os": [ "win32" @@ -381,12 +400,13 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.4.tgz", - "integrity": "sha512-qJr3wVvcLjPFcV4AMDS3iquhBfTef2zo/jlm8RMxmiRp3Vy2HY8WMxrykJlcbCnqLXZPA0YZxZGND6eug85ogg==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.0.tgz", + "integrity": "sha512-NgJnesu1RtWihtTtXGFMU5YSE6JyyHPMxCwBZK7a6/8d31GuSo9l0Ss7w1Jw5QnKUawG6UEehs883kcXf5fYwg==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "win32" @@ -467,25 +487,19 @@ } }, "node_modules/@start9labs/start-sdk": { - "version": "0.4.0-rev0.lib0.rc8.alpha3", - "resolved": "https://registry.npmjs.org/@start9labs/start-sdk/-/start-sdk-0.4.0-rev0.lib0.rc8.alpha3.tgz", - "integrity": "sha512-7thHf2iHJovkwsyKbd4lfV0/bOCv5vbPB3EYahPyLtN3rEY+siLDzu/Tmc7XdtsCKLVlLawqYkGPEakmaFs8FQ==", - "dependencies": { - "@iarna/toml": "^2.2.5", - "isomorphic-fetch": "^3.0.0", - "ts-matches": "^5.4.1", - "yaml": "^2.2.2" - } + "resolved": "../sdk/dist", + "link": true }, "node_modules/@swc/cli": { - "version": "0.1.62", - "resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.1.62.tgz", - "integrity": "sha512-kOFLjKY3XH1DWLfXL1/B5MizeNorHR8wHKEi92S/Zi9Md/AK17KSqR8MgyRJ6C1fhKHvbBCl8wboyKAFXStkYw==", + "version": "0.1.65", + "resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.1.65.tgz", + "integrity": "sha512-4NcgsvJVHhA7trDnMmkGLLvWMHu2kSy+qHx6QwRhhJhdiYdNUrhdp+ERxen73sYtaeEOYeLJcWrQ60nzKi6rpg==", "dev": true, "dependencies": { "@mole-inc/bin-wrapper": "^8.0.1", "commander": "^7.1.0", "fast-glob": "^3.2.5", + "minimatch": "^9.0.3", "semver": "^7.3.8", "slash": "3.0.0", "source-map": "^0.7.3" @@ -508,21 +522,16 @@ } } }, - "node_modules/@swc/cli/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/@swc/core": { - "version": "1.3.65", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.65.tgz", - "integrity": "sha512-d5iDiKWf12FBo6h9Fro2pcnLK6HSPbyZ7A1U5iFNpRRx8XEd4uGdKtf5NoXJ3GDLQDLXnNSLA82Cl6SfrJ1lyw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.1.tgz", + "integrity": "sha512-3y+Y8js+e7BbM16iND+6Rcs3jdiL28q3iVtYsCviYSSpP2uUVKkp5sJnCY4pg8AaVvyN7CGQHO7gLEZQ5ByozQ==", "dev": true, "hasInstallScript": true, + "dependencies": { + "@swc/counter": "^0.1.2", + "@swc/types": "^0.1.5" + }, "engines": { "node": ">=10" }, @@ -531,16 +540,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.3.65", - "@swc/core-darwin-x64": "1.3.65", - "@swc/core-linux-arm-gnueabihf": "1.3.65", - "@swc/core-linux-arm64-gnu": "1.3.65", - "@swc/core-linux-arm64-musl": "1.3.65", - "@swc/core-linux-x64-gnu": "1.3.65", - "@swc/core-linux-x64-musl": "1.3.65", - "@swc/core-win32-arm64-msvc": "1.3.65", - "@swc/core-win32-ia32-msvc": "1.3.65", - "@swc/core-win32-x64-msvc": "1.3.65" + "@swc/core-darwin-arm64": "1.4.1", + "@swc/core-darwin-x64": "1.4.1", + "@swc/core-linux-arm-gnueabihf": "1.4.1", + "@swc/core-linux-arm64-gnu": "1.4.1", + "@swc/core-linux-arm64-musl": "1.4.1", + "@swc/core-linux-x64-gnu": "1.4.1", + "@swc/core-linux-x64-musl": "1.4.1", + "@swc/core-win32-arm64-msvc": "1.4.1", + "@swc/core-win32-ia32-msvc": "1.4.1", + "@swc/core-win32-x64-msvc": "1.4.1" }, "peerDependencies": { "@swc/helpers": "^0.5.0" @@ -552,9 +561,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.3.65", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.65.tgz", - "integrity": "sha512-fQIXZgr7CD/+1ADqrVbz/gHvSoIMmggHvPzguQjV8FggBuS9Efm1D1ZrdUSqptggKvuLLHMZf+49tENq8NWWcg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.1.tgz", + "integrity": "sha512-ePyfx0348UbR4DOAW24TedeJbafnzha8liXFGuQ4bdXtEVXhLfPngprrxKrAddCuv42F9aTxydlF6+adD3FBhA==", "cpu": [ "arm64" ], @@ -568,9 +577,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.3.65", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.65.tgz", - "integrity": "sha512-kGuWP7OP9mwOiIcJpEVa+ydC3Wxf0fPQ1MK0hUIPFcR6tAUEdOvdAuCzP6U20RX/JbbgwfI/Qq6ugT7VL6omgg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.1.tgz", + "integrity": "sha512-eLf4JSe6VkCMdDowjM8XNC5rO+BrgfbluEzAVtKR8L2HacNYukieumN7EzpYCi0uF1BYwu1ku6tLyG2r0VcGxA==", "cpu": [ "x64" ], @@ -584,9 +593,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.3.65", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.65.tgz", - "integrity": "sha512-Bjbzldp8n4mWSdAvBt4VuLiHlfFM5pyftjJvJnmSY4H1IzbxkByyT60OHOedcIPRiZveD8NJzUJqutqrgTmtLg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.1.tgz", + "integrity": "sha512-K8VtTLWMw+rkN/jDC9o/Q9SMmzdiHwYo2CfgkwVT29NsGccwmNhCQx6XoYiPKyKGIFKt4tdQnJHKUFzxUqQVtQ==", "cpu": [ "arm" ], @@ -600,9 +609,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.3.65", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.65.tgz", - "integrity": "sha512-GmxtcCymeQqEqT9n5mo857koRsUbEwmuijrBA4OeD5KOPW9gqAmUxr+ZgwgYHwyJ3CiN+UbK8uEqPsL6UVQmLg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.1.tgz", + "integrity": "sha512-0e8p4g0Bfkt8lkiWgcdiENH3RzkcqKtpRXIVNGOmVc0OBkvc2tpm2WTx/eoCnes2HpTT4CTtR3Zljj4knQ4Fvw==", "cpu": [ "arm64" ], @@ -616,9 +625,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.3.65", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.65.tgz", - "integrity": "sha512-yv9jP3gbfMsYrqswT2MwK5Q1+avSwRXAKo+LYUknTeoLQNNlukDfqSLHajNq23XrVDRP4B3Pjn7kaqjxRcihbg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.1.tgz", + "integrity": "sha512-b/vWGQo2n7lZVUnSQ7NBq3Qrj85GrAPPiRbpqaIGwOytiFSk8VULFihbEUwDe0rXgY4LDm8z8wkgADZcLnmdUA==", "cpu": [ "arm64" ], @@ -632,9 +641,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.3.65", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.65.tgz", - "integrity": "sha512-GQkwysEPTlAOQ3jiTiedObzh6pBaf9RLaQqpGdCp+iKze9+BR+STBP0IIKhZDMPG/nWWNhrYFD/VMQxRoYPjfw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.1.tgz", + "integrity": "sha512-AFMQlvkKEdNi1Vk2GFTxxJzbICttBsOQaXa98kFTeWTnFFIyiIj2w7Sk8XRTEJ/AjF8ia8JPKb1zddBWr9+bEQ==", "cpu": [ "x64" ], @@ -648,9 +657,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.3.65", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.65.tgz", - "integrity": "sha512-ETzhOhtDluYFK4x73OTM9gVTMyzGd2WeWGlCu3WoT1EPPUwCqQpcAqI3TfEcP1ljFDG0pPkpYzVpwNf8yjQElg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.1.tgz", + "integrity": "sha512-QX2MxIECX1gfvUVZY+jk528/oFkS9MAl76e3ZRvG2KC/aKlCQL0KSzcTSm13mOxkDKS30EaGRDRQWNukGpMeRg==", "cpu": [ "x64" ], @@ -664,9 +673,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.3.65", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.65.tgz", - "integrity": "sha512-3weD0I6F8bggN0KOnbZkvYC1PBrT5wrvohpvtgijRsODxjoWwztozjawJxF3rqgVqlSI/+nA+JkrN48e2cxJjQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.1.tgz", + "integrity": "sha512-OklkJYXXI/tntD2zaY8i3iZldpyDw5q+NAP3k9OlQ7wXXf37djRsHLV0NW4+ZNHBjE9xp2RsXJ0jlOJhfgGoFA==", "cpu": [ "arm64" ], @@ -680,9 +689,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.3.65", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.65.tgz", - "integrity": "sha512-i6c3D7E9Ca41HteW3+hn1OKQfjIabc2P0p1mJRXBkn+igwb+Ba6gXJc7NqhrlF8uZsDhhcGZTsAqBBtfcfTuHQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.1.tgz", + "integrity": "sha512-MBuc3/QfKX9FnLOU7iGN+6yHRTQaPQ9WskiC8s8JFiKQ+7I2p25tay2RplR9dIEEGgVAu6L7auv96LbNTh+FaA==", "cpu": [ "ia32" ], @@ -696,9 +705,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.3.65", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.65.tgz", - "integrity": "sha512-tQ9hEDtwPZxQ2sYb2n8ypfmdMjobKAf6VSnChteLMktofU7o562op5pLS6D6QCP2AtL3lcwe1piTCgIhk4vmjA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.1.tgz", + "integrity": "sha512-lu4h4wFBb/bOK6N2MuZwg7TrEpwYXgpQf5R7ObNSXL65BwZ9BG8XRzD+dLJmALu8l5N08rP/TrpoKRoGT4WSxw==", "cpu": [ "x64" ], @@ -711,16 +720,17 @@ "node": ">=10" } }, - "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.4.0" - } + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true + }, + "node_modules/@swc/types": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", + "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", + "dev": true }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", @@ -753,9 +763,9 @@ } }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", "dev": true }, "node_modules/@types/keyv": { @@ -768,15 +778,18 @@ } }, "node_modules/@types/node": { - "version": "20.2.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", - "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==", - "dev": true + "version": "20.11.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.17.tgz", + "integrity": "sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", "dev": true, "dependencies": { "@types/node": "*" @@ -819,6 +832,12 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, "node_modules/bin-check": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", @@ -849,14 +868,14 @@ } }, "node_modules/bin-version-check": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-5.0.0.tgz", - "integrity": "sha512-Q3FMQnS5eZmrBGqmDXLs4dbAn/f+52voP6ykJYmweSA60t6DyH4UTSwZhtbK5UH+LBoWvDljILUQMLRUtsynsA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-5.1.0.tgz", + "integrity": "sha512-bYsvMqJ8yNGILLz1KP9zKLzQ6YpljV3ln1gqhuLkUtyfGi3qXKGuK2p+U4NAvjVFzDFiBBtOpCOSFNuYYEGZ5g==", "dev": true, "dependencies": { "bin-version": "^6.0.0", - "semver": "^7.3.5", - "semver-truncate": "^2.0.0" + "semver": "^7.5.3", + "semver-truncate": "^3.0.0" }, "engines": { "node": ">=12" @@ -1006,6 +1025,15 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", @@ -1069,12 +1097,18 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1093,9 +1127,13 @@ } }, "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } }, "node_modules/content-disposition": { "version": "0.5.4", @@ -1140,6 +1178,14 @@ "which": "^1.2.9" } }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "engines": { + "node": ">= 12" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -1184,6 +1230,22 @@ "node": ">=10" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -1223,10 +1285,30 @@ "once": "^1.4.0" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/esbuild": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.4.tgz", - "integrity": "sha512-9rxWV/Cb2DMUXfe9aUsYtqg0KTlw146ElFH22kYeK9KVV1qT082X4lpmiKsa12ePiCcIcB686TQJxaGAa9TFvA==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.0.tgz", + "integrity": "sha512-6iwE3Y2RVYCME1jLpBqq7LQWK3MW6vjV2bZy6gt/WrqkY+WE74Spyc0ThAOYpMtITvnjX09CrC6ym7A/m9mebA==", + "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -1235,28 +1317,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.18.4", - "@esbuild/android-arm64": "0.18.4", - "@esbuild/android-x64": "0.18.4", - "@esbuild/darwin-arm64": "0.18.4", - "@esbuild/darwin-x64": "0.18.4", - "@esbuild/freebsd-arm64": "0.18.4", - "@esbuild/freebsd-x64": "0.18.4", - "@esbuild/linux-arm": "0.18.4", - "@esbuild/linux-arm64": "0.18.4", - "@esbuild/linux-ia32": "0.18.4", - "@esbuild/linux-loong64": "0.18.4", - "@esbuild/linux-mips64el": "0.18.4", - "@esbuild/linux-ppc64": "0.18.4", - "@esbuild/linux-riscv64": "0.18.4", - "@esbuild/linux-s390x": "0.18.4", - "@esbuild/linux-x64": "0.18.4", - "@esbuild/netbsd-x64": "0.18.4", - "@esbuild/openbsd-x64": "0.18.4", - "@esbuild/sunos-x64": "0.18.4", - "@esbuild/win32-arm64": "0.18.4", - "@esbuild/win32-ia32": "0.18.4", - "@esbuild/win32-x64": "0.18.4" + "@esbuild/aix-ppc64": "0.20.0", + "@esbuild/android-arm": "0.20.0", + "@esbuild/android-arm64": "0.20.0", + "@esbuild/android-x64": "0.20.0", + "@esbuild/darwin-arm64": "0.20.0", + "@esbuild/darwin-x64": "0.20.0", + "@esbuild/freebsd-arm64": "0.20.0", + "@esbuild/freebsd-x64": "0.20.0", + "@esbuild/linux-arm": "0.20.0", + "@esbuild/linux-arm64": "0.20.0", + "@esbuild/linux-ia32": "0.20.0", + "@esbuild/linux-loong64": "0.20.0", + "@esbuild/linux-mips64el": "0.20.0", + "@esbuild/linux-ppc64": "0.20.0", + "@esbuild/linux-riscv64": "0.20.0", + "@esbuild/linux-s390x": "0.20.0", + "@esbuild/linux-x64": "0.20.0", + "@esbuild/netbsd-x64": "0.20.0", + "@esbuild/openbsd-x64": "0.20.0", + "@esbuild/sunos-x64": "0.20.0", + "@esbuild/win32-arm64": "0.20.0", + "@esbuild/win32-ia32": "0.20.0", + "@esbuild/win32-x64": "0.20.0" } }, "node_modules/esbuild-plugin-resolve": { @@ -1386,9 +1469,9 @@ } }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -1402,14 +1485,36 @@ } }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/file-type": { "version": "17.1.6", "resolved": "https://registry.npmjs.org/file-type/-/file-type-17.1.6.tgz", @@ -1437,6 +1542,11 @@ "express": "^4.14.0" } }, + "node_modules/filebrowser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, "node_modules/filename-reserved-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz", @@ -1510,6 +1620,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -1526,34 +1647,27 @@ "node": ">= 0.6" } }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1580,6 +1694,17 @@ "node": ">= 6" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/got": { "version": "11.8.6", "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", @@ -1605,15 +1730,15 @@ "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "function-bind": "^1.1.1" + "es-define-property": "^1.0.0" }, - "engines": { - "node": ">= 0.4.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { @@ -1638,6 +1763,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -1788,6 +1924,25 @@ "whatwg-fetch": "^3.4.1" } }, + "node_modules/isomorphic-fetch/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -1795,9 +1950,9 @@ "dev": true }, "node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "dependencies": { "json-buffer": "3.0.1" @@ -1919,6 +2074,21 @@ "node": ">=4" } }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -1932,23 +2102,39 @@ "node": ">= 0.6" } }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "dependencies": { - "whatwg-url": "^5.0.0" + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, "node_modules/normalize-url": { @@ -1976,9 +2162,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2105,15 +2291,15 @@ } }, "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -2273,22 +2459,6 @@ "node": ">=0.10.0" } }, - "node_modules/rollup": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.25.1.tgz", - "integrity": "sha512-tywOR+rwIt5m2ZAWSe5AIJcTat8vGlnPFAv15ycCrw33t6iFsXZ6mzHVFh2psSjxQPmI+xgzMZZizUAukBI4aQ==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -2337,9 +2507,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -2364,24 +2534,18 @@ } }, "node_modules/semver-truncate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-2.0.0.tgz", - "integrity": "sha512-Rh266MLDYNeML5h90ttdMwfXe1+Nc4LAWd9X1KdJe8pPHP4kFmvLZALtsMNHNdvTyQygbEC0D59sIz47DIaq8w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-3.0.0.tgz", + "integrity": "sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "semver": "^7.3.5" }, "engines": { - "node": ">=8" - } - }, - "node_modules/semver-truncate/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/semver/node_modules/lru-cache": { @@ -2444,7 +2608,23 @@ "node": ">= 0.8.0" } }, - "node_modules/setprototypeof": { + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" @@ -2471,13 +2651,17 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", + "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2655,9 +2839,9 @@ "integrity": "sha512-kXrY75F0s0WD15N2bWKDScKlKgwnusN6dTRzGs1N7LlxQRnazrsBISC1HL4sy2adsyk65Zbx3Ui3IGN8leAFOQ==" }, "node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/type-is": { "version": "1.6.18", @@ -2672,9 +2856,10 @@ } }, "node_modules/typescript": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", - "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -2683,6 +2868,12 @@ "node": ">=14.17" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -2713,15 +2904,23 @@ "node": ">= 0.8" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz", + "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==", + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" }, "node_modules/whatwg-url": { "version": "5.0.0", @@ -2757,26 +2956,1942 @@ "dev": true }, "node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", "engines": { "node": ">= 14" } + } + }, + "dependencies": { + "@esbuild/aix-ppc64": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.0.tgz", + "integrity": "sha512-fGFDEctNh0CcSwsiRPxiaqX0P5rq+AqE0SRhYGZ4PX46Lg1FNR6oCxJghf8YgY0WQEgQuh3lErUFE4KxLeRmmw==", + "dev": true, + "optional": true }, - "service": { - "extraneous": true, - "dependencies": { - "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc7", - "filebrowser": "git+https://github.com/start9labs/filebrowser-wrapper.git#32e05d3d2157038b099329c11453b00d29ccca78", - "ts-matches": "^5.4.1" + "@esbuild/android-arm": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.0.tgz", + "integrity": "sha512-3bMAfInvByLHfJwYPJRlpTeaQA75n8C/QKpEaiS4HrFWFiJlNI0vzq/zCjBrhAYcPyVPG7Eo9dMrcQXuqmNk5g==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.0.tgz", + "integrity": "sha512-aVpnM4lURNkp0D3qPoAzSG92VXStYmoVPOgXveAUoQBWRSuQzt51yvSju29J6AHPmwY1BjH49uR29oyfH1ra8Q==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.0.tgz", + "integrity": "sha512-uK7wAnlRvjkCPzh8jJ+QejFyrP8ObKuR5cBIsQZ+qbMunwR8sbd8krmMbxTLSrDhiPZaJYKQAU5Y3iMDcZPhyQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.0.tgz", + "integrity": "sha512-AjEcivGAlPs3UAcJedMa9qYg9eSfU6FnGHJjT8s346HSKkrcWlYezGE8VaO2xKfvvlZkgAhyvl06OJOxiMgOYQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.0.tgz", + "integrity": "sha512-bsgTPoyYDnPv8ER0HqnJggXK6RyFy4PH4rtsId0V7Efa90u2+EifxytE9pZnsDgExgkARy24WUQGv9irVbTvIw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.0.tgz", + "integrity": "sha512-kQ7jYdlKS335mpGbMW5tEe3IrQFIok9r84EM3PXB8qBFJPSc6dpWfrtsC/y1pyrz82xfUIn5ZrnSHQQsd6jebQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.0.tgz", + "integrity": "sha512-uG8B0WSepMRsBNVXAQcHf9+Ko/Tr+XqmK7Ptel9HVmnykupXdS4J7ovSQUIi0tQGIndhbqWLaIL/qO/cWhXKyQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.0.tgz", + "integrity": "sha512-2ezuhdiZw8vuHf1HKSf4TIk80naTbP9At7sOqZmdVwvvMyuoDiZB49YZKLsLOfKIr77+I40dWpHVeY5JHpIEIg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.0.tgz", + "integrity": "sha512-uTtyYAP5veqi2z9b6Gr0NUoNv9F/rOzI8tOD5jKcCvRUn7T60Bb+42NDBCWNhMjkQzI0qqwXkQGo1SY41G52nw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.0.tgz", + "integrity": "sha512-c88wwtfs8tTffPaoJ+SQn3y+lKtgTzyjkD8NgsyCtCmtoIC8RDL7PrJU05an/e9VuAke6eJqGkoMhJK1RY6z4w==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.0.tgz", + "integrity": "sha512-lR2rr/128/6svngnVta6JN4gxSXle/yZEZL3o4XZ6esOqhyR4wsKyfu6qXAL04S4S5CgGfG+GYZnjFd4YiG3Aw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.0.tgz", + "integrity": "sha512-9Sycc+1uUsDnJCelDf6ZNqgZQoK1mJvFtqf2MUz4ujTxGhvCWw+4chYfDLPepMEvVL9PDwn6HrXad5yOrNzIsQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.0.tgz", + "integrity": "sha512-CoWSaaAXOZd+CjbUTdXIJE/t7Oz+4g90A3VBCHLbfuc5yUQU/nFDLOzQsN0cdxgXd97lYW/psIIBdjzQIwTBGw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.0.tgz", + "integrity": "sha512-mlb1hg/eYRJUpv8h/x+4ShgoNLL8wgZ64SUr26KwglTYnwAWjkhR2GpoKftDbPOCnodA9t4Y/b68H4J9XmmPzA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.0.tgz", + "integrity": "sha512-fgf9ubb53xSnOBqyvWEY6ukBNRl1mVX1srPNu06B6mNsNK20JfH6xV6jECzrQ69/VMiTLvHMicQR/PgTOgqJUQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.0.tgz", + "integrity": "sha512-H9Eu6MGse++204XZcYsse1yFHmRXEWgadk2N58O/xd50P9EvFMLJTQLg+lB4E1cF2xhLZU5luSWtGTb0l9UeSg==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.0.tgz", + "integrity": "sha512-lCT675rTN1v8Fo+RGrE5KjSnfY0x9Og4RN7t7lVrN3vMSjy34/+3na0q7RIfWDAj0e0rCh0OL+P88lu3Rt21MQ==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.0.tgz", + "integrity": "sha512-HKoUGXz/TOVXKQ+67NhxyHv+aDSZf44QpWLa3I1lLvAwGq8x1k0T+e2HHSRvxWhfJrFxaaqre1+YyzQ99KixoA==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.0.tgz", + "integrity": "sha512-GDwAqgHQm1mVoPppGsoq4WJwT3vhnz/2N62CzhvApFD1eJyTroob30FPpOZabN+FgCjhG+AgcZyOPIkR8dfD7g==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.0.tgz", + "integrity": "sha512-0vYsP8aC4TvMlOQYozoksiaxjlvUcQrac+muDqj1Fxy6jh9l9CZJzj7zmh8JGfiV49cYLTorFLxg7593pGldwQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.0.tgz", + "integrity": "sha512-p98u4rIgfh4gdpV00IqknBD5pC84LCub+4a3MO+zjqvU5MVXOc3hqR2UgT2jI2nh3h8s9EQxmOsVI3tyzv1iFg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.0.tgz", + "integrity": "sha512-NgJnesu1RtWihtTtXGFMU5YSE6JyyHPMxCwBZK7a6/8d31GuSo9l0Ss7w1Jw5QnKUawG6UEehs883kcXf5fYwg==", + "dev": true, + "optional": true + }, + "@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" + }, + "@mole-inc/bin-wrapper": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@mole-inc/bin-wrapper/-/bin-wrapper-8.0.1.tgz", + "integrity": "sha512-sTGoeZnjI8N4KS+sW2AN95gDBErhAguvkw/tWdCjeM8bvxpz5lqrnd0vOJABA1A+Ic3zED7PYoLP/RANLgVotA==", + "dev": true, + "requires": { + "bin-check": "^4.1.0", + "bin-version-check": "^5.0.0", + "content-disposition": "^0.5.4", + "ext-name": "^5.0.0", + "file-type": "^17.1.6", + "filenamify": "^5.0.2", + "got": "^11.8.5", + "os-filter-obj": "^2.0.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true + }, + "@start9labs/start-sdk": { + "version": "file:../sdk/dist", + "requires": { + "@iarna/toml": "^2.2.5", + "@types/jest": "^29.4.0", + "isomorphic-fetch": "^3.0.0", + "jest": "^29.4.3", + "ts-jest": "^29.0.5", + "ts-matches": "^5.4.1", + "ts-node": "^10.9.1", + "tsx": "^4.7.1", + "typescript": "^5.0.4", + "yaml": "^2.2.2" + } + }, + "@swc/cli": { + "version": "0.1.65", + "resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.1.65.tgz", + "integrity": "sha512-4NcgsvJVHhA7trDnMmkGLLvWMHu2kSy+qHx6QwRhhJhdiYdNUrhdp+ERxen73sYtaeEOYeLJcWrQ60nzKi6rpg==", + "dev": true, + "requires": { + "@mole-inc/bin-wrapper": "^8.0.1", + "commander": "^7.1.0", + "fast-glob": "^3.2.5", + "minimatch": "^9.0.3", + "semver": "^7.3.8", + "slash": "3.0.0", + "source-map": "^0.7.3" + } + }, + "@swc/core": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.1.tgz", + "integrity": "sha512-3y+Y8js+e7BbM16iND+6Rcs3jdiL28q3iVtYsCviYSSpP2uUVKkp5sJnCY4pg8AaVvyN7CGQHO7gLEZQ5ByozQ==", + "dev": true, + "requires": { + "@swc/core-darwin-arm64": "1.4.1", + "@swc/core-darwin-x64": "1.4.1", + "@swc/core-linux-arm-gnueabihf": "1.4.1", + "@swc/core-linux-arm64-gnu": "1.4.1", + "@swc/core-linux-arm64-musl": "1.4.1", + "@swc/core-linux-x64-gnu": "1.4.1", + "@swc/core-linux-x64-musl": "1.4.1", + "@swc/core-win32-arm64-msvc": "1.4.1", + "@swc/core-win32-ia32-msvc": "1.4.1", + "@swc/core-win32-x64-msvc": "1.4.1", + "@swc/counter": "^0.1.2", + "@swc/types": "^0.1.5" + } + }, + "@swc/core-darwin-arm64": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.1.tgz", + "integrity": "sha512-ePyfx0348UbR4DOAW24TedeJbafnzha8liXFGuQ4bdXtEVXhLfPngprrxKrAddCuv42F9aTxydlF6+adD3FBhA==", + "dev": true, + "optional": true + }, + "@swc/core-darwin-x64": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.1.tgz", + "integrity": "sha512-eLf4JSe6VkCMdDowjM8XNC5rO+BrgfbluEzAVtKR8L2HacNYukieumN7EzpYCi0uF1BYwu1ku6tLyG2r0VcGxA==", + "dev": true, + "optional": true + }, + "@swc/core-linux-arm-gnueabihf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.1.tgz", + "integrity": "sha512-K8VtTLWMw+rkN/jDC9o/Q9SMmzdiHwYo2CfgkwVT29NsGccwmNhCQx6XoYiPKyKGIFKt4tdQnJHKUFzxUqQVtQ==", + "dev": true, + "optional": true + }, + "@swc/core-linux-arm64-gnu": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.1.tgz", + "integrity": "sha512-0e8p4g0Bfkt8lkiWgcdiENH3RzkcqKtpRXIVNGOmVc0OBkvc2tpm2WTx/eoCnes2HpTT4CTtR3Zljj4knQ4Fvw==", + "dev": true, + "optional": true + }, + "@swc/core-linux-arm64-musl": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.1.tgz", + "integrity": "sha512-b/vWGQo2n7lZVUnSQ7NBq3Qrj85GrAPPiRbpqaIGwOytiFSk8VULFihbEUwDe0rXgY4LDm8z8wkgADZcLnmdUA==", + "dev": true, + "optional": true + }, + "@swc/core-linux-x64-gnu": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.1.tgz", + "integrity": "sha512-AFMQlvkKEdNi1Vk2GFTxxJzbICttBsOQaXa98kFTeWTnFFIyiIj2w7Sk8XRTEJ/AjF8ia8JPKb1zddBWr9+bEQ==", + "dev": true, + "optional": true + }, + "@swc/core-linux-x64-musl": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.1.tgz", + "integrity": "sha512-QX2MxIECX1gfvUVZY+jk528/oFkS9MAl76e3ZRvG2KC/aKlCQL0KSzcTSm13mOxkDKS30EaGRDRQWNukGpMeRg==", + "dev": true, + "optional": true + }, + "@swc/core-win32-arm64-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.1.tgz", + "integrity": "sha512-OklkJYXXI/tntD2zaY8i3iZldpyDw5q+NAP3k9OlQ7wXXf37djRsHLV0NW4+ZNHBjE9xp2RsXJ0jlOJhfgGoFA==", + "dev": true, + "optional": true + }, + "@swc/core-win32-ia32-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.1.tgz", + "integrity": "sha512-MBuc3/QfKX9FnLOU7iGN+6yHRTQaPQ9WskiC8s8JFiKQ+7I2p25tay2RplR9dIEEGgVAu6L7auv96LbNTh+FaA==", + "dev": true, + "optional": true + }, + "@swc/core-win32-x64-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.1.tgz", + "integrity": "sha512-lu4h4wFBb/bOK6N2MuZwg7TrEpwYXgpQf5R7ObNSXL65BwZ9BG8XRzD+dLJmALu8l5N08rP/TrpoKRoGT4WSxw==", + "dev": true, + "optional": true + }, + "@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true + }, + "@swc/types": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", + "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "requires": { + "defer-to-connect": "^2.0.0" + } + }, + "@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "dev": true + }, + "@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true + }, + "@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "20.11.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.17.tgz", + "integrity": "sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } + }, + "@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "bin-check": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", + "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "executable": "^4.1.0" + } + }, + "bin-version": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-6.0.0.tgz", + "integrity": "sha512-nk5wEsP4RiKjG+vF+uG8lFsEn4d7Y6FVDamzzftSunXOoOcOOkzcWdKVlGgFFwlUQCj63SgnUkLLGF8v7lufhw==", + "dev": true, + "requires": { + "execa": "^5.0.0", + "find-versions": "^5.0.0" }, - "devDependencies": { - "@types/node": "^20.0.0", - "@vercel/ncc": "^0.36.1", - "prettier": "^2.8.4", - "typescript": "^5.1.3" + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "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" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } + }, + "bin-version-check": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-5.1.0.tgz", + "integrity": "sha512-bYsvMqJ8yNGILLz1KP9zKLzQ6YpljV3ln1gqhuLkUtyfGi3qXKGuK2p+U4NAvjVFzDFiBBtOpCOSFNuYYEGZ5g==", + "dev": true, + "requires": { + "bin-version": "^6.0.0", + "semver": "^7.5.3", + "semver-truncate": "^3.0.0" + } + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true + }, + "cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + } + }, + "clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + }, + "dependencies": { + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + } + } + }, + "defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true + }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, + "esbuild": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.0.tgz", + "integrity": "sha512-6iwE3Y2RVYCME1jLpBqq7LQWK3MW6vjV2bZy6gt/WrqkY+WE74Spyc0ThAOYpMtITvnjX09CrC6ym7A/m9mebA==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.20.0", + "@esbuild/android-arm": "0.20.0", + "@esbuild/android-arm64": "0.20.0", + "@esbuild/android-x64": "0.20.0", + "@esbuild/darwin-arm64": "0.20.0", + "@esbuild/darwin-x64": "0.20.0", + "@esbuild/freebsd-arm64": "0.20.0", + "@esbuild/freebsd-x64": "0.20.0", + "@esbuild/linux-arm": "0.20.0", + "@esbuild/linux-arm64": "0.20.0", + "@esbuild/linux-ia32": "0.20.0", + "@esbuild/linux-loong64": "0.20.0", + "@esbuild/linux-mips64el": "0.20.0", + "@esbuild/linux-ppc64": "0.20.0", + "@esbuild/linux-riscv64": "0.20.0", + "@esbuild/linux-s390x": "0.20.0", + "@esbuild/linux-x64": "0.20.0", + "@esbuild/netbsd-x64": "0.20.0", + "@esbuild/openbsd-x64": "0.20.0", + "@esbuild/sunos-x64": "0.20.0", + "@esbuild/win32-arm64": "0.20.0", + "@esbuild/win32-ia32": "0.20.0", + "@esbuild/win32-x64": "0.20.0" + } + }, + "esbuild-plugin-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esbuild-plugin-resolve/-/esbuild-plugin-resolve-2.0.0.tgz", + "integrity": "sha512-eJy9B8yDW5X/J48eWtR1uVmv+DKfHvYYnrrcqQoe/nUkVHVOTZlJnSevkYyGOz6hI90t036Y5QIPDrGzmppxfg==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" + } + }, + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "requires": { + "pify": "^2.2.0" + } + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dev": true, + "requires": { + "mime-db": "^1.28.0" + } + }, + "ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "dev": true, + "requires": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + } + }, + "fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "requires": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + } + }, + "file-type": { + "version": "17.1.6", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-17.1.6.tgz", + "integrity": "sha512-hlDw5Ev+9e883s0pwUsuuYNu4tD7GgpUnOvykjv1Gya0ZIjuKumthDRua90VUn6/nlRKAjcxLUnHNTIUWwWIiw==", + "dev": true, + "requires": { + "readable-web-to-node-stream": "^3.0.2", + "strtok3": "^7.0.0-alpha.9", + "token-types": "^5.0.0-alpha.2" + } + }, + "filebrowser": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/filebrowser/-/filebrowser-1.0.0.tgz", + "integrity": "sha512-RRONYpCDzbmWPhBX43T4dE+ptqLznJ7lKfbMaZLChB2i2ZIdFXoqT9qZTi70Dpq6fnJHuvcdeiRqMIPZKhVgTQ==", + "requires": { + "commander": "^2.9.0", + "content-disposition": "^0.5.1", + "express": "^4.14.0" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + } + } + }, + "filename-reserved-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz", + "integrity": "sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==", + "dev": true + }, + "filenamify": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-5.1.1.tgz", + "integrity": "sha512-M45CbrJLGACfrPOkrTp3j2EcO9OBkKUYME0eiqOCa7i2poaklU0jhlIaMlr8ijLorT0uLAzrn3qXOp5684CkfA==", + "dev": true, + "requires": { + "filename-reserved-regex": "^3.0.0", + "strip-outer": "^2.0.0", + "trim-repeated": "^2.0.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "find-versions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz", + "integrity": "sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==", + "dev": true, + "requires": { + "semver-regex": "^4.0.5" + } + }, + "formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "requires": { + "fetch-blob": "^3.1.2" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "requires": { + "@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" + } + }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isomorphic-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", + "requires": { + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" + }, + "dependencies": { + "node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "requires": { + "whatwg-url": "^5.0.0" + } + } + } + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" + }, + "node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "requires": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + } + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "os-filter-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz", + "integrity": "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==", + "dev": true, + "requires": { + "arch": "^2.1.0" + } + }, + "p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "peek-readable": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", + "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dev": true, + "requires": { + "readable-stream": "^3.6.0" + } + }, + "resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "requires": { + "lowercase-keys": "^2.0.0" + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "semver-regex": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", + "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", + "dev": true + }, + "semver-truncate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-3.0.0.tgz", + "integrity": "sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "requires": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "side-channel": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", + "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==", + "dev": true, + "requires": { + "sort-keys": "^1.0.0" + } + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-outer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-2.0.0.tgz", + "integrity": "sha512-A21Xsm1XzUkK0qK1ZrytDUvqsQWict2Cykhvi0fBQntGG5JSprESasEyV1EZ/4CiR5WB5KjzLTrP/bO37B0wPg==", + "dev": true + }, + "strtok3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", + "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", + "dev": true, + "requires": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "token-types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", + "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "dev": true, + "requires": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "trim-repeated": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-2.0.0.tgz", + "integrity": "sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg==", + "dev": true, + "requires": { + "escape-string-regexp": "^5.0.0" + } + }, + "ts-matches": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ts-matches/-/ts-matches-5.4.1.tgz", + "integrity": "sha512-kXrY75F0s0WD15N2bWKDScKlKgwnusN6dTRzGs1N7LlxQRnazrsBISC1HL4sy2adsyk65Zbx3Ui3IGN8leAFOQ==" + }, + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true + }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "web-streams-polyfill": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz", + "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, + "yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==" } } } diff --git a/container-runtime/package.json b/container-runtime/package.json index 73f7c9cde..2fa407408 100644 --- a/container-runtime/package.json +++ b/container-runtime/package.json @@ -2,10 +2,11 @@ "name": "start-init", "version": "0.0.0", "description": "We want to be the sdk intermitent for the system", + "module": "./index.js", "scripts": { - "bundle:esbuild": "esbuild initSrc/index.ts --platform=node --bundle --outfile=startInit.js", - "bundle:service": "esbuild /service/startos/procedures/index.ts --platform=node --bundle --outfile=service.js", - "run:manifest": "esbuild /service/startos/procedures/index.ts --platform=node --bundle --outfile=service.js" + "check": "tsc --noEmit", + "build": "prettier --write '**/*.ts' && rm -rf dist && tsc", + "tsc": "rm -rf dist; tsc" }, "author": "", "prettier": { @@ -16,11 +17,11 @@ }, "dependencies": { "@iarna/toml": "^2.2.5", - "@start9labs/start-sdk": "=0.4.0-rev0.lib0.rc8.alpha3", - "esbuild": "0.18.4", + "@start9labs/start-sdk": "file:../sdk/dist", "esbuild-plugin-resolve": "^2.0.0", "filebrowser": "^1.0.0", "isomorphic-fetch": "^3.0.0", + "node-fetch": "^3.1.0", "ts-matches": "^5.4.1", "tslib": "^2.5.3", "typescript": "^5.1.3", @@ -29,8 +30,8 @@ "devDependencies": { "@swc/cli": "^0.1.62", "@swc/core": "^1.3.65", - "@types/node": "^20.2.5", - "prettier": "^2.8.8", - "rollup": "^3.25.1" + "@types/node": "^20.11.13", + "prettier": "^3.2.5", + "typescript": ">5.2" } } diff --git a/container-runtime/rmcontainer.sh b/container-runtime/rmcontainer.sh new file mode 100644 index 000000000..69912eeba --- /dev/null +++ b/container-runtime/rmcontainer.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +set -e + +rootfs=$1 +if [ -z "$rootfs" ]; then + >&2 echo "usage: $0 " + exit 1 +fi + +umount --recursive $rootfs +rm -rf $rootfs/.. \ No newline at end of file diff --git a/container-runtime/src/Adapters/HostSystemStartOs.ts b/container-runtime/src/Adapters/HostSystemStartOs.ts new file mode 100644 index 000000000..b9dc7725a --- /dev/null +++ b/container-runtime/src/Adapters/HostSystemStartOs.ts @@ -0,0 +1,320 @@ +import { types as T } from "@start9labs/start-sdk" +import * as net from "net" +import { object, string, number, literals, some, unknown } from "ts-matches" +import { Effects } from "../Models/Effects" + +import { CallbackHolder } from "../Models/CallbackHolder" +const matchRpcError = object({ + error: object( + { + code: number, + message: string, + data: some( + string, + object( + { + details: string, + debug: string, + }, + ["debug"], + ), + ), + }, + ["data"], + ), +}) +const testRpcError = matchRpcError.test +const testRpcResult = object({ + result: unknown, +}).test +type RpcError = typeof matchRpcError._TYPE + +const SOCKET_PATH = "/media/startos/rpc/host.sock" +const MAIN = "/main" as const +export class HostSystemStartOs implements Effects { + static of(callbackHolder: CallbackHolder) { + return new HostSystemStartOs(callbackHolder) + } + + constructor(readonly callbackHolder: CallbackHolder) {} + id = 0 + rpcRound(method: string, params: unknown) { + const id = this.id++ + const client = net.createConnection({ path: SOCKET_PATH }, () => { + client.write( + JSON.stringify({ + id, + method, + params, + }) + "\n", + ) + }) + let bufs: Buffer[] = [] + return new Promise((resolve, reject) => { + client.on("data", (data) => { + try { + bufs.push(data) + if (data.reduce((acc, x) => acc || x == 10, false)) { + const res: unknown = JSON.parse( + Buffer.concat(bufs).toString().split("\n")[0], + ) + if (testRpcError(res)) { + let message = res.error.message + console.error({ method, params, hostSystemStartOs: true }) + if (string.test(res.error.data)) { + message += ": " + res.error.data + console.error(res.error.data) + } else { + if (res.error.data?.details) { + message += ": " + res.error.data.details + console.error(res.error.data.details) + } + if (res.error.data?.debug) { + message += "\n" + res.error.data.debug + console.error("Debug: " + res.error.data.debug) + } + } + reject(new Error(message)) + } else if (testRpcResult(res)) { + resolve(res.result) + } else { + reject(new Error(`malformed response ${JSON.stringify(res)}`)) + } + } + } catch (error) { + reject(error) + } + client.end() + }) + client.on("error", (error) => { + reject(error) + }) + }) + } + started = + // @ts-ignore + this.method !== MAIN + ? null + : () => { + return this.rpcRound("started", null) + } + bind(...[options]: Parameters) { + return this.rpcRound("bind", options) as ReturnType + } + clearBindings(...[]: Parameters) { + return this.rpcRound("clearBindings", null) as ReturnType< + T.Effects["clearBindings"] + > + } + clearNetworkInterfaces( + ...[]: Parameters + ) { + return this.rpcRound("clearNetworkInterfaces", null) as ReturnType< + T.Effects["clearNetworkInterfaces"] + > + } + createOverlayedImage(options: { imageId: string }): Promise { + return this.rpcRound("createOverlayedImage", options) as ReturnType< + T.Effects["createOverlayedImage"] + > + } + executeAction(...[options]: Parameters) { + return this.rpcRound("executeAction", options) as ReturnType< + T.Effects["executeAction"] + > + } + exists(...[packageId]: Parameters) { + return this.rpcRound("exists", packageId) as ReturnType + } + exportAction(...[options]: Parameters) { + return this.rpcRound("exportAction", options) as ReturnType< + T.Effects["exportAction"] + > + } + exportNetworkInterface( + ...[options]: Parameters + ) { + return this.rpcRound("exportNetworkInterface", options) as ReturnType< + T.Effects["exportNetworkInterface"] + > + } + exposeForDependents(...[options]: any) { + return this.rpcRound("exposeForDependents", null) as ReturnType< + T.Effects["exposeForDependents"] + > + } + exposeUi(...[options]: Parameters) { + return this.rpcRound("exposeUi", options) as ReturnType< + T.Effects["exposeUi"] + > + } + getConfigured(...[]: Parameters) { + return this.rpcRound("getConfigured", null) as ReturnType< + T.Effects["getConfigured"] + > + } + getContainerIp(...[]: Parameters) { + return this.rpcRound("getContainerIp", null) as ReturnType< + T.Effects["getContainerIp"] + > + } + getHostnames: any = (...[allOptions]: any[]) => { + const options = { + ...allOptions, + callback: this.callbackHolder.addCallback(allOptions.callback), + } + return this.rpcRound("getHostnames", options) as ReturnType< + T.Effects["getHostnames"] + > + } + getInterface(...[options]: Parameters) { + return this.rpcRound("getInterface", { + ...options, + callback: this.callbackHolder.addCallback(options.callback), + }) as ReturnType + } + getIPHostname(...[]: Parameters) { + return this.rpcRound("getIPHostname", null) as ReturnType< + T.Effects["getIPHostname"] + > + } + getLocalHostname(...[]: Parameters) { + return this.rpcRound("getLocalHostname", null) as ReturnType< + T.Effects["getLocalHostname"] + > + } + getPrimaryUrl(...[options]: Parameters) { + return this.rpcRound("getPrimaryUrl", { + ...options, + callback: this.callbackHolder.addCallback(options.callback), + }) as ReturnType + } + getServicePortForward( + ...[options]: Parameters + ) { + return this.rpcRound("getServicePortForward", options) as ReturnType< + T.Effects["getServicePortForward"] + > + } + getServiceTorHostname( + ...[interfaceId, packageId]: Parameters + ) { + return this.rpcRound("getServiceTorHostname", { + interfaceId, + packageId, + }) as ReturnType + } + getSslCertificate( + ...[packageId, algorithm]: Parameters + ) { + return this.rpcRound("getSslCertificate", { + packageId, + algorithm, + }) as ReturnType + } + getSslKey(...[packageId, algorithm]: Parameters) { + return this.rpcRound("getSslKey", { packageId, algorithm }) as ReturnType< + T.Effects["getSslKey"] + > + } + getSystemSmtp(...[options]: Parameters) { + return this.rpcRound("getSystemSmtp", { + ...options, + callback: this.callbackHolder.addCallback(options.callback), + }) as ReturnType + } + listInterface(...[options]: Parameters) { + return this.rpcRound("listInterface", { + ...options, + callback: this.callbackHolder.addCallback(options.callback), + }) as ReturnType + } + mount(...[options]: Parameters) { + return this.rpcRound("mount", options) as ReturnType + } + removeAction(...[options]: Parameters) { + return this.rpcRound("removeAction", options) as ReturnType< + T.Effects["removeAction"] + > + } + removeAddress(...[options]: Parameters) { + return this.rpcRound("removeAddress", options) as ReturnType< + T.Effects["removeAddress"] + > + } + restart(...[]: Parameters) { + return this.rpcRound("restart", null) + } + reverseProxy(...[options]: Parameters) { + return this.rpcRound("reverseProxy", options) as ReturnType< + T.Effects["reverseProxy"] + > + } + running(...[packageId]: Parameters) { + return this.rpcRound("running", { packageId }) as ReturnType< + T.Effects["running"] + > + } + // runRsync(...[options]: Parameters) { + // + // return this.rpcRound('executeAction', options) as ReturnType + // + // return this.rpcRound('executeAction', options) as ReturnType + // } + setConfigured(...[configured]: Parameters) { + return this.rpcRound("setConfigured", { configured }) as ReturnType< + T.Effects["setConfigured"] + > + } + setDependencies( + ...[dependencies]: Parameters + ): ReturnType { + return this.rpcRound("setDependencies", { dependencies }) as ReturnType< + T.Effects["setDependencies"] + > + } + setHealth(...[options]: Parameters) { + return this.rpcRound("setHealth", options) as ReturnType< + T.Effects["setHealth"] + > + } + + setMainStatus(o: { status: "running" | "stopped" }): Promise { + return this.rpcRound("setMainStatus", o) as ReturnType< + T.Effects["setHealth"] + > + } + + shutdown(...[]: Parameters) { + return this.rpcRound("shutdown", null) + } + stopped(...[packageId]: Parameters) { + return this.rpcRound("stopped", { packageId }) as ReturnType< + T.Effects["stopped"] + > + } + store: T.Effects["store"] = { + get: async (options: any) => + this.rpcRound("getStore", { + ...options, + callback: this.callbackHolder.addCallback(options.callback), + }) as any, + set: async (options: any) => + this.rpcRound("setStore", options) as ReturnType< + T.Effects["store"]["set"] + >, + } + + /** + * So, this is created + * @param options + * @returns + */ + embassyGetInterface(options: { + target: "tor-key" | "tor-address" | "lan-address" + packageId: string + interface: string + }) { + return this.rpcRound("embassyGetInterface", options) as Promise + } +} diff --git a/container-runtime/src/Adapters/RpcListener.ts b/container-runtime/src/Adapters/RpcListener.ts new file mode 100644 index 000000000..c9cbe9fef --- /dev/null +++ b/container-runtime/src/Adapters/RpcListener.ts @@ -0,0 +1,303 @@ +// @ts-check + +import * as net from "net" +import { + object, + some, + string, + literal, + array, + number, + matches, + any, + shape, +} from "ts-matches" + +import { types as T } from "@start9labs/start-sdk" +import * as CP from "child_process" +import * as Mod from "module" +import * as fs from "fs" + +import { CallbackHolder } from "../Models/CallbackHolder" +import { AllGetDependencies } from "../Interfaces/AllGetDependencies" +import { HostSystem } from "../Interfaces/HostSystem" +import { jsonPath } from "../Models/JsonPath" +import { System } from "../Interfaces/System" +type MaybePromise = T | Promise +type SocketResponse = { jsonrpc: "2.0"; id: IdType } & ( + | { result: unknown } + | { + error: { + code: number + message: string + data: { details: string; debug?: string } + } + } +) +const SOCKET_PARENT = "/media/startos/rpc" +const SOCKET_PATH = "/media/startos/rpc/service.sock" +const jsonrpc = "2.0" as const + +const idType = some(string, number, literal(null)) +type IdType = null | string | number +const runType = object({ + id: idType, + method: literal("execute"), + params: object( + { + procedure: string, + input: any, + timeout: number, + }, + ["timeout"], + ), +}) +const sandboxRunType = object({ + id: idType, + method: literal("sandbox"), + params: object( + { + procedure: string, + input: any, + timeout: number, + }, + ["timeout"], + ), +}) +const callbackType = object({ + id: idType, + method: literal("callback"), + params: object({ + callback: string, + args: array, + }), +}) +const initType = object({ + id: idType, + method: literal("init"), +}) +const exitType = object({ + id: idType, + method: literal("exit"), +}) +const evalType = object({ + id: idType, + method: literal("eval"), + params: object({ + script: string, + }), +}) + +const jsonParse = (x: Buffer) => JSON.parse(x.toString()) +function reduceMethod( + methodArgs: object, + effects: HostSystem, +): (previousValue: any, currentValue: string) => any { + return (x: any, method: string) => + Promise.resolve(x) + .then((x) => x[method]) + .then((x) => + typeof x !== "function" + ? x + : x({ + ...methodArgs, + effects, + }), + ) +} + +const hasId = object({ id: idType }).test +export class RpcListener { + unixSocketServer = net.createServer(async (server) => {}) + private _system: System | undefined + private _effects: HostSystem | undefined + + constructor( + readonly getDependencies: AllGetDependencies, + private callbacks = new CallbackHolder(), + ) { + if (!fs.existsSync(SOCKET_PARENT)) { + fs.mkdirSync(SOCKET_PARENT, { recursive: true }) + } + this.unixSocketServer.listen(SOCKET_PATH) + + this.unixSocketServer.on("connection", (s) => { + let id: IdType = null + const captureId = (x: X) => { + if (hasId(x)) id = x.id + return x + } + const logData = + (location: string) => + (x: X) => { + console.log({ + location, + stringified: JSON.stringify(x), + type: typeof x, + id, + }) + return x + } + const mapError = (error: any): SocketResponse => ({ + jsonrpc, + id, + error: { + message: typeof error, + data: { + details: error?.message ?? String(error), + debug: error?.stack, + }, + code: 0, + }, + }) + const writeDataToSocket = (x: SocketResponse) => + new Promise((resolve) => s.write(JSON.stringify(x), resolve)) + s.on("data", (a) => + Promise.resolve(a) + .then(logData("dataIn")) + .then(jsonParse) + .then(captureId) + .then((x) => this.dealWithInput(x)) + .catch(mapError) + .then(logData("response")) + .then(writeDataToSocket) + .finally(() => void s.end()), + ) + }) + } + + private get effects() { + return this.getDependencies.hostSystem()(this.callbacks) + } + + private get system() { + if (!this._system) throw new Error("System not initialized") + return this._system + } + + private dealWithInput(input: unknown): MaybePromise { + return matches(input) + .when(some(runType, sandboxRunType), async ({ id, params }) => { + const system = this.system + const procedure = jsonPath.unsafeCast(params.procedure) + return system + .execute(this.effects, { + procedure, + input: params.input, + timeout: params.timeout, + }) + .then((result) => + "ok" in result + ? { + jsonrpc, + id, + result: result.ok === undefined ? null : result.ok, + } + : { + jsonrpc, + id, + error: { + code: result.err.code, + message: "Package Root Error", + data: { details: result.err.message }, + }, + }, + ) + .catch((error) => ({ + jsonrpc, + id, + error: { + code: 0, + message: typeof error, + data: { details: "" + error, debug: error?.stack }, + }, + })) + }) + .when(callbackType, async ({ id, params: { callback, args } }) => + Promise.resolve(this.callbacks.callCallback(callback, args)) + .then((result) => ({ + jsonrpc, + id, + result, + })) + .catch((error) => ({ + jsonrpc, + id, + + error: { + code: 0, + message: typeof error, + data: { + details: error?.message ?? String(error), + debug: error?.stack, + }, + }, + })), + ) + .when(exitType, async ({ id }) => { + if (this._system) this._system.exit(this.effects) + delete this._system + delete this._effects + + return { + jsonrpc, + id, + result: null, + } + }) + .when(initType, async ({ id }) => { + this._system = await this.getDependencies.system() + + return { + jsonrpc, + id, + result: null, + } + }) + .when(evalType, async ({ id, params }) => { + const result = await new Function( + `return (async () => { return (${params.script}) }).call(this)`, + ).call({ + listener: this, + require: require, + }) + return { + jsonrpc, + id, + result: !["string", "number", "boolean", "null", "object"].includes( + typeof result, + ) + ? null + : result, + } + }) + .when(shape({ id: idType, method: string }), ({ id, method }) => ({ + jsonrpc, + id, + error: { + code: -32601, + message: `Method not found`, + data: { + details: method, + }, + }, + })) + + .defaultToLazy(() => { + console.warn( + `Coudln't parse the following input ${JSON.stringify(input)}`, + ) + return { + jsonrpc, + id: (input as any)?.id, + error: { + code: -32602, + message: "invalid params", + data: { + details: JSON.stringify(input), + }, + }, + } + }) + } +} diff --git a/container-runtime/src/Adapters/Systems/SystemForEmbassy/DockerProcedureContainer.ts b/container-runtime/src/Adapters/Systems/SystemForEmbassy/DockerProcedureContainer.ts new file mode 100644 index 000000000..9cbda69dd --- /dev/null +++ b/container-runtime/src/Adapters/Systems/SystemForEmbassy/DockerProcedureContainer.ts @@ -0,0 +1,76 @@ +import * as fs from "fs/promises" +import * as cp from "child_process" +import { Overlay, types as T } from "@start9labs/start-sdk" +import { promisify } from "util" +import { DockerProcedure, VolumeId } from "../../../Models/DockerProcedure" +import { Volume } from "./matchVolume" +export const exec = promisify(cp.exec) +export const execFile = promisify(cp.execFile) + +export class DockerProcedureContainer { + private constructor(readonly overlay: Overlay) {} + // static async readonlyOf(data: DockerProcedure) { + // return DockerProcedureContainer.of(data, ["-o", "ro"]) + // } + static async of( + effects: T.Effects, + data: DockerProcedure, + volumes: { [id: VolumeId]: Volume }, + ) { + const overlay = await Overlay.of(effects, data.image) + + if (data.mounts) { + const mounts = data.mounts + for (const mount in mounts) { + const path = mounts[mount].startsWith("/") + ? `${overlay.rootfs}${mounts[mount]}` + : `${overlay.rootfs}/${mounts[mount]}` + await fs.mkdir(path, { recursive: true }) + const volumeMount = volumes[mount] + if (volumeMount.type === "data") { + await overlay.mount({ type: "volume", id: mount }, mounts[mount]) + } else if (volumeMount.type === "assets") { + await overlay.mount({ type: "assets", id: mount }, mounts[mount]) + } else if (volumeMount.type === "certificate") { + volumeMount + const certChain = await effects.getSslCertificate() + const key = await effects.getSslKey() + await fs.writeFile( + `${path}/${volumeMount["interface-id"]}.cert.pem`, + certChain.join("\n"), + ) + await fs.writeFile( + `${path}/${volumeMount["interface-id"]}.key.pem`, + key, + ) + } else if (volumeMount.type === "pointer") { + await effects.mount({ + location: path, + target: { + packageId: volumeMount["package-id"], + path: volumeMount.path, + readonly: volumeMount.readonly, + volumeId: volumeMount["volume-id"], + }, + }) + } else if (volumeMount.type === "backup") { + throw new Error("TODO") + } + } + } + + return new DockerProcedureContainer(overlay) + } + + async exec(commands: string[]) { + try { + return await this.overlay.exec(commands) + } finally { + await this.overlay.destroy() + } + } + + async spawn(commands: string[]): Promise { + return await this.overlay.spawn(commands) + } +} diff --git a/container-runtime/src/Adapters/Systems/SystemForEmbassy/MainLoop.ts b/container-runtime/src/Adapters/Systems/SystemForEmbassy/MainLoop.ts new file mode 100644 index 000000000..484e02c24 --- /dev/null +++ b/container-runtime/src/Adapters/Systems/SystemForEmbassy/MainLoop.ts @@ -0,0 +1,150 @@ +import { PolyfillEffects } from "./polyfillEffects" +import { DockerProcedureContainer } from "./DockerProcedureContainer" +import { SystemForEmbassy } from "." +import { HostSystemStartOs } from "../../HostSystemStartOs" +import { util, Daemons, types as T } from "@start9labs/start-sdk" + +const EMBASSY_HEALTH_INTERVAL = 15 * 1000 +const EMBASSY_PROPERTIES_LOOP = 30 * 1000 +/** + * We wanted something to represent what the main loop is doing, and + * in this case it used to run the properties, health, and the docker/ js main. + * Also, this has an ability to clean itself up too if need be. + */ +export class MainLoop { + private healthLoops: + | { + name: string + interval: NodeJS.Timeout + }[] + | undefined + + private mainEvent: + | Promise<{ + daemon: T.DaemonReturned + wait: Promise + }> + | undefined + private propertiesEvent: NodeJS.Timeout | undefined + constructor( + readonly system: SystemForEmbassy, + readonly effects: HostSystemStartOs, + readonly runProperties: () => Promise, + ) { + this.healthLoops = this.constructHealthLoops() + this.mainEvent = this.constructMainEvent() + this.propertiesEvent = this.constructPropertiesEvent() + } + + private async constructMainEvent() { + const { system, effects } = this + const utils = util.createUtils(effects) + const currentCommand: [string, ...string[]] = [ + system.manifest.main.entrypoint, + ...system.manifest.main.args, + ] + + await effects.setMainStatus({ status: "running" }) + const jsMain = (this.system.moduleCode as any)?.jsMain + const dockerProcedureContainer = await DockerProcedureContainer.of( + effects, + this.system.manifest.main, + this.system.manifest.volumes, + ) + if (jsMain) { + const daemons = Daemons.of({ + effects, + started: async (_) => {}, + healthReceipts: [], + }) + throw new Error("todo") + // return { + // daemon, + // wait: daemon.wait().finally(() => { + // this.clean() + // effects.setMainStatus({ status: "stopped" }) + // }), + // } + } + const daemon = await utils.runDaemon( + this.system.manifest.main.image, + currentCommand, + { + overlay: dockerProcedureContainer.overlay, + }, + ) + return { + daemon, + wait: daemon.wait().finally(() => { + this.clean() + effects + .setMainStatus({ status: "stopped" }) + .catch((e) => console.error("Could not set the status to stopped")) + }), + } + } + + public async clean(options?: { timeout?: number }) { + const { mainEvent, healthLoops, propertiesEvent } = this + delete this.mainEvent + delete this.healthLoops + delete this.propertiesEvent + if (mainEvent) await (await mainEvent).daemon.term() + clearInterval(propertiesEvent) + if (healthLoops) healthLoops.forEach((x) => clearInterval(x.interval)) + } + + private constructPropertiesEvent() { + const { runProperties } = this + return setInterval(() => { + runProperties() + }, EMBASSY_PROPERTIES_LOOP) + } + + private constructHealthLoops() { + const { manifest } = this.system + const effects = this.effects + const start = Date.now() + return Object.values(manifest["health-checks"]).map((value) => { + const name = value.name + const interval = setInterval(async () => { + const actionProcedure = value + const timeChanged = Date.now() - start + if (actionProcedure.type === "docker") { + const container = await DockerProcedureContainer.of( + effects, + actionProcedure, + manifest.volumes, + ) + const executed = await container.exec([ + actionProcedure.entrypoint, + ...actionProcedure.args, + JSON.stringify(timeChanged), + ]) + const stderr = executed.stderr.toString() + if (stderr) + console.error(`Error running health check ${value.name}: ${stderr}`) + return executed.stdout.toString() + } else { + const moduleCode = await this.system.moduleCode + const method = moduleCode.health?.[value.name] + if (!method) + return console.error( + `Expecting that thejs health check ${value.name} exists`, + ) + return (await method( + new PolyfillEffects(effects, this.system.manifest), + timeChanged, + ).then((x) => { + if ("result" in x) return x.result + if ("error" in x) + return console.error("Error getting config: " + x.error) + return console.error("Error getting config: " + x["error-code"][1]) + })) as any + } + }, EMBASSY_HEALTH_INTERVAL) + + return { name, interval } + }) + } +} diff --git a/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts b/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts new file mode 100644 index 000000000..ca1a69d2e --- /dev/null +++ b/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts @@ -0,0 +1,900 @@ +import { types as T, util, EmVer } from "@start9labs/start-sdk" +import * as fs from "fs/promises" + +import { PolyfillEffects } from "./polyfillEffects" +import { ExecuteResult, System } from "../../../Interfaces/System" +import { matchManifest, Manifest, Procedure } from "./matchManifest" +import { create } from "domain" +import * as childProcess from "node:child_process" +import { Volume } from "../../../Models/Volume" +import { DockerProcedure } from "../../../Models/DockerProcedure" +import { DockerProcedureContainer } from "./DockerProcedureContainer" +import { promisify } from "node:util" +import * as U from "./oldEmbassyTypes" +import { MainLoop } from "./MainLoop" +import { + matches, + boolean, + dictionary, + literal, + literals, + object, + string, + unknown, + any, + tuple, + number, +} from "ts-matches" +import { HostSystemStartOs } from "../../HostSystemStartOs" +import { JsonPath, unNestPath } from "../../../Models/JsonPath" +import { HostSystem } from "../../../Interfaces/HostSystem" + +type Optional = A | undefined | null +function todo(): never { + throw new Error("Not implemented") +} +const execFile = promisify(childProcess.execFile) + +const MANIFEST_LOCATION = "/usr/lib/startos/package/embassyManifest.json" +const EMBASSY_JS_LOCATION = "/usr/lib/startos/package/embassy.js" +const EMBASSY_POINTER_PATH_PREFIX = "/embassyConfig" + +export class SystemForEmbassy implements System { + currentRunning: MainLoop | undefined + static async of(manifestLocation: string = MANIFEST_LOCATION) { + const moduleCode = await import(EMBASSY_JS_LOCATION) + .catch((_) => require(EMBASSY_JS_LOCATION)) + .catch(async (_) => { + console.error("Could not load the js") + console.error({ + exists: await fs.stat(EMBASSY_JS_LOCATION), + }) + return {} + }) + const manifestData = await fs.readFile(manifestLocation, "utf-8") + return new SystemForEmbassy( + matchManifest.unsafeCast(JSON.parse(manifestData)), + moduleCode, + ) + } + constructor( + readonly manifest: Manifest, + readonly moduleCode: Partial, + ) {} + async execute( + effects: HostSystemStartOs, + options: { + procedure: JsonPath + input: unknown + timeout?: number | undefined + }, + ): Promise { + return this._execute(effects, options) + .then((x) => + matches(x) + .when( + object({ + result: any, + }), + (x) => ({ + ok: x.result, + }), + ) + .when( + object({ + error: string, + }), + (x) => ({ + err: { + code: 0, + message: x.error, + }, + }), + ) + .when( + object({ + "error-code": tuple(number, string), + }), + ({ "error-code": [code, message] }) => ({ + err: { + code, + message, + }, + }), + ) + .defaultTo({ ok: x }), + ) + .catch((error) => ({ + err: { + code: 0, + message: "" + error, + }, + })) + } + async exit(effects: HostSystemStartOs): Promise { + if (this.currentRunning) await this.currentRunning.clean() + delete this.currentRunning + } + async _execute( + effects: HostSystemStartOs, + options: { + procedure: JsonPath + input: unknown + timeout?: number | undefined + }, + ): Promise { + const input = options.input + switch (options.procedure) { + case "/backup/create": + return this.createBackup(effects) + case "/backup/restore": + return this.restoreBackup(effects) + case "/config/get": + return this.getConfig(effects) + case "/config/set": + return this.setConfig(effects, input) + case "/actions/metadata": + return todo() + case "/init": + return this.init(effects, string.optional().unsafeCast(input)) + case "/uninit": + return this.uninit(effects, string.optional().unsafeCast(input)) + case "/main/start": + return this.mainStart(effects) + case "/main/stop": + return this.mainStop(effects) + default: + const procedures = unNestPath(options.procedure) + switch (true) { + case procedures[1] === "actions" && procedures[3] === "get": + return this.action(effects, procedures[2], input) + case procedures[1] === "actions" && procedures[3] === "run": + return this.action(effects, procedures[2], input) + case procedures[1] === "dependencies" && procedures[3] === "query": + return this.dependenciesAutoconfig(effects, procedures[2], input) + + case procedures[1] === "dependencies" && procedures[3] === "update": + return this.dependenciesAutoconfig(effects, procedures[2], input) + } + } + } + private async init( + effects: HostSystemStartOs, + previousVersion: Optional, + ): Promise { + console.log("here1") + if (previousVersion) await this.migration(effects, previousVersion) + console.log("here2") + await this.properties(effects) + console.log("here3") + await effects.setMainStatus({ status: "stopped" }) + console.log("here4") + } + private async uninit( + effects: HostSystemStartOs, + nextVersion: Optional, + ): Promise { + // TODO Do a migration down if the version exists + await effects.setMainStatus({ status: "stopped" }) + } + private async mainStart(effects: HostSystemStartOs): Promise { + if (!!this.currentRunning) return + + this.currentRunning = new MainLoop(this, effects, () => + this.properties(effects), + ) + } + private async mainStop( + effects: HostSystemStartOs, + options?: { timeout?: number }, + ): Promise { + const { currentRunning } = this + delete this.currentRunning + if (currentRunning) { + await currentRunning.clean({ + timeout: options?.timeout || this.manifest.main["sigterm-timeout"], + }) + } + } + private async createBackup(effects: HostSystemStartOs): Promise { + const backup = this.manifest.backup.create + if (backup.type === "docker") { + const container = await DockerProcedureContainer.of( + effects, + backup, + this.manifest.volumes, + ) + await container.exec([backup.entrypoint, ...backup.args]) + } else { + const moduleCode = await this.moduleCode + await moduleCode.createBackup?.( + new PolyfillEffects(effects, this.manifest), + ) + } + } + private async restoreBackup(effects: HostSystemStartOs): Promise { + const restoreBackup = this.manifest.backup.restore + if (restoreBackup.type === "docker") { + const container = await DockerProcedureContainer.of( + effects, + restoreBackup, + this.manifest.volumes, + ) + await container.exec([restoreBackup.entrypoint, ...restoreBackup.args]) + } else { + const moduleCode = await this.moduleCode + await moduleCode.restoreBackup?.( + new PolyfillEffects(effects, this.manifest), + ) + } + } + private async getConfig(effects: HostSystemStartOs): Promise { + return this.getConfigUncleaned(effects).then(removePointers) + } + private async getConfigUncleaned( + effects: HostSystemStartOs, + ): Promise { + const config = this.manifest.config?.get + if (!config) return { spec: {} } + if (config.type === "docker") { + const container = await DockerProcedureContainer.of( + effects, + config, + this.manifest.volumes, + ) + // TODO: yaml + return JSON.parse( + ( + await container.exec([config.entrypoint, ...config.args]) + ).stdout.toString(), + ) + } else { + const moduleCode = await this.moduleCode + const method = moduleCode.getConfig + if (!method) throw new Error("Expecting that the method getConfig exists") + return (await method(new PolyfillEffects(effects, this.manifest)).then( + (x) => { + if ("result" in x) return x.result + if ("error" in x) throw new Error("Error getting config: " + x.error) + throw new Error("Error getting config: " + x["error-code"][1]) + }, + )) as any + } + } + private async setConfig( + effects: HostSystemStartOs, + newConfigWithoutPointers: unknown, + ): Promise { + const newConfig = structuredClone(newConfigWithoutPointers) + await updateConfig( + effects, + await this.getConfigUncleaned(effects).then((x) => x.spec), + newConfig, + ) + const setConfigValue = this.manifest.config?.set + if (!setConfigValue) return { signal: "SIGTERM", "depends-on": {} } + if (setConfigValue.type === "docker") { + const container = await DockerProcedureContainer.of( + effects, + setConfigValue, + this.manifest.volumes, + ) + return JSON.parse( + ( + await container.exec([ + setConfigValue.entrypoint, + ...setConfigValue.args, + JSON.stringify(newConfig), + ]) + ).stdout.toString(), + ) + } else if (setConfigValue.type === "script") { + const moduleCode = await this.moduleCode + const method = moduleCode.setConfig + if (!method) throw new Error("Expecting that the method setConfig exists") + return await method( + new PolyfillEffects(effects, this.manifest), + newConfig as U.Config, + ).then((x): T.SetResult => { + if ("result" in x) + return { + "depends-on": x.result["depends-on"], + signal: x.result.signal === "SIGEMT" ? "SIGTERM" : x.result.signal, + } + if ("error" in x) throw new Error("Error getting config: " + x.error) + throw new Error("Error getting config: " + x["error-code"][1]) + }) + } else { + return { + "depends-on": {}, + signal: "SIGTERM", + } + } + } + private async migration( + effects: HostSystemStartOs, + fromVersion: string, + ): Promise { + const fromEmver = EmVer.from(fromVersion) + const currentEmver = EmVer.from(this.manifest.version) + if (!this.manifest.migrations) return { configured: true } + const fromMigration = Object.entries(this.manifest.migrations.from) + .map(([version, procedure]) => [EmVer.from(version), procedure] as const) + .find( + ([versionEmver, procedure]) => + versionEmver.greaterThan(fromEmver) && + versionEmver.lessThanOrEqual(currentEmver), + ) + const toMigration = Object.entries(this.manifest.migrations.to) + .map(([version, procedure]) => [EmVer.from(version), procedure] as const) + .find( + ([versionEmver, procedure]) => + versionEmver.greaterThan(fromEmver) && + versionEmver.lessThanOrEqual(currentEmver), + ) + + // prettier-ignore + const migration = ( + fromEmver.greaterThan(currentEmver) ? [toMigration, fromMigration] : + [fromMigration, toMigration]).filter(Boolean)[0] + + if (migration) { + const [version, procedure] = migration + if (procedure.type === "docker") { + const container = await DockerProcedureContainer.of( + effects, + procedure, + this.manifest.volumes, + ) + return JSON.parse( + ( + await container.exec([ + procedure.entrypoint, + ...procedure.args, + JSON.stringify(fromVersion), + ]) + ).stdout.toString(), + ) + } else if (procedure.type === "script") { + const moduleCode = await this.moduleCode + const method = moduleCode.migration + if (!method) + throw new Error("Expecting that the method migration exists") + return (await method( + new PolyfillEffects(effects, this.manifest), + fromVersion as string, + ).then((x) => { + if ("result" in x) return x.result + if ("error" in x) throw new Error("Error getting config: " + x.error) + throw new Error("Error getting config: " + x["error-code"][1]) + })) as any + } + } + return { configured: true } + } + private async properties(effects: HostSystemStartOs): Promise { + // TODO BLU-J set the properties ever so often + const setConfigValue = this.manifest.properties + if (!setConfigValue) return + if (setConfigValue.type === "docker") { + const container = await DockerProcedureContainer.of( + effects, + setConfigValue, + this.manifest.volumes, + ) + return JSON.parse( + ( + await container.exec([ + setConfigValue.entrypoint, + ...setConfigValue.args, + ]) + ).stdout.toString(), + ) + } else if (setConfigValue.type === "script") { + const moduleCode = this.moduleCode + const method = moduleCode.properties + if (!method) + throw new Error("Expecting that the method properties exists") + await method(new PolyfillEffects(effects, this.manifest)).then((x) => { + if ("result" in x) return x.result + if ("error" in x) throw new Error("Error getting config: " + x.error) + throw new Error("Error getting config: " + x["error-code"][1]) + }) + } + } + private async health( + effects: HostSystemStartOs, + healthId: string, + timeSinceStarted: unknown, + ): Promise { + const healthProcedure = this.manifest["health-checks"][healthId] + if (!healthProcedure) return + if (healthProcedure.type === "docker") { + const container = await DockerProcedureContainer.of( + effects, + healthProcedure, + this.manifest.volumes, + ) + return JSON.parse( + ( + await container.exec([ + healthProcedure.entrypoint, + ...healthProcedure.args, + JSON.stringify(timeSinceStarted), + ]) + ).stdout.toString(), + ) + } else if (healthProcedure.type === "script") { + const moduleCode = await this.moduleCode + const method = moduleCode.health?.[healthId] + if (!method) throw new Error("Expecting that the method health exists") + await method( + new PolyfillEffects(effects, this.manifest), + Number(timeSinceStarted), + ).then((x) => { + if ("result" in x) return x.result + if ("error" in x) throw new Error("Error getting config: " + x.error) + throw new Error("Error getting config: " + x["error-code"][1]) + }) + } + } + private async action( + effects: HostSystemStartOs, + actionId: string, + formData: unknown, + ): Promise { + const actionProcedure = this.manifest.actions?.[actionId]?.implementation + if (!actionProcedure) return { message: "Action not found", value: null } + if (actionProcedure.type === "docker") { + const container = await DockerProcedureContainer.of( + effects, + actionProcedure, + this.manifest.volumes, + ) + return JSON.parse( + ( + await container.exec([ + actionProcedure.entrypoint, + ...actionProcedure.args, + JSON.stringify(formData), + ]) + ).stdout.toString(), + ) + } else { + const moduleCode = await this.moduleCode + const method = moduleCode.action?.[actionId] + if (!method) throw new Error("Expecting that the method action exists") + return (await method( + new PolyfillEffects(effects, this.manifest), + formData as any, + ).then((x) => { + if ("result" in x) return x.result + if ("error" in x) throw new Error("Error getting config: " + x.error) + throw new Error("Error getting config: " + x["error-code"][1]) + })) as any + } + } + private async dependenciesCheck( + effects: HostSystemStartOs, + id: string, + oldConfig: unknown, + ): Promise { + const actionProcedure = this.manifest.dependencies?.[id]?.config?.check + if (!actionProcedure) return { message: "Action not found", value: null } + if (actionProcedure.type === "docker") { + const container = await DockerProcedureContainer.of( + effects, + actionProcedure, + this.manifest.volumes, + ) + return JSON.parse( + ( + await container.exec([ + actionProcedure.entrypoint, + ...actionProcedure.args, + JSON.stringify(oldConfig), + ]) + ).stdout.toString(), + ) + } else if (actionProcedure.type === "script") { + const moduleCode = await this.moduleCode + const method = moduleCode.dependencies?.[id]?.check + if (!method) + throw new Error( + `Expecting that the method dependency check ${id} exists`, + ) + return (await method( + new PolyfillEffects(effects, this.manifest), + oldConfig as any, + ).then((x) => { + if ("result" in x) return x.result + if ("error" in x) throw new Error("Error getting config: " + x.error) + throw new Error("Error getting config: " + x["error-code"][1]) + })) as any + } else { + return {} + } + } + private async dependenciesAutoconfig( + effects: HostSystemStartOs, + id: string, + oldConfig: unknown, + ): Promise { + const moduleCode = await this.moduleCode + const method = moduleCode.dependencies?.[id]?.autoConfigure + if (!method) + throw new Error( + `Expecting that the method dependency autoConfigure ${id} exists`, + ) + return (await method( + new PolyfillEffects(effects, this.manifest), + oldConfig as any, + ).then((x) => { + if ("result" in x) return x.result + if ("error" in x) throw new Error("Error getting config: " + x.error) + throw new Error("Error getting config: " + x["error-code"][1]) + })) as any + } + // private async sandbox( + // effects: HostSystemStartOs, + // options: { + // procedure: + // | "/createBackup" + // | "/restoreBackup" + // | "/getConfig" + // | "/setConfig" + // | "migration" + // | "/properties" + // | `/action/${string}` + // | `/dependencies/${string}/check` + // | `/dependencies/${string}/autoConfigure` + // input: unknown + // timeout?: number | undefined + // }, + // ): Promise { + // const input = options.input + // switch (options.procedure) { + // case "/createBackup": + // return this.roCreateBackup(effects) + // case "/restoreBackup": + // return this.roRestoreBackup(effects) + // case "/getConfig": + // return this.roGetConfig(effects) + // case "/setConfig": + // return this.roSetConfig(effects, input) + // case "migration": + // return this.roMigration(effects, input) + // case "/properties": + // return this.roProperties(effects) + // default: + // const procedure = options.procedure.split("/") + // switch (true) { + // case options.procedure.startsWith("/action/"): + // return this.roAction(effects, procedure[2], input) + // case options.procedure.startsWith("/dependencies/") && + // procedure[3] === "check": + // return this.roDependenciesCheck(effects, procedure[2], input) + + // case options.procedure.startsWith("/dependencies/") && + // procedure[3] === "autoConfigure": + // return this.roDependenciesAutoconfig(effects, procedure[2], input) + // } + // } + // } + + // private async roCreateBackup(effects: HostSystemStartOs): Promise { + // const backup = this.manifest.backup.create + // if (backup.type === "docker") { + // const container = await DockerProcedureContainer.readonlyOf(backup) + // await container.exec([backup.entrypoint, ...backup.args]) + // } else { + // const moduleCode = await this.moduleCode + // await moduleCode.createBackup?.(new PolyfillEffects(effects)) + // } + // } + // private async roRestoreBackup(effects: HostSystemStartOs): Promise { + // const restoreBackup = this.manifest.backup.restore + // if (restoreBackup.type === "docker") { + // const container = await DockerProcedureContainer.readonlyOf(restoreBackup) + // await container.exec([restoreBackup.entrypoint, ...restoreBackup.args]) + // } else { + // const moduleCode = await this.moduleCode + // await moduleCode.restoreBackup?.(new PolyfillEffects(effects)) + // } + // } + // private async roGetConfig(effects: HostSystemStartOs): Promise { + // const config = this.manifest.config?.get + // if (!config) return { spec: {} } + // if (config.type === "docker") { + // const container = await DockerProcedureContainer.readonlyOf(config) + // return JSON.parse( + // (await container.exec([config.entrypoint, ...config.args])).stdout, + // ) + // } else { + // const moduleCode = await this.moduleCode + // const method = moduleCode.getConfig + // if (!method) throw new Error("Expecting that the method getConfig exists") + // return (await method(new PolyfillEffects(effects)).then((x) => { + // if ("result" in x) return x.result + // if ("error" in x) throw new Error("Error getting config: " + x.error) + // throw new Error("Error getting config: " + x["error-code"][1]) + // })) as any + // } + // } + // private async roSetConfig( + // effects: HostSystemStartOs, + // newConfig: unknown, + // ): Promise { + // const setConfigValue = this.manifest.config?.set + // if (!setConfigValue) return { signal: "SIGTERM", "depends-on": {} } + // if (setConfigValue.type === "docker") { + // const container = await DockerProcedureContainer.readonlyOf( + // setConfigValue, + // ) + // return JSON.parse( + // ( + // await container.exec([ + // setConfigValue.entrypoint, + // ...setConfigValue.args, + // JSON.stringify(newConfig), + // ]) + // ).stdout, + // ) + // } else { + // const moduleCode = await this.moduleCode + // const method = moduleCode.setConfig + // if (!method) throw new Error("Expecting that the method setConfig exists") + // return await method( + // new PolyfillEffects(effects), + // newConfig as U.Config, + // ).then((x) => { + // if ("result" in x) return x.result + // if ("error" in x) throw new Error("Error getting config: " + x.error) + // throw new Error("Error getting config: " + x["error-code"][1]) + // }) + // } + // } + // private async roMigration( + // effects: HostSystemStartOs, + // fromVersion: unknown, + // ): Promise { + // throw new Error("Migrations should never be ran in the sandbox mode") + // } + // private async roProperties(effects: HostSystemStartOs): Promise { + // const setConfigValue = this.manifest.properties + // if (!setConfigValue) return {} + // if (setConfigValue.type === "docker") { + // const container = await DockerProcedureContainer.readonlyOf( + // setConfigValue, + // ) + // return JSON.parse( + // ( + // await container.exec([ + // setConfigValue.entrypoint, + // ...setConfigValue.args, + // ]) + // ).stdout, + // ) + // } else { + // const moduleCode = await this.moduleCode + // const method = moduleCode.properties + // if (!method) + // throw new Error("Expecting that the method properties exists") + // return await method(new PolyfillEffects(effects)).then((x) => { + // if ("result" in x) return x.result + // if ("error" in x) throw new Error("Error getting config: " + x.error) + // throw new Error("Error getting config: " + x["error-code"][1]) + // }) + // } + // } + // private async roHealth( + // effects: HostSystemStartOs, + // healthId: string, + // timeSinceStarted: unknown, + // ): Promise { + // const healthProcedure = this.manifest["health-checks"][healthId] + // if (!healthProcedure) return + // if (healthProcedure.type === "docker") { + // const container = await DockerProcedureContainer.readonlyOf( + // healthProcedure, + // ) + // return JSON.parse( + // ( + // await container.exec([ + // healthProcedure.entrypoint, + // ...healthProcedure.args, + // JSON.stringify(timeSinceStarted), + // ]) + // ).stdout, + // ) + // } else { + // const moduleCode = await this.moduleCode + // const method = moduleCode.health?.[healthId] + // if (!method) throw new Error("Expecting that the method health exists") + // await method(new PolyfillEffects(effects), Number(timeSinceStarted)).then( + // (x) => { + // if ("result" in x) return x.result + // if ("error" in x) throw new Error("Error getting config: " + x.error) + // throw new Error("Error getting config: " + x["error-code"][1]) + // }, + // ) + // } + // } + // private async roAction( + // effects: HostSystemStartOs, + // actionId: string, + // formData: unknown, + // ): Promise { + // const actionProcedure = this.manifest.actions?.[actionId]?.implementation + // if (!actionProcedure) return { message: "Action not found", value: null } + // if (actionProcedure.type === "docker") { + // const container = await DockerProcedureContainer.readonlyOf( + // actionProcedure, + // ) + // return JSON.parse( + // ( + // await container.exec([ + // actionProcedure.entrypoint, + // ...actionProcedure.args, + // JSON.stringify(formData), + // ]) + // ).stdout, + // ) + // } else { + // const moduleCode = await this.moduleCode + // const method = moduleCode.action?.[actionId] + // if (!method) throw new Error("Expecting that the method action exists") + // return (await method(new PolyfillEffects(effects), formData as any).then( + // (x) => { + // if ("result" in x) return x.result + // if ("error" in x) throw new Error("Error getting config: " + x.error) + // throw new Error("Error getting config: " + x["error-code"][1]) + // }, + // )) as any + // } + // } + // private async roDependenciesCheck( + // effects: HostSystemStartOs, + // id: string, + // oldConfig: unknown, + // ): Promise { + // const actionProcedure = this.manifest.dependencies?.[id]?.config?.check + // if (!actionProcedure) return { message: "Action not found", value: null } + // if (actionProcedure.type === "docker") { + // const container = await DockerProcedureContainer.readonlyOf( + // actionProcedure, + // ) + // return JSON.parse( + // ( + // await container.exec([ + // actionProcedure.entrypoint, + // ...actionProcedure.args, + // JSON.stringify(oldConfig), + // ]) + // ).stdout, + // ) + // } else { + // const moduleCode = await this.moduleCode + // const method = moduleCode.dependencies?.[id]?.check + // if (!method) + // throw new Error( + // `Expecting that the method dependency check ${id} exists`, + // ) + // return (await method(new PolyfillEffects(effects), oldConfig as any).then( + // (x) => { + // if ("result" in x) return x.result + // if ("error" in x) throw new Error("Error getting config: " + x.error) + // throw new Error("Error getting config: " + x["error-code"][1]) + // }, + // )) as any + // } + // } + // private async roDependenciesAutoconfig( + // effects: HostSystemStartOs, + // id: string, + // oldConfig: unknown, + // ): Promise { + // const moduleCode = await this.moduleCode + // const method = moduleCode.dependencies?.[id]?.autoConfigure + // if (!method) + // throw new Error( + // `Expecting that the method dependency autoConfigure ${id} exists`, + // ) + // return (await method(new PolyfillEffects(effects), oldConfig as any).then( + // (x) => { + // if ("result" in x) return x.result + // if ("error" in x) throw new Error("Error getting config: " + x.error) + // throw new Error("Error getting config: " + x["error-code"][1]) + // }, + // )) as any + // } +} +async function removePointers(value: T.ConfigRes): Promise { + const startingSpec = structuredClone(value.spec) + const spec = cleanSpecOfPointers(startingSpec) + + return { ...value, spec } +} + +const matchPointer = object({ + type: literal("pointer"), +}) + +const matchPointerPackage = object({ + subtype: literal("package"), + target: literals("tor-key", "tor-address", "lan-address"), + "package-id": string, + interface: string, +}) +const matchPointerConfig = object({ + subtype: literal("package"), + target: literals("config"), + "package-id": string, + selector: string, + multi: boolean, +}) +const matchSpec = object({ + spec: object, +}) +const matchVariants = object({ variants: dictionary([string, unknown]) }) +function cleanSpecOfPointers(mutSpec: T): T { + if (!object.test(mutSpec)) return mutSpec + for (const key in mutSpec) { + const value = mutSpec[key] + if (matchSpec.test(value)) value.spec = cleanSpecOfPointers(value.spec) + if (matchVariants.test(value)) + value.variants = Object.fromEntries( + Object.entries(value.variants).map(([key, value]) => [ + key, + cleanSpecOfPointers(value), + ]), + ) + if (!matchPointer.test(value)) continue + delete mutSpec[key] + // // if (value.target === ) + } + + return mutSpec +} + +async function updateConfig( + effects: HostSystemStartOs, + spec: unknown, + mutConfigValue: unknown, +) { + if (!dictionary([string, unknown]).test(spec)) return + if (!dictionary([string, unknown]).test(mutConfigValue)) return + for (const key in spec) { + const specValue = spec[key] + + const newConfigValue = mutConfigValue[key] + if (matchSpec.test(specValue)) { + const updateObject = { spec: null } + await updateConfig(effects, { spec: specValue.spec }, updateObject) + mutConfigValue[key] = updateObject.spec + } + if ( + matchVariants.test(specValue) && + object({ tag: object({ id: string }) }).test(newConfigValue) && + newConfigValue.tag.id in specValue.variants + ) { + // Not going to do anything on the variants... + } + if (!matchPointer.test(specValue)) continue + if (matchPointerConfig.test(specValue)) { + const configValue = (await effects.store.get({ + packageId: specValue["package-id"], + callback() {}, + path: `${EMBASSY_POINTER_PATH_PREFIX}${specValue.selector}` as any, + })) as any + mutConfigValue[key] = configValue + } + if (matchPointerPackage.test(specValue)) { + mutConfigValue[key] = await effects.embassyGetInterface({ + target: specValue.target, + packageId: specValue["package-id"], + interface: specValue["interface"], + }) + } + } +} diff --git a/container-runtime/src/Adapters/Systems/SystemForEmbassy/matchManifest.ts b/container-runtime/src/Adapters/Systems/SystemForEmbassy/matchManifest.ts new file mode 100644 index 000000000..9b70f884b --- /dev/null +++ b/container-runtime/src/Adapters/Systems/SystemForEmbassy/matchManifest.ts @@ -0,0 +1,119 @@ +import { + object, + literal, + string, + array, + boolean, + dictionary, + literals, + number, + unknown, + some, + every, +} from "ts-matches" +import { matchVolume } from "./matchVolume" +import { matchDockerProcedure } from "../../../Models/DockerProcedure" + +const matchJsProcedure = object( + { + type: literal("script"), + args: array(unknown), + }, + ["args"], + { + args: [], + }, +) + +const matchProcedure = some(matchDockerProcedure, matchJsProcedure) +export type Procedure = typeof matchProcedure._TYPE + +const matchAction = object( + { + name: string, + description: string, + warning: string, + implementation: matchProcedure, + "allowed-statuses": array(literals("running", "stopped")), + "input-spec": unknown, + }, + ["warning", "input-spec", "input-spec"], +) +export const matchManifest = object( + { + id: string, + version: string, + main: matchDockerProcedure, + assets: object( + { + assets: string, + scripts: string, + }, + ["assets", "scripts"], + ), + "health-checks": dictionary([ + string, + every( + matchProcedure, + object({ + name: string, + }), + ), + ]), + config: object({ + get: matchProcedure, + set: matchProcedure, + }), + properties: matchProcedure, + volumes: dictionary([string, matchVolume]), + interfaces: dictionary([ + string, + object({ + name: string, + "tor-config": object({}), + "lan-config": object({}), + ui: boolean, + protocols: array(string), + }), + ]), + backup: object({ + create: matchProcedure, + restore: matchProcedure, + }), + migrations: object({ + to: dictionary([string, matchProcedure]), + from: dictionary([string, matchProcedure]), + }), + dependencies: dictionary([ + string, + object( + { + version: string, + requirement: some( + object({ + type: literal("opt-in"), + how: string, + }), + object({ + type: literal("opt-out"), + how: string, + }), + object({ + type: literal("required"), + }), + ), + description: string, + config: object({ + check: matchProcedure, + "auto-configure": matchProcedure, + }), + }, + ["description", "config"], + ), + ]), + + actions: dictionary([string, matchAction]), + }, + ["config", "actions", "properties", "migrations", "dependencies"], +) +export type Manifest = typeof matchManifest._TYPE diff --git a/container-runtime/src/Adapters/Systems/SystemForEmbassy/matchVolume.ts b/container-runtime/src/Adapters/Systems/SystemForEmbassy/matchVolume.ts new file mode 100644 index 000000000..7aa579ecf --- /dev/null +++ b/container-runtime/src/Adapters/Systems/SystemForEmbassy/matchVolume.ts @@ -0,0 +1,35 @@ +import { object, literal, string, boolean, some } from "ts-matches" + +const matchDataVolume = object( + { + type: literal("data"), + readonly: boolean, + }, + ["readonly"], +) +const matchAssetVolume = object({ + type: literal("assets"), +}) +const matchPointerVolume = object({ + type: literal("pointer"), + "package-id": string, + "volume-id": string, + path: string, + readonly: boolean, +}) +const matchCertificateVolume = object({ + type: literal("certificate"), + "interface-id": string, +}) +const matchBackupVolume = object({ + type: literal("backup"), + readonly: boolean, +}) +export const matchVolume = some( + matchDataVolume, + matchAssetVolume, + matchPointerVolume, + matchCertificateVolume, + matchBackupVolume, +) +export type Volume = typeof matchVolume._TYPE diff --git a/container-runtime/src/Adapters/Systems/SystemForEmbassy/oldEmbassyTypes.ts b/container-runtime/src/Adapters/Systems/SystemForEmbassy/oldEmbassyTypes.ts new file mode 100644 index 000000000..072a1171c --- /dev/null +++ b/container-runtime/src/Adapters/Systems/SystemForEmbassy/oldEmbassyTypes.ts @@ -0,0 +1,482 @@ +// deno-lint-ignore no-namespace +export type ExpectedExports = { + version: 2 + /** Set configuration is called after we have modified and saved the configuration in the embassy ui. Use this to make a file for the docker to read from for configuration. */ + setConfig: (effects: Effects, input: Config) => Promise> + /** Get configuration returns a shape that describes the format that the embassy ui will generate, and later send to the set config */ + getConfig: (effects: Effects) => Promise> + /** These are how we make sure the our dependency configurations are valid and if not how to fix them. */ + dependencies: Dependencies + /** For backing up service data though the embassyOS UI */ + createBackup: (effects: Effects) => Promise> + /** For restoring service data that was previously backed up using the embassyOS UI create backup flow. Backup restores are also triggered via the embassyOS UI, or doing a system restore flow during setup. */ + restoreBackup: (effects: Effects) => Promise> + /** Properties are used to get values from the docker, like a username + password, what ports we are hosting from */ + properties: (effects: Effects) => Promise> + health: { + /** Should be the health check id */ + [id: string]: ( + effects: Effects, + dateMs: number, + ) => Promise> + } + migration: ( + effects: Effects, + version: string, + ...args: unknown[] + ) => Promise> + action: { + [id: string]: ( + effects: Effects, + config?: Config, + ) => Promise> + } + + /** + * This is the entrypoint for the main container. Used to start up something like the service that the + * package represents, like running a bitcoind in a bitcoind-wrapper. + */ + main: (effects: Effects) => Promise> +} + +/** Used to reach out from the pure js runtime */ +export type Effects = { + /** Usable when not sandboxed */ + writeFile(input: { + path: string + volumeId: string + toWrite: string + }): Promise + readFile(input: { volumeId: string; path: string }): Promise + metadata(input: { volumeId: string; path: string }): Promise + /** Create a directory. Usable when not sandboxed */ + createDir(input: { volumeId: string; path: string }): Promise + + readDir(input: { volumeId: string; path: string }): Promise + /** Remove a directory. Usable when not sandboxed */ + removeDir(input: { volumeId: string; path: string }): Promise + removeFile(input: { volumeId: string; path: string }): Promise + + /** Write a json file into an object. Usable when not sandboxed */ + writeJsonFile(input: { + volumeId: string + path: string + toWrite: Record + }): Promise + + /** Read a json file into an object */ + readJsonFile(input: { + volumeId: string + path: string + }): Promise> + + runCommand(input: { + command: string + args?: string[] + timeoutMillis?: number + }): Promise> + runDaemon(input: { command: string; args?: string[] }): { + wait(): Promise> + term(): Promise + } + + chown(input: { volumeId: string; path: string; uid: string }): Promise + chmod(input: { volumeId: string; path: string; mode: string }): Promise + + sleep(timeMs: number): Promise + + /** Log at the trace level */ + trace(whatToPrint: string): void + /** Log at the warn level */ + warn(whatToPrint: string): void + /** Log at the error level */ + error(whatToPrint: string): void + /** Log at the debug level */ + debug(whatToPrint: string): void + /** Log at the info level */ + info(whatToPrint: string): void + + /** Sandbox mode lets us read but not write */ + is_sandboxed(): boolean + + exists(input: { volumeId: string; path: string }): Promise + bindLocal(options: { + internalPort: number + name: string + externalPort: number + }): Promise + bindTor(options: { + internalPort: number + name: string + externalPort: number + }): Promise + + fetch( + url: string, + options?: { + method?: "GET" | "POST" | "PUT" | "DELETE" | "HEAD" | "PATCH" + headers?: Record + body?: string + }, + ): Promise<{ + method: string + ok: boolean + status: number + headers: Record + body?: string | null + /// Returns the body as a string + text(): Promise + /// Returns the body as a json + json(): Promise + }> + + runRsync(options: { + srcVolume: string + dstVolume: string + srcPath: string + dstPath: string + // rsync options: https://linux.die.net/man/1/rsync + options: BackupOptions + }): { + id: () => Promise + wait: () => Promise + progress: () => Promise + } +} + +// rsync options: https://linux.die.net/man/1/rsync +export type BackupOptions = { + delete: boolean + force: boolean + ignoreExisting: boolean + exclude: string[] +} +export type Metadata = { + fileType: string + isDir: boolean + isFile: boolean + isSymlink: boolean + len: number + modified?: Date + accessed?: Date + created?: Date + readonly: boolean + uid: number + gid: number + mode: number +} + +export type MigrationRes = { + configured: boolean +} + +export type ActionResult = { + version: "0" + message: string + value?: string + copyable: boolean + qr: boolean +} + +export type ConfigRes = { + /** This should be the previous config, that way during set config we start with the previous */ + config?: Config + /** Shape that is describing the form in the ui */ + spec: ConfigSpec +} +export type Config = { + [propertyName: string]: unknown +} + +export type ConfigSpec = { + /** Given a config value, define what it should render with the following spec */ + [configValue: string]: ValueSpecAny +} +export type WithDefault = T & { + default: Default +} +export type WithNullableDefault = T & { + default?: Default +} + +export type WithDescription = T & { + description?: string + name: string + warning?: string +} + +export type WithOptionalDescription = T & { + /** @deprecated - optional only for backwards compatibility */ + description?: string + /** @deprecated - optional only for backwards compatibility */ + name?: string + warning?: string +} + +export type ListSpec = { + spec: T + range: string +} + +export type Tag = V & { + type: T +} + +export type Subtype = V & { + subtype: T +} + +export type Target = V & { + target: T +} + +export type UniqueBy = + | { + any: UniqueBy[] + } + | string + | null + +export type WithNullable = T & { + nullable: boolean +} +export type DefaultString = + | string + | { + /** The chars available for the random generation */ + charset?: string + /** Length that we generate to */ + len: number + } + +export type ValueSpecString = // deno-lint-ignore ban-types + ( + | {} + | { + pattern: string + "pattern-description": string + } + ) & { + copyable?: boolean + masked?: boolean + placeholder?: string + } +export type ValueSpecNumber = { + /** Something like [3,6] or [0, *) */ + range?: string + integral?: boolean + /** Used a description of the units */ + units?: string + placeholder?: number +} +export type ValueSpecBoolean = Record +export type ValueSpecAny = + | Tag<"boolean", WithDescription>> + | Tag< + "string", + WithDescription< + WithNullableDefault, DefaultString> + > + > + | Tag< + "number", + WithDescription< + WithNullableDefault, number> + > + > + | Tag< + "enum", + WithDescription< + WithDefault< + { + values: readonly string[] | string[] + "value-names": { + [key: string]: string + } + }, + string + > + > + > + | Tag<"list", ValueSpecList> + | Tag<"object", WithDescription>> + | Tag<"union", WithOptionalDescription>> + | Tag< + "pointer", + WithDescription< + | Subtype< + "package", + | Target< + "tor-key", + { + "package-id": string + interface: string + } + > + | Target< + "tor-address", + { + "package-id": string + interface: string + } + > + | Target< + "lan-address", + { + "package-id": string + interface: string + } + > + | Target< + "config", + { + "package-id": string + selector: string + multi: boolean + } + > + > + | Subtype<"system", Record> + > + > +export type ValueSpecUnion = { + /** What tag for the specification, for tag unions */ + tag: { + id: string + name: string + description?: string + "variant-names": { + [key: string]: string + } + } + /** The possible enum values */ + variants: { + [key: string]: ConfigSpec + } + "display-as"?: string + "unique-by"?: UniqueBy +} +export type ValueSpecObject = { + spec: ConfigSpec + "display-as"?: string + "unique-by"?: UniqueBy +} +export type ValueSpecList = + | Subtype< + "boolean", + WithDescription, boolean[]>> + > + | Subtype< + "string", + WithDescription, string[]>> + > + | Subtype< + "number", + WithDescription, number[]>> + > + | Subtype< + "enum", + WithDescription, string[]>> + > + | Subtype< + "object", + WithDescription< + WithNullableDefault< + ListSpec, + Record[] + > + > + > + | Subtype< + "union", + WithDescription, string[]>> + > +export type ValueSpecEnum = { + values: string[] + "value-names": { [key: string]: string } +} + +export type SetResult = { + /** These are the unix process signals */ + signal: + | "SIGTERM" + | "SIGHUP" + | "SIGINT" + | "SIGQUIT" + | "SIGILL" + | "SIGTRAP" + | "SIGABRT" + | "SIGBUS" + | "SIGFPE" + | "SIGKILL" + | "SIGUSR1" + | "SIGSEGV" + | "SIGUSR2" + | "SIGPIPE" + | "SIGALRM" + | "SIGSTKFLT" + | "SIGCHLD" + | "SIGCONT" + | "SIGSTOP" + | "SIGTSTP" + | "SIGTTIN" + | "SIGTTOU" + | "SIGURG" + | "SIGXCPU" + | "SIGXFSZ" + | "SIGVTALRM" + | "SIGPROF" + | "SIGWINCH" + | "SIGIO" + | "SIGPWR" + | "SIGSYS" + | "SIGEMT" + | "SIGINFO" + "depends-on": DependsOn +} + +export type DependsOn = { + [packageId: string]: string[] +} + +export type KnownError = + | { error: string } + | { + "error-code": [number, string] | readonly [number, string] + } +export type ResultType = KnownError | { result: T } + +export type PackagePropertiesV2 = { + [name: string]: PackagePropertyObject | PackagePropertyString +} +export type PackagePropertyString = { + type: "string" + description?: string + value: string + /** Let's the ui make this copyable button */ + copyable?: boolean + /** Let the ui create a qr for this field */ + qr?: boolean + /** Hiding the value unless toggled off for field */ + masked?: boolean +} +export type PackagePropertyObject = { + value: PackagePropertiesV2 + type: "object" + description: string +} + +export type Properties = { + version: 2 + data: PackagePropertiesV2 +} + +export type Dependencies = { + /** Id is the id of the package, should be the same as the manifest */ + [id: string]: { + /** Checks are called to make sure that our dependency is in the correct shape. If a known error is returned we know that the dependency needs modification */ + check(effects: Effects, input: Config): Promise> + /** This is called after we know that the dependency package needs a new configuration, this would be a transform for defaults */ + autoConfigure(effects: Effects, input: Config): Promise> + } +} diff --git a/container-runtime/src/Adapters/Systems/SystemForEmbassy/polyfillEffects.ts b/container-runtime/src/Adapters/Systems/SystemForEmbassy/polyfillEffects.ts new file mode 100644 index 000000000..65a827103 --- /dev/null +++ b/container-runtime/src/Adapters/Systems/SystemForEmbassy/polyfillEffects.ts @@ -0,0 +1,215 @@ +import * as fs from "fs/promises" +import * as oet from "./oldEmbassyTypes" +import { Volume } from "../../../Models/Volume" +import * as child_process from "child_process" +import { promisify } from "util" +import { util, Utils } from "@start9labs/start-sdk" +import { Manifest } from "./matchManifest" +import { HostSystemStartOs } from "../../HostSystemStartOs" +import "isomorphic-fetch" + +const { createUtils } = util + +const execFile = promisify(child_process.execFile) + +export class PolyfillEffects implements oet.Effects { + private utils: Utils + constructor( + readonly effects: HostSystemStartOs, + private manifest: Manifest, + ) { + this.utils = createUtils(effects as any) + } + async writeFile(input: { + path: string + volumeId: string + toWrite: string + }): Promise { + await fs.writeFile( + new Volume(input.volumeId, input.path).path, + input.toWrite, + ) + } + async readFile(input: { volumeId: string; path: string }): Promise { + return ( + await fs.readFile(new Volume(input.volumeId, input.path).path) + ).toString() + } + async metadata(input: { + volumeId: string + path: string + }): Promise { + const stats = await fs.stat(new Volume(input.volumeId, input.path).path) + return { + fileType: stats.isFile() ? "file" : "directory", + gid: stats.gid, + uid: stats.uid, + mode: stats.mode, + isDir: stats.isDirectory(), + isFile: stats.isFile(), + isSymlink: stats.isSymbolicLink(), + len: stats.size, + readonly: (stats.mode & 0o200) > 0, + } + } + async createDir(input: { volumeId: string; path: string }): Promise { + const path = new Volume(input.volumeId, input.path).path + await fs.mkdir(path, { recursive: true }) + return path + } + async readDir(input: { volumeId: string; path: string }): Promise { + return fs.readdir(new Volume(input.volumeId, input.path).path) + } + async removeDir(input: { volumeId: string; path: string }): Promise { + const path = new Volume(input.volumeId, input.path).path + await fs.rmdir(new Volume(input.volumeId, input.path).path, { + recursive: true, + }) + return path + } + removeFile(input: { volumeId: string; path: string }): Promise { + return fs.rm(new Volume(input.volumeId, input.path).path) + } + async writeJsonFile(input: { + volumeId: string + path: string + toWrite: Record + }): Promise { + await fs.writeFile( + new Volume(input.volumeId, input.path).path, + JSON.stringify(input.toWrite), + ) + } + async readJsonFile(input: { + volumeId: string + path: string + }): Promise> { + return JSON.parse( + ( + await fs.readFile(new Volume(input.volumeId, input.path).path) + ).toString(), + ) + } + runCommand({ + command, + args, + timeoutMillis, + }: { + command: string + args?: string[] | undefined + timeoutMillis?: number | undefined + }): Promise> { + return this.utils + .runCommand(this.manifest.main.image, [command, ...(args || [])], {}) + .then((x) => ({ + stderr: x.stderr.toString(), + stdout: x.stdout.toString(), + })) + .then((x) => (!!x.stderr ? { error: x.stderr } : { result: x.stdout })) + } + runDaemon(input: { command: string; args?: string[] | undefined }): { + wait(): Promise> + term(): Promise + } { + throw new Error("Method not implemented.") + } + chown(input: { volumeId: string; path: string; uid: string }): Promise { + throw new Error("Method not implemented.") + } + chmod(input: { + volumeId: string + path: string + mode: string + }): Promise { + throw new Error("Method not implemented.") + } + sleep(timeMs: number): Promise { + return new Promise((resolve) => setTimeout(resolve, timeMs)) + } + trace(whatToPrint: string): void { + console.trace(whatToPrint) + } + warn(whatToPrint: string): void { + console.warn(whatToPrint) + } + error(whatToPrint: string): void { + console.error(whatToPrint) + } + debug(whatToPrint: string): void { + console.debug(whatToPrint) + } + info(whatToPrint: string): void { + console.log(false) + } + is_sandboxed(): boolean { + return false + } + exists(input: { volumeId: string; path: string }): Promise { + return this.metadata(input) + .then(() => true) + .catch(() => false) + } + bindLocal(options: { + internalPort: number + name: string + externalPort: number + }): Promise { + throw new Error("Method not implemented.") + } + bindTor(options: { + internalPort: number + name: string + externalPort: number + }): Promise { + throw new Error("Method not implemented.") + } + async fetch( + url: string, + options?: + | { + method?: + | "GET" + | "POST" + | "PUT" + | "DELETE" + | "HEAD" + | "PATCH" + | undefined + headers?: Record | undefined + body?: string | undefined + } + | undefined, + ): Promise<{ + method: string + ok: boolean + status: number + headers: Record + body?: string | null | undefined + text(): Promise + json(): Promise + }> { + const fetched = await fetch(url, options) + return { + method: fetched.type, + ok: fetched.ok, + status: fetched.status, + headers: Object.fromEntries(fetched.headers.entries()), + body: await fetched.text(), + text: () => fetched.text(), + json: () => fetched.json(), + } + } + runRsync(options: { + srcVolume: string + dstVolume: string + srcPath: string + dstPath: string + options: oet.BackupOptions + }): { + id: () => Promise + wait: () => Promise + progress: () => Promise + } { + throw new Error("Method not implemented.") + } +} diff --git a/container-runtime/src/Adapters/Systems/SystemForStartOs.ts b/container-runtime/src/Adapters/Systems/SystemForStartOs.ts new file mode 100644 index 000000000..9d2dcd4b8 --- /dev/null +++ b/container-runtime/src/Adapters/Systems/SystemForStartOs.ts @@ -0,0 +1,150 @@ +import { ExecuteResult, System } from "../../Interfaces/System" +import { unNestPath } from "../../Models/JsonPath" +import { string } from "ts-matches" +import { HostSystemStartOs } from "../HostSystemStartOs" +import { Effects } from "../../Models/Effects" +const LOCATION = "/usr/lib/startos/package/startos" +export class SystemForStartOs implements System { + private onTerm: (() => Promise) | undefined + static of() { + return new SystemForStartOs() + } + constructor() {} + async execute( + effects: HostSystemStartOs, + options: { + procedure: + | "/init" + | "/uninit" + | "/main/start" + | "/main/stop" + | "/config/set" + | "/config/get" + | "/backup/create" + | "/backup/restore" + | "/actions/metadata" + | `/actions/${string}/get` + | `/actions/${string}/run` + | `/dependencies/${string}/query` + | `/dependencies/${string}/update` + input: unknown + timeout?: number | undefined + }, + ): Promise { + return { ok: await this._execute(effects, options) } + } + async _execute( + effects: Effects, + options: { + procedure: + | "/init" + | "/uninit" + | "/main/start" + | "/main/stop" + | "/config/set" + | "/config/get" + | "/backup/create" + | "/backup/restore" + | "/actions/metadata" + | `/actions/${string}/get` + | `/actions/${string}/run` + | `/dependencies/${string}/query` + | `/dependencies/${string}/update` + input: unknown + timeout?: number | undefined + }, + ): Promise { + switch (options.procedure) { + case "/init": { + const path = `${LOCATION}/procedures/init` + const procedure: any = await import(path).catch(() => require(path)) + const previousVersion = string.optional().unsafeCast(options) + return procedure.init({ effects, previousVersion }) + } + case "/uninit": { + const path = `${LOCATION}/procedures/init` + const procedure: any = await import(path).catch(() => require(path)) + const nextVersion = string.optional().unsafeCast(options) + return procedure.uninit({ effects, nextVersion }) + } + case "/main/start": { + const path = `${LOCATION}/procedures/main` + const procedure: any = await import(path).catch(() => require(path)) + const started = async (onTerm: () => Promise) => { + await effects.setMainStatus({ status: "running" }) + if (this.onTerm) await this.onTerm() + this.onTerm = onTerm + } + return procedure.main({ effects, started }) + } + case "/main/stop": { + await effects.setMainStatus({ status: "stopped" }) + if (this.onTerm) await this.onTerm() + delete this.onTerm + return + } + case "/config/set": { + const path = `${LOCATION}/procedures/config` + const procedure: any = await import(path).catch(() => require(path)) + const input = options.input + return procedure.setConfig({ effects, input }) + } + case "/config/get": { + const path = `${LOCATION}/procedures/config` + const procedure: any = await import(path).catch(() => require(path)) + return procedure.getConfig({ effects }) + } + case "/backup/create": + case "/backup/restore": + throw new Error("this should be called with the init/unit") + case "/actions/metadata": { + const path = `${LOCATION}/procedures/actions` + const procedure: any = await import(path).catch(() => require(path)) + return procedure.actionsMetadata({ effects }) + } + default: + const procedures = unNestPath(options.procedure) + const id = procedures[2] + switch (true) { + case procedures[1] === "actions" && procedures[3] === "get": { + const path = `${LOCATION}/procedures/actions` + const action: any = (await import(path).catch(() => require(path))) + .actions[id] + if (!action) throw new Error(`Action ${id} not found`) + return action.get({ effects }) + } + case procedures[1] === "actions" && procedures[3] === "run": { + const path = `${LOCATION}/procedures/actions` + const action: any = (await import(path).catch(() => require(path))) + .actions[id] + if (!action) throw new Error(`Action ${id} not found`) + const input = options.input + return action.run({ effects, input }) + } + case procedures[1] === "dependencies" && procedures[3] === "query": { + const path = `${LOCATION}/procedures/dependencies` + const dependencyConfig: any = ( + await import(path).catch(() => require(path)) + ).dependencyConfig[id] + if (!dependencyConfig) + throw new Error(`dependencyConfig ${id} not found`) + const localConfig = options.input + return dependencyConfig.query({ effects, localConfig }) + } + case procedures[1] === "dependencies" && procedures[3] === "update": { + const path = `${LOCATION}/procedures/dependencies` + const dependencyConfig: any = ( + await import(path).catch(() => require(path)) + ).dependencyConfig[id] + if (!dependencyConfig) + throw new Error(`dependencyConfig ${id} not found`) + return dependencyConfig.update(options.input) + } + } + } + throw new Error("Method not implemented.") + } + exit(effects: Effects): Promise { + throw new Error("Method not implemented.") + } +} diff --git a/container-runtime/src/Adapters/Systems/index.ts b/container-runtime/src/Adapters/Systems/index.ts new file mode 100644 index 000000000..eadc67318 --- /dev/null +++ b/container-runtime/src/Adapters/Systems/index.ts @@ -0,0 +1,6 @@ +import { System } from "../../Interfaces/System" +import { SystemForEmbassy } from "./SystemForEmbassy" +import { SystemForStartOs } from "./SystemForStartOs" +export async function getSystem(): Promise { + return SystemForEmbassy.of() +} diff --git a/container-runtime/src/Interfaces/AllGetDependencies.ts b/container-runtime/src/Interfaces/AllGetDependencies.ts new file mode 100644 index 000000000..88a200900 --- /dev/null +++ b/container-runtime/src/Interfaces/AllGetDependencies.ts @@ -0,0 +1,6 @@ +import { GetDependency } from "./GetDependency" +import { System } from "./System" +import { GetHostSystem, HostSystem } from "./HostSystem" + +export type AllGetDependencies = GetDependency<"system", Promise> & + GetDependency<"hostSystem", GetHostSystem> diff --git a/container-runtime/src/Interfaces/GetDependency.ts b/container-runtime/src/Interfaces/GetDependency.ts new file mode 100644 index 000000000..c4bce8733 --- /dev/null +++ b/container-runtime/src/Interfaces/GetDependency.ts @@ -0,0 +1,3 @@ +export type GetDependency = { + [OtherK in K]: () => T +} diff --git a/container-runtime/src/Interfaces/HostSystem.ts b/container-runtime/src/Interfaces/HostSystem.ts new file mode 100644 index 000000000..4e04bbcc8 --- /dev/null +++ b/container-runtime/src/Interfaces/HostSystem.ts @@ -0,0 +1,7 @@ +import { types as T } from "@start9labs/start-sdk" + +import { CallbackHolder } from "../Models/CallbackHolder" +import { Effects } from "../Models/Effects" + +export type HostSystem = Effects +export type GetHostSystem = (callbackHolder: CallbackHolder) => HostSystem diff --git a/container-runtime/src/Interfaces/System.ts b/container-runtime/src/Interfaces/System.ts new file mode 100644 index 000000000..7dcde3c52 --- /dev/null +++ b/container-runtime/src/Interfaces/System.ts @@ -0,0 +1,31 @@ +import { types as T } from "@start9labs/start-sdk" +import { JsonPath } from "../Models/JsonPath" +import { HostSystemStartOs } from "../Adapters/HostSystemStartOs" +export type ExecuteResult = + | { ok: unknown } + | { err: { code: number; message: string } } +export interface System { + // init(effects: Effects): Promise + // exit(effects: Effects): Promise + // start(effects: Effects): Promise + // stop(effects: Effects, options: { timeout: number, signal?: number }): Promise + + execute( + effects: T.Effects, + options: { + procedure: JsonPath + input: unknown + timeout?: number + }, + ): Promise + // sandbox( + // effects: Effects, + // options: { + // procedure: JsonPath + // input: unknown + // timeout?: number + // }, + // ): Promise + + exit(effects: T.Effects): Promise +} diff --git a/container-runtime/src/Models/CallbackHolder.ts b/container-runtime/src/Models/CallbackHolder.ts new file mode 100644 index 000000000..3aa4392ce --- /dev/null +++ b/container-runtime/src/Models/CallbackHolder.ts @@ -0,0 +1,18 @@ +export class CallbackHolder { + constructor() {} + private root = (Math.random() + 1).toString(36).substring(7) + private inc = 0 + private callbacks = new Map() + private newId() { + return this.root + (this.inc++).toString(36) + } + addCallback(callback: Function) { + return this.callbacks.set(this.newId(), callback) + } + callCallback(index: string, args: any[]): Promise { + const callback = this.callbacks.get(index) + if (!callback) throw new Error(`Callback ${index} does not exist`) + this.callbacks.delete(index) + return Promise.resolve().then(() => callback(...args)) + } +} diff --git a/container-runtime/src/Models/DockerProcedure.ts b/container-runtime/src/Models/DockerProcedure.ts new file mode 100644 index 000000000..91ae73b5f --- /dev/null +++ b/container-runtime/src/Models/DockerProcedure.ts @@ -0,0 +1,45 @@ +import { + object, + literal, + string, + boolean, + array, + dictionary, + literals, + number, + Parser, +} from "ts-matches" + +const VolumeId = string +const Path = string + +export type VolumeId = string +export type Path = string +export const matchDockerProcedure = object( + { + type: literal("docker"), + image: string, + system: boolean, + entrypoint: string, + args: array(string), + mounts: dictionary([VolumeId, Path]), + "io-format": literals( + "json", + "json-pretty", + "yaml", + "cbor", + "toml", + "toml-pretty", + ), + "sigterm-timeout": number, + inject: boolean, + }, + ["io-format", "sigterm-timeout", "system", "args", "inject", "mounts"], + { + "sigterm-timeout": 30, + inject: false, + args: [], + }, +) + +export type DockerProcedure = typeof matchDockerProcedure._TYPE diff --git a/container-runtime/src/Models/Effects.ts b/container-runtime/src/Models/Effects.ts new file mode 100644 index 000000000..757d51238 --- /dev/null +++ b/container-runtime/src/Models/Effects.ts @@ -0,0 +1,5 @@ +import { types as T } from "@start9labs/start-sdk" + +export type Effects = T.Effects & { + setMainStatus(o: { status: "running" | "stopped" }): Promise +} diff --git a/container-runtime/src/Models/JsonPath.ts b/container-runtime/src/Models/JsonPath.ts new file mode 100644 index 000000000..627eb3be2 --- /dev/null +++ b/container-runtime/src/Models/JsonPath.ts @@ -0,0 +1,42 @@ +import { literals, some, string } from "ts-matches" + +type NestedPath = `/${A}/${string}/${B}` +type NestedPaths = + | NestedPath<"actions", "run" | "get"> + | NestedPath<"dependencies", "query" | "update"> +// prettier-ignore +type UnNestPaths = + A extends `${infer A}/${infer B}` ? [...UnNestPaths, ... UnNestPaths] : + [A] + +export function unNestPath(a: A): UnNestPaths { + return a.split("/") as UnNestPaths +} +function isNestedPath(path: string): path is NestedPaths { + const paths = path.split("/") + if (paths.length !== 4) return false + if (paths[1] === "action" && (paths[3] === "run" || paths[3] === "get")) + return true + if ( + paths[1] === "dependencyConfig" && + (paths[3] === "query" || paths[3] === "update") + ) + return true + return false +} +export const jsonPath = some( + literals( + "/init", + "/uninit", + "/main/start", + "/main/stop", + "/config/set", + "/config/get", + "/backup/create", + "/backup/restore", + "/actions/metadata", + ), + string.refine(isNestedPath, "isNestedPath"), +) + +export type JsonPath = typeof jsonPath._TYPE diff --git a/container-runtime/src/Models/Volume.ts b/container-runtime/src/Models/Volume.ts new file mode 100644 index 000000000..ebf013b68 --- /dev/null +++ b/container-runtime/src/Models/Volume.ts @@ -0,0 +1,19 @@ +import * as fs from "node:fs/promises" + +export class Volume { + readonly path: string + constructor( + readonly volumeId: string, + _path = "", + ) { + const path = (this.path = `/media/startos/volumes/${volumeId}${ + !_path ? "" : `/${_path}` + }`) + } + async exists() { + return fs.stat(this.path).then( + () => true, + () => false, + ) + } +} diff --git a/container-runtime/initSrc/index.ts b/container-runtime/src/index.ts similarity index 65% rename from container-runtime/initSrc/index.ts rename to container-runtime/src/index.ts index 8621daa5e..d86111ecb 100644 --- a/container-runtime/initSrc/index.ts +++ b/container-runtime/src/index.ts @@ -1,6 +1,15 @@ -import { Runtime } from "./Runtime" - -new Runtime() +import { RpcListener } from "./Adapters/RpcListener" +import { SystemForEmbassy } from "./Adapters/Systems/SystemForEmbassy" +import { HostSystemStartOs } from "./Adapters/HostSystemStartOs" +import { AllGetDependencies } from "./Interfaces/AllGetDependencies" +import { getSystem } from "./Adapters/Systems" + +const getDependencies: AllGetDependencies = { + system: getSystem, + hostSystem: () => HostSystemStartOs.of, +} + +new RpcListener(getDependencies) /** diff --git a/container-runtime/tsconfig.json b/container-runtime/tsconfig.json index 3af74fc39..fd93d5154 100644 --- a/container-runtime/tsconfig.json +++ b/container-runtime/tsconfig.json @@ -2,20 +2,25 @@ "include": [ "./**/*.mjs", "./**/*.js", - "initSrc/Runtime.ts", - "initSrc/index.ts", + "src/Adapters/RpcListener.ts", + "src/index.ts", "effects.ts" ], - "exclude": [], - "inputs": ["./lib/index.ts"], + "exclude": ["dist"], + "inputs": ["./src/index.ts"], "compilerOptions": { - "target": "es2022", - "module": "es2022", - "moduleResolution": "node", - "allowJs": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, + "module": "Node16", "strict": true, + "outDir": "dist", + "preserveConstEnums": true, + "sourceMap": true, + "target": "ES2022", + "pretty": true, + "declaration": true, + "noImplicitAny": true, + "esModuleInterop": true, + "types": ["node"], + "moduleResolution": "Node16", "skipLibCheck": true }, "ts-node": { diff --git a/container-runtime/update-image.sh b/container-runtime/update-image.sh new file mode 100755 index 000000000..64ca503cf --- /dev/null +++ b/container-runtime/update-image.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +cd "$(dirname "${BASH_SOURCE[0]}")" + +set -e + + + +if mountpoint tmp/combined; then sudo umount tmp/combined; fi +if mountpoint tmp/lower; then sudo umount tmp/lower; fi +mkdir -p tmp/lower tmp/upper tmp/work tmp/combined +sudo mount alpine.squashfs tmp/lower +sudo mount -t overlay -olowerdir=tmp/lower,upperdir=tmp/upper,workdir=tmp/work overlay tmp/combined + +QEMU= +if [ "$ARCH" != "$(uname -m)" ]; then + QEMU=/usr/bin/qemu-${ARCH}-static + sudo cp $(which qemu-$ARCH-static) tmp/combined${QEMU} +fi + +echo "nameserver 8.8.8.8" | sudo tee tmp/combined/etc/resolv.conf # TODO - delegate to host resolver? +sudo chroot tmp/combined $QEMU /sbin/apk add nodejs +sudo mkdir -p tmp/combined/usr/lib/startos/ +sudo rsync -a --copy-unsafe-links dist/ tmp/combined/usr/lib/startos/init/ +sudo cp containerRuntime.rc tmp/combined/etc/init.d/containerRuntime +sudo cp ../core/target/$ARCH-unknown-linux-musl/release/containerbox tmp/combined/usr/bin/start-cli +sudo chmod +x tmp/combined/etc/init.d/containerRuntime +sudo chroot tmp/combined $QEMU /sbin/rc-update add containerRuntime default + +if [ -n "$QEMU" ]; then + sudo rm tmp/combined${QEMU} +fi + +sudo truncate -s 0 tmp/combined/etc/resolv.conf +sudo chown -R 0:0 tmp/combined +rm -f ../build/lib/container-runtime/rootfs.squashfs +mkdir -p ../build/lib/container-runtime +sudo mksquashfs tmp/combined ../build/lib/container-runtime/rootfs.squashfs +sudo umount tmp/combined +sudo umount tmp/lower +sudo rm -rf tmp \ No newline at end of file diff --git a/core/Cargo.lock b/core/Cargo.lock index dec795cf2..ec677308d 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -2,16 +2,6 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] - [[package]] name = "addr2line" version = "0.21.0" @@ -33,7 +23,7 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "cipher 0.3.0", "cpufeatures", "ctr", @@ -46,19 +36,19 @@ version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.2.12", "once_cell", "version_check", ] [[package]] name = "ahash" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" dependencies = [ - "cfg-if 1.0.0", - "getrandom 0.2.11", + "cfg-if", + "getrandom 0.2.12", "once_cell", "version_check", "zerocopy", @@ -110,19 +100,58 @@ dependencies = [ ] [[package]] -name = "ansi_term" -version = "0.12.1" +name = "anstream" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" dependencies = [ - "winapi", + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" + +[[package]] +name = "anstyle-parse" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", ] [[package]] name = "anyhow" -version = "1.0.75" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" [[package]] name = "arrayref" @@ -145,19 +174,6 @@ dependencies = [ "term", ] -[[package]] -name = "ast_node" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c09c69dffe06d222d072c878c3afe86eee2179806f20503faec97250268b4c24" -dependencies = [ - "pmutil", - "proc-macro2", - "quote", - "swc_macros_common", - "syn 2.0.39", -] - [[package]] name = "async-channel" version = "1.9.0" @@ -171,9 +187,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f658e2baef915ba0f26f1f7c42bfb8e12f532a01f449a090ded75ae7a07e9ba2" +checksum = "a116f46a969224200a0a97f29cfd4c50e7534e4b4826bd23ea2c3c533039c82c" dependencies = [ "brotli", "flate2", @@ -202,18 +218,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "async-trait" -version = "0.1.74" +version = "0.1.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -225,6 +241,16 @@ dependencies = [ "num-traits", ] +[[package]] +name = "atomic-write-file" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edcdbedc2236483ab103a53415653d6b4442ea6141baf1ffa85df29635e88436" +dependencies = [ + "nix 0.27.1", + "rand 0.8.5", +] + [[package]] name = "atty" version = "0.2.14" @@ -243,28 +269,49 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] -name = "avahi-sys" -version = "0.10.0" -source = "git+https://github.com/Start9Labs/avahi-sys?branch=feature/dynamic-linking#12bef9e435cfb0d36cb229b9d08e2114c176ea7a" +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" dependencies = [ - "bindgen", - "libc", + "async-trait", + "axum-core 0.3.4", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http 0.2.11", + "http-body 0.4.6", + "hyper 0.14.28", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", ] [[package]] name = "axum" -version = "0.6.20" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" dependencies = [ "async-trait", - "axum-core", - "bitflags 1.3.2", + "axum-core 0.4.3", + "base64 0.21.7", "bytes", "futures-util", - "http", - "http-body", - "hyper", + "http 1.0.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.1.0", + "hyper-util", "itoa", "matchit", "memchr", @@ -273,10 +320,17 @@ dependencies = [ "pin-project-lite", "rustversion", "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sha1", "sync_wrapper", + "tokio", + "tokio-tungstenite", "tower", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -288,14 +342,54 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http", - "http-body", + "http 0.2.11", + "http-body 0.4.6", "mime", "rustversion", "tower-layer", "tower-service", ] +[[package]] +name = "axum-core" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 1.0.0", + "http-body 1.0.0", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-server" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ad46c3ec4e12f4a4b6835e173ba21c25e484c9d02b49770bf006ce5367c036" +dependencies = [ + "bytes", + "futures-util", + "http 1.0.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.1.0", + "hyper-util", + "pin-project-lite", + "tokio", + "tower", + "tower-service", +] + [[package]] name = "backtrace" version = "0.3.69" @@ -304,7 +398,7 @@ checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ "addr2line", "cc", - "cfg-if 1.0.0", + "cfg-if", "libc", "miniz_oxide", "object", @@ -331,9 +425,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.5" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64ct" @@ -343,24 +437,15 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "basic-cookies" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb53b6b315f924c7f113b162e53b3901c05fc9966baf84d201dfcc7432a4bb38" +checksum = "67bd8fd42c16bdb08688243dc5f0cc117a3ca9efeeaba3a345a18a6159ad96f7" dependencies = [ "lalrpop", "lalrpop-util", "regex", ] -[[package]] -name = "better_scoped_tls" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "794edcc9b3fb07bb4aecaa11f093fd45663b4feadb782d68303a2268bc2701de" -dependencies = [ - "scoped-tls", -] - [[package]] name = "bincode" version = "1.3.3" @@ -370,30 +455,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bindgen" -version = "0.55.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b13ce559e6433d360c26305643803cb52cfbabbc2b9c47ce04a58493dfb443" -dependencies = [ - "bitflags 1.3.2", - "cexpr", - "cfg-if 0.1.10", - "clang-sys", - "clap 2.34.0", - "env_logger 0.7.1", - "lazy_static", - "lazycell", - "log", - "peeking_take_while", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "which 3.1.1", -] - [[package]] name = "bit-set" version = "0.5.3" @@ -417,9 +478,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" dependencies = [ "serde", ] @@ -462,7 +523,7 @@ dependencies = [ "arrayref", "arrayvec", "cc", - "cfg-if 1.0.0", + "cfg-if", "constant_time_eq", ] @@ -532,28 +593,13 @@ checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cc" -version = "1.0.84" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f8e7c90afad890484a21653d08b6e209ae34770fb5ee298f9c699fcc1e5c856" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "libc", ] -[[package]] -name = "cexpr" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27" -dependencies = [ - "nom 5.1.3", -] - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - [[package]] name = "cfg-if" version = "1.0.0" @@ -562,9 +608,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb" dependencies = [ "android-tzdata", "iana-time-zone", @@ -572,7 +618,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.48.5", + "windows-targets 0.52.0", ] [[package]] @@ -581,14 +627,14 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eebd66744a15ded14960ab4ccdbfb51ad3b81f51f3f04a80adac98c985396c9" dependencies = [ - "hashbrown 0.14.2", + "hashbrown 0.14.3", ] [[package]] name = "ciborium" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" dependencies = [ "ciborium-io", "ciborium-ll", @@ -597,18 +643,18 @@ dependencies = [ [[package]] name = "ciborium-io" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" [[package]] name = "ciborium-ll" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", - "half", + "half 2.3.1", ] [[package]] @@ -631,44 +677,52 @@ dependencies = [ ] [[package]] -name = "clang-sys" -version = "1.6.1" +name = "clap" +version = "3.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ - "glob", - "libc", - "libloading", + "atty", + "bitflags 1.3.2", + "clap_lex 0.2.4", + "indexmap 1.9.3", + "strsim", + "termcolor", + "textwrap", ] [[package]] name = "clap" -version = "2.34.0" +version = "4.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c" dependencies = [ - "ansi_term", - "atty", - "bitflags 1.3.2", - "strsim 0.8.0", - "textwrap 0.11.0", - "unicode-width", - "vec_map", + "clap_builder", + "clap_derive", ] [[package]] -name = "clap" -version = "3.2.25" +name = "clap_builder" +version = "4.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7" dependencies = [ - "atty", - "bitflags 1.3.2", - "clap_lex", - "indexmap 1.9.3", - "strsim 0.10.0", - "termcolor", - "textwrap 0.16.0", + "anstream", + "anstyle", + "clap_lex 0.6.0", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.48", ] [[package]] @@ -680,6 +734,12 @@ dependencies = [ "os_str_bytes", ] +[[package]] +name = "clap_lex" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" + [[package]] name = "color-eyre" version = "0.6.2" @@ -697,9 +757,9 @@ dependencies = [ [[package]] name = "color-spantrace" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" +checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" dependencies = [ "once_cell", "owo-colors", @@ -707,26 +767,32 @@ dependencies = [ "tracing-error", ] +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + [[package]] name = "concurrent-queue" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" dependencies = [ "crossbeam-utils", ] [[package]] name = "console" -version = "0.15.7" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ "encode_unicode 0.3.6", "lazy_static", "libc", "unicode-width", - "windows-sys 0.45.0", + "windows-sys 0.52.0", ] [[package]] @@ -753,7 +819,7 @@ dependencies = [ "crossbeam-utils", "futures-task", "hdrhistogram", - "humantime 2.1.0", + "humantime", "prost-types", "serde", "serde_json", @@ -768,9 +834,9 @@ dependencies = [ [[package]] name = "const-oid" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "const_format" @@ -798,28 +864,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" -[[package]] -name = "container-init" -version = "0.1.0" -dependencies = [ - "async-stream", - "color-eyre", - "futures", - "helpers", - "imbl", - "nix 0.27.1", - "procfs", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tracing", - "tracing-error", - "tracing-futures", - "tracing-subscriber", - "yajrc 0.1.0 (git+https://github.com/dr-bonez/yajrc.git?branch=develop)", -] - [[package]] name = "convert_case" version = "0.4.0" @@ -903,9 +947,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -913,15 +957,15 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] @@ -947,36 +991,57 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" dependencies = [ - "cfg-if 1.0.0", "crossbeam-utils", ] [[package]] name = "crossbeam-queue" -version = "0.3.8" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" dependencies = [ - "cfg-if 1.0.0", "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + +[[package]] +name = "crossterm" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" +dependencies = [ + "bitflags 2.4.2", + "crossterm_winapi", + "futures-core", + "libc", + "mio", + "parking_lot", + "signal-hook", + "signal-hook-mio", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" dependencies = [ - "cfg-if 1.0.0", + "winapi", ] [[package]] @@ -987,9 +1052,9 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-bigint" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28f85c3514d2a6e64160359b45a3918c3b4178bcbf4ae5d03ab2d02e521c479a" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", "rand_core 0.6.4", @@ -1009,9 +1074,9 @@ dependencies = [ [[package]] name = "crypto-mac" -version = "0.11.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" dependencies = [ "generic-array", "subtle", @@ -1072,13 +1137,13 @@ version = "4.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "curve25519-dalek-derive", "digest 0.10.7", "fiat-crypto", "platforms", - "rustc_version 0.4.0", + "rustc_version", "subtle", "zeroize", ] @@ -1091,7 +1156,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -1114,8 +1179,8 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim 0.10.0", - "syn 2.0.39", + "strsim", + "syn 2.0.48", ] [[package]] @@ -1126,201 +1191,46 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn 2.0.39", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if 1.0.0", - "hashbrown 0.14.2", - "lock_api", - "once_cell", - "parking_lot_core", + "syn 2.0.48", ] [[package]] name = "data-encoding" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" [[package]] -name = "data-url" -version = "0.3.0" +name = "der" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41b319d1b62ffbd002e057f36bebd1f42b9f97927c9577461d855f3513c4289f" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] [[package]] -name = "debugid" -version = "0.8.0" +name = "deranged" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ + "powerfmt", "serde", - "uuid", ] [[package]] -name = "deno-proc-macro-rules" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c65c2ffdafc1564565200967edc4851c7b55422d3913466688907efd05ea26f" -dependencies = [ - "deno-proc-macro-rules-macros", - "proc-macro2", - "syn 2.0.39", -] - -[[package]] -name = "deno-proc-macro-rules-macros" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3047b312b7451e3190865713a4dd6e1f821aed614ada219766ebc3024a690435" -dependencies = [ - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.39", -] - -[[package]] -name = "deno_ast" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a8adb6aeb787db71d015d8e9f63f6e004eeb09c86babb4ded00878be18619b1" -dependencies = [ - "anyhow", - "base64 0.13.1", - "deno_media_type", - "dprint-swc-ext", - "serde", - "swc_atoms", - "swc_common", - "swc_config", - "swc_config_macro", - "swc_ecma_ast", - "swc_ecma_codegen", - "swc_ecma_codegen_macros", - "swc_ecma_loader", - "swc_ecma_parser", - "swc_ecma_transforms_base", - "swc_ecma_transforms_classes", - "swc_ecma_transforms_macros", - "swc_ecma_transforms_proposal", - "swc_ecma_transforms_react", - "swc_ecma_transforms_typescript", - "swc_ecma_utils", - "swc_ecma_visit", - "swc_eq_ignore_macros", - "swc_macros_common", - "swc_visit", - "swc_visit_macros", - "text_lines", - "url", -] - -[[package]] -name = "deno_core" -version = "0.222.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b13c81b9ea8462680e7b77088a44fc36390bab3dbfa5a205a285e11b64e0919c" -dependencies = [ - "anyhow", - "bytes", - "deno_ops", - "deno_unsync", - "futures", - "indexmap 2.1.0", - "libc", - "log", - "once_cell", - "parking_lot", - "pin-project", - "serde", - "serde_json", - "serde_v8", - "smallvec", - "sourcemap 7.0.1", - "tokio", - "url", - "v8", -] - -[[package]] -name = "deno_media_type" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a798670c20308e5770cc0775de821424ff9e85665b602928509c8c70430b3ee0" -dependencies = [ - "data-url", - "serde", - "url", -] - -[[package]] -name = "deno_ops" -version = "0.98.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf89da1a3e50ff7c89956495b53d9bcad29e1f1b3f3d2bc54cad7155f55419c4" -dependencies = [ - "deno-proc-macro-rules", - "lazy-regex", - "once_cell", - "pmutil", - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "regex", - "strum", - "strum_macros", - "syn 2.0.39", - "thiserror", -] - -[[package]] -name = "deno_unsync" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8a8f3722afd50e566ecfc783cc8a3a046bc4dd5eb45007431dfb2776aeb8993" -dependencies = [ - "tokio", -] - -[[package]] -name = "der" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" -dependencies = [ - "powerfmt", - "serde", -] - -[[package]] -name = "derive_more" -version = "0.99.17" +name = "derive_more" +version = "0.99.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ "convert_case 0.4.0", "proc-macro2", "quote", - "rustc_version 0.4.0", + "rustc_version", "syn 1.0.109", ] @@ -1357,7 +1267,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "dirs-sys-next", ] @@ -1384,22 +1294,6 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" -[[package]] -name = "dprint-swc-ext" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a0a2492465344a58a37ae119de59e81fe5a2885f2711c7b5048ef0dfa14ce42" -dependencies = [ - "bumpalo", - "num-bigint", - "rustc-hash", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "swc_ecma_parser", - "text_lines", -] - [[package]] name = "drain" version = "0.1.1" @@ -1417,15 +1311,15 @@ checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" [[package]] name = "ecdsa" -version = "0.16.8" +version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", "digest 0.10.7", "elliptic-curve", "rfc6979", - "signature 2.0.0", + "signature 2.2.0", "spki", ] @@ -1446,7 +1340,7 @@ checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ "pkcs8", "serde", - "signature 2.0.0", + "signature 2.2.0", ] [[package]] @@ -1465,16 +1359,17 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7277392b266383ef8396db7fdeb1e77b6c52fed775f5df15bb24f35b72156980" +checksum = "1f628eaec48bfd21b865dc2950cfa014450c01d2fa2b69a86c2fd5844ec523c0" dependencies = [ "curve25519-dalek 4.1.1", "ed25519 2.2.3", "rand_core 0.6.4", "serde", "sha2 0.10.8", - "signature 2.0.0", + "signature 2.2.0", + "subtle", "zeroize", ] @@ -1489,9 +1384,9 @@ dependencies = [ [[package]] name = "elliptic-curve" -version = "0.13.6" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97ca172ae9dc9f9b779a6e3a65d308f2af74e5b8c921299075bdb4a0370e914" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -1514,7 +1409,7 @@ source = "git+https://github.com/Start9Labs/emver-rs.git#61cf0bc96711b4d6f3f30df dependencies = [ "either", "fp-core", - "nom 7.1.3", + "nom", "serde", ] @@ -1545,7 +1440,7 @@ version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -1557,33 +1452,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.39", -] - -[[package]] -name = "env_logger" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" -dependencies = [ - "atty", - "humantime 1.3.0", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "env_logger" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece" -dependencies = [ - "humantime 2.1.0", - "is-terminal", - "log", - "regex", - "termcolor", + "syn 2.0.48", ] [[package]] @@ -1594,12 +1463,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.6" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c18ee0ed65a5f1f81cac6b1d213b69c35fa47d4252ad41f1486dbd8226fe36e" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -1608,7 +1477,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "home", "windows-sys 0.48.0", ] @@ -1621,9 +1490,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "eyre" -version = "0.6.8" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" +checksum = "b6267a1fa6f59179ea4afc8e50fd8612a3cc60bc858f786ff877a4a8cb042799" dependencies = [ "indenter", "once_cell", @@ -1656,20 +1525,20 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f69037fe1b785e84986b4f2cbcf647381876a00671d25ceef715d7812dd7e1dd" +checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" [[package]] name = "filetime" -version = "0.2.22" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", - "redox_syscall 0.3.5", - "windows-sys 0.48.0", + "redox_syscall 0.4.1", + "windows-sys 0.52.0", ] [[package]] @@ -1728,9 +1597,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -1744,28 +1613,6 @@ dependencies = [ "itertools 0.8.2", ] -[[package]] -name = "from_variant" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03ec5dc38ee19078d84a692b1c41181ff9f94331c76cee66ff0208c770b5e54f" -dependencies = [ - "pmutil", - "proc-macro2", - "swc_macros_common", - "syn 2.0.39", -] - -[[package]] -name = "fslock" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57eafdd0c16f57161105ae1b98a1238f97645f2f588438b2949c99a2af9616bf" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "funty" version = "2.0.0" @@ -1774,9 +1621,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -1789,9 +1636,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -1799,15 +1646,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -1827,38 +1674,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-macro" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -1889,33 +1736,27 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "wasi 0.9.0+wasi-snapshot-preview1", ] [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] name = "gimli" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" - -[[package]] -name = "glob" -version = "0.3.1" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "gpt" @@ -1923,7 +1764,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8283e7331b8c93b9756e0cfdbcfb90312852f953c6faf9bf741e684cc3b6ad69" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "crc", "log", "uuid", @@ -1942,17 +1783,36 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.21" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" dependencies = [ "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http", - "indexmap 1.9.3", + "http 0.2.11", + "indexmap 2.1.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 1.0.0", + "indexmap 2.1.0", "slab", "tokio", "tokio-util", @@ -1965,6 +1825,16 @@ version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" +[[package]] +name = "half" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" +dependencies = [ + "cfg-if", + "crunchy", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -1977,16 +1847,16 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.6", + "ahash 0.8.7", ] [[package]] name = "hashbrown" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "ahash 0.8.6", + "ahash 0.8.7", "allocator-api2", ] @@ -1996,19 +1866,19 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ - "hashbrown 0.14.2", + "hashbrown 0.14.3", ] [[package]] name = "hdrhistogram" -version = "7.5.3" +version = "7.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5b38e5c02b7c7be48c8dc5217c4f1634af2ea221caae2e024bffc7a7651c691" +checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" dependencies = [ - "base64 0.13.1", + "base64 0.21.7", "byteorder", "flate2", - "nom 7.1.3", + "nom", "num-traits", ] @@ -2030,12 +1900,12 @@ dependencies = [ "lazy_async_pool", "models", "pin-project", + "rpc-toolkit 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde", "serde_json", "tokio", "tokio-stream", "tracing", - "yajrc 0.1.0 (git+https://github.com/dr-bonez/yajrc.git?branch=develop)", ] [[package]] @@ -2049,9 +1919,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" [[package]] name = "hex" @@ -2067,9 +1937,9 @@ checksum = "85ef6b41c333e6dd2a4aaa59125a19b633cd17e7aaf372b2260809777bcdef4a" [[package]] name = "hkdf" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ "hmac 0.12.1", ] @@ -2095,11 +1965,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.5" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -2113,14 +1983,48 @@ dependencies = [ "itoa", ] +[[package]] +name = "http" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.11", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http 1.0.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840" dependencies = [ "bytes", - "http", + "futures-util", + "http 1.0.0", + "http-body 1.0.0", "pin-project-lite", ] @@ -2136,15 +2040,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" -[[package]] -name = "humantime" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -dependencies = [ - "quick-error", -] - [[package]] name = "humantime" version = "2.1.0" @@ -2153,35 +2048,54 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" dependencies = [ "bytes", "futures-channel", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.3.24", + "http 0.2.11", + "http-body 0.4.6", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", + "socket2", "tokio", "tower-service", "tracing", "want", ] +[[package]] +name = "hyper" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5aa53871fc917b1a9ed87b683a5d86db645e23acb32c2e0785a353e522fb75" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.2", + "http 1.0.0", + "http-body 1.0.0", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "tokio", +] + [[package]] name = "hyper-timeout" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper", + "hyper 0.14.28", "pin-project-lite", "tokio", "tokio-io-timeout", @@ -2194,34 +2108,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper", + "hyper 0.14.28", "native-tls", "tokio", "tokio-native-tls", ] [[package]] -name = "hyper-ws-listener" -version = "0.3.0" +name = "hyper-util" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbfe4981e45b0a7403a55d4af12f8d30e173e722409658c3857243990e72180" +checksum = "bdea9aac0dbe5a9240d68cfd9501e2db94222c6dc06843e06640b9e07f0fdc67" dependencies = [ - "anyhow", - "base64 0.21.5", - "env_logger 0.10.1", - "futures", - "hyper", - "log", - "sha-1", + "bytes", + "futures-channel", + "futures-util", + "http 1.0.0", + "http-body 1.0.0", + "hyper 1.1.0", + "pin-project-lite", + "socket2", "tokio", - "tokio-tungstenite", + "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.58" +version = "0.1.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2278,10 +2193,14 @@ dependencies = [ ] [[package]] -name = "if_chain" -version = "1.0.2" +name = "idna" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] [[package]] name = "imbl" @@ -2299,9 +2218,9 @@ dependencies = [ [[package]] name = "imbl-sized-chunks" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6957ea0b2541c5ca561d3ef4538044af79f8a05a1eb3a3b148936aaceaa1076" +checksum = "144006fb58ed787dcae3f54575ff4349755b00ccc99f4b4873860b654be1ed63" dependencies = [ "bitmaps", ] @@ -2309,7 +2228,7 @@ dependencies = [ [[package]] name = "imbl-value" version = "0.1.0" -source = "git+https://github.com/Start9Labs/imbl-value.git#929395141c3a882ac366c12ac9402d0ebaa2201b" +source = "git+https://github.com/Start9Labs/imbl-value.git#48dc39a762a3b4f9300d3b9f850cbd394e777ae0" dependencies = [ "imbl", "serde", @@ -2361,7 +2280,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown 0.14.2", + "hashbrown 0.14.3", "serde", ] @@ -2394,7 +2313,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -2407,17 +2326,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi 0.3.3", - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "ipnet" version = "2.9.0" @@ -2437,28 +2345,15 @@ dependencies = [ "serde", ] -[[package]] -name = "is-macro" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4467ed1321b310c2625c5aa6c1b1ffc5de4d9e42668cf697a08fb033ee8265e" -dependencies = [ - "Inflector", - "pmutil", - "proc-macro2", - "quote", - "syn 2.0.39", -] - [[package]] name = "is-terminal" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" dependencies = [ - "hermit-abi 0.3.3", - "rustix 0.38.21", - "windows-sys 0.48.0", + "hermit-abi 0.3.4", + "rustix", + "windows-sys 0.52.0", ] [[package]] @@ -2498,11 +2393,20 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" +dependencies = [ + "either", +] + [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "jaq-core" @@ -2544,12 +2448,12 @@ dependencies = [ [[package]] name = "josekit" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5754487a088f527b1407df470db8e654e4064dccbbe1fe850e0773721e9962b7" +checksum = "cd20997283339a19226445db97d632c8dc7adb6b8172537fe0e9e540fb141df2" dependencies = [ "anyhow", - "base64 0.21.5", + "base64 0.21.7", "flate2", "once_cell", "openssl", @@ -2562,9 +2466,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.65" +version = "0.3.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" +checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" dependencies = [ "wasm-bindgen", ] @@ -2602,18 +2506,18 @@ dependencies = [ [[package]] name = "keccak" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ "cpufeatures", ] [[package]] name = "lalrpop" -version = "0.19.12" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a1cbf952127589f2851ab2046af368fd20645491bb4b376f04b7f94d7a9837b" +checksum = "da4081d44f4611b66c6dd725e6de3169f9f63905421e8626fcb86b6a898998b8" dependencies = [ "ascii-canvas", "bit-set", @@ -2623,8 +2527,9 @@ dependencies = [ "itertools 0.10.5", "lalrpop-util", "petgraph", + "pico-args", "regex", - "regex-syntax 0.6.29", + "regex-syntax 0.7.5", "string_cache", "term", "tiny-keccak", @@ -2633,34 +2538,11 @@ dependencies = [ [[package]] name = "lalrpop-util" -version = "0.19.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3c48237b9604c5a4702de6b824e02006c3214327564636aef27c1028a8fa0ed" -dependencies = [ - "regex", -] - -[[package]] -name = "lazy-regex" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d12be4595afdf58bd19e4a9f4e24187da2a66700786ff660a418e9059937a4c" -dependencies = [ - "lazy-regex-proc_macros", - "once_cell", - "regex", -] - -[[package]] -name = "lazy-regex-proc_macros" -version = "3.1.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44bcd58e6c97a7fcbaffcdc95728b393b8d98933bfadad49ed4097845b57ef0b" +checksum = "3f35c735096c0293d313e8f2a641627472b83d01b937177fe76e5e2708d31e0d" dependencies = [ - "proc-macro2", - "quote", "regex", - "syn 2.0.39", ] [[package]] @@ -2673,6 +2555,12 @@ dependencies = [ "futures", ] +[[package]] +name = "lazy_format" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e479e99b287d578ed5f6cd4c92cdf48db219088adb9c5b14f7c155b71dfba792" + [[package]] name = "lazy_static" version = "1.4.0" @@ -2682,27 +2570,11 @@ dependencies = [ "spin 0.5.2", ] -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "libc" -version = "0.2.150" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" - -[[package]] -name = "libloading" -version = "0.7.4" +version = "0.2.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if 1.0.0", - "winapi", -] +checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" [[package]] name = "libm" @@ -2716,16 +2588,16 @@ version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "libc", "redox_syscall 0.4.1", ] [[package]] name = "libsqlite3-sys" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326" +checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" dependencies = [ "cc", "pkg-config", @@ -2734,15 +2606,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" - -[[package]] -name = "linux-raw-sys" -version = "0.4.11" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_api" @@ -2800,15 +2666,15 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "digest 0.10.7", ] [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "memoffset" @@ -2851,11 +2717,12 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", + "log", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.48.0", ] @@ -2864,19 +2731,20 @@ dependencies = [ name = "models" version = "0.1.0" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "color-eyre", - "ed25519-dalek 2.0.0", + "ed25519-dalek 2.1.0", "emver", "ipnet", "lazy_static", "mbrman", + "num_enum", "openssl", "patch-db", "rand 0.8.5", "regex", "reqwest", - "rpc-toolkit", + "rpc-toolkit 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde", "serde_json", "sqlx", @@ -2929,7 +2797,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" dependencies = [ "bitflags 1.3.2", - "cfg-if 1.0.0", + "cfg-if", "libc", "memoffset 0.6.5", ] @@ -2941,7 +2809,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" dependencies = [ "bitflags 1.3.2", - "cfg-if 1.0.0", + "cfg-if", "libc", "memoffset 0.7.1", "pin-utils", @@ -2953,21 +2821,11 @@ version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" dependencies = [ - "bitflags 2.4.1", - "cfg-if 1.0.0", + "bitflags 2.4.2", + "cfg-if", "libc", ] -[[package]] -name = "nom" -version = "5.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08959a387a676302eebf4ddbcbc611da04285579f76f88ee0506c63b1a61dd4b" -dependencies = [ - "memchr", - "version_check", -] - [[package]] name = "nom" version = "7.1.3" @@ -3011,8 +2869,6 @@ dependencies = [ "autocfg", "num-integer", "num-traits", - "rand 0.8.5", - "serde", ] [[package]] @@ -3090,29 +2946,29 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.3", + "hermit-abi 0.3.4", "libc", ] [[package]] name = "num_enum" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" dependencies = [ "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" dependencies = [ - "proc-macro-crate 2.0.0", + "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -3123,18 +2979,18 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "object" -version = "0.32.1" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -3148,7 +3004,7 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c75a0ec2d1b302412fb503224289325fcc0e44600176864804c7211b055cfd58" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "byteorder", "md-5", "sha2 0.10.8", @@ -3157,12 +3013,12 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.59" +version = "0.10.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a257ad03cd8fb16ad4172fedf8094451e1af1c4b70097636ef2eac9a5f0cc33" +checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8" dependencies = [ - "bitflags 2.4.1", - "cfg-if 1.0.0", + "bitflags 2.4.2", + "cfg-if", "foreign-types", "libc", "once_cell", @@ -3178,7 +3034,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -3189,18 +3045,18 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "300.1.6+3.1.4" +version = "300.2.1+3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439fac53e092cd7442a3660c85dde4643ab3b5bd39040912388dcdabf6b88085" +checksum = "3fe476c29791a5ca0d1273c697e96085bbabbbea2ef7afd5617e78a4b40332d3" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.95" +version = "0.9.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a4130519a360279579c2053038317e40eff64d13fd3f004f9e1b72b8a6aaf9" +checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae" dependencies = [ "cc", "libc", @@ -3251,6 +3107,20 @@ dependencies = [ "sha2 0.10.8", ] +[[package]] +name = "p521" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc9e2161f1f215afdfce23677034ae137bbd45016a880c2eb3ba8eb95f085b2" +dependencies = [ + "base16ct", + "ecdsa", + "elliptic-curve", + "primeorder", + "rand_core 0.6.4", + "sha2 0.10.8", +] + [[package]] name = "parking_lot" version = "0.12.1" @@ -3267,7 +3137,7 @@ version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "redox_syscall 0.4.1", "smallvec", @@ -3321,12 +3191,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "pathdiff" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" - [[package]] name = "pbkdf2" version = "0.12.2" @@ -3337,12 +3201,6 @@ dependencies = [ "hmac 0.12.1", ] -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -3354,9 +3212,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "petgraph" @@ -3368,41 +3226,6 @@ dependencies = [ "indexmap 2.1.0", ] -[[package]] -name = "phf" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" -dependencies = [ - "phf_macros", - "phf_shared", - "proc-macro-hack", -] - -[[package]] -name = "phf_generator" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" -dependencies = [ - "phf_shared", - "rand 0.8.5", -] - -[[package]] -name = "phf_macros" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro-hack", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "phf_shared" version = "0.10.0" @@ -3412,24 +3235,30 @@ dependencies = [ "siphasher", ] +[[package]] +name = "pico-args" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" + [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -3467,32 +3296,21 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" [[package]] name = "platforms" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14e6ab3f592e6fb464fc9712d8d6e6912de6473954635fd76a589d832cffcbb0" - -[[package]] -name = "pmutil" -version = "0.6.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a40bc70c2c58040d2d8b167ba9a5ff59fc9dab7ad44771cfde3dcfde7a09c6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.39", -] +checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" [[package]] name = "portable-atomic" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bccab0e7fd7cc19f820a1c8c91720af652d0c88dc9664dd72aef2614f04af3b" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "powerfmt" @@ -3528,62 +3346,31 @@ dependencies = [ [[package]] name = "primeorder" -version = "0.13.3" +version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7dbe9ed3b56368bd99483eb32fe9c17fdd3730aebadc906918ce78d54c7eeb4" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" dependencies = [ "elliptic-curve", ] [[package]] name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - -[[package]] -name = "proc-macro-crate" -version = "2.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "toml_edit 0.20.7", + "toml_edit 0.21.0", ] -[[package]] -name = "proc-macro-hack" -version = "0.5.20+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" - [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] -[[package]] -name = "procfs" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943ca7f9f29bab5844ecd8fdb3992c5969b6622bb9609b9502fef9b4310e3f1f" -dependencies = [ - "bitflags 1.3.2", - "byteorder", - "chrono", - "flate2", - "hex", - "lazy_static", - "rustix 0.36.17", -] - [[package]] name = "proptest" version = "1.4.0" @@ -3592,7 +3379,7 @@ checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.4.1", + "bitflags 2.4.2", "lazy_static", "num-traits", "rand 0.8.5", @@ -3617,9 +3404,9 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fdd22f3b9c31b53c060df4a0613a1c7f062d4115a2b984dd15b1858f7e340d" +checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" dependencies = [ "bytes", "prost-derive", @@ -3627,22 +3414,22 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "265baba7fabd416cf5078179f7d2cbeca4ce7a9041111900675ea7c4cb8a4c32" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" dependencies = [ "anyhow", "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "prost-types" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e081b29f63d83a4bc75cfc9f3fe424f9156cf92d8a4f0c9407cce9a1b67327cf" +checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" dependencies = [ "prost", ] @@ -3653,15 +3440,6 @@ version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" -[[package]] -name = "psm" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" -dependencies = [ - "cc", -] - [[package]] name = "publicsuffix" version = "2.2.3" @@ -3680,9 +3458,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -3752,7 +3530,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.2.12", ] [[package]] @@ -3797,15 +3575,6 @@ dependencies = [ "bitflags 1.3.2", ] -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.4.1" @@ -3821,20 +3590,20 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.2.12", "libredox", "thiserror", ] [[package]] name = "regex" -version = "1.10.2" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.3", + "regex-automata 0.4.5", "regex-syntax 0.8.2", ] @@ -3849,9 +3618,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick", "memchr", @@ -3864,6 +3633,12 @@ version = "0.6.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +[[package]] +name = "regex-syntax" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" + [[package]] name = "regex-syntax" version = "0.8.2" @@ -3872,21 +3647,21 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" -version = "0.11.22" +version = "0.11.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" +checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "bytes", "cookie 0.16.2", "cookie_store 0.16.2", "encoding_rs", "futures-core", "futures-util", - "h2", - "http", - "http-body", - "hyper", + "h2 0.3.24", + "http 0.2.11", + "http-body 0.4.6", + "hyper 0.14.28", "hyper-tls", "ipnet", "js-sys", @@ -3937,12 +3712,12 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.5" +version = "0.17.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" dependencies = [ "cc", - "getrandom 0.2.11", + "getrandom 0.2.12", "libc", "spin 0.9.8", "untrusted", @@ -3962,24 +3737,53 @@ dependencies = [ [[package]] name = "rpc-toolkit" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5353673ffd8265292281141560d2b851e4da49e83e2f5e255fd473736d45ee10" +checksum = "c48252a30abb9426a3239fa8dfd2c8dd2647bb24db0b6145db2df04ae53fe647" dependencies = [ "clap 3.2.25", "futures", - "hyper", + "hyper 0.14.28", "lazy_static", "openssl", "reqwest", - "rpc-toolkit-macro", + "rpc-toolkit-macro 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde", "serde_cbor 0.11.2", "serde_json", "thiserror", "tokio", "url", - "yajrc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "yajrc", +] + +[[package]] +name = "rpc-toolkit" +version = "0.2.3" +source = "git+https://github.com/Start9Labs/rpc-toolkit.git?branch=refactor/traits#8d714d09a327249f16f77a8f5a160a2b7cfbf380" +dependencies = [ + "async-stream", + "async-trait", + "axum 0.7.4", + "clap 4.4.18", + "futures", + "http 1.0.0", + "http-body-util", + "imbl-value", + "itertools 0.12.0", + "lazy_format", + "lazy_static", + "openssl", + "pin-project", + "reqwest", + "rpc-toolkit-macro 0.2.2 (git+https://github.com/Start9Labs/rpc-toolkit.git?branch=refactor/traits)", + "serde", + "serde_json", + "thiserror", + "tokio", + "tokio-stream", + "url", + "yajrc", ] [[package]] @@ -3989,7 +3793,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8e4b9cb00baf2d61bcd35e98d67dcb760382a3b4540df7e63b38d053c8a7b8b" dependencies = [ "proc-macro2", - "rpc-toolkit-macro-internals", + "rpc-toolkit-macro-internals 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.109", +] + +[[package]] +name = "rpc-toolkit-macro" +version = "0.2.2" +source = "git+https://github.com/Start9Labs/rpc-toolkit.git?branch=refactor/traits#8d714d09a327249f16f77a8f5a160a2b7cfbf380" +dependencies = [ + "proc-macro2", + "rpc-toolkit-macro-internals 0.2.2 (git+https://github.com/Start9Labs/rpc-toolkit.git?branch=refactor/traits)", "syn 1.0.109", ] @@ -4005,11 +3819,22 @@ dependencies = [ ] [[package]] -name = "rsa" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ef35bf3e7fe15a53c4ab08a998e42271eab13eb0db224126bc7bc4c4bad96d" -dependencies = [ +name = "rpc-toolkit-macro-internals" +version = "0.2.2" +source = "git+https://github.com/Start9Labs/rpc-toolkit.git?branch=refactor/traits#8d714d09a327249f16f77a8f5a160a2b7cfbf380" +dependencies = [ + "itertools 0.12.0", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rsa" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +dependencies = [ "const-oid", "digest 0.10.7", "num-bigint-dig", @@ -4019,7 +3844,7 @@ dependencies = [ "pkcs8", "rand_core 0.6.4", "sha2 0.10.8", - "signature 2.0.0", + "signature 2.2.0", "spki", "subtle", "zeroize", @@ -4037,11 +3862,11 @@ dependencies = [ [[package]] name = "rust-argon2" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e71971821b3ae0e769e4a4328dbcb517607b434db7697e9aba17203ec14e46a" +checksum = "9d9848531d60c9cbbcf9d166c885316c24bc0e2a9d3eba0956bb6cbbd79bc6e8" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "blake2b_simd", "constant_time_eq", ] @@ -4052,67 +3877,51 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver 0.9.0", -] - [[package]] name = "rustc_version" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.20", + "semver", ] [[package]] name = "rustix" -version = "0.36.17" +version = "0.38.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "305efbd14fde4139eb501df5f136994bb520b033fa9fbdce287507dc23b8c7ed" +checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.2", "errno", - "io-lifetimes", "libc", - "linux-raw-sys 0.1.4", - "windows-sys 0.45.0", + "linux-raw-sys", + "windows-sys 0.52.0", ] [[package]] -name = "rustix" -version = "0.38.21" +name = "rustls" +version = "0.21.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ - "bitflags 2.4.1", - "errno", - "libc", - "linux-raw-sys 0.4.11", - "windows-sys 0.48.0", + "ring", + "rustls-webpki 0.101.7", + "sct", ] [[package]] name = "rustls" -version = "0.21.8" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" +checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" dependencies = [ "log", "ring", - "rustls-webpki", - "sct", + "rustls-pki-types", + "rustls-webpki 0.102.1", + "subtle", + "zeroize", ] [[package]] @@ -4121,9 +3930,15 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", ] +[[package]] +name = "rustls-pki-types" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e9d979b3ce68192e42760c7810125eb6cf2ea10efae545a156063e61f314e2a" + [[package]] name = "rustls-webpki" version = "0.101.7" @@ -4134,6 +3949,17 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustls-webpki" +version = "0.102.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4ca26037c909dedb327b48c3327d0ba91d3dd3c4e05dad328f210ffb68e95b" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.14" @@ -4152,27 +3978,37 @@ dependencies = [ "wait-timeout", ] +[[package]] +name = "rustyline-async" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca4447465ceb8c01c253cc81660b242547c58e4a59c85b13294a6e70de8b9e" +dependencies = [ + "crossterm", + "futures-channel", + "futures-util", + "pin-project", + "thingbuf", + "thiserror", + "unicode-segmentation", + "unicode-width", +] + [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - [[package]] name = "scopeguard" version = "1.2.0" @@ -4228,33 +4064,18 @@ dependencies = [ [[package]] name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" dependencies = [ "serde", ] -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - [[package]] name = "serde" -version = "1.0.192" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" +checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" dependencies = [ "serde_derive", ] @@ -4268,20 +4089,11 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_bytes" -version = "0.11.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" -dependencies = [ - "serde", -] - [[package]] name = "serde_cbor" version = "0.11.1" dependencies = [ - "half", + "half 1.8.2", "serde", ] @@ -4291,26 +4103,26 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" dependencies = [ - "half", + "half 1.8.2", "serde", ] [[package]] name = "serde_derive" -version = "1.0.192" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" +checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.112" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "4d1bd37ce2324cf3bf85e5a25f96eb4baf0d5aa6eba43e7ae8958870c4ec48ed" dependencies = [ "indexmap 2.1.0", "itoa", @@ -4318,11 +4130,21 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_path_to_error" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebd154a240de39fdebcf5775d2675c204d7c13cf39a4c697be6493c8e734337c" +dependencies = [ + "itoa", + "serde", +] + [[package]] name = "serde_spanned" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" dependencies = [ "serde", ] @@ -4339,29 +4161,13 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_v8" -version = "0.131.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38cafa16d0a4288d75925351bb54d06d2e830118ad3fad393947bb11f91b18f3" -dependencies = [ - "bytes", - "derive_more", - "num-bigint", - "serde", - "serde_bytes", - "smallvec", - "thiserror", - "v8", -] - [[package]] name = "serde_with" -version = "3.4.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64cd236ccc1b7a29e7e2739f27c0b2dd199804abc4290e32f59f3b68d6405c23" +checksum = "f5c9fdb6b00a489875b22efd4b78fe2b363b72265cc5f6eb2e2b9ee270e6140c" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "chrono", "hex", "indexmap 1.9.3", @@ -4374,21 +4180,21 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.4.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93634eb5f75a2323b16de4748022ac4297f9e76b6dced2be287a099f41b5e788" +checksum = "dbff351eb4b33600a2e138dfa0b10b65a238ea8ff8fb2387c422c5022a3e8298" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "serde_yaml" -version = "0.9.27" +version = "0.9.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cc7a1570e38322cfe4154732e5110f887ea57e22b76f4bfd32b5bdd3368666c" +checksum = "b1bf28c79a99f70ee1f1d83d10c875d2e70618417fda01ad1785e027579d9d38" dependencies = [ "indexmap 2.1.0", "itoa", @@ -4397,24 +4203,13 @@ dependencies = [ "unsafe-libyaml", ] -[[package]] -name = "sha-1" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.10.7", -] - [[package]] name = "sha1" version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "digest 0.10.7", ] @@ -4426,7 +4221,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ "block-buffer 0.9.0", - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "digest 0.9.0", "opaque-debug", @@ -4438,7 +4233,7 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "digest 0.10.7", ] @@ -4465,10 +4260,31 @@ dependencies = [ ] [[package]] -name = "shlex" -version = "0.1.1" +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + +[[package]] +name = "signal-hook" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-mio" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" +checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" +dependencies = [ + "libc", + "mio", + "signal-hook", +] [[package]] name = "signal-hook-registry" @@ -4487,9 +4303,9 @@ checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" [[package]] name = "signature" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fe458c98333f9c8152221191a77e2a44e8325d0193484af2e9421a53019e57d" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest 0.10.7", "rand_core 0.6.4", @@ -4523,39 +4339,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" - -[[package]] -name = "smartstring" -version = "1.0.1" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29" -dependencies = [ - "autocfg", - "static_assertions", - "version_check", -] - -[[package]] -name = "snapshot_creator" -version = "0.1.0" -dependencies = [ - "dashmap", - "deno_ast", - "deno_core", -] - -[[package]] -name = "socket2" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" -dependencies = [ - "libc", - "winapi", -] +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "socket2" @@ -4567,38 +4353,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "sourcemap" -version = "6.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4cbf65ca7dc576cf50e21f8d0712d96d4fcfd797389744b7b222a85cdf5bd90" -dependencies = [ - "data-encoding", - "debugid", - "if_chain", - "rustc_version 0.2.3", - "serde", - "serde_json", - "unicode-id", - "url", -] - -[[package]] -name = "sourcemap" -version = "7.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10da010a590ed2fa9ca8467b00ce7e9c5a8017742c0c09c45450efc172208c4b" -dependencies = [ - "data-encoding", - "debugid", - "if_chain", - "rustc_version 0.2.3", - "serde", - "serde_json", - "unicode-id", - "url", -] - [[package]] name = "spin" version = "0.5.2" @@ -4616,9 +4370,9 @@ dependencies = [ [[package]] name = "spki" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", "der", @@ -4626,20 +4380,20 @@ dependencies = [ [[package]] name = "sqlformat" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7b278788e7be4d0d29c0f39497a0eef3fba6bbc8e70d8bf7fde46edeaa9e85" +checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" dependencies = [ - "itertools 0.11.0", - "nom 7.1.3", + "itertools 0.12.0", + "nom", "unicode_categories", ] [[package]] name = "sqlx" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e50c216e3624ec8e7ecd14c6a6a6370aad6ee5d8cfc3ab30b5162eeeef2ed33" +checksum = "dba03c279da73694ef99763320dea58b51095dfe87d001b1d4b5fe78ba8763cf" dependencies = [ "sqlx-core", "sqlx-macros", @@ -4650,11 +4404,11 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d6753e460c998bbd4cd8c6f0ed9a64346fcca0723d6e75e52fdc351c5d2169d" +checksum = "d84b0a3c3739e220d94b3239fd69fb1f74bc36e16643423bd99de3b43c21bfbd" dependencies = [ - "ahash 0.8.6", + "ahash 0.8.7", "atoi", "byteorder", "bytes", @@ -4677,7 +4431,7 @@ dependencies = [ "once_cell", "paste", "percent-encoding", - "rustls", + "rustls 0.21.10", "rustls-pemfile", "serde", "serde_json", @@ -4694,9 +4448,9 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a793bb3ba331ec8359c1853bd39eed32cdd7baaf22c35ccf5c92a7e8d1189ec" +checksum = "89961c00dc4d7dffb7aee214964b065072bff69e36ddb9e2c107541f75e4f2a5" dependencies = [ "proc-macro2", "quote", @@ -4707,10 +4461,11 @@ dependencies = [ [[package]] name = "sqlx-macros-core" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a4ee1e104e00dedb6aa5ffdd1343107b0a4702e862a84320ee7cc74782d96fc" +checksum = "d0bd4519486723648186a08785143599760f7cc81c52334a55d6a83ea1e20841" dependencies = [ + "atomic-write-file", "dotenvy", "either", "heck", @@ -4733,13 +4488,13 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "864b869fdf56263f4c95c45483191ea0af340f9f3e3e7b4d57a61c7c87a970db" +checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4" dependencies = [ "atoi", - "base64 0.21.5", - "bitflags 2.4.1", + "base64 0.21.7", + "bitflags 2.4.2", "byteorder", "bytes", "chrono", @@ -4776,13 +4531,13 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb7ae0e6a97fb3ba33b23ac2671a5ce6e3cabe003f451abd5a56e7951d975624" +checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24" dependencies = [ "atoi", - "base64 0.21.5", - "bitflags 2.4.1", + "base64 0.21.7", + "bitflags 2.4.2", "byteorder", "chrono", "crc", @@ -4816,9 +4571,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59dc83cf45d89c555a577694534fcd1b55c545a816c816ce51f20bbe56a4f3f" +checksum = "210976b7d948c7ba9fced8ca835b11cbb2d677c59c79de41ac0d397e14547490" dependencies = [ "atoi", "chrono", @@ -4835,6 +4590,7 @@ dependencies = [ "sqlx-core", "tracing", "url", + "urlencoding", ] [[package]] @@ -4859,8 +4615,8 @@ dependencies = [ "proc-macro2", "quote", "regex-syntax 0.6.29", - "strsim 0.10.0", - "syn 2.0.39", + "strsim", + "syn 2.0.48", "unicode-width", ] @@ -4887,43 +4643,25 @@ dependencies = [ [[package]] name = "ssh-key" -version = "0.6.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2180b3bc4955efd5661a97658d3cf4c8107e0d132f619195afe9486c13cca313" +checksum = "01f8f4ea73476c0aa5d5e6a75ce1e8634e2c3f82005ef3bbed21547ac57f2bf7" dependencies = [ - "ed25519-dalek 2.0.0", + "ed25519-dalek 2.1.0", "p256", "p384", + "p521", "rand_core 0.6.4", "rsa", "sec1", "sha2 0.10.8", - "signature 2.0.0", + "signature 2.2.0", "ssh-cipher", "ssh-encoding", "subtle", "zeroize", ] -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "stacker" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c886bd4480155fd3ef527d45e9ac8dd7118a898a46530b7b94c3e21866259fce" -dependencies = [ - "cc", - "cfg-if 1.0.0", - "libc", - "psm", - "winapi", -] - [[package]] name = "start-os" version = "0.3.5-rev.1" @@ -4932,20 +4670,20 @@ dependencies = [ "async-compression", "async-stream", "async-trait", - "avahi-sys", + "axum 0.7.4", + "axum-server", "base32", - "base64 0.21.5", + "base64 0.21.7", "base64ct", "basic-cookies", "blake3", "bytes", "chrono", "ciborium", - "clap 3.2.25", + "clap 4.4.18", "color-eyre", "console", "console-subscriber", - "container-init", "cookie 0.18.0", "cookie_store 0.20.0", "current_platform", @@ -4953,540 +4691,144 @@ dependencies = [ "divrem", "ed25519 2.2.3", "ed25519-dalek 1.0.1", - "ed25519-dalek 2.0.0", + "ed25519-dalek 2.1.0", "emver", "fd-lock-rs", "futures", "gpt", - "helpers", - "hex", - "hmac 0.12.1", - "http", - "hyper", - "hyper-ws-listener", - "imbl", - "imbl-value", - "include_dir", - "indexmap 2.1.0", - "indicatif", - "integer-encoding", - "ipnet", - "iprange", - "isocountry", - "itertools 0.11.0", - "jaq-core", - "jaq-std", - "josekit", - "jsonpath_lib", - "lazy_static", - "libc", - "log", - "mbrman", - "models", - "new_mime_guess", - "nix 0.27.1", - "nom 7.1.3", - "num", - "num_enum", - "openssh-keys", - "openssl", - "p256", - "patch-db", - "pbkdf2", - "pin-project", - "pkcs8", - "prettytable-rs", - "proptest", - "proptest-derive", - "rand 0.8.5", - "regex", - "reqwest", - "reqwest_cookie_store", - "rpassword", - "rpc-toolkit", - "rust-argon2", - "scopeguard", - "semver 1.0.20", - "serde", - "serde_json", - "serde_with", - "serde_yaml", - "sha2 0.10.8", - "simple-logging", - "sqlx", - "sscanf", - "ssh-key", - "stderrlog", - "tar", - "thiserror", - "tokio", - "tokio-rustls", - "tokio-socks", - "tokio-stream", - "tokio-tar", - "tokio-tungstenite", - "tokio-util", - "toml 0.8.8", - "torut", - "tracing", - "tracing-error", - "tracing-futures", - "tracing-journald", - "tracing-subscriber", - "trust-dns-server", - "typed-builder", - "url", - "urlencoding", - "uuid", - "zeroize", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "stderrlog" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69a26bbf6de627d389164afa9783739b56746c6c72c4ed16539f4ff54170327b" -dependencies = [ - "atty", - "chrono", - "log", - "termcolor", - "thread_local", -] - -[[package]] -name = "string_cache" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" -dependencies = [ - "new_debug_unreachable", - "once_cell", - "parking_lot", - "phf_shared", - "precomputed-hash", - "serde", -] - -[[package]] -name = "string_cache_codegen" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2", - "quote", -] - -[[package]] -name = "string_enum" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fa4d4f81d7c05b9161f8de839975d3326328b8ba2831164b465524cc2f55252" -dependencies = [ - "pmutil", - "proc-macro2", - "quote", - "swc_macros_common", - "syn 2.0.39", -] - -[[package]] -name = "stringprep" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" -dependencies = [ - "finl_unicode", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strum" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.39", -] - -[[package]] -name = "subtle" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" - -[[package]] -name = "swc_atoms" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f54563d7dcba626d4acfe14ed12def7ecc28e004debe3ecd2c3ee07cc47e449" -dependencies = [ - "once_cell", - "rustc-hash", - "serde", - "string_cache", - "string_cache_codegen", - "triomphe", -] - -[[package]] -name = "swc_common" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cb7fcd56655c8ae7dcf2344f0be6cbff4d9c7cb401fe3ec8e56e1de8dfe582" -dependencies = [ - "ast_node", - "better_scoped_tls", - "cfg-if 1.0.0", - "either", - "from_variant", - "new_debug_unreachable", - "num-bigint", - "once_cell", - "rustc-hash", - "serde", - "siphasher", - "sourcemap 6.4.1", - "string_cache", - "swc_atoms", - "swc_eq_ignore_macros", - "swc_visit", - "tracing", - "unicode-width", - "url", -] - -[[package]] -name = "swc_config" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba1c7a40d38f9dd4e9a046975d3faf95af42937b34b2b963be4d8f01239584b" -dependencies = [ - "indexmap 1.9.3", - "serde", - "serde_json", - "swc_config_macro", -] - -[[package]] -name = "swc_config_macro" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5b5aaca9a0082be4515f0fbbecc191bf5829cd25b5b9c0a2810f6a2bb0d6829" -dependencies = [ - "pmutil", - "proc-macro2", - "quote", - "swc_macros_common", - "syn 2.0.39", -] - -[[package]] -name = "swc_ecma_ast" -version = "0.109.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bc2286cedd688a68f214faa1c19bb5cceab7c9c54d0cbe3273e4c1704e38f69" -dependencies = [ - "bitflags 2.4.1", - "is-macro", - "num-bigint", - "scoped-tls", - "serde", - "string_enum", - "swc_atoms", - "swc_common", - "unicode-id", -] - -[[package]] -name = "swc_ecma_codegen" -version = "0.144.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e62ba2c0ed1f119fc1a76542d007f1b2c12854d54dea15f5491363227debe11" -dependencies = [ - "memchr", - "num-bigint", - "once_cell", - "rustc-hash", - "serde", - "sourcemap 6.4.1", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "swc_ecma_codegen_macros", - "tracing", -] - -[[package]] -name = "swc_ecma_codegen_macros" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcdff076dccca6cc6a0e0b2a2c8acfb066014382bc6df98ec99e755484814384" -dependencies = [ - "pmutil", - "proc-macro2", - "quote", - "swc_macros_common", - "syn 2.0.39", -] - -[[package]] -name = "swc_ecma_loader" -version = "0.44.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7d7c322462657ae27ac090a2c89f7e456c94416284a2f5ecf66c43a6a3c19d1" -dependencies = [ - "anyhow", - "pathdiff", - "serde", - "swc_common", - "tracing", -] - -[[package]] -name = "swc_ecma_parser" -version = "0.139.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eab46cb863bc5cd61535464e07e5b74d5f792fa26a27b9f6fd4c8daca9903b7" -dependencies = [ - "either", - "num-bigint", - "num-traits", - "serde", - "smallvec", - "smartstring", - "stacker", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "tracing", - "typed-arena", -] - -[[package]] -name = "swc_ecma_transforms_base" -version = "0.132.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ffd4a8149052bfc1ec1832fcbe04f317846ce635a49ec438df33b06db27d26" -dependencies = [ - "better_scoped_tls", - "bitflags 2.4.1", - "indexmap 1.9.3", - "once_cell", - "phf", - "rustc-hash", - "serde", - "smallvec", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "swc_ecma_parser", - "swc_ecma_utils", - "swc_ecma_visit", - "tracing", -] - -[[package]] -name = "swc_ecma_transforms_classes" -version = "0.121.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4b7fee0e2c6f12456d2aefb2418f2f26529b995945d493e1dce35a5a22584fc" -dependencies = [ - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "swc_ecma_transforms_base", - "swc_ecma_utils", - "swc_ecma_visit", -] - -[[package]] -name = "swc_ecma_transforms_macros" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8188eab297da773836ef5cf2af03ee5cca7a563e1be4b146f8141452c28cc690" -dependencies = [ - "pmutil", - "proc-macro2", - "quote", - "swc_macros_common", - "syn 2.0.39", -] - -[[package]] -name = "swc_ecma_transforms_proposal" -version = "0.166.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122fd9a69f464694edefbf9c59106b3c15e5cc8cb8575a97836e4fb79018e98f" -dependencies = [ - "either", - "rustc-hash", - "serde", - "smallvec", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "swc_ecma_transforms_base", - "swc_ecma_transforms_classes", - "swc_ecma_transforms_macros", - "swc_ecma_utils", - "swc_ecma_visit", -] - -[[package]] -name = "swc_ecma_transforms_react" -version = "0.178.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "675b5c755b0448268830e85e59429095d3423c0ce4a850b209c6f0eeab069f63" -dependencies = [ - "base64 0.13.1", - "dashmap", - "indexmap 1.9.3", + "helpers", + "hex", + "hmac 0.12.1", + "http 1.0.0", + "imbl", + "imbl-value", + "include_dir", + "indexmap 2.1.0", + "indicatif", + "integer-encoding", + "ipnet", + "iprange", + "isocountry", + "itertools 0.12.0", + "jaq-core", + "jaq-std", + "josekit", + "jsonpath_lib", + "lazy_async_pool", + "lazy_format", + "lazy_static", + "libc", + "log", + "mbrman", + "models", + "new_mime_guess", + "nix 0.27.1", + "nom", + "num", + "num_enum", "once_cell", + "openssh-keys", + "openssl", + "p256", + "patch-db", + "pbkdf2", + "pin-project", + "pkcs8", + "prettytable-rs", + "proptest", + "proptest-derive", + "rand 0.8.5", + "regex", + "reqwest", + "reqwest_cookie_store", + "rpassword", + "rpc-toolkit 0.2.3 (git+https://github.com/Start9Labs/rpc-toolkit.git?branch=refactor/traits)", + "rust-argon2", + "rustyline-async", + "semver", "serde", - "sha-1", - "string_enum", - "swc_atoms", - "swc_common", - "swc_config", - "swc_ecma_ast", - "swc_ecma_parser", - "swc_ecma_transforms_base", - "swc_ecma_transforms_macros", - "swc_ecma_utils", - "swc_ecma_visit", -] - -[[package]] -name = "swc_ecma_transforms_typescript" -version = "0.182.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eba97b1ea71739fcf278aedad4677a3cacb52288a3f3566191b70d16a889de6" -dependencies = [ - "serde", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "swc_ecma_transforms_base", - "swc_ecma_transforms_react", - "swc_ecma_utils", - "swc_ecma_visit", -] - -[[package]] -name = "swc_ecma_utils" -version = "0.122.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11006a3398ffd4693c4d3b0a1b1a5030edbdc04228159f5301120a6178144708" -dependencies = [ - "indexmap 1.9.3", - "num_cpus", - "once_cell", - "rustc-hash", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "swc_ecma_visit", + "serde_json", + "serde_with", + "serde_yaml", + "sha2 0.10.8", + "shell-words", + "simple-logging", + "sqlx", + "sscanf", + "ssh-key", + "stderrlog", + "tar", + "thiserror", + "tokio", + "tokio-rustls", + "tokio-socks", + "tokio-stream", + "tokio-tar", + "tokio-tungstenite", + "tokio-util", + "toml 0.8.8", + "torut", "tracing", - "unicode-id", + "tracing-error", + "tracing-futures", + "tracing-journald", + "tracing-subscriber", + "trust-dns-server", + "typed-builder", + "url", + "urlencoding", + "uuid", + "zeroize", ] [[package]] -name = "swc_ecma_visit" -version = "0.95.0" +name = "stderrlog" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f628ec196e76e67892441e14eef2e423a738543d32bffdabfeec20c29582117" +checksum = "69a26bbf6de627d389164afa9783739b56746c6c72c4ed16539f4ff54170327b" dependencies = [ - "num-bigint", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "swc_visit", - "tracing", + "atty", + "chrono", + "log", + "termcolor", + "thread_local", ] [[package]] -name = "swc_eq_ignore_macros" -version = "0.1.2" +name = "string_cache" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05a95d367e228d52484c53336991fdcf47b6b553ef835d9159db4ba40efb0ee8" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" dependencies = [ - "pmutil", - "proc-macro2", - "quote", - "syn 2.0.39", + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared", + "precomputed-hash", ] [[package]] -name = "swc_macros_common" -version = "0.3.8" +name = "stringprep" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a273205ccb09b51fabe88c49f3b34c5a4631c4c00a16ae20e03111d6a42e832" +checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" dependencies = [ - "pmutil", - "proc-macro2", - "quote", - "syn 2.0.39", + "finl_unicode", + "unicode-bidi", + "unicode-normalization", ] [[package]] -name = "swc_visit" -version = "0.5.7" +name = "strsim" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e87c337fbb2d191bf371173dea6a957f01899adb8f189c6c31b122a6cfc98fc3" -dependencies = [ - "either", - "swc_visit_macros", -] +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] -name = "swc_visit_macros" -version = "0.5.8" +name = "subtle" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f322730fb82f3930a450ac24de8c98523af7d34ab8cb2f46bcb405839891a99" -dependencies = [ - "Inflector", - "pmutil", - "proc-macro2", - "quote", - "swc_macros_common", - "syn 2.0.39", -] +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" @@ -5501,9 +4843,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.39" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", @@ -5551,20 +4893,20 @@ checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" dependencies = [ "filetime", "libc", - "xattr 1.0.1", + "xattr 1.3.1", ] [[package]] name = "tempfile" -version = "3.8.1" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "fastrand", "redox_syscall 0.4.1", - "rustix 0.38.21", - "windows-sys 0.48.0", + "rustix", + "windows-sys 0.52.0", ] [[package]] @@ -5588,47 +4930,39 @@ dependencies = [ ] [[package]] -name = "text_lines" -version = "0.6.0" +name = "textwrap" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd5828de7deaa782e1dd713006ae96b3bee32d3279b79eb67ecf8072c059bcf" -dependencies = [ - "serde", -] +checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] -name = "textwrap" -version = "0.11.0" +name = "thingbuf" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +checksum = "4706f1bfb859af03f099ada2de3cea3e515843c2d3e93b7893f16d94a37f9415" dependencies = [ - "unicode-width", + "parking_lot", + "pin-project", ] -[[package]] -name = "textwrap" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" - [[package]] name = "thiserror" -version = "1.0.50" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -5648,15 +4982,15 @@ version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "once_cell", ] [[package]] name = "time" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" dependencies = [ "deranged", "itoa", @@ -5674,9 +5008,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" dependencies = [ "time-core", ] @@ -5707,9 +5041,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.34.0" +version = "1.35.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" +checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" dependencies = [ "backtrace", "bytes", @@ -5719,7 +5053,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.5", + "socket2", "tokio-macros", "tracing", "windows-sys 0.48.0", @@ -5743,7 +5077,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -5758,11 +5092,12 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.24.1" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" dependencies = [ - "rustls", + "rustls 0.22.2", + "rustls-pki-types", "tokio", ] @@ -5806,9 +5141,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.20.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" dependencies = [ "futures-util", "log", @@ -5878,17 +5213,6 @@ dependencies = [ "winnow", ] -[[package]] -name = "toml_edit" -version = "0.20.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" -dependencies = [ - "indexmap 2.1.0", - "toml_datetime", - "winnow", -] - [[package]] name = "toml_edit" version = "0.21.0" @@ -5910,13 +5234,13 @@ checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" dependencies = [ "async-stream", "async-trait", - "axum", - "base64 0.21.5", + "axum 0.6.20", + "base64 0.21.7", "bytes", - "h2", - "http", - "http-body", - "hyper", + "h2 0.3.24", + "http 0.2.11", + "http-body 0.4.6", + "hyper 0.14.28", "hyper-timeout", "percent-encoding", "pin-project", @@ -6001,7 +5325,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -6083,16 +5407,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "triomphe" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee8098afad3fb0c54a9007aab6804558410503ad676d4633f9c2559a00ac0f" -dependencies = [ - "serde", - "stable_deref_trait", -] - [[package]] name = "trust-dns-proto" version = "0.23.2" @@ -6100,7 +5414,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3119112651c157f4488931a01e586aa459736e9d6046d3bd9105ffb69352d374" dependencies = [ "async-trait", - "cfg-if 1.0.0", + "cfg-if", "data-encoding", "enum-as-inner", "futures-channel", @@ -6126,7 +5440,7 @@ checksum = "c540f73c2b2ec2f6c54eabd0900e7aafb747a820224b742f556e8faabb461bc7" dependencies = [ "async-trait", "bytes", - "cfg-if 1.0.0", + "cfg-if", "drain", "enum-as-inner", "futures-executor", @@ -6142,20 +5456,20 @@ dependencies = [ [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tungstenite" -version = "0.20.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" dependencies = [ "byteorder", "bytes", "data-encoding", - "http", + "http 1.0.0", "httparse", "log", "native-tls", @@ -6166,30 +5480,24 @@ dependencies = [ "utf-8", ] -[[package]] -name = "typed-arena" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" - [[package]] name = "typed-builder" -version = "0.17.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c6a006a6d3d6a6f143fda41cf4d1ad35110080687628c9f2117bd3cc7924f3" +checksum = "444d8748011b93cb168770e8092458cb0f8854f931ff82fdf6ddfbd72a9c933e" dependencies = [ "typed-builder-macro", ] [[package]] name = "typed-builder-macro" -version = "0.17.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fa054ee5e2346187d631d2f1d1fd3b33676772d6d03a2d84e1c5213b31674ee" +checksum = "563b3b88238ec95680aef36bdece66896eaa7ce3c0f1b4f39d38fb2435261352" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -6215,15 +5523,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" - -[[package]] -name = "unicode-id" -version = "0.3.4" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1b6def86329695390197b82c1e244a54a131ceb66c996f2088a3876e2ae083f" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" @@ -6266,9 +5568,9 @@ checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" [[package]] name = "unsafe-libyaml" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" +checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" [[package]] name = "untrusted" @@ -6278,12 +5580,12 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", - "idna 0.4.0", + "idna 0.5.0", "percent-encoding", "serde", ] @@ -6301,24 +5603,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] -name = "uuid" -version = "1.5.0" +name = "utf8parse" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc" -dependencies = [ - "getrandom 0.2.11", -] +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] -name = "v8" -version = "0.79.2" +name = "uuid" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15561535230812a1db89a696f1f16a12ae6c2c370c6b2241c68d4cb33963faf" +checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" dependencies = [ - "bitflags 1.3.2", - "fslock", - "once_cell", - "which 4.4.2", + "getrandom 0.2.12", ] [[package]] @@ -6333,12 +5629,6 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - [[package]] name = "version_check" version = "0.9.4" @@ -6377,36 +5667,36 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.88" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" +checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.88" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" +checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.38" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" +checksum = "bde2032aeb86bdfaecc8b261eef3cba735cc426c1f3a3416d1e0791be95fc461" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", "wasm-bindgen", "web-sys", @@ -6414,9 +5704,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.88" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" +checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6424,22 +5714,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.88" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" +checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.88" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" +checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" [[package]] name = "wasm-streams" @@ -6456,9 +5746,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.65" +version = "0.3.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" +checksum = "58cd2333b6e0be7a39605f0e255892fd7418a682d8da8fe042fe25128794d2ed" dependencies = [ "js-sys", "wasm-bindgen", @@ -6466,33 +5756,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888" -dependencies = [ - "rustls-webpki", -] - -[[package]] -name = "which" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d011071ae14a2f6671d0b74080ae0cd8ebf3a6f8c9589a2cd45f23126fe29724" -dependencies = [ - "libc", -] - -[[package]] -name = "which" -version = "4.4.2" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix 0.38.21", -] +checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" [[package]] name = "whoami" @@ -6533,20 +5799,11 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.51.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.42.2", + "windows-targets 0.52.0", ] [[package]] @@ -6559,18 +5816,12 @@ dependencies = [ ] [[package]] -name = "windows-targets" -version = "0.42.2" +name = "windows-sys" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-targets 0.52.0", ] [[package]] @@ -6589,10 +5840,19 @@ dependencies = [ ] [[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" +name = "windows-targets" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", +] [[package]] name = "windows_aarch64_gnullvm" @@ -6601,10 +5861,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" +name = "windows_aarch64_gnullvm" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" [[package]] name = "windows_aarch64_msvc" @@ -6613,10 +5873,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] -name = "windows_i686_gnu" -version = "0.42.2" +name = "windows_aarch64_msvc" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" [[package]] name = "windows_i686_gnu" @@ -6625,10 +5885,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] -name = "windows_i686_msvc" -version = "0.42.2" +name = "windows_i686_gnu" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" [[package]] name = "windows_i686_msvc" @@ -6637,10 +5897,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" +name = "windows_i686_msvc" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" [[package]] name = "windows_x86_64_gnu" @@ -6649,10 +5909,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" +name = "windows_x86_64_gnu" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" [[package]] name = "windows_x86_64_gnullvm" @@ -6661,10 +5921,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" +name = "windows_x86_64_gnullvm" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" [[package]] name = "windows_x86_64_msvc" @@ -6672,11 +5932,17 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + [[package]] name = "winnow" -version = "0.5.19" +version = "0.5.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" +checksum = "1931d78a9c73861da0134f453bb1f790ce49b2e30eba8410b4b79bac72b46a2d" dependencies = [ "memchr", ] @@ -6687,7 +5953,7 @@ version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "windows-sys 0.48.0", ] @@ -6711,29 +5977,20 @@ dependencies = [ [[package]] name = "xattr" -version = "1.0.1" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4686009f71ff3e5c4dbcf1a282d0a44db3f021ba69350cd42086b3e5f1c6985" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ "libc", + "linux-raw-sys", + "rustix", ] [[package]] name = "yajrc" -version = "0.1.0" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b40687b4c165cb760e35730055c8840f36897e7c98099b2d3d66ba8cb624c79a" -dependencies = [ - "anyhow", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "yajrc" -version = "0.1.0" -source = "git+https://github.com/dr-bonez/yajrc.git?branch=develop#72a22f7ac2197d7a5cdce4be601cf20e5280eec5" +checksum = "ce7af47ad983c2f8357333ef87d859e66deb7eef4bf6f9e1ae7b5e99044a48bf" dependencies = [ "anyhow", "serde", @@ -6747,7 +6004,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f355ab62ebe30b758c1f4ab096a306722c4b7dbfb9d8c07d18c70d71a945588" dependencies = [ - "ahash 0.8.6", + "ahash 0.8.7", "hashbrown 0.13.2", "lazy_static", "serde", @@ -6755,29 +6012,29 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.25" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd369a67c0edfef15010f980c3cbe45d7f651deac2cd67ce097cd801de16557" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.25" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2f140bda219a26ccc0cdb03dba58af72590c53b22642577d88a927bc5c87d6b" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" dependencies = [ "zeroize_derive", ] @@ -6790,5 +6047,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] diff --git a/core/Cargo.toml b/core/Cargo.toml index 143a830fc..5b6823df2 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -1,3 +1,3 @@ [workspace] -members = ["container-init", "helpers", "models", "snapshot-creator", "startos"] +members = ["helpers", "models", "startos"] diff --git a/core/README.md b/core/README.md index 7a4be62a1..76f4d4c86 100644 --- a/core/README.md +++ b/core/README.md @@ -8,9 +8,6 @@ ## Structure - `startos`: This contains the core library for StartOS that supports building `startbox`. -- `container-init` (ignore: deprecated) -- `js-engine`: This contains the library required to build `deno` to support running `.js` maintainer scripts for v0.3 -- `snapshot-creator`: This contains a binary used to build `v8` runtime snapshots, required for initializing `start-deno` - `helpers`: This contains utility functions used across both `startos` and `js-engine` - `models`: This contains types that are shared across `startos`, `js-engine`, and `helpers` @@ -24,8 +21,6 @@ several different names for different behaviour: `startd` and control it similarly to the UI - `start-sdk`: This is a CLI tool that aids in building and packaging services you wish to deploy to StartOS -- `start-deno`: This is a CLI tool invoked by startd to run `.js` maintainer scripts for v0.3 -- `avahi-alias`: This is a CLI tool invoked by startd to create aliases in `avahi` for mDNS ## Questions diff --git a/core/build-prod.sh b/core/build-prod.sh index 214429727..0588384dc 100755 --- a/core/build-prod.sh +++ b/core/build-prod.sh @@ -18,22 +18,22 @@ cd .. FEATURES="$(echo $ENVIRONMENT | sed 's/-/,/g')" RUSTFLAGS="" -alias 'rust-gnu-builder'='docker run $USE_TTY --rm -e "RUSTFLAGS=$RUSTFLAGS" -v "$HOME/.cargo/registry":/usr/local/cargo/registry -v "$(pwd)":/home/rust/src -w /home/rust/src -P start9/rust-arm-cross:aarch64' -alias 'rust-musl-builder'='docker run $USE_TTY --rm -v "$HOME/.cargo/registry":/root/.cargo/registry -v "$(pwd)":/home/rust/src -P messense/rust-musl-cross:$ARCH-musl' +if [[ "${ENVIRONMENT}" =~ (^|-)unstable($|-) ]]; then + RUSTFLAGS="--cfg tokio_unstable" +fi + +alias 'rust-musl-builder'='docker run $USE_TTY --rm -e "RUSTFLAGS=$RUSTFLAGS" -v "$HOME/.cargo/registry":/root/.cargo/registry -v "$(pwd)":/home/rust/src -w /home/rust/src -P messense/rust-musl-cross:$ARCH-musl' set +e fail= echo "FEATURES=\"$FEATURES\"" echo "RUSTFLAGS=\"$RUSTFLAGS\"" -if ! rust-gnu-builder sh -c "(cd core && cargo build --release --features avahi-alias,$FEATURES --locked --bin startbox --target=$ARCH-unknown-linux-gnu)"; then +if ! rust-musl-builder sh -c "(cd core && cargo build --release $(if [ -n "$FEATURES" ]; then echo "--features $FEATURES"; fi) --locked --bin startbox --target=$ARCH-unknown-linux-musl)"; then + fail=true +fi +if ! rust-musl-builder sh -c "(cd core && cargo build --release --no-default-features --features container-runtime,$FEATURES --locked --bin containerbox --target=$ARCH-unknown-linux-musl)"; then fail=true fi -for ARCH in x86_64 aarch64 -do - if ! rust-musl-builder sh -c "(cd core && cargo build --release --locked --bin container-init)"; then - fail=true - fi -done set -e cd core diff --git a/core/build-v8-snapshot.sh b/core/build-v8-snapshot.sh deleted file mode 100755 index 58ff27c79..000000000 --- a/core/build-v8-snapshot.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash -# Reason for this being is that we need to create a snapshot for the deno runtime. It wants to pull 3 files from build, and during the creation it gets embedded, but for some -# reason during the actual runtime it is looking for them. So this will create a docker in arm that creates the snaphot needed for the arm - -cd "$(dirname "${BASH_SOURCE[0]}")" - -set -e -shopt -s expand_aliases - -if [ -z "$ARCH" ]; then - ARCH=$(uname -m) -fi - -USE_TTY= -if tty -s; then - USE_TTY="-it" -fi - -alias 'rust-gnu-builder'='docker run $USE_TTY --rm -v "$HOME/.cargo/registry":/usr/local/cargo/registry -v "$(pwd)":/home/rust/src -w /home/rust/src -P start9/rust-arm-cross:aarch64' - -echo "Building " -cd .. -rust-gnu-builder sh -c "(cd core/ && cargo build -p snapshot_creator --release --target=${ARCH}-unknown-linux-gnu)" -cd - - -if [ "$ARCH" = "aarch64" ]; then - DOCKER_ARCH='arm64/v8' -elif [ "$ARCH" = "x86_64" ]; then - DOCKER_ARCH='amd64' -fi - -echo "Creating Arm v8 Snapshot" -docker run $USE_TTY --platform "linux/${DOCKER_ARCH}" --mount type=bind,src=$(pwd),dst=/mnt ubuntu:22.04 /bin/sh -c "cd /mnt && /mnt/target/${ARCH}-unknown-linux-gnu/release/snapshot_creator" -sudo chown -R $USER target -sudo chown -R $USER ~/.cargo -sudo chown $USER JS_SNAPSHOT.bin -sudo chmod 0644 JS_SNAPSHOT.bin - -sudo mv -f JS_SNAPSHOT.bin ./js-engine/src/artifacts/JS_SNAPSHOT.${ARCH}.bin \ No newline at end of file diff --git a/core/container-init/Cargo.toml b/core/container-init/Cargo.toml deleted file mode 100644 index 8229973d7..000000000 --- a/core/container-init/Cargo.toml +++ /dev/null @@ -1,39 +0,0 @@ -[package] -name = "container-init" -version = "0.1.0" -edition = "2021" -rust = "1.66" - -[features] -dev = [] -metal = [] -sound = [] -unstable = [] - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[dependencies] -async-stream = "0.3" -# cgroups-rs = "0.2" -color-eyre = "0.6" -futures = "0.3" -serde = { version = "1", features = ["derive", "rc"] } -serde_json = "1" -helpers = { path = "../helpers" } -imbl = "2" -nix = { version = "0.27", features = ["process", "signal"] } -tokio = { version = "1", features = ["full"] } -tokio-stream = { version = "0.1", features = ["io-util", "sync", "net"] } -tracing = "0.1" -tracing-error = "0.2" -tracing-futures = "0.2" -tracing-subscriber = { version = "0.3", features = ["env-filter"] } -yajrc = { version = "*", git = "https://github.com/dr-bonez/yajrc.git", branch = "develop" } - -[target.'cfg(target_os = "linux")'.dependencies] -procfs = "0.15" - -[profile.test] -opt-level = 3 - -[profile.dev.package.backtrace] -opt-level = 3 diff --git a/core/container-init/src/lib.rs b/core/container-init/src/lib.rs deleted file mode 100644 index 63d3380a7..000000000 --- a/core/container-init/src/lib.rs +++ /dev/null @@ -1,214 +0,0 @@ -use nix::unistd::Pid; -use serde::{Deserialize, Serialize, Serializer}; -use yajrc::RpcMethod; - -/// Know what the process is called -#[derive(Debug, Serialize, Deserialize, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct ProcessId(pub u32); -impl From for Pid { - fn from(pid: ProcessId) -> Self { - Pid::from_raw(pid.0 as i32) - } -} -impl From for ProcessId { - fn from(pid: Pid) -> Self { - ProcessId(pid.as_raw() as u32) - } -} -impl From for ProcessId { - fn from(pid: i32) -> Self { - ProcessId(pid as u32) - } -} - -#[derive(Debug, Serialize, Deserialize, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct ProcessGroupId(pub u32); - -#[derive(Debug, Serialize, Deserialize, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] -#[serde(rename_all = "kebab-case")] -pub enum OutputStrategy { - Inherit, - Collect, -} - -#[derive(Debug, Clone, Copy)] -pub struct RunCommand; -impl Serialize for RunCommand { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - Serialize::serialize(Self.as_str(), serializer) - } -} -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct RunCommandParams { - pub gid: Option, - pub command: String, - pub args: Vec, - pub output: OutputStrategy, -} -impl RpcMethod for RunCommand { - type Params = RunCommandParams; - type Response = ProcessId; - fn as_str<'a>(&'a self) -> &'a str { - "command" - } -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub enum LogLevel { - Trace(String), - Warn(String), - Error(String), - Info(String), - Debug(String), -} -impl LogLevel { - pub fn trace(&self) { - match self { - LogLevel::Trace(x) => tracing::trace!("{}", x), - LogLevel::Warn(x) => tracing::warn!("{}", x), - LogLevel::Error(x) => tracing::error!("{}", x), - LogLevel::Info(x) => tracing::info!("{}", x), - LogLevel::Debug(x) => tracing::debug!("{}", x), - } - } -} - -#[derive(Debug, Clone, Copy)] -pub struct Log; -impl Serialize for Log { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - Serialize::serialize(Self.as_str(), serializer) - } -} -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct LogParams { - pub gid: Option, - pub level: LogLevel, -} -impl RpcMethod for Log { - type Params = LogParams; - type Response = (); - fn as_str<'a>(&'a self) -> &'a str { - "log" - } -} - -#[derive(Debug, Clone, Copy)] -pub struct ReadLineStdout; -impl Serialize for ReadLineStdout { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - Serialize::serialize(Self.as_str(), serializer) - } -} -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ReadLineStdoutParams { - pub pid: ProcessId, -} -impl RpcMethod for ReadLineStdout { - type Params = ReadLineStdoutParams; - type Response = String; - fn as_str<'a>(&'a self) -> &'a str { - "read-line-stdout" - } -} - -#[derive(Debug, Clone, Copy)] -pub struct ReadLineStderr; -impl Serialize for ReadLineStderr { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - Serialize::serialize(Self.as_str(), serializer) - } -} -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ReadLineStderrParams { - pub pid: ProcessId, -} -impl RpcMethod for ReadLineStderr { - type Params = ReadLineStderrParams; - type Response = String; - fn as_str<'a>(&'a self) -> &'a str { - "read-line-stderr" - } -} - -#[derive(Debug, Clone, Copy)] -pub struct Output; -impl Serialize for Output { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - Serialize::serialize(Self.as_str(), serializer) - } -} -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct OutputParams { - pub pid: ProcessId, -} -impl RpcMethod for Output { - type Params = OutputParams; - type Response = String; - fn as_str<'a>(&'a self) -> &'a str { - "output" - } -} - -#[derive(Debug, Clone, Copy)] -pub struct SendSignal; -impl Serialize for SendSignal { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - Serialize::serialize(Self.as_str(), serializer) - } -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct SendSignalParams { - pub pid: ProcessId, - pub signal: u32, -} -impl RpcMethod for SendSignal { - type Params = SendSignalParams; - type Response = (); - fn as_str<'a>(&'a self) -> &'a str { - "signal" - } -} - -#[derive(Debug, Clone, Copy)] -pub struct SignalGroup; -impl Serialize for SignalGroup { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - Serialize::serialize(Self.as_str(), serializer) - } -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct SignalGroupParams { - pub gid: ProcessGroupId, - pub signal: u32, -} -impl RpcMethod for SignalGroup { - type Params = SignalGroupParams; - type Response = (); - fn as_str<'a>(&'a self) -> &'a str { - "signal-group" - } -} diff --git a/core/container-init/src/main.rs b/core/container-init/src/main.rs deleted file mode 100644 index 997537808..000000000 --- a/core/container-init/src/main.rs +++ /dev/null @@ -1,428 +0,0 @@ -use std::collections::BTreeMap; -use std::ops::DerefMut; -use std::os::unix::process::ExitStatusExt; -use std::process::Stdio; -use std::sync::Arc; - -use container_init::{ - LogParams, OutputParams, OutputStrategy, ProcessGroupId, ProcessId, RunCommandParams, - SendSignalParams, SignalGroupParams, -}; -use futures::StreamExt; -use helpers::NonDetachingJoinHandle; -use nix::errno::Errno; -use nix::sys::signal::Signal; -use serde::{Deserialize, Serialize}; -use serde_json::json; -use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader}; -use tokio::process::{Child, Command}; -use tokio::select; -use tokio::sync::{watch, Mutex}; -use yajrc::{Id, RpcError}; - -/// Outputs embedded in the JSONRpc output of the executable. -#[derive(Debug, Clone, Serialize)] -#[serde(untagged)] -enum Output { - Command(ProcessId), - ReadLineStdout(String), - ReadLineStderr(String), - Output(String), - Log, - Signal, - SignalGroup, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(tag = "method", content = "params", rename_all = "kebab-case")] -enum Input { - /// Run a new command, with the args - Command(RunCommandParams), - /// Want to log locall on the service rather than the eos - Log(LogParams), - // /// Get a line of stdout from the command - // ReadLineStdout(ReadLineStdoutParams), - // /// Get a line of stderr from the command - // ReadLineStderr(ReadLineStderrParams), - /// Get output of command - Output(OutputParams), - /// Send the sigterm to the process - Signal(SendSignalParams), - /// Signal a group of processes - SignalGroup(SignalGroupParams), -} - -#[derive(Deserialize)] -struct IncomingRpc { - id: Id, - #[serde(flatten)] - input: Input, -} - -struct ChildInfo { - gid: Option, - child: Arc>>, - output: Option, -} - -struct InheritOutput { - _thread: NonDetachingJoinHandle<()>, - stdout: watch::Receiver, - stderr: watch::Receiver, -} - -struct HandlerMut { - processes: BTreeMap, - // groups: BTreeMap, -} - -#[derive(Clone)] -struct Handler { - children: Arc>, -} -impl Handler { - fn new() -> Self { - Handler { - children: Arc::new(Mutex::new(HandlerMut { - processes: BTreeMap::new(), - // groups: BTreeMap::new(), - })), - } - } - async fn handle(&self, req: Input) -> Result { - Ok(match req { - Input::Command(RunCommandParams { - gid, - command, - args, - output, - }) => Output::Command(self.command(gid, command, args, output).await?), - // Input::ReadLineStdout(ReadLineStdoutParams { pid }) => { - // Output::ReadLineStdout(self.read_line_stdout(pid).await?) - // } - // Input::ReadLineStderr(ReadLineStderrParams { pid }) => { - // Output::ReadLineStderr(self.read_line_stderr(pid).await?) - // } - Input::Log(LogParams { gid: _, level }) => { - level.trace(); - Output::Log - } - Input::Output(OutputParams { pid }) => Output::Output(self.output(pid).await?), - Input::Signal(SendSignalParams { pid, signal }) => { - self.signal(pid, signal).await?; - Output::Signal - } - Input::SignalGroup(SignalGroupParams { gid, signal }) => { - self.signal_group(gid, signal).await?; - Output::SignalGroup - } - }) - } - - async fn command( - &self, - gid: Option, - command: String, - args: Vec, - output: OutputStrategy, - ) -> Result { - let mut cmd = Command::new(command); - cmd.args(args); - cmd.kill_on_drop(true); - cmd.stdout(Stdio::piped()); - cmd.stderr(Stdio::piped()); - let mut child = cmd.spawn().map_err(|e| { - let mut err = yajrc::INTERNAL_ERROR.clone(); - err.data = Some(json!(e.to_string())); - err - })?; - let pid = ProcessId(child.id().ok_or_else(|| { - let mut err = yajrc::INTERNAL_ERROR.clone(); - err.data = Some(json!("Child has no pid")); - err - })?); - let output = match output { - OutputStrategy::Inherit => { - let (stdout_send, stdout) = watch::channel(String::new()); - let (stderr_send, stderr) = watch::channel(String::new()); - if let (Some(child_stdout), Some(child_stderr)) = - (child.stdout.take(), child.stderr.take()) - { - Some(InheritOutput { - _thread: tokio::spawn(async move { - tokio::join!( - async { - if let Err(e) = async { - let mut lines = BufReader::new(child_stdout).lines(); - while let Some(line) = lines.next_line().await? { - tracing::info!("({}): {}", pid.0, line); - let _ = stdout_send.send(line); - } - Ok::<_, std::io::Error>(()) - } - .await - { - tracing::error!( - "Error reading stdout of pid {}: {}", - pid.0, - e - ); - } - }, - async { - if let Err(e) = async { - let mut lines = BufReader::new(child_stderr).lines(); - while let Some(line) = lines.next_line().await? { - tracing::warn!("({}): {}", pid.0, line); - let _ = stderr_send.send(line); - } - Ok::<_, std::io::Error>(()) - } - .await - { - tracing::error!( - "Error reading stdout of pid {}: {}", - pid.0, - e - ); - } - } - ); - }) - .into(), - stdout, - stderr, - }) - } else { - None - } - } - OutputStrategy::Collect => None, - }; - self.children.lock().await.processes.insert( - pid, - ChildInfo { - gid, - child: Arc::new(Mutex::new(Some(child))), - output, - }, - ); - Ok(pid) - } - - async fn output(&self, pid: ProcessId) -> Result { - let not_found = || { - let mut err = yajrc::INTERNAL_ERROR.clone(); - err.data = Some(json!(format!("Child with pid {} not found", pid.0))); - err - }; - let mut child = { - self.children - .lock() - .await - .processes - .get(&pid) - .ok_or_else(not_found)? - .child - .clone() - } - .lock_owned() - .await; - if let Some(child) = child.take() { - let output = child.wait_with_output().await?; - if output.status.success() { - Ok(String::from_utf8(output.stdout).map_err(|_| yajrc::PARSE_ERROR)?) - } else { - Err(RpcError { - code: output - .status - .code() - .or_else(|| output.status.signal().map(|s| 128 + s)) - .unwrap_or(0), - message: "Command failed".into(), - data: Some(json!(String::from_utf8(if output.stderr.is_empty() { - output.stdout - } else { - output.stderr - }) - .map_err(|_| yajrc::PARSE_ERROR)?)), - }) - } - } else { - Err(not_found()) - } - } - - async fn signal(&self, pid: ProcessId, signal: u32) -> Result<(), RpcError> { - let not_found = || { - let mut err = yajrc::INTERNAL_ERROR.clone(); - err.data = Some(json!(format!("Child with pid {} not found", pid.0))); - err - }; - - Self::killall(pid, Signal::try_from(signal as i32)?)?; - - if signal == 9 { - self.children - .lock() - .await - .processes - .remove(&pid) - .ok_or_else(not_found)?; - } - Ok(()) - } - - async fn signal_group(&self, gid: ProcessGroupId, signal: u32) -> Result<(), RpcError> { - let mut to_kill = Vec::new(); - { - let mut children_ref = self.children.lock().await; - let children = std::mem::take(&mut children_ref.deref_mut().processes); - for (pid, child_info) in children { - if child_info.gid == Some(gid) { - to_kill.push(pid); - } else { - children_ref.processes.insert(pid, child_info); - } - } - } - for pid in to_kill { - tracing::info!("Killing pid {}", pid.0); - Self::killall(pid, Signal::try_from(signal as i32)?)?; - } - - Ok(()) - } - - fn killall(pid: ProcessId, signal: Signal) -> Result<(), RpcError> { - for proc in procfs::process::all_processes()? { - let stat = proc?.stat()?; - if ProcessId::from(stat.ppid) == pid { - Self::killall(stat.pid.into(), signal)?; - } - } - if let Err(e) = nix::sys::signal::kill(pid.into(), Some(signal)) { - if e != Errno::ESRCH { - tracing::error!("Failed to kill pid {}: {}", pid.0, e); - } - } - Ok(()) - } - - async fn graceful_exit(self) { - let kill_all = futures::stream::iter( - std::mem::take(&mut self.children.lock().await.deref_mut().processes).into_iter(), - ) - .for_each_concurrent(None, |(pid, child)| async move { - let _ = Self::killall(pid, Signal::SIGTERM); - if let Some(child) = child.child.lock().await.take() { - let _ = child.wait_with_output().await; - } - }); - kill_all.await - } -} - -#[tokio::main] -async fn main() { - use tokio::signal::unix::{signal, SignalKind}; - let mut sigint = signal(SignalKind::interrupt()).unwrap(); - let mut sigterm = signal(SignalKind::terminate()).unwrap(); - let mut sigquit = signal(SignalKind::quit()).unwrap(); - let mut sighangup = signal(SignalKind::hangup()).unwrap(); - - use tracing_error::ErrorLayer; - use tracing_subscriber::prelude::*; - use tracing_subscriber::{fmt, EnvFilter}; - - let filter_layer = EnvFilter::new("container_init=debug"); - let fmt_layer = fmt::layer().with_target(true); - - tracing_subscriber::registry() - .with(filter_layer) - .with(fmt_layer) - .with(ErrorLayer::default()) - .init(); - color_eyre::install().unwrap(); - - let handler = Handler::new(); - let handler_thread = async { - let listener = tokio::net::UnixListener::bind("/start9/sockets/rpc.sock")?; - loop { - let (stream, _) = listener.accept().await?; - let (r, w) = stream.into_split(); - let mut lines = BufReader::new(r).lines(); - let handler = handler.clone(); - tokio::spawn(async move { - let w = Arc::new(Mutex::new(w)); - while let Some(line) = lines.next_line().await.transpose() { - let handler = handler.clone(); - let w = w.clone(); - tokio::spawn(async move { - if let Err(e) = async { - let req = serde_json::from_str::(&line?)?; - match handler.handle(req.input).await { - Ok(output) => { - if w.lock().await.write_all( - format!("{}\n", json!({ "id": req.id, "jsonrpc": "2.0", "result": output })) - .as_bytes(), - ) - .await.is_err() { - tracing::error!("Error sending to {id:?}", id = req.id); - } - } - Err(e) => - if w - .lock() - .await - .write_all( - format!("{}\n", json!({ "id": req.id, "jsonrpc": "2.0", "error": e })) - .as_bytes(), - ) - .await.is_err() { - - tracing::error!("Handle + Error sending to {id:?}", id = req.id); - }, - } - Ok::<_, color_eyre::Report>(()) - } - .await - { - tracing::error!("Error parsing RPC request: {}", e); - tracing::debug!("{:?}", e); - } - }); - } - Ok::<_, std::io::Error>(()) - }); - } - #[allow(unreachable_code)] - Ok::<_, std::io::Error>(()) - }; - - select! { - res = handler_thread => { - match res { - Ok(()) => tracing::debug!("Done with inputs/outputs"), - Err(e) => { - tracing::error!("Error reading RPC input: {}", e); - tracing::debug!("{:?}", e); - } - } - }, - _ = sigint.recv() => { - tracing::debug!("SIGINT"); - }, - _ = sigterm.recv() => { - tracing::debug!("SIGTERM"); - }, - _ = sigquit.recv() => { - tracing::debug!("SIGQUIT"); - }, - _ = sighangup.recv() => { - tracing::debug!("SIGHUP"); - } - } - handler.graceful_exit().await; - ::std::process::exit(0) -} diff --git a/core/helpers/Cargo.toml b/core/helpers/Cargo.toml index 83e1fd788..228f3ef54 100644 --- a/core/helpers/Cargo.toml +++ b/core/helpers/Cargo.toml @@ -11,9 +11,9 @@ futures = "0.3.28" lazy_async_pool = "0.3.3" models = { path = "../models" } pin-project = "1.1.3" +rpc-toolkit = "0.2.3" serde = { version = "1.0", features = ["derive", "rc"] } serde_json = "1.0" tokio = { version = "1", features = ["full"] } tokio-stream = { version = "0.1.14", features = ["io-util", "sync"] } tracing = "0.1.39" -yajrc = { version = "*", git = "https://github.com/dr-bonez/yajrc.git", branch = "develop" } diff --git a/core/helpers/src/lib.rs b/core/helpers/src/lib.rs index 226787590..d913aefee 100644 --- a/core/helpers/src/lib.rs +++ b/core/helpers/src/lib.rs @@ -11,11 +11,9 @@ use tokio::sync::oneshot; use tokio::task::{JoinError, JoinHandle, LocalSet}; mod byte_replacement_reader; -mod rpc_client; mod rsync; mod script_dir; pub use byte_replacement_reader::*; -pub use rpc_client::{RpcClient, UnixRpcClient}; pub use rsync::*; pub use script_dir::*; diff --git a/core/install-sdk.sh b/core/install-cli.sh similarity index 61% rename from core/install-sdk.sh rename to core/install-cli.sh index 3eec40012..f4fe712ee 100755 --- a/core/install-sdk.sh +++ b/core/install-cli.sh @@ -12,7 +12,4 @@ if [ -z "$PLATFORM" ]; then export PLATFORM=$(uname -m) fi -cargo install --path=./startos --no-default-features --features=js_engine,sdk,cli --locked -startbox_loc=$(which startbox) -ln -sf $startbox_loc $(dirname $startbox_loc)/start-cli -ln -sf $startbox_loc $(dirname $startbox_loc)/start-sdk +cargo install --path=./startos --no-default-features --features=cli,docker --bin start-cli --locked diff --git a/core/models/Cargo.toml b/core/models/Cargo.toml index 9d75f92c4..c6fc76f55 100644 --- a/core/models/Cargo.toml +++ b/core/models/Cargo.toml @@ -15,6 +15,7 @@ emver = { version = "0.1", git = "https://github.com/Start9Labs/emver-rs.git", f "serde", ] } ipnet = "2.8.0" +num_enum = "0.7.1" openssl = { version = "0.10.57", features = ["vendored"] } patch-db = { version = "*", path = "../../patch-db/patch-db", features = [ "trace", diff --git a/core/models/src/errors.rs b/core/models/src/errors.rs index f22624d36..15bc90b9f 100644 --- a/core/models/src/errors.rs +++ b/core/models/src/errors.rs @@ -1,14 +1,19 @@ -use std::fmt::Display; +use std::fmt::{Debug, Display}; use color_eyre::eyre::eyre; +use num_enum::TryFromPrimitive; use patch_db::Revision; use rpc_toolkit::hyper::http::uri::InvalidUri; use rpc_toolkit::reqwest; -use rpc_toolkit::yajrc::RpcError; +use rpc_toolkit::yajrc::{ + RpcError, INVALID_PARAMS_ERROR, INVALID_REQUEST_ERROR, METHOD_NOT_FOUND_ERROR, PARSE_ERROR, +}; +use serde::{Deserialize, Serialize}; use crate::InvalidId; -#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, TryFromPrimitive)] +#[repr(i32)] pub enum ErrorKind { Unknown = 1, Filesystem = 2, @@ -81,6 +86,8 @@ pub enum ErrorKind { CpuSettings = 69, Firmware = 70, Timeout = 71, + Lxc = 72, + Cancelled = 73, } impl ErrorKind { pub fn as_str(&self) -> &'static str { @@ -157,6 +164,8 @@ impl ErrorKind { CpuSettings => "CPU Settings Error", Firmware => "Firmware Error", Timeout => "Timeout Error", + Lxc => "LXC Error", + Cancelled => "Cancelled", } } } @@ -186,6 +195,17 @@ impl Error { revision: None, } } + pub fn clone_output(&self) -> Self { + Error { + source: ErrorData { + details: format!("{}", self.source), + debug: format!("{:?}", self.source), + } + .into(), + kind: self.kind, + revision: self.revision.clone(), + } + } } impl From for Error { fn from(err: InvalidId) -> Self { @@ -300,6 +320,53 @@ impl From for Error { } } +#[derive(Clone, Deserialize, Serialize)] +pub struct ErrorData { + pub details: String, + pub debug: String, +} +impl Display for ErrorData { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + Display::fmt(&self.details, f) + } +} +impl Debug for ErrorData { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + Display::fmt(&self.debug, f) + } +} +impl std::error::Error for ErrorData {} +impl From<&RpcError> for ErrorData { + fn from(value: &RpcError) -> Self { + Self { + details: value + .data + .as_ref() + .and_then(|d| { + d.as_object() + .and_then(|d| { + d.get("details") + .and_then(|d| d.as_str().map(|s| s.to_owned())) + }) + .or_else(|| d.as_str().map(|s| s.to_owned())) + }) + .unwrap_or_else(|| value.message.clone().into_owned()), + debug: value + .data + .as_ref() + .and_then(|d| { + d.as_object() + .and_then(|d| { + d.get("debug") + .and_then(|d| d.as_str().map(|s| s.to_owned())) + }) + .or_else(|| d.as_str().map(|s| s.to_owned())) + }) + .unwrap_or_else(|| value.message.clone().into_owned()), + } + } +} + impl From for RpcError { fn from(e: Error) -> Self { let mut data_object = serde_json::Map::with_capacity(3); @@ -318,10 +385,40 @@ impl From for RpcError { RpcError { code: e.kind as i32, message: e.kind.as_str().into(), - data: Some(data_object.into()), + data: Some( + match serde_json::to_value(&ErrorData { + details: format!("{}", e.source), + debug: format!("{:?}", e.source), + }) { + Ok(a) => a, + Err(e) => { + tracing::warn!("Error serializing revision for Error object: {}", e); + serde_json::Value::Null + } + }, + ), } } } +impl From for Error { + fn from(e: RpcError) -> Self { + Error::new( + ErrorData::from(&e), + if let Ok(kind) = e.code.try_into() { + kind + } else if e.code == METHOD_NOT_FOUND_ERROR.code { + ErrorKind::NotFound + } else if e.code == PARSE_ERROR.code + || e.code == INVALID_PARAMS_ERROR.code + || e.code == INVALID_REQUEST_ERROR.code + { + ErrorKind::Deserialization + } else { + ErrorKind::Unknown + }, + ) + } +} #[derive(Debug, Default)] pub struct ErrorCollection(Vec); @@ -377,10 +474,7 @@ where Self: Sized, { fn with_kind(self, kind: ErrorKind) -> Result; - fn with_ctx (ErrorKind, D), D: Display + Send + Sync + 'static>( - self, - f: F, - ) -> Result; + fn with_ctx (ErrorKind, D), D: Display>(self, f: F) -> Result; } impl ResultExt for Result where @@ -394,10 +488,7 @@ where }) } - fn with_ctx (ErrorKind, D), D: Display + Send + Sync + 'static>( - self, - f: F, - ) -> Result { + fn with_ctx (ErrorKind, D), D: Display>(self, f: F) -> Result { self.map_err(|e| { let (kind, ctx) = f(&e); let source = color_eyre::eyre::Error::from(e); @@ -411,6 +502,29 @@ where }) } } +impl ResultExt for Result { + fn with_kind(self, kind: ErrorKind) -> Result { + self.map_err(|e| Error { + source: e.source, + kind, + revision: e.revision, + }) + } + + fn with_ctx (ErrorKind, D), D: Display>(self, f: F) -> Result { + self.map_err(|e| { + let (kind, ctx) = f(&e); + let source = e.source; + let ctx = format!("{}: {}", ctx, source); + let source = source.wrap_err(ctx); + Error { + kind, + source, + revision: e.revision, + } + }) + } +} pub trait OptionExt where diff --git a/core/models/src/id/image.rs b/core/models/src/id/image.rs index 10ef0451d..8a4f87175 100644 --- a/core/models/src/id/image.rs +++ b/core/models/src/id/image.rs @@ -1,4 +1,5 @@ use std::fmt::Debug; +use std::path::Path; use std::str::FromStr; use serde::{Deserialize, Deserializer, Serialize}; @@ -7,6 +8,11 @@ use crate::{Id, InvalidId, PackageId, Version}; #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)] pub struct ImageId(Id); +impl AsRef for ImageId { + fn as_ref(&self) -> &Path { + self.0.as_ref().as_ref() + } +} impl std::fmt::Display for ImageId { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", &self.0) diff --git a/core/models/src/procedure_name.rs b/core/models/src/procedure_name.rs index 6a092955a..841f8df7d 100644 --- a/core/models/src/procedure_name.rs +++ b/core/models/src/procedure_name.rs @@ -4,54 +4,37 @@ use crate::{ActionId, HealthCheckId, PackageId}; #[derive(Debug, Clone, Serialize, Deserialize)] pub enum ProcedureName { - Main, // Usually just run container - CreateBackup, - RestoreBackup, + StartMain, + StopMain, GetConfig, SetConfig, - Migration, - Properties, - LongRunning, - Check(PackageId), - AutoConfig(PackageId), - Health(HealthCheckId), - Action(ActionId), - Signal, + CreateBackup, + RestoreBackup, + ActionMetadata, + RunAction(ActionId), + GetAction(ActionId), + QueryDependency(ActionId), + UpdateDependency(ActionId), + Init, + Uninit, } impl ProcedureName { - pub fn docker_name(&self) -> Option { - match self { - ProcedureName::Main => None, - ProcedureName::LongRunning => None, - ProcedureName::CreateBackup => Some("CreateBackup".to_string()), - ProcedureName::RestoreBackup => Some("RestoreBackup".to_string()), - ProcedureName::GetConfig => Some("GetConfig".to_string()), - ProcedureName::SetConfig => Some("SetConfig".to_string()), - ProcedureName::Migration => Some("Migration".to_string()), - ProcedureName::Properties => Some(format!("Properties-{}", rand::random::())), - ProcedureName::Health(id) => Some(format!("{}Health", id)), - ProcedureName::Action(id) => Some(format!("{}Action", id)), - ProcedureName::Check(_) => None, - ProcedureName::AutoConfig(_) => None, - ProcedureName::Signal => None, - } - } - pub fn js_function_name(&self) -> Option { + pub fn js_function_name(&self) -> String { match self { - ProcedureName::Main => Some("/main".to_string()), - ProcedureName::LongRunning => None, - ProcedureName::CreateBackup => Some("/createBackup".to_string()), - ProcedureName::RestoreBackup => Some("/restoreBackup".to_string()), - ProcedureName::GetConfig => Some("/getConfig".to_string()), - ProcedureName::SetConfig => Some("/setConfig".to_string()), - ProcedureName::Migration => Some("/migration".to_string()), - ProcedureName::Properties => Some("/properties".to_string()), - ProcedureName::Health(id) => Some(format!("/health/{}", id)), - ProcedureName::Action(id) => Some(format!("/action/{}", id)), - ProcedureName::Check(id) => Some(format!("/dependencies/{}/check", id)), - ProcedureName::AutoConfig(id) => Some(format!("/dependencies/{}/autoConfigure", id)), - ProcedureName::Signal => Some("/handleSignal".to_string()), + ProcedureName::Init => "/init".to_string(), + ProcedureName::Uninit => "/uninit".to_string(), + ProcedureName::StartMain => "/main/start".to_string(), + ProcedureName::StopMain => "/main/stop".to_string(), + ProcedureName::SetConfig => "/config/set".to_string(), + ProcedureName::GetConfig => "/config/get".to_string(), + ProcedureName::CreateBackup => "/backup/create".to_string(), + ProcedureName::RestoreBackup => "/backup/restore".to_string(), + ProcedureName::ActionMetadata => "/actions/metadata".to_string(), + ProcedureName::RunAction(id) => format!("/actions/{}/run", id), + ProcedureName::GetAction(id) => format!("/actions/{}/get", id), + ProcedureName::QueryDependency(id) => format!("/dependencies/{}/query", id), + ProcedureName::UpdateDependency(id) => format!("/dependencies/{}/update", id), } } } diff --git a/core/snapshot-creator/Cargo.toml b/core/snapshot-creator/Cargo.toml deleted file mode 100644 index 628cd3161..000000000 --- a/core/snapshot-creator/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "snapshot_creator" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -dashmap = "5.3.4" -deno_core = "=0.222.0" -deno_ast = { version = "=0.29.5", features = ["transpiling"] } diff --git a/core/snapshot-creator/src/main.rs b/core/snapshot-creator/src/main.rs deleted file mode 100644 index ad7330484..000000000 --- a/core/snapshot-creator/src/main.rs +++ /dev/null @@ -1,11 +0,0 @@ -use deno_core::JsRuntimeForSnapshot; - -fn main() { - let runtime = JsRuntimeForSnapshot::new(Default::default()); - let snapshot = runtime.snapshot(); - - let snapshot_slice: &[u8] = &*snapshot; - println!("Snapshot size: {}", snapshot_slice.len()); - - std::fs::write("JS_SNAPSHOT.bin", snapshot_slice).unwrap(); -} diff --git a/core/startos/Cargo.toml b/core/startos/Cargo.toml index e92799b3a..3fce87089 100644 --- a/core/startos/Cargo.toml +++ b/core/startos/Cargo.toml @@ -21,20 +21,26 @@ license = "MIT" name = "startos" path = "src/lib.rs" +[[bin]] +name = "containerbox" +path = "src/main.rs" + +[[bin]] +name = "start-cli" +path = "src/main.rs" + [[bin]] name = "startbox" path = "src/main.rs" [features] -avahi = ["avahi-sys"] -avahi-alias = ["avahi"] cli = [] +container-runtime = [] daemon = [] -default = ["cli", "sdk", "daemon"] +default = ["cli", "daemon"] dev = [] -docker = [] -sdk = [] unstable = ["console-subscriber", "tokio/tracing"] +docker = [] [dependencies] aes = { version = "0.7.5", features = ["ctr"] } @@ -45,9 +51,8 @@ async-compression = { version = "0.4.4", features = [ ] } async-stream = "0.3.5" async-trait = "0.1.74" -avahi-sys = { git = "https://github.com/Start9Labs/avahi-sys", version = "0.10.0", branch = "feature/dynamic-linking", features = [ - "dynamic", -], optional = true } +axum = { version = "0.7.3", features = ["ws"] } +axum-server = "0.6.0" base32 = "0.4.0" base64 = "0.21.4" base64ct = "1.6.0" @@ -55,7 +60,7 @@ basic-cookies = "0.1.4" blake3 = "1.5.0" bytes = "1" chrono = { version = "0.4.31", features = ["serde"] } -clap = "3.2.25" +clap = "4.4.12" color-eyre = "0.6.2" console = "0.15.7" console-subscriber = { version = "0.2", optional = true } @@ -72,7 +77,6 @@ ed25519-dalek = { version = "2.0.0", features = [ "digest", ] } ed25519-dalek-v1 = { package = "ed25519-dalek", version = "1" } -container-init = { path = "../container-init" } emver = { version = "0.1.7", git = "https://github.com/Start9Labs/emver-rs.git", features = [ "serde", ] } @@ -82,9 +86,15 @@ gpt = "3.1.0" helpers = { path = "../helpers" } hex = "0.4.3" hmac = "0.12.1" -http = "0.2.9" -hyper = { version = "0.14.27", features = ["full"] } -hyper-ws-listener = "0.3.0" +http = "1.0.0" +# http-body-util = "0.1.0" +# hyper = { version = "1.1.0", features = ["full"] } +# hyper-util = { version = "0.1.2", features = [ +# "server", +# "server-auto", +# "tokio", +# ] } +# hyper-ws-listener = "0.3.0" imbl = "2.0.2" imbl-value = { git = "https://github.com/Start9Labs/imbl-value.git" } include_dir = "0.7.3" @@ -94,11 +104,13 @@ integer-encoding = { version = "4.0.0", features = ["tokio_async"] } ipnet = { version = "2.8.0", features = ["serde"] } iprange = { version = "0.6.7", features = ["serde"] } isocountry = "0.3.2" -itertools = "0.11.0" +itertools = "0.12.0" jaq-core = "0.10.1" jaq-std = "0.10.0" josekit = "0.8.4" jsonpath_lib = { git = "https://github.com/Start9Labs/jsonpath.git" } +lazy_async_pool = "0.3.3" +lazy_format = "2.0" lazy_static = "1.4.0" libc = "0.2.149" log = "0.4.20" @@ -109,6 +121,7 @@ nix = { version = "0.27.1", features = ["user", "process", "signal", "fs"] } nom = "7.1.3" num = "0.4.1" num_enum = "0.7.0" +once_cell = "1.19.0" openssh-keys = "0.6.2" openssl = { version = "0.10.57", features = ["vendored"] } p256 = { version = "0.13.2", features = ["pem"] } @@ -123,12 +136,12 @@ proptest = "1.3.1" proptest-derive = "0.4.0" rand = { version = "0.8.5", features = ["std"] } regex = "1.10.2" -reqwest = { version = "0.11.22", features = ["stream", "json", "socks"] } +reqwest = { version = "0.11.23", features = ["stream", "json", "socks"] } reqwest_cookie_store = "0.6.0" rpassword = "7.2.0" -rpc-toolkit = "0.2.2" +rpc-toolkit = { git = "https://github.com/Start9Labs/rpc-toolkit.git", branch = "refactor/traits" } rust-argon2 = "2.0.0" -scopeguard = "1.1" # because avahi-sys fucks your shit up +rustyline-async = "0.4.1" semver = { version = "1.0.20", features = ["serde"] } serde = { version = "1.0", features = ["derive", "rc"] } serde_cbor = { package = "ciborium", version = "0.2.1" } @@ -137,6 +150,7 @@ serde_toml = { package = "toml", version = "0.8.2" } serde_with = { version = "3.4.0", features = ["macros", "json"] } serde_yaml = "0.9.25" sha2 = "0.10.2" +shell-words = "1" simple-logging = "2.0.2" sqlx = { version = "0.7.2", features = [ "chrono", @@ -149,11 +163,11 @@ stderrlog = "0.5.4" tar = "0.4.40" thiserror = "1.0.49" tokio = { version = "1", features = ["full"] } -tokio-rustls = "0.24.1" +tokio-rustls = "0.25.0" tokio-socks = "0.5.1" tokio-stream = { version = "0.1.14", features = ["io-util", "sync", "net"] } tokio-tar = { git = "https://github.com/dr-bonez/tokio-tar.git" } -tokio-tungstenite = { version = "0.20.1", features = ["native-tls"] } +tokio-tungstenite = { version = "0.21.0", features = ["native-tls"] } tokio-util = { version = "0.7.9", features = ["io"] } torut = "0.2.1" tracing = "0.1.39" @@ -162,7 +176,7 @@ tracing-futures = "0.2.5" tracing-journald = "0.3.0" tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } trust-dns-server = "0.23.1" -typed-builder = "0.17.0" +typed-builder = "0.18.0" url = { version = "2.4.1", features = ["serde"] } urlencoding = "2.1.3" uuid = { version = "1.4.1", features = ["v4"] } diff --git a/core/startos/deny.toml b/core/startos/deny.toml index 7b4924cdc..5a42f7378 100644 --- a/core/startos/deny.toml +++ b/core/startos/deny.toml @@ -14,9 +14,15 @@ allow = [ "BSD-3-Clause", "LGPL-3.0", "OpenSSL", + "Unicode-DFS-2016", + "Zlib", ] clarify = [ - { name = "webpki", expression = "ISC", license-files = [ { path = "LICENSE", hash = 0x001c7e6c } ] }, - { name = "ring", expression = "OpenSSL", license-files = [ { path = "LICENSE", hash = 0xbd0eed23 } ] }, + { name = "webpki", expression = "ISC", license-files = [ + { path = "LICENSE", hash = 0x001c7e6c }, + ] }, + { name = "ring", expression = "OpenSSL", license-files = [ + { path = "LICENSE", hash = 0xbd0eed23 }, + ] }, ] diff --git a/core/startos/src/action.rs b/core/startos/src/action.rs index 3223aaa86..13a943a60 100644 --- a/core/startos/src/action.rs +++ b/core/startos/src/action.rs @@ -1,26 +1,14 @@ -use std::collections::{BTreeMap, BTreeSet}; - -use clap::ArgMatches; -use color_eyre::eyre::eyre; -use indexmap::IndexSet; +use clap::Parser; pub use models::ActionId; -use models::ImageId; +use models::PackageId; use rpc_toolkit::command; use serde::{Deserialize, Serialize}; use tracing::instrument; -use crate::config::{Config, ConfigSpec}; +use crate::config::Config; use crate::context::RpcContext; use crate::prelude::*; -use crate::procedure::docker::DockerContainers; -use crate::procedure::{PackageProcedure, ProcedureName}; -use crate::s9pk::manifest::PackageId; -use crate::util::serde::{display_serializable, parse_stdin_deserializable, IoFormat}; -use crate::util::Version; -use crate::volume::Volumes; -use crate::{Error, ResultExt}; -#[derive(Clone, Debug, Default, Deserialize, Serialize)] -pub struct Actions(pub BTreeMap); +use crate::util::serde::{display_serializable, StdinDeserializable, WithIoFormat}; #[derive(Debug, Serialize, Deserialize)] #[serde(tag = "version")] @@ -44,72 +32,11 @@ pub enum DockerStatus { Stopped, } -#[derive(Clone, Debug, Deserialize, Serialize)] -#[serde(rename_all = "kebab-case")] -pub struct Action { - pub name: String, - pub description: String, - #[serde(default)] - pub warning: Option, - pub implementation: PackageProcedure, - pub allowed_statuses: IndexSet, - #[serde(default)] - pub input_spec: ConfigSpec, -} -impl Action { - #[instrument(skip_all)] - pub fn validate( - &self, - _container: &Option, - eos_version: &Version, - volumes: &Volumes, - image_ids: &BTreeSet, - ) -> Result<(), Error> { - self.implementation - .validate(eos_version, volumes, image_ids, true) - .with_ctx(|_| { - ( - crate::ErrorKind::ValidateS9pk, - format!("Action {}", self.name), - ) - }) - } - - #[instrument(skip_all)] - pub async fn execute( - &self, - ctx: &RpcContext, - pkg_id: &PackageId, - pkg_version: &Version, - action_id: &ActionId, - volumes: &Volumes, - input: Option, - ) -> Result { - if let Some(ref input) = input { - self.input_spec - .matches(&input) - .with_kind(crate::ErrorKind::ConfigSpecViolation)?; - } - self.implementation - .execute( - ctx, - pkg_id, - pkg_version, - ProcedureName::Action(action_id.clone()), - volumes, - input, - None, - ) - .await? - .map_err(|e| Error::new(eyre!("{}", e.1), crate::ErrorKind::Action)) +pub fn display_action_result(params: WithIoFormat, result: ActionResult) { + if let Some(format) = params.format { + return display_serializable(format, result); } -} - -fn display_action_result(action_result: ActionResult, matches: &ArgMatches) { - if matches.is_present("format") { - return display_serializable(action_result, matches); - } - match action_result { + match result { ActionResult::V0(ar) => { println!( "{}: {}", @@ -120,44 +47,39 @@ fn display_action_result(action_result: ActionResult, matches: &ArgMatches) { } } -#[command(about = "Executes an action", display(display_action_result))] +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct ActionParams { + #[arg(id = "id")] + #[serde(rename = "id")] + pub package_id: PackageId, + #[arg(id = "action-id")] + #[serde(rename = "action-id")] + pub action_id: ActionId, + #[command(flatten)] + pub input: StdinDeserializable>, +} +// impl C + +// #[command(about = "Executes an action", display(display_action_result))] #[instrument(skip_all)] pub async fn action( - #[context] ctx: RpcContext, - #[arg(rename = "id")] pkg_id: PackageId, - #[arg(rename = "action-id")] action_id: ActionId, - #[arg(stdin, parse(parse_stdin_deserializable))] input: Option, - #[allow(unused_variables)] - #[arg(long = "format")] - format: Option, + ctx: RpcContext, + ActionParams { + package_id, + action_id, + input: StdinDeserializable(input), + }: ActionParams, ) -> Result { - let manifest = ctx - .db - .peek() + ctx.services + .get(&package_id) + .await + .as_ref() + .or_not_found(lazy_format!("Manager for {}", package_id))? + .action( + action_id, + input.map(|c| to_value(&c)).transpose()?.unwrap_or_default(), + ) .await - .as_package_data() - .as_idx(&pkg_id) - .or_not_found(&pkg_id)? - .as_installed() - .or_not_found(&pkg_id)? - .as_manifest() - .de()?; - - if let Some(action) = manifest.actions.0.get(&action_id) { - action - .execute( - &ctx, - &manifest.id, - &manifest.version, - &action_id, - &manifest.volumes, - input, - ) - .await - } else { - Err(Error::new( - eyre!("Action not found in manifest"), - crate::ErrorKind::NotFound, - )) - } } diff --git a/core/startos/src/auth.rs b/core/startos/src/auth.rs index a6ae2fff0..cdf2a4591 100644 --- a/core/startos/src/auth.rs +++ b/core/startos/src/auth.rs @@ -1,24 +1,23 @@ use std::collections::BTreeMap; -use std::marker::PhantomData; use chrono::{DateTime, Utc}; -use clap::ArgMatches; +use clap::{ArgMatches, Parser}; use color_eyre::eyre::eyre; +use imbl_value::{json, InternedString}; use josekit::jwk::Jwk; -use rpc_toolkit::command; -use rpc_toolkit::command_helpers::prelude::{RequestParts, ResponseParts}; use rpc_toolkit::yajrc::RpcError; +use rpc_toolkit::{command, from_fn_async, AnyContext, CallRemote, HandlerExt, ParentHandler}; use serde::{Deserialize, Serialize}; -use serde_json::Value; use sqlx::{Executor, Postgres}; use tracing::instrument; use crate::context::{CliContext, RpcContext}; -use crate::middleware::auth::{AsLogoutSessionId, HasLoggedOutSessions, HashSessionToken}; -use crate::middleware::encrypt::EncryptedWire; +use crate::middleware::auth::{ + AsLogoutSessionId, HasLoggedOutSessions, HashSessionToken, LoginRes, +}; use crate::prelude::*; -use crate::util::display_none; -use crate::util::serde::{display_serializable, IoFormat}; +use crate::util::crypto::EncryptedWire; +use crate::util::serde::{display_serializable, HandlerExtSerde, WithIoFormat}; use crate::{ensure_code, Error, ResultExt}; #[derive(Clone, Serialize, Deserialize)] #[serde(untagged)] @@ -61,14 +60,43 @@ impl std::str::FromStr for PasswordType { }) } } - -#[command(subcommands(login, logout, session, reset_password, get_pubkey))] -pub fn auth() -> Result<(), Error> { - Ok(()) +pub fn auth() -> ParentHandler { + ParentHandler::new() + .subcommand( + "login", + from_fn_async(login_impl) + .with_metadata("login", Value::Bool(true)) + .no_cli(), + ) + .subcommand("login", from_fn_async(cli_login).no_display()) + .subcommand( + "logout", + from_fn_async(logout) + .with_metadata("get-session", Value::Bool(true)) + .with_remote_cli::() + // TODO @dr-bonez + .no_display(), + ) + .subcommand("session", session()) + .subcommand( + "reset-password", + from_fn_async(reset_password_impl).no_cli(), + ) + .subcommand( + "reset-password", + from_fn_async(cli_reset_password).no_display(), + ) + .subcommand( + "get-pubkey", + from_fn_async(get_pubkey) + .with_metadata("authenticated", Value::Bool(false)) + .no_display() + .with_remote_cli::(), + ) } pub fn cli_metadata() -> Value { - serde_json::json!({ + imbl_value::json!({ "platforms": ["cli"], }) } @@ -89,12 +117,17 @@ fn gen_pwd() { .unwrap() ) } +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct CliLoginParams { + password: Option, +} #[instrument(skip_all)] async fn cli_login( ctx: CliContext, - password: Option, - metadata: Value, + CliLoginParams { password }: CliLoginParams, ) -> Result<(), RpcError> { let password = if let Some(password) = password { password.decrypt(&ctx)? @@ -102,14 +135,16 @@ async fn cli_login( rpassword::prompt_password("Password: ")? }; - rpc_toolkit::command_helpers::call_remote( - ctx, + ctx.call_remote( "auth.login", - serde_json::json!({ "password": password, "metadata": metadata }), - PhantomData::<()>, + json!({ + "password": password, + "metadata": { + "platforms": ["cli"], + }, + }), ) - .await? - .result?; + .await?; Ok(()) } @@ -140,30 +175,27 @@ where Ok(()) } -#[command( - custom_cli(cli_login(async, context(CliContext))), - display(display_none), - metadata(authenticated = false) -)] -#[instrument(skip_all)] -pub async fn login( - #[context] ctx: RpcContext, - #[request] req: &RequestParts, - #[response] res: &mut ResponseParts, - #[arg] password: Option, - #[arg( - parse(parse_metadata), - default = "cli_metadata", - help = "RPC Only: This value cannot be overidden from the cli" - )] +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct LoginParams { + password: Option, + #[arg(skip = cli_metadata())] + #[serde(default)] metadata: Value, -) -> Result<(), Error> { +} + +#[instrument(skip_all)] +pub async fn login_impl( + ctx: RpcContext, + LoginParams { password, metadata }: LoginParams, +) -> Result { let password = password.unwrap_or_default().decrypt(&ctx)?; let mut handle = ctx.secret_store.acquire().await?; check_password_against_db(handle.as_mut(), &password).await?; let hash_token = HashSessionToken::new(); - let user_agent = req.headers.get("user-agent").and_then(|h| h.to_str().ok()); + let user_agent = "".to_string(); // todo!() as String; let metadata = serde_json::to_string(&metadata).with_kind(crate::ErrorKind::Database)?; let hash_token_hashed = hash_token.hashed(); sqlx::query!( @@ -174,25 +206,24 @@ pub async fn login( ) .execute(handle.as_mut()) .await?; - res.headers.insert( - "set-cookie", - hash_token.header_value()?, // Should be impossible, but don't want to panic - ); - Ok(()) + Ok(hash_token.to_login_res()) +} + +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct LogoutParams { + session: InternedString, } -#[command(display(display_none), metadata(authenticated = false))] -#[instrument(skip_all)] pub async fn logout( - #[context] ctx: RpcContext, - #[request] req: &RequestParts, + ctx: RpcContext, + LogoutParams { session }: LogoutParams, ) -> Result, Error> { - let auth = match HashSessionToken::from_request_parts(req) { - Err(_) => return Ok(None), - Ok(a) => a, - }; - Ok(Some(HasLoggedOutSessions::new(vec![auth], &ctx).await?)) + Ok(Some( + HasLoggedOutSessions::new(vec![HashSessionToken::from_token(session)], &ctx).await?, + )) } #[derive(Deserialize, Serialize)] @@ -211,16 +242,31 @@ pub struct SessionList { sessions: BTreeMap, } -#[command(subcommands(list, kill))] -pub async fn session() -> Result<(), Error> { - Ok(()) +pub fn session() -> ParentHandler { + ParentHandler::new() + .subcommand( + "list", + from_fn_async(list) + .with_metadata("get-session", Value::Bool(true)) + .with_display_serializable() + .with_custom_display_fn::(|handle, result| { + Ok(display_sessions(handle.params, result)) + }) + .with_remote_cli::(), + ) + .subcommand( + "kill", + from_fn_async(kill) + .no_display() + .with_remote_cli::(), + ) } -fn display_sessions(arg: SessionList, matches: &ArgMatches) { +fn display_sessions(params: WithIoFormat, arg: SessionList) { use prettytable::*; - if matches.is_present("format") { - return display_serializable(arg, matches); + if let Some(format) = params.format { + return display_serializable(format, arg); } let mut table = Table::new(); @@ -249,17 +295,22 @@ fn display_sessions(arg: SessionList, matches: &ArgMatches) { table.print_tty(false).unwrap(); } -#[command(display(display_sessions))] +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct ListParams { + #[arg(skip)] + session: InternedString, +} + +// #[command(display(display_sessions))] #[instrument(skip_all)] pub async fn list( - #[context] ctx: RpcContext, - #[request] req: &RequestParts, - #[allow(unused_variables)] - #[arg(long = "format")] - format: Option, + ctx: RpcContext, + ListParams { session, .. }: ListParams, ) -> Result { Ok(SessionList { - current: HashSessionToken::from_request_parts(req)?.as_hash(), + current: HashSessionToken::from_token(session).hashed().to_owned(), sessions: sqlx::query!( "SELECT * FROM session WHERE logged_out IS NULL OR logged_out > CURRENT_TIMESTAMP" ) @@ -287,29 +338,50 @@ fn parse_comma_separated(arg: &str, _: &ArgMatches) -> Result, RpcEr } #[derive(Debug, Clone, Serialize, Deserialize)] -struct KillSessionId(String); +struct KillSessionId(InternedString); + +impl KillSessionId { + fn new(id: String) -> Self { + Self(InternedString::from(id)) + } +} impl AsLogoutSessionId for KillSessionId { - fn as_logout_session_id(self) -> String { + fn as_logout_session_id(self) -> InternedString { self.0 } } -#[command(display(display_none))] +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct KillParams { + ids: Vec, +} + #[instrument(skip_all)] -pub async fn kill( - #[context] ctx: RpcContext, - #[arg(parse(parse_comma_separated))] ids: Vec, -) -> Result<(), Error> { - HasLoggedOutSessions::new(ids.into_iter().map(KillSessionId), &ctx).await?; +pub async fn kill(ctx: RpcContext, KillParams { ids }: KillParams) -> Result<(), Error> { + HasLoggedOutSessions::new(ids.into_iter().map(KillSessionId::new), &ctx).await?; Ok(()) } +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct ResetPasswordParams { + #[arg(name = "old-password")] + old_password: Option, + #[arg(name = "new-password")] + new_password: Option, +} + #[instrument(skip_all)] async fn cli_reset_password( ctx: CliContext, - old_password: Option, - new_password: Option, + ResetPasswordParams { + old_password, + new_password, + }: ResetPasswordParams, ) -> Result<(), RpcError> { let old_password = if let Some(old_password) = old_password { old_password.decrypt(&ctx)? @@ -331,28 +403,22 @@ async fn cli_reset_password( new_password }; - rpc_toolkit::command_helpers::call_remote( - ctx, + ctx.call_remote( "auth.reset-password", - serde_json::json!({ "old-password": old_password, "new-password": new_password }), - PhantomData::<()>, + imbl_value::json!({ "old-password": old_password, "new-password": new_password }), ) - .await? - .result?; + .await?; Ok(()) } -#[command( - rename = "reset-password", - custom_cli(cli_reset_password(async, context(CliContext))), - display(display_none) -)] #[instrument(skip_all)] -pub async fn reset_password( - #[context] ctx: RpcContext, - #[arg(rename = "old-password")] old_password: Option, - #[arg(rename = "new-password")] new_password: Option, +pub async fn reset_password_impl( + ctx: RpcContext, + ResetPasswordParams { + old_password, + new_password, + }: ResetPasswordParams, ) -> Result<(), Error> { let old_password = old_password.unwrap_or_default().decrypt(&ctx)?; let new_password = new_password.unwrap_or_default().decrypt(&ctx)?; @@ -378,13 +444,8 @@ pub async fn reset_password( .await } -#[command( - rename = "get-pubkey", - display(display_none), - metadata(authenticated = false) -)] #[instrument(skip_all)] -pub async fn get_pubkey(#[context] ctx: RpcContext) -> Result { +pub async fn get_pubkey(ctx: RpcContext) -> Result { let secret = ctx.as_ref().clone(); let pub_key = secret.to_public_key()?; Ok(pub_key) diff --git a/core/startos/src/backup/backup_bulk.rs b/core/startos/src/backup/backup_bulk.rs index 21eedbaf2..5c68753c7 100644 --- a/core/startos/src/backup/backup_bulk.rs +++ b/core/startos/src/backup/backup_bulk.rs @@ -4,14 +4,13 @@ use std::path::{Path, PathBuf}; use std::sync::Arc; use chrono::Utc; -use clap::ArgMatches; +use clap::Parser; use color_eyre::eyre::eyre; use helpers::AtomicFile; use imbl::OrdSet; -use models::Version; -use rpc_toolkit::command; +use models::PackageId; +use serde::{Deserialize, Serialize}; use tokio::io::AsyncWriteExt; -use tokio::sync::Mutex; use tracing::instrument; use super::target::BackupTargetId; @@ -21,42 +20,37 @@ use crate::backup::os::OsBackup; use crate::backup::{BackupReport, ServerBackupReport}; use crate::context::RpcContext; use crate::db::model::BackupProgress; -use crate::db::package::get_packages; use crate::disk::mount::backup::BackupMountGuard; use crate::disk::mount::filesystem::ReadWrite; -use crate::disk::mount::guard::TmpMountGuard; -use crate::manager::BackupReturn; +use crate::disk::mount::guard::{GenericMountGuard, TmpMountGuard}; use crate::notifications::NotificationLevel; use crate::prelude::*; -use crate::s9pk::manifest::PackageId; -use crate::util::display_none; use crate::util::io::dir_copy; use crate::util::serde::IoFormat; use crate::version::VersionT; -fn parse_comma_separated(arg: &str, _: &ArgMatches) -> Result, Error> { - arg.split(',') - .map(|s| s.trim().parse::().map_err(Error::from)) - .collect() +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct BackupParams { + target_id: BackupTargetId, + #[arg(long = "old-password")] + old_password: Option, + #[arg(long = "package-ids")] + package_ids: Option>, + password: crate::auth::PasswordType, } -#[command(rename = "create", display(display_none))] #[instrument(skip(ctx, old_password, password))] pub async fn backup_all( - #[context] ctx: RpcContext, - #[arg(rename = "target-id")] target_id: BackupTargetId, - #[arg(rename = "old-password", long = "old-password")] old_password: Option< - crate::auth::PasswordType, - >, - #[arg( - rename = "package-ids", - long = "package-ids", - parse(parse_comma_separated) - )] - package_ids: Option>, - #[arg] password: crate::auth::PasswordType, + ctx: RpcContext, + BackupParams { + target_id, + old_password, + package_ids, + password, + }: BackupParams, ) -> Result<(), Error> { - let db = ctx.db.peek().await; let old_password_decrypted = old_password .as_ref() .unwrap_or(&password) @@ -73,20 +67,9 @@ pub async fn backup_all( ) .await?; let package_ids = if let Some(ids) = package_ids { - ids.into_iter() - .flat_map(|package_id| { - let version = db - .as_package_data() - .as_idx(&package_id)? - .as_manifest() - .as_version() - .de() - .ok()?; - Some((package_id, version)) - }) - .collect() + ids.into_iter().collect() } else { - get_packages(db.clone())?.into_iter().collect() + todo!("all installed packages"); }; if old_password.is_some() { backup_guard.change_password(&password)?; @@ -108,10 +91,7 @@ pub async fn backup_all( attempted: true, error: None, }, - packages: report - .into_iter() - .map(|((package_id, _), value)| (package_id, value)) - .collect(), + packages: report, }, None, ) @@ -130,10 +110,7 @@ pub async fn backup_all( attempted: true, error: None, }, - packages: report - .into_iter() - .map(|((package_id, _), value)| (package_id, value)) - .collect(), + packages: report, }, None, ) @@ -178,7 +155,7 @@ pub async fn backup_all( #[instrument(skip(db, packages))] async fn assure_backing_up( db: &PatchDb, - packages: impl IntoIterator + UnwindSafe + Send, + packages: impl IntoIterator + UnwindSafe + Send, ) -> Result<(), Error> { db.mutate(|v| { let backing_up = v @@ -205,7 +182,7 @@ async fn assure_backing_up( backing_up.ser(&Some( packages .into_iter() - .map(|(x, _)| (x.clone(), BackupProgress { complete: false })) + .map(|x| (x.clone(), BackupProgress { complete: false })) .collect(), ))?; Ok(()) @@ -217,62 +194,39 @@ async fn assure_backing_up( async fn perform_backup( ctx: &RpcContext, backup_guard: BackupMountGuard, - package_ids: &OrdSet<(PackageId, Version)>, -) -> Result, Error> { + package_ids: &OrdSet, +) -> Result, Error> { let mut backup_report = BTreeMap::new(); - let backup_guard = Arc::new(Mutex::new(backup_guard)); + let backup_guard = Arc::new(backup_guard); - for package_id in package_ids { - let (response, _report) = match ctx - .managers - .get(package_id) - .await - .ok_or_else(|| Error::new(eyre!("Manager not found"), ErrorKind::InvalidRequest))? - .backup(backup_guard.clone()) - .await - { - BackupReturn::Ran { report, res } => (res, report), - BackupReturn::AlreadyRunning(report) => { - backup_report.insert(package_id.clone(), report); - continue; - } - BackupReturn::Error(error) => { - tracing::warn!("Backup thread error"); - tracing::debug!("{error:?}"); - backup_report.insert( - package_id.clone(), - PackageBackupReport { - error: Some("Backup thread error".to_owned()), - }, - ); - continue; - } - }; - backup_report.insert( - package_id.clone(), - PackageBackupReport { - error: response.as_ref().err().map(|e| e.to_string()), - }, - ); - - if let Ok(pkg_meta) = response { - backup_guard - .lock() - .await - .metadata - .package_backups - .insert(package_id.0.clone(), pkg_meta); + for id in package_ids { + if let Some(service) = &*ctx.services.get(id).await { + backup_report.insert( + id.clone(), + PackageBackupReport { + error: service + .backup(backup_guard.package_backup(id)) + .await + .err() + .map(|e| e.to_string()), + }, + ); } } + let mut backup_guard = Arc::try_unwrap(backup_guard).map_err(|_| { + Error::new( + eyre!("leaked reference to BackupMountGuard"), + ErrorKind::Incoherent, + ) + })?; + let ui = ctx.db.peek().await.into_ui().de()?; - let mut os_backup_file = AtomicFile::new( - backup_guard.lock().await.as_ref().join("os-backup.cbor"), - None::, - ) - .await - .with_kind(ErrorKind::Filesystem)?; + let mut os_backup_file = + AtomicFile::new(backup_guard.path().join("os-backup.cbor"), None::) + .await + .with_kind(ErrorKind::Filesystem)?; os_backup_file .write_all(&IoFormat::Cbor.to_vec(&OsBackup { account: ctx.account.read().await.clone(), @@ -284,11 +238,11 @@ async fn perform_backup( .await .with_kind(ErrorKind::Filesystem)?; - let luks_folder_old = backup_guard.lock().await.as_ref().join("luks.old"); + let luks_folder_old = backup_guard.path().join("luks.old"); if tokio::fs::metadata(&luks_folder_old).await.is_ok() { tokio::fs::remove_dir_all(&luks_folder_old).await?; } - let luks_folder_bak = backup_guard.lock().await.as_ref().join("luks"); + let luks_folder_bak = backup_guard.path().join("luks"); if tokio::fs::metadata(&luks_folder_bak).await.is_ok() { tokio::fs::rename(&luks_folder_bak, &luks_folder_old).await?; } @@ -298,14 +252,6 @@ async fn perform_backup( } let timestamp = Some(Utc::now()); - let mut backup_guard = Arc::try_unwrap(backup_guard) - .map_err(|_err| { - Error::new( - eyre!("Backup guard could not ensure that the others where dropped"), - ErrorKind::Unknown, - ) - })? - .into_inner(); backup_guard.unencrypted_metadata.version = crate::version::Current::new().semver().into(); backup_guard.unencrypted_metadata.full = true; diff --git a/core/startos/src/backup/mod.rs b/core/startos/src/backup/mod.rs index 2f3f9bd8f..d1fd57898 100644 --- a/core/startos/src/backup/mod.rs +++ b/core/startos/src/backup/mod.rs @@ -1,33 +1,16 @@ -use std::collections::{BTreeMap, BTreeSet}; -use std::path::{Path, PathBuf}; -use std::sync::Arc; +use std::collections::BTreeMap; use chrono::{DateTime, Utc}; -use color_eyre::eyre::eyre; -use helpers::AtomicFile; -use models::{ImageId, OptionExt}; +use models::PackageId; use reqwest::Url; -use rpc_toolkit::command; +use rpc_toolkit::{from_fn_async, HandlerExt, ParentHandler}; use serde::{Deserialize, Serialize}; -use tokio::fs::File; -use tokio::io::AsyncWriteExt; -use tracing::instrument; -use self::target::PackageBackupInfo; -use crate::context::RpcContext; -use crate::install::PKG_ARCHIVE_DIR; -use crate::manager::manager_seed::ManagerSeed; +use crate::context::CliContext; use crate::net::interface::InterfaceId; -use crate::net::keys::Key; +#[allow(unused_imports)] use crate::prelude::*; -use crate::procedure::docker::DockerContainers; -use crate::procedure::{NoOutput, PackageProcedure, ProcedureName}; -use crate::s9pk::manifest::PackageId; -use crate::util::serde::{Base32, Base64, IoFormat}; -use crate::util::Version; -use crate::version::{Current, VersionT}; -use crate::volume::{backup_dir, Volume, VolumeId, Volumes, BACKUP_DIR}; -use crate::{Error, ErrorKind, ResultExt}; +use crate::util::serde::{Base32, Base64}; pub mod backup_bulk; pub mod os; @@ -51,14 +34,16 @@ pub struct PackageBackupReport { pub error: Option, } -#[command(subcommands(backup_bulk::backup_all, target::target))] -pub fn backup() -> Result<(), Error> { - Ok(()) -} - -#[command(rename = "backup", subcommands(restore::restore_packages_rpc))] -pub fn package_backup() -> Result<(), Error> { - Ok(()) +// #[command(subcommands(backup_bulk::backup_all, target::target))] +pub fn backup() -> ParentHandler { + ParentHandler::new() + .subcommand( + "create", + from_fn_async(backup_bulk::backup_all) + .no_display() + .with_remote_cli::(), + ) + .subcommand("target", target::target()) } #[derive(Deserialize, Serialize)] @@ -70,157 +55,3 @@ struct BackupMetadata { pub tor_keys: BTreeMap>, // DEPRECATED pub marketplace_url: Option, } - -#[derive(Clone, Debug, Deserialize, Serialize, HasModel)] -#[model = "Model"] -pub struct BackupActions { - pub create: PackageProcedure, - pub restore: PackageProcedure, -} -impl BackupActions { - pub fn validate( - &self, - _container: &Option, - eos_version: &Version, - volumes: &Volumes, - image_ids: &BTreeSet, - ) -> Result<(), Error> { - self.create - .validate(eos_version, volumes, image_ids, false) - .with_ctx(|_| (crate::ErrorKind::ValidateS9pk, "Backup Create"))?; - self.restore - .validate(eos_version, volumes, image_ids, false) - .with_ctx(|_| (crate::ErrorKind::ValidateS9pk, "Backup Restore"))?; - Ok(()) - } - - #[instrument(skip_all)] - pub async fn create(&self, seed: Arc) -> Result { - let manifest = &seed.manifest; - let mut volumes = seed.manifest.volumes.to_readonly(); - let ctx = &seed.ctx; - let pkg_id = &manifest.id; - let pkg_version = &manifest.version; - volumes.insert(VolumeId::Backup, Volume::Backup { readonly: false }); - let backup_dir = backup_dir(&manifest.id); - if tokio::fs::metadata(&backup_dir).await.is_err() { - tokio::fs::create_dir_all(&backup_dir).await? - } - self.create - .execute::<(), NoOutput>( - ctx, - pkg_id, - pkg_version, - ProcedureName::CreateBackup, - &volumes, - None, - None, - ) - .await? - .map_err(|e| eyre!("{}", e.1)) - .with_kind(crate::ErrorKind::Backup)?; - let (network_keys, tor_keys): (Vec<_>, Vec<_>) = - Key::for_package(&ctx.secret_store, pkg_id) - .await? - .into_iter() - .filter_map(|k| { - let interface = k.interface().map(|(_, i)| i)?; - Some(( - (interface.clone(), Base64(k.as_bytes())), - (interface, Base32(k.tor_key().as_bytes())), - )) - }) - .unzip(); - let marketplace_url = ctx - .db - .peek() - .await - .as_package_data() - .as_idx(&pkg_id) - .or_not_found(pkg_id)? - .expect_as_installed()? - .as_installed() - .as_marketplace_url() - .de()?; - let tmp_path = Path::new(BACKUP_DIR) - .join(pkg_id) - .join(format!("{}.s9pk", pkg_id)); - let s9pk_path = ctx - .datadir - .join(PKG_ARCHIVE_DIR) - .join(pkg_id) - .join(pkg_version.as_str()) - .join(format!("{}.s9pk", pkg_id)); - let mut infile = File::open(&s9pk_path).await?; - let mut outfile = AtomicFile::new(&tmp_path, None::) - .await - .with_kind(ErrorKind::Filesystem)?; - tokio::io::copy(&mut infile, &mut *outfile) - .await - .with_ctx(|_| { - ( - crate::ErrorKind::Filesystem, - format!("cp {} -> {}", s9pk_path.display(), tmp_path.display()), - ) - })?; - outfile.save().await.with_kind(ErrorKind::Filesystem)?; - let timestamp = Utc::now(); - let metadata_path = Path::new(BACKUP_DIR).join(pkg_id).join("metadata.cbor"); - let mut outfile = AtomicFile::new(&metadata_path, None::) - .await - .with_kind(ErrorKind::Filesystem)?; - let network_keys = network_keys.into_iter().collect(); - let tor_keys = tor_keys.into_iter().collect(); - outfile - .write_all(&IoFormat::Cbor.to_vec(&BackupMetadata { - timestamp, - network_keys, - tor_keys, - marketplace_url, - })?) - .await?; - outfile.save().await.with_kind(ErrorKind::Filesystem)?; - Ok(PackageBackupInfo { - os_version: Current::new().semver().into(), - title: manifest.title.clone(), - version: pkg_version.clone(), - timestamp, - }) - } - - #[instrument(skip_all)] - pub async fn restore( - &self, - ctx: &RpcContext, - pkg_id: &PackageId, - pkg_version: &Version, - volumes: &Volumes, - ) -> Result, Error> { - let mut volumes = volumes.clone(); - volumes.insert(VolumeId::Backup, Volume::Backup { readonly: true }); - self.restore - .execute::<(), NoOutput>( - ctx, - pkg_id, - pkg_version, - ProcedureName::RestoreBackup, - &volumes, - None, - None, - ) - .await? - .map_err(|e| eyre!("{}", e.1)) - .with_kind(crate::ErrorKind::Restore)?; - let metadata_path = Path::new(BACKUP_DIR).join(pkg_id).join("metadata.cbor"); - let metadata: BackupMetadata = IoFormat::Cbor.from_slice( - &tokio::fs::read(&metadata_path).await.with_ctx(|_| { - ( - crate::ErrorKind::Filesystem, - metadata_path.display().to_string(), - ) - })?, - )?; - - Ok(metadata.marketplace_url) - } -} diff --git a/core/startos/src/backup/restore.rs b/core/startos/src/backup/restore.rs index b72b319e2..404c12c6b 100644 --- a/core/startos/src/backup/restore.rs +++ b/core/startos/src/backup/restore.rs @@ -1,55 +1,46 @@ use std::collections::BTreeMap; -use std::path::Path; -use std::sync::atomic::Ordering; use std::sync::Arc; -use std::time::Duration; -use clap::ArgMatches; -use futures::future::BoxFuture; -use futures::{stream, FutureExt, StreamExt}; +use clap::Parser; +use futures::{stream, StreamExt}; +use models::PackageId; use openssl::x509::X509; -use rpc_toolkit::command; -use sqlx::Connection; -use tokio::fs::File; +use serde::{Deserialize, Serialize}; use torut::onion::OnionAddressV3; use tracing::instrument; use super::target::BackupTargetId; use crate::backup::os::OsBackup; -use crate::backup::BackupMetadata; -use crate::context::rpc::RpcContextConfig; use crate::context::{RpcContext, SetupContext}; -use crate::db::model::{PackageDataEntry, PackageDataEntryRestoring, StaticFiles}; -use crate::disk::mount::backup::{BackupMountGuard, PackageBackupMountGuard}; +use crate::disk::mount::backup::BackupMountGuard; use crate::disk::mount::filesystem::ReadWrite; -use crate::disk::mount::guard::TmpMountGuard; +use crate::disk::mount::guard::{GenericMountGuard, TmpMountGuard}; use crate::hostname::Hostname; use crate::init::init; -use crate::install::progress::InstallProgress; -use crate::install::{download_install_s9pk, PKG_PUBLIC_DIR}; -use crate::notifications::NotificationLevel; use crate::prelude::*; -use crate::s9pk::manifest::{Manifest, PackageId}; -use crate::s9pk::reader::S9pkReader; -use crate::setup::SetupStatus; -use crate::util::display_none; -use crate::util::io::dir_size; +use crate::s9pk::S9pk; +use crate::service::service_map::DownloadInstallFuture; use crate::util::serde::IoFormat; -use crate::volume::{backup_dir, BACKUP_DIR, PKG_VOLUME_DIR}; -fn parse_comma_separated(arg: &str, _: &ArgMatches) -> Result, Error> { - arg.split(',') - .map(|s| s.trim().parse().map_err(Error::from)) - .collect() +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct RestorePackageParams { + pub ids: Vec, + pub target_id: BackupTargetId, + pub password: String, } -#[command(rename = "restore", display(display_none))] +// TODO dr Why doesn't anything use this +// #[command(rename = "restore", display(display_none))] #[instrument(skip(ctx, password))] pub async fn restore_packages_rpc( - #[context] ctx: RpcContext, - #[arg(parse(parse_comma_separated))] ids: Vec, - #[arg(rename = "target-id")] target_id: BackupTargetId, - #[arg] password: String, + ctx: RpcContext, + RestorePackageParams { + ids, + target_id, + password, + }: RestorePackageParams, ) -> Result<(), Error> { let fs = target_id .load(ctx.secret_store.acquire().await?.as_mut()) @@ -57,114 +48,25 @@ pub async fn restore_packages_rpc( let backup_guard = BackupMountGuard::mount(TmpMountGuard::mount(&fs, ReadWrite).await?, &password).await?; - let (backup_guard, tasks, _) = restore_packages(&ctx, backup_guard, ids).await?; + let tasks = restore_packages(&ctx, backup_guard, ids).await?; tokio::spawn(async move { - stream::iter(tasks.into_iter().map(|x| (x, ctx.clone()))) - .for_each_concurrent(5, |(res, ctx)| async move { - match res.await { - (Ok(_), _) => (), - (Err(err), package_id) => { - if let Err(err) = ctx - .notification_manager - .notify( - ctx.db.clone(), - Some(package_id.clone()), - NotificationLevel::Error, - "Restoration Failure".to_string(), - format!("Error restoring package {}: {}", package_id, err), - (), - None, - ) - .await - { - tracing::error!("Failed to notify: {}", err); - tracing::debug!("{:?}", err); - }; - tracing::error!("Error restoring package {}: {}", package_id, err); + stream::iter(tasks) + .for_each_concurrent(5, |(id, res)| async move { + match async { res.await?.await }.await { + Ok(_) => (), + Err(err) => { + tracing::error!("Error restoring package {}: {}", id, err); tracing::debug!("{:?}", err); } } }) .await; - if let Err(e) = backup_guard.unmount().await { - tracing::error!("Error unmounting backup drive: {}", e); - tracing::debug!("{:?}", e); - } }); Ok(()) } -async fn approximate_progress( - rpc_ctx: &RpcContext, - progress: &mut ProgressInfo, -) -> Result<(), Error> { - for (id, size) in &mut progress.target_volume_size { - let dir = rpc_ctx.datadir.join(PKG_VOLUME_DIR).join(id).join("data"); - if tokio::fs::metadata(&dir).await.is_err() { - *size = 0; - } else { - *size = dir_size(&dir, None).await?; - } - } - Ok(()) -} - -async fn approximate_progress_loop( - ctx: &SetupContext, - rpc_ctx: &RpcContext, - mut starting_info: ProgressInfo, -) { - loop { - if let Err(e) = approximate_progress(rpc_ctx, &mut starting_info).await { - tracing::error!("Failed to approximate restore progress: {}", e); - tracing::debug!("{:?}", e); - } else { - *ctx.setup_status.write().await = Some(Ok(starting_info.flatten())); - } - tokio::time::sleep(Duration::from_secs(1)).await; - } -} - -#[derive(Debug, Default)] -struct ProgressInfo { - package_installs: BTreeMap>, - src_volume_size: BTreeMap, - target_volume_size: BTreeMap, -} -impl ProgressInfo { - fn flatten(&self) -> SetupStatus { - let mut total_bytes = 0; - let mut bytes_transferred = 0; - - for progress in self.package_installs.values() { - total_bytes += ((progress.size.unwrap_or(0) as f64) * 2.2) as u64; - bytes_transferred += progress.downloaded.load(Ordering::SeqCst); - bytes_transferred += ((progress.validated.load(Ordering::SeqCst) as f64) * 0.2) as u64; - bytes_transferred += progress.unpacked.load(Ordering::SeqCst); - } - - for size in self.src_volume_size.values() { - total_bytes += *size; - } - - for size in self.target_volume_size.values() { - bytes_transferred += *size; - } - - if bytes_transferred > total_bytes { - bytes_transferred = total_bytes; - } - - SetupStatus { - total_bytes: Some(total_bytes), - bytes_transferred, - complete: false, - } - } -} - #[instrument(skip(ctx))] pub async fn recover_full_embassy( ctx: SetupContext, @@ -179,7 +81,7 @@ pub async fn recover_full_embassy( ) .await?; - let os_backup_path = backup_guard.as_ref().join("os-backup.cbor"); + let os_backup_path = backup_guard.path().join("os-backup.cbor"); let mut os_backup: OsBackup = IoFormat::Cbor.from_slice( &tokio::fs::read(&os_backup_path) .await @@ -199,11 +101,9 @@ pub async fn recover_full_embassy( secret_store.close().await; - let cfg = RpcContextConfig::load(ctx.config_path.clone()).await?; + init(&ctx.config).await?; - init(&cfg).await?; - - let rpc_ctx = RpcContext::init(ctx.config_path.clone(), disk_guid.clone()).await?; + let rpc_ctx = RpcContext::init(&ctx.config, disk_guid.clone()).await?; let ids: Vec<_> = backup_guard .metadata @@ -211,37 +111,19 @@ pub async fn recover_full_embassy( .keys() .cloned() .collect(); - let (backup_guard, tasks, progress_info) = - restore_packages(&rpc_ctx, backup_guard, ids).await?; - let task_consumer_rpc_ctx = rpc_ctx.clone(); - tokio::select! { - _ = async move { - stream::iter(tasks.into_iter().map(|x| (x, task_consumer_rpc_ctx.clone()))) - .for_each_concurrent(5, |(res, ctx)| async move { - match res.await { - (Ok(_), _) => (), - (Err(err), package_id) => { - if let Err(err) = ctx.notification_manager.notify( - ctx.db.clone(), - Some(package_id.clone()), - NotificationLevel::Error, - "Restoration Failure".to_string(), format!("Error restoring package {}: {}", package_id,err), (), None).await{ - tracing::error!("Failed to notify: {}", err); - tracing::debug!("{:?}", err); - }; - tracing::error!("Error restoring package {}: {}", package_id, err); - tracing::debug!("{:?}", err); - }, - } - }).await; - - } => { - - }, - _ = approximate_progress_loop(&ctx, &rpc_ctx, progress_info) => unreachable!(concat!(module_path!(), "::approximate_progress_loop should not terminate")), - } + let tasks = restore_packages(&rpc_ctx, backup_guard, ids).await?; + stream::iter(tasks) + .for_each_concurrent(5, |(id, res)| async move { + match async { res.await?.await }.await { + Ok(_) => (), + Err(err) => { + tracing::error!("Error restoring package {}: {}", id, err); + tracing::debug!("{:?}", err); + } + } + }) + .await; - backup_guard.unmount().await?; rpc_ctx.shutdown().await?; Ok(( @@ -257,205 +139,25 @@ async fn restore_packages( ctx: &RpcContext, backup_guard: BackupMountGuard, ids: Vec, -) -> Result< - ( - BackupMountGuard, - Vec, PackageId)>>, - ProgressInfo, - ), - Error, -> { - let guards = assure_restoring(ctx, ids, &backup_guard).await?; - - let mut progress_info = ProgressInfo::default(); - - let mut tasks = Vec::with_capacity(guards.len()); - for (manifest, guard) in guards { - let id = manifest.id.clone(); - let (progress, task) = restore_package(ctx.clone(), manifest, guard).await?; - progress_info - .package_installs - .insert(id.clone(), progress.clone()); - progress_info - .src_volume_size - .insert(id.clone(), dir_size(backup_dir(&id), None).await?); - progress_info.target_volume_size.insert(id.clone(), 0); - let package_id = id.clone(); - tasks.push( - async move { - if let Err(e) = task.await { - tracing::error!("Error restoring package {}: {}", id, e); - tracing::debug!("{:?}", e); - Err(e) - } else { - Ok(()) - } - } - .map(|x| (x, package_id)) - .boxed(), - ); - } - - Ok((backup_guard, tasks, progress_info)) -} - -#[instrument(skip(ctx, backup_guard))] -async fn assure_restoring( - ctx: &RpcContext, - ids: Vec, - backup_guard: &BackupMountGuard, -) -> Result, Error> { - let mut guards = Vec::with_capacity(ids.len()); - - let mut insert_packages = BTreeMap::new(); - +) -> Result, Error> { + let backup_guard = Arc::new(backup_guard); + let mut tasks = BTreeMap::new(); for id in ids { - let peek = ctx.db.peek().await; - - let model = peek.as_package_data().as_idx(&id); - - if !model.is_none() { - return Err(Error::new( - eyre!("Can't restore over existing package: {}", id), - crate::ErrorKind::InvalidRequest, - )); - } - let guard = backup_guard.mount_package_backup(&id).await?; - let s9pk_path = Path::new(BACKUP_DIR).join(&id).join(format!("{}.s9pk", id)); - let mut rdr = S9pkReader::open(&s9pk_path, false).await?; - - let manifest = rdr.manifest().await?; - let version = manifest.version.clone(); - let progress = Arc::new(InstallProgress::new(Some( - tokio::fs::metadata(&s9pk_path).await?.len(), - ))); - - let public_dir_path = ctx - .datadir - .join(PKG_PUBLIC_DIR) - .join(&id) - .join(version.as_str()); - tokio::fs::create_dir_all(&public_dir_path).await?; - - let license_path = public_dir_path.join("LICENSE.md"); - let mut dst = File::create(&license_path).await?; - tokio::io::copy(&mut rdr.license().await?, &mut dst).await?; - dst.sync_all().await?; - - let instructions_path = public_dir_path.join("INSTRUCTIONS.md"); - let mut dst = File::create(&instructions_path).await?; - tokio::io::copy(&mut rdr.instructions().await?, &mut dst).await?; - dst.sync_all().await?; - - let icon_path = Path::new("icon").with_extension(&manifest.assets.icon_type()); - let icon_path = public_dir_path.join(&icon_path); - let mut dst = File::create(&icon_path).await?; - tokio::io::copy(&mut rdr.icon().await?, &mut dst).await?; - dst.sync_all().await?; - insert_packages.insert( - id.clone(), - PackageDataEntry::Restoring(PackageDataEntryRestoring { - install_progress: progress.clone(), - static_files: StaticFiles::local(&id, &version, manifest.assets.icon_type()), - manifest: manifest.clone(), - }), - ); - - guards.push((manifest, guard)); - } - ctx.db - .mutate(|db| { - for (id, package) in insert_packages { - db.as_package_data_mut().insert(&id, &package)?; - } - Ok(()) - }) - .await?; - Ok(guards) -} - -#[instrument(skip(ctx, guard))] -async fn restore_package<'a>( - ctx: RpcContext, - manifest: Manifest, - guard: PackageBackupMountGuard, -) -> Result<(Arc, BoxFuture<'static, Result<(), Error>>), Error> { - let id = manifest.id.clone(); - let s9pk_path = Path::new(BACKUP_DIR) - .join(&manifest.id) - .join(format!("{}.s9pk", id)); - - let metadata_path = Path::new(BACKUP_DIR).join(&id).join("metadata.cbor"); - let metadata: BackupMetadata = IoFormat::Cbor.from_slice( - &tokio::fs::read(&metadata_path) - .await - .with_ctx(|_| (ErrorKind::Filesystem, metadata_path.display().to_string()))?, - )?; - - let mut secrets = ctx.secret_store.acquire().await?; - let mut secrets_tx = secrets.begin().await?; - for (iface, key) in metadata.network_keys { - let k = key.0.as_slice(); - sqlx::query!( - "INSERT INTO network_keys (package, interface, key) VALUES ($1, $2, $3) ON CONFLICT (package, interface) DO NOTHING", - id.to_string(), - iface.to_string(), - k, - ) - .execute(secrets_tx.as_mut()).await?; - } - // DEPRECATED - for (iface, key) in metadata.tor_keys { - let k = key.0.as_slice(); - sqlx::query!( - "INSERT INTO tor (package, interface, key) VALUES ($1, $2, $3) ON CONFLICT (package, interface) DO NOTHING", - id.to_string(), - iface.to_string(), - k, - ) - .execute(secrets_tx.as_mut()).await?; - } - secrets_tx.commit().await?; - drop(secrets); - - let len = tokio::fs::metadata(&s9pk_path) - .await - .with_ctx(|_| (ErrorKind::Filesystem, s9pk_path.display().to_string()))? - .len(); - let file = File::open(&s9pk_path) - .await - .with_ctx(|_| (ErrorKind::Filesystem, s9pk_path.display().to_string()))?; - - let progress = InstallProgress::new(Some(len)); - let marketplace_url = metadata.marketplace_url; - - let progress = Arc::new(progress); - - ctx.db - .mutate(|db| { - db.as_package_data_mut().insert( - &id, - &PackageDataEntry::Restoring(PackageDataEntryRestoring { - install_progress: progress.clone(), - static_files: StaticFiles::local( - &id, - &manifest.version, - manifest.assets.icon_type(), - ), - manifest: manifest.clone(), - }), + let backup_dir = backup_guard.clone().package_backup(&id); + let task = ctx + .services + .install( + ctx.clone(), + S9pk::open( + backup_dir.path().join(&id).with_extension("s9pk"), + Some(&id), + ) + .await?, + Some(backup_dir), ) - }) - .await?; - Ok(( - progress.clone(), - async move { - download_install_s9pk(ctx, manifest, marketplace_url, progress, file, None).await?; - - guard.unmount().await?; + .await?; + tasks.insert(id, task); + } - Ok(()) - } - .boxed(), - )) + Ok(tasks) } diff --git a/core/startos/src/backup/target/cifs.rs b/core/startos/src/backup/target/cifs.rs index 3f3251535..4f3ee4827 100644 --- a/core/startos/src/backup/target/cifs.rs +++ b/core/startos/src/backup/target/cifs.rs @@ -1,19 +1,19 @@ use std::path::{Path, PathBuf}; +use clap::Parser; use color_eyre::eyre::eyre; use futures::TryStreamExt; -use rpc_toolkit::command; +use rpc_toolkit::{command, from_fn_async, HandlerExt, ParentHandler}; use serde::{Deserialize, Serialize}; use sqlx::{Executor, Postgres}; use super::{BackupTarget, BackupTargetId}; -use crate::context::RpcContext; +use crate::context::{CliContext, RpcContext}; use crate::disk::mount::filesystem::cifs::Cifs; use crate::disk::mount::filesystem::ReadOnly; -use crate::disk::mount::guard::TmpMountGuard; +use crate::disk::mount::guard::{GenericMountGuard, TmpMountGuard}; use crate::disk::util::{recovery_info, EmbassyOsRecoveryInfo}; use crate::prelude::*; -use crate::util::display_none; use crate::util::serde::KeyVal; #[derive(Debug, Deserialize, Serialize)] @@ -26,18 +26,46 @@ pub struct CifsBackupTarget { embassy_os: Option, } -#[command(subcommands(add, update, remove))] -pub fn cifs() -> Result<(), Error> { - Ok(()) +pub fn cifs() -> ParentHandler { + ParentHandler::new() + .subcommand( + "add", + from_fn_async(add) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "update", + from_fn_async(update) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "remove", + from_fn_async(remove) + .no_display() + .with_remote_cli::(), + ) +} + +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct AddParams { + pub hostname: String, + pub path: PathBuf, + pub username: String, + pub password: Option, } -#[command(display(display_none))] pub async fn add( - #[context] ctx: RpcContext, - #[arg] hostname: String, - #[arg] path: PathBuf, - #[arg] username: String, - #[arg] password: Option, + ctx: RpcContext, + AddParams { + hostname, + path, + username, + password, + }: AddParams, ) -> Result, Error> { let cifs = Cifs { hostname, @@ -46,7 +74,7 @@ pub async fn add( password, }; let guard = TmpMountGuard::mount(&cifs, ReadOnly).await?; - let embassy_os = recovery_info(&guard).await?; + let embassy_os = recovery_info(guard.path()).await?; guard.unmount().await?; let path_string = Path::new("/").join(&cifs.path).display().to_string(); let id: i32 = sqlx::query!( @@ -70,14 +98,26 @@ pub async fn add( }) } -#[command(display(display_none))] +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct UpdateParams { + pub id: BackupTargetId, + pub hostname: String, + pub path: PathBuf, + pub username: String, + pub password: Option, +} + pub async fn update( - #[context] ctx: RpcContext, - #[arg] id: BackupTargetId, - #[arg] hostname: String, - #[arg] path: PathBuf, - #[arg] username: String, - #[arg] password: Option, + ctx: RpcContext, + UpdateParams { + id, + hostname, + path, + username, + password, + }: UpdateParams, ) -> Result, Error> { let id = if let BackupTargetId::Cifs { id } = id { id @@ -94,7 +134,7 @@ pub async fn update( password, }; let guard = TmpMountGuard::mount(&cifs, ReadOnly).await?; - let embassy_os = recovery_info(&guard).await?; + let embassy_os = recovery_info(guard.path()).await?; guard.unmount().await?; let path_string = Path::new("/").join(&cifs.path).display().to_string(); if sqlx::query!( @@ -127,8 +167,14 @@ pub async fn update( }) } -#[command(display(display_none))] -pub async fn remove(#[context] ctx: RpcContext, #[arg] id: BackupTargetId) -> Result<(), Error> { +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct RemoveParams { + pub id: BackupTargetId, +} + +pub async fn remove(ctx: RpcContext, RemoveParams { id }: RemoveParams) -> Result<(), Error> { let id = if let BackupTargetId::Cifs { id } = id { id } else { @@ -189,7 +235,7 @@ where }; let embassy_os = async { let guard = TmpMountGuard::mount(&mount_info, ReadOnly).await?; - let embassy_os = recovery_info(&guard).await?; + let embassy_os = recovery_info(guard.path()).await?; guard.unmount().await?; Ok::<_, Error>(embassy_os) } diff --git a/core/startos/src/backup/target/mod.rs b/core/startos/src/backup/target/mod.rs index 93e56c2d3..473b2865d 100644 --- a/core/startos/src/backup/target/mod.rs +++ b/core/startos/src/backup/target/mod.rs @@ -1,13 +1,14 @@ use std::collections::BTreeMap; use std::path::{Path, PathBuf}; -use async_trait::async_trait; use chrono::{DateTime, Utc}; -use clap::ArgMatches; +use clap::builder::ValueParserFactory; +use clap::Parser; use color_eyre::eyre::eyre; use digest::generic_array::GenericArray; use digest::OutputSizeUser; -use rpc_toolkit::command; +use models::PackageId; +use rpc_toolkit::{command, from_fn_async, AnyContext, HandlerExt, ParentHandler}; use serde::{Deserialize, Serialize}; use sha2::Sha256; use sqlx::{Executor, Postgres}; @@ -15,17 +16,19 @@ use tokio::sync::Mutex; use tracing::instrument; use self::cifs::CifsBackupTarget; -use crate::context::RpcContext; +use crate::context::{CliContext, RpcContext}; use crate::disk::mount::backup::BackupMountGuard; use crate::disk::mount::filesystem::block_dev::BlockDev; use crate::disk::mount::filesystem::cifs::Cifs; use crate::disk::mount::filesystem::{FileSystem, MountType, ReadWrite}; -use crate::disk::mount::guard::TmpMountGuard; +use crate::disk::mount::guard::{GenericMountGuard, TmpMountGuard}; use crate::disk::util::PartitionInfo; use crate::prelude::*; -use crate::s9pk::manifest::PackageId; -use crate::util::serde::{deserialize_from_str, display_serializable, serialize_display}; -use crate::util::{display_none, Version}; +use crate::util::clap::FromStrParser; +use crate::util::serde::{ + deserialize_from_str, display_serializable, serialize_display, HandlerExtSerde, WithIoFormat, +}; +use crate::util::Version; pub mod cifs; @@ -84,6 +87,12 @@ impl std::str::FromStr for BackupTargetId { } } } +impl ValueParserFactory for BackupTargetId { + type Parser = FromStrParser; + fn value_parser() -> Self::Parser { + FromStrParser::new() + } +} impl<'de> Deserialize<'de> for BackupTargetId { fn deserialize(deserializer: D) -> Result where @@ -108,9 +117,8 @@ pub enum BackupTargetFS { Disk(BlockDev), Cifs(Cifs), } -#[async_trait] impl FileSystem for BackupTargetFS { - async fn mount + Send + Sync>( + async fn mount + Send>( &self, mountpoint: P, mount_type: MountType, @@ -130,15 +138,29 @@ impl FileSystem for BackupTargetFS { } } -#[command(subcommands(cifs::cifs, list, info, mount, umount))] -pub fn target() -> Result<(), Error> { - Ok(()) +// #[command(subcommands(cifs::cifs, list, info, mount, umount))] +pub fn target() -> ParentHandler { + ParentHandler::new() + .subcommand("cifs", cifs::cifs()) + .subcommand( + "list", + from_fn_async(list) + .with_display_serializable() + .with_remote_cli::(), + ) + .subcommand( + "info", + from_fn_async(info) + .with_display_serializable() + .with_custom_display_fn::(|params, info| { + Ok(display_backup_info(params.params, info)) + }) + .with_remote_cli::(), + ) } -#[command(display(display_serializable))] -pub async fn list( - #[context] ctx: RpcContext, -) -> Result, Error> { +// #[command(display(display_serializable))] +pub async fn list(ctx: RpcContext) -> Result, Error> { let mut sql_handle = ctx.secret_store.acquire().await?; let (disks_res, cifs) = tokio::try_join!( crate::disk::util::list(&ctx.os_partitions), @@ -187,11 +209,11 @@ pub struct PackageBackupInfo { pub timestamp: DateTime, } -fn display_backup_info(info: BackupInfo, matches: &ArgMatches) { +fn display_backup_info(params: WithIoFormat, info: BackupInfo) { use prettytable::*; - if matches.is_present("format") { - return display_serializable(info, matches); + if let Some(format) = params.format { + return display_serializable(format, info); } let mut table = Table::new(); @@ -223,12 +245,21 @@ fn display_backup_info(info: BackupInfo, matches: &ArgMatches) { table.print_tty(false).unwrap(); } -#[command(display(display_backup_info))] +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct InfoParams { + target_id: BackupTargetId, + password: String, +} + #[instrument(skip(ctx, password))] pub async fn info( - #[context] ctx: RpcContext, - #[arg(rename = "target-id")] target_id: BackupTargetId, - #[arg] password: String, + ctx: RpcContext, + InfoParams { + target_id, + password, + }: InfoParams, ) -> Result { let guard = BackupMountGuard::mount( TmpMountGuard::mount( @@ -254,17 +285,26 @@ lazy_static::lazy_static! { Mutex::new(BTreeMap::new()); } -#[command] +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct MountParams { + target_id: BackupTargetId, + password: String, +} + #[instrument(skip_all)] pub async fn mount( - #[context] ctx: RpcContext, - #[arg(rename = "target-id")] target_id: BackupTargetId, - #[arg] password: String, + ctx: RpcContext, + MountParams { + target_id, + password, + }: MountParams, ) -> Result { let mut mounts = USER_MOUNTS.lock().await; if let Some(existing) = mounts.get(&target_id) { - return Ok(existing.as_ref().display().to_string()); + return Ok(existing.path().display().to_string()); } let guard = BackupMountGuard::mount( @@ -280,19 +320,23 @@ pub async fn mount( ) .await?; - let res = guard.as_ref().display().to_string(); + let res = guard.path().display().to_string(); mounts.insert(target_id, guard); Ok(res) } -#[command(display(display_none))] + +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct UmountParams { + target_id: Option, +} + #[instrument(skip_all)] -pub async fn umount( - #[context] _ctx: RpcContext, - #[arg(rename = "target-id")] target_id: Option, -) -> Result<(), Error> { - let mut mounts = USER_MOUNTS.lock().await; +pub async fn umount(_: RpcContext, UmountParams { target_id }: UmountParams) -> Result<(), Error> { + let mut mounts = USER_MOUNTS.lock().await; // TODO: move to context if let Some(target_id) = target_id { if let Some(existing) = mounts.remove(&target_id) { existing.unmount().await?; diff --git a/core/startos/src/bins/avahi_alias.rs b/core/startos/src/bins/avahi_alias.rs deleted file mode 100644 index 3c4a4fe7e..000000000 --- a/core/startos/src/bins/avahi_alias.rs +++ /dev/null @@ -1,163 +0,0 @@ -use avahi_sys::{ - self, avahi_client_errno, avahi_entry_group_add_service, avahi_entry_group_commit, - avahi_strerror, AvahiClient, -}; - -fn log_str_error(action: &str, e: i32) { - unsafe { - let e_str = avahi_strerror(e); - eprintln!( - "Could not {}: {:?}", - action, - std::ffi::CStr::from_ptr(e_str) - ); - } -} - -pub fn main() { - let aliases: Vec<_> = std::env::args().skip(1).collect(); - unsafe { - let simple_poll = avahi_sys::avahi_simple_poll_new(); - let poll = avahi_sys::avahi_simple_poll_get(simple_poll); - let mut box_err = Box::pin(0 as i32); - let err_c: *mut i32 = box_err.as_mut().get_mut(); - let avahi_client = avahi_sys::avahi_client_new( - poll, - avahi_sys::AvahiClientFlags::AVAHI_CLIENT_NO_FAIL, - Some(client_callback), - std::ptr::null_mut(), - err_c, - ); - if avahi_client == std::ptr::null_mut::() { - log_str_error("create Avahi client", *box_err); - panic!("Failed to create Avahi Client"); - } - let group = avahi_sys::avahi_entry_group_new( - avahi_client, - Some(entry_group_callback), - std::ptr::null_mut(), - ); - if group == std::ptr::null_mut() { - log_str_error("create Avahi entry group", avahi_client_errno(avahi_client)); - panic!("Failed to create Avahi Entry Group"); - } - let mut hostname_buf = vec![0]; - let hostname_raw = avahi_sys::avahi_client_get_host_name_fqdn(avahi_client); - hostname_buf.extend_from_slice(std::ffi::CStr::from_ptr(hostname_raw).to_bytes_with_nul()); - let buflen = hostname_buf.len(); - debug_assert!(hostname_buf.ends_with(b".local\0")); - debug_assert!(!hostname_buf[..(buflen - 7)].contains(&b'.')); - // assume fixed length prefix on hostname due to local address - hostname_buf[0] = (buflen - 8) as u8; // set the prefix length to len - 8 (leading byte, .local, nul) for the main address - hostname_buf[buflen - 7] = 5; // set the prefix length to 5 for "local" - let mut res; - let http_tcp_cstr = - std::ffi::CString::new("_http._tcp").expect("Could not cast _http._tcp to c string"); - res = avahi_entry_group_add_service( - group, - avahi_sys::AVAHI_IF_UNSPEC, - avahi_sys::AVAHI_PROTO_UNSPEC, - avahi_sys::AvahiPublishFlags_AVAHI_PUBLISH_USE_MULTICAST, - hostname_raw, - http_tcp_cstr.as_ptr(), - std::ptr::null(), - std::ptr::null(), - 443, - // below is a secret final argument that the type signature of this function does not tell you that it - // needs. This is because the C lib function takes a variable number of final arguments indicating the - // desired TXT records to add to this service entry. The way it decides when to stop taking arguments - // from the stack and dereferencing them is when it finds a null pointer...because fuck you, that's why. - // The consequence of this is that forgetting this last argument will cause segfaults or other undefined - // behavior. Welcome back to the stone age motherfucker. - std::ptr::null::(), - ); - if res < avahi_sys::AVAHI_OK { - log_str_error("add service to Avahi entry group", res); - panic!("Failed to load Avahi services"); - } - eprintln!("Published {:?}", std::ffi::CStr::from_ptr(hostname_raw)); - for alias in aliases { - let lan_address = alias + ".local"; - let lan_address_ptr = std::ffi::CString::new(lan_address) - .expect("Could not cast lan address to c string"); - res = avahi_sys::avahi_entry_group_add_record( - group, - avahi_sys::AVAHI_IF_UNSPEC, - avahi_sys::AVAHI_PROTO_UNSPEC, - avahi_sys::AvahiPublishFlags_AVAHI_PUBLISH_USE_MULTICAST - | avahi_sys::AvahiPublishFlags_AVAHI_PUBLISH_ALLOW_MULTIPLE, - lan_address_ptr.as_ptr(), - avahi_sys::AVAHI_DNS_CLASS_IN as u16, - avahi_sys::AVAHI_DNS_TYPE_CNAME as u16, - avahi_sys::AVAHI_DEFAULT_TTL, - hostname_buf.as_ptr().cast(), - hostname_buf.len(), - ); - if res < avahi_sys::AVAHI_OK { - log_str_error("add CNAME record to Avahi entry group", res); - panic!("Failed to load Avahi services"); - } - eprintln!("Published {:?}", lan_address_ptr); - } - let commit_err = avahi_entry_group_commit(group); - if commit_err < avahi_sys::AVAHI_OK { - log_str_error("reset Avahi entry group", commit_err); - panic!("Failed to load Avahi services: reset"); - } - } - std::thread::park() -} - -unsafe extern "C" fn entry_group_callback( - _group: *mut avahi_sys::AvahiEntryGroup, - state: avahi_sys::AvahiEntryGroupState, - _userdata: *mut core::ffi::c_void, -) { - match state { - avahi_sys::AvahiEntryGroupState_AVAHI_ENTRY_GROUP_FAILURE => { - eprintln!("AvahiCallback: EntryGroupState = AVAHI_ENTRY_GROUP_FAILURE"); - } - avahi_sys::AvahiEntryGroupState_AVAHI_ENTRY_GROUP_COLLISION => { - eprintln!("AvahiCallback: EntryGroupState = AVAHI_ENTRY_GROUP_COLLISION"); - } - avahi_sys::AvahiEntryGroupState_AVAHI_ENTRY_GROUP_UNCOMMITED => { - eprintln!("AvahiCallback: EntryGroupState = AVAHI_ENTRY_GROUP_UNCOMMITED"); - } - avahi_sys::AvahiEntryGroupState_AVAHI_ENTRY_GROUP_ESTABLISHED => { - eprintln!("AvahiCallback: EntryGroupState = AVAHI_ENTRY_GROUP_ESTABLISHED"); - } - avahi_sys::AvahiEntryGroupState_AVAHI_ENTRY_GROUP_REGISTERING => { - eprintln!("AvahiCallback: EntryGroupState = AVAHI_ENTRY_GROUP_REGISTERING"); - } - other => { - eprintln!("AvahiCallback: EntryGroupState = {}", other); - } - } -} - -unsafe extern "C" fn client_callback( - _group: *mut avahi_sys::AvahiClient, - state: avahi_sys::AvahiClientState, - _userdata: *mut core::ffi::c_void, -) { - match state { - avahi_sys::AvahiClientState_AVAHI_CLIENT_FAILURE => { - eprintln!("AvahiCallback: ClientState = AVAHI_CLIENT_FAILURE"); - } - avahi_sys::AvahiClientState_AVAHI_CLIENT_S_RUNNING => { - eprintln!("AvahiCallback: ClientState = AVAHI_CLIENT_S_RUNNING"); - } - avahi_sys::AvahiClientState_AVAHI_CLIENT_CONNECTING => { - eprintln!("AvahiCallback: ClientState = AVAHI_CLIENT_CONNECTING"); - } - avahi_sys::AvahiClientState_AVAHI_CLIENT_S_COLLISION => { - eprintln!("AvahiCallback: ClientState = AVAHI_CLIENT_S_COLLISION"); - } - avahi_sys::AvahiClientState_AVAHI_CLIENT_S_REGISTERING => { - eprintln!("AvahiCallback: ClientState = AVAHI_CLIENT_S_REGISTERING"); - } - other => { - eprintln!("AvahiCallback: ClientState = {}", other); - } - } -} diff --git a/core/startos/src/bins/container_cli.rs b/core/startos/src/bins/container_cli.rs new file mode 100644 index 000000000..a33a99131 --- /dev/null +++ b/core/startos/src/bins/container_cli.rs @@ -0,0 +1,38 @@ +use std::ffi::OsString; + +use rpc_toolkit::CliApp; +use serde_json::Value; + +use crate::service::cli::{ContainerCliContext, ContainerClientConfig}; +use crate::util::logger::EmbassyLogger; +use crate::version::{Current, VersionT}; + +lazy_static::lazy_static! { + static ref VERSION_STRING: String = Current::new().semver().to_string(); +} + +pub fn main(args: impl IntoIterator) { + EmbassyLogger::init(); + if let Err(e) = CliApp::new( + |cfg: ContainerClientConfig| Ok(ContainerCliContext::init(cfg)), + crate::service::service_effect_handler::service_effect_handler(), + ) + .run(args) + { + match e.data { + Some(Value::String(s)) => eprintln!("{}: {}", e.message, s), + Some(Value::Object(o)) => { + if let Some(Value::String(s)) = o.get("details") { + eprintln!("{}: {}", e.message, s); + if let Some(Value::String(s)) = o.get("debug") { + tracing::debug!("{}", s) + } + } + } + Some(a) => eprintln!("{}: {}", e.message, a), + None => eprintln!("{}", e.message), + } + + std::process::exit(e.code); + } +} diff --git a/core/startos/src/bins/mod.rs b/core/startos/src/bins/mod.rs index d5b932019..68f2802e0 100644 --- a/core/startos/src/bins/mod.rs +++ b/core/startos/src/bins/mod.rs @@ -1,45 +1,54 @@ +use std::collections::VecDeque; +use std::ffi::OsString; use std::path::Path; -#[cfg(feature = "avahi-alias")] -pub mod avahi_alias; +#[cfg(feature = "container-runtime")] +pub mod container_cli; pub mod deprecated; #[cfg(feature = "cli")] pub mod start_cli; #[cfg(feature = "daemon")] pub mod start_init; -#[cfg(feature = "sdk")] -pub mod start_sdk; #[cfg(feature = "daemon")] pub mod startd; -fn select_executable(name: &str) -> Option { +fn select_executable(name: &str) -> Option)> { match name { - #[cfg(feature = "avahi-alias")] - "avahi-alias" => Some(avahi_alias::main), #[cfg(feature = "cli")] "start-cli" => Some(start_cli::main), - #[cfg(feature = "sdk")] - "start-sdk" => Some(start_sdk::main), + #[cfg(feature = "container-runtime")] + "start-cli" => Some(container_cli::main), #[cfg(feature = "daemon")] "startd" => Some(startd::main), - "embassy-cli" => Some(|| deprecated::renamed("embassy-cli", "start-cli")), - "embassy-sdk" => Some(|| deprecated::renamed("embassy-sdk", "start-sdk")), - "embassyd" => Some(|| deprecated::renamed("embassyd", "startd")), - "embassy-init" => Some(|| deprecated::removed("embassy-init")), + "embassy-cli" => Some(|_| deprecated::renamed("embassy-cli", "start-cli")), + "embassy-sdk" => Some(|_| deprecated::renamed("embassy-sdk", "start-sdk")), + "embassyd" => Some(|_| deprecated::renamed("embassyd", "startd")), + "embassy-init" => Some(|_| deprecated::removed("embassy-init")), _ => None, } } pub fn startbox() { - let args = std::env::args().take(2).collect::>(); - let executable = args - .get(0) - .and_then(|s| Path::new(&*s).file_name()) - .and_then(|s| s.to_str()); - if let Some(x) = executable.and_then(|s| select_executable(&s)) { - x() - } else { - eprintln!("unknown executable: {}", executable.unwrap_or("N/A")); - std::process::exit(1); + let mut args = std::env::args_os().collect::>(); + for _ in 0..2 { + if let Some(s) = args.pop_front() { + if let Some(x) = Path::new(&*s) + .file_name() + .and_then(|s| s.to_str()) + .and_then(|s| select_executable(&s)) + { + args.push_front(s); + return x(args); + } + } } + let args = std::env::args().collect::>(); + eprintln!( + "unknown executable: {}", + args.get(1) + .or_else(|| args.get(0)) + .map(|s| s.as_str()) + .unwrap_or("N/A") + ); + std::process::exit(1); } diff --git a/core/startos/src/bins/start_cli.rs b/core/startos/src/bins/start_cli.rs index 3ef64096e..374247f2e 100644 --- a/core/startos/src/bins/start_cli.rs +++ b/core/startos/src/bins/start_cli.rs @@ -1,62 +1,39 @@ -use clap::Arg; -use rpc_toolkit::run_cli; -use rpc_toolkit::yajrc::RpcError; +use std::ffi::OsString; + +use rpc_toolkit::CliApp; use serde_json::Value; +use crate::context::config::ClientConfig; use crate::context::CliContext; use crate::util::logger::EmbassyLogger; use crate::version::{Current, VersionT}; -use crate::Error; lazy_static::lazy_static! { static ref VERSION_STRING: String = Current::new().semver().to_string(); } -fn inner_main() -> Result<(), Error> { - run_cli!({ - command: crate::main_api, - app: app => app - .name("StartOS CLI") - .version(&**VERSION_STRING) - .arg( - clap::Arg::with_name("config") - .short('c') - .long("config") - .takes_value(true), - ) - .arg(Arg::with_name("host").long("host").short('h').takes_value(true)) - .arg(Arg::with_name("proxy").long("proxy").short('p').takes_value(true)), - context: matches => { - EmbassyLogger::init(); - CliContext::init(matches)? - }, - exit: |e: RpcError| { - match e.data { - Some(Value::String(s)) => eprintln!("{}: {}", e.message, s), - Some(Value::Object(o)) => if let Some(Value::String(s)) = o.get("details") { +pub fn main(args: impl IntoIterator) { + EmbassyLogger::init(); + if let Err(e) = CliApp::new( + |cfg: ClientConfig| Ok(CliContext::init(cfg.load()?)?), + crate::main_api(), + ) + .run(args) + { + match e.data { + Some(Value::String(s)) => eprintln!("{}: {}", e.message, s), + Some(Value::Object(o)) => { + if let Some(Value::String(s)) = o.get("details") { eprintln!("{}: {}", e.message, s); if let Some(Value::String(s)) = o.get("debug") { tracing::debug!("{}", s) } } - Some(a) => eprintln!("{}: {}", e.message, a), - None => eprintln!("{}", e.message), } - - std::process::exit(e.code); + Some(a) => eprintln!("{}: {}", e.message, a), + None => eprintln!("{}", e.message), } - }); - Ok(()) -} -pub fn main() { - match inner_main() { - Ok(_) => (), - Err(e) => { - eprintln!("{}", e.source); - tracing::debug!("{:?}", e.source); - drop(e.source); - std::process::exit(e.kind as i32) - } + std::process::exit(e.code); } } diff --git a/core/startos/src/bins/start_deno.rs b/core/startos/src/bins/start_deno.rs deleted file mode 100644 index 89c99ea9b..000000000 --- a/core/startos/src/bins/start_deno.rs +++ /dev/null @@ -1,142 +0,0 @@ -use rpc_toolkit::yajrc::RpcError; -use rpc_toolkit::{command, run_cli, Context}; -use serde_json::Value; - -use crate::procedure::js_scripts::ExecuteArgs; -use crate::s9pk::manifest::PackageId; -use crate::util::serde::{display_serializable, parse_stdin_deserializable, IoFormat}; -use crate::version::{Current, VersionT}; -use crate::Error; - -lazy_static::lazy_static! { - static ref VERSION_STRING: String = Current::new().semver().to_string(); -} - -struct DenoContext; -impl Context for DenoContext {} - -#[command(subcommands(execute, sandbox))] -fn deno_api() -> Result<(), Error> { - Ok(()) -} - -#[command(cli_only, display(display_serializable))] -async fn execute( - #[arg(stdin, parse(parse_stdin_deserializable))] arg: ExecuteArgs, - #[allow(unused_variables)] - #[arg(long = "format")] - format: Option, -) -> Result, Error> { - let ExecuteArgs { - procedure, - directory, - pkg_id, - pkg_version, - name, - volumes, - input, - } = arg; - PackageLogger::init(&pkg_id); - // procedure - // .execute_impl(&directory, &pkg_id, &pkg_version, name, &volumes, input) - // .await - todo!("@DRB Remove") -} -#[command(cli_only, display(display_serializable))] -async fn sandbox( - #[arg(stdin, parse(parse_stdin_deserializable))] arg: ExecuteArgs, - #[allow(unused_variables)] - #[arg(long = "format")] - format: Option, -) -> Result, Error> { - let ExecuteArgs { - procedure, - directory, - pkg_id, - pkg_version, - name, - volumes, - input, - } = arg; - PackageLogger::init(&pkg_id); - // procedure - // .sandboxed_impl(&directory, &pkg_id, &pkg_version, &volumes, input, name) - // .await - todo!("@DRB Remove") -} - -use tracing::Subscriber; -use tracing_subscriber::util::SubscriberInitExt; - -#[derive(Clone)] -struct PackageLogger {} - -impl PackageLogger { - fn base_subscriber(id: &PackageId) -> impl Subscriber { - use tracing_error::ErrorLayer; - use tracing_subscriber::prelude::*; - use tracing_subscriber::{fmt, EnvFilter}; - - let filter_layer = EnvFilter::default().add_directive( - format!("{}=warn", std::module_path!().split("::").next().unwrap()) - .parse() - .unwrap(), - ); - let fmt_layer = fmt::layer().with_writer(std::io::stderr).with_target(true); - let journald_layer = tracing_journald::layer() - .unwrap() - .with_syslog_identifier(format!("{id}.embassy")); - - let sub = tracing_subscriber::registry() - .with(filter_layer) - .with(fmt_layer) - .with(journald_layer) - .with(ErrorLayer::default()); - - sub - } - pub fn init(id: &PackageId) -> Self { - Self::base_subscriber(id).init(); - color_eyre::install().unwrap_or_else(|_| tracing::warn!("tracing too many times")); - - Self {} - } -} - -fn inner_main() -> Result<(), Error> { - run_cli!({ - command: deno_api, - app: app => app - .name("StartOS Deno Executor") - .version(&**VERSION_STRING), - context: _m => DenoContext, - exit: |e: RpcError| { - match e.data { - Some(Value::String(s)) => eprintln!("{}: {}", e.message, s), - Some(Value::Object(o)) => if let Some(Value::String(s)) = o.get("details") { - eprintln!("{}: {}", e.message, s); - if let Some(Value::String(s)) = o.get("debug") { - tracing::debug!("{}", s) - } - } - Some(a) => eprintln!("{}: {}", e.message, a), - None => eprintln!("{}", e.message), - } - - std::process::exit(e.code); - } - }); - Ok(()) -} - -pub fn main() { - match inner_main() { - Ok(_) => (), - Err(e) => { - eprintln!("{}", e.source); - tracing::debug!("{:?}", e.source); - drop(e.source); - std::process::exit(e.kind as i32) - } - } -} diff --git a/core/startos/src/bins/start_init.rs b/core/startos/src/bins/start_init.rs index 1cb070851..284748339 100644 --- a/core/startos/src/bins/start_init.rs +++ b/core/startos/src/bins/start_init.rs @@ -1,5 +1,5 @@ use std::net::{Ipv6Addr, SocketAddr}; -use std::path::{Path, PathBuf}; +use std::path::Path; use std::sync::Arc; use std::time::Duration; @@ -7,7 +7,7 @@ use helpers::NonDetachingJoinHandle; use tokio::process::Command; use tracing::instrument; -use crate::context::rpc::RpcContextConfig; +use crate::context::config::ServerConfig; use crate::context::{DiagnosticContext, InstallContext, SetupContext}; use crate::disk::fsck::{RepairStrategy, RequiresReboot}; use crate::disk::main::DEFAULT_PASSWORD; @@ -21,7 +21,7 @@ use crate::util::Invoke; use crate::{Error, ErrorKind, ResultExt, PLATFORM}; #[instrument(skip_all)] -async fn setup_or_init(cfg_path: Option) -> Result, Error> { +async fn setup_or_init(config: &ServerConfig) -> Result, Error> { let song = NonDetachingJoinHandle::from(tokio::spawn(async { loop { BEP.play().await.unwrap(); @@ -82,13 +82,12 @@ async fn setup_or_init(cfg_path: Option) -> Result, Er .invoke(crate::ErrorKind::OpenSsh) .await?; - let ctx = InstallContext::init(cfg_path).await?; + let ctx = InstallContext::init().await?; let server = WebServer::install( SocketAddr::new(Ipv6Addr::UNSPECIFIED.into(), 80), ctx.clone(), - ) - .await?; + )?; drop(song); tokio::time::sleep(Duration::from_secs(1)).await; // let the record state that I hate this @@ -109,26 +108,24 @@ async fn setup_or_init(cfg_path: Option) -> Result, Er .await .is_err() { - let ctx = SetupContext::init(cfg_path).await?; + let ctx = SetupContext::init(config)?; let server = WebServer::setup( SocketAddr::new(Ipv6Addr::UNSPECIFIED.into(), 80), ctx.clone(), - ) - .await?; + )?; drop(song); tokio::time::sleep(Duration::from_secs(1)).await; // let the record state that I hate this CHIME.play().await?; - ctx.shutdown - .subscribe() - .recv() - .await - .expect("context dropped"); + let mut shutdown = ctx.shutdown.subscribe(); + shutdown.recv().await.expect("context dropped"); server.shutdown().await; + drop(shutdown); + tokio::task::yield_now().await; if let Err(e) = Command::new("killall") .arg("firefox-esr") @@ -139,13 +136,12 @@ async fn setup_or_init(cfg_path: Option) -> Result, Er tracing::debug!("{:?}", e); } } else { - let cfg = RpcContextConfig::load(cfg_path).await?; let guid_string = tokio::fs::read_to_string("/media/embassy/config/disk.guid") // unique identifier for volume group - keeps track of the disk that goes with your embassy .await?; let guid = guid_string.trim(); let requires_reboot = crate::disk::main::import( guid, - cfg.datadir(), + config.datadir(), if tokio::fs::metadata(REPAIR_DISK_PATH).await.is_ok() { RepairStrategy::Aggressive } else { @@ -164,13 +160,13 @@ async fn setup_or_init(cfg_path: Option) -> Result, Er .with_ctx(|_| (crate::ErrorKind::Filesystem, REPAIR_DISK_PATH))?; } if requires_reboot.0 { - crate::disk::main::export(guid, cfg.datadir()).await?; + crate::disk::main::export(guid, config.datadir()).await?; Command::new("reboot") .invoke(crate::ErrorKind::Unknown) .await?; } tracing::info!("Loaded Disk"); - crate::init::init(&cfg).await?; + crate::init::init(config).await?; drop(song); } @@ -196,7 +192,7 @@ async fn run_script_if_exists>(path: P) { } #[instrument(skip_all)] -async fn inner_main(cfg_path: Option) -> Result, Error> { +async fn inner_main(config: &ServerConfig) -> Result, Error> { if &*PLATFORM == "raspberrypi" && tokio::fs::metadata(STANDBY_MODE_PATH).await.is_ok() { tokio::fs::remove_file(STANDBY_MODE_PATH).await?; Command::new("sync").invoke(ErrorKind::Filesystem).await?; @@ -208,7 +204,7 @@ async fn inner_main(cfg_path: Option) -> Result, Error run_script_if_exists("/media/embassy/config/preinit.sh").await; - let res = match setup_or_init(cfg_path.clone()).await { + let res = match setup_or_init(config).await { Err(e) => { async move { tracing::error!("{}", e.source); @@ -216,7 +212,7 @@ async fn inner_main(cfg_path: Option) -> Result, Error crate::sound::BEETHOVEN.play().await?; let ctx = DiagnosticContext::init( - cfg_path, + config, if tokio::fs::metadata("/media/embassy/config/disk.guid") .await .is_ok() @@ -231,14 +227,12 @@ async fn inner_main(cfg_path: Option) -> Result, Error None }, e, - ) - .await?; + )?; let server = WebServer::diagnostic( SocketAddr::new(Ipv6Addr::UNSPECIFIED.into(), 80), ctx.clone(), - ) - .await?; + )?; let shutdown = ctx.shutdown.subscribe().recv().await.unwrap(); @@ -256,23 +250,13 @@ async fn inner_main(cfg_path: Option) -> Result, Error res } -pub fn main() { - let matches = clap::App::new("start-init") - .arg( - clap::Arg::with_name("config") - .short('c') - .long("config") - .takes_value(true), - ) - .get_matches(); - - let cfg_path = matches.value_of("config").map(|p| Path::new(p).to_owned()); +pub fn main(config: &ServerConfig) { let res = { let rt = tokio::runtime::Builder::new_multi_thread() .enable_all() .build() .expect("failed to initialize runtime"); - rt.block_on(inner_main(cfg_path)) + rt.block_on(inner_main(config)) }; match res { diff --git a/core/startos/src/bins/start_sdk.rs b/core/startos/src/bins/start_sdk.rs deleted file mode 100644 index 10219c485..000000000 --- a/core/startos/src/bins/start_sdk.rs +++ /dev/null @@ -1,61 +0,0 @@ -use rpc_toolkit::run_cli; -use rpc_toolkit::yajrc::RpcError; -use serde_json::Value; - -use crate::context::SdkContext; -use crate::util::logger::EmbassyLogger; -use crate::version::{Current, VersionT}; -use crate::Error; - -lazy_static::lazy_static! { - static ref VERSION_STRING: String = Current::new().semver().to_string(); -} - -fn inner_main() -> Result<(), Error> { - run_cli!({ - command: crate::portable_api, - app: app => app - .name("StartOS SDK") - .version(&**VERSION_STRING) - .arg( - clap::Arg::with_name("config") - .short('c') - .long("config") - .takes_value(true), - ), - context: matches => { - if let Err(_) = std::env::var("RUST_LOG") { - std::env::set_var("RUST_LOG", "embassy=warn,js_engine=warn"); - } - EmbassyLogger::init(); - SdkContext::init(matches)? - }, - exit: |e: RpcError| { - match e.data { - Some(Value::String(s)) => eprintln!("{}: {}", e.message, s), - Some(Value::Object(o)) => if let Some(Value::String(s)) = o.get("details") { - eprintln!("{}: {}", e.message, s); - if let Some(Value::String(s)) = o.get("debug") { - tracing::debug!("{}", s) - } - } - Some(a) => eprintln!("{}: {}", e.message, a), - None => eprintln!("{}", e.message), - } - std::process::exit(e.code); - } - }); - Ok(()) -} - -pub fn main() { - match inner_main() { - Ok(_) => (), - Err(e) => { - eprintln!("{}", e.source); - tracing::debug!("{:?}", e.source); - drop(e.source); - std::process::exit(e.kind as i32) - } - } -} diff --git a/core/startos/src/bins/startd.rs b/core/startos/src/bins/startd.rs index a773dd99a..3e571d6b2 100644 --- a/core/startos/src/bins/startd.rs +++ b/core/startos/src/bins/startd.rs @@ -1,12 +1,15 @@ +use std::ffi::OsString; use std::net::{Ipv6Addr, SocketAddr}; -use std::path::{Path, PathBuf}; +use std::path::Path; use std::sync::Arc; +use clap::Parser; use color_eyre::eyre::eyre; use futures::{FutureExt, TryFutureExt}; use tokio::signal::unix::signal; use tracing::instrument; +use crate::context::config::ServerConfig; use crate::context::{DiagnosticContext, RpcContext}; use crate::net::web_server::WebServer; use crate::shutdown::Shutdown; @@ -15,10 +18,10 @@ use crate::util::logger::EmbassyLogger; use crate::{Error, ErrorKind, ResultExt}; #[instrument(skip_all)] -async fn inner_main(cfg_path: Option) -> Result, Error> { +async fn inner_main(config: &ServerConfig) -> Result, Error> { let (rpc_ctx, server, shutdown) = async { let rpc_ctx = RpcContext::init( - cfg_path, + config, Arc::new( tokio::fs::read_to_string("/media/embassy/config/disk.guid") // unique identifier for volume group - keeps track of the disk that goes with your embassy .await? @@ -31,8 +34,7 @@ async fn inner_main(cfg_path: Option) -> Result, Error let server = WebServer::main( SocketAddr::new(Ipv6Addr::UNSPECIFIED.into(), 80), rpc_ctx.clone(), - ) - .await?; + )?; let mut shutdown_recv = rpc_ctx.shutdown.subscribe(); @@ -102,32 +104,23 @@ async fn inner_main(cfg_path: Option) -> Result, Error Ok(shutdown) } -pub fn main() { +pub fn main(args: impl IntoIterator) { EmbassyLogger::init(); + let config = ServerConfig::parse_from(args).load().unwrap(); + if !Path::new("/run/embassy/initialized").exists() { - super::start_init::main(); + super::start_init::main(&config); std::fs::write("/run/embassy/initialized", "").unwrap(); } - let matches = clap::App::new("startd") - .arg( - clap::Arg::with_name("config") - .short('c') - .long("config") - .takes_value(true), - ) - .get_matches(); - - let cfg_path = matches.value_of("config").map(|p| Path::new(p).to_owned()); - let res = { let rt = tokio::runtime::Builder::new_multi_thread() .enable_all() .build() .expect("failed to initialize runtime"); rt.block_on(async { - match inner_main(cfg_path.clone()).await { + match inner_main(&config).await { Ok(a) => Ok(a), Err(e) => { async { @@ -135,7 +128,7 @@ pub fn main() { tracing::debug!("{:?}", e.source); crate::sound::BEETHOVEN.play().await?; let ctx = DiagnosticContext::init( - cfg_path, + &config, if tokio::fs::metadata("/media/embassy/config/disk.guid") .await .is_ok() @@ -150,14 +143,12 @@ pub fn main() { None }, e, - ) - .await?; + )?; let server = WebServer::diagnostic( SocketAddr::new(Ipv6Addr::UNSPECIFIED.into(), 80), ctx.clone(), - ) - .await?; + )?; let mut shutdown = ctx.shutdown.subscribe(); diff --git a/core/startos/src/config/action.rs b/core/startos/src/config/action.rs index 27cd1683f..b926c940c 100644 --- a/core/startos/src/config/action.rs +++ b/core/startos/src/config/action.rs @@ -1,22 +1,12 @@ use std::collections::{BTreeMap, BTreeSet}; -use color_eyre::eyre::eyre; -use models::ImageId; -use patch_db::HasModel; +use models::PackageId; use serde::{Deserialize, Serialize}; -use tracing::instrument; use super::{Config, ConfigSpec}; -use crate::context::RpcContext; -use crate::dependencies::Dependencies; +#[allow(unused_imports)] use crate::prelude::*; -use crate::procedure::docker::DockerContainers; -use crate::procedure::{PackageProcedure, ProcedureName}; -use crate::s9pk::manifest::PackageId; use crate::status::health_check::HealthCheckId; -use crate::util::Version; -use crate::volume::Volumes; -use crate::{Error, ResultExt}; #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "kebab-case")] @@ -25,90 +15,6 @@ pub struct ConfigRes { pub spec: ConfigSpec, } -#[derive(Clone, Debug, Deserialize, Serialize, HasModel)] -#[model = "Model"] -pub struct ConfigActions { - pub get: PackageProcedure, - pub set: PackageProcedure, -} -impl ConfigActions { - #[instrument(skip_all)] - pub fn validate( - &self, - _container: &Option, - eos_version: &Version, - volumes: &Volumes, - image_ids: &BTreeSet, - ) -> Result<(), Error> { - self.get - .validate(eos_version, volumes, image_ids, true) - .with_ctx(|_| (crate::ErrorKind::ValidateS9pk, "Config Get"))?; - self.set - .validate(eos_version, volumes, image_ids, true) - .with_ctx(|_| (crate::ErrorKind::ValidateS9pk, "Config Set"))?; - Ok(()) - } - #[instrument(skip_all)] - pub async fn get( - &self, - ctx: &RpcContext, - pkg_id: &PackageId, - pkg_version: &Version, - volumes: &Volumes, - ) -> Result { - self.get - .execute( - ctx, - pkg_id, - pkg_version, - ProcedureName::GetConfig, - volumes, - None::<()>, - None, - ) - .await - .and_then(|res| { - res.map_err(|e| Error::new(eyre!("{}", e.1), crate::ErrorKind::ConfigGen)) - }) - } - - #[instrument(skip_all)] - pub async fn set( - &self, - ctx: &RpcContext, - pkg_id: &PackageId, - pkg_version: &Version, - dependencies: &Dependencies, - volumes: &Volumes, - input: &Config, - ) -> Result { - let res: SetResult = self - .set - .execute( - ctx, - pkg_id, - pkg_version, - ProcedureName::SetConfig, - volumes, - Some(input), - None, - ) - .await - .and_then(|res| { - res.map_err(|e| { - Error::new(eyre!("{}", e.1), crate::ErrorKind::ConfigRulesViolation) - }) - })?; - Ok(SetResult { - depends_on: res - .depends_on - .into_iter() - .filter(|(pkg, _)| dependencies.0.contains_key(pkg)) - .collect(), - }) - } -} - #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "kebab-case")] pub struct SetResult { diff --git a/core/startos/src/config/mod.rs b/core/startos/src/config/mod.rs index 06e7770b0..220e388c9 100644 --- a/core/startos/src/config/mod.rs +++ b/core/startos/src/config/mod.rs @@ -1,24 +1,22 @@ use std::collections::BTreeMap; -use std::path::PathBuf; use std::sync::Arc; use std::time::Duration; +use clap::Parser; use color_eyre::eyre::eyre; use indexmap::IndexSet; use itertools::Itertools; -use models::{ErrorKind, OptionExt}; +use models::{ErrorKind, OptionExt, PackageId}; use patch_db::value::InternedString; use patch_db::Value; use regex::Regex; -use rpc_toolkit::command; +use rpc_toolkit::{from_fn_async, Empty, HandlerExt, ParentHandler}; +use serde::{Deserialize, Serialize}; use tracing::instrument; -use crate::context::RpcContext; +use crate::context::{CliContext, RpcContext}; use crate::prelude::*; -use crate::s9pk::manifest::PackageId; -use crate::util::display_none; -use crate::util::serde::{display_serializable, parse_stdin_deserializable, IoFormat}; -use crate::Error; +use crate::util::serde::{HandlerExtSerde, StdinDeserializable}; pub mod action; pub mod spec; @@ -132,96 +130,107 @@ pub enum MatchError { ListUniquenessViolation, } -#[command(rename = "config-spec", cli_only, blocking, display(display_none))] -pub fn verify_spec(#[arg] path: PathBuf) -> Result<(), Error> { - let mut file = std::fs::File::open(&path)?; - let format = match path.extension().and_then(|s| s.to_str()) { - Some("yaml") | Some("yml") => IoFormat::Yaml, - Some("json") => IoFormat::Json, - Some("toml") => IoFormat::Toml, - Some("cbor") => IoFormat::Cbor, - _ => { - return Err(Error::new( - eyre!("Unknown file format. Expected one of yaml, json, toml, cbor."), - crate::ErrorKind::Deserialization, - )); - } - }; - let _: ConfigSpec = format.from_reader(&mut file)?; - - Ok(()) +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct ConfigParams { + pub id: PackageId, } -#[command(subcommands(get, set))] -pub fn config(#[arg] id: PackageId) -> Result { - Ok(id) +// #[command(subcommands(get, set))] +pub fn config() -> ParentHandler { + ParentHandler::new() + .subcommand( + "get", + from_fn_async(get) + .with_inherited(|ConfigParams { id }, _| id) + .with_display_serializable() + .with_remote_cli::(), + ) + .subcommand("set", set().with_inherited(|ConfigParams { id }, _| id)) } -#[command(display(display_serializable))] #[instrument(skip_all)] -pub async fn get( - #[context] ctx: RpcContext, - #[parent_data] id: PackageId, - #[allow(unused_variables)] - #[arg(long = "format")] - format: Option, -) -> Result { - let db = ctx.db.peek().await; - let manifest = db - .as_package_data() - .as_idx(&id) - .or_not_found(&id)? - .as_installed() - .or_not_found(&id)? - .as_manifest(); - let action = manifest - .as_config() - .de()? - .ok_or_else(|| Error::new(eyre!("{} has no config", id), crate::ErrorKind::NotFound))?; +pub async fn get(ctx: RpcContext, _: Empty, id: PackageId) -> Result { + ctx.services + .get(&id) + .await + .as_ref() + .or_not_found(lazy_format!("Manager for {id}"))? + .get_config() + .await +} - let volumes = manifest.as_volumes().de()?; - let version = manifest.as_version().de()?; - action.get(&ctx, &id, &version, &volumes).await +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +pub struct SetParams { + #[arg(long = "timeout")] + pub timeout: Option, + #[command(flatten)] + pub config: StdinDeserializable>, } -#[command( - subcommands(self(set_impl(async, context(RpcContext))), set_dry), - display(display_none), - metadata(sync_db = true) -)] +// TODO Dr Why isn't this used? +// #[command( +// subcommands(self(set_impl(async, context(RpcContext))), set_dry), +// display(display_none), +// metadata(sync_db = true) +// )] #[instrument(skip_all)] -pub fn set( - #[parent_data] id: PackageId, - #[allow(unused_variables)] - #[arg(long = "format")] - format: Option, - #[arg(long = "timeout")] timeout: Option, - #[arg(stdin, parse(parse_stdin_deserializable))] config: Option, -) -> Result<(PackageId, Option, Option), Error> { - Ok((id, config, timeout.map(|d| *d))) +pub fn set() -> ParentHandler { + ParentHandler::new() + .root_handler( + from_fn_async(set_impl) + .with_metadata("sync_db", Value::Bool(true)) + .with_inherited(|set_params, id| (id, set_params)) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "dry", + from_fn_async(set_dry) + .with_inherited(|set_params, id| (id, set_params)) + .with_display_serializable() + .with_remote_cli::(), + ) } -#[command(rename = "dry", display(display_serializable))] -#[instrument(skip_all)] pub async fn set_dry( - #[context] ctx: RpcContext, - #[parent_data] (id, config, timeout): (PackageId, Option, Option), + ctx: RpcContext, + _: Empty, + ( + id, + SetParams { + timeout, + config: StdinDeserializable(config), + }, + ): (PackageId, SetParams), ) -> Result, Error> { let breakages = BTreeMap::new(); let overrides = Default::default(); let configure_context = ConfigureContext { breakages, - timeout, + timeout: timeout.map(|t| *t), config, dry_run: true, overrides, }; - let breakages = configure(&ctx, &id, configure_context).await?; - - Ok(breakages) + ctx.services + .get(&id) + .await + .as_ref() + .ok_or_else(|| { + Error::new( + eyre!("There is no manager running for {id}"), + ErrorKind::Unknown, + ) + })? + .configure(configure_context) + .await } +#[derive(Default)] pub struct ConfigureContext { pub breakages: BTreeMap, pub timeout: Option, @@ -233,55 +242,36 @@ pub struct ConfigureContext { #[instrument(skip_all)] pub async fn set_impl( ctx: RpcContext, - (id, config, timeout): (PackageId, Option, Option), + _: Empty, + ( + id, + SetParams { + timeout, + config: StdinDeserializable(config), + }, + ): (PackageId, SetParams), ) -> Result<(), Error> { let breakages = BTreeMap::new(); let overrides = Default::default(); let configure_context = ConfigureContext { breakages, - timeout, + timeout: timeout.map(|t| *t), config, dry_run: false, overrides, }; - configure(&ctx, &id, configure_context).await?; - Ok(()) -} - -#[instrument(skip_all)] -pub async fn configure( - ctx: &RpcContext, - id: &PackageId, - configure_context: ConfigureContext, -) -> Result, Error> { - let db = ctx.db.peek().await; - let package = db - .as_package_data() - .as_idx(id) - .or_not_found(&id)? - .as_installed() - .or_not_found(&id)?; - let version = package.as_manifest().as_version().de()?; - ctx.managers - .get(&(id.clone(), version.clone())) + ctx.services + .get(&id) .await + .as_ref() .ok_or_else(|| { Error::new( - eyre!("There is no manager running for {id:?} and {version:?}"), + eyre!("There is no manager running for {id}"), ErrorKind::Unknown, ) })? .configure(configure_context) - .await -} - -macro_rules! not_found { - ($x:expr) => { - crate::Error::new( - color_eyre::eyre::eyre!("Could not find {} at {}:{}", $x, module_path!(), line!()), - crate::ErrorKind::Incoherent, - ) - }; + .await?; + Ok(()) } -pub(crate) use not_found; diff --git a/core/startos/src/config/spec.rs b/core/startos/src/config/spec.rs index a98ad888d..ec2667bfb 100644 --- a/core/startos/src/config/spec.rs +++ b/core/startos/src/config/spec.rs @@ -14,6 +14,7 @@ use imbl_value::InternedString; use indexmap::{IndexMap, IndexSet}; use itertools::Itertools; use jsonpath_lib::Compiled as CompiledJsonPath; +use models::ProcedureName; use patch_db::value::{Number, Value}; use rand::{CryptoRng, Rng}; use regex::Regex; @@ -23,6 +24,7 @@ use sqlx::PgPool; use super::util::{self, CharSet, NumRange, UniqueBy, STATIC_NULL}; use super::{Config, MatchError, NoMatchWithPath, TimeoutError, TypeOf}; +use crate::config::action::ConfigRes; use crate::config::ConfigurationError; use crate::context::RpcContext; use crate::net::interface::InterfaceId; @@ -1773,27 +1775,27 @@ impl ConfigPointer { Ok(self.select(&Value::Object(cfg.clone()))) } else { let id = &self.package_id; - let db = ctx.db.peek().await; - let manifest = db.as_package_data().as_idx(id).map(|pde| pde.as_manifest()); - let cfg_actions = manifest.and_then(|m| m.as_config().transpose_ref()); - if let (Some(manifest), Some(cfg_actions)) = (manifest, cfg_actions) { - let cfg_res = cfg_actions - .de() + let version = ctx + .db + .peek() + .await + .as_package_data() + .as_idx(id) + .and_then(|pde| pde.as_installed()) + .map(|i| i.as_manifest().as_version().de()) + .transpose() + .map_err(ConfigurationError::SystemError)?; + if let Some(version) = version { + let cfg_res = ctx + .services + .get(&id) + .await + .as_ref() + .or_not_found(lazy_format!("Manager for {id}@{version}")) .map_err(|e| ConfigurationError::SystemError(e))? - .get( - ctx, - &self.package_id, - &manifest - .as_version() - .de() - .map_err(|e| ConfigurationError::SystemError(e))?, - &manifest - .as_volumes() - .de() - .map_err(|e| ConfigurationError::SystemError(e))?, - ) + .get_config() .await - .map_err(|e| ConfigurationError::SystemError(e))?; + .map_err(ConfigurationError::SystemError)?; if let Some(cfg) = cfg_res.config { Ok(self.select(&Value::Object(cfg))) } else { diff --git a/core/startos/src/context/cli.rs b/core/startos/src/context/cli.rs index 020b73459..cc2fe232b 100644 --- a/core/startos/src/context/cli.rs +++ b/core/startos/src/context/cli.rs @@ -1,43 +1,37 @@ use std::fs::File; use std::io::BufReader; -use std::net::Ipv4Addr; use std::path::{Path, PathBuf}; use std::sync::Arc; -use clap::ArgMatches; -use color_eyre::eyre::eyre; use cookie_store::{CookieStore, RawCookie}; use josekit::jwk::Jwk; +use once_cell::sync::OnceCell; use reqwest::Proxy; use reqwest_cookie_store::CookieStoreMutex; use rpc_toolkit::reqwest::{Client, Url}; -use rpc_toolkit::url::Host; -use rpc_toolkit::Context; -use serde::Deserialize; +use rpc_toolkit::yajrc::RpcError; +use rpc_toolkit::{call_remote_http, CallRemote, Context}; +use tokio::net::TcpStream; +use tokio::runtime::Runtime; +use tokio_tungstenite::{MaybeTlsStream, WebSocketStream}; use tracing::instrument; use super::setup::CURRENT_SECRET; +use crate::context::config::{local_config_path, ClientConfig}; +use crate::core::rpc_continuations::RequestGuid; use crate::middleware::auth::LOCAL_AUTH_COOKIE_PATH; -use crate::util::config::{load_config_from_paths, local_config_path}; -use crate::ResultExt; - -#[derive(Debug, Default, Deserialize)] -#[serde(rename_all = "kebab-case")] -pub struct CliContextConfig { - pub host: Option, - #[serde(deserialize_with = "crate::util::serde::deserialize_from_str_opt")] - #[serde(default)] - pub proxy: Option, - pub cookie_path: Option, -} +use crate::prelude::*; #[derive(Debug)] pub struct CliContextSeed { + pub runtime: OnceCell, pub base_url: Url, pub rpc_url: Url, pub client: Client, pub cookie_store: Arc, pub cookie_path: PathBuf, + pub developer_key_path: PathBuf, + pub developer_key: OnceCell, } impl Drop for CliContextSeed { fn drop(&mut self) { @@ -60,42 +54,22 @@ impl Drop for CliContextSeed { } } -const DEFAULT_HOST: Host<&'static str> = Host::Ipv4(Ipv4Addr::new(127, 0, 0, 1)); -const DEFAULT_PORT: u16 = 5959; - #[derive(Debug, Clone)] pub struct CliContext(Arc); impl CliContext { /// BLOCKING #[instrument(skip_all)] - pub fn init(matches: &ArgMatches) -> Result { - let local_config_path = local_config_path(); - let base: CliContextConfig = load_config_from_paths( - matches - .values_of("config") - .into_iter() - .flatten() - .map(|p| Path::new(p)) - .chain(local_config_path.as_deref().into_iter()) - .chain(std::iter::once(Path::new(crate::util::config::CONFIG_PATH))), - )?; - let mut url = if let Some(host) = matches.value_of("host") { - host.parse()? - } else if let Some(host) = base.host { + pub fn init(config: ClientConfig) -> Result { + let mut url = if let Some(host) = config.host { host } else { "http://localhost".parse()? }; - let proxy = if let Some(proxy) = matches.value_of("proxy") { - Some(proxy.parse()?) - } else { - base.proxy - }; - let cookie_path = base.cookie_path.unwrap_or_else(|| { - local_config_path + let cookie_path = config.cookie_path.unwrap_or_else(|| { + local_config_path() .as_deref() - .unwrap_or_else(|| Path::new(crate::util::config::CONFIG_PATH)) + .unwrap_or_else(|| Path::new(super::config::CONFIG_PATH)) .parent() .unwrap_or(Path::new("/")) .join(".cookies.json") @@ -120,6 +94,7 @@ impl CliContext { })); Ok(CliContext(Arc::new(CliContextSeed { + runtime: OnceCell::new(), base_url: url.clone(), rpc_url: { url.path_segments_mut() @@ -131,7 +106,7 @@ impl CliContext { }, client: { let mut builder = Client::builder().cookie_provider(cookie_store.clone()); - if let Some(proxy) = proxy { + if let Some(proxy) = config.proxy { builder = builder.proxy(Proxy::all(proxy).with_kind(crate::ErrorKind::ParseUrl)?) } @@ -139,8 +114,90 @@ impl CliContext { }, cookie_store, cookie_path, + developer_key_path: config.developer_key_path.unwrap_or_else(|| { + local_config_path() + .as_deref() + .unwrap_or_else(|| Path::new(super::config::CONFIG_PATH)) + .parent() + .unwrap_or(Path::new("/")) + .join("developer.key.pem") + }), + developer_key: OnceCell::new(), }))) } + + /// BLOCKING + #[instrument(skip_all)] + pub fn developer_key(&self) -> Result<&ed25519_dalek::SigningKey, Error> { + self.developer_key.get_or_try_init(|| { + if !self.developer_key_path.exists() { + return Err(Error::new(eyre!("Developer Key does not exist! Please run `start-cli init` before running this command."), crate::ErrorKind::Uninitialized)); + } + let pair = ::from_pkcs8_pem( + &std::fs::read_to_string(&self.developer_key_path)?, + ) + .with_kind(crate::ErrorKind::Pem)?; + let secret = ed25519_dalek::SecretKey::try_from(&pair.secret_key[..]).map_err(|_| { + Error::new( + eyre!("pkcs8 key is of incorrect length"), + ErrorKind::OpenSsl, + ) + })?; + Ok(secret.into()) + }) + } + + pub async fn ws_continuation( + &self, + guid: RequestGuid, + ) -> Result>, Error> { + let mut url = self.base_url.clone(); + let ws_scheme = match url.scheme() { + "https" => "wss", + "http" => "ws", + _ => { + return Err(Error::new( + eyre!("Cannot parse scheme from base URL"), + crate::ErrorKind::ParseUrl, + ) + .into()) + } + }; + url.set_scheme(ws_scheme) + .map_err(|_| Error::new(eyre!("Cannot set URL scheme"), crate::ErrorKind::ParseUrl))?; + url.path_segments_mut() + .map_err(|_| eyre!("Url cannot be base")) + .with_kind(crate::ErrorKind::ParseUrl)? + .push("ws") + .push("rpc") + .push(guid.as_ref()); + let (stream, _) = + // base_url is "http://127.0.0.1/", with a trailing slash, so we don't put a leading slash in this path: + tokio_tungstenite::connect_async(url).await.with_kind(ErrorKind::Network)?; + Ok(stream) + } + + pub async fn rest_continuation( + &self, + guid: RequestGuid, + body: reqwest::Body, + headers: reqwest::header::HeaderMap, + ) -> Result { + let mut url = self.base_url.clone(); + url.path_segments_mut() + .map_err(|_| eyre!("Url cannot be base")) + .with_kind(crate::ErrorKind::ParseUrl)? + .push("rest") + .push("rpc") + .push(guid.as_ref()); + self.client + .post(url) + .headers(headers) + .body(body) + .send() + .await + .with_kind(ErrorKind::Network) + } } impl AsRef for CliContext { fn as_ref(&self) -> &Jwk { @@ -154,32 +211,33 @@ impl std::ops::Deref for CliContext { } } impl Context for CliContext { - fn protocol(&self) -> &str { - self.0.base_url.scheme() - } - fn host(&self) -> Host<&str> { - self.0.base_url.host().unwrap_or(DEFAULT_HOST) + fn runtime(&self) -> tokio::runtime::Handle { + self.runtime + .get_or_init(|| { + tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build() + .unwrap() + }) + .handle() + .clone() } - fn port(&self) -> u16 { - self.0.base_url.port().unwrap_or(DEFAULT_PORT) - } - fn path(&self) -> &str { - self.0.rpc_url.path() - } - fn url(&self) -> Url { - self.0.rpc_url.clone() - } - fn client(&self) -> &Client { - &self.0.client +} +#[async_trait::async_trait] +impl CallRemote for CliContext { + async fn call_remote(&self, method: &str, params: Value) -> Result { + call_remote_http(&self.client, self.rpc_url.clone(), method, params).await } } -/// When we had an empty proxy the system wasn't working like it used to, which allowed empty proxy + #[test] -fn test_cli_proxy_empty() { - serde_yaml::from_str::( - " - bind_rpc: - ", - ) - .unwrap(); +fn test() { + let ctx = CliContext::init(ClientConfig::default()).unwrap(); + ctx.runtime().block_on(async { + reqwest::Client::new() + .get("http://example.com") + .send() + .await + .unwrap(); + }); } diff --git a/core/startos/src/context/config.rs b/core/startos/src/context/config.rs new file mode 100644 index 000000000..fc9cfb790 --- /dev/null +++ b/core/startos/src/context/config.rs @@ -0,0 +1,175 @@ +use std::fs::File; +use std::net::SocketAddr; +use std::path::{Path, PathBuf}; + +use clap::Parser; +use patch_db::json_ptr::JsonPointer; +use reqwest::Url; +use serde::de::DeserializeOwned; +use serde::{Deserialize, Serialize}; +use sqlx::postgres::PgConnectOptions; +use sqlx::PgPool; + +use crate::account::AccountInfo; +use crate::db::model::Database; +use crate::disk::OsPartitionInfo; +use crate::init::init_postgres; +use crate::prelude::*; +use crate::util::serde::IoFormat; + +pub const DEVICE_CONFIG_PATH: &str = "/media/embassy/config/config.yaml"; // "/media/startos/config/config.yaml"; +pub const CONFIG_PATH: &str = "/etc/startos/config.yaml"; +pub const CONFIG_PATH_LOCAL: &str = ".startos/config.yaml"; + +pub fn local_config_path() -> Option { + if let Ok(home) = std::env::var("HOME") { + Some(Path::new(&home).join(CONFIG_PATH_LOCAL)) + } else { + None + } +} + +pub trait ContextConfig: DeserializeOwned + Default { + fn next(&mut self) -> Option; + fn merge_with(&mut self, other: Self); + fn from_path(path: impl AsRef) -> Result { + let format: IoFormat = path + .as_ref() + .extension() + .and_then(|s| s.to_str()) + .map(|f| f.parse()) + .transpose()? + .unwrap_or_default(); + format.from_reader(File::open(path)?) + } + fn load_path_rec(&mut self, path: Option>) -> Result<(), Error> { + if let Some(path) = path.filter(|p| p.as_ref().exists()) { + let mut other = Self::from_path(path)?; + let path = other.next(); + self.merge_with(other); + self.load_path_rec(path)?; + } + Ok(()) + } +} + +#[derive(Debug, Default, Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct ClientConfig { + #[arg(short = 'c', long = "config")] + pub config: Option, + #[arg(short = 'h', long = "host")] + pub host: Option, + #[arg(short = 'p', long = "proxy")] + pub proxy: Option, + #[arg(long = "cookie-path")] + pub cookie_path: Option, + #[arg(long = "developer-key-path")] + pub developer_key_path: Option, +} +impl ContextConfig for ClientConfig { + fn next(&mut self) -> Option { + self.config.take() + } + fn merge_with(&mut self, other: Self) { + self.host = self.host.take().or(other.host); + self.proxy = self.proxy.take().or(other.proxy); + self.cookie_path = self.cookie_path.take().or(other.cookie_path); + } +} +impl ClientConfig { + pub fn load(mut self) -> Result { + let path = self.next(); + self.load_path_rec(path)?; + self.load_path_rec(local_config_path())?; + self.load_path_rec(Some(CONFIG_PATH))?; + Ok(self) + } +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct ServerConfig { + #[arg(short = 'c', long = "config")] + pub config: Option, + #[arg(long = "wifi-interface")] + pub wifi_interface: Option, + #[arg(long = "ethernet-interface")] + pub ethernet_interface: Option, + #[arg(skip)] + pub os_partitions: Option, + #[arg(long = "bind-rpc")] + pub bind_rpc: Option, + #[arg(long = "tor-control")] + pub tor_control: Option, + #[arg(long = "tor-socks")] + pub tor_socks: Option, + #[arg(long = "dns-bind")] + pub dns_bind: Option>, + #[arg(long = "revision-cache-size")] + pub revision_cache_size: Option, + #[arg(short = 'd', long = "datadir")] + pub datadir: Option, + #[arg(long = "disable-encryption")] + pub disable_encryption: Option, +} +impl ContextConfig for ServerConfig { + fn next(&mut self) -> Option { + self.config.take() + } + fn merge_with(&mut self, other: Self) { + self.wifi_interface = self.wifi_interface.take().or(other.wifi_interface); + self.ethernet_interface = self.ethernet_interface.take().or(other.ethernet_interface); + self.os_partitions = self.os_partitions.take().or(other.os_partitions); + self.bind_rpc = self.bind_rpc.take().or(other.bind_rpc); + self.tor_control = self.tor_control.take().or(other.tor_control); + self.tor_socks = self.tor_socks.take().or(other.tor_socks); + self.dns_bind = self.dns_bind.take().or(other.dns_bind); + self.revision_cache_size = self + .revision_cache_size + .take() + .or(other.revision_cache_size); + self.datadir = self.datadir.take().or(other.datadir); + self.disable_encryption = self.disable_encryption.take().or(other.disable_encryption); + } +} + +impl ServerConfig { + pub fn load(mut self) -> Result { + let path = self.next(); + self.load_path_rec(path)?; + self.load_path_rec(Some(DEVICE_CONFIG_PATH))?; + self.load_path_rec(Some(CONFIG_PATH))?; + Ok(self) + } + pub fn datadir(&self) -> &Path { + self.datadir + .as_deref() + .unwrap_or_else(|| Path::new("/embassy-data")) + } + pub async fn db(&self, account: &AccountInfo) -> Result { + let db_path = self.datadir().join("main").join("embassy.db"); + let db = PatchDb::open(&db_path) + .await + .with_ctx(|_| (crate::ErrorKind::Filesystem, db_path.display().to_string()))?; + if !db.exists(&::default()).await { + db.put(&::default(), &Database::init(account)) + .await?; + } + Ok(db) + } + #[instrument(skip_all)] + pub async fn secret_store(&self) -> Result { + init_postgres(self.datadir()).await?; + let secret_store = + PgPool::connect_with(PgConnectOptions::new().database("secrets").username("root")) + .await?; + sqlx::migrate!() + .run(&secret_store) + .await + .with_kind(crate::ErrorKind::Database)?; + Ok(secret_store) + } +} diff --git a/core/startos/src/context/diagnostic.rs b/core/startos/src/context/diagnostic.rs index 151948d7c..117e56061 100644 --- a/core/startos/src/context/diagnostic.rs +++ b/core/startos/src/context/diagnostic.rs @@ -1,47 +1,16 @@ use std::ops::Deref; -use std::path::{Path, PathBuf}; +use std::path::PathBuf; use std::sync::Arc; use rpc_toolkit::yajrc::RpcError; use rpc_toolkit::Context; -use serde::Deserialize; use tokio::sync::broadcast::Sender; use tracing::instrument; +use crate::context::config::ServerConfig; use crate::shutdown::Shutdown; -use crate::util::config::load_config_from_paths; use crate::Error; -#[derive(Debug, Default, Deserialize)] -#[serde(rename_all = "kebab-case")] -pub struct DiagnosticContextConfig { - pub datadir: Option, -} -impl DiagnosticContextConfig { - #[instrument(skip_all)] - pub async fn load + Send + 'static>(path: Option

    ) -> Result { - tokio::task::spawn_blocking(move || { - load_config_from_paths( - path.as_ref() - .into_iter() - .map(|p| p.as_ref()) - .chain(std::iter::once(Path::new( - crate::util::config::DEVICE_CONFIG_PATH, - ))) - .chain(std::iter::once(Path::new(crate::util::config::CONFIG_PATH))), - ) - }) - .await - .unwrap() - } - - pub fn datadir(&self) -> &Path { - self.datadir - .as_deref() - .unwrap_or_else(|| Path::new("/embassy-data")) - } -} - pub struct DiagnosticContextSeed { pub datadir: PathBuf, pub shutdown: Sender>, @@ -53,20 +22,18 @@ pub struct DiagnosticContextSeed { pub struct DiagnosticContext(Arc); impl DiagnosticContext { #[instrument(skip_all)] - pub async fn init + Send + 'static>( - path: Option

    , + pub fn init( + config: &ServerConfig, disk_guid: Option>, error: Error, ) -> Result { tracing::error!("Error: {}: Starting diagnostic UI", error); tracing::debug!("{:?}", error); - let cfg = DiagnosticContextConfig::load(path).await?; - let (shutdown, _) = tokio::sync::broadcast::channel(1); Ok(Self(Arc::new(DiagnosticContextSeed { - datadir: cfg.datadir().to_owned(), + datadir: config.datadir().to_owned(), shutdown, disk_guid, error: Arc::new(error.into()), diff --git a/core/startos/src/context/install.rs b/core/startos/src/context/install.rs index 87484b7e5..d4717d2b0 100644 --- a/core/startos/src/context/install.rs +++ b/core/startos/src/context/install.rs @@ -1,35 +1,13 @@ use std::ops::Deref; -use std::path::Path; use std::sync::Arc; use rpc_toolkit::Context; -use serde::Deserialize; use tokio::sync::broadcast::Sender; use tracing::instrument; use crate::net::utils::find_eth_iface; -use crate::util::config::load_config_from_paths; use crate::Error; -#[derive(Debug, Default, Deserialize)] -#[serde(rename_all = "kebab-case")] -pub struct InstallContextConfig {} -impl InstallContextConfig { - #[instrument(skip_all)] - pub async fn load + Send + 'static>(path: Option

    ) -> Result { - tokio::task::spawn_blocking(move || { - load_config_from_paths( - path.as_ref() - .into_iter() - .map(|p| p.as_ref()) - .chain(std::iter::once(Path::new(crate::util::config::CONFIG_PATH))), - ) - }) - .await - .unwrap() - } -} - pub struct InstallContextSeed { pub ethernet_interface: String, pub shutdown: Sender<()>, @@ -39,8 +17,7 @@ pub struct InstallContextSeed { pub struct InstallContext(Arc); impl InstallContext { #[instrument(skip_all)] - pub async fn init + Send + 'static>(path: Option

    ) -> Result { - let _cfg = InstallContextConfig::load(path.as_ref().map(|p| p.as_ref().to_owned())).await?; + pub async fn init() -> Result { let (shutdown, _) = tokio::sync::broadcast::channel(1); Ok(Self(Arc::new(InstallContextSeed { ethernet_interface: find_eth_iface().await?, diff --git a/core/startos/src/context/mod.rs b/core/startos/src/context/mod.rs index c4e8e7757..77f54f26c 100644 --- a/core/startos/src/context/mod.rs +++ b/core/startos/src/context/mod.rs @@ -1,44 +1,12 @@ pub mod cli; +pub mod config; pub mod diagnostic; pub mod install; pub mod rpc; -pub mod sdk; pub mod setup; pub use cli::CliContext; pub use diagnostic::DiagnosticContext; pub use install::InstallContext; pub use rpc::RpcContext; -pub use sdk::SdkContext; pub use setup::SetupContext; - -impl From for () { - fn from(_: CliContext) -> Self { - () - } -} -impl From for () { - fn from(_: DiagnosticContext) -> Self { - () - } -} -impl From for () { - fn from(_: RpcContext) -> Self { - () - } -} -impl From for () { - fn from(_: SdkContext) -> Self { - () - } -} -impl From for () { - fn from(_: SetupContext) -> Self { - () - } -} -impl From for () { - fn from(_: InstallContext) -> Self { - () - } -} diff --git a/core/startos/src/context/rpc.rs b/core/startos/src/context/rpc.rs index 5358a59ba..df2747089 100644 --- a/core/startos/src/context/rpc.rs +++ b/core/startos/src/context/rpc.rs @@ -1,19 +1,16 @@ use std::collections::BTreeMap; use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4}; use std::ops::Deref; -use std::path::{Path, PathBuf}; +use std::path::PathBuf; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use std::time::Duration; -use helpers::to_tmp_path; +use imbl_value::InternedString; use josekit::jwk::Jwk; -use patch_db::json_ptr::JsonPointer; use patch_db::PatchDb; -use reqwest::{Client, Proxy, Url}; +use reqwest::{Client, Proxy}; use rpc_toolkit::Context; -use serde::Deserialize; -use sqlx::postgres::PgConnectOptions; use sqlx::PgPool; use tokio::sync::{broadcast, oneshot, Mutex, RwLock}; use tokio::time::Instant; @@ -21,87 +18,26 @@ use tracing::instrument; use super::setup::CURRENT_SECRET; use crate::account::AccountInfo; -use crate::core::rpc_continuations::{RequestGuid, RestHandler, RpcContinuation}; -use crate::db::model::{CurrentDependents, Database, PackageDataEntryMatchModelRef}; +use crate::context::config::ServerConfig; +use crate::core::rpc_continuations::{RequestGuid, RestHandler, RpcContinuation, WebSocketHandler}; +use crate::db::model::CurrentDependents; use crate::db::prelude::PatchDbExt; use crate::dependencies::compute_dependency_config_errs; use crate::disk::OsPartitionInfo; -use crate::init::{check_time_is_synchronized, init_postgres}; -use crate::install::cleanup::{cleanup_failed, uninstall}; -use crate::manager::ManagerMap; +use crate::init::check_time_is_synchronized; +use crate::lxc::{LxcContainer, LxcManager}; use crate::middleware::auth::HashSessionToken; use crate::net::net_controller::NetController; use crate::net::ssl::{root_ca_start_time, SslManager}; +use crate::net::utils::find_eth_iface; use crate::net::wifi::WpaCli; use crate::notifications::NotificationManager; +use crate::prelude::*; +use crate::service::ServiceMap; use crate::shutdown::Shutdown; use crate::status::MainStatus; use crate::system::get_mem_info; -use crate::util::config::load_config_from_paths; use crate::util::lshw::{lshw, LshwDevice}; -use crate::{Error, ErrorKind, ResultExt}; - -#[derive(Debug, Default, Deserialize)] -#[serde(rename_all = "kebab-case")] -pub struct RpcContextConfig { - pub wifi_interface: Option, - pub ethernet_interface: String, - pub os_partitions: OsPartitionInfo, - pub migration_batch_rows: Option, - pub migration_prefetch_rows: Option, - pub bind_rpc: Option, - pub tor_control: Option, - pub tor_socks: Option, - pub dns_bind: Option>, - pub revision_cache_size: Option, - pub datadir: Option, - pub log_server: Option, -} -impl RpcContextConfig { - pub async fn load + Send + 'static>(path: Option

    ) -> Result { - tokio::task::spawn_blocking(move || { - load_config_from_paths( - path.as_ref() - .into_iter() - .map(|p| p.as_ref()) - .chain(std::iter::once(Path::new( - crate::util::config::DEVICE_CONFIG_PATH, - ))) - .chain(std::iter::once(Path::new(crate::util::config::CONFIG_PATH))), - ) - }) - .await - .unwrap() - } - pub fn datadir(&self) -> &Path { - self.datadir - .as_deref() - .unwrap_or_else(|| Path::new("/embassy-data")) - } - pub async fn db(&self, account: &AccountInfo) -> Result { - let db_path = self.datadir().join("main").join("embassy.db"); - let db = PatchDb::open(&db_path) - .await - .with_ctx(|_| (crate::ErrorKind::Filesystem, db_path.display().to_string()))?; - if !db.exists(&::default()).await { - db.put(&::default(), &Database::init(account)) - .await?; - } - Ok(db) - } - #[instrument(skip_all)] - pub async fn secret_store(&self) -> Result { - init_postgres(self.datadir()).await?; - let secret_store = - PgPool::connect_with(PgConnectOptions::new().database("secrets").username("root")) - .await?; - sqlx::migrate!() - .run(&secret_store) - .await - .with_kind(crate::ErrorKind::Database)?; - Ok(secret_store) - } -} pub struct RpcContextSeed { is_closed: AtomicBool, @@ -114,11 +50,12 @@ pub struct RpcContextSeed { pub secret_store: PgPool, pub account: RwLock, pub net_controller: Arc, - pub managers: ManagerMap, + pub services: ServiceMap, pub metrics_cache: RwLock>, pub shutdown: broadcast::Sender>, pub tor_socks: SocketAddr, pub notification_manager: NotificationManager, + pub lxc_manager: Arc, pub open_authed_websockets: Mutex>>>, pub rpc_stream_continuations: Mutex>, pub wifi_manager: Option>>, @@ -126,6 +63,11 @@ pub struct RpcContextSeed { pub client: Client, pub hardware: Hardware, pub start_time: Instant, + pub dev: Dev, +} + +pub struct Dev { + pub lxc: Mutex>, } pub struct Hardware { @@ -137,28 +79,26 @@ pub struct Hardware { pub struct RpcContext(Arc); impl RpcContext { #[instrument(skip_all)] - pub async fn init + Send + Sync + 'static>( - cfg_path: Option

    , - disk_guid: Arc, - ) -> Result { - let base = RpcContextConfig::load(cfg_path).await?; + pub async fn init(config: &ServerConfig, disk_guid: Arc) -> Result { tracing::info!("Loaded Config"); - let tor_proxy = base.tor_socks.unwrap_or(SocketAddr::V4(SocketAddrV4::new( + let tor_proxy = config.tor_socks.unwrap_or(SocketAddr::V4(SocketAddrV4::new( Ipv4Addr::new(127, 0, 0, 1), 9050, ))); let (shutdown, _) = tokio::sync::broadcast::channel(1); - let secret_store = base.secret_store().await?; + let secret_store = config.secret_store().await?; tracing::info!("Opened Pg DB"); let account = AccountInfo::load(&secret_store).await?; - let db = base.db(&account).await?; + let db = config.db(&account).await?; tracing::info!("Opened PatchDB"); let net_controller = Arc::new( NetController::init( - base.tor_control + config + .tor_control .unwrap_or(SocketAddr::from(([127, 0, 0, 1], 9051))), tor_proxy, - base.dns_bind + config + .dns_bind .as_deref() .unwrap_or(&[SocketAddr::from(([127, 0, 0, 1], 53))]), SslManager::new(&account, root_ca_start_time().await?)?, @@ -168,7 +108,7 @@ impl RpcContext { .await?, ); tracing::info!("Initialized Net Controller"); - let managers = ManagerMap::default(); + let services = ServiceMap::default(); let metrics_cache = RwLock::>::new(None); let notification_manager = NotificationManager::new(secret_store.clone()); tracing::info!("Initialized Notification Manager"); @@ -190,24 +130,35 @@ impl RpcContext { let seed = Arc::new(RpcContextSeed { is_closed: AtomicBool::new(false), - datadir: base.datadir().to_path_buf(), - os_partitions: base.os_partitions, - wifi_interface: base.wifi_interface.clone(), - ethernet_interface: base.ethernet_interface, + datadir: config.datadir().to_path_buf(), + os_partitions: config.os_partitions.clone().ok_or_else(|| { + Error::new( + eyre!("OS Partition Information Missing"), + ErrorKind::Filesystem, + ) + })?, + wifi_interface: config.wifi_interface.clone(), + ethernet_interface: if let Some(eth) = config.ethernet_interface.clone() { + eth + } else { + find_eth_iface().await? + }, disk_guid, db, secret_store, account: RwLock::new(account), net_controller, - managers, + services, metrics_cache, shutdown, tor_socks: tor_proxy, notification_manager, + lxc_manager: Arc::new(LxcManager::new()), open_authed_websockets: Mutex::new(BTreeMap::new()), rpc_stream_continuations: Mutex::new(BTreeMap::new()), - wifi_manager: base + wifi_manager: config .wifi_interface + .clone() .map(|i| Arc::new(RwLock::new(WpaCli::init(i)))), current_secret: Arc::new( Jwk::generate_ec_key(josekit::jwk::alg::ec::EcCurve::P256).map_err(|e| { @@ -231,6 +182,9 @@ impl RpcContext { .with_kind(crate::ErrorKind::ParseUrl)?, hardware: Hardware { devices, ram }, start_time: Instant::now(), + dev: Dev { + lxc: Mutex::new(BTreeMap::new()), + }, }); let res = Self(seed.clone()); @@ -241,7 +195,7 @@ impl RpcContext { #[instrument(skip_all)] pub async fn shutdown(self) -> Result<(), Error> { - self.managers.empty().await?; + self.services.shutdown_all().await?; self.secret_store.close().await; self.is_closed.store(true, Ordering::SeqCst); tracing::info!("RPC Context is shutdown"); @@ -293,70 +247,11 @@ impl RpcContext { }) .await?; - let peek = self.db.peek().await; - - for (package_id, package) in peek.as_package_data().as_entries()?.into_iter() { - let action = match package.as_match() { - PackageDataEntryMatchModelRef::Installing(_) - | PackageDataEntryMatchModelRef::Restoring(_) - | PackageDataEntryMatchModelRef::Updating(_) => { - cleanup_failed(self, &package_id).await - } - PackageDataEntryMatchModelRef::Removing(_) => { - uninstall( - self, - self.secret_store.acquire().await?.as_mut(), - &package_id, - ) - .await - } - PackageDataEntryMatchModelRef::Installed(m) => { - let version = m.as_manifest().as_version().clone().de()?; - let volumes = m.as_manifest().as_volumes().de()?; - for (volume_id, volume_info) in &*volumes { - let tmp_path = to_tmp_path(volume_info.path_for( - &self.datadir, - &package_id, - &version, - volume_id, - )) - .with_kind(ErrorKind::Filesystem)?; - if tokio::fs::metadata(&tmp_path).await.is_ok() { - tokio::fs::remove_dir_all(&tmp_path).await?; - } - } - Ok(()) - } - _ => continue, - }; - if let Err(e) = action { - tracing::error!("Failed to clean up package {}: {}", package_id, e); - tracing::debug!("{:?}", e); - } - } - let peek = self - .db - .mutate(|v| { - for (_, pde) in v.as_package_data_mut().as_entries_mut()? { - let status = pde - .expect_as_installed_mut()? - .as_installed_mut() - .as_status_mut() - .as_main_mut(); - let running = status.clone().de()?.running(); - status.ser(&if running { - MainStatus::Starting - } else { - MainStatus::Stopped - })?; - } - Ok(v.clone()) - }) - .await?; - self.managers.init(self.clone(), peek.clone()).await?; + self.services.init(&self).await?; tracing::info!("Initialized Package Managers"); let mut all_dependency_config_errs = BTreeMap::new(); + let peek = self.db.peek().await; for (package_id, package) in peek.as_package_data().as_entries()?.into_iter() { let package = package.clone(); if let Some(current_dependencies) = package @@ -419,33 +314,30 @@ impl RpcContext { .insert(guid, handler); } - pub async fn get_continuation_handler(&self, guid: &RequestGuid) -> Option { + pub async fn get_ws_continuation_handler( + &self, + guid: &RequestGuid, + ) -> Option { let mut continuations = self.rpc_stream_continuations.lock().await; - if let Some(cont) = continuations.remove(guid) { - cont.into_handler().await - } else { - None - } - } - - pub async fn get_ws_continuation_handler(&self, guid: &RequestGuid) -> Option { - let continuations = self.rpc_stream_continuations.lock().await; - if matches!(continuations.get(guid), Some(RpcContinuation::WebSocket(_))) { - drop(continuations); - self.get_continuation_handler(guid).await - } else { - None + if !matches!(continuations.get(guid), Some(RpcContinuation::WebSocket(_))) { + return None; } + let Some(RpcContinuation::WebSocket(x)) = continuations.remove(guid) else { + return None; + }; + x.get().await } pub async fn get_rest_continuation_handler(&self, guid: &RequestGuid) -> Option { - let continuations = self.rpc_stream_continuations.lock().await; - if matches!(continuations.get(guid), Some(RpcContinuation::Rest(_))) { - drop(continuations); - self.get_continuation_handler(guid).await - } else { - None + let mut continuations: tokio::sync::MutexGuard<'_, BTreeMap> = + self.rpc_stream_continuations.lock().await; + if !matches!(continuations.get(guid), Some(RpcContinuation::Rest(_))) { + return None; } + let Some(RpcContinuation::Rest(x)) = continuations.remove(guid) else { + return None; + }; + x.get().await } } impl AsRef for RpcContext { diff --git a/core/startos/src/context/sdk.rs b/core/startos/src/context/sdk.rs index 7ba7a6bfa..fb5d99572 100644 --- a/core/startos/src/context/sdk.rs +++ b/core/startos/src/context/sdk.rs @@ -8,13 +8,6 @@ use serde::Deserialize; use tracing::instrument; use crate::prelude::*; -use crate::util::config::{load_config_from_paths, local_config_path}; - -#[derive(Debug, Default, Deserialize)] -#[serde(rename_all = "kebab-case")] -pub struct SdkContextConfig { - pub developer_key_path: Option, -} #[derive(Debug)] pub struct SdkContextSeed { @@ -26,7 +19,7 @@ pub struct SdkContext(Arc); impl SdkContext { /// BLOCKING #[instrument(skip_all)] - pub fn init(matches: &ArgMatches) -> Result { + pub fn init(config: ) -> Result { let local_config_path = local_config_path(); let base: SdkContextConfig = load_config_from_paths( matches @@ -48,24 +41,7 @@ impl SdkContext { }), }))) } - /// BLOCKING - #[instrument(skip_all)] - pub fn developer_key(&self) -> Result { - if !self.developer_key_path.exists() { - return Err(Error::new(eyre!("Developer Key does not exist! Please run `start-sdk init` before running this command."), crate::ErrorKind::Uninitialized)); - } - let pair = ::from_pkcs8_pem( - &std::fs::read_to_string(&self.developer_key_path)?, - ) - .with_kind(crate::ErrorKind::Pem)?; - let secret = ed25519_dalek::SecretKey::try_from(&pair.secret_key[..]).map_err(|_| { - Error::new( - eyre!("pkcs8 key is of incorrect length"), - ErrorKind::OpenSsl, - ) - })?; - Ok(secret.into()) - } + } impl std::ops::Deref for SdkContext { type Target = SdkContextSeed; diff --git a/core/startos/src/context/setup.rs b/core/startos/src/context/setup.rs index 7ae161b01..aeeca2920 100644 --- a/core/startos/src/context/setup.rs +++ b/core/startos/src/context/setup.rs @@ -1,5 +1,5 @@ use std::ops::Deref; -use std::path::{Path, PathBuf}; +use std::path::PathBuf; use std::sync::Arc; use josekit::jwk::Jwk; @@ -15,12 +15,12 @@ use tokio::sync::RwLock; use tracing::instrument; use crate::account::AccountInfo; +use crate::context::config::ServerConfig; use crate::db::model::Database; use crate::disk::OsPartitionInfo; use crate::init::init_postgres; +use crate::prelude::*; use crate::setup::SetupStatus; -use crate::util::config::load_config_from_paths; -use crate::{Error, ResultExt}; lazy_static::lazy_static! { pub static ref CURRENT_SECRET: Jwk = Jwk::generate_ec_key(josekit::jwk::alg::ec::EcCurve::P256).unwrap_or_else(|e| { @@ -38,45 +38,9 @@ pub struct SetupResult { pub root_ca: String, } -#[derive(Debug, Default, Deserialize)] -#[serde(rename_all = "kebab-case")] -pub struct SetupContextConfig { - pub os_partitions: OsPartitionInfo, - pub migration_batch_rows: Option, - pub migration_prefetch_rows: Option, - pub datadir: Option, - #[serde(default)] - pub disable_encryption: bool, -} -impl SetupContextConfig { - #[instrument(skip_all)] - pub async fn load + Send + 'static>(path: Option

    ) -> Result { - tokio::task::spawn_blocking(move || { - load_config_from_paths( - path.as_ref() - .into_iter() - .map(|p| p.as_ref()) - .chain(std::iter::once(Path::new( - crate::util::config::DEVICE_CONFIG_PATH, - ))) - .chain(std::iter::once(Path::new(crate::util::config::CONFIG_PATH))), - ) - }) - .await - .unwrap() - } - pub fn datadir(&self) -> &Path { - self.datadir - .as_deref() - .unwrap_or_else(|| Path::new("/embassy-data")) - } -} - pub struct SetupContextSeed { + pub config: ServerConfig, pub os_partitions: OsPartitionInfo, - pub config_path: Option, - pub migration_batch_rows: usize, - pub migration_prefetch_rows: usize, pub disable_encryption: bool, pub shutdown: Sender<()>, pub datadir: PathBuf, @@ -96,16 +60,18 @@ impl AsRef for SetupContextSeed { pub struct SetupContext(Arc); impl SetupContext { #[instrument(skip_all)] - pub async fn init + Send + 'static>(path: Option

    ) -> Result { - let cfg = SetupContextConfig::load(path.as_ref().map(|p| p.as_ref().to_owned())).await?; + pub fn init(config: &ServerConfig) -> Result { let (shutdown, _) = tokio::sync::broadcast::channel(1); - let datadir = cfg.datadir().to_owned(); + let datadir = config.datadir().to_owned(); Ok(Self(Arc::new(SetupContextSeed { - os_partitions: cfg.os_partitions, - config_path: path.as_ref().map(|p| p.as_ref().to_owned()), - migration_batch_rows: cfg.migration_batch_rows.unwrap_or(25000), - migration_prefetch_rows: cfg.migration_prefetch_rows.unwrap_or(100_000), - disable_encryption: cfg.disable_encryption, + config: config.clone(), + os_partitions: config.os_partitions.clone().ok_or_else(|| { + Error::new( + eyre!("missing required configuration: `os-partitions`"), + ErrorKind::NotFound, + ) + })?, + disable_encryption: config.disable_encryption.unwrap_or(false), shutdown, datadir, selected_v2_drive: RwLock::new(None), diff --git a/core/startos/src/control.rs b/core/startos/src/control.rs index 58e39ac14..893aeee2b 100644 --- a/core/startos/src/control.rs +++ b/core/startos/src/control.rs @@ -1,89 +1,52 @@ +use clap::Parser; use color_eyre::eyre::eyre; +use models::PackageId; use rpc_toolkit::command; +use serde::{Deserialize, Serialize}; use tracing::instrument; use crate::context::RpcContext; use crate::prelude::*; -use crate::s9pk::manifest::PackageId; -use crate::status::MainStatus; -use crate::util::display_none; use crate::Error; -#[command(display(display_none), metadata(sync_db = true))] -#[instrument(skip_all)] -pub async fn start(#[context] ctx: RpcContext, #[arg] id: PackageId) -> Result<(), Error> { - let peek = ctx.db.peek().await; - let version = peek - .as_package_data() - .as_idx(&id) - .or_not_found(&id)? - .as_installed() - .or_not_found(&id)? - .as_manifest() - .as_version() - .de()?; +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct ControlParams { + pub id: PackageId, +} - ctx.managers - .get(&(id, version)) +#[instrument(skip_all)] +pub async fn start(ctx: RpcContext, ControlParams { id }: ControlParams) -> Result<(), Error> { + ctx.services + .get(&id) .await - .ok_or_else(|| Error::new(eyre!("Manager not found"), crate::ErrorKind::InvalidRequest))? + .as_ref() + .or_not_found(lazy_format!("Manager for {id}"))? .start() .await; Ok(()) } -#[command(display(display_none), metadata(sync_db = true))] -pub async fn stop(#[context] ctx: RpcContext, #[arg] id: PackageId) -> Result { - let peek = ctx.db.peek().await; - let version = peek - .as_package_data() - .as_idx(&id) - .or_not_found(&id)? - .as_installed() - .or_not_found(&id)? - .as_manifest() - .as_version() - .de()?; - - let last_statuts = ctx - .db - .mutate(|v| { - v.as_package_data_mut() - .as_idx_mut(&id) - .and_then(|x| x.as_installed_mut()) - .ok_or_else(|| Error::new(eyre!("{} is not installed", id), ErrorKind::NotFound))? - .as_status_mut() - .as_main_mut() - .replace(&MainStatus::Stopping) - }) - .await?; - - ctx.managers - .get(&(id, version)) +pub async fn stop(ctx: RpcContext, ControlParams { id }: ControlParams) -> Result<(), Error> { + // TODO: why did this return last_status before? + ctx.services + .get(&id) .await + .as_ref() .ok_or_else(|| Error::new(eyre!("Manager not found"), crate::ErrorKind::InvalidRequest))? .stop() .await; - Ok(last_statuts) + Ok(()) } -#[command(display(display_none), metadata(sync_db = true))] -pub async fn restart(#[context] ctx: RpcContext, #[arg] id: PackageId) -> Result<(), Error> { - let peek = ctx.db.peek().await; - let version = peek - .as_package_data() - .as_idx(&id) - .or_not_found(&id)? - .expect_as_installed()? - .as_manifest() - .as_version() - .de()?; - - ctx.managers - .get(&(id, version)) +pub async fn restart(ctx: RpcContext, ControlParams { id }: ControlParams) -> Result<(), Error> { + ctx.services + .get(&id) .await + .as_ref() .ok_or_else(|| Error::new(eyre!("Manager not found"), crate::ErrorKind::InvalidRequest))? .restart() .await; diff --git a/core/startos/src/core/rpc_continuations.rs b/core/startos/src/core/rpc_continuations.rs index 45a1c1b05..9a82cb1fe 100644 --- a/core/startos/src/core/rpc_continuations.rs +++ b/core/startos/src/core/rpc_continuations.rs @@ -1,27 +1,21 @@ -use std::sync::Arc; use std::time::Duration; +use axum::extract::ws::WebSocket; +use axum::extract::Request; +use axum::response::Response; use futures::future::BoxFuture; -use futures::FutureExt; use helpers::TimedResource; -use hyper::upgrade::Upgraded; -use hyper::{Body, Error as HyperError, Request, Response}; -use rand::RngCore; -use tokio::task::JoinError; -use tokio_tungstenite::WebSocketStream; +use imbl_value::InternedString; -use crate::{Error, ResultExt}; +#[allow(unused_imports)] +use crate::prelude::*; +use crate::util::new_guid; #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, serde::Serialize, serde::Deserialize)] -pub struct RequestGuid = String>(Arc); +pub struct RequestGuid(InternedString); impl RequestGuid { pub fn new() -> Self { - let mut buf = [0; 40]; - rand::thread_rng().fill_bytes(&mut buf); - RequestGuid(Arc::new(base32::encode( - base32::Alphabet::RFC4648 { padding: false }, - &buf, - ))) + Self(new_guid()) } pub fn from(r: &str) -> Option { @@ -33,9 +27,15 @@ impl RequestGuid { return None; } } - Some(RequestGuid(Arc::new(r.to_owned()))) + Some(RequestGuid(InternedString::intern(r))) } } +impl AsRef for RequestGuid { + fn as_ref(&self) -> &str { + self.0.as_ref() + } +} + #[test] fn parse_guid() { println!( @@ -44,22 +44,16 @@ fn parse_guid() { ) } -impl> std::fmt::Display for RequestGuid { +impl std::fmt::Display for RequestGuid { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - (&*self.0).as_ref().fmt(f) + self.0.fmt(f) } } -pub type RestHandler = Box< - dyn FnOnce(Request) -> BoxFuture<'static, Result, crate::Error>> + Send, ->; +pub type RestHandler = + Box BoxFuture<'static, Result> + Send>; -pub type WebSocketHandler = Box< - dyn FnOnce( - BoxFuture<'static, Result, HyperError>, JoinError>>, - ) -> BoxFuture<'static, Result<(), Error>> - + Send, ->; +pub type WebSocketHandler = Box BoxFuture<'static, ()> + Send>; pub enum RpcContinuation { Rest(TimedResource), @@ -78,39 +72,4 @@ impl RpcContinuation { RpcContinuation::WebSocket(a) => a.is_timed_out(), } } - pub async fn into_handler(self) -> Option { - match self { - RpcContinuation::Rest(handler) => handler.get().await, - RpcContinuation::WebSocket(handler) => { - if let Some(handler) = handler.get().await { - Some(Box::new( - |req: Request| -> BoxFuture<'static, Result, Error>> { - async move { - let (parts, body) = req.into_parts(); - let req = Request::from_parts(parts, body); - let (res, ws_fut) = hyper_ws_listener::create_ws(req) - .with_kind(crate::ErrorKind::Network)?; - if let Some(ws_fut) = ws_fut { - tokio::task::spawn(async move { - match handler(ws_fut.boxed()).await { - Ok(()) => (), - Err(e) => { - tracing::error!("WebSocket Closed: {}", e); - tracing::debug!("{:?}", e); - } - } - }); - } - - Ok(res) - } - .boxed() - }, - )) - } else { - None - } - } - } - } } diff --git a/core/startos/src/db/mod.rs b/core/startos/src/db/mod.rs index 03ad94338..77b2dfef2 100644 --- a/core/startos/src/db/mod.rs +++ b/core/startos/src/db/mod.rs @@ -1,61 +1,52 @@ pub mod model; -pub mod package; pub mod prelude; -use std::future::Future; use std::path::PathBuf; use std::sync::Arc; -use futures::{FutureExt, SinkExt, StreamExt}; +use axum::extract::ws::{self, WebSocket}; +use axum::extract::WebSocketUpgrade; +use axum::response::Response; +use clap::Parser; +use futures::{FutureExt, StreamExt}; +use http::header::COOKIE; +use http::HeaderMap; use patch_db::json_ptr::JsonPointer; use patch_db::{Dump, Revision}; -use rpc_toolkit::command; -use rpc_toolkit::hyper::upgrade::Upgraded; -use rpc_toolkit::hyper::{Body, Error as HyperError, Request, Response}; use rpc_toolkit::yajrc::RpcError; +use rpc_toolkit::{command, from_fn_async, CallRemote, HandlerExt, ParentHandler}; use serde::{Deserialize, Serialize}; use serde_json::Value; use tokio::sync::oneshot; -use tokio::task::JoinError; -use tokio_tungstenite::tungstenite::protocol::frame::coding::CloseCode; -use tokio_tungstenite::tungstenite::protocol::CloseFrame; -use tokio_tungstenite::tungstenite::Message; -use tokio_tungstenite::WebSocketStream; use tracing::instrument; use crate::context::{CliContext, RpcContext}; use crate::middleware::auth::{HasValidSession, HashSessionToken}; use crate::prelude::*; -use crate::util::display_none; -use crate::util::serde::{display_serializable, IoFormat}; +use crate::util::serde::{apply_expr, HandlerExtSerde}; #[instrument(skip_all)] -async fn ws_handler< - WSFut: Future, HyperError>, JoinError>>, ->( +async fn ws_handler( ctx: RpcContext, session: Option<(HasValidSession, HashSessionToken)>, - ws_fut: WSFut, + mut stream: WebSocket, ) -> Result<(), Error> { let (dump, sub) = ctx.db.dump_and_sub().await; - let mut stream = ws_fut - .await - .with_kind(ErrorKind::Network)? - .with_kind(ErrorKind::Unknown)?; if let Some((session, token)) = session { let kill = subscribe_to_session_kill(&ctx, token).await; - send_dump(session, &mut stream, dump).await?; + send_dump(session.clone(), &mut stream, dump).await?; deal_with_messages(session, kill, sub, stream).await?; } else { stream - .close(Some(CloseFrame { - code: CloseCode::Error, + .send(ws::Message::Close(Some(ws::CloseFrame { + code: ws::close_code::ERROR, reason: "UNAUTHORIZED".into(), - })) + }))) .await .with_kind(ErrorKind::Network)?; + drop(stream); } Ok(()) @@ -80,7 +71,7 @@ async fn deal_with_messages( _has_valid_authentication: HasValidSession, mut kill: oneshot::Receiver<()>, mut sub: patch_db::Subscriber, - mut stream: WebSocketStream, + mut stream: WebSocket, ) -> Result<(), Error> { let mut timer = tokio::time::interval(tokio::time::Duration::from_secs(5)); @@ -89,18 +80,18 @@ async fn deal_with_messages( _ = (&mut kill).fuse() => { tracing::info!("Closing WebSocket: Reason: Session Terminated"); stream - .close(Some(CloseFrame { - code: CloseCode::Error, - reason: "UNAUTHORIZED".into(), - })) - .await - .with_kind(ErrorKind::Network)?; + .send(ws::Message::Close(Some(ws::CloseFrame { + code: ws::close_code::ERROR, + reason: "UNAUTHORIZED".into(), + }))).await + .with_kind(ErrorKind::Network)?; + drop(stream); return Ok(()) } new_rev = sub.recv().fuse() => { let rev = new_rev.expect("UNREACHABLE: patch-db is dropped"); stream - .send(Message::Text(serde_json::to_string(&rev).with_kind(ErrorKind::Serialization)?)) + .send(ws::Message::Text(serde_json::to_string(&rev).with_kind(ErrorKind::Serialization)?)) .await .with_kind(ErrorKind::Network)?; } @@ -117,7 +108,7 @@ async fn deal_with_messages( // This is trying to give a health checks to the home to keep the ui alive. _ = timer.tick().fuse() => { stream - .send(Message::Ping(vec![])) + .send(ws::Message::Ping(vec![])) .await .with_kind(crate::ErrorKind::Network)?; } @@ -127,11 +118,11 @@ async fn deal_with_messages( async fn send_dump( _has_valid_authentication: HasValidSession, - stream: &mut WebSocketStream, + stream: &mut WebSocket, dump: Dump, ) -> Result<(), Error> { stream - .send(Message::Text( + .send(ws::Message::Text( serde_json::to_string(&dump).with_kind(ErrorKind::Serialization)?, )) .await @@ -139,11 +130,14 @@ async fn send_dump( Ok(()) } -pub async fn subscribe(ctx: RpcContext, req: Request) -> Result, Error> { - let (parts, body) = req.into_parts(); +pub async fn subscribe( + ctx: RpcContext, + headers: HeaderMap, + ws: WebSocketUpgrade, +) -> Result { let session = match async { - let token = HashSessionToken::from_request_parts(&parts)?; - let session = HasValidSession::from_request_parts(&parts, &ctx).await?; + let token = HashSessionToken::from_header(headers.get(COOKIE))?; + let session = HasValidSession::from_header(headers.get(COOKIE), &ctx).await?; Ok::<_, Error>((session, token)) } .await @@ -157,26 +151,24 @@ pub async fn subscribe(ctx: RpcContext, req: Request) -> Result (), - Err(e) => { - tracing::error!("WebSocket Closed: {}", e); - tracing::debug!("{:?}", e); - } + Ok(ws.on_upgrade(|ws| async move { + match ws_handler(ctx, session, ws).await { + Ok(()) => (), + Err(e) => { + tracing::error!("WebSocket Closed: {}", e); + tracing::debug!("{:?}", e); } - }); - } - - Ok(res) + } + })) } -#[command(subcommands(dump, put, apply))] -pub fn db() -> Result<(), RpcError> { - Ok(()) +pub fn db() -> ParentHandler { + ParentHandler::new() + .subcommand("dump", from_fn_async(cli_dump).with_display_serializable()) + .subcommand("dump", from_fn_async(dump).no_cli()) + .subcommand("put", put()) + .subcommand("apply", from_fn_async(cli_apply).no_display()) + .subcommand("apply", from_fn_async(apply).no_cli()) } #[derive(Deserialize, Serialize)] @@ -187,96 +179,36 @@ pub enum RevisionsRes { } #[instrument(skip_all)] -async fn cli_dump( - ctx: CliContext, - _format: Option, - path: Option, -) -> Result { +async fn cli_dump(ctx: CliContext, DumpParams { path }: DumpParams) -> Result { let dump = if let Some(path) = path { PatchDb::open(path).await?.dump().await } else { - rpc_toolkit::command_helpers::call_remote( - ctx, - "db.dump", - serde_json::json!({}), - std::marker::PhantomData::, - ) - .await? - .result? + from_value::(ctx.call_remote("db.dump", imbl_value::json!({})).await?)? }; Ok(dump) } -#[command( - custom_cli(cli_dump(async, context(CliContext))), - display(display_serializable) -)] -pub async fn dump( - #[context] ctx: RpcContext, - #[allow(unused_variables)] - #[arg(long = "format")] - format: Option, - #[allow(unused_variables)] - #[arg] +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct DumpParams { path: Option, -) -> Result { - Ok(ctx.db.dump().await) } -fn apply_expr(input: jaq_core::Val, expr: &str) -> Result { - let (expr, errs) = jaq_core::parse::parse(expr, jaq_core::parse::main()); - - let Some(expr) = expr else { - return Err(Error::new( - eyre!("Failed to parse expression: {:?}", errs), - crate::ErrorKind::InvalidRequest, - )); - }; - - let mut errs = Vec::new(); - - let mut defs = jaq_core::Definitions::core(); - for def in jaq_std::std() { - defs.insert(def, &mut errs); - } - - let filter = defs.finish(expr, Vec::new(), &mut errs); - - if !errs.is_empty() { - return Err(Error::new( - eyre!("Failed to compile expression: {:?}", errs), - crate::ErrorKind::InvalidRequest, - )); - }; - - let inputs = jaq_core::RcIter::new(std::iter::empty()); - let mut res_iter = filter.run(jaq_core::Ctx::new([], &inputs), input); - - let Some(res) = res_iter - .next() - .transpose() - .map_err(|e| eyre!("{e}")) - .with_kind(crate::ErrorKind::Deserialization)? - else { - return Err(Error::new( - eyre!("expr returned no results"), - crate::ErrorKind::InvalidRequest, - )); - }; - - if res_iter.next().is_some() { - return Err(Error::new( - eyre!("expr returned too many results"), - crate::ErrorKind::InvalidRequest, - )); - } - - Ok(res) +// #[command( +// custom_cli(cli_dump(async, context(CliContext))), +// display(display_serializable) +// )] +pub async fn dump(ctx: RpcContext, _: DumpParams) -> Result { + Ok(ctx.db.dump().await) } #[instrument(skip_all)] -async fn cli_apply(ctx: CliContext, expr: String, path: Option) -> Result<(), RpcError> { +async fn cli_apply( + ctx: CliContext, + ApplyParams { expr, path }: ApplyParams, +) -> Result<(), RpcError> { if let Some(path) = path { PatchDb::open(path) .await? @@ -301,30 +233,22 @@ async fn cli_apply(ctx: CliContext, expr: String, path: Option) -> Resu }) .await?; } else { - rpc_toolkit::command_helpers::call_remote( - ctx, - "db.apply", - serde_json::json!({ "expr": expr }), - std::marker::PhantomData::<()>, - ) - .await? - .result?; + ctx.call_remote("db.apply", imbl_value::json!({ "expr": expr })) + .await?; } Ok(()) } -#[command( - custom_cli(cli_apply(async, context(CliContext))), - display(display_none) -)] -pub async fn apply( - #[context] ctx: RpcContext, - #[arg] expr: String, - #[allow(unused_variables)] - #[arg] +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct ApplyParams { + expr: String, path: Option, -) -> Result<(), Error> { +} + +pub async fn apply(ctx: RpcContext, ApplyParams { expr, .. }: ApplyParams) -> Result<(), Error> { ctx.db .mutate(|db| { let res = apply_expr( @@ -346,21 +270,25 @@ pub async fn apply( .await } -#[command(subcommands(ui))] -pub fn put() -> Result<(), RpcError> { - Ok(()) +pub fn put() -> ParentHandler { + ParentHandler::new().subcommand( + "ui", + from_fn_async(ui) + .with_display_serializable() + .with_remote_cli::(), + ) +} +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct UiParams { + pointer: JsonPointer, + value: Value, } -#[command(display(display_serializable))] +// #[command(display(display_serializable))] #[instrument(skip_all)] -pub async fn ui( - #[context] ctx: RpcContext, - #[arg] pointer: JsonPointer, - #[arg] value: Value, - #[allow(unused_variables)] - #[arg(long = "format")] - format: Option, -) -> Result<(), Error> { +pub async fn ui(ctx: RpcContext, UiParams { pointer, value, .. }: UiParams) -> Result<(), Error> { let ptr = "/ui" .parse::() .with_kind(ErrorKind::Database)? diff --git a/core/startos/src/db/model.rs b/core/startos/src/db/model.rs index 344d5abb3..2f4d33ffa 100644 --- a/core/startos/src/db/model.rs +++ b/core/startos/src/db/model.rs @@ -1,6 +1,5 @@ use std::collections::{BTreeMap, BTreeSet}; use std::net::{Ipv4Addr, Ipv6Addr}; -use std::sync::Arc; use chrono::{DateTime, Utc}; use emver::VersionRange; @@ -8,8 +7,9 @@ use imbl_value::InternedString; use ipnet::{Ipv4Net, Ipv6Net}; use isocountry::CountryCode; use itertools::Itertools; -use models::{DataUrl, HealthCheckId, InterfaceId}; +use models::{DataUrl, HealthCheckId, InterfaceId, PackageId}; use openssl::hash::MessageDigest; +use patch_db::json_ptr::JsonPointer; use patch_db::{HasModel, Value}; use reqwest::Url; use serde::{Deserialize, Serialize}; @@ -17,12 +17,12 @@ use ssh_key::public::Ed25519PublicKey; use crate::account::AccountInfo; use crate::config::spec::PackagePointerSpec; -use crate::install::progress::InstallProgress; use crate::net::utils::{get_iface_ipv4_addr, get_iface_ipv6_addr}; use crate::prelude::*; -use crate::s9pk::manifest::{Manifest, PackageId}; +use crate::progress::FullProgress; +use crate::s9pk::manifest::Manifest; use crate::status::Status; -use crate::util::cpupower::{Governor}; +use crate::util::cpupower::Governor; use crate::util::Version; use crate::version::{Current, VersionT}; use crate::{ARCH, PLATFORM}; @@ -225,14 +225,14 @@ impl Map for AllPackageData { pub struct StaticFiles { license: String, instructions: String, - icon: String, + icon: DataUrl<'static>, } impl StaticFiles { - pub fn local(id: &PackageId, version: &Version, icon_type: &str) -> Self { + pub fn local(id: &PackageId, version: &Version, icon: DataUrl<'static>) -> Self { StaticFiles { license: format!("/public/package-data/{}/{}/LICENSE.md", id, version), instructions: format!("/public/package-data/{}/{}/INSTRUCTIONS.md", id, version), - icon: format!("/public/package-data/{}/{}/icon.{}", id, version, icon_type), + icon, } } } @@ -243,7 +243,7 @@ impl StaticFiles { pub struct PackageDataEntryInstalling { pub static_files: StaticFiles, pub manifest: Manifest, - pub install_progress: Arc, + pub install_progress: FullProgress, } #[derive(Debug, Deserialize, Serialize, HasModel)] @@ -253,7 +253,7 @@ pub struct PackageDataEntryUpdating { pub static_files: StaticFiles, pub manifest: Manifest, pub installed: InstalledPackageInfo, - pub install_progress: Arc, + pub install_progress: FullProgress, } #[derive(Debug, Deserialize, Serialize, HasModel)] @@ -262,7 +262,7 @@ pub struct PackageDataEntryUpdating { pub struct PackageDataEntryRestoring { pub static_files: StaticFiles, pub manifest: Manifest, - pub install_progress: Arc, + pub install_progress: FullProgress, } #[derive(Debug, Deserialize, Serialize, HasModel)] @@ -422,7 +422,7 @@ impl Model { PackageDataEntryMatchModelMut::Error(_) => None, } } - pub fn as_install_progress(&self) -> Option<&Model>> { + pub fn as_install_progress(&self) -> Option<&Model> { match self.as_match() { PackageDataEntryMatchModelRef::Installing(a) => Some(a.as_install_progress()), PackageDataEntryMatchModelRef::Updating(a) => Some(a.as_install_progress()), @@ -432,7 +432,7 @@ impl Model { PackageDataEntryMatchModelRef::Error(_) => None, } } - pub fn as_install_progress_mut(&mut self) -> Option<&mut Model>> { + pub fn as_install_progress_mut(&mut self) -> Option<&mut Model> { match self.as_match_mut() { PackageDataEntryMatchModelMut::Installing(a) => Some(a.as_install_progress_mut()), PackageDataEntryMatchModelMut::Updating(a) => Some(a.as_install_progress_mut()), @@ -459,6 +459,29 @@ pub struct InstalledPackageInfo { pub current_dependents: CurrentDependents, pub current_dependencies: CurrentDependencies, pub interface_addresses: InterfaceAddressMap, + pub store: Value, + pub store_exposed_ui: Vec, + pub store_exposed_dependents: Vec, +} +#[derive(Debug, Deserialize, Serialize, HasModel)] +#[model = "Model"] +pub struct ExposedDependent { + path: String, + title: String, + description: Option, + masked: Option, + copyable: Option, + qr: Option, +} +#[derive(Clone, Debug, Deserialize, Serialize, HasModel)] +#[model = "Model"] +pub struct ExposedUI { + path: Vec, + title: String, + description: Option, + masked: Option, + copyable: Option, + qr: Option, } #[derive(Debug, Clone, Default, Deserialize, Serialize)] @@ -478,7 +501,6 @@ impl Map for CurrentDependents { type Key = PackageId; type Value = CurrentDependencyInfo; } - #[derive(Debug, Clone, Default, Deserialize, Serialize)] pub struct CurrentDependencies(pub BTreeMap); impl CurrentDependencies { @@ -514,7 +536,7 @@ pub struct CurrentDependencyInfo { pub health_checks: BTreeSet, } -#[derive(Debug, Deserialize, Serialize)] +#[derive(Debug, Default, Deserialize, Serialize)] pub struct InterfaceAddressMap(pub BTreeMap); impl Map for InterfaceAddressMap { type Key = InterfaceId; diff --git a/core/startos/src/db/package.rs b/core/startos/src/db/package.rs deleted file mode 100644 index fe6f93809..000000000 --- a/core/startos/src/db/package.rs +++ /dev/null @@ -1,22 +0,0 @@ -use models::Version; - -use crate::prelude::*; -use crate::s9pk::manifest::PackageId; - -pub fn get_packages(db: Peeked) -> Result, Error> { - Ok(db - .as_package_data() - .keys()? - .into_iter() - .flat_map(|package_id| { - let version = db - .as_package_data() - .as_idx(&package_id)? - .as_manifest() - .as_version() - .de() - .ok()?; - Some((package_id, version)) - }) - .collect()) -} diff --git a/core/startos/src/db/prelude.rs b/core/startos/src/db/prelude.rs index 922a47500..15e511d53 100644 --- a/core/startos/src/db/prelude.rs +++ b/core/startos/src/db/prelude.rs @@ -2,8 +2,9 @@ use std::collections::BTreeMap; use std::marker::PhantomData; use std::panic::UnwindSafe; +pub use imbl_value::Value; use patch_db::value::InternedString; -pub use patch_db::{HasModel, PatchDb, Value}; +pub use patch_db::{HasModel, PatchDb}; use serde::de::DeserializeOwned; use serde::Serialize; diff --git a/core/startos/src/dependencies.rs b/core/startos/src/dependencies.rs index dfddecd93..d6b297e13 100644 --- a/core/startos/src/dependencies.rs +++ b/core/startos/src/dependencies.rs @@ -1,31 +1,26 @@ use std::collections::BTreeMap; use std::time::Duration; -use color_eyre::eyre::eyre; +use clap::Parser; use emver::VersionRange; -use models::OptionExt; -use rand::SeedableRng; -use rpc_toolkit::command; +use models::{OptionExt, PackageId}; +use rpc_toolkit::{command, from_fn_async, Empty, HandlerExt, ParentHandler}; use serde::{Deserialize, Serialize}; use tracing::instrument; -use crate::config::action::ConfigRes; use crate::config::spec::PackagePointerSpec; -use crate::config::{not_found, Config, ConfigSpec, ConfigureContext}; -use crate::context::RpcContext; +use crate::config::{Config, ConfigSpec, ConfigureContext}; +use crate::context::{CliContext, RpcContext}; use crate::db::model::{CurrentDependencies, Database}; use crate::prelude::*; -use crate::procedure::{NoOutput, PackageProcedure, ProcedureName}; -use crate::s9pk::manifest::{Manifest, PackageId}; +use crate::s9pk::manifest::Manifest; use crate::status::DependencyConfigErrors; -use crate::util::serde::display_serializable; -use crate::util::{display_none, Version}; -use crate::volume::Volumes; +use crate::util::serde::HandlerExtSerde; +use crate::util::Version; use crate::Error; -#[command(subcommands(configure))] -pub fn dependency() -> Result<(), Error> { - Ok(()) +pub fn dependency() -> ParentHandler { + ParentHandler::new().subcommand("configure", configure()) } #[derive(Clone, Debug, Default, Deserialize, Serialize, HasModel)] @@ -58,77 +53,41 @@ pub struct DepInfo { pub requirement: DependencyRequirement, pub description: Option, #[serde(default)] - pub config: Option, + pub config: Option, // TODO: remove } -#[derive(Clone, Debug, Deserialize, Serialize, HasModel)] +#[derive(Deserialize, Serialize, Parser)] #[serde(rename_all = "kebab-case")] -#[model = "Model"] -pub struct DependencyConfig { - check: PackageProcedure, - auto_configure: PackageProcedure, +#[command(rename_all = "kebab-case")] +pub struct ConfigureParams { + #[arg(name = "dependent-id")] + dependent_id: PackageId, + #[arg(name = "dependency-id")] + dependency_id: PackageId, } -impl DependencyConfig { - pub async fn check( - &self, - ctx: &RpcContext, - dependent_id: &PackageId, - dependent_version: &Version, - dependent_volumes: &Volumes, - dependency_id: &PackageId, - dependency_config: &Config, - ) -> Result, Error> { - Ok(self - .check - .sandboxed( - ctx, - dependent_id, - dependent_version, - dependent_volumes, - Some(dependency_config), - None, - ProcedureName::Check(dependency_id.clone()), - ) - .await? - .map_err(|(_, e)| e)) - } - pub async fn auto_configure( - &self, - ctx: &RpcContext, - dependent_id: &PackageId, - dependent_version: &Version, - dependent_volumes: &Volumes, - old: &Config, - ) -> Result { - self.auto_configure - .sandboxed( - ctx, - dependent_id, - dependent_version, - dependent_volumes, - Some(old), - None, - ProcedureName::AutoConfig(dependent_id.clone()), - ) - .await? - .map_err(|e| Error::new(eyre!("{}", e.1), crate::ErrorKind::AutoConfigure)) - } -} - -#[command( - subcommands(self(configure_impl(async)), configure_dry), - display(display_none) -)] -pub async fn configure( - #[arg(rename = "dependent-id")] dependent_id: PackageId, - #[arg(rename = "dependency-id")] dependency_id: PackageId, -) -> Result<(PackageId, PackageId), Error> { - Ok((dependent_id, dependency_id)) +pub fn configure() -> ParentHandler { + ParentHandler::new() + .root_handler( + from_fn_async(configure_impl) + .with_inherited(|params, _| params) + .no_cli(), + ) + .subcommand( + "dry", + from_fn_async(configure_dry) + .with_inherited(|params, _| params) + .with_display_serializable() + .with_remote_cli::(), + ) } pub async fn configure_impl( ctx: RpcContext, - (pkg_id, dep_id): (PackageId, PackageId), + _: Empty, + ConfigureParams { + dependent_id, + dependency_id, + }: ConfigureParams, ) -> Result<(), Error> { let breakages = BTreeMap::new(); let overrides = Default::default(); @@ -136,7 +95,7 @@ pub async fn configure_impl( old_config: _, new_config, spec: _, - } = configure_logic(ctx.clone(), (pkg_id, dep_id.clone())).await?; + } = configure_logic(ctx.clone(), (dependent_id, dependency_id.clone())).await?; let configure_context = ConfigureContext { breakages, @@ -145,7 +104,18 @@ pub async fn configure_impl( dry_run: false, overrides, }; - crate::config::configure(&ctx, &dep_id, configure_context).await?; + ctx.services + .get(&dependency_id) + .await + .as_ref() + .ok_or_else(|| { + Error::new( + eyre!("There is no manager running for {dependency_id}"), + ErrorKind::Unknown, + ) + })? + .configure(configure_context) + .await?; Ok(()) } @@ -157,90 +127,95 @@ pub struct ConfigDryRes { pub spec: ConfigSpec, } -#[command(rename = "dry", display(display_serializable))] +// #[command(rename = "dry", display(display_serializable))] #[instrument(skip_all)] pub async fn configure_dry( - #[context] ctx: RpcContext, - #[parent_data] (pkg_id, dependency_id): (PackageId, PackageId), + ctx: RpcContext, + _: Empty, + ConfigureParams { + dependent_id, + dependency_id, + }: ConfigureParams, ) -> Result { - configure_logic(ctx, (pkg_id, dependency_id)).await + configure_logic(ctx, (dependent_id, dependency_id)).await } pub async fn configure_logic( ctx: RpcContext, - (pkg_id, dependency_id): (PackageId, PackageId), + (dependent_id, dependency_id): (PackageId, PackageId), ) -> Result { - let db = ctx.db.peek().await; - let pkg = db - .as_package_data() - .as_idx(&pkg_id) - .or_not_found(&pkg_id)? - .as_installed() - .or_not_found(&pkg_id)?; - let pkg_version = pkg.as_manifest().as_version().de()?; - let pkg_volumes = pkg.as_manifest().as_volumes().de()?; - let dependency = db - .as_package_data() - .as_idx(&dependency_id) - .or_not_found(&dependency_id)? - .as_installed() - .or_not_found(&dependency_id)?; - let dependency_config_action = dependency - .as_manifest() - .as_config() - .de()? - .ok_or_else(|| not_found!("Manifest Config"))?; - let dependency_version = dependency.as_manifest().as_version().de()?; - let dependency_volumes = dependency.as_manifest().as_volumes().de()?; - let dependency = pkg - .as_manifest() - .as_dependencies() - .as_idx(&dependency_id) - .or_not_found(&dependency_id)?; + // let db = ctx.db.peek().await; + // let pkg = db + // .as_package_data() + // .as_idx(&pkg_id) + // .or_not_found(&pkg_id)? + // .as_installed() + // .or_not_found(&pkg_id)?; + // let pkg_version = pkg.as_manifest().as_version().de()?; + // let pkg_volumes = pkg.as_manifest().as_volumes().de()?; + // let dependency = db + // .as_package_data() + // .as_idx(&dependency_id) + // .or_not_found(&dependency_id)? + // .as_installed() + // .or_not_found(&dependency_id)?; + // let dependency_config_action = dependency + // .as_manifest() + // .as_config() + // .de()? + // .ok_or_else(|| not_found!("Manifest Config"))?; + // let dependency_version = dependency.as_manifest().as_version().de()?; + // let dependency_volumes = dependency.as_manifest().as_volumes().de()?; + // let dependency = pkg + // .as_manifest() + // .as_dependencies() + // .as_idx(&dependency_id) + // .or_not_found(&dependency_id)?; - let ConfigRes { - config: maybe_config, - spec, - } = dependency_config_action - .get( - &ctx, - &dependency_id, - &dependency_version, - &dependency_volumes, - ) - .await?; + // let ConfigRes { + // config: maybe_config, + // spec, + // } = dependency_config_action + // .get( + // &ctx, + // &dependency_id, + // &dependency_version, + // &dependency_volumes, + // ) + // .await?; - let old_config = if let Some(config) = maybe_config { - config - } else { - spec.gen( - &mut rand::rngs::StdRng::from_entropy(), - &Some(Duration::new(10, 0)), - )? - }; + // let old_config = if let Some(config) = maybe_config { + // config + // } else { + // spec.gen( + // &mut rand::rngs::StdRng::from_entropy(), + // &Some(Duration::new(10, 0)), + // )? + // }; - let new_config = dependency - .as_config() - .de()? - .ok_or_else(|| not_found!("Config"))? - .auto_configure - .sandboxed( - &ctx, - &pkg_id, - &pkg_version, - &pkg_volumes, - Some(&old_config), - None, - ProcedureName::AutoConfig(dependency_id.clone()), - ) - .await? - .map_err(|e| Error::new(eyre!("{}", e.1), crate::ErrorKind::AutoConfigure))?; + // let new_config = dependency + // .as_config() + // .de()? + // .ok_or_else(|| not_found!("Config"))? + // .auto_configure + // .sandboxed( + // &ctx, + // &pkg_id, + // &pkg_version, + // &pkg_volumes, + // Some(&old_config), + // None, + // ProcedureName::AutoConfig(dependency_id.clone()), + // ) + // .await? + // .map_err(|e| Error::new(eyre!("{}", e.1), crate::ErrorKind::AutoConfigure))?; - Ok(ConfigDryRes { - old_config, - new_config, - spec, - }) + // Ok(ConfigDryRes { + // old_config, + // new_config, + // spec, + // }) + todo!() } #[instrument(skip_all)] @@ -324,36 +299,7 @@ pub async fn compute_dependency_config_errs( .or_not_found(dependency)? .config { - if let Err(error) = cfg - .check( - ctx, - &manifest.id, - &manifest.version, - &manifest.volumes, - dependency, - &if let Some(config) = dependency_config.get(dependency) { - config.clone() - } else if let Some(manifest) = db - .as_package_data() - .as_idx(dependency) - .and_then(|pde| pde.as_installed()) - .map(|i| i.as_manifest().de()) - .transpose()? - { - if let Some(config) = &manifest.config { - config - .get(ctx, &manifest.id, &manifest.version, &manifest.volumes) - .await? - .config - .unwrap_or_default() - } else { - Config::default() - } - } else { - Config::default() - }, - ) - .await? + let error = todo!(); { dependency_config_errs.insert(dependency.clone(), error); } diff --git a/core/startos/src/developer/mod.rs b/core/startos/src/developer/mod.rs index 8722a4a11..596957445 100644 --- a/core/startos/src/developer/mod.rs +++ b/core/startos/src/developer/mod.rs @@ -5,16 +5,13 @@ use std::path::Path; use ed25519::pkcs8::EncodePrivateKey; use ed25519::PublicKeyBytes; use ed25519_dalek::{SigningKey, VerifyingKey}; -use rpc_toolkit::command; use tracing::instrument; -use crate::context::SdkContext; -use crate::util::display_none; +use crate::context::CliContext; use crate::{Error, ResultExt}; -#[command(cli_only, blocking, display(display_none))] #[instrument(skip_all)] -pub fn init(#[context] ctx: SdkContext) -> Result<(), Error> { +pub fn init(ctx: CliContext) -> Result<(), Error> { if !ctx.developer_key_path.exists() { let parent = ctx.developer_key_path.parent().unwrap_or(Path::new("/")); if !parent.exists() { @@ -48,8 +45,3 @@ pub fn init(#[context] ctx: SdkContext) -> Result<(), Error> { } Ok(()) } - -#[command(subcommands(crate::s9pk::verify, crate::config::verify_spec))] -pub fn verify() -> Result<(), Error> { - Ok(()) -} diff --git a/core/startos/src/diagnostic.rs b/core/startos/src/diagnostic.rs index aad95a5e5..f9f715bfe 100644 --- a/core/startos/src/diagnostic.rs +++ b/core/startos/src/diagnostic.rs @@ -1,44 +1,70 @@ use std::path::Path; use std::sync::Arc; -use rpc_toolkit::command; +use clap::Parser; use rpc_toolkit::yajrc::RpcError; +use rpc_toolkit::{command, from_fn, from_fn_async, AnyContext, HandlerExt, ParentHandler}; +use serde::{Deserialize, Serialize}; -use crate::context::DiagnosticContext; -use crate::disk::repair; +use crate::context::{CliContext, DiagnosticContext}; use crate::init::SYSTEM_REBUILD_PATH; use crate::logs::{fetch_logs, LogResponse, LogSource}; use crate::shutdown::Shutdown; -use crate::util::display_none; use crate::Error; -#[command(subcommands(error, logs, exit, restart, forget_disk, disk, rebuild))] -pub fn diagnostic() -> Result<(), Error> { - Ok(()) +pub fn diagnostic() -> ParentHandler { + ParentHandler::new() + .subcommand("error", from_fn(error).with_remote_cli::()) + .subcommand("logs", from_fn_async(logs).no_cli()) + .subcommand( + "exit", + from_fn(exit).no_display().with_remote_cli::(), + ) + .subcommand( + "restart", + from_fn(restart) + .no_display() + .with_remote_cli::(), + ) + .subcommand("disk", disk()) + .subcommand( + "rebuild", + from_fn_async(rebuild) + .no_display() + .with_remote_cli::(), + ) } -#[command] -pub fn error(#[context] ctx: DiagnosticContext) -> Result, Error> { +// #[command] +pub fn error(ctx: DiagnosticContext) -> Result, Error> { Ok(ctx.error.clone()) } -#[command(rpc_only)] +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct LogsParams { + limit: Option, + cursor: Option, + before: bool, +} pub async fn logs( - #[arg] limit: Option, - #[arg] cursor: Option, - #[arg] before: bool, + _: AnyContext, + LogsParams { + limit, + cursor, + before, + }: LogsParams, ) -> Result { Ok(fetch_logs(LogSource::System, limit, cursor, before).await?) } -#[command(display(display_none))] -pub fn exit(#[context] ctx: DiagnosticContext) -> Result<(), Error> { +pub fn exit(ctx: DiagnosticContext) -> Result<(), Error> { ctx.shutdown.send(None).expect("receiver dropped"); Ok(()) } -#[command(display(display_none))] -pub fn restart(#[context] ctx: DiagnosticContext) -> Result<(), Error> { +pub fn restart(ctx: DiagnosticContext) -> Result<(), Error> { ctx.shutdown .send(Some(Shutdown { export_args: ctx @@ -50,20 +76,21 @@ pub fn restart(#[context] ctx: DiagnosticContext) -> Result<(), Error> { .expect("receiver dropped"); Ok(()) } - -#[command(display(display_none))] -pub async fn rebuild(#[context] ctx: DiagnosticContext) -> Result<(), Error> { +pub async fn rebuild(ctx: DiagnosticContext) -> Result<(), Error> { tokio::fs::write(SYSTEM_REBUILD_PATH, b"").await?; restart(ctx) } -#[command(subcommands(forget_disk, repair))] -pub fn disk() -> Result<(), Error> { - Ok(()) +pub fn disk() -> ParentHandler { + ParentHandler::new().subcommand( + "forget", + from_fn_async(forget_disk) + .no_display() + .with_remote_cli::(), + ) } -#[command(rename = "forget", display(display_none))] -pub async fn forget_disk() -> Result<(), Error> { +pub async fn forget_disk(_: AnyContext) -> Result<(), Error> { let disk_guid = Path::new("/media/embassy/config/disk.guid"); if tokio::fs::metadata(disk_guid).await.is_ok() { tokio::fs::remove_file(disk_guid).await?; diff --git a/core/startos/src/disk/main.rs b/core/startos/src/disk/main.rs index 74f6db73c..a337a4473 100644 --- a/core/startos/src/disk/main.rs +++ b/core/startos/src/disk/main.rs @@ -7,8 +7,8 @@ use tracing::instrument; use super::fsck::{RepairStrategy, RequiresReboot}; use super::util::pvscan; -use crate::disk::mount::filesystem::block_dev::mount; -use crate::disk::mount::filesystem::ReadWrite; +use crate::disk::mount::filesystem::block_dev::BlockDev; +use crate::disk::mount::filesystem::{FileSystem, ReadWrite}; use crate::disk::mount::util::unmount; use crate::util::Invoke; use crate::{Error, ErrorKind, ResultExt}; @@ -142,7 +142,9 @@ pub async fn create_fs>( .arg(&blockdev_path) .invoke(crate::ErrorKind::DiskManagement) .await?; - mount(&blockdev_path, datadir.as_ref().join(name), ReadWrite).await?; + BlockDev::new(&blockdev_path) + .mount(datadir.as_ref().join(name), ReadWrite) + .await?; Ok(()) } @@ -318,7 +320,9 @@ pub async fn mount_fs>( tokio::fs::rename(&tmp_luks_bak, &luks_bak).await?; } - mount(&blockdev_path, datadir.as_ref().join(name), ReadWrite).await?; + BlockDev::new(&blockdev_path) + .mount(datadir.as_ref().join(name), ReadWrite) + .await?; Ok(reboot) } diff --git a/core/startos/src/disk/mod.rs b/core/startos/src/disk/mod.rs index 485d2570e..7d31d06db 100644 --- a/core/startos/src/disk/mod.rs +++ b/core/startos/src/disk/mod.rs @@ -1,13 +1,11 @@ use std::path::{Path, PathBuf}; -use clap::ArgMatches; -use rpc_toolkit::command; +use rpc_toolkit::{from_fn_async, AnyContext, Empty, HandlerExt, ParentHandler}; use serde::{Deserialize, Serialize}; -use crate::context::RpcContext; +use crate::context::{CliContext, RpcContext}; use crate::disk::util::DiskInfo; -use crate::util::display_none; -use crate::util::serde::{display_serializable, IoFormat}; +use crate::util::serde::{display_serializable, HandlerExtSerde, WithIoFormat}; use crate::Error; pub mod fsck; @@ -42,16 +40,30 @@ impl OsPartitionInfo { } } -#[command(subcommands(list, repair))] -pub fn disk() -> Result<(), Error> { - Ok(()) +pub fn disk() -> ParentHandler { + ParentHandler::new() + .subcommand( + "list", + from_fn_async(list) + .with_display_serializable() + .with_custom_display_fn::(|handle, result| { + Ok(display_disk_info(handle.params, result)) + }) + .with_remote_cli::(), + ) + .subcommand( + "repair", + from_fn_async(repair) + .no_display() + .with_remote_cli::(), + ) } -fn display_disk_info(info: Vec, matches: &ArgMatches) { +fn display_disk_info(params: WithIoFormat, args: Vec) { use prettytable::*; - if matches.is_present("format") { - return display_serializable(info, matches); + if let Some(format) = params.format { + return display_serializable(format, args); } let mut table = Table::new(); @@ -60,9 +72,9 @@ fn display_disk_info(info: Vec, matches: &ArgMatches) { "LABEL", "CAPACITY", "USED", - "EMBASSY OS VERSION" + "STARTOS VERSION" ]); - for disk in info { + for disk in args { let row = row![ disk.logicalname.display(), "N/A", @@ -101,17 +113,11 @@ fn display_disk_info(info: Vec, matches: &ArgMatches) { table.print_tty(false).unwrap(); } -#[command(display(display_disk_info))] -pub async fn list( - #[context] ctx: RpcContext, - #[allow(unused_variables)] - #[arg] - format: Option, -) -> Result, Error> { +// #[command(display(display_disk_info))] +pub async fn list(ctx: RpcContext, _: Empty) -> Result, Error> { crate::disk::util::list(&ctx.os_partitions).await } -#[command(display(display_none))] pub async fn repair() -> Result<(), Error> { tokio::fs::write(REPAIR_DISK_PATH, b"").await?; Ok(()) diff --git a/core/startos/src/disk/mount/backup.rs b/core/startos/src/disk/mount/backup.rs index a19056241..5dbd80db3 100644 --- a/core/startos/src/disk/mount/backup.rs +++ b/core/startos/src/disk/mount/backup.rs @@ -1,24 +1,24 @@ use std::path::{Path, PathBuf}; +use std::sync::Arc; use color_eyre::eyre::eyre; use helpers::AtomicFile; +use models::PackageId; use tokio::io::AsyncWriteExt; use tracing::instrument; use super::filesystem::ecryptfs::EcryptFS; use super::guard::{GenericMountGuard, TmpMountGuard}; -use super::util::{bind, unmount}; use crate::auth::check_password; use crate::backup::target::BackupInfo; use crate::disk::mount::filesystem::ReadWrite; +use crate::disk::mount::guard::SubPath; use crate::disk::util::EmbassyOsRecoveryInfo; -use crate::middleware::encrypt::{decrypt_slice, encrypt_slice}; -use crate::s9pk::manifest::PackageId; +use crate::util::crypto::{decrypt_slice, encrypt_slice}; use crate::util::serde::IoFormat; -use crate::util::FileLock; -use crate::volume::BACKUP_DIR; use crate::{Error, ErrorKind, ResultExt}; +#[derive(Clone, Debug)] pub struct BackupMountGuard { backup_disk_mount_guard: Option, encrypted_guard: Option, @@ -29,7 +29,7 @@ pub struct BackupMountGuard { impl BackupMountGuard { fn backup_disk_path(&self) -> &Path { if let Some(guard) = &self.backup_disk_mount_guard { - guard.as_ref() + guard.path() } else { unreachable!() } @@ -37,7 +37,7 @@ impl BackupMountGuard { #[instrument(skip_all)] pub async fn mount(backup_disk_mount_guard: G, password: &str) -> Result { - let backup_disk_path = backup_disk_mount_guard.as_ref(); + let backup_disk_path = backup_disk_mount_guard.path(); let unencrypted_metadata_path = backup_disk_path.join("EmbassyBackups/unencrypted-metadata.cbor"); let mut unencrypted_metadata: EmbassyOsRecoveryInfo = @@ -108,7 +108,7 @@ impl BackupMountGuard { let encrypted_guard = TmpMountGuard::mount(&EcryptFS::new(&crypt_path, &enc_key), ReadWrite).await?; - let metadata_path = encrypted_guard.as_ref().join("metadata.cbor"); + let metadata_path = encrypted_guard.path().join("metadata.cbor"); let metadata: BackupInfo = if tokio::fs::metadata(&metadata_path).await.is_ok() { IoFormat::Cbor.from_slice(&tokio::fs::read(&metadata_path).await.with_ctx(|_| { ( @@ -146,22 +146,13 @@ impl BackupMountGuard { } #[instrument(skip_all)] - pub async fn mount_package_backup( - &self, - id: &PackageId, - ) -> Result { - let lock = FileLock::new(Path::new(BACKUP_DIR).join(format!("{}.lock", id)), false).await?; - let mountpoint = Path::new(BACKUP_DIR).join(id); - bind(self.as_ref().join(id), &mountpoint, false).await?; - Ok(PackageBackupMountGuard { - mountpoint: Some(mountpoint), - lock: Some(lock), - }) + pub fn package_backup(self: &Arc, id: &PackageId) -> SubPath> { + SubPath::new(self.clone(), id) } #[instrument(skip_all)] pub async fn save(&self) -> Result<(), Error> { - let metadata_path = self.as_ref().join("metadata.cbor"); + let metadata_path = self.path().join("metadata.cbor"); let backup_disk_path = self.backup_disk_path(); let mut file = AtomicFile::new(&metadata_path, None::) .await @@ -180,17 +171,6 @@ impl BackupMountGuard { Ok(()) } - #[instrument(skip_all)] - pub async fn unmount(mut self) -> Result<(), Error> { - if let Some(guard) = self.encrypted_guard.take() { - guard.unmount().await?; - } - if let Some(guard) = self.backup_disk_mount_guard.take() { - guard.unmount().await?; - } - Ok(()) - } - #[instrument(skip_all)] pub async fn save_and_unmount(self) -> Result<(), Error> { self.save().await?; @@ -198,14 +178,24 @@ impl BackupMountGuard { Ok(()) } } -impl AsRef for BackupMountGuard { - fn as_ref(&self) -> &Path { +#[async_trait::async_trait] +impl GenericMountGuard for BackupMountGuard { + fn path(&self) -> &Path { if let Some(guard) = &self.encrypted_guard { - guard.as_ref() + guard.path() } else { unreachable!() } } + async fn unmount(mut self) -> Result<(), Error> { + if let Some(guard) = self.encrypted_guard.take() { + guard.unmount().await?; + } + if let Some(guard) = self.backup_disk_mount_guard.take() { + guard.unmount().await?; + } + Ok(()) + } } impl Drop for BackupMountGuard { fn drop(&mut self) { @@ -221,42 +211,3 @@ impl Drop for BackupMountGuard { }); } } - -pub struct PackageBackupMountGuard { - mountpoint: Option, - lock: Option, -} -impl PackageBackupMountGuard { - pub async fn unmount(mut self) -> Result<(), Error> { - if let Some(mountpoint) = self.mountpoint.take() { - unmount(&mountpoint).await?; - } - if let Some(lock) = self.lock.take() { - lock.unlock().await?; - } - Ok(()) - } -} -impl AsRef for PackageBackupMountGuard { - fn as_ref(&self) -> &Path { - if let Some(mountpoint) = &self.mountpoint { - mountpoint - } else { - unreachable!() - } - } -} -impl Drop for PackageBackupMountGuard { - fn drop(&mut self) { - let mountpoint = self.mountpoint.take(); - let lock = self.lock.take(); - tokio::spawn(async move { - if let Some(mountpoint) = mountpoint { - unmount(&mountpoint).await.unwrap(); - } - if let Some(lock) = lock { - lock.unlock().await.unwrap(); - } - }); - } -} diff --git a/core/startos/src/disk/mount/filesystem/bind.rs b/core/startos/src/disk/mount/filesystem/bind.rs index 8799372e5..196e78a3d 100644 --- a/core/startos/src/disk/mount/filesystem/bind.rs +++ b/core/startos/src/disk/mount/filesystem/bind.rs @@ -1,14 +1,12 @@ use std::os::unix::ffi::OsStrExt; use std::path::Path; -use async_trait::async_trait; use digest::generic_array::GenericArray; use digest::{Digest, OutputSizeUser}; use sha2::Sha256; -use super::{FileSystem, MountType, ReadOnly}; -use crate::disk::mount::util::bind; -use crate::{Error, ResultExt}; +use super::FileSystem; +use crate::prelude::*; pub struct Bind> { src_dir: SrcDir, @@ -18,19 +16,16 @@ impl> Bind { Self { src_dir } } } -#[async_trait] impl + Send + Sync> FileSystem for Bind { - async fn mount + Send + Sync>( - &self, - mountpoint: P, - mount_type: MountType, - ) -> Result<(), Error> { - bind( - self.src_dir.as_ref(), - mountpoint, - matches!(mount_type, ReadOnly), - ) - .await + async fn source(&self) -> Result>, Error> { + Ok(Some(&self.src_dir)) + } + fn extra_args(&self) -> impl IntoIterator> { + ["--bind"] + } + async fn pre_mount(&self) -> Result<(), Error> { + tokio::fs::create_dir_all(self.src_dir.as_ref()).await?; + Ok(()) } async fn source_hash( &self, diff --git a/core/startos/src/disk/mount/filesystem/block_dev.rs b/core/startos/src/disk/mount/filesystem/block_dev.rs index e21f0c42d..ada7b2c8e 100644 --- a/core/startos/src/disk/mount/filesystem/block_dev.rs +++ b/core/startos/src/disk/mount/filesystem/block_dev.rs @@ -1,30 +1,13 @@ use std::os::unix::ffi::OsStrExt; use std::path::Path; -use async_trait::async_trait; use digest::generic_array::GenericArray; use digest::{Digest, OutputSizeUser}; use serde::{Deserialize, Serialize}; use sha2::Sha256; -use super::{FileSystem, MountType, ReadOnly}; -use crate::util::Invoke; -use crate::{Error, ResultExt}; - -pub async fn mount( - logicalname: impl AsRef, - mountpoint: impl AsRef, - mount_type: MountType, -) -> Result<(), Error> { - tokio::fs::create_dir_all(mountpoint.as_ref()).await?; - let mut cmd = tokio::process::Command::new("mount"); - cmd.arg(logicalname.as_ref()).arg(mountpoint.as_ref()); - if mount_type == ReadOnly { - cmd.arg("-o").arg("ro"); - } - cmd.invoke(crate::ErrorKind::Filesystem).await?; - Ok(()) -} +use super::FileSystem; +use crate::prelude::*; #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "kebab-case")] @@ -36,14 +19,9 @@ impl> BlockDev { BlockDev { logicalname } } } -#[async_trait] impl + Send + Sync> FileSystem for BlockDev { - async fn mount + Send + Sync>( - &self, - mountpoint: P, - mount_type: MountType, - ) -> Result<(), Error> { - mount(self.logicalname.as_ref(), mountpoint, mount_type).await + async fn source(&self) -> Result>, Error> { + Ok(Some(&self.logicalname)) } async fn source_hash( &self, diff --git a/core/startos/src/disk/mount/filesystem/cifs.rs b/core/startos/src/disk/mount/filesystem/cifs.rs index 91b477fcf..ada7aa80b 100644 --- a/core/startos/src/disk/mount/filesystem/cifs.rs +++ b/core/startos/src/disk/mount/filesystem/cifs.rs @@ -2,7 +2,6 @@ use std::net::IpAddr; use std::os::unix::ffi::OsStrExt; use std::path::{Path, PathBuf}; -use async_trait::async_trait; use digest::generic_array::GenericArray; use digest::{Digest, OutputSizeUser}; use serde::{Deserialize, Serialize}; @@ -11,7 +10,7 @@ use tokio::process::Command; use tracing::instrument; use super::{FileSystem, MountType, ReadOnly}; -use crate::disk::mount::guard::TmpMountGuard; +use crate::disk::mount::guard::{GenericMountGuard, TmpMountGuard}; use crate::util::Invoke; use crate::Error; @@ -78,9 +77,8 @@ impl Cifs { Ok(()) } } -#[async_trait] impl FileSystem for Cifs { - async fn mount + Send + Sync>( + async fn mount + Send>( &self, mountpoint: P, mount_type: MountType, diff --git a/core/startos/src/disk/mount/filesystem/ecryptfs.rs b/core/startos/src/disk/mount/filesystem/ecryptfs.rs index 78570f49b..bf2dfe6c6 100644 --- a/core/startos/src/disk/mount/filesystem/ecryptfs.rs +++ b/core/startos/src/disk/mount/filesystem/ecryptfs.rs @@ -1,33 +1,17 @@ +use std::fmt::Display; use std::os::unix::ffi::OsStrExt; use std::path::Path; -use async_trait::async_trait; use digest::generic_array::GenericArray; use digest::{Digest, OutputSizeUser}; +use lazy_format::lazy_format; use sha2::Sha256; +use tokio::process::Command; -use super::{FileSystem, MountType}; +use super::FileSystem; +use crate::disk::mount::filesystem::default_mount_command; +use crate::prelude::*; use crate::util::Invoke; -use crate::{Error, ResultExt}; - -pub async fn mount_ecryptfs, P1: AsRef>( - src: P0, - dst: P1, - key: &str, -) -> Result<(), Error> { - tokio::fs::create_dir_all(dst.as_ref()).await?; - tokio::process::Command::new("mount") - .arg("-t") - .arg("ecryptfs") - .arg(src.as_ref()) - .arg(dst.as_ref()) - .arg("-o") - // for more information `man ecryptfs` - .arg(format!("key=passphrase:passphrase_passwd={},ecryptfs_cipher=aes,ecryptfs_key_bytes=32,ecryptfs_passthrough=n,ecryptfs_enable_filename_crypto=y,no_sig_cache", key)) - .input(Some(&mut std::io::Cursor::new(b"\n"))) - .invoke(crate::ErrorKind::Filesystem).await?; - Ok(()) -} pub struct EcryptFS, Key: AsRef> { encrypted_dir: EncryptedDir, @@ -38,16 +22,45 @@ impl, Key: AsRef> EcryptFS { EcryptFS { encrypted_dir, key } } } -#[async_trait] impl + Send + Sync, Key: AsRef + Send + Sync> FileSystem for EcryptFS { - async fn mount + Send + Sync>( + fn mount_type(&self) -> Option> { + Some("ecryptfs") + } + async fn source(&self) -> Result>, Error> { + Ok(Some(&self.encrypted_dir)) + } + fn mount_options(&self) -> impl IntoIterator { + [ + Box::new(lazy_format!( + "key=passphrase:passphrase_passwd={}", + self.key.as_ref() + )) as Box, + Box::new("ecryptfs_cipher=aes"), + Box::new("ecryptfs_key_bytes=32"), + Box::new("ecryptfs_passthrough=n"), + Box::new("ecryptfs_enable_filename_crypto=y"), + Box::new("no_sig_cache"), + ] + } + async fn mount + Send>( &self, mountpoint: P, - _mount_type: MountType, // ignored - inherited from parent fs + mount_type: super::MountType, ) -> Result<(), Error> { - mount_ecryptfs(self.encrypted_dir.as_ref(), mountpoint, self.key.as_ref()).await + self.pre_mount().await?; + tokio::fs::create_dir_all(mountpoint.as_ref()).await?; + Command::new("mount") + .args( + default_mount_command(self, mountpoint, mount_type) + .await? + .get_args(), + ) + .input(Some(&mut std::io::Cursor::new(b"\n"))) + .invoke(crate::ErrorKind::Filesystem) + .await?; + Ok(()) } async fn source_hash( &self, diff --git a/core/startos/src/disk/mount/filesystem/efivarfs.rs b/core/startos/src/disk/mount/filesystem/efivarfs.rs index ad9d79941..4961b4716 100644 --- a/core/startos/src/disk/mount/filesystem/efivarfs.rs +++ b/core/startos/src/disk/mount/filesystem/efivarfs.rs @@ -1,33 +1,19 @@ use std::path::Path; -use async_trait::async_trait; use digest::generic_array::GenericArray; use digest::{Digest, OutputSizeUser}; use sha2::Sha256; -use super::{FileSystem, MountType, ReadOnly}; -use crate::util::Invoke; -use crate::Error; +use super::FileSystem; +use crate::prelude::*; pub struct EfiVarFs; -#[async_trait] impl FileSystem for EfiVarFs { - async fn mount + Send + Sync>( - &self, - mountpoint: P, - mount_type: MountType, - ) -> Result<(), Error> { - tokio::fs::create_dir_all(mountpoint.as_ref()).await?; - let mut cmd = tokio::process::Command::new("mount"); - cmd.arg("-t") - .arg("efivarfs") - .arg("efivarfs") - .arg(mountpoint.as_ref()); - if mount_type == ReadOnly { - cmd.arg("-o").arg("ro"); - } - cmd.invoke(crate::ErrorKind::Filesystem).await?; - Ok(()) + fn mount_type(&self) -> Option> { + Some("efivarfs") + } + async fn source(&self) -> Result>, Error> { + Ok(Some("efivarfs")) } async fn source_hash( &self, diff --git a/core/startos/src/disk/mount/filesystem/httpdirfs.rs b/core/startos/src/disk/mount/filesystem/httpdirfs.rs index fda437ec3..8c7d3b058 100644 --- a/core/startos/src/disk/mount/filesystem/httpdirfs.rs +++ b/core/startos/src/disk/mount/filesystem/httpdirfs.rs @@ -1,6 +1,5 @@ use std::path::Path; -use async_trait::async_trait; use digest::generic_array::GenericArray; use digest::{Digest, OutputSizeUser}; use reqwest::Url; @@ -32,9 +31,8 @@ impl HttpDirFS { HttpDirFS { url } } } -#[async_trait] impl FileSystem for HttpDirFS { - async fn mount + Send + Sync>( + async fn mount + Send>( &self, mountpoint: P, _mount_type: MountType, diff --git a/core/startos/src/disk/mount/filesystem/idmapped.rs b/core/startos/src/disk/mount/filesystem/idmapped.rs new file mode 100644 index 000000000..0f4074a8e --- /dev/null +++ b/core/startos/src/disk/mount/filesystem/idmapped.rs @@ -0,0 +1,88 @@ +use std::ffi::OsStr; +use std::fmt::Display; +use std::path::Path; + +use digest::generic_array::GenericArray; +use digest::{Digest, OutputSizeUser}; +use serde::{Deserialize, Serialize}; +use sha2::Sha256; +use tokio::process::Command; + +use super::{FileSystem, MountType}; +use crate::disk::mount::filesystem::default_mount_command; +use crate::prelude::*; +use crate::util::Invoke; + +#[derive(Debug, Deserialize, Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct IdMapped { + filesystem: Fs, + from_id: u32, + to_id: u32, + range: u32, +} +impl IdMapped { + pub fn new(filesystem: Fs, from_id: u32, to_id: u32, range: u32) -> Self { + Self { + filesystem, + from_id, + to_id, + range, + } + } +} +impl FileSystem for IdMapped { + fn mount_type(&self) -> Option> { + self.filesystem.mount_type() + } + fn extra_args(&self) -> impl IntoIterator> { + self.filesystem.extra_args() + } + fn mount_options(&self) -> impl IntoIterator { + self.filesystem + .mount_options() + .into_iter() + .map(|a| Box::new(a) as Box) + .chain(std::iter::once(Box::new(lazy_format!( + "X-mount.idmap=b:{}:{}:{}", + self.from_id, + self.to_id, + self.range, + )) as Box)) + } + async fn source(&self) -> Result>, Error> { + self.filesystem.source().await + } + async fn pre_mount(&self) -> Result<(), Error> { + self.filesystem.pre_mount().await + } + async fn mount + Send>( + &self, + mountpoint: P, + mount_type: MountType, + ) -> Result<(), Error> { + self.pre_mount().await?; + tokio::fs::create_dir_all(mountpoint.as_ref()).await?; + Command::new("mount.next") + .args( + default_mount_command(self, mountpoint, mount_type) + .await? + .get_args(), + ) + .invoke(ErrorKind::Filesystem) + .await?; + + Ok(()) + } + async fn source_hash( + &self, + ) -> Result::OutputSize>, Error> { + let mut sha = Sha256::new(); + sha.update("IdMapped"); + sha.update(self.filesystem.source_hash().await?); + sha.update(u32::to_be_bytes(self.from_id)); + sha.update(u32::to_be_bytes(self.to_id)); + sha.update(u32::to_be_bytes(self.range)); + Ok(sha.finalize()) + } +} diff --git a/core/startos/src/disk/mount/filesystem/label.rs b/core/startos/src/disk/mount/filesystem/label.rs index b1e4f7213..57312bf13 100644 --- a/core/startos/src/disk/mount/filesystem/label.rs +++ b/core/startos/src/disk/mount/filesystem/label.rs @@ -1,28 +1,11 @@ use std::path::Path; -use async_trait::async_trait; use digest::generic_array::GenericArray; use digest::{Digest, OutputSizeUser}; use sha2::Sha256; -use super::{FileSystem, MountType, ReadOnly}; -use crate::util::Invoke; -use crate::Error; - -pub async fn mount_label( - label: &str, - mountpoint: impl AsRef, - mount_type: MountType, -) -> Result<(), Error> { - tokio::fs::create_dir_all(mountpoint.as_ref()).await?; - let mut cmd = tokio::process::Command::new("mount"); - cmd.arg("-L").arg(label).arg(mountpoint.as_ref()); - if mount_type == ReadOnly { - cmd.arg("-o").arg("ro"); - } - cmd.invoke(crate::ErrorKind::Filesystem).await?; - Ok(()) -} +use super::FileSystem; +use crate::prelude::*; pub struct Label> { label: S, @@ -32,14 +15,12 @@ impl> Label { Label { label } } } -#[async_trait] impl + Send + Sync> FileSystem for Label { - async fn mount + Send + Sync>( - &self, - mountpoint: P, - mount_type: MountType, - ) -> Result<(), Error> { - mount_label(self.label.as_ref(), mountpoint, mount_type).await + fn extra_args(&self) -> impl IntoIterator> { + ["-L", self.label.as_ref()] + } + async fn source(&self) -> Result>, Error> { + Ok(None::<&Path>) } async fn source_hash( &self, diff --git a/core/startos/src/disk/mount/filesystem/loop_dev.rs b/core/startos/src/disk/mount/filesystem/loop_dev.rs index 28a18597d..7cad174c6 100644 --- a/core/startos/src/disk/mount/filesystem/loop_dev.rs +++ b/core/startos/src/disk/mount/filesystem/loop_dev.rs @@ -1,38 +1,15 @@ +use std::fmt::Display; use std::os::unix::ffi::OsStrExt; use std::path::Path; -use async_trait::async_trait; use digest::generic_array::GenericArray; use digest::{Digest, OutputSizeUser}; +use lazy_format::lazy_format; use serde::{Deserialize, Serialize}; use sha2::Sha256; -use super::{FileSystem, MountType, ReadOnly}; -use crate::util::Invoke; -use crate::{Error, ResultExt}; - -pub async fn mount( - logicalname: impl AsRef, - offset: u64, - size: u64, - mountpoint: impl AsRef, - mount_type: MountType, -) -> Result<(), Error> { - tokio::fs::create_dir_all(mountpoint.as_ref()).await?; - let mut opts = format!("loop,offset={offset},sizelimit={size}"); - if mount_type == ReadOnly { - opts += ",ro"; - } - - tokio::process::Command::new("mount") - .arg(logicalname.as_ref()) - .arg(mountpoint.as_ref()) - .arg("-o") - .arg(opts) - .invoke(crate::ErrorKind::Filesystem) - .await?; - Ok(()) -} +use super::FileSystem; +use crate::prelude::*; #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "kebab-case")] @@ -50,21 +27,18 @@ impl> LoopDev { } } } -#[async_trait] impl + Send + Sync> FileSystem for LoopDev { - async fn mount + Send + Sync>( - &self, - mountpoint: P, - mount_type: MountType, - ) -> Result<(), Error> { - mount( - self.logicalname.as_ref(), - self.offset, - self.size, - mountpoint, - mount_type, - ) - .await + async fn source(&self) -> Result>, Error> { + Ok(Some( + tokio::fs::canonicalize(self.logicalname.as_ref()).await?, + )) + } + fn mount_options(&self) -> impl IntoIterator { + [ + Box::new("loop") as Box, + Box::new(lazy_format!("offset={}", self.offset)), + Box::new(lazy_format!("sizelimit={}", self.size)), + ] } async fn source_hash( &self, diff --git a/core/startos/src/disk/mount/filesystem/mod.rs b/core/startos/src/disk/mount/filesystem/mod.rs index 11a6671df..89fa0a415 100644 --- a/core/startos/src/disk/mount/filesystem/mod.rs +++ b/core/startos/src/disk/mount/filesystem/mod.rs @@ -1,11 +1,15 @@ +use std::ffi::OsStr; +use std::fmt::{Display, Write}; use std::path::Path; -use async_trait::async_trait; use digest::generic_array::GenericArray; use digest::OutputSizeUser; +use futures::Future; use sha2::Sha256; +use tokio::process::Command; -use crate::Error; +use crate::prelude::*; +use crate::util::Invoke; pub mod bind; pub mod block_dev; @@ -13,8 +17,10 @@ pub mod cifs; pub mod ecryptfs; pub mod efivarfs; pub mod httpdirfs; +pub mod idmapped; pub mod label; pub mod loop_dev; +pub mod overlayfs; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum MountType { @@ -24,14 +30,78 @@ pub enum MountType { pub use MountType::*; -#[async_trait] -pub trait FileSystem { - async fn mount + Send + Sync>( +pub(self) async fn default_mount_command( + fs: &(impl FileSystem + ?Sized), + mountpoint: impl AsRef + Send, + mount_type: MountType, +) -> Result { + let mut cmd = std::process::Command::new("mount"); + if mount_type == ReadOnly { + cmd.arg("-r"); + } + cmd.args(fs.extra_args()); + if let Some(ty) = fs.mount_type() { + cmd.arg("-t").arg(ty.as_ref()); + } + if let Some(options) = fs + .mount_options() + .into_iter() + .fold(None, |acc: Option, x| match acc { + Some(mut s) => { + write!(s, ",{}", x).unwrap(); + Some(s) + } + None => Some(x.to_string()), + }) + { + cmd.arg("-o").arg(options); + } + if let Some(source) = fs.source().await? { + cmd.arg(source.as_ref()); + } + cmd.arg(mountpoint.as_ref()); + Ok(dbg!(cmd)) +} + +pub(self) async fn default_mount_impl( + fs: &(impl FileSystem + ?Sized), + mountpoint: impl AsRef + Send, + mount_type: MountType, +) -> Result<(), Error> { + fs.pre_mount().await?; + tokio::fs::create_dir_all(mountpoint.as_ref()).await?; + Command::from(default_mount_command(fs, mountpoint, mount_type).await?) + .invoke(ErrorKind::Filesystem) + .await?; + + Ok(()) +} + +pub trait FileSystem: Send + Sync { + fn mount_type(&self) -> Option> { + None::<&str> + } + fn extra_args(&self) -> impl IntoIterator> { + [] as [&str; 0] + } + fn mount_options(&self) -> impl IntoIterator { + [] as [&str; 0] + } + fn source(&self) -> impl Future>, Error>> + Send { + async { Ok(None::<&Path>) } + } + fn pre_mount(&self) -> impl Future> + Send { + async { Ok(()) } + } + fn mount + Send>( &self, mountpoint: P, mount_type: MountType, - ) -> Result<(), Error>; - async fn source_hash( + ) -> impl Future> + Send { + default_mount_impl(self, mountpoint, mount_type) + } + fn source_hash( &self, - ) -> Result::OutputSize>, Error>; + ) -> impl Future::OutputSize>, Error>> + + Send; } diff --git a/core/startos/src/disk/mount/filesystem/overlayfs.rs b/core/startos/src/disk/mount/filesystem/overlayfs.rs new file mode 100644 index 000000000..ad5eec501 --- /dev/null +++ b/core/startos/src/disk/mount/filesystem/overlayfs.rs @@ -0,0 +1,153 @@ +use std::fmt::Display; +use std::os::unix::ffi::OsStrExt; +use std::path::Path; + +use digest::generic_array::GenericArray; +use digest::{Digest, OutputSizeUser}; +use sha2::Sha256; + +use crate::disk::mount::filesystem::{FileSystem, ReadOnly, ReadWrite}; +use crate::disk::mount::guard::{GenericMountGuard, MountGuard, TmpMountGuard}; +use crate::prelude::*; +use crate::util::io::TmpDir; + +struct OverlayFs, P1: AsRef> { + lower: P0, + upper: P1, +} +impl, P1: AsRef> OverlayFs { + pub fn new(lower: P0, upper: P1) -> Self { + Self { lower, upper } + } +} +impl + Send + Sync, P1: AsRef + Send + Sync> FileSystem + for OverlayFs +{ + fn mount_type(&self) -> Option> { + Some("overlay") + } + async fn source(&self) -> Result>, Error> { + Ok(Some("overlay")) + } + fn mount_options(&self) -> impl IntoIterator { + [ + Box::new(lazy_format!("lowerdir={}", self.lower.as_ref().display())) + as Box, + Box::new(lazy_format!( + "upperdir={}/upper", + self.upper.as_ref().display() + )), + Box::new(lazy_format!( + "workdir={}/work", + self.upper.as_ref().display() + )), + ] + } + async fn pre_mount(&self) -> Result<(), Error> { + tokio::fs::create_dir_all(self.upper.as_ref().join("upper")).await?; + tokio::fs::create_dir_all(self.upper.as_ref().join("work")).await?; + Ok(()) + } + async fn source_hash( + &self, + ) -> Result::OutputSize>, Error> { + let mut sha = Sha256::new(); + sha.update("OverlayFs"); + sha.update( + tokio::fs::canonicalize(self.lower.as_ref()) + .await + .with_ctx(|_| { + ( + crate::ErrorKind::Filesystem, + self.lower.as_ref().display().to_string(), + ) + })? + .as_os_str() + .as_bytes(), + ); + sha.update( + tokio::fs::canonicalize(self.upper.as_ref()) + .await + .with_ctx(|_| { + ( + crate::ErrorKind::Filesystem, + self.upper.as_ref().display().to_string(), + ) + })? + .as_os_str() + .as_bytes(), + ); + Ok(sha.finalize()) + } +} + +#[derive(Debug)] +pub struct OverlayGuard { + lower: Option, + upper: Option, + inner_guard: MountGuard, +} +impl OverlayGuard { + pub async fn mount( + base: &impl FileSystem, + mountpoint: impl AsRef, + ) -> Result { + let lower = TmpMountGuard::mount(base, ReadOnly).await?; + let upper = TmpDir::new().await?; + let inner_guard = MountGuard::mount( + &OverlayFs::new(lower.path(), upper.as_ref()), + mountpoint, + ReadWrite, + ) + .await?; + Ok(Self { + lower: Some(lower), + upper: Some(upper), + inner_guard, + }) + } + pub async fn unmount(mut self, delete_mountpoint: bool) -> Result<(), Error> { + self.inner_guard.take().unmount(delete_mountpoint).await?; + if let Some(lower) = self.lower.take() { + lower.unmount().await?; + } + if let Some(upper) = self.upper.take() { + upper.delete().await?; + } + Ok(()) + } + pub fn take(&mut self) -> Self { + Self { + lower: self.lower.take(), + upper: self.upper.take(), + inner_guard: self.inner_guard.take(), + } + } +} +#[async_trait::async_trait] +impl GenericMountGuard for OverlayGuard { + fn path(&self) -> &Path { + self.inner_guard.path() + } + async fn unmount(mut self) -> Result<(), Error> { + self.unmount(false).await + } +} +impl Drop for OverlayGuard { + fn drop(&mut self) { + let lower = self.lower.take(); + let upper = self.upper.take(); + let guard = self.inner_guard.take(); + if lower.is_some() || upper.is_some() || guard.mounted { + tokio::spawn(async move { + guard.unmount(false).await.unwrap(); + if let Some(lower) = lower { + lower.unmount().await.unwrap(); + } + if let Some(upper) = upper { + upper.delete().await.unwrap(); + } + }); + } + } +} diff --git a/core/startos/src/disk/mount/guard.rs b/core/startos/src/disk/mount/guard.rs index 617afeb08..af46904fd 100644 --- a/core/startos/src/disk/mount/guard.rs +++ b/core/startos/src/disk/mount/guard.rs @@ -9,20 +9,47 @@ use tracing::instrument; use super::filesystem::{FileSystem, MountType, ReadOnly, ReadWrite}; use super::util::unmount; -use crate::util::Invoke; +use crate::util::{Invoke, Never}; use crate::Error; pub const TMP_MOUNTPOINT: &'static str = "/media/embassy/tmp"; #[async_trait::async_trait] -pub trait GenericMountGuard: AsRef + std::fmt::Debug + Send + Sync + 'static { +pub trait GenericMountGuard: std::fmt::Debug + Send + Sync + 'static { + fn path(&self) -> &Path; async fn unmount(mut self) -> Result<(), Error>; } +#[async_trait::async_trait] +impl GenericMountGuard for Never { + fn path(&self) -> &Path { + match *self {} + } + async fn unmount(mut self) -> Result<(), Error> { + match self {} + } +} + +#[async_trait::async_trait] +impl GenericMountGuard for Arc +where + T: GenericMountGuard, +{ + fn path(&self) -> &Path { + (&**self).path() + } + async fn unmount(mut self) -> Result<(), Error> { + if let Ok(guard) = Arc::try_unwrap(self) { + guard.unmount().await?; + } + Ok(()) + } +} + #[derive(Debug)] pub struct MountGuard { mountpoint: PathBuf, - mounted: bool, + pub(super) mounted: bool, } impl MountGuard { pub async fn mount( @@ -37,6 +64,16 @@ impl MountGuard { mounted: true, }) } + fn as_unmounted(&self) -> Self { + Self { + mountpoint: self.mountpoint.clone(), + mounted: false, + } + } + pub fn take(&mut self) -> Self { + let unmounted = self.as_unmounted(); + std::mem::replace(self, unmounted) + } pub async fn unmount(mut self, delete_mountpoint: bool) -> Result<(), Error> { if self.mounted { unmount(&self.mountpoint).await?; @@ -57,11 +94,6 @@ impl MountGuard { Ok(()) } } -impl AsRef for MountGuard { - fn as_ref(&self) -> &Path { - &self.mountpoint - } -} impl Drop for MountGuard { fn drop(&mut self) { if self.mounted { @@ -72,6 +104,9 @@ impl Drop for MountGuard { } #[async_trait::async_trait] impl GenericMountGuard for MountGuard { + fn path(&self) -> &Path { + &self.mountpoint + } async fn unmount(mut self) -> Result<(), Error> { MountGuard::unmount(self, false).await } @@ -89,7 +124,7 @@ lazy_static! { Mutex::new(BTreeMap::new()); } -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct TmpMountGuard { guard: Arc, } @@ -122,21 +157,42 @@ impl TmpMountGuard { Ok(TmpMountGuard { guard }) } } - pub async fn unmount(self) -> Result<(), Error> { - if let Ok(guard) = Arc::try_unwrap(self.guard) { - guard.unmount(true).await?; - } - Ok(()) + + pub fn take(&mut self) -> Self { + let unmounted = Self { + guard: Arc::new(self.guard.as_unmounted()), + }; + std::mem::replace(self, unmounted) + } +} +#[async_trait::async_trait] +impl GenericMountGuard for TmpMountGuard { + fn path(&self) -> &Path { + self.guard.path() + } + async fn unmount(mut self) -> Result<(), Error> { + self.guard.unmount().await } } -impl AsRef for TmpMountGuard { - fn as_ref(&self) -> &Path { - (&*self.guard).as_ref() + +#[derive(Debug)] +pub struct SubPath { + guard: G, + path: PathBuf, +} +impl SubPath { + pub fn new(guard: G, path: impl AsRef) -> Self { + let path = path.as_ref(); + let path = guard.path().join(path.strip_prefix("/").unwrap_or(path)); + Self { guard, path } } } #[async_trait::async_trait] -impl GenericMountGuard for TmpMountGuard { +impl GenericMountGuard for SubPath { + fn path(&self) -> &Path { + self.path.as_path() + } async fn unmount(mut self) -> Result<(), Error> { - TmpMountGuard::unmount(self).await + self.guard.unmount().await } } diff --git a/core/startos/src/disk/mount/util.rs b/core/startos/src/disk/mount/util.rs index 392e5d67a..e93ceb7dd 100644 --- a/core/startos/src/disk/mount/util.rs +++ b/core/startos/src/disk/mount/util.rs @@ -44,7 +44,7 @@ pub async fn bind, P1: AsRef>( pub async fn unmount>(mountpoint: P) -> Result<(), Error> { tracing::debug!("Unmounting {}.", mountpoint.as_ref().display()); tokio::process::Command::new("umount") - .arg("-l") + .arg("-Rl") .arg(mountpoint.as_ref()) .invoke(crate::ErrorKind::Filesystem) .await?; diff --git a/core/startos/src/disk/util.rs b/core/startos/src/disk/util.rs index 7051026cd..7d73ac974 100644 --- a/core/startos/src/disk/util.rs +++ b/core/startos/src/disk/util.rs @@ -17,6 +17,7 @@ use tracing::instrument; use super::mount::filesystem::block_dev::BlockDev; use super::mount::filesystem::ReadOnly; use super::mount::guard::TmpMountGuard; +use crate::disk::mount::guard::GenericMountGuard; use crate::disk::OsPartitionInfo; use crate::util::serde::IoFormat; use crate::util::{Invoke, Version}; @@ -403,13 +404,13 @@ async fn part_info(part: PathBuf) -> PartitionInfo { match TmpMountGuard::mount(&BlockDev::new(&part), ReadOnly).await { Err(e) => tracing::warn!("Could not collect usage information: {}", e.source), Ok(mount_guard) => { - used = get_used(&mount_guard) + used = get_used(mount_guard.path()) .await .map_err(|e| { tracing::warn!("Could not get usage of {}: {}", part.display(), e.source) }) .ok(); - if let Some(recovery_info) = match recovery_info(&mount_guard).await { + if let Some(recovery_info) = match recovery_info(mount_guard.path()).await { Ok(a) => a, Err(e) => { tracing::error!("Error fetching unencrypted backup metadata: {}", e); diff --git a/core/startos/src/error.rs b/core/startos/src/error.rs index 2b769b03a..9f0493f10 100644 --- a/core/startos/src/error.rs +++ b/core/startos/src/error.rs @@ -1,4 +1,3 @@ -use color_eyre::eyre::eyre; pub use models::{Error, ErrorKind, OptionExt, ResultExt}; #[derive(Debug, Default)] @@ -18,11 +17,15 @@ impl ErrorCollection { } } - pub fn into_result(self) -> Result<(), Error> { - if self.0.is_empty() { - Ok(()) + pub fn into_result(mut self) -> Result<(), Error> { + if self.0.len() <= 1 { + if let Some(err) = self.0.pop() { + Err(err) + } else { + Ok(()) + } } else { - Err(Error::new(eyre!("{}", self), ErrorKind::MultipleErrors)) + Err(Error::new(self, ErrorKind::MultipleErrors)) } } } @@ -49,6 +52,7 @@ impl std::fmt::Display for ErrorCollection { Ok(()) } } +impl std::error::Error for ErrorCollection {} #[macro_export] macro_rules! ensure_code { diff --git a/core/startos/src/firmware.rs b/core/startos/src/firmware.rs index 7f9a4a273..ed4a6577a 100644 --- a/core/startos/src/firmware.rs +++ b/core/startos/src/firmware.rs @@ -2,8 +2,7 @@ use std::collections::BTreeSet; use std::path::Path; use async_compression::tokio::bufread::GzipDecoder; -use clap::ArgMatches; -use rpc_toolkit::command; +use clap::Parser; use serde::{Deserialize, Serialize}; use tokio::fs::File; use tokio::io::BufReader; @@ -43,8 +42,8 @@ pub struct Firmware { shasum: String, } -fn display_firmware_update_result(arg: RequiresReboot, _: &ArgMatches) { - if arg.0 { +pub fn display_firmware_update_result(result: RequiresReboot) { + if result.0 { println!("Firmware successfully updated! Reboot to apply changes."); } else { println!("No firmware update available."); @@ -55,7 +54,7 @@ fn display_firmware_update_result(arg: RequiresReboot, _: &ArgMatches) { /// that the firmware was the correct and updated for /// systems like the Pure System that a new firmware /// was released and the updates where pushed through the pure os. -#[command(rename = "update-firmware", display(display_firmware_update_result))] +// #[command(rename = "update-firmware", display(display_firmware_update_result))] pub async fn update_firmware() -> Result { let system_product_name = String::from_utf8( Command::new("dmidecode") diff --git a/core/startos/src/init.rs b/core/startos/src/init.rs index 74c3767e3..dfc13e068 100644 --- a/core/startos/src/init.rs +++ b/core/startos/src/init.rs @@ -4,7 +4,6 @@ use std::path::Path; use std::time::{Duration, SystemTime}; use color_eyre::eyre::eyre; - use models::ResultExt; use rand::random; use sqlx::{Pool, Postgres}; @@ -12,17 +11,12 @@ use tokio::process::Command; use tracing::instrument; use crate::account::AccountInfo; -use crate::context::rpc::RpcContextConfig; +use crate::context::config::ServerConfig; use crate::db::model::ServerStatus; use crate::disk::mount::util::unmount; -use crate::install::PKG_ARCHIVE_DIR; use crate::middleware::auth::LOCAL_AUTH_COOKIE_PATH; use crate::prelude::*; - -use crate::util::cpupower::{ - get_available_governors, get_preferred_governor, set_governor, -}; -use crate::util::docker::{create_bridge_network, CONTAINER_DATADIR, CONTAINER_TOOL}; +use crate::util::cpupower::{get_available_governors, get_preferred_governor, set_governor}; use crate::util::Invoke; use crate::{Error, ARCH}; @@ -190,7 +184,7 @@ pub struct InitResult { } #[instrument(skip_all)] -pub async fn init(cfg: &RpcContextConfig) -> Result { +pub async fn init(cfg: &ServerConfig) -> Result { tokio::fs::create_dir_all("/run/embassy") .await .with_ctx(|_| (crate::ErrorKind::Filesystem, "mkdir -p /run/embassy"))?; @@ -292,77 +286,6 @@ pub async fn init(cfg: &RpcContextConfig) -> Result { tokio::fs::remove_dir_all(&tmp_var).await?; } crate::disk::mount::util::bind(&tmp_var, "/var/tmp", false).await?; - let tmp_docker = cfg - .datadir() - .join(format!("package-data/tmp/{CONTAINER_TOOL}")); - let tmp_docker_exists = tokio::fs::metadata(&tmp_docker).await.is_ok(); - if CONTAINER_TOOL == "docker" { - Command::new("systemctl") - .arg("stop") - .arg("docker") - .invoke(crate::ErrorKind::Docker) - .await?; - } - crate::disk::mount::util::bind(&tmp_docker, CONTAINER_DATADIR, false).await?; - - if CONTAINER_TOOL == "docker" { - Command::new("systemctl") - .arg("reset-failed") - .arg("docker") - .invoke(crate::ErrorKind::Docker) - .await?; - Command::new("systemctl") - .arg("start") - .arg("docker") - .invoke(crate::ErrorKind::Docker) - .await?; - } - tracing::info!("Mounted Docker Data"); - - if should_rebuild || !tmp_docker_exists { - if CONTAINER_TOOL == "docker" { - tracing::info!("Creating Docker Network"); - create_bridge_network("start9", "172.18.0.1/24", "br-start9").await?; - tracing::info!("Created Docker Network"); - } - - let datadir = cfg.datadir(); - tracing::info!("Loading System Docker Images"); - crate::install::rebuild_from("/usr/lib/startos/system-images", &datadir).await?; - tracing::info!("Loaded System Docker Images"); - - tracing::info!("Loading Package Docker Images"); - crate::install::rebuild_from(datadir.join(PKG_ARCHIVE_DIR), &datadir).await?; - tracing::info!("Loaded Package Docker Images"); - } - - if CONTAINER_TOOL == "podman" { - crate::util::docker::remove_container("netdummy", true).await?; - Command::new("podman") - .arg("run") - .arg("-d") - .arg("--rm") - .arg("--init") - .arg("--network=start9") - .arg("--name=netdummy") - .arg("start9/x_system/utils:latest") - .arg("sleep") - .arg("infinity") - .invoke(crate::ErrorKind::Docker) - .await?; - } - - tracing::info!("Enabling Docker QEMU Emulation"); - Command::new(CONTAINER_TOOL) - .arg("run") - .arg("--privileged") - .arg("--rm") - .arg("start9/x_system/binfmt") - .arg("--install") - .arg("all") - .invoke(crate::ErrorKind::Docker) - .await?; - tracing::info!("Enabled Docker QEMU Emulation"); let governor = if let Some(governor) = &server_info.governor { if get_available_governors().await?.contains(governor) { diff --git a/core/startos/src/inspect.rs b/core/startos/src/inspect.rs index cd27bbb2d..d88f90a06 100644 --- a/core/startos/src/inspect.rs +++ b/core/startos/src/inspect.rs @@ -1,20 +1,36 @@ use std::path::PathBuf; -use rpc_toolkit::command; +use clap::Parser; +use rpc_toolkit::{command, from_fn_async, AnyContext, HandlerExt, ParentHandler}; +use serde::{Deserialize, Serialize}; +use crate::context::CliContext; use crate::s9pk::manifest::Manifest; -use crate::s9pk::reader::S9pkReader; -use crate::util::display_none; -use crate::util::serde::{display_serializable, IoFormat}; +// use crate::s9pk::reader::S9pkReader; +use crate::util::serde::HandlerExtSerde; use crate::Error; -#[command(subcommands(hash, manifest, license, icon, instructions, docker_images))] -pub fn inspect() -> Result<(), Error> { - Ok(()) +pub fn inspect() -> ParentHandler { + ParentHandler::new() + .subcommand("hash", from_fn_async(hash)) + .subcommand( + "manifest", + from_fn_async(manifest).with_display_serializable(), + ) + .subcommand("license", from_fn_async(license).no_display()) + .subcommand("icon", from_fn_async(icon).no_display()) + .subcommand("instructions", from_fn_async(instructions).no_display()) + .subcommand("docker-images", from_fn_async(docker_images).no_display()) +} + +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct HashParams { + path: PathBuf, } -#[command(cli_only)] -pub async fn hash(#[arg] path: PathBuf) -> Result { +pub async fn hash(_: CliContext, HashParams { path }: HashParams) -> Result { Ok(S9pkReader::open(path, true) .await? .hash_str() @@ -22,21 +38,36 @@ pub async fn hash(#[arg] path: PathBuf) -> Result { .to_owned()) } -#[command(cli_only, display(display_serializable))] +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct ManifestParams { + path: PathBuf, + #[arg(name = "no-verify", long = "no-verify")] + no_verify: bool, +} + +// #[command(cli_only, display(display_serializable))] pub async fn manifest( - #[arg] path: PathBuf, - #[arg(rename = "no-verify", long = "no-verify")] no_verify: bool, - #[allow(unused_variables)] - #[arg(long = "format")] - format: Option, + _: CliContext, + ManifestParams { .. }: ManifestParams, ) -> Result { - S9pkReader::open(path, !no_verify).await?.manifest().await + // S9pkReader::open(path, !no_verify).await?.manifest().await + todo!() +} + +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct InspectParams { + path: PathBuf, + #[arg(name = "no-verify", long = "no-verify")] + no_verify: bool, } -#[command(cli_only, display(display_none))] pub async fn license( - #[arg] path: PathBuf, - #[arg(rename = "no-verify", long = "no-verify")] no_verify: bool, + _: AnyContext, + InspectParams { path, no_verify }: InspectParams, ) -> Result<(), Error> { tokio::io::copy( &mut S9pkReader::open(path, !no_verify).await?.license().await?, @@ -46,10 +77,9 @@ pub async fn license( Ok(()) } -#[command(cli_only, display(display_none))] pub async fn icon( - #[arg] path: PathBuf, - #[arg(rename = "no-verify", long = "no-verify")] no_verify: bool, + _: AnyContext, + InspectParams { path, no_verify }: InspectParams, ) -> Result<(), Error> { tokio::io::copy( &mut S9pkReader::open(path, !no_verify).await?.icon().await?, @@ -58,11 +88,18 @@ pub async fn icon( .await?; Ok(()) } +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct InstructionParams { + path: PathBuf, + #[arg(name = "no-verify", long = "no-verify")] + no_verify: bool, +} -#[command(cli_only, display(display_none))] pub async fn instructions( - #[arg] path: PathBuf, - #[arg(rename = "no-verify", long = "no-verify")] no_verify: bool, + _: CliContext, + InstructionParams { path, no_verify }: InstructionParams, ) -> Result<(), Error> { tokio::io::copy( &mut S9pkReader::open(path, !no_verify) @@ -74,11 +111,9 @@ pub async fn instructions( .await?; Ok(()) } - -#[command(cli_only, display(display_none), rename = "docker-images")] pub async fn docker_images( - #[arg] path: PathBuf, - #[arg(rename = "no-verify", long = "no-verify")] no_verify: bool, + _: AnyContext, + InspectParams { path, no_verify }: InspectParams, ) -> Result<(), Error> { tokio::io::copy( &mut S9pkReader::open(path, !no_verify) diff --git a/core/startos/src/install/cleanup.rs b/core/startos/src/install/cleanup.rs deleted file mode 100644 index d90ec502c..000000000 --- a/core/startos/src/install/cleanup.rs +++ /dev/null @@ -1,241 +0,0 @@ -use std::path::PathBuf; -use std::sync::Arc; - -use models::OptionExt; -use sqlx::{Executor, Postgres}; -use tracing::instrument; - -use super::PKG_ARCHIVE_DIR; -use crate::context::RpcContext; -use crate::db::model::{ - CurrentDependencies, Database, PackageDataEntry, PackageDataEntryInstalled, - PackageDataEntryMatchModelRef, -}; -use crate::error::ErrorCollection; -use crate::prelude::*; -use crate::s9pk::manifest::PackageId; -use crate::util::{Apply, Version}; -use crate::volume::{asset_dir, script_dir}; -use crate::Error; - -#[instrument(skip_all)] -pub async fn cleanup(ctx: &RpcContext, id: &PackageId, version: &Version) -> Result<(), Error> { - let mut errors = ErrorCollection::new(); - ctx.managers.remove(&(id.clone(), version.clone())).await; - // docker images start9/$APP_ID/*:$VERSION -q | xargs docker rmi - let images = crate::util::docker::images_for(id, version).await?; - errors.extend( - futures::future::join_all(images.into_iter().map(|sha| async { - let sha = sha; // move into future - crate::util::docker::remove_image(&sha).await - })) - .await, - ); - let pkg_archive_dir = ctx - .datadir - .join(PKG_ARCHIVE_DIR) - .join(id) - .join(version.as_str()); - if tokio::fs::metadata(&pkg_archive_dir).await.is_ok() { - tokio::fs::remove_dir_all(&pkg_archive_dir) - .await - .apply(|res| errors.handle(res)); - } - let assets_path = asset_dir(&ctx.datadir, id, version); - if tokio::fs::metadata(&assets_path).await.is_ok() { - tokio::fs::remove_dir_all(&assets_path) - .await - .apply(|res| errors.handle(res)); - } - let scripts_path = script_dir(&ctx.datadir, id, version); - if tokio::fs::metadata(&scripts_path).await.is_ok() { - tokio::fs::remove_dir_all(&scripts_path) - .await - .apply(|res| errors.handle(res)); - } - - errors.into_result() -} - -#[instrument(skip_all)] -pub async fn cleanup_failed(ctx: &RpcContext, id: &PackageId) -> Result<(), Error> { - if let Some(version) = match ctx - .db - .peek() - .await - .as_package_data() - .as_idx(id) - .or_not_found(id)? - .as_match() - { - PackageDataEntryMatchModelRef::Installing(m) => Some(m.as_manifest().as_version().de()?), - PackageDataEntryMatchModelRef::Restoring(m) => Some(m.as_manifest().as_version().de()?), - PackageDataEntryMatchModelRef::Updating(m) => { - let manifest_version = m.as_manifest().as_version().de()?; - let installed = m.as_installed().as_manifest().as_version().de()?; - if manifest_version != installed { - Some(manifest_version) - } else { - None // do not remove existing data - } - } - _ => { - tracing::warn!("{}: Nothing to clean up!", id); - None - } - } { - cleanup(ctx, id, &version).await?; - } - - ctx.db - .mutate(|v| { - match v - .clone() - .into_package_data() - .into_idx(id) - .or_not_found(id)? - .as_match() - { - PackageDataEntryMatchModelRef::Installing(_) - | PackageDataEntryMatchModelRef::Restoring(_) => { - v.as_package_data_mut().remove(id)?; - } - PackageDataEntryMatchModelRef::Updating(pde) => { - v.as_package_data_mut() - .as_idx_mut(id) - .or_not_found(id)? - .ser(&PackageDataEntry::Installed(PackageDataEntryInstalled { - manifest: pde.as_installed().as_manifest().de()?, - static_files: pde.as_static_files().de()?, - installed: pde.as_installed().de()?, - }))?; - } - _ => (), - } - Ok(()) - }) - .await -} - -#[instrument(skip_all)] -pub fn remove_from_current_dependents_lists( - db: &mut Model, - id: &PackageId, - current_dependencies: &CurrentDependencies, -) -> Result<(), Error> { - for dep in current_dependencies.0.keys().chain(std::iter::once(id)) { - if let Some(current_dependents) = db - .as_package_data_mut() - .as_idx_mut(dep) - .and_then(|d| d.as_installed_mut()) - .map(|i| i.as_current_dependents_mut()) - { - current_dependents.remove(id)?; - } - } - Ok(()) -} - -#[instrument(skip_all)] -pub async fn uninstall(ctx: &RpcContext, secrets: &mut Ex, id: &PackageId) -> Result<(), Error> -where - for<'a> &'a mut Ex: Executor<'a, Database = Postgres>, -{ - let db = ctx.db.peek().await; - let entry = db - .as_package_data() - .as_idx(id) - .or_not_found(id)? - .expect_as_removing()?; - - let dependents_paths: Vec = entry - .as_removing() - .as_current_dependents() - .keys()? - .into_iter() - .filter(|x| x != id) - .flat_map(|x| db.as_package_data().as_idx(&x)) - .flat_map(|x| x.as_installed()) - .flat_map(|x| x.as_manifest().as_volumes().de()) - .flat_map(|x| x.values().cloned().collect::>()) - .flat_map(|x| x.pointer_path(&ctx.datadir)) - .collect(); - - let volume_dir = ctx - .datadir - .join(crate::volume::PKG_VOLUME_DIR) - .join(&*entry.as_manifest().as_id().de()?); - let version = entry.as_removing().as_manifest().as_version().de()?; - tracing::debug!( - "Cleaning up {:?} except for {:?}", - volume_dir, - dependents_paths - ); - cleanup(ctx, id, &version).await?; - cleanup_folder(volume_dir, Arc::new(dependents_paths)).await; - remove_network_keys(secrets, id).await?; - - ctx.db - .mutate(|d| { - d.as_package_data_mut().remove(id)?; - remove_from_current_dependents_lists( - d, - id, - &entry.as_removing().as_current_dependencies().de()?, - ) - }) - .await -} - -#[instrument(skip_all)] -pub async fn remove_network_keys(secrets: &mut Ex, id: &PackageId) -> Result<(), Error> -where - for<'a> &'a mut Ex: Executor<'a, Database = Postgres>, -{ - sqlx::query!("DELETE FROM network_keys WHERE package = $1", &*id) - .execute(&mut *secrets) - .await?; - sqlx::query!("DELETE FROM tor WHERE package = $1", &*id) - .execute(&mut *secrets) - .await?; - Ok(()) -} - -/// Needed to remove, without removing the folders that are mounted in the other docker containers -pub fn cleanup_folder( - path: PathBuf, - dependents_volumes: Arc>, -) -> futures::future::BoxFuture<'static, ()> { - Box::pin(async move { - let meta_data = match tokio::fs::metadata(&path).await { - Ok(a) => a, - Err(_e) => { - return; - } - }; - if !meta_data.is_dir() { - tracing::error!("is_not dir, remove {:?}", path); - let _ = tokio::fs::remove_file(&path).await; - return; - } - if !dependents_volumes - .iter() - .any(|v| v.starts_with(&path) || v == &path) - { - tracing::error!("No parents, remove {:?}", path); - let _ = tokio::fs::remove_dir_all(&path).await; - return; - } - let mut read_dir = match tokio::fs::read_dir(&path).await { - Ok(a) => a, - Err(_e) => { - return; - } - }; - tracing::error!("Parents, recurse {:?}", path); - while let Some(entry) = read_dir.next_entry().await.ok().flatten() { - let entry_path = entry.path(); - cleanup_folder(entry_path, dependents_volumes.clone()).await; - } - }) -} diff --git a/core/startos/src/install/mod.rs b/core/startos/src/install/mod.rs index 01f405e7b..110443162 100644 --- a/core/startos/src/install/mod.rs +++ b/core/startos/src/install/mod.rs @@ -1,68 +1,46 @@ -use std::collections::BTreeMap; use std::io::SeekFrom; -use std::marker::PhantomData; -use std::path::{Path, PathBuf}; -use std::sync::atomic::Ordering; -use std::sync::Arc; +use std::path::PathBuf; use std::time::Duration; +use clap::builder::ValueParserFactory; +use clap::{value_parser, CommandFactory, FromArgMatches, Parser}; use color_eyre::eyre::eyre; use emver::VersionRange; -use futures::future::BoxFuture; -use futures::{FutureExt, StreamExt, TryStreamExt}; -use http::header::CONTENT_LENGTH; -use http::{Request, Response, StatusCode}; -use hyper::Body; -use models::{mime, DataUrl}; +use futures::{FutureExt, StreamExt}; +use patch_db::json_ptr::JsonPointer; +use reqwest::header::{HeaderMap, CONTENT_LENGTH}; use reqwest::Url; -use rpc_toolkit::command; use rpc_toolkit::yajrc::RpcError; +use rpc_toolkit::CallRemote; +use serde::{Deserialize, Serialize}; use serde_json::{json, Value}; -use tokio::fs::{File, OpenOptions}; -use tokio::io::{AsyncRead, AsyncSeek, AsyncSeekExt, AsyncWriteExt}; -use tokio::process::Command; +use tokio::io::{AsyncReadExt, AsyncSeekExt}; use tokio::sync::oneshot; -use tokio_stream::wrappers::ReadDirStream; use tracing::instrument; -use self::cleanup::{cleanup_failed, remove_from_current_dependents_lists}; -use crate::config::ConfigureContext; use crate::context::{CliContext, RpcContext}; use crate::core::rpc_continuations::{RequestGuid, RpcContinuation}; use crate::db::model::{ - CurrentDependencies, CurrentDependencyInfo, CurrentDependents, InstalledPackageInfo, - PackageDataEntry, PackageDataEntryInstalled, PackageDataEntryInstalling, - PackageDataEntryMatchModelRef, PackageDataEntryRemoving, PackageDataEntryRestoring, - PackageDataEntryUpdating, StaticDependencyInfo, StaticFiles, + PackageDataEntry, PackageDataEntryInstalled, PackageDataEntryMatchModelRef, + PackageDataEntryRemoving, }; -use crate::dependencies::{ - add_dependent_to_current_dependents_lists, compute_dependency_config_errs, - set_dependents_with_live_pointers_to_needs_config, -}; -use crate::install::cleanup::cleanup; -use crate::install::progress::{InstallProgress, InstallProgressTracker}; -use crate::notifications::NotificationLevel; use crate::prelude::*; -use crate::registry::marketplace::with_query_params; -use crate::s9pk::manifest::{Manifest, PackageId}; -use crate::s9pk::reader::S9pkReader; -use crate::status::{MainStatus, Status}; -use crate::util::docker::CONTAINER_TOOL; -use crate::util::io::response_to_reader; -use crate::util::serde::{display_serializable, Port}; -use crate::util::{display_none, AsyncFileExt, Invoke, Version}; -use crate::volume::{asset_dir, script_dir}; -use crate::{Error, ErrorKind, ResultExt}; - -pub mod cleanup; -pub mod progress; +use crate::progress::{FullProgress, PhasedProgressBar}; +use crate::s9pk::manifest::PackageId; +use crate::s9pk::merkle_archive::source::http::HttpSource; +use crate::s9pk::v1::reader::S9pkReader; +use crate::s9pk::v2::compat::{self, MAGIC_AND_VERSION}; +use crate::s9pk::S9pk; +use crate::upload::upload; +use crate::util::clap::FromStrParser; +use crate::util::Never; pub const PKG_ARCHIVE_DIR: &str = "package-data/archive"; pub const PKG_PUBLIC_DIR: &str = "package-data/public"; pub const PKG_WASM_DIR: &str = "package-data/wasm"; -#[command(display(display_serializable))] -pub async fn list(#[context] ctx: RpcContext) -> Result { +// #[command(display(display_serializable))] +pub async fn list(ctx: RpcContext) -> Result { Ok(ctx.db.peek().await.as_package_data().as_entries()? .iter() .filter_map(|(id, pde)| { @@ -116,6 +94,12 @@ impl std::str::FromStr for MinMax { } } } +impl ValueParserFactory for MinMax { + type Parser = FromStrParser; + fn value_parser() -> Self::Parser { + FromStrParser::new() + } +} impl std::fmt::Display for MinMax { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { @@ -125,21 +109,31 @@ impl std::fmt::Display for MinMax { } } -#[command( - custom_cli(cli_install(async, context(CliContext))), - display(display_none), - metadata(sync_db = true) -)] +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct InstallParams { + id: PackageId, + #[arg(short = 'm', long = "marketplace-url")] + marketplace_url: Option, + #[arg(short = 'v', long = "version-spec")] + version_spec: Option, + #[arg(long = "version-priority")] + version_priority: Option, +} + +// #[command( +// custom_cli(cli_install(async, context(CliContext))), +// )] #[instrument(skip_all)] pub async fn install( - #[context] ctx: RpcContext, - #[arg] id: String, - #[arg(short = 'm', long = "marketplace-url", rename = "marketplace-url")] - marketplace_url: Option, - #[arg(short = 'v', long = "version-spec", rename = "version-spec")] version_spec: Option< - String, - >, - #[arg(long = "version-priority", rename = "version-priority")] version_priority: Option, + ctx: RpcContext, + InstallParams { + id, + marketplace_url, + version_spec, + version_priority, + }: InstallParams, ) -> Result<(), Error> { let version_str = match &version_spec { None => "*", @@ -149,453 +143,265 @@ pub async fn install( let marketplace_url = marketplace_url.unwrap_or_else(|| crate::DEFAULT_MARKETPLACE.parse().unwrap()); let version_priority = version_priority.unwrap_or_default(); - let man: Manifest = ctx - .client - .get(with_query_params( - ctx.clone(), + let s9pk = S9pk::deserialize( + &HttpSource::new( + ctx.client.clone(), format!( - "{}/package/v0/manifest/{}?spec={}&version-priority={}", + "{}/package/v0/{}.s9pk?spec={}&version-priority={}", marketplace_url, id, version, version_priority, ) .parse()?, - )) - .send() - .await - .with_kind(crate::ErrorKind::Registry)? - .error_for_status() - .with_kind(crate::ErrorKind::Registry)? - .json() - .await - .with_kind(crate::ErrorKind::Registry)?; - let s9pk = ctx - .client - .get(with_query_params( - ctx.clone(), - format!( - "{}/package/v0/{}.s9pk?spec=={}&version-priority={}", - marketplace_url, id, man.version, version_priority, - ) - .parse()?, - )) - .send() - .await - .with_kind(crate::ErrorKind::Registry)? - .error_for_status()?; - - if *man.id != *id || !man.version.satisfies(&version) { - return Err(Error::new( - eyre!("Fetched package does not match requested id and version"), - ErrorKind::Registry, - )); - } - - let public_dir_path = ctx - .datadir - .join(PKG_PUBLIC_DIR) - .join(&man.id) - .join(man.version.as_str()); - tokio::fs::create_dir_all(&public_dir_path).await?; + ) + .await?, + ) + .await?; - let icon_type = man.assets.icon_type(); - let (license_res, instructions_res, icon_res) = tokio::join!( - async { - tokio::io::copy( - &mut response_to_reader( - ctx.client - .get(with_query_params( - ctx.clone(), - format!( - "{}/package/v0/license/{}?spec=={}", - marketplace_url, id, man.version, - ) - .parse()?, - )) - .send() - .await? - .error_for_status()?, - ), - &mut File::create(public_dir_path.join("LICENSE.md")).await?, - ) - .await?; - Ok::<_, color_eyre::eyre::Report>(()) - }, - async { - tokio::io::copy( - &mut response_to_reader( - ctx.client - .get(with_query_params( - ctx.clone(), - format!( - "{}/package/v0/instructions/{}?spec=={}", - marketplace_url, id, man.version, - ) - .parse()?, - )) - .send() - .await? - .error_for_status()?, - ), - &mut File::create(public_dir_path.join("INSTRUCTIONS.md")).await?, - ) - .await?; - Ok::<_, color_eyre::eyre::Report>(()) - }, - async { - tokio::io::copy( - &mut response_to_reader( - ctx.client - .get(with_query_params( - ctx.clone(), - format!( - "{}/package/v0/icon/{}?spec=={}", - marketplace_url, id, man.version, - ) - .parse()?, - )) - .send() - .await? - .error_for_status()?, - ), - &mut File::create(public_dir_path.join(format!("icon.{}", icon_type))).await?, - ) - .await?; - Ok::<_, color_eyre::eyre::Report>(()) - }, + ensure_code!( + &s9pk.as_manifest().id == &id, + ErrorKind::ValidateS9pk, + "manifest.id does not match expected" ); - if let Err(e) = license_res { - tracing::warn!("Failed to pre-download license: {}", e); - } - if let Err(e) = instructions_res { - tracing::warn!("Failed to pre-download instructions: {}", e); - } - if let Err(e) = icon_res { - tracing::warn!("Failed to pre-download icon: {}", e); - } - let progress = Arc::new(InstallProgress::new(s9pk.content_length())); - let static_files = StaticFiles::local(&man.id, &man.version, icon_type); - ctx.db - .mutate(|db| { - let pde = match db - .as_package_data() - .as_idx(&man.id) - .map(|x| x.de()) - .transpose()? - { - Some(PackageDataEntry::Installed(PackageDataEntryInstalled { - installed, - static_files, - .. - })) => PackageDataEntry::Updating(PackageDataEntryUpdating { - install_progress: progress.clone(), - static_files, - installed, - manifest: man.clone(), - }), - None => PackageDataEntry::Installing(PackageDataEntryInstalling { - install_progress: progress.clone(), - static_files, - manifest: man.clone(), - }), - _ => { - return Err(Error::new( - eyre!("Cannot install over a package in a transient state"), - crate::ErrorKind::InvalidRequest, - )) - } - }; - db.as_package_data_mut().insert(&man.id, &pde) - }) + let download = ctx + .services + .install(ctx.clone(), s9pk, None::) .await?; - - let downloading = download_install_s9pk( - ctx.clone(), - man.clone(), - Some(marketplace_url), - Arc::new(InstallProgress::new(s9pk.content_length())), - response_to_reader(s9pk), - None, - ); - tokio::spawn(async move { - if let Err(e) = downloading.await { - let err_str = format!("Install of {}@{} Failed: {}", man.id, man.version, e); - tracing::error!("{}", err_str); - tracing::debug!("{:?}", e); - if let Err(e) = ctx - .notification_manager - .notify( - ctx.db.clone(), - Some(man.id), - NotificationLevel::Error, - String::from("Install Failed"), - err_str, - (), - None, - ) - .await - { - tracing::error!("Failed to issue Notification: {}", e); - tracing::debug!("{:?}", e); - } - } - Ok::<_, String>(()) - }); + tokio::spawn(async move { download.await?.await }); Ok(()) } -#[command(rpc_only, display(display_none))] -#[instrument(skip_all)] -pub async fn sideload( - #[context] ctx: RpcContext, - #[arg] manifest: Manifest, - #[arg] icon: Option, -) -> Result { - let new_ctx = ctx.clone(); - let guid = RequestGuid::new(); - if let Some(icon) = icon { - use tokio::io::AsyncWriteExt; - let public_dir_path = ctx - .datadir - .join(PKG_PUBLIC_DIR) - .join(&manifest.id) - .join(manifest.version.as_str()); - tokio::fs::create_dir_all(&public_dir_path).await?; - - let invalid_data_url = - || Error::new(eyre!("Invalid Icon Data URL"), ErrorKind::InvalidRequest); - let data = icon - .strip_prefix(&format!( - "data:image/{};base64,", - manifest.assets.icon_type() - )) - .ok_or_else(&invalid_data_url)?; - let mut icon_file = - File::create(public_dir_path.join(format!("icon.{}", manifest.assets.icon_type()))) - .await?; - icon_file - .write_all(&base64::decode(data).with_kind(ErrorKind::InvalidRequest)?) - .await?; - icon_file.sync_all().await?; - } - - let handler = Box::new(|req: Request| { - async move { - let content_length = match req.headers().get(CONTENT_LENGTH).map(|a| a.to_str()) { - None => None, - Some(Err(_)) => { - return Response::builder() - .status(StatusCode::BAD_REQUEST) - .body(Body::from("Invalid Content Length")) - .with_kind(ErrorKind::Network) - } - Some(Ok(a)) => match a.parse::() { - Err(_) => { - return Response::builder() - .status(StatusCode::BAD_REQUEST) - .body(Body::from("Invalid Content Length")) - .with_kind(ErrorKind::Network) - } - Ok(a) => Some(a), - }, - }; - let progress = Arc::new(InstallProgress::new(content_length)); - let install_progress = progress.clone(); +#[derive(Deserialize, Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct SideloadResponse { + pub upload: RequestGuid, + pub progress: RequestGuid, +} - new_ctx - .db - .mutate(|db| { - let pde = match db - .as_package_data() - .as_idx(&manifest.id) - .map(|x| x.de()) - .transpose()? - { - Some(PackageDataEntry::Installed(PackageDataEntryInstalled { - installed, - static_files, - .. - })) => PackageDataEntry::Updating(PackageDataEntryUpdating { - install_progress, - installed, - manifest: manifest.clone(), - static_files, - }), - None => PackageDataEntry::Installing(PackageDataEntryInstalling { - install_progress, - static_files: StaticFiles::local( - &manifest.id, - &manifest.version, - &manifest.assets.icon_type(), - ), - manifest: manifest.clone(), - }), - _ => { - return Err(Error::new( - eyre!("Cannot install over a package in a transient state"), - crate::ErrorKind::InvalidRequest, - )) +#[instrument(skip_all)] +pub async fn sideload(ctx: RpcContext) -> Result { + let (upload, file) = upload(&ctx).await?; + let (id_send, id_recv) = oneshot::channel(); + let (err_send, err_recv) = oneshot::channel(); + let progress = RequestGuid::new(); + let db = ctx.db.clone(); + let mut sub = db.subscribe().await; + ctx.add_continuation( + progress.clone(), + RpcContinuation::ws( + Box::new(|mut ws| { + use axum::extract::ws::Message; + async move { + if let Err(e) = async { + let id = id_recv.await.map_err(|_| { + Error::new( + eyre!("Could not get id to watch progress"), + ErrorKind::Cancelled, + ) + })?; + let progress_path = + JsonPointer::parse(format!("/package-data/{id}/install-progress")) + .with_kind(ErrorKind::Database)?; + tokio::select! { + res = async { + while let Some(rev) = sub.recv().await { + if rev.patch.affects_path(&progress_path) { + ws.send(Message::Text( + serde_json::to_string(&if let Some(p) = db + .peek() + .await + .as_package_data() + .as_idx(&id) + .and_then(|e| e.as_install_progress()) + { + Ok::<_, ()>(p.de()?) + } else { + let mut p = FullProgress::new(); + p.overall.complete(); + Ok(p) + }) + .with_kind(ErrorKind::Serialization)?, + )) + .await + .with_kind(ErrorKind::Network)?; + } + } + Ok::<_, Error>(()) + } => res?, + err = err_recv => { + if let Ok(e) = err { + ws.send(Message::Text( + serde_json::to_string(&Err::<(), _>(e)) + .with_kind(ErrorKind::Serialization)?, + )) + .await + .with_kind(ErrorKind::Network)?; + } + } } - }; - db.as_package_data_mut().insert(&manifest.id, &pde) - }) - .await?; - let (send, recv) = oneshot::channel(); - - tokio::spawn(async move { - if let Err(e) = download_install_s9pk( - new_ctx.clone(), - manifest.clone(), - None, - progress, - tokio_util::io::StreamReader::new(req.into_body().map_err(|e| { - std::io::Error::new( - match &e { - e if e.is_connect() => std::io::ErrorKind::ConnectionRefused, - e if e.is_timeout() => std::io::ErrorKind::TimedOut, - _ => std::io::ErrorKind::Other, - }, - e, - ) - })), - Some(send), - ) - .await - { - let err_str = format!( - "Install of {}@{} Failed: {}", - manifest.id, manifest.version, e - ); - tracing::error!("{}", err_str); - tracing::debug!("{:?}", e); - if let Err(e) = new_ctx - .notification_manager - .notify( - new_ctx.db.clone(), - Some(manifest.id.clone()), - NotificationLevel::Error, - String::from("Install Failed"), - err_str, - (), - None, - ) - .await + Ok::<_, Error>(()) + } + .await { - tracing::error!("Failed to issue Notification: {}", e); - tracing::debug!("{:?}", e); + tracing::error!("Error tracking sideload progress: {e}"); + tracing::debug!("{e:?}"); } } - }); - - if let Ok(_) = recv.await { - Response::builder() - .status(StatusCode::OK) - .body(Body::empty()) - .with_kind(ErrorKind::Network) - } else { - Response::builder() - .status(StatusCode::INTERNAL_SERVER_ERROR) - .body(Body::from("installation aborted before upload completed")) - .with_kind(ErrorKind::Network) - } - } - .boxed() - }); - ctx.add_continuation( - guid.clone(), - RpcContinuation::rest(handler, Duration::from_secs(30)), + .boxed() + }), + Duration::from_secs(30), + ), ) .await; - Ok(guid) + tokio::spawn(async move { + if let Err(e) = async { + let s9pk = S9pk::deserialize(&file).await?; + let _ = id_send.send(s9pk.as_manifest().id.clone()); + ctx.services + .install(ctx.clone(), s9pk, None::) + .await? + .await? + .await?; + file.delete().await + } + .await + { + let _ = err_send.send(RpcError::from(e.clone_output())); + tracing::error!("Error sideloading package: {e}"); + tracing::debug!("{e:?}"); + } + }); + Ok(SideloadResponse { upload, progress }) +} + +#[derive(Deserialize, Serialize)] +#[serde(rename_all = "kebab-case")] +pub enum CliInstallParams { + Marketplace(InstallParams), + Sideload(PathBuf), +} +impl CommandFactory for CliInstallParams { + fn command() -> clap::Command { + use clap::{Arg, Command}; + Command::new("install") + .arg( + Arg::new("sideload") + .long("sideload") + .short('s') + .required_unless_present("id") + .value_parser(value_parser!(PathBuf)), + ) + .args(InstallParams::command().get_arguments().cloned().map(|a| { + if a.get_id() == "id" { + a.required(false).required_unless_present("sideload") + } else { + a + } + .conflicts_with("sideload") + })) + } + fn command_for_update() -> clap::Command { + Self::command() + } +} +impl FromArgMatches for CliInstallParams { + fn from_arg_matches(matches: &clap::ArgMatches) -> Result { + if let Some(sideload) = matches.get_one::("sideload") { + Ok(Self::Sideload(sideload.clone())) + } else { + Ok(Self::Marketplace(InstallParams::from_arg_matches(matches)?)) + } + } + fn update_from_arg_matches(&mut self, matches: &clap::ArgMatches) -> Result<(), clap::Error> { + *self = Self::from_arg_matches(matches)?; + Ok(()) + } } #[instrument(skip_all)] -async fn cli_install( - ctx: CliContext, - target: String, - marketplace_url: Option, - version_spec: Option, - version_priority: Option, -) -> Result<(), RpcError> { - if target.ends_with(".s9pk") { - let path = PathBuf::from(target); +pub async fn cli_install(ctx: CliContext, params: CliInstallParams) -> Result<(), RpcError> { + match params { + CliInstallParams::Sideload(path) => { + let file = crate::s9pk::load(&ctx, path).await?; + + // rpc call remote sideload + let SideloadResponse { upload, progress } = from_value::( + ctx.call_remote("package.sideload", imbl_value::json!({})) + .await?, + )?; + + let upload = async { + let content_length = file.metadata().await?.len(); + ctx.rest_continuation( + upload, + reqwest::Body::wrap_stream(tokio_util::io::ReaderStream::new(file)), + { + let mut map = HeaderMap::new(); + map.insert(CONTENT_LENGTH, content_length.into()); + map + }, + ) + .await? + .error_for_status() + .with_kind(ErrorKind::Network)?; + Ok::<_, Error>(()) + }; - // inspect manifest no verify - let mut reader = S9pkReader::open(&path, false).await?; - let manifest = reader.manifest().await?; - let icon = reader.icon().await?.to_vec().await?; - let icon_str = format!( - "data:image/{};base64,{}", - manifest.assets.icon_type(), - base64::encode(&icon) - ); + let progress = async { + use tokio_tungstenite::tungstenite::Message; - // rpc call remote sideload - tracing::debug!("calling package.sideload"); - let guid = rpc_toolkit::command_helpers::call_remote( - ctx.clone(), - "package.sideload", - serde_json::json!({ "manifest": manifest, "icon": icon_str }), - PhantomData::, - ) - .await? - .result?; - tracing::debug!("package.sideload succeeded {:?}", guid); + let mut bar = PhasedProgressBar::new("Sideloading"); - // hit continuation api with guid that comes back - let file = tokio::fs::File::open(path).await?; - let content_length = file.metadata().await?.len(); - let body = Body::wrap_stream(tokio_util::io::ReaderStream::new(file)); - let res = ctx - .client - .post(format!("{}rest/rpc/{}", ctx.base_url, guid,)) - .header(CONTENT_LENGTH, content_length) - .body(body) - .send() - .await?; - if res.status().as_u16() == 200 { - tracing::info!("Package Uploaded") - } else { - tracing::info!("Package Upload failed: {}", res.text().await?) + let mut ws = ctx.ws_continuation(progress).await?; + + let mut progress = FullProgress::new(); + + loop { + tokio::select! { + msg = ws.next() => { + if let Some(msg) = msg { + if let Message::Text(t) = msg.with_kind(ErrorKind::Network)? { + progress = + serde_json::from_str::>(&t) + .with_kind(ErrorKind::Deserialization)??; + bar.update(&progress); + } + } else { + break; + } + } + _ = tokio::time::sleep(Duration::from_millis(100)) => { + bar.update(&progress); + }, + } + } + + Ok::<_, Error>(()) + }; + + let (upload, progress) = tokio::join!(upload, progress); + progress?; + upload?; + } + CliInstallParams::Marketplace(params) => { + ctx.call_remote("package.install", to_value(¶ms)?) + .await?; } - } else { - let params = match (target.split_once("@"), version_spec) { - (Some((pkg, v)), None) => { - serde_json::json!({ "id": pkg, "marketplace-url": marketplace_url, "version-spec": v, "version-priority": version_priority }) - } - (Some(_), Some(_)) => { - return Err(crate::Error::new( - eyre!("Invalid package id {}", target), - ErrorKind::InvalidRequest, - ) - .into()) - } - (None, Some(v)) => { - serde_json::json!({ "id": target, "marketplace-url": marketplace_url, "version-spec": v, "version-priority": version_priority }) - } - (None, None) => { - serde_json::json!({ "id": target, "marketplace-url": marketplace_url, "version-priority": version_priority }) - } - }; - tracing::debug!("calling package.install"); - rpc_toolkit::command_helpers::call_remote( - ctx, - "package.install", - params, - PhantomData::<()>, - ) - .await? - .result?; - tracing::debug!("package.install succeeded"); } Ok(()) } -#[command(display(display_none), metadata(sync_db = true))] +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct UninstallParams { + id: PackageId, +} + pub async fn uninstall( - #[context] ctx: RpcContext, - #[arg] id: PackageId, + ctx: RpcContext, + UninstallParams { id }: UninstallParams, ) -> Result { ctx.db .mutate(|db| { @@ -624,694 +430,7 @@ pub async fn uninstall( let return_id = id.clone(); - tokio::spawn(async move { - if let Err(e) = async { - cleanup::uninstall(&ctx, ctx.secret_store.acquire().await?.as_mut(), &id).await - } - .await - { - let err_str = format!("Uninstall of {} Failed: {}", id, e); - tracing::error!("{}", err_str); - tracing::debug!("{:?}", e); - if let Err(e) = ctx - .notification_manager - .notify( - ctx.db.clone(), // allocating separate handle here because the lifetime of the previous one is the expression - Some(id), - NotificationLevel::Error, - String::from("Uninstall Failed"), - err_str, - (), - None, - ) - .await - { - tracing::error!("Failed to issue Notification: {}", e); - tracing::debug!("{:?}", e); - } - } - }); + tokio::spawn(async move { ctx.services.uninstall(&ctx, &id).await }); Ok(return_id) } - -#[instrument(skip_all)] -pub async fn download_install_s9pk( - ctx: RpcContext, - temp_manifest: Manifest, - marketplace_url: Option, - progress: Arc, - mut s9pk: impl AsyncRead + Unpin, - download_complete: Option>, -) -> Result<(), Error> { - let pkg_id = &temp_manifest.id; - let version = &temp_manifest.version; - let db = ctx.db.peek().await; - - if let Result::<(), Error>::Err(e) = { - let ctx = ctx.clone(); - async move { - // // Build set of existing manifests - let mut manifests = Vec::new(); - for (_id, pkg) in db.as_package_data().as_entries()? { - let m = pkg.as_manifest().de()?; - manifests.push(m); - } - // Build map of current port -> ssl mappings - let port_map = ssl_port_status(&manifests); - tracing::info!("SSL Port Map: {:?}", &port_map); - - // if any of the requested interface lan configs conflict with current state, fail the install - for (_id, iface) in &temp_manifest.interfaces.0 { - if let Some(cfg) = &iface.lan_config { - for (p, lan) in cfg { - if p.0 == 80 && lan.ssl || p.0 == 443 && !lan.ssl { - return Err(Error::new( - eyre!("SSL Conflict with StartOS"), - ErrorKind::LanPortConflict, - )); - } - match port_map.get(&p) { - Some((ssl, pkg)) => { - if *ssl != lan.ssl { - return Err(Error::new( - eyre!("SSL Conflict with package: {}", pkg), - ErrorKind::LanPortConflict, - )); - } - } - None => { - continue; - } - } - } - } - } - - let pkg_archive_dir = ctx - .datadir - .join(PKG_ARCHIVE_DIR) - .join(pkg_id) - .join(version.as_str()); - tokio::fs::create_dir_all(&pkg_archive_dir).await?; - let pkg_archive = - pkg_archive_dir.join(AsRef::::as_ref(pkg_id).with_extension("s9pk")); - - File::delete(&pkg_archive).await?; - let mut dst = OpenOptions::new() - .create(true) - .write(true) - .read(true) - .open(&pkg_archive) - .await?; - - progress - .track_download_during(ctx.db.clone(), pkg_id, || async { - let mut progress_writer = - InstallProgressTracker::new(&mut dst, progress.clone()); - tokio::io::copy(&mut s9pk, &mut progress_writer).await?; - progress.download_complete(); - if let Some(complete) = download_complete { - complete.send(()).unwrap_or_default(); - } - Ok(()) - }) - .await?; - - dst.seek(SeekFrom::Start(0)).await?; - - let progress_reader = InstallProgressTracker::new(dst, progress.clone()); - let mut s9pk_reader = progress - .track_read_during(ctx.db.clone(), pkg_id, || { - S9pkReader::from_reader(progress_reader, true) - }) - .await?; - - install_s9pk( - ctx.clone(), - pkg_id, - version, - marketplace_url, - &mut s9pk_reader, - progress, - ) - .await?; - - Ok(()) - } - } - .await - { - if let Err(e) = cleanup_failed(&ctx, pkg_id).await { - tracing::error!("Failed to clean up {}@{}: {}", pkg_id, version, e); - tracing::debug!("{:?}", e); - } - - Err(e) - } else { - Ok::<_, Error>(()) - } -} - -#[instrument(skip_all)] -pub async fn install_s9pk( - ctx: RpcContext, - pkg_id: &PackageId, - version: &Version, - marketplace_url: Option, - rdr: &mut S9pkReader>, - progress: Arc, -) -> Result<(), Error> { - rdr.validate().await?; - rdr.validated(); - let developer_key = rdr.developer_key().clone(); - rdr.reset().await?; - let db = ctx.db.peek().await; - - tracing::info!("Install {}@{}: Unpacking Manifest", pkg_id, version); - let manifest = progress - .track_read_during(ctx.db.clone(), pkg_id, || rdr.manifest()) - .await?; - tracing::info!("Install {}@{}: Unpacked Manifest", pkg_id, version); - - tracing::info!("Install {}@{}: Fetching Dependency Info", pkg_id, version); - let mut dependency_info = BTreeMap::new(); - for (dep, info) in &manifest.dependencies.0 { - let manifest: Option = if let Some(local_man) = db - .as_package_data() - .as_idx(dep) - .map(|pde| pde.as_manifest().de()) - { - Some(local_man?) - } else if let Some(marketplace_url) = &marketplace_url { - match ctx - .client - .get(with_query_params( - ctx.clone(), - format!( - "{}/package/v0/manifest/{}?spec={}", - marketplace_url, dep, info.version, - ) - .parse()?, - )) - .send() - .await - .with_kind(crate::ErrorKind::Registry)? - .error_for_status() - { - Ok(a) => Ok(Some( - a.json() - .await - .with_kind(crate::ErrorKind::Deserialization)?, - )), - Err(e) - if e.status() == Some(StatusCode::BAD_REQUEST) - || e.status() == Some(StatusCode::NOT_FOUND) => - { - Ok(None) - } - Err(e) => Err(e), - } - .with_kind(crate::ErrorKind::Registry)? - } else { - None - }; - - let icon_path = if let Some(manifest) = &manifest { - let dir = ctx - .datadir - .join(PKG_PUBLIC_DIR) - .join(&manifest.id) - .join(manifest.version.as_str()); - let icon_path = dir.join(format!("icon.{}", manifest.assets.icon_type())); - if tokio::fs::metadata(&icon_path).await.is_err() { - if let Some(marketplace_url) = &marketplace_url { - tokio::fs::create_dir_all(&dir).await?; - let icon = ctx - .client - .get(with_query_params( - ctx.clone(), - format!( - "{}/package/v0/icon/{}?spec={}", - marketplace_url, dep, info.version, - ) - .parse()?, - )) - .send() - .await - .with_kind(crate::ErrorKind::Registry)?; - let mut dst = File::create(&icon_path).await?; - tokio::io::copy(&mut response_to_reader(icon), &mut dst).await?; - dst.sync_all().await?; - Some(icon_path) - } else { - None - } - } else { - Some(icon_path) - } - } else { - None - }; - - dependency_info.insert( - dep.clone(), - StaticDependencyInfo { - title: manifest - .as_ref() - .map(|x| x.title.clone()) - .unwrap_or_else(|| dep.to_string()), - icon: if let Some(icon_path) = &icon_path { - DataUrl::from_path(icon_path).await? - } else { - DataUrl::from_slice("image/png", include_bytes!("./package-icon.png")) - }, - }, - ); - } - tracing::info!("Install {}@{}: Fetched Dependency Info", pkg_id, version); - - let icon = progress - .track_read_during(ctx.db.clone(), pkg_id, || { - unpack_s9pk(&ctx.datadir, &manifest, rdr) - }) - .await?; - - progress.unpack_complete.store(true, Ordering::SeqCst); - - progress - .track_read( - ctx.db.clone(), - pkg_id.clone(), - Arc::new(::std::sync::atomic::AtomicBool::new(true)), - ) - .await?; - - let peek = ctx.db.peek().await; - let prev = peek - .as_package_data() - .as_idx(pkg_id) - .or_not_found(pkg_id)? - .de()?; - let mut sql_tx = ctx.secret_store.begin().await?; - - tracing::info!("Install {}@{}: Creating volumes", pkg_id, version); - manifest.volumes.install(&ctx, pkg_id, version).await?; - tracing::info!("Install {}@{}: Created volumes", pkg_id, version); - - tracing::info!("Install {}@{}: Installing interfaces", pkg_id, version); - let interface_addresses = manifest.interfaces.install(sql_tx.as_mut(), pkg_id).await?; - tracing::info!( - "Install {}@{}: Installed interfaces {:?}", - pkg_id, - version, - interface_addresses - ); - - tracing::info!("Install {}@{}: Creating manager", pkg_id, version); - let manager = ctx.managers.add(ctx.clone(), manifest.clone()).await?; - tracing::info!("Install {}@{}: Created manager", pkg_id, version); - - let static_files = StaticFiles::local(pkg_id, version, manifest.assets.icon_type()); - let current_dependencies: CurrentDependencies = CurrentDependencies( - manifest - .dependencies - .0 - .iter() - .filter_map(|(id, info)| { - if info.requirement.required() { - Some((id.clone(), CurrentDependencyInfo::default())) - } else { - None - } - }) - .collect(), - ); - let mut dependents_static_dependency_info = BTreeMap::new(); - let current_dependents = { - let mut deps = BTreeMap::new(); - for package in db.as_package_data().keys()? { - if db - .as_package_data() - .as_idx(&package) - .or_not_found(&package)? - .as_installed() - .and_then(|i| i.as_dependency_info().as_idx(&pkg_id)) - .is_some() - { - dependents_static_dependency_info.insert(package.clone(), icon.clone()); - } - if let Some(dep) = db - .as_package_data() - .as_idx(&package) - .or_not_found(&package)? - .as_installed() - .and_then(|i| i.as_current_dependencies().as_idx(pkg_id)) - { - deps.insert(package, dep.de()?); - } - } - - CurrentDependents(deps) - }; - - let installed = InstalledPackageInfo { - status: Status { - configured: manifest.config.is_none(), - main: MainStatus::Stopped, - dependency_config_errors: compute_dependency_config_errs( - &ctx, - &peek, - &manifest, - ¤t_dependencies, - &Default::default(), - ) - .await?, - }, - marketplace_url, - developer_key, - manifest: manifest.clone(), - last_backup: match prev { - PackageDataEntry::Updating(PackageDataEntryUpdating { - installed: - InstalledPackageInfo { - last_backup: Some(time), - .. - }, - .. - }) => Some(time), - _ => None, - }, - dependency_info, - current_dependents: current_dependents.clone(), - current_dependencies: current_dependencies.clone(), - interface_addresses, - }; - let mut next = PackageDataEntryInstalled { - installed, - manifest: manifest.clone(), - static_files, - }; - - let mut auto_start = false; - let mut configured = false; - - let mut to_cleanup = None; - - if let PackageDataEntry::Updating(PackageDataEntryUpdating { - installed: prev, .. - }) = &prev - { - let prev_is_configured = prev.status.configured; - let prev_migration = prev - .manifest - .migrations - .to( - &ctx, - version, - pkg_id, - &prev.manifest.version, - &prev.manifest.volumes, - ) - .map(futures::future::Either::Left); - let migration = manifest - .migrations - .from( - &manifest.containers, - &ctx, - &prev.manifest.version, - pkg_id, - version, - &manifest.volumes, - ) - .map(futures::future::Either::Right); - - let viable_migration = if prev.manifest.version > manifest.version { - prev_migration.or(migration) - } else { - migration.or(prev_migration) - }; - - if let Some(f) = viable_migration { - configured = f.await?.configured && prev_is_configured; - } - if configured || manifest.config.is_none() { - auto_start = prev.status.main.running(); - } - if &prev.manifest.version != version { - to_cleanup = Some((prev.manifest.id.clone(), prev.manifest.version.clone())); - } - } else if let PackageDataEntry::Restoring(PackageDataEntryRestoring { .. }) = prev { - next.installed.marketplace_url = manifest - .backup - .restore(&ctx, pkg_id, version, &manifest.volumes) - .await?; - } - - sql_tx.commit().await?; - - let to_configure = ctx - .db - .mutate(|db| { - for (package, icon) in dependents_static_dependency_info { - db.as_package_data_mut() - .as_idx_mut(&package) - .or_not_found(&package)? - .as_installed_mut() - .or_not_found(&package)? - .as_dependency_info_mut() - .insert( - &pkg_id, - &StaticDependencyInfo { - icon, - title: manifest.title.clone(), - }, - )?; - } - db.as_package_data_mut() - .insert(&pkg_id, &PackageDataEntry::Installed(next))?; - if let PackageDataEntry::Updating(PackageDataEntryUpdating { - installed: prev, .. - }) = &prev - { - remove_from_current_dependents_lists(db, pkg_id, &prev.current_dependencies)?; - } - add_dependent_to_current_dependents_lists(db, pkg_id, ¤t_dependencies)?; - - set_dependents_with_live_pointers_to_needs_config(db, pkg_id) - }) - .await?; - - if let Some((id, version)) = to_cleanup { - cleanup(&ctx, &id, &version).await?; - } - - if configured && manifest.config.is_some() { - let breakages = BTreeMap::new(); - let overrides = Default::default(); - - let configure_context = ConfigureContext { - breakages, - timeout: None, - config: None, - dry_run: false, - overrides, - }; - manager.configure(configure_context).await?; - } - - for to_configure in to_configure.into_iter().filter(|(dep, _)| dep != pkg_id) { - if let Err(e) = async { - ctx.managers - .get(&to_configure) - .await - .or_not_found(format!("manager for {}", to_configure.0))? - .configure(ConfigureContext { - breakages: BTreeMap::new(), - timeout: None, - config: None, - overrides: BTreeMap::new(), - dry_run: false, - }) - .await - } - .await - { - tracing::error!("error configuring dependent: {e}"); - tracing::debug!("{e:?}") - } - } - - if auto_start { - manager.start().await; - } - - tracing::info!("Install {}@{}: Complete", pkg_id, version); - - Ok(()) -} - -#[instrument(skip_all)] -pub async fn unpack_s9pk( - datadir: impl AsRef, - manifest: &Manifest, - rdr: &mut S9pkReader, -) -> Result, Error> { - let datadir = datadir.as_ref(); - let pkg_id = &manifest.id; - let version = &manifest.version; - - let public_dir_path = datadir - .join(PKG_PUBLIC_DIR) - .join(pkg_id) - .join(version.as_str()); - tokio::fs::create_dir_all(&public_dir_path).await?; - - tracing::info!("Install {}@{}: Unpacking LICENSE.md", pkg_id, version); - let license_path = public_dir_path.join("LICENSE.md"); - let mut dst = File::create(&license_path).await?; - tokio::io::copy(&mut rdr.license().await?, &mut dst).await?; - dst.sync_all().await?; - tracing::info!("Install {}@{}: Unpacked LICENSE.md", pkg_id, version); - - tracing::info!("Install {}@{}: Unpacking INSTRUCTIONS.md", pkg_id, version); - let instructions_path = public_dir_path.join("INSTRUCTIONS.md"); - let mut dst = File::create(&instructions_path).await?; - tokio::io::copy(&mut rdr.instructions().await?, &mut dst).await?; - dst.sync_all().await?; - tracing::info!("Install {}@{}: Unpacked INSTRUCTIONS.md", pkg_id, version); - - let icon_filename = Path::new("icon").with_extension(manifest.assets.icon_type()); - let icon_path = public_dir_path.join(&icon_filename); - tracing::info!( - "Install {}@{}: Unpacking {}", - pkg_id, - version, - icon_path.display() - ); - let icon_buf = rdr.icon().await?.to_vec().await?; - let mut dst = File::create(&icon_path).await?; - dst.write_all(&icon_buf).await?; - dst.sync_all().await?; - let icon = DataUrl::from_vec( - mime(manifest.assets.icon_type()).unwrap_or("image/png"), - icon_buf, - ); - tracing::info!( - "Install {}@{}: Unpacked {}", - pkg_id, - version, - icon_filename.display() - ); - - tracing::info!("Install {}@{}: Unpacking Docker Images", pkg_id, version); - Command::new(CONTAINER_TOOL) - .arg("load") - .input(Some(&mut rdr.docker_images().await?)) - .invoke(ErrorKind::Docker) - .await?; - tracing::info!("Install {}@{}: Unpacked Docker Images", pkg_id, version,); - - tracing::info!("Install {}@{}: Unpacking Assets", pkg_id, version); - let asset_dir = asset_dir(datadir, pkg_id, version); - if tokio::fs::metadata(&asset_dir).await.is_ok() { - tokio::fs::remove_dir_all(&asset_dir).await?; - } - tokio::fs::create_dir_all(&asset_dir).await?; - let mut tar = tokio_tar::Archive::new(rdr.assets().await?); - tar.unpack(asset_dir).await?; - - let script_dir = script_dir(datadir, pkg_id, version); - if tokio::fs::metadata(&script_dir).await.is_err() { - tokio::fs::create_dir_all(&script_dir).await?; - } - if let Some(mut hdl) = rdr.scripts().await? { - tokio::io::copy( - &mut hdl, - &mut File::create(script_dir.join("embassy.js")).await?, - ) - .await?; - } - tracing::info!("Install {}@{}: Unpacked Assets", pkg_id, version); - - Ok(icon) -} - -#[instrument(skip_all)] -pub fn rebuild_from<'a>( - source: impl AsRef + 'a + Send + Sync, - datadir: impl AsRef + 'a + Send + Sync, -) -> BoxFuture<'a, Result<(), Error>> { - async move { - let source_dir = source.as_ref(); - let datadir = datadir.as_ref(); - if tokio::fs::metadata(&source_dir).await.is_ok() { - ReadDirStream::new(tokio::fs::read_dir(&source_dir).await?) - .map(|r| { - r.with_ctx(|_| (crate::ErrorKind::Filesystem, format!("{:?}", &source_dir))) - }) - .try_for_each(|entry| async move { - let m = entry.metadata().await?; - if m.is_file() { - let path = entry.path(); - let ext = path.extension().and_then(|ext| ext.to_str()); - if ext == Some("tar") || ext == Some("s9pk") { - if let Err(e) = async { - match ext { - Some("tar") => { - Command::new(CONTAINER_TOOL) - .arg("load") - .input(Some(&mut File::open(&path).await?)) - .invoke(ErrorKind::Docker) - .await?; - Ok::<_, Error>(()) - } - Some("s9pk") => { - let mut s9pk = S9pkReader::open(&path, true).await?; - unpack_s9pk(datadir, &s9pk.manifest().await?, &mut s9pk) - .await?; - Ok(()) - } - _ => unreachable!(), - } - } - .await - { - tracing::error!("Error unpacking {path:?}: {e}"); - tracing::debug!("{e:?}"); - } - Ok(()) - } else { - Ok(()) - } - } else if m.is_dir() { - rebuild_from(entry.path(), datadir).await?; - Ok(()) - } else { - Ok(()) - } - }) - .await - } else { - Ok(()) - } - } - .boxed() -} - -fn ssl_port_status(manifests: &Vec) -> BTreeMap { - let mut ret = BTreeMap::new(); - for m in manifests { - for (_id, iface) in &m.interfaces.0 { - match &iface.lan_config { - None => {} - Some(cfg) => { - for (p, lan) in cfg { - ret.insert(p.clone(), (lan.ssl, m.id.clone())); - } - } - } - } - } - ret -} diff --git a/core/startos/src/install/progress.rs b/core/startos/src/install/progress.rs deleted file mode 100644 index 61e58e0e6..000000000 --- a/core/startos/src/install/progress.rs +++ /dev/null @@ -1,228 +0,0 @@ -use std::future::Future; -use std::io::SeekFrom; -use std::pin::Pin; -use std::sync::atomic::{AtomicBool, AtomicU64, Ordering}; -use std::sync::Arc; -use std::task::{Context, Poll}; -use std::time::Duration; - -use models::{OptionExt, PackageId}; -use serde::{Deserialize, Serialize}; -use tokio::io::{AsyncRead, AsyncSeek, AsyncWrite}; - -use crate::db::model::Database; -use crate::prelude::*; - -#[derive(Debug, Deserialize, Serialize, HasModel, Default)] -#[serde(rename_all = "kebab-case")] -#[model = "Model"] -pub struct InstallProgress { - pub size: Option, - pub downloaded: AtomicU64, - pub download_complete: AtomicBool, - pub validated: AtomicU64, - pub validation_complete: AtomicBool, - pub unpacked: AtomicU64, - pub unpack_complete: AtomicBool, -} -impl InstallProgress { - pub fn new(size: Option) -> Self { - InstallProgress { - size, - downloaded: AtomicU64::new(0), - download_complete: AtomicBool::new(false), - validated: AtomicU64::new(0), - validation_complete: AtomicBool::new(false), - unpacked: AtomicU64::new(0), - unpack_complete: AtomicBool::new(false), - } - } - pub fn download_complete(&self) { - self.download_complete.store(true, Ordering::SeqCst) - } - pub async fn track_download(self: Arc, db: PatchDb, id: PackageId) -> Result<(), Error> { - let update = |d: &mut Model| { - d.as_package_data_mut() - .as_idx_mut(&id) - .or_not_found(&id)? - .as_install_progress_mut() - .or_not_found("install-progress")? - .ser(&self) - }; - while !self.download_complete.load(Ordering::SeqCst) { - db.mutate(&update).await?; - tokio::time::sleep(Duration::from_millis(300)).await; - } - db.mutate(&update).await - } - pub async fn track_download_during< - F: FnOnce() -> Fut, - Fut: Future>, - T, - >( - self: &Arc, - db: PatchDb, - id: &PackageId, - f: F, - ) -> Result { - let tracker = tokio::spawn(self.clone().track_download(db.clone(), id.clone())); - let res = f().await; - self.download_complete.store(true, Ordering::SeqCst); - tracker.await.unwrap()?; - res - } - pub async fn track_read( - self: Arc, - db: PatchDb, - id: PackageId, - complete: Arc, - ) -> Result<(), Error> { - let update = |d: &mut Model| { - d.as_package_data_mut() - .as_idx_mut(&id) - .or_not_found(&id)? - .as_install_progress_mut() - .or_not_found("install-progress")? - .ser(&self) - }; - while !complete.load(Ordering::SeqCst) { - db.mutate(&update).await?; - tokio::time::sleep(Duration::from_millis(300)).await; - } - db.mutate(&update).await - } - pub async fn track_read_during< - F: FnOnce() -> Fut, - Fut: Future>, - T, - >( - self: &Arc, - db: PatchDb, - id: &PackageId, - f: F, - ) -> Result { - let complete = Arc::new(AtomicBool::new(false)); - let tracker = tokio::spawn(self.clone().track_read( - db.clone(), - id.clone(), - complete.clone(), - )); - let res = f().await; - complete.store(true, Ordering::SeqCst); - tracker.await.unwrap()?; - res - } -} - -#[pin_project::pin_project] -#[derive(Debug)] -pub struct InstallProgressTracker { - #[pin] - inner: RW, - validating: bool, - progress: Arc, -} -impl InstallProgressTracker { - pub fn new(inner: RW, progress: Arc) -> Self { - InstallProgressTracker { - inner, - validating: true, - progress, - } - } - pub fn validated(&mut self) { - self.progress - .validation_complete - .store(true, Ordering::SeqCst); - self.validating = false; - } -} -impl AsyncWrite for InstallProgressTracker { - fn poll_write( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - buf: &[u8], - ) -> Poll> { - let this = self.project(); - match this.inner.poll_write(cx, buf) { - Poll::Ready(Ok(n)) => { - this.progress - .downloaded - .fetch_add(n as u64, Ordering::SeqCst); - Poll::Ready(Ok(n)) - } - a => a, - } - } - fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - let this = self.project(); - this.inner.poll_flush(cx) - } - fn poll_shutdown( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - ) -> Poll> { - let this = self.project(); - this.inner.poll_shutdown(cx) - } - fn poll_write_vectored( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - bufs: &[std::io::IoSlice<'_>], - ) -> Poll> { - let this = self.project(); - match this.inner.poll_write_vectored(cx, bufs) { - Poll::Ready(Ok(n)) => { - this.progress - .downloaded - .fetch_add(n as u64, Ordering::SeqCst); - Poll::Ready(Ok(n)) - } - a => a, - } - } -} -impl AsyncRead for InstallProgressTracker { - fn poll_read( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - buf: &mut tokio::io::ReadBuf<'_>, - ) -> Poll> { - let this = self.project(); - let prev = buf.filled().len() as u64; - match this.inner.poll_read(cx, buf) { - Poll::Ready(Ok(())) => { - if *this.validating { - &this.progress.validated - } else { - &this.progress.unpacked - } - .fetch_add(buf.filled().len() as u64 - prev, Ordering::SeqCst); - - Poll::Ready(Ok(())) - } - a => a, - } - } -} -impl AsyncSeek for InstallProgressTracker { - fn start_seek(self: Pin<&mut Self>, position: SeekFrom) -> std::io::Result<()> { - let this = self.project(); - this.inner.start_seek(position) - } - fn poll_complete(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - let this = self.project(); - match this.inner.poll_complete(cx) { - Poll::Ready(Ok(n)) => { - if *this.validating { - &this.progress.validated - } else { - &this.progress.unpacked - } - .store(n, Ordering::SeqCst); - Poll::Ready(Ok(n)) - } - a => a, - } - } -} diff --git a/core/startos/src/install/update.rs b/core/startos/src/install/update.rs index 694051213..a0374fc80 100644 --- a/core/startos/src/install/update.rs +++ b/core/startos/src/install/update.rs @@ -1,5 +1,6 @@ use std::collections::BTreeMap; +use models::PackageId; use rpc_toolkit::command; use tracing::instrument; @@ -7,7 +8,6 @@ use crate::config::not_found; use crate::context::RpcContext; use crate::db::model::CurrentDependents; use crate::prelude::*; -use crate::s9pk::manifest::PackageId; use crate::util::serde::display_serializable; use crate::util::Version; use crate::Error; diff --git a/core/startos/src/lib.rs b/core/startos/src/lib.rs index 5fde6513f..35b373e91 100644 --- a/core/startos/src/lib.rs +++ b/core/startos/src/lib.rs @@ -38,20 +38,20 @@ pub mod error; pub mod firmware; pub mod hostname; pub mod init; -pub mod inspect; +pub mod progress; +// pub mod inspect; pub mod install; pub mod logs; -pub mod manager; +pub mod lxc; pub mod middleware; -pub mod migration; pub mod net; pub mod notifications; pub mod os_install; pub mod prelude; -pub mod procedure; pub mod properties; pub mod registry; pub mod s9pk; +pub mod service; pub mod setup; pub mod shutdown; pub mod sound; @@ -59,100 +59,217 @@ pub mod ssh; pub mod status; pub mod system; pub mod update; +pub mod upload; pub mod util; pub mod version; pub mod volume; use std::time::SystemTime; +use clap::Parser; pub use config::Config; pub use error::{Error, ErrorKind, ResultExt}; -use rpc_toolkit::command; +use imbl_value::Value; use rpc_toolkit::yajrc::RpcError; +use rpc_toolkit::{ + command, from_fn, from_fn_async, from_fn_blocking, AnyContext, HandlerExt, ParentHandler, +}; +use serde::{Deserialize, Serialize}; -#[command(metadata(authenticated = false))] -pub fn echo(#[arg] message: String) -> Result { - Ok(message) +use crate::context::CliContext; +use crate::util::serde::HandlerExtSerde; + +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct EchoParams { + message: String, } -#[command(subcommands( - version::git_info, - echo, - inspect::inspect, - server, - package, - net::net, - auth::auth, - db::db, - ssh::ssh, - net::wifi::wifi, - disk::disk, - notifications::notification, - backup::backup, - registry::marketplace::marketplace, -))] -pub fn main_api() -> Result<(), RpcError> { - Ok(()) +pub fn echo(_: AnyContext, EchoParams { message }: EchoParams) -> Result { + Ok(message) } -#[command(subcommands( - system::time, - system::experimental, - system::logs, - system::kernel_logs, - system::metrics, - shutdown::shutdown, - shutdown::restart, - shutdown::rebuild, - update::update_system, - firmware::update_firmware, -))] -pub fn server() -> Result<(), RpcError> { - Ok(()) +pub fn main_api() -> ParentHandler { + ParentHandler::new() + .subcommand("git-info", from_fn(version::git_info)) + .subcommand( + "echo", + from_fn(echo) + .with_metadata("authenticated", Value::Bool(false)) + .with_remote_cli::(), + ) + .subcommand("init", from_fn_blocking(developer::init).no_display()) + .subcommand("server", server()) + .subcommand("package", package()) + .subcommand("net", net::net()) + .subcommand("auth", auth::auth()) + .subcommand("db", db::db()) + .subcommand("ssh", ssh::ssh()) + .subcommand("wifi", net::wifi::wifi()) + .subcommand("disk", disk::disk()) + .subcommand("notification", notifications::notification()) + .subcommand("backup", backup::backup()) + .subcommand("marketplace", registry::marketplace::marketplace()) + .subcommand("lxc", lxc::lxc()) + .subcommand("s9pk", s9pk::rpc::s9pk()) } -#[command(subcommands( - action::action, - install::install, - install::sideload, - install::uninstall, - install::list, - config::config, - control::start, - control::stop, - control::restart, - logs::logs, - properties::properties, - dependencies::dependency, - backup::package_backup, -))] -pub fn package() -> Result<(), RpcError> { - Ok(()) +pub fn server() -> ParentHandler { + ParentHandler::new() + .subcommand( + "time", + from_fn_async(system::time) + .with_display_serializable() + .with_custom_display_fn::(|handle, result| { + Ok(system::display_time(handle.params, result)) + }) + .with_remote_cli::(), + ) + .subcommand("experimental", system::experimental()) + .subcommand("logs", system::logs()) + .subcommand("kernel-logs", system::kernel_logs()) + .subcommand( + "metrics", + from_fn_async(system::metrics) + .with_display_serializable() + .with_remote_cli::(), + ) + .subcommand( + "shutdown", + from_fn_async(shutdown::shutdown) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "restart", + from_fn_async(shutdown::restart) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "rebuild", + from_fn_async(shutdown::rebuild) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "update", + from_fn_async(update::update_system) + .with_metadata("sync_db", Value::Bool(true)) + .with_custom_display_fn::(|handle, result| { + Ok(update::display_update_result(handle.params, result)) + }) + .with_remote_cli::(), + ) + .subcommand( + "update-firmware", + from_fn_async(firmware::update_firmware) + .with_custom_display_fn::(|_handle, result| { + Ok(firmware::display_firmware_update_result(result)) + }) + .with_remote_cli::(), + ) } -#[command(subcommands( - version::git_info, - s9pk::pack, - developer::verify, - developer::init, - inspect::inspect, - registry::admin::publish, -))] -pub fn portable_api() -> Result<(), RpcError> { - Ok(()) +pub fn package() -> ParentHandler { + ParentHandler::new() + .subcommand( + "action", + from_fn_async(action::action) + .with_display_serializable() + .with_custom_display_fn::(|handle, result| { + Ok(action::display_action_result(handle.params, result)) + }) + .with_remote_cli::(), + ) + .subcommand( + "install", + from_fn_async(install::install) + .with_metadata("sync_db", Value::Bool(true)) + .no_cli(), + ) + .subcommand("sideload", from_fn_async(install::sideload).no_cli()) + .subcommand("install", from_fn_async(install::cli_install).no_display()) + .subcommand( + "uninstall", + from_fn_async(install::uninstall) + .with_metadata("sync_db", Value::Bool(true)) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "list", + from_fn_async(install::list) + .with_display_serializable() + .with_remote_cli::(), + ) + .subcommand("config", config::config()) + .subcommand( + "start", + from_fn_async(control::start) + .with_metadata("sync_db", Value::Bool(true)) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "stop", + from_fn_async(control::stop) + .with_metadata("sync_db", Value::Bool(true)) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "restart", + from_fn_async(control::restart) + .with_metadata("sync_db", Value::Bool(true)) + .no_display() + .with_remote_cli::(), + ) + .subcommand("logs", logs::logs()) + .subcommand( + "properties", + from_fn_async(properties::properties) + .with_custom_display_fn::(|_handle, result| { + Ok(properties::display_properties(result)) + }) + .with_remote_cli::(), + ) + .subcommand("dependency", dependencies::dependency()) + .subcommand("package-backup", backup::backup()) + .subcommand("connect", from_fn_async(service::connect_rpc).no_cli()) + .subcommand( + "connect", + from_fn_async(service::connect_rpc_cli).no_display(), + ) } -#[command(subcommands(version::git_info, echo, diagnostic::diagnostic))] -pub fn diagnostic_api() -> Result<(), RpcError> { - Ok(()) +pub fn diagnostic_api() -> ParentHandler { + ParentHandler::new() + .subcommand( + "git-info", + from_fn(version::git_info).with_metadata("authenticated", Value::Bool(false)), + ) + .subcommand("echo", from_fn(echo).with_remote_cli::()) + .subcommand("diagnostic", diagnostic::diagnostic()) } -#[command(subcommands(version::git_info, echo, setup::setup))] -pub fn setup_api() -> Result<(), RpcError> { - Ok(()) +pub fn setup_api() -> ParentHandler { + ParentHandler::new() + .subcommand( + "git-info", + from_fn(version::git_info).with_metadata("authenticated", Value::Bool(false)), + ) + .subcommand("echo", from_fn(echo).with_remote_cli::()) + .subcommand("setup", setup::setup()) } -#[command(subcommands(version::git_info, echo, os_install::install))] -pub fn install_api() -> Result<(), RpcError> { - Ok(()) +pub fn install_api() -> ParentHandler { + ParentHandler::new() + .subcommand( + "git-info", + from_fn(version::git_info).with_metadata("authenticated", Value::Bool(false)), + ) + .subcommand("echo", from_fn(echo).with_remote_cli::()) + .subcommand("install", os_install::install()) } diff --git a/core/startos/src/logs.rs b/core/startos/src/logs.rs index 691ae09b9..0b7ef3c67 100644 --- a/core/startos/src/logs.rs +++ b/core/startos/src/logs.rs @@ -1,36 +1,28 @@ -use std::future::Future; -use std::marker::PhantomData; use std::ops::{Deref, DerefMut}; use std::process::Stdio; use std::time::{Duration, UNIX_EPOCH}; +use axum::extract::ws::{self, WebSocket}; use chrono::{DateTime, Utc}; +use clap::Parser; use color_eyre::eyre::eyre; use futures::stream::BoxStream; use futures::{FutureExt, SinkExt, Stream, StreamExt, TryStreamExt}; -use hyper::upgrade::Upgraded; -use hyper::Error as HyperError; -use rpc_toolkit::command; +use models::PackageId; use rpc_toolkit::yajrc::RpcError; +use rpc_toolkit::{command, from_fn_async, CallRemote, Empty, HandlerExt, ParentHandler}; use serde::{Deserialize, Serialize}; use tokio::io::{AsyncBufReadExt, BufReader}; use tokio::process::{Child, Command}; -use tokio::task::JoinError; use tokio_stream::wrappers::LinesStream; -use tokio_tungstenite::tungstenite::protocol::frame::coding::CloseCode; -use tokio_tungstenite::tungstenite::protocol::CloseFrame; use tokio_tungstenite::tungstenite::Message; -use tokio_tungstenite::WebSocketStream; use tracing::instrument; use crate::context::{CliContext, RpcContext}; use crate::core::rpc_continuations::{RequestGuid, RpcContinuation}; use crate::error::ResultExt; -use crate::procedure::docker::DockerProcedure; -use crate::s9pk::manifest::PackageId; -use crate::util::display_none; +use crate::prelude::*; use crate::util::serde::Reversible; -use crate::{Error, ErrorKind}; #[pin_project::pin_project] pub struct LogStream { @@ -65,21 +57,14 @@ impl Stream for LogStream { } #[instrument(skip_all)] -async fn ws_handler< - WSFut: Future, HyperError>, JoinError>>, ->( +async fn ws_handler( first_entry: Option, mut logs: LogStream, - ws_fut: WSFut, + mut stream: WebSocket, ) -> Result<(), Error> { - let mut stream = ws_fut - .await - .with_kind(crate::ErrorKind::Network)? - .with_kind(crate::ErrorKind::Unknown)?; - if let Some(first_entry) = first_entry { stream - .send(Message::Text( + .send(ws::Message::Text( serde_json::to_string(&first_entry).with_kind(ErrorKind::Serialization)?, )) .await @@ -94,7 +79,7 @@ async fn ws_handler< if let Some(entry) = entry { let (_, log_entry) = entry.log_entry()?; stream - .send(Message::Text( + .send(ws::Message::Text( serde_json::to_string(&log_entry).with_kind(ErrorKind::Serialization)?, )) .await @@ -104,12 +89,13 @@ async fn ws_handler< if !ws_closed { stream - .close(Some(CloseFrame { - code: CloseCode::Normal, + .send(ws::Message::Close(Some(ws::CloseFrame { + code: ws::close_code::NORMAL, reason: "Log Stream Finished".into(), - })) + }))) .await .with_kind(ErrorKind::Network)?; + drop(stream); } Ok(()) @@ -224,23 +210,52 @@ pub enum LogSource { pub const SYSTEM_UNIT: &str = "startd"; -#[command( - custom_cli(cli_logs(async, context(CliContext))), - subcommands(self(logs_nofollow(async)), logs_follow), - display(display_none) -)] -pub async fn logs( - #[arg] id: PackageId, - #[arg(short = 'l', long = "limit")] limit: Option, - #[arg(short = 'c', long = "cursor")] cursor: Option, - #[arg(short = 'B', long = "before", default)] before: bool, - #[arg(short = 'f', long = "follow", default)] follow: bool, -) -> Result<(PackageId, Option, Option, bool, bool), Error> { - Ok((id, limit, cursor, before, follow)) +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct LogsParam { + id: PackageId, + #[arg(short = 'l', long = "limit")] + limit: Option, + #[arg(short = 'c', long = "cursor")] + cursor: Option, + #[arg(short = 'B', long = "before")] + #[serde(default)] + before: bool, + #[arg(short = 'f', long = "follow")] + #[serde(default)] + follow: bool, +} + +pub fn logs() -> ParentHandler { + ParentHandler::::new() + .root_handler( + from_fn_async(cli_logs) + .no_display() + .with_inherited(|params, _| params), + ) + .root_handler( + from_fn_async(logs_follow) + .with_inherited(|params, _| params) + .no_cli(), + ) + .subcommand( + "follow", + from_fn_async(logs_follow) + .with_inherited(|params, _| params) + .no_cli(), + ) } pub async fn cli_logs( ctx: CliContext, - (id, limit, cursor, before, follow): (PackageId, Option, Option, bool, bool), + _: Empty, + LogsParam { + id, + limit, + cursor, + before, + follow, + }: LogsParam, ) -> Result<(), RpcError> { if follow { if cursor.is_some() { @@ -262,14 +277,21 @@ pub async fn cli_logs( } pub async fn logs_nofollow( _ctx: (), - (id, limit, cursor, before, _): (PackageId, Option, Option, bool, bool), + _: Empty, + LogsParam { + id, + limit, + cursor, + before, + .. + }: LogsParam, ) -> Result { fetch_logs(LogSource::Container(id), limit, cursor, before).await } -#[command(rpc_only, rename = "follow", display(display_none))] pub async fn logs_follow( - #[context] ctx: RpcContext, - #[parent_data] (id, limit, _, _, _): (PackageId, Option, Option, bool, bool), + ctx: RpcContext, + _: Empty, + LogsParam { id, limit, .. }: LogsParam, ) -> Result { follow_logs(ctx, LogSource::Container(id), limit).await } @@ -282,19 +304,18 @@ pub async fn cli_logs_generic_nofollow( cursor: Option, before: bool, ) -> Result<(), RpcError> { - let res = rpc_toolkit::command_helpers::call_remote( - ctx.clone(), - method, - serde_json::json!({ - "id": id, - "limit": limit, - "cursor": cursor, - "before": before, - }), - PhantomData::, - ) - .await? - .result?; + let res = from_value::( + ctx.call_remote( + method, + imbl_value::json!({ + "id": id, + "limit": limit, + "cursor": cursor, + "before": before, + }), + ) + .await?, + )?; for entry in res.entries.iter() { println!("{}", entry); @@ -309,36 +330,18 @@ pub async fn cli_logs_generic_follow( id: Option, limit: Option, ) -> Result<(), RpcError> { - let res = rpc_toolkit::command_helpers::call_remote( - ctx.clone(), - method, - serde_json::json!({ - "id": id, - "limit": limit, - }), - PhantomData::, - ) - .await? - .result?; - - let mut base_url = ctx.base_url.clone(); - let ws_scheme = match base_url.scheme() { - "https" => "wss", - "http" => "ws", - _ => { - return Err(Error::new( - eyre!("Cannot parse scheme from base URL"), - crate::ErrorKind::ParseUrl, - ) - .into()) - } - }; - base_url - .set_scheme(ws_scheme) - .map_err(|_| Error::new(eyre!("Cannot set URL scheme"), crate::ErrorKind::ParseUrl))?; - let (mut stream, _) = - // base_url is "http://127.0.0.1/", with a trailing slash, so we don't put a leading slash in this path: - tokio_tungstenite::connect_async(format!("{}ws/rpc/{}", base_url, res.guid)).await?; + let res = from_value::( + ctx.call_remote( + method, + imbl_value::json!({ + "id": id, + "limit": limit, + }), + ) + .await?, + )?; + + let mut stream = ctx.ws_continuation(res.guid).await?; while let Some(log) = stream.try_next().await? { if let Message::Text(log) = log { println!("{}", serde_json::from_str::(&log)?); @@ -376,15 +379,9 @@ pub async fn journalctl( } LogSource::Container(id) => { #[cfg(not(feature = "docker"))] - cmd.arg(format!( - "SYSLOG_IDENTIFIER={}", - DockerProcedure::container_name(&id, None) - )); + cmd.arg(format!("SYSLOG_IDENTIFIER={}.embassy", id)); #[cfg(feature = "docker")] - cmd.arg(format!( - "CONTAINER_NAME={}", - DockerProcedure::container_name(&id, None) - )); + cmd.arg(format!("CONTAINER_NAME={}.embassy", id)); } }; @@ -498,7 +495,16 @@ pub async fn follow_logs( ctx.add_continuation( guid.clone(), RpcContinuation::ws( - Box::new(move |ws_fut| ws_handler(first_entry, stream, ws_fut).boxed()), + Box::new(move |socket| { + ws_handler(first_entry, stream, socket) + .map(|x| match x { + Ok(_) => (), + Err(e) => { + tracing::error!("Error in log stream: {}", e); + } + }) + .boxed() + }), Duration::from_secs(30), ), ) diff --git a/core/startos/src/lxc/config.template b/core/startos/src/lxc/config.template new file mode 100644 index 000000000..a85b700e4 --- /dev/null +++ b/core/startos/src/lxc/config.template @@ -0,0 +1,19 @@ +# Distribution configuration +lxc.include = /usr/share/lxc/config/common.conf +lxc.include = /usr/share/lxc/config/userns.conf +lxc.arch = linux64 + +# Container specific configuration +lxc.apparmor.profile = generated +lxc.apparmor.allow_nesting = 1 +lxc.idmap = u 0 100000 65536 +lxc.idmap = g 0 100000 65536 +lxc.rootfs.path = dir:/var/lib/lxc/{guid}/rootfs +lxc.uts.name = {guid} + +# Network configuration +lxc.net.0.type = veth +lxc.net.0.link = lxcbr0 +lxc.net.0.flags = up + +lxc.rootfs.options = rshared diff --git a/core/startos/src/lxc/mod.rs b/core/startos/src/lxc/mod.rs new file mode 100644 index 000000000..136a8423b --- /dev/null +++ b/core/startos/src/lxc/mod.rs @@ -0,0 +1,536 @@ +use std::collections::BTreeSet; +use std::ops::Deref; +use std::path::Path; +use std::sync::{Arc, Weak}; +use std::time::Duration; + +use clap::Parser; +use futures::{AsyncWriteExt, FutureExt, StreamExt}; +use imbl_value::{InOMap, InternedString}; +use rpc_toolkit::yajrc::{RpcError, RpcResponse}; +use rpc_toolkit::{ + from_fn_async, AnyContext, CallRemoteHandler, GenericRpcMethod, Handler, HandlerArgs, + HandlerExt, ParentHandler, RpcRequest, +}; +use rustyline_async::{ReadlineEvent, SharedWriter}; +use serde::{Deserialize, Serialize}; +use tokio::fs::File; +use tokio::io::{AsyncBufReadExt, BufReader}; +use tokio::process::Command; +use tokio::sync::Mutex; +use tokio::time::Instant; + +use crate::context::{CliContext, RpcContext}; +use crate::core::rpc_continuations::{RequestGuid, RpcContinuation}; +use crate::disk::mount::filesystem::bind::Bind; +use crate::disk::mount::filesystem::block_dev::BlockDev; +use crate::disk::mount::filesystem::idmapped::IdMapped; +use crate::disk::mount::filesystem::overlayfs::OverlayGuard; +use crate::disk::mount::filesystem::ReadWrite; +use crate::disk::mount::guard::{GenericMountGuard, TmpMountGuard}; +use crate::disk::mount::util::unmount; +use crate::prelude::*; +use crate::util::rpc_client::UnixRpcClient; +use crate::util::{new_guid, Invoke}; + +const LXC_CONTAINER_DIR: &str = "/var/lib/lxc"; +const RPC_DIR: &str = "media/startos/rpc"; // must not be absolute path +pub const CONTAINER_RPC_SERVER_SOCKET: &str = "service.sock"; // must not be absolute path +pub const HOST_RPC_SERVER_SOCKET: &str = "host.sock"; // must not be absolute path + +pub struct LxcManager { + containers: Mutex>>, +} +impl LxcManager { + pub fn new() -> Self { + Self { + containers: Default::default(), + } + } + + pub async fn create(self: &Arc, config: LxcConfig) -> Result { + let container = LxcContainer::new(self, config).await?; + let mut guard = self.containers.lock().await; + *guard = std::mem::take(&mut *guard) + .into_iter() + .filter(|g| g.strong_count() > 0) + .chain(std::iter::once(Arc::downgrade(&container.guid))) + .collect(); + Ok(container) + } + + pub async fn gc(&self) -> Result<(), Error> { + let expected = BTreeSet::from_iter( + self.containers + .lock() + .await + .iter() + .filter_map(|g| g.upgrade()) + .map(|g| (&*g).clone()), + ); + for container in String::from_utf8( + Command::new("lxc-ls") + .arg("-1") + .invoke(ErrorKind::Lxc) + .await?, + )? + .lines() + .map(|s| s.trim()) + { + if !expected.contains(container) { + let rootfs_path = Path::new(LXC_CONTAINER_DIR).join(container).join("rootfs"); + if tokio::fs::metadata(&rootfs_path).await.is_ok() { + unmount(Path::new(LXC_CONTAINER_DIR).join(container).join("rootfs")).await?; + if tokio_stream::wrappers::ReadDirStream::new( + tokio::fs::read_dir(&rootfs_path).await?, + ) + .count() + .await + > 0 + { + return Err(Error::new( + eyre!("rootfs is not empty, refusing to delete"), + ErrorKind::InvalidRequest, + )); + } + } + Command::new("lxc-destroy") + .arg("--force") + .arg("--name") + .arg(container) + .invoke(ErrorKind::Lxc) + .await?; + } + } + Ok(()) + } +} + +pub struct LxcContainer { + manager: Weak, + rootfs: OverlayGuard, + guid: Arc, + rpc_bind: TmpMountGuard, + config: LxcConfig, + exited: bool, +} +impl LxcContainer { + async fn new(manager: &Arc, config: LxcConfig) -> Result { + let guid = new_guid(); + let container_dir = Path::new(LXC_CONTAINER_DIR).join(&*guid); + tokio::fs::create_dir_all(&container_dir).await?; + tokio::fs::write( + container_dir.join("config"), + format!(include_str!("./config.template"), guid = &*guid), + ) + .await?; + // TODO: append config + let rootfs_dir = container_dir.join("rootfs"); + tokio::fs::create_dir_all(&rootfs_dir).await?; + Command::new("chown") + .arg("100000:100000") + .arg(&rootfs_dir) + .invoke(ErrorKind::Filesystem) + .await?; + let rootfs = OverlayGuard::mount( + &IdMapped::new( + BlockDev::new("/usr/lib/startos/container-runtime/rootfs.squashfs"), + 0, + 100000, + 65536, + ), + &rootfs_dir, + ) + .await?; + tokio::fs::write(rootfs_dir.join("etc/hostname"), format!("{guid}\n")).await?; + Command::new("sed") + .arg("-i") + .arg(format!("s/LXC_NAME/{guid}/g")) + .arg(rootfs_dir.join("etc/hosts")) + .invoke(ErrorKind::Filesystem) + .await?; + Command::new("mount") + .arg("--make-rshared") + .arg(rootfs.path()) + .invoke(ErrorKind::Filesystem) + .await?; + let rpc_dir = rootfs_dir.join(RPC_DIR); + tokio::fs::create_dir_all(&rpc_dir).await?; + let rpc_bind = TmpMountGuard::mount(&Bind::new(rpc_dir), ReadWrite).await?; + Command::new("chown") + .arg("-R") + .arg("100000:100000") + .arg(rpc_bind.path()) + .invoke(ErrorKind::Filesystem) + .await?; + Command::new("lxc-start") + .arg("-d") + .arg("--name") + .arg(&*guid) + .invoke(ErrorKind::Lxc) + .await?; + Ok(Self { + manager: Arc::downgrade(manager), + rootfs, + guid: Arc::new(guid), + rpc_bind, + config, + exited: false, + }) + } + + pub fn rootfs_dir(&self) -> &Path { + self.rootfs.path() + } + + pub fn rpc_dir(&self) -> &Path { + self.rpc_bind.path() + } + + #[instrument(skip_all)] + pub async fn exit(mut self) -> Result<(), Error> { + self.rpc_bind.take().unmount().await?; + self.rootfs.take().unmount(true).await?; + let rootfs_path = self.rootfs_dir(); + let err_path = rootfs_path.join("var/log/containerRuntime.err"); + if tokio::fs::metadata(&err_path).await.is_ok() { + let mut lines = BufReader::new(File::open(&err_path).await?).lines(); + while let Some(line) = lines.next_line().await? { + let container = &**self.guid; + tracing::error!(container, "{}", line); + } + } + if tokio::fs::metadata(&rootfs_path).await.is_ok() { + if tokio_stream::wrappers::ReadDirStream::new(tokio::fs::read_dir(&rootfs_path).await?) + .count() + .await + > 0 + { + return Err(Error::new( + eyre!("rootfs is not empty, refusing to delete"), + ErrorKind::InvalidRequest, + )); + } + } + Command::new("lxc-destroy") + .arg("--force") + .arg("--name") + .arg(&**self.guid) + .invoke(ErrorKind::Lxc) + .await?; + + self.exited = true; + + Ok(()) + } + + pub async fn connect_rpc(&self, timeout: Option) -> Result { + let started = Instant::now(); + let sock_path = self.rpc_dir().join(CONTAINER_RPC_SERVER_SOCKET); + while tokio::fs::metadata(&sock_path).await.is_err() { + if timeout.map_or(false, |t| started.elapsed() > t) { + return Err(Error::new( + eyre!("timed out waiting for socket"), + ErrorKind::Timeout, + )); + } + tokio::time::sleep(Duration::from_millis(100)).await; + } + Ok(UnixRpcClient::new(sock_path)) + } +} +impl Drop for LxcContainer { + fn drop(&mut self) { + if !self.exited { + tracing::warn!( + "Container {} was ungracefully dropped. Cleaning up dangling containers...", + &**self.guid + ); + let rootfs = self.rootfs.take(); + let guid = std::mem::take(&mut self.guid); + if let Some(manager) = self.manager.upgrade() { + tokio::spawn(async move { + if let Err(e) = async { + let err_path = rootfs.path().join("var/log/containerRuntime.err"); + if tokio::fs::metadata(&err_path).await.is_ok() { + let mut lines = BufReader::new(File::open(&err_path).await?).lines(); + while let Some(line) = lines.next_line().await? { + let container = &**guid; + tracing::error!(container, "{}", line); + } + } + Ok::<_, Error>(()) + } + .await + { + tracing::error!("Error reading logs from crashed container: {e}"); + tracing::debug!("{e:?}") + } + rootfs.unmount(true).await.unwrap(); + drop(guid); + if let Err(e) = manager.gc().await { + tracing::error!("Error cleaning up dangling LXC containers: {e}"); + tracing::debug!("{e:?}") + } else { + tracing::info!("Successfully cleaned up dangling LXC containers"); + } + }); + } + } + } +} + +#[derive(Default, Serialize)] +pub struct LxcConfig {} + +pub fn lxc() -> ParentHandler { + ParentHandler::new() + .subcommand( + "create", + from_fn_async(create).with_remote_cli::(), + ) + .subcommand( + "list", + from_fn_async(list) + .with_custom_display_fn::(|_, res| { + use prettytable::*; + let mut table = table!([bc => "GUID"]); + for guid in res { + table.add_row(row![&*guid]); + } + table.printstd(); + Ok(()) + }) + .with_remote_cli::(), + ) + .subcommand( + "remove", + from_fn_async(remove) + .no_display() + .with_remote_cli::(), + ) + .subcommand("connect", from_fn_async(connect_rpc).no_cli()) + .subcommand("connect", from_fn_async(connect_rpc_cli).no_display()) +} + +pub async fn create(ctx: RpcContext) -> Result { + let container = ctx.lxc_manager.create(LxcConfig::default()).await?; + let guid = container.guid.deref().clone(); + ctx.dev.lxc.lock().await.insert(guid.clone(), container); + Ok(guid) +} + +pub async fn list(ctx: RpcContext) -> Result, Error> { + Ok(ctx.dev.lxc.lock().await.keys().cloned().collect()) +} + +#[derive(Deserialize, Serialize, Parser)] +pub struct RemoveParams { + pub guid: InternedString, +} + +pub async fn remove(ctx: RpcContext, RemoveParams { guid }: RemoveParams) -> Result<(), Error> { + if let Some(container) = ctx.dev.lxc.lock().await.remove(&guid) { + container.exit().await?; + } + Ok(()) +} + +#[derive(Deserialize, Serialize, Parser)] +pub struct ConnectParams { + pub guid: InternedString, +} + +pub async fn connect_rpc( + ctx: RpcContext, + ConnectParams { guid }: ConnectParams, +) -> Result { + connect( + &ctx, + ctx.dev.lxc.lock().await.get(&guid).ok_or_else(|| { + Error::new(eyre!("No container with guid: {guid}"), ErrorKind::NotFound) + })?, + ) + .await +} + +pub async fn connect(ctx: &RpcContext, container: &LxcContainer) -> Result { + use axum::extract::ws::Message; + + let rpc = container.connect_rpc(Some(Duration::from_secs(30))).await?; + let guid = RequestGuid::new(); + ctx.add_continuation( + guid.clone(), + RpcContinuation::ws( + Box::new(|mut ws| { + async move { + if let Err(e) = async { + loop { + match ws.next().await { + None => break, + Some(Ok(Message::Text(txt))) => { + let mut id = None; + let result = async { + let req: RpcRequest = + serde_json::from_str(&txt).map_err(|e| RpcError { + data: Some(serde_json::Value::String( + e.to_string(), + )), + ..rpc_toolkit::yajrc::PARSE_ERROR + })?; + id = req.id; + rpc.request(req.method, req.params).await + } + .await; + ws.send(Message::Text( + serde_json::to_string(&RpcResponse:: { + id, + result, + }) + .with_kind(ErrorKind::Serialization)?, + )) + .await + .with_kind(ErrorKind::Network)?; + } + Some(Ok(_)) => (), + Some(Err(e)) => { + return Err(Error::new(e, ErrorKind::Network)); + } + } + } + Ok::<_, Error>(()) + } + .await + { + tracing::error!("{e}"); + tracing::debug!("{e:?}"); + } + } + .boxed() + }), + Duration::from_secs(30), + ), + ) + .await; + Ok(guid) +} + +pub async fn connect_cli(ctx: &CliContext, guid: RequestGuid) -> Result<(), Error> { + use futures::SinkExt; + use tokio_tungstenite::tungstenite::Message; + + let mut ws = ctx.ws_continuation(guid).await?; + let (mut input, mut output) = + rustyline_async::Readline::new("> ".into()).with_kind(ErrorKind::Filesystem)?; + + async fn handle_message( + msg: Option>, + output: &mut SharedWriter, + ) -> Result { + match msg { + None => return Ok(true), + Some(Ok(Message::Text(txt))) => match serde_json::from_str::(&txt) { + Ok(RpcResponse { result: Ok(a), .. }) => { + output + .write_all( + (serde_json::to_string(&a).with_kind(ErrorKind::Serialization)? + "\n") + .as_bytes(), + ) + .await?; + } + Ok(RpcResponse { result: Err(e), .. }) => { + let e: Error = e.into(); + tracing::error!("{e}"); + tracing::debug!("{e:?}"); + } + Err(e) => { + tracing::error!("Error Parsing RPC response: {e}"); + tracing::debug!("{e:?}"); + } + }, + Some(Ok(_)) => (), + Some(Err(e)) => { + return Err(Error::new(e, ErrorKind::Network)); + } + }; + Ok(false) + } + + loop { + tokio::select! { + line = input.readline() => { + let line = line.with_kind(ErrorKind::Filesystem)?; + if let ReadlineEvent::Line(line) = line { + input.add_history_entry(line.clone()); + if serde_json::from_str::(&line).is_ok() { + ws.send(Message::Text(line)) + .await + .with_kind(ErrorKind::Network)?; + } else { + match shell_words::split(&line) { + Ok(command) => { + if let Some((method, rest)) = command.split_first() { + let mut params = InOMap::new(); + for arg in rest { + if let Some((name, value)) = arg.split_once("=") { + params.insert(InternedString::intern(name), if value.is_empty() { + Value::Null + } else if let Ok(v) = serde_json::from_str(value) { + v + } else { + Value::String(Arc::new(value.into())) + }); + } else { + tracing::error!("argument without a value: {arg}"); + tracing::debug!("help: set the value of {arg} with `{arg}=...`"); + continue; + } + } + ws.send(Message::Text(match serde_json::to_string(&RpcRequest { + id: None, + method: GenericRpcMethod::new(method.into()), + params: Value::Object(params), + }) { + Ok(a) => a, + Err(e) => { + tracing::error!("Error Serializing Request: {e}"); + tracing::debug!("{e:?}"); + continue; + } + })).await.with_kind(ErrorKind::Network)?; + if handle_message(ws.next().await, &mut output).await? { + break + } + } + } + Err(e) => { + tracing::error!("{e}"); + tracing::debug!("{e:?}"); + } + } + } + } else { + ws.send(Message::Close(None)).await.with_kind(ErrorKind::Network)?; + } + } + msg = ws.next() => { + if handle_message(msg, &mut output).await? { + break; + } + } + } + } + + Ok(()) +} + +pub async fn connect_rpc_cli( + handle_args: HandlerArgs, +) -> Result<(), Error> { + let ctx = handle_args.context.clone(); + let guid = CallRemoteHandler::::new(from_fn_async(connect_rpc)) + .handle_async(handle_args) + .await?; + + connect_cli(&ctx, guid).await +} diff --git a/core/startos/src/manager/health.rs b/core/startos/src/manager/health.rs deleted file mode 100644 index 30f18051a..000000000 --- a/core/startos/src/manager/health.rs +++ /dev/null @@ -1,56 +0,0 @@ -use models::OptionExt; -use tracing::instrument; - -use crate::context::RpcContext; -use crate::prelude::*; -use crate::s9pk::manifest::PackageId; -use crate::status::MainStatus; -use crate::Error; - -/// So, this is used for a service to run a health check cycle, go out and run the health checks, and store those in the db -#[instrument(skip_all)] -pub async fn check(ctx: &RpcContext, id: &PackageId) -> Result<(), Error> { - let (manifest, started) = { - let peeked = ctx.db.peek().await; - let pde = peeked - .as_package_data() - .as_idx(id) - .or_not_found(id)? - .expect_as_installed()?; - - let manifest = pde.as_installed().as_manifest().de()?; - - let started = pde.as_installed().as_status().as_main().de()?.started(); - - (manifest, started) - }; - - let health_results = if let Some(started) = started { - tracing::debug!("Checking health of {}", id); - manifest - .health_checks - .check_all(ctx, started, id, &manifest.version, &manifest.volumes) - .await? - } else { - return Ok(()); - }; - - ctx.db - .mutate(|v| { - let pde = v - .as_package_data_mut() - .as_idx_mut(id) - .or_not_found(id)? - .expect_as_installed_mut()?; - let status = pde.as_installed_mut().as_status_mut().as_main_mut(); - - if let MainStatus::Running { health: _, started } = status.de()? { - status.ser(&MainStatus::Running { - health: health_results.clone(), - started, - })?; - } - Ok(()) - }) - .await -} diff --git a/core/startos/src/manager/manager_container.rs b/core/startos/src/manager/manager_container.rs deleted file mode 100644 index 00937fc5c..000000000 --- a/core/startos/src/manager/manager_container.rs +++ /dev/null @@ -1,282 +0,0 @@ -use std::sync::Arc; -use std::time::Duration; - -use models::OptionExt; -use tokio::sync::watch; -use tokio::sync::watch::Sender; -use tracing::instrument; - -use super::start_stop::StartStop; -use super::{manager_seed, run_main, ManagerPersistentContainer, RunMainResult}; -use crate::prelude::*; -use crate::procedure::NoOutput; -use crate::s9pk::manifest::Manifest; -use crate::status::MainStatus; -use crate::util::NonDetachingJoinHandle; -use crate::Error; - -pub type ManageContainerOverride = Arc>>; - -pub type Override = MainStatus; - -pub struct OverrideGuard { - override_main_status: Option, -} -impl OverrideGuard { - pub fn drop(self) {} -} -impl Drop for OverrideGuard { - fn drop(&mut self) { - if let Some(override_main_status) = self.override_main_status.take() { - override_main_status.send_modify(|x| { - *x = None; - }); - } - } -} - -/// This is the thing describing the state machine actor for a service -/// state and current running/ desired states. -pub struct ManageContainer { - pub(super) current_state: Arc>, - pub(super) desired_state: Arc>, - _service: NonDetachingJoinHandle<()>, - _save_state: NonDetachingJoinHandle<()>, - override_main_status: ManageContainerOverride, -} - -impl ManageContainer { - pub async fn new( - seed: Arc, - persistent_container: ManagerPersistentContainer, - ) -> Result { - let current_state = Arc::new(watch::channel(StartStop::Stop).0); - let desired_state = Arc::new( - watch::channel::( - get_status(seed.ctx.db.peek().await, &seed.manifest).into(), - ) - .0, - ); - let override_main_status: ManageContainerOverride = Arc::new(watch::channel(None).0); - let service = tokio::spawn(create_service_manager( - desired_state.clone(), - seed.clone(), - current_state.clone(), - persistent_container, - )) - .into(); - let save_state = tokio::spawn(save_state( - desired_state.clone(), - current_state.clone(), - override_main_status.clone(), - seed.clone(), - )) - .into(); - Ok(ManageContainer { - current_state, - desired_state, - _service: service, - override_main_status, - _save_state: save_state, - }) - } - - /// Set override is used during something like a restart of a service. We want to show certain statuses be different - /// from the actual status of the service. - pub fn set_override(&self, override_status: Override) -> Result { - let status = Some(override_status); - if self.override_main_status.borrow().is_some() { - return Err(Error::new( - eyre!("Already have an override"), - ErrorKind::InvalidRequest, - )); - } - self.override_main_status - .send_modify(|x| *x = status.clone()); - Ok(OverrideGuard { - override_main_status: Some(self.override_main_status.clone()), - }) - } - - /// Set the override, but don't have a guard to revert it. Used only on the mananger to do a shutdown. - pub(super) async fn lock_state_forever( - &self, - seed: &manager_seed::ManagerSeed, - ) -> Result<(), Error> { - let current_state = get_status(seed.ctx.db.peek().await, &seed.manifest); - self.override_main_status - .send_modify(|x| *x = Some(current_state)); - Ok(()) - } - - /// We want to set the state of the service, like to start or stop - pub fn to_desired(&self, new_state: StartStop) { - self.desired_state.send_modify(|x| *x = new_state); - } - - /// This is a tool to say wait for the service to be in a certain state. - pub async fn wait_for_desired(&self, new_state: StartStop) { - let mut current_state = self.current_state(); - self.to_desired(new_state); - while *current_state.borrow() != new_state { - current_state.changed().await.unwrap_or_default(); - } - } - - /// Getter - pub fn current_state(&self) -> watch::Receiver { - self.current_state.subscribe() - } - - /// Getter - pub fn desired_state(&self) -> watch::Receiver { - self.desired_state.subscribe() - } -} - -async fn create_service_manager( - desired_state: Arc>, - seed: Arc, - current_state: Arc>, - persistent_container: Arc, -) { - let mut desired_state_receiver = desired_state.subscribe(); - let mut running_service: Option> = None; - let seed = seed.clone(); - loop { - let current: StartStop = *current_state.borrow(); - let desired: StartStop = *desired_state_receiver.borrow(); - match (current, desired) { - (StartStop::Start, StartStop::Start) => (), - (StartStop::Start, StartStop::Stop) => { - if let Err(err) = seed.stop_container().await { - tracing::error!("Could not stop container"); - tracing::debug!("{:?}", err) - } - running_service = None; - - current_state.send_modify(|x| *x = StartStop::Stop); - } - (StartStop::Stop, StartStop::Start) => starting_service( - current_state.clone(), - desired_state.clone(), - seed.clone(), - persistent_container.clone(), - &mut running_service, - ), - (StartStop::Stop, StartStop::Stop) => (), - } - - if desired_state_receiver.changed().await.is_err() { - tracing::error!("Desired state error"); - break; - } - } -} - -async fn save_state( - desired_state: Arc>, - current_state: Arc>, - override_main_status: ManageContainerOverride, - seed: Arc, -) { - let mut desired_state_receiver = desired_state.subscribe(); - let mut current_state_receiver = current_state.subscribe(); - let mut override_main_status_receiver = override_main_status.subscribe(); - loop { - let current: StartStop = *current_state_receiver.borrow(); - let desired: StartStop = *desired_state_receiver.borrow(); - let override_status = override_main_status_receiver.borrow().clone(); - let status = match (override_status.clone(), current, desired) { - (Some(status), _, _) => status, - (_, StartStop::Start, StartStop::Start) => MainStatus::Running { - started: chrono::Utc::now(), - health: Default::default(), - }, - (_, StartStop::Start, StartStop::Stop) => MainStatus::Stopping, - (_, StartStop::Stop, StartStop::Start) => MainStatus::Starting, - (_, StartStop::Stop, StartStop::Stop) => MainStatus::Stopped, - }; - - let manifest = &seed.manifest; - if let Err(err) = seed - .ctx - .db - .mutate(|db| set_status(db, manifest, &status)) - .await - { - tracing::error!("Did not set status for {}", seed.container_name); - tracing::debug!("{:?}", err); - } - tokio::select! { - _ = desired_state_receiver.changed() =>{}, - _ = current_state_receiver.changed() => {}, - _ = override_main_status_receiver.changed() => {} - } - } -} - -fn starting_service( - current_state: Arc>, - desired_state: Arc>, - seed: Arc, - persistent_container: ManagerPersistentContainer, - running_service: &mut Option>, -) { - let set_stopped = { move || current_state.send_modify(|x| *x = StartStop::Stop) }; - let running_main_loop = async move { - while desired_state.borrow().is_start() { - let result = persistent_container - .execute(models::ProcedureName::Main, Value::Null, None) - .await; - - run_main(seed.clone()).await; - set_stopped(); - run_main_log_result(result, seed.clone()).await; - } - }; - *running_service = Some(tokio::spawn(running_main_loop).into()); -} - -async fn run_main_log_result(result: RunMainResult, seed: Arc) { - match result { - Ok(Ok(NoOutput)) => (), // restart - Ok(Err(e)) => { - tracing::error!( - "The service {} has crashed with the following exit code: {}", - seed.manifest.id.clone(), - e.0 - ); - - tokio::time::sleep(Duration::from_secs(15)).await; - } - Err(e) => { - tracing::error!("failed to start service: {}", e); - tracing::debug!("{:?}", e); - } - } -} - -/// Used only in the mod where we are doing a backup -#[instrument(skip(db, manifest))] -pub(super) fn get_status(db: Peeked, manifest: &Manifest) -> MainStatus { - db.as_package_data() - .as_idx(&manifest.id) - .and_then(|x| x.as_installed()) - .filter(|x| x.as_manifest().as_version().de().ok() == Some(manifest.version.clone())) - .and_then(|x| x.as_status().as_main().de().ok()) - .unwrap_or(MainStatus::Stopped) -} - -#[instrument(skip(db, manifest))] -fn set_status(db: &mut Peeked, manifest: &Manifest, main_status: &MainStatus) -> Result<(), Error> { - let Some(installed) = db - .as_package_data_mut() - .as_idx_mut(&manifest.id) - .or_not_found(&manifest.id)? - .as_installed_mut() - else { - return Ok(()); - }; - installed.as_status_mut().as_main_mut().ser(main_status) -} diff --git a/core/startos/src/manager/manager_map.rs b/core/startos/src/manager/manager_map.rs deleted file mode 100644 index 07f128ccd..000000000 --- a/core/startos/src/manager/manager_map.rs +++ /dev/null @@ -1,96 +0,0 @@ -use std::collections::BTreeMap; -use std::sync::Arc; - -use color_eyre::eyre::eyre; -use tokio::sync::RwLock; -use tracing::instrument; - -use super::Manager; -use crate::context::RpcContext; -use crate::prelude::*; -use crate::s9pk::manifest::{Manifest, PackageId}; -use crate::util::Version; -use crate::Error; - -/// This is the structure to contain all the service managers -#[derive(Default)] -pub struct ManagerMap(RwLock>>); -impl ManagerMap { - #[instrument(skip_all)] - pub async fn init(&self, ctx: RpcContext, peeked: Peeked) -> Result<(), Error> { - let mut res = BTreeMap::new(); - for package in peeked.as_package_data().keys()? { - let man: Manifest = if let Some(manifest) = peeked - .as_package_data() - .as_idx(&package) - .and_then(|x| x.as_installed()) - .map(|x| x.as_manifest().de()) - { - manifest? - } else { - continue; - }; - - res.insert( - (package, man.version.clone()), - Arc::new(Manager::new(ctx.clone(), man).await?), - ); - } - *self.0.write().await = res; - Ok(()) - } - - /// Used during the install process - #[instrument(skip_all)] - pub async fn add(&self, ctx: RpcContext, manifest: Manifest) -> Result, Error> { - let mut lock = self.0.write().await; - let id = (manifest.id.clone(), manifest.version.clone()); - if let Some(man) = lock.remove(&id) { - man.exit().await; - } - let manager = Arc::new(Manager::new(ctx.clone(), manifest).await?); - lock.insert(id, manager.clone()); - Ok(manager) - } - - /// This is ran during the cleanup, so when we are uninstalling the service - #[instrument(skip_all)] - pub async fn remove(&self, id: &(PackageId, Version)) { - if let Some(man) = self.0.write().await.remove(id) { - man.exit().await; - } - } - - /// Used during a shutdown - #[instrument(skip_all)] - pub async fn empty(&self) -> Result<(), Error> { - let res = - futures::future::join_all(std::mem::take(&mut *self.0.write().await).into_iter().map( - |((id, version), man)| async move { - tracing::debug!("Manager for {}@{} shutting down", id, version); - man.shutdown().await?; - tracing::debug!("Manager for {}@{} is shutdown", id, version); - if let Err(e) = Arc::try_unwrap(man) { - tracing::trace!( - "Manager for {}@{} still has {} other open references", - id, - version, - Arc::strong_count(&e) - 1 - ); - } - Ok::<_, Error>(()) - }, - )) - .await; - res.into_iter().fold(Ok(()), |res, x| match (res, x) { - (Ok(()), x) => x, - (Err(e), Ok(())) => Err(e), - (Err(e1), Err(e2)) => Err(Error::new(eyre!("{}, {}", e1.source, e2.source), e1.kind)), - }) - } - - #[instrument(skip_all)] - pub async fn get(&self, id: &(PackageId, Version)) -> Option> { - self.0.read().await.get(id).cloned() - } -} diff --git a/core/startos/src/manager/manager_seed.rs b/core/startos/src/manager/manager_seed.rs deleted file mode 100644 index f90e7739f..000000000 --- a/core/startos/src/manager/manager_seed.rs +++ /dev/null @@ -1,37 +0,0 @@ -use models::ErrorKind; - -use crate::context::RpcContext; -use crate::procedure::docker::DockerProcedure; -use crate::procedure::PackageProcedure; -use crate::s9pk::manifest::Manifest; -use crate::util::docker::stop_container; -use crate::Error; - -/// This is helper structure for a service, the seed of the data that is needed for the manager_container -pub struct ManagerSeed { - pub ctx: RpcContext, - pub manifest: Manifest, - pub container_name: String, -} - -impl ManagerSeed { - pub async fn stop_container(&self) -> Result<(), Error> { - match stop_container( - &self.container_name, - match &self.manifest.main { - PackageProcedure::Docker(DockerProcedure { - sigterm_timeout: Some(sigterm_timeout), - .. - }) => Some(**sigterm_timeout), - _ => None, - }, - None, - ) - .await - { - Err(e) if e.kind == ErrorKind::NotFound => (), // Already stopped - a => a?, - } - Ok(()) - } -} diff --git a/core/startos/src/manager/mod.rs b/core/startos/src/manager/mod.rs deleted file mode 100644 index 817b76e54..000000000 --- a/core/startos/src/manager/mod.rs +++ /dev/null @@ -1,854 +0,0 @@ -use std::collections::{BTreeMap, BTreeSet}; -use std::net::Ipv4Addr; -use std::sync::Arc; -use std::task::Poll; -use std::time::Duration; - -use color_eyre::eyre::eyre; -use container_init::ProcessGroupId; -use futures::future::BoxFuture; -use futures::{Future, FutureExt, TryFutureExt}; -use helpers::UnixRpcClient; -use models::{ErrorKind, OptionExt, PackageId}; -use nix::sys::signal::Signal; -use persistent_container::PersistentContainer; -use rand::SeedableRng; -use serde::de::DeserializeOwned; -use sqlx::Connection; -use start_stop::StartStop; -use tokio::sync::watch::{self, Sender}; -use tokio::sync::{oneshot, Mutex}; -use tracing::instrument; -use transition_state::TransitionState; - -use crate::backup::target::PackageBackupInfo; -use crate::backup::PackageBackupReport; -use crate::config::action::ConfigRes; -use crate::config::spec::ValueSpecPointer; -use crate::config::ConfigureContext; -use crate::context::RpcContext; -use crate::db::model::{CurrentDependencies, CurrentDependencyInfo}; -use crate::dependencies::{ - add_dependent_to_current_dependents_lists, compute_dependency_config_errs, -}; -use crate::disk::mount::backup::BackupMountGuard; -use crate::disk::mount::guard::TmpMountGuard; -use crate::install::cleanup::remove_from_current_dependents_lists; -use crate::net::net_controller::NetService; -use crate::net::vhost::AlpnInfo; -use crate::prelude::*; -use crate::procedure::docker::{DockerContainer, DockerProcedure, LongRunning}; -use crate::procedure::{NoOutput, ProcedureName}; -use crate::s9pk::manifest::Manifest; -use crate::status::MainStatus; -use crate::util::docker::get_container_ip; -use crate::util::NonDetachingJoinHandle; -use crate::volume::Volume; -use crate::Error; - -pub mod health; -mod manager_container; -mod manager_map; -pub mod manager_seed; -mod persistent_container; -mod start_stop; -mod transition_state; - -pub use manager_map::ManagerMap; - -use self::manager_container::{get_status, ManageContainer}; -use self::manager_seed::ManagerSeed; - -pub const HEALTH_CHECK_COOLDOWN_SECONDS: u64 = 15; -pub const HEALTH_CHECK_GRACE_PERIOD_SECONDS: u64 = 5; - -type ManagerPersistentContainer = Arc; -type BackupGuard = Arc>>; -pub enum BackupReturn { - Error(Error), - AlreadyRunning(PackageBackupReport), - Ran { - report: PackageBackupReport, - res: Result, - }, -} - -pub struct Gid { - next_gid: (watch::Sender, watch::Receiver), - main_gid: ( - watch::Sender, - watch::Receiver, - ), -} - -impl Default for Gid { - fn default() -> Self { - Self { - next_gid: watch::channel(1), - main_gid: watch::channel(ProcessGroupId(1)), - } - } -} -impl Gid { - pub fn new_gid(&self) -> ProcessGroupId { - let mut previous = 0; - self.next_gid.0.send_modify(|x| { - previous = *x; - *x = previous + 1; - }); - ProcessGroupId(previous) - } - - pub fn new_main_gid(&self) -> ProcessGroupId { - let gid = self.new_gid(); - self.main_gid.0.send(gid).unwrap_or_default(); - gid - } -} - -/// This is the controller of the services. Here is where we can control a service with a start, stop, restart, etc. -#[derive(Clone)] -pub struct Manager { - seed: Arc, - - manage_container: Arc, - transition: Arc>, - persistent_container: ManagerPersistentContainer, - - pub gid: Arc, -} -impl Manager { - pub async fn new(ctx: RpcContext, manifest: Manifest) -> Result { - let seed = Arc::new(ManagerSeed { - ctx, - container_name: DockerProcedure::container_name(&manifest.id, None), - manifest, - }); - - let persistent_container = Arc::new(PersistentContainer::init(&seed).await?); - let manage_container = Arc::new( - manager_container::ManageContainer::new(seed.clone(), persistent_container.clone()) - .await?, - ); - let (transition, _) = watch::channel(Default::default()); - let transition = Arc::new(transition); - Ok(Self { - seed, - manage_container, - transition, - persistent_container, - gid: Default::default(), - }) - } - - /// awaiting this does not wait for the start to complete - pub async fn start(&self) { - if self._is_transition_restart() { - return; - } - self._transition_abort().await; - self.manage_container.to_desired(StartStop::Start); - } - - /// awaiting this does not wait for the stop to complete - pub async fn stop(&self) { - self._transition_abort().await; - self.manage_container.to_desired(StartStop::Stop); - } - /// awaiting this does not wait for the restart to complete - pub async fn restart(&self) { - if self._is_transition_restart() - && *self.manage_container.desired_state().borrow() == StartStop::Stop - { - return; - } - if self.manage_container.desired_state().borrow().is_start() { - self._transition_replace(self._transition_restart()).await; - } - } - /// awaiting this does not wait for the restart to complete - pub async fn configure( - &self, - configure_context: ConfigureContext, - ) -> Result, Error> { - if self._is_transition_restart() { - self._transition_abort().await; - } else if self._is_transition_backup() { - return Err(Error::new( - eyre!("Can't configure because service is backing up"), - ErrorKind::InvalidRequest, - )); - } - let context = self.seed.ctx.clone(); - let id = self.seed.manifest.id.clone(); - - let breakages = configure(context, id, configure_context).await?; - - self.restart().await; - - Ok(breakages) - } - - /// awaiting this does not wait for the backup to complete - pub async fn backup(&self, backup_guard: BackupGuard) -> BackupReturn { - if self._is_transition_backup() { - return BackupReturn::AlreadyRunning(PackageBackupReport { - error: Some("Can't do backup because service is already backing up".to_owned()), - }); - } - let (transition_state, done) = self._transition_backup(backup_guard); - self._transition_replace(transition_state).await; - done.await - } - pub async fn exit(&self) { - self._transition_abort().await; - self.manage_container - .wait_for_desired(StartStop::Stop) - .await; - } - - /// A special exit that is overridden the start state, should only be called in the shutdown, where we remove other containers - async fn shutdown(&self) -> Result<(), Error> { - self.manage_container.lock_state_forever(&self.seed).await?; - - self.exit().await; - Ok(()) - } - - /// Used when we want to shutdown the service - pub async fn signal(&self, signal: Signal) -> Result<(), Error> { - let gid = self.gid.clone(); - send_signal(self, gid, signal).await - } - - /// Used as a getter, but also used in procedure - pub fn rpc_client(&self) -> Arc { - self.persistent_container.rpc_client() - } - - async fn _transition_abort(&self) { - self.transition - .send_replace(Default::default()) - .abort() - .await; - } - async fn _transition_replace(&self, transition_state: TransitionState) { - self.transition.send_replace(transition_state).abort().await; - } - - pub(super) fn perform_restart(&self) -> impl Future> + 'static { - let manage_container = self.manage_container.clone(); - async move { - let restart_override = manage_container.set_override(MainStatus::Restarting)?; - manage_container.wait_for_desired(StartStop::Stop).await; - manage_container.wait_for_desired(StartStop::Start).await; - restart_override.drop(); - Ok(()) - } - } - fn _transition_restart(&self) -> TransitionState { - let transition = self.transition.clone(); - let restart = self.perform_restart(); - TransitionState::Restarting( - tokio::spawn(async move { - if let Err(err) = restart.await { - tracing::error!("Error restarting service: {}", err); - } - transition.send_replace(Default::default()); - }) - .into(), - ) - } - fn perform_backup( - &self, - backup_guard: BackupGuard, - ) -> impl Future, Error>> { - let manage_container = self.manage_container.clone(); - let seed = self.seed.clone(); - async move { - let peek = seed.ctx.db.peek().await; - let state_reverter = DesiredStateReverter::new(manage_container.clone()); - let override_guard = - manage_container.set_override(get_status(peek, &seed.manifest).backing_up())?; - manage_container.wait_for_desired(StartStop::Stop).await; - let backup_guard = backup_guard.lock().await; - let guard = backup_guard.mount_package_backup(&seed.manifest.id).await?; - - let return_value = seed.manifest.backup.create(seed.clone()).await; - guard.unmount().await?; - drop(backup_guard); - - let manifest_id = seed.manifest.id.clone(); - seed.ctx - .db - .mutate(|db| { - if let Some(progress) = db - .as_server_info_mut() - .as_status_info_mut() - .as_backup_progress_mut() - .transpose_mut() - .and_then(|p| p.as_idx_mut(&manifest_id)) - { - progress.as_complete_mut().ser(&true)?; - } - Ok(()) - }) - .await?; - - state_reverter.revert().await; - - override_guard.drop(); - Ok::<_, Error>(return_value) - } - } - fn _transition_backup( - &self, - backup_guard: BackupGuard, - ) -> (TransitionState, BoxFuture) { - let (send, done) = oneshot::channel(); - - let transition_state = self.transition.clone(); - ( - TransitionState::BackingUp( - tokio::spawn( - self.perform_backup(backup_guard) - .then(finish_up_backup_task(transition_state, send)), - ) - .into(), - ), - done.map_err(|err| Error::new(eyre!("Oneshot error: {err:?}"), ErrorKind::Unknown)) - .map(flatten_backup_error) - .boxed(), - ) - } - fn _is_transition_restart(&self) -> bool { - let transition = self.transition.borrow(); - matches!(*transition, TransitionState::Restarting(_)) - } - fn _is_transition_backup(&self) -> bool { - let transition = self.transition.borrow(); - matches!(*transition, TransitionState::BackingUp(_)) - } - - pub async fn execute( - &self, - name: ProcedureName, - input: Value, - timeout: Option, - ) -> Result, Error> - where - O: DeserializeOwned, - { - self.persistent_container - .execute(name, input, timeout) - .await - } - - pub async fn sanboxed( - &self, - name: ProcedureName, - input: Value, - timeout: Option, - ) -> Result, Error> - where - O: DeserializeOwned, - { - self.persistent_container - .sanboxed(name, input, timeout) - .await - } - - pub async fn send_signal(&self, gid: Arc, signal: Signal) -> Result<(), Error> { - self.persistent_container.send_signal(gid, signal).await - } -} - -#[instrument(skip_all)] -async fn configure( - ctx: RpcContext, - id: PackageId, - mut configure_context: ConfigureContext, -) -> Result, Error> { - let db = ctx.db.peek().await; - let id = &id; - let ctx = &ctx; - let overrides = &mut configure_context.overrides; - // fetch data from db - let manifest = db - .as_package_data() - .as_idx(id) - .or_not_found(id)? - .as_manifest() - .de()?; - - // get current config and current spec - let ConfigRes { - config: old_config, - spec, - } = manifest - .config - .as_ref() - .or_not_found("Manifest config")? - .get(ctx, id, &manifest.version, &manifest.volumes) - .await?; - - // determine new config to use - let mut config = if let Some(config) = configure_context.config.or_else(|| old_config.clone()) { - config - } else { - spec.gen( - &mut rand::rngs::StdRng::from_entropy(), - &configure_context.timeout, - )? - }; - - spec.validate(&manifest)?; - spec.matches(&config)?; // check that new config matches spec - - // TODO Commit or not? - spec.update(ctx, &manifest, overrides, &mut config).await?; // dereference pointers in the new config - - let manifest = db - .as_package_data() - .as_idx(id) - .or_not_found(id)? - .as_installed() - .or_not_found(id)? - .as_manifest() - .de()?; - - let dependencies = &manifest.dependencies; - let mut current_dependencies: CurrentDependencies = CurrentDependencies( - dependencies - .0 - .iter() - .filter_map(|(id, info)| { - if info.requirement.required() { - Some((id.clone(), CurrentDependencyInfo::default())) - } else { - None - } - }) - .collect(), - ); - for ptr in spec.pointers(&config)? { - match ptr { - ValueSpecPointer::Package(pkg_ptr) => { - if let Some(info) = current_dependencies.0.get_mut(pkg_ptr.package_id()) { - info.pointers.insert(pkg_ptr); - } else { - let id = pkg_ptr.package_id().to_owned(); - let mut pointers = BTreeSet::new(); - pointers.insert(pkg_ptr); - current_dependencies.0.insert( - id, - CurrentDependencyInfo { - pointers, - health_checks: BTreeSet::new(), - }, - ); - } - } - ValueSpecPointer::System(_) => (), - } - } - - let action = manifest.config.as_ref().or_not_found(id)?; - let version = &manifest.version; - let volumes = &manifest.volumes; - if !configure_context.dry_run { - // run config action - let res = action - .set(ctx, id, version, dependencies, volumes, &config) - .await?; - - // track dependencies with no pointers - for (package_id, health_checks) in res.depends_on.into_iter() { - if let Some(current_dependency) = current_dependencies.0.get_mut(&package_id) { - current_dependency.health_checks.extend(health_checks); - } else { - current_dependencies.0.insert( - package_id, - CurrentDependencyInfo { - pointers: BTreeSet::new(), - health_checks, - }, - ); - } - } - - // track dependency health checks - current_dependencies = current_dependencies.map(|x| { - x.into_iter() - .filter(|(dep_id, _)| { - if dep_id != id && !manifest.dependencies.0.contains_key(dep_id) { - tracing::warn!("Illegal dependency specified: {}", dep_id); - false - } else { - true - } - }) - .collect() - }); - } - - let dependency_config_errs = - compute_dependency_config_errs(ctx, &db, &manifest, ¤t_dependencies, overrides) - .await?; - - // cache current config for dependents - configure_context - .overrides - .insert(id.clone(), config.clone()); - - // handle dependents - - let dependents = db - .as_package_data() - .as_idx(id) - .or_not_found(id)? - .as_installed() - .or_not_found(id)? - .as_current_dependents() - .de()?; - for (dependent, _dep_info) in dependents.0.iter().filter(|(dep_id, _)| dep_id != &id) { - // check if config passes dependent check - if let Some(cfg) = db - .as_package_data() - .as_idx(dependent) - .or_not_found(dependent)? - .as_installed() - .or_not_found(dependent)? - .as_manifest() - .as_dependencies() - .as_idx(id) - .or_not_found(id)? - .as_config() - .de()? - { - let manifest = db - .as_package_data() - .as_idx(dependent) - .or_not_found(dependent)? - .as_installed() - .or_not_found(dependent)? - .as_manifest() - .de()?; - if let Err(error) = cfg - .check( - ctx, - dependent, - &manifest.version, - &manifest.volumes, - id, - &config, - ) - .await? - { - configure_context.breakages.insert(dependent.clone(), error); - } - } - } - - if !configure_context.dry_run { - return ctx - .db - .mutate(move |db| { - remove_from_current_dependents_lists(db, id, ¤t_dependencies)?; - add_dependent_to_current_dependents_lists(db, id, ¤t_dependencies)?; - current_dependencies.0.remove(id); - for (dep, errs) in db - .as_package_data_mut() - .as_entries_mut()? - .into_iter() - .filter_map(|(id, pde)| { - pde.as_installed_mut() - .map(|i| (id, i.as_status_mut().as_dependency_config_errors_mut())) - }) - { - errs.remove(id)?; - if let Some(err) = configure_context.breakages.get(&dep) { - errs.insert(id, err)?; - } - } - let installed = db - .as_package_data_mut() - .as_idx_mut(id) - .or_not_found(id)? - .as_installed_mut() - .or_not_found(id)?; - installed - .as_current_dependencies_mut() - .ser(¤t_dependencies)?; - let status = installed.as_status_mut(); - status.as_configured_mut().ser(&true)?; - status - .as_dependency_config_errors_mut() - .ser(&dependency_config_errs)?; - Ok(configure_context.breakages) - }) - .await; // add new - } - - Ok(configure_context.breakages) -} - -struct DesiredStateReverter { - manage_container: Option>, - starting_state: StartStop, -} -impl DesiredStateReverter { - fn new(manage_container: Arc) -> Self { - let starting_state = *manage_container.desired_state().borrow(); - let manage_container = Some(manage_container); - Self { - starting_state, - manage_container, - } - } - async fn revert(mut self) { - if let Some(mut current_state) = self._revert() { - while *current_state.borrow() != self.starting_state { - current_state.changed().await.unwrap(); - } - } - } - fn _revert(&mut self) -> Option> { - if let Some(manage_container) = self.manage_container.take() { - manage_container.to_desired(self.starting_state); - - return Some(manage_container.desired_state()); - } - None - } -} -impl Drop for DesiredStateReverter { - fn drop(&mut self) { - self._revert(); - } -} - -type BackupDoneSender = oneshot::Sender>; - -fn finish_up_backup_task( - transition: Arc>, - send: BackupDoneSender, -) -> impl FnOnce(Result, Error>) -> BoxFuture<'static, ()> { - move |result| { - async move { - transition.send_replace(Default::default()); - send.send(match result { - Ok(a) => a, - Err(e) => Err(e), - }) - .unwrap_or_default(); - } - .boxed() - } -} - -fn response_to_report(response: &Result) -> PackageBackupReport { - PackageBackupReport { - error: response.as_ref().err().map(|e| e.to_string()), - } -} -fn flatten_backup_error(input: Result, Error>) -> BackupReturn { - match input { - Ok(a) => BackupReturn::Ran { - report: response_to_report(&a), - res: a, - }, - Err(err) => BackupReturn::Error(err), - } -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub enum Status { - Starting, - Running, - Stopped, - Paused, - Shutdown, -} - -#[derive(Debug, Clone, Copy)] -pub enum OnStop { - Restart, - Sleep, - Exit, -} - -type RunMainResult = Result, Error>; - -#[instrument(skip_all)] -async fn run_main(seed: Arc) -> RunMainResult { - let runtime = NonDetachingJoinHandle::from(tokio::spawn(execute_main(seed.clone()))); - - let health = main_health_check_daemon(seed.clone()); - let res = tokio::select! { - a = runtime => a.map_err(|_| Error::new(eyre!("Manager runtime panicked!"), crate::ErrorKind::Docker)).and_then(|a| a), - _ = health => Err(Error::new(eyre!("Health check daemon exited!"), crate::ErrorKind::Unknown)) - }; - res -} - -/// We want to start up the manifest, but in this case we want to know that we have generated the certificates. -/// Note for _generated_certificate: Needed to know that before we start the state we have generated the certificate -async fn execute_main(seed: Arc) -> Result, Error> { - seed.manifest - .main - .execute::<(), NoOutput>( - &seed.ctx, - &seed.manifest.id, - &seed.manifest.version, - ProcedureName::Main, - &seed.manifest.volumes, - None, - None, - ) - .await -} - -async fn long_running_docker( - seed: &ManagerSeed, - container: &DockerContainer, -) -> Result<(LongRunning, UnixRpcClient), Error> { - container - .long_running_execute( - &seed.ctx, - &seed.manifest.id, - &seed.manifest.version, - &seed.manifest.volumes, - ) - .await -} - -enum GetRunningIp { - Ip(Ipv4Addr), - Error(Error), - EarlyExit(Result), -} - -async fn get_long_running_ip(seed: &ManagerSeed, runtime: &mut LongRunning) -> GetRunningIp { - loop { - match get_container_ip(&seed.container_name).await { - Ok(Some(ip_addr)) => return GetRunningIp::Ip(ip_addr), - Ok(None) => (), - Err(e) if e.kind == ErrorKind::NotFound => (), - Err(e) => return GetRunningIp::Error(e), - } - if let Poll::Ready(res) = futures::poll!(&mut runtime.running_output) { - match res { - Ok(_) => return GetRunningIp::EarlyExit(Ok(NoOutput)), - Err(_e) => { - return GetRunningIp::Error(Error::new( - eyre!("Manager runtime panicked!"), - crate::ErrorKind::Docker, - )) - } - } - } - } -} - -#[instrument(skip(seed))] -async fn add_network_for_main( - seed: &ManagerSeed, - ip: std::net::Ipv4Addr, -) -> Result { - let mut svc = seed - .ctx - .net_controller - .create_service(seed.manifest.id.clone(), ip) - .await?; - // DEPRECATED - let mut secrets = seed.ctx.secret_store.acquire().await?; - let mut tx = secrets.begin().await?; - for (id, interface) in &seed.manifest.interfaces.0 { - for (external, internal) in interface.lan_config.iter().flatten() { - svc.add_lan( - tx.as_mut(), - id.clone(), - external.0, - internal.internal, - Err(AlpnInfo::Specified(vec![])), - ) - .await?; - } - for (external, internal) in interface.tor_config.iter().flat_map(|t| &t.port_mapping) { - svc.add_tor(tx.as_mut(), id.clone(), external.0, internal.0) - .await?; - } - } - for volume in seed.manifest.volumes.values() { - if let Volume::Certificate { interface_id } = volume { - svc.export_cert(tx.as_mut(), interface_id, ip.into()) - .await?; - } - } - tx.commit().await?; - Ok(svc) -} - -#[instrument(skip(svc))] -async fn remove_network_for_main(svc: NetService) -> Result<(), Error> { - svc.remove_all().await -} - -async fn main_health_check_daemon(seed: Arc) { - tokio::time::sleep(Duration::from_secs(HEALTH_CHECK_GRACE_PERIOD_SECONDS)).await; - loop { - if let Err(e) = health::check(&seed.ctx, &seed.manifest.id).await { - tracing::error!( - "Failed to run health check for {}: {}", - &seed.manifest.id, - e - ); - tracing::debug!("{:?}", e); - } - tokio::time::sleep(Duration::from_secs(HEALTH_CHECK_COOLDOWN_SECONDS)).await; - } -} - -type RuntimeOfCommand = NonDetachingJoinHandle, Error>>; - -#[instrument(skip(seed, runtime))] -async fn get_running_ip(seed: &ManagerSeed, mut runtime: &mut RuntimeOfCommand) -> GetRunningIp { - loop { - match get_container_ip(&seed.container_name).await { - Ok(Some(ip_addr)) => return GetRunningIp::Ip(ip_addr), - Ok(None) => (), - Err(e) if e.kind == ErrorKind::NotFound => (), - Err(e) => return GetRunningIp::Error(e), - } - if let Poll::Ready(res) = futures::poll!(&mut runtime) { - match res { - Ok(Ok(response)) => return GetRunningIp::EarlyExit(response), - Err(e) => { - return GetRunningIp::Error(Error::new( - match e.try_into_panic() { - Ok(e) => { - eyre!( - "Manager runtime panicked: {}", - e.downcast_ref::<&'static str>().unwrap_or(&"UNKNOWN") - ) - } - _ => eyre!("Manager runtime cancelled!"), - }, - crate::ErrorKind::Docker, - )) - } - Ok(Err(e)) => { - return GetRunningIp::Error(Error::new( - eyre!("Manager runtime returned error: {}", e), - crate::ErrorKind::Docker, - )) - } - } - } - } -} - -async fn send_signal(manager: &Manager, gid: Arc, signal: Signal) -> Result<(), Error> { - manager.send_signal(gid, signal).await -} diff --git a/core/startos/src/manager/persistent_container.rs b/core/startos/src/manager/persistent_container.rs deleted file mode 100644 index f71b98646..000000000 --- a/core/startos/src/manager/persistent_container.rs +++ /dev/null @@ -1,187 +0,0 @@ -use std::sync::Arc; -use std::time::Duration; - -use color_eyre::eyre::eyre; -use helpers::UnixRpcClient; -use models::ProcedureName; -use nix::sys::signal::Signal; -use serde::de::DeserializeOwned; -use tokio::sync::watch::{self, Receiver}; -use tokio::sync::{oneshot, Mutex}; -use tracing::instrument; - -use super::manager_seed::ManagerSeed; -use super::{ - add_network_for_main, get_long_running_ip, long_running_docker, remove_network_for_main, - GetRunningIp, -}; -use crate::prelude::*; -use crate::procedure::docker::DockerContainer; -use crate::util::NonDetachingJoinHandle; - -struct ProcedureId(u64); - -// @DRB Need to have a way of starting the the procudures and getting the information back -// @DRB On top of this we need to also have the procedures to have the effects and get the results back for them, maybe lock them to the running instance? -/// Persistant container are the old containers that need to run all the time -/// The goal is that all services will be persistent containers, waiting to run the main system. -pub struct PersistentContainer { - _running_docker: NonDetachingJoinHandle<()>, - // TODO: Drb: Implement to spec https://github.com/Start9Labs/start-sdk/blob/master/lib/types.ts#L223 - pub rpc_client: Receiver>, - manager_seed: Arc, - procedures: Mutex>, -} - -impl PersistentContainer { - #[instrument(skip_all)] - pub async fn init(seed: &Arc) -> Result { - Ok(if let Some(containers) = &seed.manifest.containers { - let (running_docker, rpc_client) = - spawn_persistent_container(seed.clone(), containers.main.clone()).await?; - Self { - _running_docker: running_docker, - rpc_client, - manager_seed: seed.clone(), - procedures: Default::default(), - } - } else { - todo!("DRB No containers in manifest") - }) - } - - pub fn rpc_client(&self) -> Arc { - self.rpc_client.borrow().clone() - } - - pub async fn execute( - &self, - name: ProcedureName, - input: Value, - timeout: Option, - ) -> Result, Error> - where - O: DeserializeOwned, - { - match self._execute(name, input, timeout).await { - Ok(Ok(a)) => Ok(Ok(imbl_value::from_value(a).map_err(|e| { - Error::new( - eyre!("Error deserializing output: {}", e), - crate::ErrorKind::Deserialization, - ) - })?)), - Ok(Err(e)) => Ok(Err(e)), - Err(e) => Err(e), - } - } - - pub async fn sanboxed( - &self, - name: ProcedureName, - input: Value, - timeout: Option, - ) -> Result, Error> - where - O: DeserializeOwned, - { - match self._sandboxed(name, input, timeout).await { - Ok(Ok(a)) => Ok(Ok(imbl_value::from_value(a).map_err(|e| { - Error::new( - eyre!("Error deserializing output: {}", e), - crate::ErrorKind::Deserialization, - ) - })?)), - Ok(Err(e)) => Ok(Err(e)), - Err(e) => Err(e), - } - } - async fn _execute( - &self, - name: ProcedureName, - input: Value, - timeout: Option, - ) -> Result, Error> { - todo!( - r#""" - DRB - Call into the persistant via rpc, start a procedure. - Procedure already has access to rpc to call back, maybe an id to track? - Should be able to cancel. - Note(Main): Only one should be running at a time - Note(Main): Has additional effect of setRunning - Note: The input (Option) is not generic because we don't want to clone this fn for each type of input - Note: The output is not generic because we don't want to clone this fn for each type of output - """# - ) - } - - async fn _sandboxed( - &self, - name: ProcedureName, - input: Value, - timeout: Option, - ) -> Result, Error> { - todo!("DRB") - } - - pub async fn send_signal(&self, gid: Arc, signal: Signal) -> Result<(), Error> { - todo!("DRB") - } -} - -pub async fn spawn_persistent_container( - seed: Arc, - container: DockerContainer, -) -> Result<(NonDetachingJoinHandle<()>, Receiver>), Error> { - let (send_inserter, inserter) = oneshot::channel(); - Ok(( - tokio::task::spawn(async move { - let mut inserter_send: Option>> = None; - let mut send_inserter: Option>>> = Some(send_inserter); - loop { - if let Err(e) = async { - let (mut runtime, inserter) = - long_running_docker(&seed, &container).await?; - - - let ip = match get_long_running_ip(&seed, &mut runtime).await { - GetRunningIp::Ip(x) => x, - GetRunningIp::Error(e) => return Err(e), - GetRunningIp::EarlyExit(e) => { - tracing::error!("Early Exit"); - tracing::debug!("{:?}", e); - return Ok(()); - } - }; - let svc = add_network_for_main(&seed, ip).await?; - - if let Some(inserter_send) = inserter_send.as_mut() { - let _ = inserter_send.send(Arc::new(inserter)); - } else { - let (s, r) = watch::channel(Arc::new(inserter)); - inserter_send = Some(s); - if let Some(send_inserter) = send_inserter.take() { - let _ = send_inserter.send(r); - } - } - - let res = tokio::select! { - a = runtime.running_output => a.map_err(|_| Error::new(eyre!("Manager runtime panicked!"), crate::ErrorKind::Docker)).map(|_| ()), - }; - - remove_network_for_main(svc).await?; - - res - }.await { - tracing::error!("Error in persistent container: {}", e); - tracing::debug!("{:?}", e); - } else { - break; - } - tokio::time::sleep(Duration::from_millis(200)).await; - } - }) - .into(), - inserter.await.map_err(|_| Error::new(eyre!("Container handle dropped before inserter sent"), crate::ErrorKind::Unknown))?, - )) -} diff --git a/core/startos/src/manager/transition_state.rs b/core/startos/src/manager/transition_state.rs deleted file mode 100644 index 122c0f703..000000000 --- a/core/startos/src/manager/transition_state.rs +++ /dev/null @@ -1,35 +0,0 @@ -use helpers::NonDetachingJoinHandle; - -/// Used only in the manager/mod and is used to keep track of the state of the manager during the -/// transitional states -pub(super) enum TransitionState { - BackingUp(NonDetachingJoinHandle<()>), - Restarting(NonDetachingJoinHandle<()>), - None, -} - -impl TransitionState { - pub(super) fn take(&mut self) -> Self { - std::mem::take(self) - } - pub(super) fn into_join_handle(self) -> Option> { - Some(match self { - TransitionState::BackingUp(a) => a, - TransitionState::Restarting(a) => a, - TransitionState::None => return None, - }) - } - pub(super) async fn abort(&mut self) { - if let Some(s) = self.take().into_join_handle() { - if s.wait_for_abort().await.is_ok() { - tracing::trace!("transition completed before abort"); - } - } - } -} - -impl Default for TransitionState { - fn default() -> Self { - TransitionState::None - } -} diff --git a/core/startos/src/middleware/auth.rs b/core/startos/src/middleware/auth.rs index 611923ad6..9260d7fa2 100644 --- a/core/startos/src/middleware/auth.rs +++ b/core/startos/src/middleware/auth.rs @@ -2,32 +2,34 @@ use std::borrow::Borrow; use std::sync::Arc; use std::time::{Duration, Instant}; +use axum::extract::Request; +use axum::response::Response; use basic_cookies::Cookie; use color_eyre::eyre::eyre; use digest::Digest; -use futures::future::BoxFuture; -use futures::FutureExt; -use http::StatusCode; -use rpc_toolkit::command_helpers::prelude::RequestParts; -use rpc_toolkit::hyper::header::COOKIE; -use rpc_toolkit::hyper::http::Error as HttpError; -use rpc_toolkit::hyper::{Body, Request, Response}; -use rpc_toolkit::rpc_server_helpers::{ - noop4, to_response, DynMiddleware, DynMiddlewareStage2, DynMiddlewareStage3, -}; -use rpc_toolkit::yajrc::RpcMethod; -use rpc_toolkit::Metadata; +use helpers::const_true; +use http::header::COOKIE; +use http::HeaderValue; +use imbl_value::InternedString; +use rpc_toolkit::yajrc::INTERNAL_ERROR; +use rpc_toolkit::{Middleware, RpcRequest, RpcResponse}; use serde::{Deserialize, Serialize}; use sha2::Sha256; use tokio::sync::Mutex; use crate::context::RpcContext; -use crate::{Error, ResultExt}; +use crate::prelude::*; pub const LOCAL_AUTH_COOKIE_PATH: &str = "/run/embassy/rpc.authcookie"; +#[derive(Deserialize, Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct LoginRes { + pub session: InternedString, +} + pub trait AsLogoutSessionId { - fn as_logout_session_id(self) -> String; + fn as_logout_session_id(self) -> InternedString; } /// Will need to know when we have logged out from a route @@ -43,13 +45,14 @@ impl HasLoggedOutSessions { let mut sqlx_conn = ctx.secret_store.acquire().await?; for session in logged_out_sessions { let session = session.as_logout_session_id(); + let session = &*session; sqlx::query!( "UPDATE session SET logged_out = CURRENT_TIMESTAMP WHERE id = $1", session ) .execute(sqlx_conn.as_mut()) .await?; - for socket in open_authed_websockets.remove(&session).unwrap_or_default() { + for socket in open_authed_websockets.remove(session).unwrap_or_default() { let _ = socket.send(()); } } @@ -58,15 +61,21 @@ impl HasLoggedOutSessions { } /// Used when we need to know that we have logged in with a valid user -#[derive(Clone, Copy)] -pub struct HasValidSession(()); +#[derive(Clone)] +pub struct HasValidSession(SessionType); + +#[derive(Clone)] +enum SessionType { + Local, + Session(HashSessionToken), +} impl HasValidSession { - pub async fn from_request_parts( - request_parts: &RequestParts, + pub async fn from_header( + header: Option<&HeaderValue>, ctx: &RpcContext, ) -> Result { - if let Some(cookie_header) = request_parts.headers.get(COOKIE) { + if let Some(cookie_header) = header { let cookies = Cookie::parse( cookie_header .to_str() @@ -79,7 +88,7 @@ impl HasValidSession { } } if let Some(cookie) = cookies.iter().find(|c| c.get_name() == "session") { - if let Ok(s) = Self::from_session(&HashSessionToken::from_cookie(cookie), ctx).await + if let Ok(s) = Self::from_session(HashSessionToken::from_cookie(cookie), ctx).await { return Ok(s); } @@ -91,8 +100,11 @@ impl HasValidSession { )) } - pub async fn from_session(session: &HashSessionToken, ctx: &RpcContext) -> Result { - let session_hash = session.hashed(); + pub async fn from_session( + session_token: HashSessionToken, + ctx: &RpcContext, + ) -> Result { + let session_hash = session_token.hashed(); let session = sqlx::query!("UPDATE session SET last_active = CURRENT_TIMESTAMP WHERE id = $1 AND logged_out IS NULL OR logged_out > CURRENT_TIMESTAMP", session_hash) .execute(ctx.secret_store.acquire().await?.as_mut()) .await?; @@ -102,13 +114,13 @@ impl HasValidSession { crate::ErrorKind::Authorization, )); } - Ok(Self(())) + Ok(Self(SessionType::Session(session_token))) } pub async fn from_local(local: &Cookie<'_>) -> Result { let token = tokio::fs::read_to_string(LOCAL_AUTH_COOKIE_PATH).await?; if local.get_value() == &*token { - Ok(Self(())) + Ok(Self(SessionType::Local)) } else { Err(Error::new( eyre!("UNAUTHORIZED"), @@ -122,27 +134,31 @@ impl HasValidSession { /// Or when we are using internal valid authenticated service. #[derive(Debug, Clone)] pub struct HashSessionToken { - hashed: String, - token: String, + hashed: InternedString, + token: InternedString, } impl HashSessionToken { pub fn new() -> Self { - let token = base32::encode( - base32::Alphabet::RFC4648 { padding: false }, - &rand::random::<[u8; 16]>(), - ) - .to_lowercase(); - let hashed = Self::hash(&token); + Self::from_token(InternedString::intern( + base32::encode( + base32::Alphabet::RFC4648 { padding: false }, + &rand::random::<[u8; 16]>(), + ) + .to_lowercase(), + )) + } + + pub fn from_token(token: InternedString) -> Self { + let hashed = Self::hash(&*token); Self { hashed, token } } + pub fn from_cookie(cookie: &Cookie) -> Self { - let token = cookie.get_value().to_owned(); - let hashed = Self::hash(&token); - Self { hashed, token } + Self::from_token(InternedString::intern(cookie.get_value())) } - pub fn from_request_parts(request_parts: &RequestParts) -> Result { - if let Some(cookie_header) = request_parts.headers.get(COOKIE) { + pub fn from_header(header: Option<&HeaderValue>) -> Result { + if let Some(cookie_header) = header { let cookies = Cookie::parse( cookie_header .to_str() @@ -159,33 +175,30 @@ impl HashSessionToken { )) } - pub fn header_value(&self) -> Result { - http::HeaderValue::from_str(&format!( - "session={}; Path=/; SameSite=Lax; Expires=Fri, 31 Dec 9999 23:59:59 GMT;", - self.token - )) - .with_kind(crate::ErrorKind::Unknown) + pub fn to_login_res(&self) -> LoginRes { + LoginRes { + session: self.token.clone(), + } } pub fn hashed(&self) -> &str { - self.hashed.as_str() + &*self.hashed } - pub fn as_hash(self) -> String { - self.hashed - } - fn hash(token: &str) -> String { + fn hash(token: &str) -> InternedString { let mut hasher = Sha256::new(); hasher.update(token.as_bytes()); - base32::encode( - base32::Alphabet::RFC4648 { padding: false }, - hasher.finalize().as_slice(), + InternedString::intern( + base32::encode( + base32::Alphabet::RFC4648 { padding: false }, + hasher.finalize().as_slice(), + ) + .to_lowercase(), ) - .to_lowercase() } } impl AsLogoutSessionId for HashSessionToken { - fn as_logout_session_id(self) -> String { + fn as_logout_session_id(self) -> InternedString { self.hashed } } @@ -205,80 +218,120 @@ impl Ord for HashSessionToken { self.hashed.cmp(&other.hashed) } } -impl Borrow for HashSessionToken { - fn borrow(&self) -> &String { - &self.hashed +impl Borrow for HashSessionToken { + fn borrow(&self) -> &str { + &*self.hashed } } -pub fn auth(ctx: RpcContext) -> DynMiddleware { - let rate_limiter = Arc::new(Mutex::new((0_usize, Instant::now()))); - Box::new( - move |req: &mut Request, - metadata: M| - -> BoxFuture>, HttpError>> { - let ctx = ctx.clone(); - let rate_limiter = rate_limiter.clone(); - async move { - let mut header_stub = Request::new(Body::empty()); - *header_stub.headers_mut() = req.headers().clone(); - let m2: DynMiddlewareStage2 = Box::new(move |req, rpc_req| { - async move { - if let Err(e) = HasValidSession::from_request_parts(req, &ctx).await { - if metadata - .get(rpc_req.method.as_str(), "authenticated") - .unwrap_or(true) - { - let (res_parts, _) = Response::new(()).into_parts(); - return Ok(Err(to_response( - &req.headers, - res_parts, - Err(e.into()), - |_| StatusCode::OK, - )?)); - } else if rpc_req.method.as_str() == "auth.login" { - let guard = rate_limiter.lock().await; - if guard.1.elapsed() < Duration::from_secs(20) { - if guard.0 >= 3 { - let (res_parts, _) = Response::new(()).into_parts(); - return Ok(Err(to_response( - &req.headers, - res_parts, - Err(Error::new( - eyre!( - "Please limit login attempts to 3 per 20 seconds." - ), - crate::ErrorKind::RateLimited, - ) - .into()), - |_| StatusCode::OK, - )?)); - } - } - } - } - let m3: DynMiddlewareStage3 = Box::new(move |_, res| { - async move { - let mut guard = rate_limiter.lock().await; - if guard.1.elapsed() < Duration::from_secs(20) { - if res.is_err() { - guard.0 += 1; - } - } else { - guard.0 = 0; - } - guard.1 = Instant::now(); - Ok(Ok(noop4())) - } - .boxed() - }); - Ok(Ok(m3)) - } - .boxed() +#[derive(Deserialize)] +#[serde(rename_all = "kebab-case")] +pub struct Metadata { + #[serde(default = "const_true")] + authenticated: bool, + #[serde(default)] + login: bool, + #[serde(default)] + get_session: bool, +} + +#[derive(Clone)] +pub struct Auth { + rate_limiter: Arc>, + cookie: Option, + is_login: bool, + set_cookie: Option, +} +impl Auth { + pub fn new() -> Self { + Self { + rate_limiter: Arc::new(Mutex::new((0, Instant::now()))), + cookie: None, + is_login: false, + set_cookie: None, + } + } +} +#[async_trait::async_trait] +impl Middleware for Auth { + type Metadata = Metadata; + async fn process_http_request( + &mut self, + _: &RpcContext, + request: &mut Request, + ) -> Result<(), Response> { + self.cookie = request.headers_mut().get(COOKIE).cloned(); + Ok(()) + } + async fn process_rpc_request( + &mut self, + context: &RpcContext, + metadata: Self::Metadata, + request: &mut RpcRequest, + ) -> Result<(), RpcResponse> { + if metadata.login { + self.is_login = true; + let guard = self.rate_limiter.lock().await; + if guard.1.elapsed() < Duration::from_secs(20) && guard.0 >= 3 { + return Err(RpcResponse { + id: request.id.take(), + result: Err(Error::new( + eyre!("Please limit login attempts to 3 per 20 seconds."), + crate::ErrorKind::RateLimited, + ) + .into()), }); - Ok(Ok(m2)) } - .boxed() - }, - ) + } else if metadata.authenticated { + match HasValidSession::from_header(self.cookie.as_ref(), &context).await { + Err(e) => { + return Err(RpcResponse { + id: request.id.take(), + result: Err(e.into()), + }) + } + Ok(HasValidSession(SessionType::Session(s))) if metadata.get_session => { + request.params["session"] = Value::String(Arc::new(s.hashed().into())); + // TODO: will this panic? + } + _ => (), + } + } + Ok(()) + } + async fn process_rpc_response(&mut self, _: &RpcContext, response: &mut RpcResponse) { + if self.is_login { + let mut guard = self.rate_limiter.lock().await; + if guard.1.elapsed() < Duration::from_secs(20) { + if response.result.is_err() { + guard.0 += 1; + } + } else { + guard.0 = 0; + } + guard.1 = Instant::now(); + if response.result.is_ok() { + let res = std::mem::replace(&mut response.result, Err(INTERNAL_ERROR)); + response.result = async { + let res = res?; + let login_res = from_value::(res.clone())?; + self.set_cookie = Some( + HeaderValue::from_str(&format!( + "session={}; Path=/; SameSite=Lax; Expires=Fri, 31 Dec 9999 23:59:59 GMT;", + login_res.session + )) + .with_kind(crate::ErrorKind::Network)?, + ); + + Ok(res) + } + .await; + } + } + } + async fn process_http_response(&mut self, _: &RpcContext, response: &mut Response) { + if let Some(set_cookie) = self.set_cookie.take() { + response.headers_mut().insert("set-cookie", set_cookie); + } + } } diff --git a/core/startos/src/middleware/cors.rs b/core/startos/src/middleware/cors.rs index 5f33bc08d..60a472cdd 100644 --- a/core/startos/src/middleware/cors.rs +++ b/core/startos/src/middleware/cors.rs @@ -1,61 +1,63 @@ -use futures::FutureExt; -use http::HeaderValue; -use hyper::header::HeaderMap; -use rpc_toolkit::hyper::http::Error as HttpError; -use rpc_toolkit::hyper::{Body, Method, Request, Response}; -use rpc_toolkit::rpc_server_helpers::{ - DynMiddlewareStage2, DynMiddlewareStage3, DynMiddlewareStage4, -}; -use rpc_toolkit::Metadata; +use axum::extract::Request; +use axum::response::Response; +use http::{HeaderMap, HeaderValue}; +use rpc_toolkit::{Empty, Middleware}; -fn get_cors_headers(req: &Request) -> HeaderMap { - let mut res = HeaderMap::new(); - if let Some(origin) = req.headers().get("Origin") { - res.insert("Access-Control-Allow-Origin", origin.clone()); - } - if let Some(method) = req.headers().get("Access-Control-Request-Method") { - res.insert("Access-Control-Allow-Methods", method.clone()); +#[derive(Clone)] +pub struct Cors { + headers: HeaderMap, +} +impl Cors { + pub fn new() -> Self { + let mut headers = HeaderMap::new(); + headers.insert( + "Access-Control-Allow-Credentials", + HeaderValue::from_static("true"), + ); + Self { headers } } - if let Some(headers) = req.headers().get("Access-Control-Request-Headers") { - res.insert("Access-Control-Allow-Headers", headers.clone()); + fn get_cors_headers(&mut self, req: &Request) { + if let Some(origin) = req.headers().get("Origin") { + self.headers + .insert("Access-Control-Allow-Origin", origin.clone()); + } else { + self.headers + .insert("Access-Control-Allow-Origin", HeaderValue::from_static("*")); + } + if let Some(method) = req.headers().get("Access-Control-Request-Method") { + self.headers + .insert("Access-Control-Allow-Methods", method.clone()); + } else { + self.headers.insert( + "Access-Control-Allow-Methods", + HeaderValue::from_static("*"), + ); + } + if let Some(headers) = req.headers().get("Access-Control-Request-Headers") { + self.headers + .insert("Access-Control-Allow-Headers", headers.clone()); + } else { + self.headers.insert( + "Access-Control-Allow-Headers", + HeaderValue::from_static("*"), + ); + } } - res.insert( - "Access-Control-Allow-Credentials", - HeaderValue::from_static("true"), - ); - res } - -pub async fn cors( - req: &mut Request, - _metadata: M, -) -> Result>, HttpError> { - let headers = get_cors_headers(req); - if req.method() == Method::OPTIONS { - Ok(Err({ - let mut res = Response::new(Body::empty()); - res.headers_mut().extend(headers.into_iter()); - res - })) - } else { - Ok(Ok(Box::new(|_, _| { - async move { - let res: DynMiddlewareStage3 = Box::new(|_, _| { - async move { - let res: DynMiddlewareStage4 = Box::new(|res| { - async move { - res.headers_mut().extend(headers.into_iter()); - Ok::<_, HttpError>(()) - } - .boxed() - }); - Ok::<_, HttpError>(Ok(res)) - } - .boxed() - }); - Ok::<_, HttpError>(Ok(res)) - } - .boxed() - }))) +#[async_trait::async_trait] +impl Middleware for Cors { + type Metadata = Empty; + async fn process_http_request( + &mut self, + _: &Context, + request: &mut Request, + ) -> Result<(), Response> { + self.get_cors_headers(request); + Ok(()) + } + async fn process_http_response(&mut self, _: &Context, response: &mut Response) { + response + .headers_mut() + .extend(std::mem::take(&mut self.headers)) } } diff --git a/core/startos/src/middleware/db.rs b/core/startos/src/middleware/db.rs index c3ceadda6..b90055f7c 100644 --- a/core/startos/src/middleware/db.rs +++ b/core/startos/src/middleware/db.rs @@ -1,50 +1,54 @@ -use futures::future::BoxFuture; -use futures::FutureExt; +use axum::response::Response; +use http::header::InvalidHeaderValue; use http::HeaderValue; -use rpc_toolkit::hyper::http::Error as HttpError; -use rpc_toolkit::hyper::{Body, Request, Response}; -use rpc_toolkit::rpc_server_helpers::{ - noop4, DynMiddleware, DynMiddlewareStage2, DynMiddlewareStage3, -}; -use rpc_toolkit::yajrc::RpcMethod; -use rpc_toolkit::Metadata; +use rpc_toolkit::{Middleware, RpcRequest, RpcResponse}; +use serde::Deserialize; use crate::context::RpcContext; -pub fn db(ctx: RpcContext) -> DynMiddleware { - Box::new( - move |_: &mut Request, - metadata: M| - -> BoxFuture>, HttpError>> { - let ctx = ctx.clone(); - async move { - let m2: DynMiddlewareStage2 = Box::new(move |_req, rpc_req| { - async move { - let sync_db = metadata - .get(rpc_req.method.as_str(), "sync_db") - .unwrap_or(false); +#[derive(Deserialize)] +#[serde(rename_all = "kebab-case")] +pub struct Metadata { + #[serde(default)] + sync_db: bool, +} + +#[derive(Clone)] +pub struct SyncDb { + sync_db: bool, +} +impl SyncDb { + pub fn new() -> Self { + SyncDb { sync_db: false } + } +} - let m3: DynMiddlewareStage3 = Box::new(move |res, _| { - async move { - if sync_db { - res.headers.append( - "X-Patch-Sequence", - HeaderValue::from_str( - &ctx.db.sequence().await.to_string(), - )?, - ); - } - Ok(Ok(noop4())) - } - .boxed() - }); - Ok(Ok(m3)) - } - .boxed() - }); - Ok(Ok(m2)) +#[async_trait::async_trait] +impl Middleware for SyncDb { + type Metadata = Metadata; + async fn process_rpc_request( + &mut self, + _: &RpcContext, + metadata: Self::Metadata, + _: &mut RpcRequest, + ) -> Result<(), RpcResponse> { + self.sync_db = metadata.sync_db; + Ok(()) + } + async fn process_http_response(&mut self, context: &RpcContext, response: &mut Response) { + if let Err(e) = async { + if self.sync_db { + response.headers_mut().append( + "X-Patch-Sequence", + HeaderValue::from_str(&context.db.sequence().await.to_string())?, + ); } - .boxed() - }, - ) + Ok::<_, InvalidHeaderValue>(()) + } + .await + { + tracing::error!("error writing X-Patch-Sequence header: {e}"); + tracing::debug!("{e:?}"); + } + } } diff --git a/core/startos/src/middleware/diagnostic.rs b/core/startos/src/middleware/diagnostic.rs index 959b8ea2d..f779d632f 100644 --- a/core/startos/src/middleware/diagnostic.rs +++ b/core/startos/src/middleware/diagnostic.rs @@ -1,39 +1,43 @@ -use futures::FutureExt; -use rpc_toolkit::hyper::http::Error as HttpError; -use rpc_toolkit::hyper::{Body, Request, Response}; -use rpc_toolkit::rpc_server_helpers::{noop4, DynMiddlewareStage2, DynMiddlewareStage3}; use rpc_toolkit::yajrc::RpcMethod; -use rpc_toolkit::Metadata; +use rpc_toolkit::{Empty, Middleware, RpcRequest, RpcResponse}; -use crate::Error; +use crate::context::DiagnosticContext; +use crate::prelude::*; -pub async fn diagnostic( - _req: &mut Request, - _metadata: M, -) -> Result>, HttpError> { - Ok(Ok(Box::new(|_, rpc_req| { - let method = rpc_req.method.as_str().to_owned(); - async move { - let res: DynMiddlewareStage3 = Box::new(|_, rpc_res| { - async move { - if let Err(e) = rpc_res { - if e.code == -32601 { - *e = Error::new( - color_eyre::eyre::eyre!( - "{} is not available on the Diagnostic API", - method - ), - crate::ErrorKind::DiagnosticMode, - ) - .into(); - } - } - Ok(Ok(noop4())) - } - .boxed() - }); - Ok::<_, HttpError>(Ok(res)) +#[derive(Clone)] +pub struct DiagnosticMode { + method: Option, +} +impl DiagnosticMode { + pub fn new() -> Self { + Self { method: None } + } +} + +#[async_trait::async_trait] +impl Middleware for DiagnosticMode { + type Metadata = Empty; + async fn process_rpc_request( + &mut self, + _: &DiagnosticContext, + _: Self::Metadata, + request: &mut RpcRequest, + ) -> Result<(), RpcResponse> { + self.method = Some(request.method.as_str().to_owned()); + Ok(()) + } + async fn process_rpc_response(&mut self, _: &DiagnosticContext, response: &mut RpcResponse) { + if let Err(e) = &mut response.result { + if e.code == -32601 { + *e = Error::new( + eyre!( + "{} is not available on the Diagnostic API", + self.method.as_ref().map(|s| s.as_str()).unwrap_or_default() + ), + crate::ErrorKind::DiagnosticMode, + ) + .into(); + } } - .boxed() - }))) + } } diff --git a/core/startos/src/middleware/encrypt.rs b/core/startos/src/middleware/encrypt.rs deleted file mode 100644 index 94167b7e2..000000000 --- a/core/startos/src/middleware/encrypt.rs +++ /dev/null @@ -1,115 +0,0 @@ -use aes::cipher::{CipherKey, NewCipher, Nonce, StreamCipher}; -use aes::Aes256Ctr; -use hmac::Hmac; -use josekit::jwk::Jwk; -use serde::{Deserialize, Serialize}; -use sha2::Sha256; -use tracing::instrument; - -pub fn pbkdf2(password: impl AsRef<[u8]>, salt: impl AsRef<[u8]>) -> CipherKey { - let mut aeskey = CipherKey::::default(); - pbkdf2::pbkdf2::>( - password.as_ref(), - salt.as_ref(), - 1000, - aeskey.as_mut_slice(), - ) - .unwrap(); - aeskey -} - -pub fn encrypt_slice(input: impl AsRef<[u8]>, password: impl AsRef<[u8]>) -> Vec { - let prefix: [u8; 32] = rand::random(); - let aeskey = pbkdf2(password.as_ref(), &prefix[16..]); - let ctr = Nonce::::from_slice(&prefix[..16]); - let mut aes = Aes256Ctr::new(&aeskey, ctr); - let mut res = Vec::with_capacity(32 + input.as_ref().len()); - res.extend_from_slice(&prefix[..]); - res.extend_from_slice(input.as_ref()); - aes.apply_keystream(&mut res[32..]); - res -} - -pub fn decrypt_slice(input: impl AsRef<[u8]>, password: impl AsRef<[u8]>) -> Vec { - if input.as_ref().len() < 32 { - return Vec::new(); - } - let (prefix, rest) = input.as_ref().split_at(32); - let aeskey = pbkdf2(password.as_ref(), &prefix[16..]); - let ctr = Nonce::::from_slice(&prefix[..16]); - let mut aes = Aes256Ctr::new(&aeskey, ctr); - let mut res = rest.to_vec(); - aes.apply_keystream(&mut res); - res -} - -#[derive(Debug, Clone, Deserialize, Serialize)] -pub struct EncryptedWire { - encrypted: serde_json::Value, -} -impl EncryptedWire { - #[instrument(skip_all)] - pub fn decrypt(self, current_secret: impl AsRef) -> Option { - let current_secret = current_secret.as_ref(); - - let decrypter = match josekit::jwe::alg::ecdh_es::EcdhEsJweAlgorithm::EcdhEs - .decrypter_from_jwk(current_secret) - { - Ok(a) => a, - Err(e) => { - tracing::warn!("Could not setup awk"); - tracing::debug!("{:?}", e); - return None; - } - }; - let encrypted = match serde_json::to_string(&self.encrypted) { - Ok(a) => a, - Err(e) => { - tracing::warn!("Could not deserialize"); - tracing::debug!("{:?}", e); - - return None; - } - }; - let (decoded, _) = match josekit::jwe::deserialize_json(&encrypted, &decrypter) { - Ok(a) => a, - Err(e) => { - tracing::warn!("Could not decrypt"); - tracing::debug!("{:?}", e); - return None; - } - }; - match String::from_utf8(decoded) { - Ok(a) => Some(a), - Err(e) => { - tracing::warn!("Could not decrypt into utf8"); - tracing::debug!("{:?}", e); - return None; - } - } - } -} - -/// We created this test by first making the private key, then restoring from this private key for recreatability. -/// After this the frontend then encoded an password, then we are testing that the output that we got (hand coded) -/// will be the shape we want. -#[test] -fn test_gen_awk() { - let private_key: Jwk = serde_json::from_str( - r#"{ - "kty": "EC", - "crv": "P-256", - "d": "3P-MxbUJtEhdGGpBCRFXkUneGgdyz_DGZWfIAGSCHOU", - "x": "yHTDYSfjU809fkSv9MmN4wuojf5c3cnD7ZDN13n-jz4", - "y": "8Mpkn744A5KDag0DmX2YivB63srjbugYZzWc3JOpQXI" - }"#, - ) - .unwrap(); - let encrypted: EncryptedWire = serde_json::from_str(r#"{ - "encrypted": { "protected": "eyJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWxnIjoiRUNESC1FUyIsImtpZCI6ImgtZnNXUVh2Tm95dmJEazM5dUNsQ0NUdWc5N3MyZnJockJnWUVBUWVtclUiLCJlcGsiOnsia3R5IjoiRUMiLCJjcnYiOiJQLTI1NiIsIngiOiJmRkF0LXNWYWU2aGNkdWZJeUlmVVdUd3ZvWExaTkdKRHZIWVhIckxwOXNNIiwieSI6IjFvVFN6b00teHlFZC1SLUlBaUFHdXgzS1dJZmNYZHRMQ0JHLUh6MVkzY2sifX0", "iv": "NbwvfvWOdLpZfYRIZUrkcw", "ciphertext": "Zc5Br5kYOlhPkIjQKOLMJw", "tag": "EPoch52lDuCsbUUulzZGfg" } - }"#).unwrap(); - assert_eq!( - "testing12345", - &encrypted.decrypt(std::sync::Arc::new(private_key)).unwrap() - ); -} diff --git a/core/startos/src/middleware/mod.rs b/core/startos/src/middleware/mod.rs index 5af2b8121..3af0cb5a4 100644 --- a/core/startos/src/middleware/mod.rs +++ b/core/startos/src/middleware/mod.rs @@ -2,4 +2,3 @@ pub mod auth; pub mod cors; pub mod db; pub mod diagnostic; -pub mod encrypt; diff --git a/core/startos/src/migration.rs b/core/startos/src/migration.rs deleted file mode 100644 index 13f14c7c3..000000000 --- a/core/startos/src/migration.rs +++ /dev/null @@ -1,141 +0,0 @@ -use std::collections::BTreeSet; - -use color_eyre::eyre::eyre; -use emver::VersionRange; -use futures::{Future, FutureExt}; -use indexmap::IndexMap; -use models::ImageId; -use patch_db::HasModel; -use serde::{Deserialize, Serialize}; -use tracing::instrument; - -use crate::context::RpcContext; -use crate::prelude::*; -use crate::procedure::docker::DockerContainers; -use crate::procedure::{PackageProcedure, ProcedureName}; -use crate::s9pk::manifest::PackageId; -use crate::util::Version; -use crate::volume::Volumes; -use crate::{Error, ResultExt}; - -#[derive(Clone, Debug, Default, Deserialize, Serialize, HasModel)] -#[serde(rename_all = "kebab-case")] -#[model = "Model"] -pub struct Migrations { - pub from: IndexMap, - pub to: IndexMap, -} -impl Migrations { - #[instrument(skip_all)] - pub fn validate( - &self, - _container: &Option, - eos_version: &Version, - volumes: &Volumes, - image_ids: &BTreeSet, - ) -> Result<(), Error> { - for (version, migration) in &self.from { - migration - .validate(eos_version, volumes, image_ids, true) - .with_ctx(|_| { - ( - crate::ErrorKind::ValidateS9pk, - format!("Migration from {}", version), - ) - })?; - } - for (version, migration) in &self.to { - migration - .validate(eos_version, volumes, image_ids, true) - .with_ctx(|_| { - ( - crate::ErrorKind::ValidateS9pk, - format!("Migration to {}", version), - ) - })?; - } - Ok(()) - } - - #[instrument(skip_all)] - pub fn from<'a>( - &'a self, - _container: &'a Option, - ctx: &'a RpcContext, - version: &'a Version, - pkg_id: &'a PackageId, - pkg_version: &'a Version, - volumes: &'a Volumes, - ) -> Option> + 'a> { - if let Some((_, migration)) = self - .from - .iter() - .find(|(range, _)| version.satisfies(*range)) - { - Some(async move { - migration - .execute( - ctx, - pkg_id, - pkg_version, - ProcedureName::Migration, // Migrations cannot be executed concurrently - volumes, - Some(version), - None, - ) - .map(|r| { - r.and_then(|r| { - r.map_err(|e| { - Error::new(eyre!("{}", e.1), crate::ErrorKind::MigrationFailed) - }) - }) - }) - .await - }) - } else { - None - } - } - - #[instrument(skip_all)] - pub fn to<'a>( - &'a self, - ctx: &'a RpcContext, - version: &'a Version, - pkg_id: &'a PackageId, - pkg_version: &'a Version, - volumes: &'a Volumes, - ) -> Option> + 'a> { - if let Some((_, migration)) = self.to.iter().find(|(range, _)| version.satisfies(*range)) { - Some(async move { - migration - .execute( - ctx, - pkg_id, - pkg_version, - ProcedureName::Migration, - volumes, - Some(version), - None, - ) - .map(|r| { - r.and_then(|r| { - r.map_err(|e| { - Error::new(eyre!("{}", e.1), crate::ErrorKind::MigrationFailed) - }) - }) - }) - .await - }) - } else { - None - } - } -} - -#[derive(Clone, Debug, Default, Deserialize, Serialize, HasModel)] -#[serde(rename_all = "kebab-case")] -#[model = "Model"] -pub struct MigrationRes { - pub configured: bool, -} diff --git a/core/startos/src/net/dhcp.rs b/core/startos/src/net/dhcp.rs index cbe7ff19d..1c9d65d24 100644 --- a/core/startos/src/net/dhcp.rs +++ b/core/startos/src/net/dhcp.rs @@ -1,15 +1,16 @@ use std::collections::{BTreeMap, BTreeSet}; use std::net::IpAddr; +use clap::Parser; use futures::TryStreamExt; -use rpc_toolkit::command; +use rpc_toolkit::{from_fn_async, HandlerExt, ParentHandler}; +use serde::{Deserialize, Serialize}; use tokio::sync::RwLock; -use crate::context::RpcContext; +use crate::context::{CliContext, RpcContext}; use crate::db::model::IpInfo; use crate::net::utils::{iface_is_physical, list_interfaces}; use crate::prelude::*; -use crate::util::display_none; use crate::Error; lazy_static::lazy_static! { @@ -50,13 +51,26 @@ pub async fn init_ips() -> Result, Error> { Ok(res) } -#[command(subcommands(update))] -pub async fn dhcp() -> Result<(), Error> { - Ok(()) +// #[command(subcommands(update))] +pub fn dhcp() -> ParentHandler { + ParentHandler::new().subcommand( + "update", + from_fn_async::<_, _, (), Error, (RpcContext, UpdateParams)>(update) + .no_display() + .with_remote_cli::(), + ) +} +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct UpdateParams { + interface: String, } -#[command(display(display_none))] -pub async fn update(#[context] ctx: RpcContext, #[arg] interface: String) -> Result<(), Error> { +pub async fn update( + ctx: RpcContext, + UpdateParams { interface }: UpdateParams, +) -> Result<(), Error> { if iface_is_physical(&interface).await { let ip_info = IpInfo::for_interface(&interface).await?; ctx.db diff --git a/core/startos/src/net/interface.rs b/core/startos/src/net/interface.rs index a055bb277..f1fa1e406 100644 --- a/core/startos/src/net/interface.rs +++ b/core/startos/src/net/interface.rs @@ -2,13 +2,13 @@ use std::collections::BTreeMap; use indexmap::IndexSet; pub use models::InterfaceId; +use models::PackageId; use serde::{Deserialize, Deserializer, Serialize}; use sqlx::{Executor, Postgres}; use tracing::instrument; use crate::db::model::{InterfaceAddressMap, InterfaceAddresses}; use crate::net::keys::Key; -use crate::s9pk::manifest::PackageId; use crate::util::serde::Port; use crate::{Error, ResultExt}; diff --git a/core/startos/src/net/keys.rs b/core/startos/src/net/keys.rs index 504bd276d..4816fd98a 100644 --- a/core/startos/src/net/keys.rs +++ b/core/startos/src/net/keys.rs @@ -1,21 +1,19 @@ -use std::collections::BTreeMap; - -use clap::ArgMatches; +use clap::Parser; use color_eyre::eyre::eyre; use models::{Id, InterfaceId, PackageId}; use openssl::pkey::{PKey, Private}; use openssl::sha::Sha256; use openssl::x509::X509; use p256::elliptic_curve::pkcs8::EncodePrivateKey; -use rpc_toolkit::command; +use serde::{Deserialize, Serialize}; use sqlx::{Acquire, PgExecutor}; use ssh_key::private::Ed25519PrivateKey; use torut::onion::{OnionAddressV3, TorSecretKeyV3}; use zeroize::Zeroize; -use crate::config::{configure, ConfigureContext}; +use crate::config::ConfigureContext; use crate::context::RpcContext; -use crate::control::restart; +use crate::control::{restart, ControlParams}; use crate::disk::fsck::RequiresReboot; use crate::net::ssl::CertPair; use crate::prelude::*; @@ -280,17 +278,23 @@ pub fn test_keygen() { key.openssl_key_nistp256(); } -fn display_requires_reboot(arg: RequiresReboot, _matches: &ArgMatches) { - if arg.0 { +pub fn display_requires_reboot(_: RotateKeysParams, args: RequiresReboot) { + if args.0 { println!("Server must be restarted for changes to take effect"); } } +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct RotateKeysParams { + package: Option, + interface: Option, +} -#[command(rename = "rotate-key", display(display_requires_reboot))] +// #[command(display(display_requires_reboot))] pub async fn rotate_key( - #[context] ctx: RpcContext, - #[arg] package: Option, - #[arg] interface: Option, + ctx: RpcContext, + RotateKeysParams { package, interface }: RotateKeysParams, ) -> Result { let mut pgcon = ctx.secret_store.acquire().await?; let mut tx = pgcon.begin().await?; @@ -337,37 +341,39 @@ pub async fn rotate_key( lan.ser(&new_key.tor_address().to_string())?; } - if installed - .as_manifest() - .as_config() - .transpose_ref() - .is_some() - { - installed - .as_status_mut() - .as_configured_mut() - .replace(&false) - } else { - Ok(false) - } + // TODO + // if installed + // .as_manifest() + // .as_config() + // .transpose_ref() + // .is_some() + // { + // installed + // .as_status_mut() + // .as_configured_mut() + // .replace(&false) + // } else { + // Ok(false) + // } + Ok(false) }) .await?; tx.commit().await?; if needs_config { - configure( - &ctx, - &package, - ConfigureContext { - breakages: BTreeMap::new(), - timeout: None, - config: None, - overrides: BTreeMap::new(), - dry_run: false, - }, - ) - .await?; + ctx.services + .get(&package) + .await + .as_ref() + .ok_or_else(|| { + Error::new( + eyre!("There is no manager running for {package}"), + ErrorKind::Unknown, + ) + })? + .configure(ConfigureContext::default()) + .await?; } else { - restart(ctx, package).await?; + restart(ctx, ControlParams { id: package }).await?; } Ok(RequiresReboot(false)) } else { diff --git a/core/startos/src/net/mdns.rs b/core/startos/src/net/mdns.rs index 21054241d..ee2e0fa41 100644 --- a/core/startos/src/net/mdns.rs +++ b/core/startos/src/net/mdns.rs @@ -30,71 +30,3 @@ pub async fn resolve_mdns(hostname: &str) -> Result { .trim() .parse()?) } - -pub struct MdnsController(Mutex); -impl MdnsController { - pub async fn init() -> Result { - Ok(MdnsController(Mutex::new( - MdnsControllerInner::init().await?, - ))) - } - pub async fn add(&self, alias: String) -> Result, Error> { - self.0.lock().await.add(alias).await - } - pub async fn gc(&self, alias: String) -> Result<(), Error> { - self.0.lock().await.gc(alias).await - } -} - -pub struct MdnsControllerInner { - alias_cmd: Option, - services: BTreeMap>, -} - -impl MdnsControllerInner { - #[instrument(skip_all)] - async fn init() -> Result { - let mut res = MdnsControllerInner { - alias_cmd: None, - services: BTreeMap::new(), - }; - res.sync().await?; - Ok(res) - } - #[instrument(skip_all)] - async fn sync(&mut self) -> Result<(), Error> { - if let Some(mut cmd) = self.alias_cmd.take() { - cmd.kill().await.with_kind(crate::ErrorKind::Network)?; - } - self.alias_cmd = Some( - Command::new("avahi-alias") - .kill_on_drop(true) - .args( - self.services - .iter() - .filter(|(_, rc)| rc.strong_count() > 0) - .map(|(s, _)| s), - ) - .spawn()?, - ); - Ok(()) - } - async fn add(&mut self, alias: String) -> Result, Error> { - let rc = if let Some(rc) = Weak::upgrade(&self.services.remove(&alias).unwrap_or_default()) - { - rc - } else { - Arc::new(()) - }; - self.services.insert(alias, Arc::downgrade(&rc)); - self.sync().await?; - Ok(rc) - } - async fn gc(&mut self, alias: String) -> Result<(), Error> { - if let Some(rc) = Weak::upgrade(&self.services.remove(&alias).unwrap_or_default()) { - self.services.insert(alias, Arc::downgrade(&rc)); - } - self.sync().await?; - Ok(()) - } -} diff --git a/core/startos/src/net/mod.rs b/core/startos/src/net/mod.rs index 50935fb18..25d7a9647 100644 --- a/core/startos/src/net/mod.rs +++ b/core/startos/src/net/mod.rs @@ -1,10 +1,6 @@ -use std::sync::Arc; +use rpc_toolkit::{from_fn_async, AnyContext, HandlerExt, ParentHandler}; -use futures::future::BoxFuture; -use hyper::{Body, Error as HyperError, Request, Response}; -use rpc_toolkit::command; - -use crate::Error; +use crate::context::CliContext; pub mod dhcp; pub mod dns; @@ -22,11 +18,17 @@ pub mod wifi; pub const PACKAGE_CERT_PATH: &str = "/var/lib/embassy/ssl"; -#[command(subcommands(tor::tor, dhcp::dhcp, ssl::ssl, keys::rotate_key))] -pub fn net() -> Result<(), Error> { - Ok(()) +pub fn net() -> ParentHandler { + ParentHandler::new() + .subcommand("tor", tor::tor()) + .subcommand("dhcp", dhcp::dhcp()) + .subcommand("ssl", ssl::ssl()) + .subcommand( + "rotate-key", + from_fn_async(keys::rotate_key) + .with_custom_display_fn::(|handle, result| { + Ok(keys::display_requires_reboot(handle.params, result)) + }) + .with_remote_cli::(), + ) } - -pub type HttpHandler = Arc< - dyn Fn(Request) -> BoxFuture<'static, Result, HyperError>> + Send + Sync, ->; diff --git a/core/startos/src/net/net_controller.rs b/core/startos/src/net/net_controller.rs index e2e77ed68..38aa079af 100644 --- a/core/startos/src/net/net_controller.rs +++ b/core/startos/src/net/net_controller.rs @@ -3,7 +3,7 @@ use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use std::sync::{Arc, Weak}; use color_eyre::eyre::eyre; -use models::InterfaceId; +use models::{InterfaceId, PackageId}; use sqlx::PgExecutor; use tracing::instrument; @@ -11,19 +11,16 @@ use crate::error::ErrorCollection; use crate::hostname::Hostname; use crate::net::dns::DnsController; use crate::net::keys::Key; -use crate::net::mdns::MdnsController; use crate::net::ssl::{export_cert, export_key, SslManager}; use crate::net::tor::TorController; use crate::net::vhost::{AlpnInfo, VHostController}; -use crate::s9pk::manifest::PackageId; use crate::volume::cert_dir; use crate::{Error, HOST_IP}; pub struct NetController { pub(super) tor: TorController, - pub(super) mdns: MdnsController, pub(super) vhost: VHostController, - pub(super) dns: DnsController, + // pub(super) dns: DnsController, pub(super) ssl: Arc, pub(super) os_bindings: Vec>, } @@ -41,9 +38,8 @@ impl NetController { let ssl = Arc::new(ssl); let mut res = Self { tor: TorController::new(tor_control, tor_socks), - mdns: MdnsController::init().await?, vhost: VHostController::new(ssl.clone()), - dns: DnsController::init(dns_bind).await?, + // dns: DnsController::init(dns_bind).await?, ssl, os_bindings: Vec::new(), }; @@ -64,8 +60,8 @@ impl NetController { alpn.clone(), ) .await?; - self.os_bindings - .push(self.dns.add(None, HOST_IP.into()).await?); + // self.os_bindings + // .push(self.dns.add(None, HOST_IP.into()).await?); // LAN IP self.os_bindings.push( @@ -151,13 +147,13 @@ impl NetController { package: PackageId, ip: Ipv4Addr, ) -> Result { - let dns = self.dns.add(Some(package.clone()), ip).await?; + // let dns = self.dns.add(Some(package.clone()), ip).await?; Ok(NetService { shutdown: false, id: package, ip, - dns, + // dns, controller: Arc::downgrade(self), tor: BTreeMap::new(), lan: BTreeMap::new(), @@ -199,13 +195,15 @@ impl NetController { ) .await?, ); - rcs.push(self.mdns.add(key.base_address()).await?); + // rcs.push(self.mdns.add(key.base_address()).await?); + // TODO Ok(rcs) } async fn remove_lan(&self, key: &Key, external: u16, rcs: Vec>) -> Result<(), Error> { drop(rcs); - self.mdns.gc(key.base_address()).await?; + // self.mdns.gc(key.base_address()).await?; + // TODO self.vhost.gc(Some(key.local_address()), external).await } } @@ -214,7 +212,7 @@ pub struct NetService { shutdown: bool, id: PackageId, ip: Ipv4Addr, - dns: Arc<()>, + // dns: Arc<()>, controller: Weak, tor: BTreeMap<(InterfaceId, u16), (Key, Vec>)>, lan: BTreeMap<(InterfaceId, u16), (Key, Vec>)>, @@ -334,8 +332,8 @@ impl NetService { for ((_, external), (key, rcs)) in std::mem::take(&mut self.tor) { errors.handle(ctrl.remove_tor(&key, external, rcs).await); } - std::mem::take(&mut self.dns); - errors.handle(ctrl.dns.gc(Some(self.id.clone()), self.ip).await); + // std::mem::take(&mut self.dns); + // errors.handle(ctrl.dns.gc(Some(self.id.clone()), self.ip).await); errors.into_result() } else { tracing::warn!("NetService dropped after NetController is shutdown"); @@ -357,7 +355,7 @@ impl Drop for NetService { shutdown: true, id: Default::default(), ip: Ipv4Addr::new(0, 0, 0, 0), - dns: Default::default(), + // dns: Default::default(), controller: Default::default(), tor: Default::default(), lan: Default::default(), diff --git a/core/startos/src/net/ssl.rs b/core/startos/src/net/ssl.rs index 1f9397add..a3a6a24c9 100644 --- a/core/startos/src/net/ssl.rs +++ b/core/startos/src/net/ssl.rs @@ -14,12 +14,12 @@ use openssl::nid::Nid; use openssl::pkey::{PKey, Private}; use openssl::x509::{X509Builder, X509Extension, X509NameBuilder, X509}; use openssl::*; -use rpc_toolkit::command; +use rpc_toolkit::{from_fn_async, HandlerExt, ParentHandler}; use tokio::sync::{Mutex, RwLock}; use tracing::instrument; use crate::account::AccountInfo; -use crate::context::RpcContext; +use crate::context::{CliContext, RpcContext}; use crate::hostname::Hostname; use crate::init::check_time_is_synchronized; use crate::net::dhcp::ips; @@ -444,13 +444,11 @@ pub fn make_leaf_cert( Ok(cert) } -#[command(subcommands(size))] -pub async fn ssl() -> Result<(), Error> { - Ok(()) +pub fn ssl() -> ParentHandler { + ParentHandler::new().subcommand("size", from_fn_async(size).with_remote_cli::()) } -#[command] -pub async fn size(#[context] ctx: RpcContext) -> Result { +pub async fn size(ctx: RpcContext) -> Result { Ok(format!( "Cert Catch size: {}", ctx.net_controller.ssl.cert_cache.read().await.len() diff --git a/core/startos/src/net/static_server.rs b/core/startos/src/net/static_server.rs index 761566a2c..68f071c79 100644 --- a/core/startos/src/net/static_server.rs +++ b/core/startos/src/net/static_server.rs @@ -1,21 +1,25 @@ use std::fs::Metadata; use std::future::Future; use std::path::{Path, PathBuf}; -use std::sync::Arc; use std::time::UNIX_EPOCH; use async_compression::tokio::bufread::GzipEncoder; -use color_eyre::eyre::eyre; +use axum::body::Body; +use axum::extract::{self as x, Request}; +use axum::response::Response; +use axum::routing::{any, get, post}; +use axum::Router; use digest::Digest; -use futures::FutureExt; +use futures::future::ready; +use futures::{FutureExt, TryFutureExt}; use http::header::ACCEPT_ENCODING; use http::request::Parts as RequestParts; -use hyper::{Body, Method, Request, Response, StatusCode}; +use http::{HeaderMap, Method, StatusCode}; use include_dir::{include_dir, Dir}; use new_mime_guess::MimeGuess; use openssl::hash::MessageDigest; use openssl::x509::X509; -use rpc_toolkit::rpc_handler; +use rpc_toolkit::Server; use tokio::fs::File; use tokio::io::BufReader; use tokio_util::io::ReaderStream; @@ -25,11 +29,10 @@ use crate::core::rpc_continuations::RequestGuid; use crate::db::subscribe; use crate::hostname::Hostname; use crate::install::PKG_PUBLIC_DIR; -use crate::middleware::auth::{auth as auth_middleware, HasValidSession}; -use crate::middleware::cors::cors; -use crate::middleware::db::db as db_middleware; -use crate::middleware::diagnostic::diagnostic as diagnostic_middleware; -use crate::net::HttpHandler; +use crate::middleware::auth::{Auth, HasValidSession}; +use crate::middleware::cors::Cors; +use crate::middleware::db::SyncDb; +use crate::middleware::diagnostic::DiagnosticMode; use crate::{diagnostic_api, install_api, main_api, setup_api, Error, ErrorKind, ResultExt}; static NOT_FOUND: &[u8] = b"Not Found"; @@ -40,10 +43,6 @@ static EMBEDDED_UIS: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR/../../web/dist/ const PROXY_STRIP_HEADERS: &[&str] = &["cookie", "host", "origin", "referer", "user-agent"]; -fn status_fn(_: i32) -> StatusCode { - StatusCode::OK -} - #[derive(Clone)] pub enum UiMode { Setup, @@ -63,180 +62,123 @@ impl UiMode { } } -pub async fn setup_ui_file_router(ctx: SetupContext) -> Result { - let handler: HttpHandler = Arc::new(move |req| { - let ctx = ctx.clone(); - - let ui_mode = UiMode::Setup; - async move { - let res = match req.uri().path() { - path if path.starts_with("/rpc/") => { - let rpc_handler = rpc_handler!({ - command: setup_api, - context: ctx, - status: status_fn, - middleware: [ - cors, - ] - }); - - rpc_handler(req) - .await - .map_err(|err| Error::new(eyre!("{}", err), crate::ErrorKind::Network)) - } - _ => alt_ui(req, ui_mode).await, - }; - - match res { - Ok(data) => Ok(data), - Err(err) => Ok(server_error(err)), - } - } - .boxed() - }); - - Ok(handler) +pub fn setup_ui_file_router(ctx: SetupContext) -> Router { + Router::new() + .route_service( + "/rpc/*path", + post(Server::new(move || ready(Ok(ctx.clone())), setup_api()).middleware(Cors::new())), + ) + .fallback(any(|request: Request| async move { + alt_ui(request, UiMode::Setup) + .await + .unwrap_or_else(server_error) + })) } -pub async fn diag_ui_file_router(ctx: DiagnosticContext) -> Result { - let handler: HttpHandler = Arc::new(move |req| { - let ctx = ctx.clone(); - let ui_mode = UiMode::Diag; - async move { - let res = match req.uri().path() { - path if path.starts_with("/rpc/") => { - let rpc_handler = rpc_handler!({ - command: diagnostic_api, - context: ctx, - status: status_fn, - middleware: [ - cors, - diagnostic_middleware, - ] - }); - - rpc_handler(req) - .await - .map_err(|err| Error::new(eyre!("{}", err), crate::ErrorKind::Network)) - } - _ => alt_ui(req, ui_mode).await, - }; - - match res { - Ok(data) => Ok(data), - Err(err) => Ok(server_error(err)), - } - } - .boxed() - }); - - Ok(handler) +pub fn diag_ui_file_router(ctx: DiagnosticContext) -> Router { + Router::new() + .route( + "/rpc/*path", + post( + Server::new(move || ready(Ok(ctx.clone())), diagnostic_api()) + .middleware(Cors::new()) + .middleware(DiagnosticMode::new()), + ), + ) + .fallback(any(|request: Request| async move { + alt_ui(request, UiMode::Diag) + .await + .unwrap_or_else(server_error) + })) } -pub async fn install_ui_file_router(ctx: InstallContext) -> Result { - let handler: HttpHandler = Arc::new(move |req| { - let ctx = ctx.clone(); - let ui_mode = UiMode::Install; - async move { - let res = match req.uri().path() { - path if path.starts_with("/rpc/") => { - let rpc_handler = rpc_handler!({ - command: install_api, - context: ctx, - status: status_fn, - middleware: [ - cors, - ] - }); - - rpc_handler(req) - .await - .map_err(|err| Error::new(eyre!("{}", err), crate::ErrorKind::Network)) - } - _ => alt_ui(req, ui_mode).await, - }; - - match res { - Ok(data) => Ok(data), - Err(err) => Ok(server_error(err)), - } - } - .boxed() - }); - - Ok(handler) +pub fn install_ui_file_router(ctx: InstallContext) -> Router { + Router::new() + .route("/rpc/*path", { + let ctx = ctx.clone(); + post(Server::new(move || ready(Ok(ctx.clone())), install_api()).middleware(Cors::new())) + }) + .fallback(any(|request: Request| async move { + alt_ui(request, UiMode::Install) + .await + .unwrap_or_else(server_error) + })) } -pub async fn main_ui_server_router(ctx: RpcContext) -> Result { - let handler: HttpHandler = Arc::new(move |req| { - let ctx = ctx.clone(); - - async move { - let res = match req.uri().path() { - path if path.starts_with("/rpc/") => { - let auth_middleware = auth_middleware(ctx.clone()); - let db_middleware = db_middleware(ctx.clone()); - let rpc_handler = rpc_handler!({ - command: main_api, - context: ctx, - status: status_fn, - middleware: [ - cors, - auth_middleware, - db_middleware, - ] - }); - - rpc_handler(req) +pub fn main_ui_server_router(ctx: RpcContext) -> Router { + Router::new() + .route("/rpc/*path", { + let ctx = ctx.clone(); + post( + Server::new(move || ready(Ok(ctx.clone())), main_api()) + .middleware(Cors::new()) + .middleware(Auth::new()) + .middleware(SyncDb::new()), + ) + }) + .route( + "/ws/db", + any({ + let ctx = ctx.clone(); + move |headers: HeaderMap, ws: x::WebSocketUpgrade| async move { + subscribe(ctx, headers, ws) .await - .map_err(|err| Error::new(eyre!("{}", err), crate::ErrorKind::Network)) + .unwrap_or_else(server_error) } - "/ws/db" => subscribe(ctx, req).await, - path if path.starts_with("/ws/rpc/") => { - match RequestGuid::from(path.strip_prefix("/ws/rpc/").unwrap()) { + }), + ) + .route( + "/ws/rpc/*path", + get({ + let ctx = ctx.clone(); + move |headers: HeaderMap, + x::Path(path): x::Path, + ws: axum::extract::ws::WebSocketUpgrade| async move { + match RequestGuid::from(&path) { None => { tracing::debug!("No Guid Path"); - Ok::<_, Error>(bad_request()) + bad_request() } Some(guid) => match ctx.get_ws_continuation_handler(&guid).await { - Some(cont) => match cont(req).await { - Ok::<_, Error>(r) => Ok::<_, Error>(r), - Err(err) => Ok::<_, Error>(server_error(err)), - }, - _ => Ok::<_, Error>(not_found()), + Some(cont) => ws.on_upgrade(cont), + _ => not_found(), }, } } - path if path.starts_with("/rest/rpc/") => { - match RequestGuid::from(path.strip_prefix("/rest/rpc/").unwrap()) { + }), + ) + .route( + "/rest/rpc/*path", + any({ + let ctx = ctx.clone(); + move |request: x::Request| async move { + let path = request + .uri() + .path() + .clone() + .strip_prefix("/rest/rpc/") + .unwrap_or_default(); + match RequestGuid::from(&path) { None => { tracing::debug!("No Guid Path"); - Ok::<_, Error>(bad_request()) + bad_request() } Some(guid) => match ctx.get_rest_continuation_handler(&guid).await { - None => Ok::<_, Error>(not_found()), - Some(cont) => match cont(req).await { - Ok::<_, Error>(r) => Ok::<_, Error>(r), - Err(e) => Ok::<_, Error>(server_error(e)), - }, + None => not_found(), + Some(cont) => cont(request).await.unwrap_or_else(server_error), }, } } - _ => main_embassy_ui(req, ctx).await, - }; - - match res { - Ok(data) => Ok(data), - Err(err) => Ok(server_error(err)), - } - } - .boxed() - }); - - Ok(handler) + }), + ) + .fallback(any(move |request: Request| async move { + main_embassy_ui(request, ctx) + .await + .unwrap_or_else(server_error) + })) } -async fn alt_ui(req: Request, ui_mode: UiMode) -> Result, Error> { +async fn alt_ui(req: Request, ui_mode: UiMode) -> Result { let (request_parts, _body) = req.into_parts(); match &request_parts.method { &Method::GET => { @@ -266,20 +208,21 @@ async fn alt_ui(req: Request, ui_mode: UiMode) -> Result, E async fn if_authorized< F: FnOnce() -> Fut, - Fut: Future, Error>> + Send + Sync, + Fut: Future> + Send + Sync, >( ctx: &RpcContext, parts: &RequestParts, f: F, -) -> Result, Error> { - if let Err(e) = HasValidSession::from_request_parts(parts, ctx).await { +) -> Result { + if let Err(e) = HasValidSession::from_header(parts.headers.get(http::header::COOKIE), ctx).await + { un_authorized(e, parts.uri.path()) } else { f().await } } -async fn main_embassy_ui(req: Request, ctx: RpcContext) -> Result, Error> { +async fn main_embassy_ui(req: Request, ctx: RpcContext) -> Result { let (request_parts, _body) = req.into_parts(); match ( &request_parts.method, @@ -291,21 +234,7 @@ async fn main_embassy_ui(req: Request, ctx: RpcContext) -> Result { - if_authorized(&ctx, &request_parts, || async { - let sub_path = Path::new(path); - if let Ok(rest) = sub_path.strip_prefix("package-data") { - FileData::from_path( - &request_parts, - &ctx.datadir.join(PKG_PUBLIC_DIR).join(rest), - ) - .await? - .into_response(&request_parts) - .await - } else { - Ok(not_found()) - } - }) - .await + todo!("pull directly from s9pk") } (&Method::GET, Some(("proxy", target))) => { if_authorized(&ctx, &request_parts, || async { @@ -322,19 +251,27 @@ async fn main_embassy_ui(req: Request, ctx: RpcContext) -> Result, ctx: RpcContext) -> Result Result, Error> { +fn un_authorized(err: Error, path: &str) -> Result { tracing::warn!("unauthorized for {} @{:?}", err, path); tracing::debug!("{:?}", err); Ok(Response::builder() @@ -378,7 +315,7 @@ fn un_authorized(err: Error, path: &str) -> Result, Error> { } /// HTTP status code 404 -fn not_found() -> Response { +fn not_found() -> Response { Response::builder() .status(StatusCode::NOT_FOUND) .body(NOT_FOUND.into()) @@ -386,28 +323,28 @@ fn not_found() -> Response { } /// HTTP status code 405 -fn method_not_allowed() -> Response { +fn method_not_allowed() -> Response { Response::builder() .status(StatusCode::METHOD_NOT_ALLOWED) .body(METHOD_NOT_ALLOWED.into()) .unwrap() } -fn server_error(err: Error) -> Response { +fn server_error(err: Error) -> Response { Response::builder() .status(StatusCode::INTERNAL_SERVER_ERROR) .body(err.to_string().into()) .unwrap() } -fn bad_request() -> Response { +fn bad_request() -> Response { Response::builder() .status(StatusCode::BAD_REQUEST) .body(Body::empty()) .unwrap() } -fn cert_send(cert: &X509, hostname: &Hostname) -> Result, Error> { +fn cert_send(cert: &X509, hostname: &Hostname) -> Result { let pem = cert.to_pem()?; Response::builder() .status(StatusCode::OK) @@ -499,12 +436,12 @@ impl FileData { let (len, data) = if encoding == Some("gzip") { ( None, - Body::wrap_stream(ReaderStream::new(GzipEncoder::new(BufReader::new(file)))), + Body::from_stream(ReaderStream::new(GzipEncoder::new(BufReader::new(file)))), ) } else { ( Some(metadata.len()), - Body::wrap_stream(ReaderStream::new(file)), + Body::from_stream(ReaderStream::new(file)), ) }; @@ -519,7 +456,7 @@ impl FileData { }) } - async fn into_response(self, req: &RequestParts) -> Result, Error> { + async fn into_response(self, req: &RequestParts) -> Result { let mut builder = Response::builder(); if let Some(mime) = self.mime { builder = builder.header(http::header::CONTENT_TYPE, &*mime); diff --git a/core/startos/src/net/tor.rs b/core/startos/src/net/tor.rs index 1bf4c5f44..13096dab8 100644 --- a/core/startos/src/net/tor.rs +++ b/core/startos/src/net/tor.rs @@ -4,7 +4,7 @@ use std::sync::atomic::AtomicBool; use std::sync::{Arc, Weak}; use std::time::Duration; -use clap::ArgMatches; +use clap::Parser; use color_eyre::eyre::eyre; use futures::future::BoxFuture; use futures::{FutureExt, TryStreamExt}; @@ -12,8 +12,9 @@ use helpers::NonDetachingJoinHandle; use itertools::Itertools; use lazy_static::lazy_static; use regex::Regex; -use rpc_toolkit::command; use rpc_toolkit::yajrc::RpcError; +use rpc_toolkit::{command, from_fn_async, AnyContext, Empty, HandlerExt, ParentHandler}; +use serde::{Deserialize, Serialize}; use tokio::net::TcpStream; use tokio::process::Command; use tokio::sync::{mpsc, oneshot}; @@ -27,8 +28,8 @@ use crate::logs::{ cli_logs_generic_follow, cli_logs_generic_nofollow, fetch_logs, follow_logs, journalctl, LogFollowResponse, LogResponse, LogSource, }; -use crate::util::serde::{display_serializable, IoFormat}; -use crate::util::{display_none, Invoke}; +use crate::util::serde::{display_serializable, HandlerExtSerde, WithIoFormat}; +use crate::util::Invoke; use crate::{Error, ErrorKind, ResultExt as _}; pub const SYSTEMD_UNIT: &str = "tor@default"; @@ -53,16 +54,37 @@ lazy_static! { static ref PROGRESS_REGEX: Regex = Regex::new("PROGRESS=([0-9]+)").unwrap(); } -#[command(subcommands(list_services, logs, reset))] -pub fn tor() -> Result<(), Error> { - Ok(()) +pub fn tor() -> ParentHandler { + ParentHandler::new() + .subcommand( + "list-services", + from_fn_async(list_services) + .with_display_serializable() + .with_custom_display_fn::(|handle, result| { + Ok(display_services(handle.params, result)) + }) + .with_remote_cli::(), + ) + .subcommand("logs", logs()) + .subcommand( + "reset", + from_fn_async(reset) + .no_display() + .with_remote_cli::(), + ) +} +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct ResetParams { + #[arg(name = "wipe-state", short = 'w', long = "wipe-state")] + wipe_state: bool, + reason: String, } -#[command(display(display_none))] pub async fn reset( - #[context] ctx: RpcContext, - #[arg(rename = "wipe-state", short = 'w', long = "wipe-state")] wipe_state: bool, - #[arg] reason: String, + ctx: RpcContext, + ResetParams { reason, wipe_state }: ResetParams, ) -> Result<(), Error> { ctx.net_controller .tor @@ -70,11 +92,11 @@ pub async fn reset( .await } -fn display_services(services: Vec, matches: &ArgMatches) { +pub fn display_services(params: WithIoFormat, services: Vec) { use prettytable::*; - if matches.is_present("format") { - return display_serializable(services, matches); + if let Some(format) = params.format { + return display_serializable(format, services); } let mut table = Table::new(); @@ -85,32 +107,54 @@ fn display_services(services: Vec, matches: &ArgMatches) { table.print_tty(false).unwrap(); } -#[command(rename = "list-services", display(display_services))] -pub async fn list_services( - #[context] ctx: RpcContext, - #[allow(unused_variables)] - #[arg(long = "format")] - format: Option, -) -> Result, Error> { +pub async fn list_services(ctx: RpcContext, _: Empty) -> Result, Error> { ctx.net_controller.tor.list_services().await } -#[command( - custom_cli(cli_logs(async, context(CliContext))), - subcommands(self(logs_nofollow(async)), logs_follow), - display(display_none) -)] -pub async fn logs( - #[arg(short = 'l', long = "limit")] limit: Option, - #[arg(short = 'c', long = "cursor")] cursor: Option, - #[arg(short = 'B', long = "before", default)] before: bool, - #[arg(short = 'f', long = "follow", default)] follow: bool, -) -> Result<(Option, Option, bool, bool), Error> { - Ok((limit, cursor, before, follow)) +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct LogsParams { + #[arg(short = 'l', long = "limit")] + limit: Option, + #[arg(short = 'c', long = "cursor")] + cursor: Option, + #[arg(short = 'B', long = "before")] + #[serde(default)] + before: bool, + #[arg(short = 'f', long = "follow")] + #[serde(default)] + follow: bool, +} + +pub fn logs() -> ParentHandler { + ParentHandler::new() + .root_handler( + from_fn_async(cli_logs) + .no_display() + .with_inherited(|params, _| params), + ) + .root_handler( + from_fn_async(logs_nofollow) + .with_inherited(|params, _| params) + .no_cli(), + ) + .subcommand( + "follow", + from_fn_async(logs_follow) + .with_inherited(|params, _| params) + .no_cli(), + ) } pub async fn cli_logs( ctx: CliContext, - (limit, cursor, before, follow): (Option, Option, bool, bool), + _: Empty, + LogsParams { + limit, + cursor, + before, + follow, + }: LogsParams, ) -> Result<(), RpcError> { if follow { if cursor.is_some() { @@ -131,16 +175,22 @@ pub async fn cli_logs( } } pub async fn logs_nofollow( - _ctx: (), - (limit, cursor, before, _): (Option, Option, bool, bool), + _: AnyContext, + _: Empty, + LogsParams { + limit, + cursor, + before, + .. + }: LogsParams, ) -> Result { fetch_logs(LogSource::Unit(SYSTEMD_UNIT), limit, cursor, before).await } -#[command(rpc_only, rename = "follow", display(display_none))] pub async fn logs_follow( - #[context] ctx: RpcContext, - #[parent_data] (limit, _, _, _): (Option, Option, bool, bool), + ctx: RpcContext, + _: Empty, + LogsParams { limit, .. }: LogsParams, ) -> Result { follow_logs(ctx, LogSource::Unit(SYSTEMD_UNIT), limit).await } @@ -216,7 +266,7 @@ impl TorController { .lines() .map(|l| l.trim()) .filter(|l| !l.is_empty()) - .map(|l| l.parse().with_kind(ErrorKind::Tor)) + .map(|l| l.parse::().with_kind(ErrorKind::Tor)) .collect() } } diff --git a/core/startos/src/net/utils.rs b/core/startos/src/net/utils.rs index e496bd1f7..6de319a5e 100644 --- a/core/startos/src/net/utils.rs +++ b/core/startos/src/net/utils.rs @@ -1,4 +1,3 @@ -use std::convert::Infallible; use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr}; use std::path::Path; @@ -120,16 +119,16 @@ impl SingleAccept { Self(Some(conn)) } } -impl hyper::server::accept::Accept for SingleAccept { - type Conn = T; - type Error = Infallible; - fn poll_accept( - self: std::pin::Pin<&mut Self>, - _cx: &mut std::task::Context<'_>, - ) -> std::task::Poll>> { - std::task::Poll::Ready(self.project().0.take().map(Ok)) - } -} +// impl axum_server::accept::Accept for SingleAccept { +// type Conn = T; +// type Error = Infallible; +// fn poll_accept( +// self: std::pin::Pin<&mut Self>, +// _cx: &mut std::task::Context<'_>, +// ) -> std::task::Poll>> { +// std::task::Poll::Ready(self.project().0.take().map(Ok)) +// } +// } pub struct TcpListeners { listeners: Vec, @@ -147,20 +146,21 @@ impl TcpListeners { .0 } } -impl hyper::server::accept::Accept for TcpListeners { - type Conn = TcpStream; - type Error = std::io::Error; +// impl hyper::server::accept::Accept for TcpListeners { +// type Conn = TcpStream; +// type Error = std::io::Error; - fn poll_accept( - self: std::pin::Pin<&mut Self>, - cx: &mut std::task::Context<'_>, - ) -> std::task::Poll>> { - for listener in self.listeners.iter() { - let poll = listener.poll_accept(cx); - if poll.is_ready() { - return poll.map(|a| a.map(|a| a.0)).map(Some); - } - } - std::task::Poll::Pending - } -} +// fn poll_accept( +// self: std::pin::Pin<&mut Self>, +// cx: &mut std::task::Context<'_>, +// ) -> std::task::Poll>> { +// for listener in self.listeners.iter() { +// let poll = listener.poll_accept(cx); +// if poll.is_ready() { +// return poll.map(|a| a.map(|a| a.0)).map(Some); +// } +// } +// std::task::Poll::Pending +// } +// } +// TODO diff --git a/core/startos/src/net/vhost.rs b/core/startos/src/net/vhost.rs index bfbba0572..3d60544db 100644 --- a/core/startos/src/net/vhost.rs +++ b/core/startos/src/net/vhost.rs @@ -1,18 +1,16 @@ use std::collections::BTreeMap; -use std::convert::Infallible; use std::net::{IpAddr, Ipv6Addr, SocketAddr}; -use std::str::FromStr; use std::sync::{Arc, Weak}; use std::time::Duration; use color_eyre::eyre::eyre; use helpers::NonDetachingJoinHandle; -use http::{Response, Uri}; -use hyper::service::{make_service_fn, service_fn}; -use hyper::Body; use models::ResultExt; use tokio::net::{TcpListener, TcpStream}; use tokio::sync::{Mutex, RwLock}; +use tokio_rustls::rustls::pki_types::{ + CertificateDer, PrivateKeyDer, PrivatePkcs8KeyDer, ServerName, +}; use tokio_rustls::rustls::server::Acceptor; use tokio_rustls::rustls::{RootCertStore, ServerConfig}; use tokio_rustls::{LazyConfigAcceptor, TlsConnector}; @@ -20,7 +18,6 @@ use tracing::instrument; use crate::net::keys::Key; use crate::net::ssl::SslManager; -use crate::net::utils::SingleAccept; use crate::prelude::*; use crate::util::io::{BackTrackingReader, TimeoutStream}; @@ -125,37 +122,38 @@ impl VHostServer { { Ok(a) => a, Err(_) => { - stream.rewind(); - return hyper::server::Server::builder( - SingleAccept::new(stream), - ) - .serve(make_service_fn(|_| async { - Ok::<_, Infallible>(service_fn(|req| async move { - let host = req - .headers() - .get(http::header::HOST) - .and_then(|host| host.to_str().ok()); - let uri = Uri::from_parts({ - let mut parts = - req.uri().to_owned().into_parts(); - parts.authority = host - .map(FromStr::from_str) - .transpose()?; - parts - })?; - Response::builder() - .status( - http::StatusCode::TEMPORARY_REDIRECT, - ) - .header( - http::header::LOCATION, - uri.to_string(), - ) - .body(Body::default()) - })) - })) - .await - .with_kind(crate::ErrorKind::Network); + // stream.rewind(); + // return hyper::server::Server::builder( + // SingleAccept::new(stream), + // ) + // .serve(make_service_fn(|_| async { + // Ok::<_, Infallible>(service_fn(|req| async move { + // let host = req + // .headers() + // .get(http::header::HOST) + // .and_then(|host| host.to_str().ok()); + // let uri = Uri::from_parts({ + // let mut parts = + // req.uri().to_owned().into_parts(); + // parts.authority = host + // .map(FromStr::from_str) + // .transpose()?; + // parts + // })?; + // Response::builder() + // .status( + // http::StatusCode::TEMPORARY_REDIRECT, + // ) + // .header( + // http::header::LOCATION, + // uri.to_string(), + // ) + // .body(Body::default()) + // })) + // })) + // .await + // .with_kind(crate::ErrorKind::Network); + todo!() } }; let target_name = @@ -189,7 +187,6 @@ impl VHostServer { let key = ssl.with_certs(target.key, target.addr.ip()).await?; let cfg = ServerConfig::builder() - .with_safe_defaults() .with_no_client_auth(); let mut cfg = if mid.client_hello().signature_schemes().contains( @@ -199,44 +196,43 @@ impl VHostServer { key.fullchain_ed25519() .into_iter() .map(|c| { - Ok(tokio_rustls::rustls::Certificate( + Ok(tokio_rustls::rustls::pki_types::CertificateDer::from( c.to_der()?, )) }) .collect::>()?, - tokio_rustls::rustls::PrivateKey( + PrivateKeyDer::from(PrivatePkcs8KeyDer::from( key.key() .openssl_key_ed25519() - .private_key_to_der()?, - ), + .private_key_to_pkcs8()?, + )), ) } else { cfg.with_single_cert( key.fullchain_nistp256() .into_iter() .map(|c| { - Ok(tokio_rustls::rustls::Certificate( + Ok(tokio_rustls::rustls::pki_types::CertificateDer::from( c.to_der()?, )) }) .collect::>()?, - tokio_rustls::rustls::PrivateKey( + PrivateKeyDer::from(PrivatePkcs8KeyDer::from( key.key() .openssl_key_nistp256() - .private_key_to_der()?, - ), + .private_key_to_pkcs8()?, + )), ) } .with_kind(crate::ErrorKind::OpenSsl)?; match target.connect_ssl { Ok(()) => { let mut client_cfg = - tokio_rustls::rustls::ClientConfig::builder() - .with_safe_defaults() + tokio_rustls::rustls::ClientConfig::builder() .with_root_certificates({ let mut store = RootCertStore::empty(); store.add( - &tokio_rustls::rustls::Certificate( + CertificateDer::from( key.root_ca().to_der()?, ), ).with_kind(crate::ErrorKind::OpenSsl)?; @@ -253,13 +249,9 @@ impl VHostServer { let mut target_stream = TlsConnector::from(Arc::new(client_cfg)) .connect_with( - key.key() - .internal_address() - .as_str() - .try_into() - .with_kind( - crate::ErrorKind::OpenSsl, - )?, + ServerName::try_from( + key.key().internal_address(), + ).with_kind(crate::ErrorKind::OpenSsl)?, tcp_stream, |conn| { cfg.alpn_protocols.extend( diff --git a/core/startos/src/net/web_server.rs b/core/startos/src/net/web_server.rs index c2e25a413..a89aae92f 100644 --- a/core/startos/src/net/web_server.rs +++ b/core/startos/src/net/web_server.rs @@ -1,18 +1,15 @@ -use std::convert::Infallible; use std::net::SocketAddr; +use std::time::Duration; -use futures::future::ready; -use futures::FutureExt; +use axum::Router; +use axum_server::Handle; use helpers::NonDetachingJoinHandle; -use hyper::service::{make_service_fn, service_fn}; -use hyper::Server; use tokio::sync::oneshot; use crate::context::{DiagnosticContext, InstallContext, RpcContext, SetupContext}; use crate::net::static_server::{ diag_ui_file_router, install_ui_file_router, main_ui_server_router, setup_ui_file_router, }; -use crate::net::HttpHandler; use crate::Error; pub struct WebServer { @@ -20,18 +17,18 @@ pub struct WebServer { thread: NonDetachingJoinHandle<()>, } impl WebServer { - pub fn new(bind: SocketAddr, router: HttpHandler) -> Self { + pub fn new(bind: SocketAddr, router: Router) -> Self { let (shutdown, shutdown_recv) = oneshot::channel(); let thread = NonDetachingJoinHandle::from(tokio::spawn(async move { - let server = Server::bind(&bind) - .http1_preserve_header_case(true) - .http1_title_case_headers(true) - .serve(make_service_fn(move |_| { - let router = router.clone(); - ready(Ok::<_, Infallible>(service_fn(move |req| router(req)))) - })) - .with_graceful_shutdown(shutdown_recv.map(|_| ())); - if let Err(e) = server.await { + let handle = Handle::new(); + let mut server = axum_server::bind(bind).handle(handle.clone()); + server.http_builder().http1().preserve_header_case(true); + server.http_builder().http1().title_case_headers(true); + + if let (Err(e), _) = tokio::join!(server.serve(router.into_make_service()), async { + let _ = shutdown_recv.await; + handle.graceful_shutdown(Some(Duration::from_secs(0))); + }) { tracing::error!("Spawning hyper server error: {}", e); } })); @@ -43,19 +40,19 @@ impl WebServer { self.thread.await.unwrap() } - pub async fn main(bind: SocketAddr, ctx: RpcContext) -> Result { - Ok(Self::new(bind, main_ui_server_router(ctx).await?)) + pub fn main(bind: SocketAddr, ctx: RpcContext) -> Result { + Ok(Self::new(bind, main_ui_server_router(ctx))) } - pub async fn setup(bind: SocketAddr, ctx: SetupContext) -> Result { - Ok(Self::new(bind, setup_ui_file_router(ctx).await?)) + pub fn setup(bind: SocketAddr, ctx: SetupContext) -> Result { + Ok(Self::new(bind, setup_ui_file_router(ctx))) } - pub async fn diagnostic(bind: SocketAddr, ctx: DiagnosticContext) -> Result { - Ok(Self::new(bind, diag_ui_file_router(ctx).await?)) + pub fn diagnostic(bind: SocketAddr, ctx: DiagnosticContext) -> Result { + Ok(Self::new(bind, diag_ui_file_router(ctx))) } - pub async fn install(bind: SocketAddr, ctx: InstallContext) -> Result { - Ok(Self::new(bind, install_ui_file_router(ctx).await?)) + pub fn install(bind: SocketAddr, ctx: InstallContext) -> Result { + Ok(Self::new(bind, install_ui_file_router(ctx))) } } diff --git a/core/startos/src/net/wifi.rs b/core/startos/src/net/wifi.rs index 8429f9205..be1c49fdc 100644 --- a/core/startos/src/net/wifi.rs +++ b/core/startos/src/net/wifi.rs @@ -3,19 +3,21 @@ use std::path::Path; use std::sync::Arc; use std::time::Duration; -use clap::ArgMatches; +use clap::builder::TypedValueParser; +use clap::Parser; use isocountry::CountryCode; use lazy_static::lazy_static; use regex::Regex; -use rpc_toolkit::command; +use rpc_toolkit::{command, from_fn_async, AnyContext, Empty, HandlerExt, ParentHandler}; +use serde::{Deserialize, Serialize}; use tokio::process::Command; use tokio::sync::RwLock; use tracing::instrument; -use crate::context::RpcContext; +use crate::context::{CliContext, RpcContext}; use crate::prelude::*; -use crate::util::serde::{display_serializable, IoFormat}; -use crate::util::{display_none, Invoke}; +use crate::util::serde::{display_serializable, HandlerExtSerde, WithIoFormat}; +use crate::util::Invoke; use crate::{Error, ErrorKind}; type WifiManager = Arc>; @@ -31,28 +33,69 @@ pub fn wifi_manager(ctx: &RpcContext) -> Result<&WifiManager, Error> { } } -#[command(subcommands(add, connect, delete, get, country, available))] -pub async fn wifi() -> Result<(), Error> { - Ok(()) +pub fn wifi() -> ParentHandler { + ParentHandler::new() + .subcommand( + "add", + from_fn_async(add) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "connect", + from_fn_async(connect) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "delete", + from_fn_async(delete) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "get", + from_fn_async(get) + .with_display_serializable() + .with_custom_display_fn::(|handle, result| { + Ok(display_wifi_info(handle.params, result)) + }) + .with_remote_cli::(), + ) + .subcommand("country", country()) + .subcommand("available", available()) } -#[command(subcommands(get_available))] -pub async fn available() -> Result<(), Error> { - Ok(()) +pub fn available() -> ParentHandler { + ParentHandler::new().subcommand( + "get", + from_fn_async(get_available) + .with_display_serializable() + .with_custom_display_fn::(|handle, result| { + Ok(display_wifi_list(handle.params, result)) + }) + .with_remote_cli::(), + ) } -#[command(subcommands(set_country))] -pub async fn country() -> Result<(), Error> { - Ok(()) +pub fn country() -> ParentHandler { + ParentHandler::new().subcommand( + "set", + from_fn_async(set_country) + .no_display() + .with_remote_cli::(), + ) } -#[command(display(display_none))] +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct AddParams { + ssid: String, + password: String, +} #[instrument(skip_all)] -pub async fn add( - #[context] ctx: RpcContext, - #[arg] ssid: String, - #[arg] password: String, -) -> Result<(), Error> { +pub async fn add(ctx: RpcContext, AddParams { ssid, password }: AddParams) -> Result<(), Error> { let wifi_manager = wifi_manager(&ctx)?; if !ssid.is_ascii() { return Err(Error::new( @@ -95,10 +138,15 @@ pub async fn add( } Ok(()) } +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct SsidParams { + ssid: String, +} -#[command(display(display_none))] #[instrument(skip_all)] -pub async fn connect(#[context] ctx: RpcContext, #[arg] ssid: String) -> Result<(), Error> { +pub async fn connect(ctx: RpcContext, SsidParams { ssid }: SsidParams) -> Result<(), Error> { let wifi_manager = wifi_manager(&ctx)?; if !ssid.is_ascii() { return Err(Error::new( @@ -144,9 +192,8 @@ pub async fn connect(#[context] ctx: RpcContext, #[arg] ssid: String) -> Result< Ok(()) } -#[command(display(display_none))] #[instrument(skip_all)] -pub async fn delete(#[context] ctx: RpcContext, #[arg] ssid: String) -> Result<(), Error> { +pub async fn delete(ctx: RpcContext, SsidParams { ssid }: SsidParams) -> Result<(), Error> { let wifi_manager = wifi_manager(&ctx)?; if !ssid.is_ascii() { return Err(Error::new( @@ -192,11 +239,11 @@ pub struct WifiListOut { security: Vec, } pub type WifiList = HashMap; -fn display_wifi_info(info: WiFiInfo, matches: &ArgMatches) { +fn display_wifi_info(params: WithIoFormat, info: WiFiInfo) { use prettytable::*; - if matches.is_present("format") { - return display_serializable(info, matches); + if let Some(format) = params.format { + return display_serializable(format, info); } let mut table_global = Table::new(); @@ -256,11 +303,11 @@ fn display_wifi_info(info: WiFiInfo, matches: &ArgMatches) { table_global.print_tty(false).unwrap(); } -fn display_wifi_list(info: Vec, matches: &ArgMatches) { +fn display_wifi_list(params: WithIoFormat, info: Vec) { use prettytable::*; - if matches.is_present("format") { - return display_serializable(info, matches); + if let Some(format) = params.format { + return display_serializable(format, info); } let mut table_global = Table::new(); @@ -280,14 +327,9 @@ fn display_wifi_list(info: Vec, matches: &ArgMatches) { table_global.print_tty(false).unwrap(); } -#[command(display(display_wifi_info))] +// #[command(display(display_wifi_info))] #[instrument(skip_all)] -pub async fn get( - #[context] ctx: RpcContext, - #[allow(unused_variables)] - #[arg(long = "format")] - format: Option, -) -> Result { +pub async fn get(ctx: RpcContext, _: Empty) -> Result { let wifi_manager = wifi_manager(&ctx)?; let wpa_supplicant = wifi_manager.read().await; let (list_networks, current_res, country_res, ethernet_res, signal_strengths) = tokio::join!( @@ -334,14 +376,8 @@ pub async fn get( }) } -#[command(rename = "get", display(display_wifi_list))] #[instrument(skip_all)] -pub async fn get_available( - #[context] ctx: RpcContext, - #[allow(unused_variables)] - #[arg(long = "format")] - format: Option, -) -> Result, Error> { +pub async fn get_available(ctx: RpcContext, _: Empty) -> Result, Error> { let wifi_manager = wifi_manager(&ctx)?; let wpa_supplicant = wifi_manager.read().await; let (wifi_list, network_list) = tokio::join!( @@ -366,10 +402,16 @@ pub async fn get_available( Ok(wifi_list) } -#[command(rename = "set", display(display_none))] +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct SetCountryParams { + #[arg(value_parser = CountryCodeParser)] + country: CountryCode, +} pub async fn set_country( - #[context] ctx: RpcContext, - #[arg(parse(country_code_parse))] country: CountryCode, + ctx: RpcContext, + SetCountryParams { country }: SetCountryParams, ) -> Result<(), Error> { let wifi_manager = wifi_manager(&ctx)?; if !interface_connected(&ctx.ethernet_interface).await? { @@ -769,13 +811,24 @@ pub async fn interface_connected(interface: &str) -> Result { Ok(v.is_some()) } -pub fn country_code_parse(code: &str, _matches: &ArgMatches) -> Result { - CountryCode::for_alpha2(code).map_err(|_| { - Error::new( - color_eyre::eyre::eyre!("Invalid Country Code: {}", code), - ErrorKind::Wifi, - ) - }) +#[derive(Clone)] +struct CountryCodeParser; +impl TypedValueParser for CountryCodeParser { + type Value = CountryCode; + fn parse_ref( + &self, + _: &clap::Command, + _: Option<&clap::Arg>, + value: &std::ffi::OsStr, + ) -> Result { + let code = value.to_string_lossy(); + CountryCode::for_alpha2(&code).map_err(|_| { + clap::Error::raw( + clap::error::ErrorKind::ValueValidation, + color_eyre::eyre::eyre!("Invalid Country Code: {}", code), + ) + }) + } } #[instrument(skip_all)] diff --git a/core/startos/src/net/ws_server.rs b/core/startos/src/net/ws_server.rs deleted file mode 100644 index 16519c6c8..000000000 --- a/core/startos/src/net/ws_server.rs +++ /dev/null @@ -1,94 +0,0 @@ -use crate::context::RpcContext; - -pub async fn ws_server_handle(rpc_ctx: RpcContext) { - - let ws_ctx = rpc_ctx.clone(); - let ws_server_handle = { - let builder = Server::bind(&ws_ctx.bind_ws); - - let make_svc = ::rpc_toolkit::hyper::service::make_service_fn(move |_| { - let ctx = ws_ctx.clone(); - async move { - Ok::<_, ::rpc_toolkit::hyper::Error>(::rpc_toolkit::hyper::service::service_fn( - move |req| { - let ctx = ctx.clone(); - async move { - tracing::debug!("Request to {}", req.uri().path()); - match req.uri().path() { - "/ws/db" => { - Ok(subscribe(ctx, req).await.unwrap_or_else(err_to_500)) - } - path if path.starts_with("/ws/rpc/") => { - match RequestGuid::from( - path.strip_prefix("/ws/rpc/").unwrap(), - ) { - None => { - tracing::debug!("No Guid Path"); - Response::builder() - .status(StatusCode::BAD_REQUEST) - .body(Body::empty()) - } - Some(guid) => { - match ctx.get_ws_continuation_handler(&guid).await { - Some(cont) => match cont(req).await { - Ok(r) => Ok(r), - Err(e) => Response::builder() - .status( - StatusCode::INTERNAL_SERVER_ERROR, - ) - .body(Body::from(format!("{}", e))), - }, - _ => Response::builder() - .status(StatusCode::NOT_FOUND) - .body(Body::empty()), - } - } - } - } - path if path.starts_with("/rest/rpc/") => { - match RequestGuid::from( - path.strip_prefix("/rest/rpc/").unwrap(), - ) { - None => { - tracing::debug!("No Guid Path"); - Response::builder() - .status(StatusCode::BAD_REQUEST) - .body(Body::empty()) - } - Some(guid) => { - match ctx.get_rest_continuation_handler(&guid).await - { - None => Response::builder() - .status(StatusCode::NOT_FOUND) - .body(Body::empty()), - Some(cont) => match cont(req).await { - Ok(r) => Ok(r), - Err(e) => Response::builder() - .status( - StatusCode::INTERNAL_SERVER_ERROR, - ) - .body(Body::from(format!("{}", e))), - }, - } - } - } - } - _ => Response::builder() - .status(StatusCode::NOT_FOUND) - .body(Body::empty()), - } - } - }, - )) - } - }); - builder.serve(make_svc) - } - .with_graceful_shutdown({ - let mut shutdown = rpc_ctx.shutdown.subscribe(); - async move { - shutdown.recv().await.expect("context dropped"); - } - }); - -} \ No newline at end of file diff --git a/core/startos/src/notifications.rs b/core/startos/src/notifications.rs index 73351471c..aa0b0b963 100644 --- a/core/startos/src/notifications.rs +++ b/core/startos/src/notifications.rs @@ -2,32 +2,66 @@ use std::collections::HashMap; use std::fmt; use std::str::FromStr; -use chrono::{DateTime, Utc}; +use chrono::{DateTime, TimeZone, Utc}; +use clap::builder::ValueParserFactory; +use clap::Parser; use color_eyre::eyre::eyre; -use rpc_toolkit::command; +use models::PackageId; +use rpc_toolkit::{command, from_fn_async, HandlerExt, ParentHandler}; +use serde::{Deserialize, Serialize}; use sqlx::PgPool; use tokio::sync::Mutex; use tracing::instrument; use crate::backup::BackupReport; -use crate::context::RpcContext; +use crate::context::{CliContext, RpcContext}; use crate::prelude::*; -use crate::s9pk::manifest::PackageId; -use crate::util::display_none; -use crate::util::serde::display_serializable; +use crate::util::clap::FromStrParser; +use crate::util::serde::HandlerExtSerde; use crate::{Error, ErrorKind, ResultExt}; -#[command(subcommands(list, delete, delete_before, create))] -pub async fn notification() -> Result<(), Error> { - Ok(()) +// #[command(subcommands(list, delete, delete_before, create))] +pub fn notification() -> ParentHandler { + ParentHandler::new() + .subcommand( + "list", + from_fn_async(list) + .with_display_serializable() + .with_remote_cli::(), + ) + .subcommand( + "delete", + from_fn_async(delete) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "delete-before", + from_fn_async(delete_before) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "create", + from_fn_async(create) + .no_display() + .with_remote_cli::(), + ) } -#[command(display(display_serializable))] +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct ListParams { + before: Option, + + limit: Option, +} +// #[command(display(display_serializable))] #[instrument(skip_all)] pub async fn list( - #[context] ctx: RpcContext, - #[arg] before: Option, - #[arg] limit: Option, + ctx: RpcContext, + ListParams { before, limit }: ListParams, ) -> Result, Error> { let limit = limit.unwrap_or(40); match before { @@ -42,7 +76,7 @@ pub async fn list( Ok(Notification { id: r.id as u32, package_id: r.package_id.and_then(|p| p.parse().ok()), - created_at: DateTime::from_utc(r.created_at, Utc), + created_at: Utc.from_utc_datetime(&r.created_at), code: r.code as u32, level: match r.level.parse::() { Ok(a) => a, @@ -87,7 +121,7 @@ pub async fn list( Ok(Notification { id: r.id as u32, package_id: r.package_id.and_then(|p| p.parse().ok()), - created_at: DateTime::from_utc(r.created_at, Utc), + created_at: Utc.from_utc_datetime(&r.created_at), code: r.code as u32, level: match r.level.parse::() { Ok(a) => a, @@ -115,29 +149,53 @@ pub async fn list( } } -#[command(display(display_none))] -pub async fn delete(#[context] ctx: RpcContext, #[arg] id: i32) -> Result<(), Error> { +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct DeleteParams { + id: i32, +} + +pub async fn delete(ctx: RpcContext, DeleteParams { id }: DeleteParams) -> Result<(), Error> { sqlx::query!("DELETE FROM notifications WHERE id = $1", id) .execute(&ctx.secret_store) .await?; Ok(()) } +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct DeleteBeforeParams { + before: i32, +} -#[command(rename = "delete-before", display(display_none))] -pub async fn delete_before(#[context] ctx: RpcContext, #[arg] before: i32) -> Result<(), Error> { +pub async fn delete_before( + ctx: RpcContext, + DeleteBeforeParams { before }: DeleteBeforeParams, +) -> Result<(), Error> { sqlx::query!("DELETE FROM notifications WHERE id < $1", before) .execute(&ctx.secret_store) .await?; Ok(()) } +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct CreateParams { + package: Option, + level: NotificationLevel, + title: String, + message: String, +} -#[command(display(display_none))] pub async fn create( - #[context] ctx: RpcContext, - #[arg] package: Option, - #[arg] level: NotificationLevel, - #[arg] title: String, - #[arg] message: String, + ctx: RpcContext, + CreateParams { + package, + level, + title, + message, + }: CreateParams, ) -> Result<(), Error> { ctx.notification_manager .notify(ctx.db.clone(), package, level, title, message, (), None) @@ -162,6 +220,13 @@ impl fmt::Display for NotificationLevel { } } } +impl ValueParserFactory for NotificationLevel { + type Parser = FromStrParser; + fn value_parser() -> Self::Parser { + FromStrParser::new() + } +} + pub struct InvalidNotificationLevel(String); impl From for crate::Error { fn from(val: InvalidNotificationLevel) -> Self { @@ -192,7 +257,7 @@ impl fmt::Display for InvalidNotificationLevel { #[serde(rename_all = "kebab-case")] pub struct Notification { id: u32, - package_id: Option, // TODO change for package id newtype + package_id: Option, created_at: DateTime, code: u32, level: NotificationLevel, diff --git a/core/startos/src/os_install/mod.rs b/core/startos/src/os_install/mod.rs index 9e21e9f23..6bb5c5470 100644 --- a/core/startos/src/os_install/mod.rs +++ b/core/startos/src/os_install/mod.rs @@ -1,22 +1,23 @@ use std::path::{Path, PathBuf}; +use clap::Parser; use color_eyre::eyre::eyre; use models::Error; -use rpc_toolkit::command; +use rpc_toolkit::{command, from_fn_async, AnyContext, HandlerExt, ParentHandler}; use serde::{Deserialize, Serialize}; use tokio::process::Command; -use crate::context::InstallContext; +use crate::context::{CliContext, InstallContext}; use crate::disk::mount::filesystem::bind::Bind; use crate::disk::mount::filesystem::block_dev::BlockDev; use crate::disk::mount::filesystem::efivarfs::EfiVarFs; use crate::disk::mount::filesystem::{MountType, ReadWrite}; -use crate::disk::mount::guard::{MountGuard, TmpMountGuard}; +use crate::disk::mount::guard::{GenericMountGuard, MountGuard, TmpMountGuard}; use crate::disk::util::{DiskInfo, PartitionTable}; use crate::disk::OsPartitionInfo; use crate::net::utils::{find_eth_iface, find_wifi_iface}; use crate::util::serde::IoFormat; -use crate::util::{display_none, Invoke}; +use crate::util::Invoke; use crate::ARCH; mod gpt; @@ -30,17 +31,32 @@ pub struct PostInstallConfig { wifi_interface: Option, } -#[command(subcommands(disk, execute, reboot))] -pub fn install() -> Result<(), Error> { - Ok(()) +pub fn install() -> ParentHandler { + ParentHandler::new() + .subcommand("disk", disk()) + .subcommand( + "execute", + from_fn_async(execute) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "reboot", + from_fn_async(reboot) + .no_display() + .with_remote_cli::(), + ) } -#[command(subcommands(list))] -pub fn disk() -> Result<(), Error> { - Ok(()) +pub fn disk() -> ParentHandler { + ParentHandler::new().subcommand( + "list", + from_fn_async(list) + .no_display() + .with_remote_cli::(), + ) } -#[command(display(display_none))] pub async fn list() -> Result, Error> { let skip = match async { Ok::<_, Error>( @@ -103,10 +119,21 @@ async fn partition(disk: &mut DiskInfo, overwrite: bool) -> Result Result<(), Error> { let mut disk = crate::disk::util::list(&Default::default()) .await? @@ -153,21 +180,21 @@ pub async fn execute( { if let Err(e) = async { // cp -r ${guard}/config /tmp/config - if tokio::fs::metadata(guard.as_ref().join("config/upgrade")) + if tokio::fs::metadata(guard.path().join("config/upgrade")) .await .is_ok() { - tokio::fs::remove_file(guard.as_ref().join("config/upgrade")).await?; + tokio::fs::remove_file(guard.path().join("config/upgrade")).await?; } - if tokio::fs::metadata(guard.as_ref().join("config/disk.guid")) + if tokio::fs::metadata(guard.path().join("config/disk.guid")) .await .is_ok() { - tokio::fs::remove_file(guard.as_ref().join("config/disk.guid")).await?; + tokio::fs::remove_file(guard.path().join("config/disk.guid")).await?; } Command::new("cp") .arg("-r") - .arg(guard.as_ref().join("config")) + .arg(guard.path().join("config")) .arg("/tmp/config.bak") .invoke(crate::ErrorKind::Filesystem) .await?; @@ -201,14 +228,14 @@ pub async fn execute( Command::new("cp") .arg("-r") .arg("/tmp/config.bak") - .arg(rootfs.as_ref().join("config")) + .arg(rootfs.path().join("config")) .invoke(crate::ErrorKind::Filesystem) .await?; } else { - tokio::fs::create_dir(rootfs.as_ref().join("config")).await?; + tokio::fs::create_dir(rootfs.path().join("config")).await?; } - tokio::fs::create_dir(rootfs.as_ref().join("next")).await?; - let current = rootfs.as_ref().join("current"); + tokio::fs::create_dir(rootfs.path().join("next")).await?; + let current = rootfs.path().join("current"); tokio::fs::create_dir(¤t).await?; tokio::fs::create_dir(current.join("boot")).await?; @@ -235,7 +262,7 @@ pub async fn execute( .await?; tokio::fs::write( - rootfs.as_ref().join("config/config.yaml"), + rootfs.path().join("config/config.yaml"), IoFormat::Yaml.to_vec(&PostInstallConfig { os_partitions: part_info.clone(), ethernet_interface: eth_iface, @@ -273,7 +300,7 @@ pub async fn execute( .await?; let embassy_fs = MountGuard::mount( - &Bind::new(rootfs.as_ref()), + &Bind::new(rootfs.path()), current.join("media/embassy/embassyfs"), MountType::ReadOnly, ) @@ -330,8 +357,7 @@ pub async fn execute( Ok(()) } -#[command(display(display_none))] -pub async fn reboot(#[context] ctx: InstallContext) -> Result<(), Error> { +pub async fn reboot(ctx: InstallContext) -> Result<(), Error> { Command::new("sync") .invoke(crate::ErrorKind::Filesystem) .await?; diff --git a/core/startos/src/prelude.rs b/core/startos/src/prelude.rs index 3f70b7a2b..dddc1ecda 100644 --- a/core/startos/src/prelude.rs +++ b/core/startos/src/prelude.rs @@ -1,4 +1,5 @@ pub use color_eyre::eyre::eyre; +pub use lazy_format::lazy_format; pub use models::OptionExt; pub use tracing::instrument; diff --git a/core/startos/src/procedure/build.rs b/core/startos/src/procedure/build.rs deleted file mode 100644 index e69de29bb..000000000 diff --git a/core/startos/src/procedure/docker.rs b/core/startos/src/procedure/docker.rs deleted file mode 100644 index 154e97479..000000000 --- a/core/startos/src/procedure/docker.rs +++ /dev/null @@ -1,533 +0,0 @@ -use std::borrow::Cow; -use std::collections::{BTreeMap, BTreeSet, VecDeque}; -use std::ffi::{OsStr, OsString}; -use std::net::Ipv4Addr; -use std::os::unix::prelude::FileTypeExt; -use std::path::{Path, PathBuf}; -use std::time::Duration; - -use color_eyre::eyre::eyre; -use futures::future::{BoxFuture, Either as EitherFuture}; -use futures::{FutureExt, TryStreamExt}; -use helpers::{NonDetachingJoinHandle, UnixRpcClient}; -use models::{Id, ImageId, SYSTEM_PACKAGE_ID}; -use nix::sys::signal; -use nix::unistd::Pid; -use serde::de::DeserializeOwned; -use serde::{Deserialize, Serialize}; -use serde_json::Value; -use tokio::io::{AsyncBufRead, AsyncBufReadExt, BufReader}; -use tokio::time::timeout; -use tracing::instrument; - -use super::ProcedureName; -use crate::context::RpcContext; -use crate::prelude::*; -use crate::s9pk::manifest::PackageId; -use crate::util::docker::{remove_container, CONTAINER_TOOL}; -use crate::util::serde::{Duration as SerdeDuration, IoFormat}; -use crate::util::Version; -use crate::volume::{VolumeId, Volumes}; -use crate::{Error, ResultExt, HOST_IP}; - -pub const NET_TLD: &str = "embassy"; - -lazy_static::lazy_static! { - pub static ref SYSTEM_IMAGES: BTreeSet = { - let mut set = BTreeSet::new(); - - set.insert("compat".parse().unwrap()); - set.insert("utils".parse().unwrap()); - - set - }; -} - -#[derive(Clone, Debug, Deserialize, Serialize, HasModel)] -#[serde(rename_all = "kebab-case")] -#[model = "Model"] -pub struct DockerContainers { - pub main: DockerContainer, - // #[serde(default)] - // pub aux: BTreeMap, -} - -/// This is like the docker procedures of the past designs, -/// but this time all the entrypoints and args are not -/// part of this struct by choice. Used for the times that we are creating our own entry points -#[derive(Clone, Debug, Deserialize, Serialize, patch_db::HasModel)] -#[serde(rename_all = "kebab-case")] -#[model = "Model"] -pub struct DockerContainer { - pub image: ImageId, - #[serde(default)] - pub mounts: BTreeMap, - #[serde(default)] - pub shm_size_mb: Option, // TODO: use postfix sizing? like 1k vs 1m vs 1g - #[serde(default)] - pub sigterm_timeout: Option, - #[serde(default)] - pub system: bool, - #[serde(default)] - pub gpu_acceleration: bool, -} - -impl DockerContainer { - /// We created a new exec runner, where we are going to be passing the commands for it to run. - /// Idea is that we are going to send it command and get the inputs be filtered back from the manager. - /// Then we could in theory run commands without the cost of running the docker exec which is known to have - /// a dely of > 200ms which is not acceptable. - #[instrument(skip_all)] - pub async fn long_running_execute( - &self, - ctx: &RpcContext, - pkg_id: &PackageId, - pkg_version: &Version, - volumes: &Volumes, - ) -> Result<(LongRunning, UnixRpcClient), Error> { - let container_name = DockerProcedure::container_name(pkg_id, None); - - let socket_path = - Path::new("/tmp/embassy/containers").join(format!("{pkg_id}_{pkg_version}")); - if tokio::fs::metadata(&socket_path).await.is_ok() { - tokio::fs::remove_dir_all(&socket_path).await?; - } - tokio::fs::create_dir_all(&socket_path).await?; - - let mut cmd = LongRunning::setup_long_running_docker_cmd( - self, - ctx, - &container_name, - volumes, - pkg_id, - pkg_version, - &socket_path, - ) - .await?; - - let mut handle = cmd.spawn().with_kind(crate::ErrorKind::Docker)?; - - let client = UnixRpcClient::new(socket_path.join("rpc.sock")); - - let running_output = NonDetachingJoinHandle::from(tokio::spawn(async move { - if let Err(err) = handle - .wait() - .await - .map_err(|e| eyre!("Runtime error: {e:?}")) - { - tracing::error!("{}", err); - tracing::debug!("{:?}", err); - } - })); - - { - let socket = socket_path.join("rpc.sock"); - if let Err(_err) = timeout(Duration::from_secs(1), async move { - while tokio::fs::metadata(&socket).await.is_err() { - tokio::time::sleep(Duration::from_millis(10)).await; - } - }) - .await - { - tracing::error!("Timed out waiting for init to create socket"); - } - } - - Ok((LongRunning { running_output }, client)) - } -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -#[serde(rename_all = "kebab-case")] -pub struct DockerProcedure { - pub image: ImageId, - #[serde(default)] - pub system: bool, - pub entrypoint: String, - #[serde(default)] - pub args: Vec, - #[serde(default)] - pub inject: bool, - #[serde(default)] - pub mounts: BTreeMap, - #[serde(default)] - pub io_format: Option, - #[serde(default)] - pub sigterm_timeout: Option, - #[serde(default)] - pub shm_size_mb: Option, // TODO: use postfix sizing? like 1k vs 1m vs 1g - #[serde(default)] - pub gpu_acceleration: bool, -} - -#[derive(Clone, Debug, Deserialize, Serialize, Default)] -#[serde(rename_all = "kebab-case")] -pub struct DockerInject { - #[serde(default)] - pub system: bool, - pub entrypoint: String, - #[serde(default)] - pub args: Vec, - #[serde(default)] - pub io_format: Option, - #[serde(default)] - pub sigterm_timeout: Option, -} -impl DockerProcedure { - pub fn main_docker_procedure( - container: &DockerContainer, - injectable: &DockerInject, - ) -> DockerProcedure { - DockerProcedure { - image: container.image.clone(), - system: injectable.system, - entrypoint: injectable.entrypoint.clone(), - args: injectable.args.clone(), - inject: false, - mounts: container.mounts.clone(), - io_format: injectable.io_format, - sigterm_timeout: injectable.sigterm_timeout, - shm_size_mb: container.shm_size_mb, - gpu_acceleration: container.gpu_acceleration, - } - } - - pub fn validate( - &self, - _eos_version: &Version, - volumes: &Volumes, - image_ids: &BTreeSet, - expected_io: bool, - ) -> Result<(), color_eyre::eyre::Report> { - for volume in self.mounts.keys() { - if !volumes.contains_key(volume) && !matches!(&volume, &VolumeId::Backup) { - color_eyre::eyre::bail!("unknown volume: {}", volume); - } - } - if self.system { - if !SYSTEM_IMAGES.contains(&self.image) { - color_eyre::eyre::bail!("unknown system image: {}", self.image); - } - } else if !image_ids.contains(&self.image) { - color_eyre::eyre::bail!("image for {} not contained in package", self.image); - } - if expected_io && self.io_format.is_none() { - color_eyre::eyre::bail!("expected io-format"); - } - Ok(()) - } - - pub fn container_name(pkg_id: &PackageId, name: Option<&str>) -> String { - if let Some(name) = name { - format!("{}_{}.{}", pkg_id, name, NET_TLD) - } else { - format!("{}.{}", pkg_id, NET_TLD) - } - } - - pub fn uncontainer_name(name: &str) -> Option<(PackageId, Option<&str>)> { - let (pre_tld, _) = name.split_once('.')?; - if pre_tld.contains('_') { - let (pkg, name) = name.split_once('_')?; - Some((Id::try_from(pkg).ok()?.into(), Some(name))) - } else { - Some((Id::try_from(pre_tld).ok()?.into(), None)) - } - } - - async fn docker_args( - &self, - ctx: &RpcContext, - pkg_id: &PackageId, - pkg_version: &Version, - volumes: &Volumes, - ) -> Result>, Error> { - let mut res = self.new_docker_args(); - for (volume_id, dst) in &self.mounts { - let volume = if let Some(v) = volumes.get(volume_id) { - v - } else { - continue; - }; - let src = volume.path_for(&ctx.datadir, pkg_id, pkg_version, volume_id); - if let Err(_e) = tokio::fs::metadata(&src).await { - tokio::fs::create_dir_all(&src).await?; - } - res.push(OsStr::new("--mount").into()); - res.push( - OsString::from(format!( - "type=bind,src={},dst={}{}", - src.display(), - dst.display(), - if volume.readonly() { ",readonly" } else { "" } - )) - .into(), - ); - } - if let Some(shm_size_mb) = self.shm_size_mb { - res.push(OsStr::new("--shm-size").into()); - res.push(OsString::from(format!("{}m", shm_size_mb)).into()); - } - if self.gpu_acceleration { - fn get_devices<'a>( - path: &'a Path, - res: &'a mut Vec, - ) -> BoxFuture<'a, Result<(), Error>> { - async move { - let mut read_dir = tokio::fs::read_dir(path).await?; - while let Some(entry) = read_dir.next_entry().await? { - let fty = entry.metadata().await?.file_type(); - if fty.is_block_device() || fty.is_char_device() { - res.push(entry.path()); - } else if fty.is_dir() { - get_devices(&entry.path(), res).await?; - } - } - Ok(()) - } - .boxed() - } - let mut devices = Vec::new(); - get_devices(Path::new("/dev/dri"), &mut devices).await?; - for device in devices { - res.push(OsStr::new("--device").into()); - res.push(OsString::from(device).into()); - } - } - res.push(OsStr::new("--interactive").into()); - res.push(OsStr::new("--log-driver=journald").into()); - res.push(OsStr::new("--entrypoint").into()); - res.push(OsStr::new(&self.entrypoint).into()); - if self.system { - res.push(OsString::from(self.image.for_package(&SYSTEM_PACKAGE_ID, None)).into()); - } else { - res.push(OsString::from(self.image.for_package(pkg_id, Some(pkg_version))).into()); - } - - res.extend(self.args.iter().map(|s| OsStr::new(s).into())); - - Ok(res) - } - - fn new_docker_args(&self) -> Vec> { - Vec::with_capacity( - (2 * self.mounts.len()) // --mount - + (2 * self.shm_size_mb.is_some() as usize) // --shm-size - + 5 // --interactive --log-driver=journald --entrypoint - + self.args.len(), // [ARG...] - ) - } - fn docker_args_inject(&self, pkg_id: &PackageId) -> Vec> { - let mut res = self.new_docker_args(); - if let Some(shm_size_mb) = self.shm_size_mb { - res.push(OsStr::new("--shm-size").into()); - res.push(OsString::from(format!("{}m", shm_size_mb)).into()); - } - res.push(OsStr::new("--interactive").into()); - - res.push(OsString::from(Self::container_name(pkg_id, None)).into()); - res.push(OsStr::new(&self.entrypoint).into()); - - res.extend(self.args.iter().map(|s| OsStr::new(s).into())); - - res - } -} - -struct RingVec { - value: VecDeque, - capacity: usize, -} -impl RingVec { - fn new(capacity: usize) -> Self { - RingVec { - value: VecDeque::with_capacity(capacity), - capacity, - } - } - fn push(&mut self, item: T) -> Option { - let popped_item = if self.value.len() == self.capacity { - self.value.pop_front() - } else { - None - }; - self.value.push_back(item); - popped_item - } -} - -/// This is created when we wanted a long running docker executor that we could send commands to and get the responses back. -/// We wanted a long running since we want to be able to have the equivelent to the docker execute without the heavy costs of 400 + ms time lag. -/// Also the long running let's us have the ability to start/ end the services quicker. -pub struct LongRunning { - pub running_output: NonDetachingJoinHandle<()>, -} - -impl LongRunning { - async fn setup_long_running_docker_cmd( - docker: &DockerContainer, - ctx: &RpcContext, - container_name: &str, - volumes: &Volumes, - pkg_id: &PackageId, - pkg_version: &Version, - socket_path: &Path, - ) -> Result { - const INIT_EXEC: &str = "/start9/bin/container-init"; - const BIND_LOCATION: &str = "/usr/lib/startos/container/"; - tracing::trace!("setup_long_running_docker_cmd"); - - remove_container(container_name, true).await?; - - let image_architecture = { - let mut cmd = tokio::process::Command::new(CONTAINER_TOOL); - cmd.arg("image") - .arg("inspect") - .arg("--format") - .arg("'{{.Architecture}}'"); - - if docker.system { - cmd.arg(docker.image.for_package(&SYSTEM_PACKAGE_ID, None)); - } else { - cmd.arg(docker.image.for_package(pkg_id, Some(pkg_version))); - } - let arch = String::from_utf8(cmd.output().await?.stdout)?; - arch.replace('\'', "").trim().to_string() - }; - - let mut cmd = tokio::process::Command::new(CONTAINER_TOOL); - cmd.arg("run") - .arg("--network=start9") - .arg(format!("--add-host=embassy:{}", Ipv4Addr::from(HOST_IP))) - .arg("--mount") - .arg(format!( - "type=bind,src={BIND_LOCATION},dst=/start9/bin/,readonly" - )) - .arg("--mount") - .arg(format!( - "type=bind,src={input},dst=/start9/sockets/", - input = socket_path.display() - )) - .arg("--name") - .arg(container_name) - .arg(format!("--hostname={}", &container_name)) - .arg("--entrypoint") - .arg(format!("{INIT_EXEC}.{image_architecture}")) - .arg("-i") - .arg("--rm") - .kill_on_drop(true); - - for (volume_id, dst) in &docker.mounts { - let volume = if let Some(v) = volumes.get(volume_id) { - v - } else { - continue; - }; - let src = volume.path_for(&ctx.datadir, pkg_id, pkg_version, volume_id); - if let Err(_e) = tokio::fs::metadata(&src).await { - tokio::fs::create_dir_all(&src).await?; - } - cmd.arg("--mount").arg(format!( - "type=bind,src={},dst={}{}", - src.display(), - dst.display(), - if volume.readonly() { ",readonly" } else { "" } - )); - } - if let Some(shm_size_mb) = docker.shm_size_mb { - cmd.arg("--shm-size").arg(format!("{}m", shm_size_mb)); - } - cmd.arg("--log-driver=journald"); - if docker.system { - cmd.arg(docker.image.for_package(&SYSTEM_PACKAGE_ID, None)); - } else { - cmd.arg(docker.image.for_package(pkg_id, Some(pkg_version))); - } - cmd.stdout(std::process::Stdio::piped()); - cmd.stderr(std::process::Stdio::inherit()); - cmd.stdin(std::process::Stdio::piped()); - Ok(cmd) - } -} -async fn buf_reader_to_lines( - reader: impl AsyncBufRead + Unpin, - limit: impl Into>, -) -> Result, Error> { - let mut lines = reader.lines(); - let mut answer = RingVec::new(limit.into().unwrap_or(1000)); - while let Some(line) = lines.next_line().await? { - answer.push(line); - } - let output: Vec = answer.value.into_iter().collect(); - Ok(output) -} - -enum MaxByLines { - Done(String), - Overflow(String), - Error(Error), -} - -async fn max_by_lines( - reader: impl AsyncBufRead + Unpin, - max_items: impl Into>, -) -> MaxByLines { - let mut answer = String::new(); - - let mut lines = reader.lines(); - let mut has_over_blown = false; - let max_items = max_items.into().unwrap_or(10_000_000); - - while let Some(line) = { - match lines.next_line().await { - Ok(a) => a, - Err(e) => return MaxByLines::Error(e.into()), - } - } { - if has_over_blown { - continue; - } - if !answer.is_empty() { - answer.push('\n'); - } - answer.push_str(&line); - if answer.len() >= max_items { - has_over_blown = true; - tracing::warn!("Reading the buffer exceeding limits of {}", max_items); - } - } - if has_over_blown { - return MaxByLines::Overflow(answer); - } - MaxByLines::Done(answer) -} - -#[cfg(test)] -mod tests { - use super::*; - /// Note, this size doesn't mean the vec will match. The vec will go to the next size, 0 -> 7 = 7 and so forth 7-15 = 15 - /// Just how the vec with capacity works. - const CAPACITY_IN: usize = 7; - #[test] - fn default_capacity_is_set() { - let ring: RingVec = RingVec::new(CAPACITY_IN); - assert_eq!(CAPACITY_IN, ring.value.capacity()); - assert_eq!(0, ring.value.len()); - } - #[test] - fn capacity_can_not_be_exceeded() { - let mut ring = RingVec::new(CAPACITY_IN); - for i in 1..100usize { - ring.push(i); - } - assert_eq!(CAPACITY_IN, ring.value.capacity()); - assert_eq!(CAPACITY_IN, ring.value.len()); - } - - #[test] - fn tests_buf_reader_to_lines() { - let mut reader = BufReader::new("hello\nworld\n".as_bytes()); - let lines = futures::executor::block_on(buf_reader_to_lines(&mut reader, None)).unwrap(); - assert_eq!(lines, vec!["hello", "world"]); - } -} diff --git a/core/startos/src/procedure/js_scripts.rs b/core/startos/src/procedure/js_scripts.rs deleted file mode 100644 index 131ceef84..000000000 --- a/core/startos/src/procedure/js_scripts.rs +++ /dev/null @@ -1,51 +0,0 @@ -use std::path::{Path, PathBuf}; -use std::sync::Arc; -use std::time::Duration; - -use container_init::ProcessGroupId; -use helpers::UnixRpcClient; -use models::VolumeId; -use serde::de::DeserializeOwned; -use serde::{Deserialize, Serialize}; -use tokio::process::Command; -use tracing::instrument; - -use super::ProcedureName; -use crate::prelude::*; -use crate::s9pk::manifest::PackageId; -use crate::util::serde::IoFormat; -use crate::util::{Invoke, Version}; -use crate::volume::Volumes; - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "kebab-case")] - -enum ErrorValue { - Error(String), - ErrorCode((i32, String)), - Result(serde_json::Value), -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ExecuteArgs { - pub procedure: JsProcedure, - pub directory: PathBuf, - pub pkg_id: PackageId, - pub pkg_version: Version, - pub name: ProcedureName, - pub volumes: Volumes, - pub input: Option, -} - -#[derive(Clone, Debug, Default, Deserialize, Serialize)] -#[serde(rename_all = "kebab-case")] -pub struct JsProcedure { - #[serde(default)] - args: Vec, -} - -impl JsProcedure { - pub fn validate(&self, _volumes: &Volumes) -> Result<(), color_eyre::eyre::Report> { - Ok(()) - } -} diff --git a/core/startos/src/procedure/mod.rs b/core/startos/src/procedure/mod.rs deleted file mode 100644 index aa3d4092d..000000000 --- a/core/startos/src/procedure/mod.rs +++ /dev/null @@ -1,139 +0,0 @@ -use std::collections::BTreeSet; -use std::time::Duration; - -use color_eyre::eyre::eyre; -use models::ImageId; -use patch_db::HasModel; -use serde::de::DeserializeOwned; -use serde::{Deserialize, Serialize}; -use tracing::instrument; - -use self::docker::DockerProcedure; -use crate::context::RpcContext; -use crate::prelude::*; -use crate::s9pk::manifest::PackageId; -use crate::util::Version; -use crate::volume::Volumes; -use crate::{Error, ErrorKind}; - -pub mod docker; -pub mod js_scripts; -pub use models::ProcedureName; - -#[derive(Clone, Debug, Deserialize, Serialize, HasModel)] -#[serde(rename_all = "kebab-case")] -#[serde(tag = "type")] -#[model = "Model"] -pub enum PackageProcedure { - Docker(DockerProcedure), - Script(js_scripts::JsProcedure), -} - -impl PackageProcedure { - pub fn is_script(&self) -> bool { - match self { - Self::Script(_) => true, - _ => false, - } - } - #[instrument(skip_all)] - pub fn validate( - &self, - eos_version: &Version, - volumes: &Volumes, - image_ids: &BTreeSet, - expected_io: bool, - ) -> Result<(), color_eyre::eyre::Report> { - match self { - PackageProcedure::Docker(action) => { - action.validate(eos_version, volumes, image_ids, expected_io) - } - PackageProcedure::Script(action) => action.validate(volumes), - } - } - - #[instrument(skip_all)] - pub async fn execute( - &self, - ctx: &RpcContext, - pkg_id: &PackageId, - pkg_version: &Version, - name: ProcedureName, - volumes: &Volumes, - input: Option, - timeout: Option, - ) -> Result, Error> { - tracing::trace!("Procedure execute {} {} - {:?}", self, pkg_id, name); - let manager = ctx - .managers - .get(&(pkg_id.clone(), pkg_version.clone())) - .await - .ok_or_else(|| { - Error::new( - eyre!("No manager found for {}", pkg_id), - ErrorKind::NotFound, - ) - })?; - manager - .execute(name, imbl_value::to_value(&input)?, timeout) - .await - } - - #[instrument(skip_all)] - pub async fn sandboxed( - &self, - ctx: &RpcContext, - pkg_id: &PackageId, - pkg_version: &Version, - volumes: &Volumes, - input: Option, - timeout: Option, - name: ProcedureName, - ) -> Result, Error> { - tracing::trace!("Procedure sandboxed {} {} - {:?}", self, pkg_id, name); - let manager = ctx - .managers - .get(&(pkg_id.clone(), pkg_version.clone())) - .await - .ok_or_else(|| { - Error::new( - eyre!("No manager found for {}", pkg_id), - ErrorKind::NotFound, - ) - })?; - manager - .sanboxed(name, imbl_value::to_value(&input)?, timeout) - .await - } -} - -impl std::fmt::Display for PackageProcedure { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - PackageProcedure::Docker(_) => write!(f, "Docker")?, - PackageProcedure::Script(_) => write!(f, "JS")?, - } - Ok(()) - } -} - -// TODO: make this not allocate -#[derive(Debug)] -pub struct NoOutput; -impl<'de> Deserialize<'de> for NoOutput { - fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - let _ = Value::deserialize(deserializer); - Ok(NoOutput) - } -} - -#[test] -fn test_deser_no_output() { - serde_json::from_str::("").unwrap(); - serde_json::from_str::>("{\"Ok\": null}") - .unwrap() - .unwrap(); -} diff --git a/core/startos/src/progress.rs b/core/startos/src/progress.rs new file mode 100644 index 000000000..38e66a419 --- /dev/null +++ b/core/startos/src/progress.rs @@ -0,0 +1,442 @@ +use std::panic::UnwindSafe; +use std::sync::Arc; +use std::time::Duration; + +use futures::Future; +use imbl_value::{InOMap, InternedString}; +use indicatif::{MultiProgress, ProgressBar, ProgressStyle}; +use itertools::Itertools; +use serde::{Deserialize, Serialize}; +use tokio::io::{AsyncSeek, AsyncWrite}; +use tokio::sync::{mpsc, watch}; + +use crate::db::model::DatabaseModel; +use crate::prelude::*; + +lazy_static::lazy_static! { + static ref SPINNER: ProgressStyle = ProgressStyle::with_template("{spinner} {msg}...").unwrap(); + static ref PERCENTAGE: ProgressStyle = ProgressStyle::with_template("{msg} {percent}% {wide_bar} [{bytes}/{total_bytes}] [{binary_bytes_per_sec} {eta}]").unwrap(); + static ref BYTES: ProgressStyle = ProgressStyle::with_template("{spinner} {wide_msg} [{bytes}/?] [{binary_bytes_per_sec} {elapsed}]").unwrap(); +} + +#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, PartialOrd, Ord)] +#[serde(untagged)] +pub enum Progress { + Complete(bool), + Progress { done: u64, total: Option }, +} +impl Progress { + pub fn new() -> Self { + Progress::Complete(false) + } + pub fn update_bar(self, bar: &ProgressBar) { + match self { + Self::Complete(false) => { + bar.set_style(SPINNER.clone()); + bar.tick(); + } + Self::Complete(true) => { + bar.finish(); + } + Self::Progress { done, total: None } => { + bar.set_style(BYTES.clone()); + bar.set_position(done); + bar.tick(); + } + Self::Progress { + done, + total: Some(total), + } => { + bar.set_style(PERCENTAGE.clone()); + bar.set_position(done); + bar.set_length(total); + bar.tick(); + } + } + } + pub fn set_done(&mut self, done: u64) { + *self = match *self { + Self::Complete(false) => Self::Progress { done, total: None }, + Self::Progress { mut done, total } => { + if let Some(total) = total { + if done > total { + done = total; + } + } + Self::Progress { done, total } + } + Self::Complete(true) => Self::Complete(true), + }; + } + pub fn set_total(&mut self, total: u64) { + *self = match *self { + Self::Complete(false) => Self::Progress { + done: 0, + total: Some(total), + }, + Self::Progress { done, .. } => Self::Progress { + done, + total: Some(total), + }, + Self::Complete(true) => Self::Complete(true), + } + } + pub fn add_total(&mut self, total: u64) { + if let Self::Progress { + done, + total: Some(old), + } = *self + { + *self = Self::Progress { + done, + total: Some(old + total), + }; + } else { + self.set_total(total) + } + } + pub fn complete(&mut self) { + *self = Self::Complete(true); + } +} +impl std::ops::Add for Progress { + type Output = Self; + fn add(self, rhs: u64) -> Self::Output { + match self { + Self::Complete(false) => Self::Progress { + done: rhs, + total: None, + }, + Self::Progress { done, total } => { + let mut done = done + rhs; + if let Some(total) = total { + if done > total { + done = total; + } + } + Self::Progress { done, total } + } + Self::Complete(true) => Self::Complete(true), + } + } +} +impl std::ops::AddAssign for Progress { + fn add_assign(&mut self, rhs: u64) { + *self = *self + rhs; + } +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct NamedProgress { + pub name: InternedString, + pub progress: Progress, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct FullProgress { + pub overall: Progress, + pub phases: Vec, +} +impl FullProgress { + pub fn new() -> Self { + Self { + overall: Progress::new(), + phases: Vec::new(), + } + } +} + +pub struct FullProgressTracker { + overall: Arc>, + overall_recv: watch::Receiver, + phases: InOMap>, + new_phase: ( + mpsc::UnboundedSender<(InternedString, watch::Receiver)>, + mpsc::UnboundedReceiver<(InternedString, watch::Receiver)>, + ), +} +impl FullProgressTracker { + pub fn new() -> Self { + let (overall, overall_recv) = watch::channel(Progress::new()); + Self { + overall: Arc::new(overall), + overall_recv, + phases: InOMap::new(), + new_phase: mpsc::unbounded_channel(), + } + } + fn fill_phases(&mut self) -> bool { + let mut changed = false; + while let Ok((name, phase)) = self.new_phase.1.try_recv() { + self.phases.insert(name, phase); + changed = true; + } + changed + } + pub fn snapshot(&mut self) -> FullProgress { + self.fill_phases(); + FullProgress { + overall: *self.overall.borrow(), + phases: self + .phases + .iter() + .map(|(name, progress)| NamedProgress { + name: name.clone(), + progress: *progress.borrow(), + }) + .collect(), + } + } + pub async fn changed(&mut self) { + if self.fill_phases() { + return; + } + let phases = self + .phases + .iter_mut() + .map(|(_, p)| Box::pin(p.changed())) + .collect_vec(); + tokio::select! { + _ = self.overall_recv.changed() => (), + _ = futures::future::select_all(phases) => (), + } + } + pub fn handle(&self) -> FullProgressTrackerHandle { + FullProgressTrackerHandle { + overall: self.overall.clone(), + new_phase: self.new_phase.0.clone(), + } + } + pub fn sync_to_db( + mut self, + db: PatchDb, + deref: DerefFn, + min_interval: Option, + ) -> impl Future> + 'static + where + DerefFn: Fn(&mut DatabaseModel) -> Option<&mut Model> + 'static, + for<'a> &'a DerefFn: UnwindSafe + Send, + { + async move { + loop { + let progress = self.snapshot(); + if db + .mutate(|v| { + if let Some(p) = deref(v) { + p.ser(&progress)?; + Ok(false) + } else { + Ok(true) + } + }) + .await? + { + break; + } + tokio::join!(self.changed(), async { + if let Some(interval) = min_interval { + tokio::time::sleep(interval).await + } else { + futures::future::ready(()).await + } + }); + } + Ok(()) + } + } +} + +#[derive(Clone)] +pub struct FullProgressTrackerHandle { + overall: Arc>, + new_phase: mpsc::UnboundedSender<(InternedString, watch::Receiver)>, +} +impl FullProgressTrackerHandle { + pub fn add_phase( + &self, + name: InternedString, + overall_contribution: Option, + ) -> PhaseProgressTrackerHandle { + if let Some(overall_contribution) = overall_contribution { + self.overall + .send_modify(|o| o.add_total(overall_contribution)); + } + let (send, recv) = watch::channel(Progress::new()); + let _ = self.new_phase.send((name, recv)); + PhaseProgressTrackerHandle { + overall: self.overall.clone(), + overall_contribution, + contributed: 0, + progress: send, + } + } + pub fn complete(&self) { + self.overall.send_modify(|o| o.complete()); + } +} + +pub struct PhaseProgressTrackerHandle { + overall: Arc>, + overall_contribution: Option, + contributed: u64, + progress: watch::Sender, +} +impl PhaseProgressTrackerHandle { + fn update_overall(&mut self) { + if let Some(overall_contribution) = self.overall_contribution { + let contribution = match *self.progress.borrow() { + Progress::Complete(true) => overall_contribution, + Progress::Progress { + done, + total: Some(total), + } => ((done as f64 / total as f64) * overall_contribution as f64) as u64, + _ => 0, + }; + if contribution > self.contributed { + self.overall + .send_modify(|o| *o += contribution - self.contributed); + self.contributed = contribution; + } + } + } + pub fn set_done(&mut self, done: u64) { + self.progress.send_modify(|p| p.set_done(done)); + self.update_overall(); + } + pub fn set_total(&mut self, total: u64) { + self.progress.send_modify(|p| p.set_total(total)); + self.update_overall(); + } + pub fn add_total(&mut self, total: u64) { + self.progress.send_modify(|p| p.add_total(total)); + self.update_overall(); + } + pub fn complete(&mut self) { + self.progress.send_modify(|p| p.complete()); + self.update_overall(); + } +} +impl std::ops::AddAssign for PhaseProgressTrackerHandle { + fn add_assign(&mut self, rhs: u64) { + self.progress.send_modify(|p| *p += rhs); + self.update_overall(); + } +} + +#[pin_project::pin_project] +pub struct ProgressTrackerWriter { + #[pin] + writer: W, + progress: PhaseProgressTrackerHandle, +} +impl ProgressTrackerWriter { + pub fn new(writer: W, progress: PhaseProgressTrackerHandle) -> Self { + Self { writer, progress } + } + pub fn into_inner(self) -> (W, PhaseProgressTrackerHandle) { + (self.writer, self.progress) + } +} +impl AsyncWrite for ProgressTrackerWriter { + fn poll_write( + self: std::pin::Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + buf: &[u8], + ) -> std::task::Poll> { + let this = self.project(); + match this.writer.poll_write(cx, buf) { + std::task::Poll::Ready(Ok(n)) => { + *this.progress += n as u64; + std::task::Poll::Ready(Ok(n)) + } + a => a, + } + } + fn poll_flush( + self: std::pin::Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + self.project().writer.poll_flush(cx) + } + fn poll_shutdown( + self: std::pin::Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + self.project().writer.poll_shutdown(cx) + } + fn is_write_vectored(&self) -> bool { + self.writer.is_write_vectored() + } + fn poll_write_vectored( + self: std::pin::Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + bufs: &[std::io::IoSlice<'_>], + ) -> std::task::Poll> { + self.project().writer.poll_write_vectored(cx, bufs) + } +} +impl AsyncSeek for ProgressTrackerWriter { + fn start_seek( + self: std::pin::Pin<&mut Self>, + position: std::io::SeekFrom, + ) -> std::io::Result<()> { + self.project().writer.start_seek(position) + } + fn poll_complete( + self: std::pin::Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + let this = self.project(); + match this.writer.poll_complete(cx) { + std::task::Poll::Ready(Ok(n)) => { + this.progress.set_done(n); + std::task::Poll::Ready(Ok(n)) + } + a => a, + } + } +} + +pub struct PhasedProgressBar { + multi: MultiProgress, + overall: ProgressBar, + phases: InOMap, +} +impl PhasedProgressBar { + pub fn new(name: &str) -> Self { + let multi = MultiProgress::new(); + Self { + overall: multi.add( + ProgressBar::new(0) + .with_style(SPINNER.clone()) + .with_message(name.to_owned()), + ), + multi, + phases: InOMap::new(), + } + } + pub fn update(&mut self, progress: &FullProgress) { + for phase in progress.phases.iter() { + if !self.phases.contains_key(&phase.name) { + self.phases.insert( + phase.name.clone(), + self.multi + .add(ProgressBar::new(0).with_style(SPINNER.clone())) + .with_message((&*phase.name).to_owned()), + ); + } + } + progress.overall.update_bar(&self.overall); + for (name, bar) in self.phases.iter() { + if let Some(progress) = progress.phases.iter().find_map(|p| { + if &p.name == name { + Some(p.progress) + } else { + None + } + }) { + progress.update_bar(bar); + } + } + } +} diff --git a/core/startos/src/properties.rs b/core/startos/src/properties.rs index 851033b71..9c503c3f6 100644 --- a/core/startos/src/properties.rs +++ b/core/startos/src/properties.rs @@ -1,50 +1,26 @@ -use clap::ArgMatches; -use color_eyre::eyre::eyre; +use clap::Parser; +use models::PackageId; use rpc_toolkit::command; +use serde::{Deserialize, Serialize}; use serde_json::Value; -use tracing::instrument; use crate::context::RpcContext; -use crate::prelude::*; -use crate::procedure::ProcedureName; -use crate::s9pk::manifest::PackageId; -use crate::{Error, ErrorKind}; +use crate::Error; -pub fn display_properties(response: Value, _: &ArgMatches) { +pub fn display_properties(response: Value) { println!("{}", response); } -#[command(display(display_properties))] -pub async fn properties(#[context] ctx: RpcContext, #[arg] id: PackageId) -> Result { - Ok(fetch_properties(ctx, id).await?) +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct PropertiesParam { + id: PackageId, } - -#[instrument(skip_all)] -pub async fn fetch_properties(ctx: RpcContext, id: PackageId) -> Result { - let peek = ctx.db.peek().await; - - let manifest = peek - .as_package_data() - .as_idx(&id) - .ok_or_else(|| Error::new(eyre!("{} is not installed", id), ErrorKind::NotFound))? - .expect_as_installed()? - .as_manifest() - .de()?; - if let Some(props) = manifest.properties { - props - .execute::<(), Value>( - &ctx, - &manifest.id, - &manifest.version, - ProcedureName::Properties, - &manifest.volumes, - None, - None, - ) - .await? - .map_err(|(_, e)| Error::new(eyre!("{}", e), ErrorKind::Docker)) - .and_then(|a| Ok(a)) - } else { - Ok(Value::Null) - } +// #[command(display(display_properties))] +pub async fn properties( + ctx: RpcContext, + PropertiesParam { id }: PropertiesParam, +) -> Result { + Ok(todo!()) } diff --git a/core/startos/src/registry/admin.rs b/core/startos/src/registry/admin.rs index 44b83d161..9f0033e96 100644 --- a/core/startos/src/registry/admin.rs +++ b/core/startos/src/registry/admin.rs @@ -1,15 +1,17 @@ use std::path::PathBuf; use std::time::Duration; +use clap::Parser; use color_eyre::eyre::eyre; use console::style; use futures::StreamExt; use indicatif::{ProgressBar, ProgressStyle}; use reqwest::{header, Body, Client, Url}; use rpc_toolkit::command; +use serde::{Deserialize, Serialize}; -use crate::s9pk::reader::S9pkReader; -use crate::util::display_none; +use crate::context::CliContext; +use crate::s9pk::S9pk; use crate::{Error, ErrorKind}; async fn registry_user_pass(location: &str) -> Result<(Url, String, String), Error> { @@ -88,13 +90,29 @@ async fn do_upload( Ok(()) } -#[command(cli_only, display(display_none))] +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct PublishParams { + location: String, + path: PathBuf, + #[arg(name = "no-verify", long = "no-verify")] + no_verify: bool, + #[arg(name = "no-upload", long = "no-upload")] + no_upload: bool, + #[arg(name = "no-index", long = "no-index")] + no_index: bool, +} + pub async fn publish( - #[arg] location: String, - #[arg] path: PathBuf, - #[arg(rename = "no-verify", long = "no-verify")] no_verify: bool, - #[arg(rename = "no-upload", long = "no-upload")] no_upload: bool, - #[arg(rename = "no-index", long = "no-index")] no_index: bool, + _: CliContext, + PublishParams { + location, + no_index, + no_upload, + no_verify, + path, + }: PublishParams, ) -> Result<(), Error> { // Prepare for progress bars. let bytes_bar_style = @@ -115,8 +133,8 @@ pub async fn publish( .with_prefix("[1/3]") .with_message("Querying s9pk"); pb.enable_steady_tick(Duration::from_millis(200)); - let mut s9pk = S9pkReader::open(&path, false).await?; - let m = s9pk.manifest().await?.clone(); + let mut s9pk = S9pk::open(&path, None).await?; + let m = s9pk.as_manifest().clone(); pb.set_style(plain_line_style.clone()); pb.abandon(); m @@ -126,9 +144,10 @@ pub async fn publish( .with_prefix("[1/3]") .with_message("Verifying s9pk"); pb.enable_steady_tick(Duration::from_millis(200)); - let mut s9pk = S9pkReader::open(&path, true).await?; - s9pk.validate().await?; - let m = s9pk.manifest().await?.clone(); + let mut s9pk = S9pk::open(&path, None).await?; + // s9pk.validate().await?; + todo!(); + let m = s9pk.as_manifest().clone(); pb.set_style(plain_line_style.clone()); pb.abandon(); m diff --git a/core/startos/src/registry/marketplace.rs b/core/startos/src/registry/marketplace.rs index 979733198..c4148f01f 100644 --- a/core/startos/src/registry/marketplace.rs +++ b/core/startos/src/registry/marketplace.rs @@ -1,16 +1,17 @@ use base64::Engine; +use clap::Parser; use color_eyre::eyre::eyre; use reqwest::{StatusCode, Url}; -use rpc_toolkit::command; +use rpc_toolkit::{command, from_fn_async, HandlerExt, ParentHandler}; +use serde::{Deserialize, Serialize}; use serde_json::Value; -use crate::context::RpcContext; +use crate::context::{CliContext, RpcContext}; use crate::version::VersionT; use crate::{Error, ResultExt}; -#[command(subcommands(get))] -pub fn marketplace() -> Result<(), Error> { - Ok(()) +pub fn marketplace() -> ParentHandler { + ParentHandler::new().subcommand("get", from_fn_async(get).with_remote_cli::()) } pub fn with_query_params(ctx: RpcContext, mut url: Url) -> Url { @@ -35,8 +36,14 @@ pub fn with_query_params(ctx: RpcContext, mut url: Url) -> Url { url } -#[command] -pub async fn get(#[context] ctx: RpcContext, #[arg] url: Url) -> Result { +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct GetParams { + url: Url, +} + +pub async fn get(ctx: RpcContext, GetParams { url }: GetParams) -> Result { let mut response = ctx .client .get(with_query_params(ctx.clone(), url)) diff --git a/core/startos/src/s9pk/merkle_archive/directory_contents.rs b/core/startos/src/s9pk/merkle_archive/directory_contents.rs index f662300b6..c5373a31b 100644 --- a/core/startos/src/s9pk/merkle_archive/directory_contents.rs +++ b/core/startos/src/s9pk/merkle_archive/directory_contents.rs @@ -1,23 +1,48 @@ -use std::collections::BTreeMap; -use std::path::Path; +use std::ffi::OsStr; +use std::fmt::Debug; +use std::path::{Path, PathBuf}; +use std::sync::Arc; use futures::future::BoxFuture; use futures::FutureExt; +use imbl::OrdMap; use imbl_value::InternedString; +use itertools::Itertools; use tokio::io::AsyncRead; use crate::prelude::*; use crate::s9pk::merkle_archive::hash::{Hash, HashWriter}; use crate::s9pk::merkle_archive::sink::{Sink, TrackingWriter}; -use crate::s9pk::merkle_archive::source::{ArchiveSource, FileSource, Section}; +use crate::s9pk::merkle_archive::source::{ArchiveSource, DynFileSource, FileSource, Section}; use crate::s9pk::merkle_archive::write_queue::WriteQueue; use crate::s9pk::merkle_archive::{varint, Entry, EntryContents}; -#[derive(Debug)] -pub struct DirectoryContents(BTreeMap>); +#[derive(Clone)] +pub struct DirectoryContents { + contents: OrdMap>, + /// used to optimize files to have earliest needed information up front + sort_by: Option std::cmp::Ordering + Send + Sync>>, +} +impl Debug for DirectoryContents { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("DirectoryContents") + .field("contents", &self.contents) + .finish_non_exhaustive() + } +} impl DirectoryContents { pub fn new() -> Self { - Self(BTreeMap::new()) + Self { + contents: OrdMap::new(), + sort_by: None, + } + } + + pub fn sort_by( + &mut self, + sort_by: impl Fn(&str, &str) -> std::cmp::Ordering + Send + Sync + 'static, + ) { + self.sort_by = Some(Arc::new(sort_by)) } #[instrument(skip_all)] @@ -39,6 +64,57 @@ impl DirectoryContents { res } + pub fn file_paths(&self, prefix: impl AsRef) -> Vec { + let prefix = prefix.as_ref(); + let mut res = Vec::new(); + for (name, entry) in &self.contents { + let path = prefix.join(name); + if let EntryContents::Directory(d) = entry.as_contents() { + res.push(path.join("")); + res.append(&mut d.file_paths(path)); + } else { + res.push(path); + } + } + res + } + + pub const fn header_size() -> u64 { + 8 // position: u64 BE + + 8 // size: u64 BE + } + + #[instrument(skip_all)] + pub async fn serialize_header(&self, position: u64, w: &mut W) -> Result { + use tokio::io::AsyncWriteExt; + + let size = self.toc_size(); + + w.write_all(&position.to_be_bytes()).await?; + w.write_all(&size.to_be_bytes()).await?; + + Ok(position) + } + + pub fn toc_size(&self) -> u64 { + self.iter().fold( + varint::serialized_varint_size(self.len() as u64), + |acc, (name, entry)| { + acc + varint::serialized_varstring_size(&**name) + entry.header_size() + }, + ) + } +} +impl DirectoryContents { + pub fn with_stem(&self, stem: &str) -> impl Iterator)> { + let prefix = InternedString::intern(stem); + let (_, center, right) = self.split_lookup(&*stem); + center.map(|e| (prefix.clone(), e)).into_iter().chain( + right.into_iter().take_while(move |(k, _)| { + Path::new(&**k).file_stem() == Some(OsStr::new(&*prefix)) + }), + ) + } pub fn insert_path(&mut self, path: impl AsRef, entry: Entry) -> Result<(), Error> { let path = path.as_ref(); let (parent, Some(file)) = (path.parent(), path.file_name().and_then(|f| f.to_str())) @@ -73,32 +149,6 @@ impl DirectoryContents { dir.insert(file.into(), entry); Ok(()) } - - pub const fn header_size() -> u64 { - 8 // position: u64 BE - + 8 // size: u64 BE - } - - #[instrument(skip_all)] - pub async fn serialize_header(&self, position: u64, w: &mut W) -> Result { - use tokio::io::AsyncWriteExt; - - let size = self.toc_size(); - - w.write_all(&position.to_be_bytes()).await?; - w.write_all(&size.to_be_bytes()).await?; - - Ok(position) - } - - pub fn toc_size(&self) -> u64 { - self.0.iter().fold( - varint::serialized_varint_size(self.0.len() as u64), - |acc, (name, entry)| { - acc + varint::serialized_varstring_size(&**name) + entry.header_size() - }, - ) - } } impl DirectoryContents> { #[instrument(skip_all)] @@ -121,7 +171,7 @@ impl DirectoryContents> { let mut toc_reader = source.fetch(position, size).await?; let len = varint::deserialize_varint(&mut toc_reader).await?; - let mut entries = BTreeMap::new(); + let mut entries = OrdMap::new(); for _ in 0..len { entries.insert( varint::deserialize_varstring(&mut toc_reader).await?.into(), @@ -129,7 +179,10 @@ impl DirectoryContents> { ); } - let res = Self(entries); + let res = Self { + contents: entries, + sort_by: None, + }; if res.sighash().await? == sighash { Ok(res) @@ -144,11 +197,33 @@ impl DirectoryContents> { } } impl DirectoryContents { + pub fn filter(&mut self, filter: impl Fn(&Path) -> bool) -> Result<(), Error> { + for k in self.keys().cloned().collect::>() { + let path = Path::new(&*k); + if let Some(v) = self.get_mut(&k) { + if !filter(path) { + if v.hash.is_none() { + return Err(Error::new( + eyre!("cannot filter out unhashed file, run `update_hashes` first"), + ErrorKind::InvalidRequest, + )); + } + v.contents = EntryContents::Missing; + } else { + let filter: Box bool> = Box::new(|p| filter(&path.join(p))); + v.filter(filter)?; + } + } + } + Ok(()) + } #[instrument(skip_all)] pub fn update_hashes<'a>(&'a mut self, only_missing: bool) -> BoxFuture<'a, Result<(), Error>> { async move { - for (_, entry) in &mut self.0 { - entry.update_hash(only_missing).await?; + for key in self.keys().cloned().collect::>() { + if let Some(entry) = self.get_mut(&key) { + entry.update_hash(only_missing).await?; + } } Ok(()) } @@ -159,13 +234,16 @@ impl DirectoryContents { pub fn sighash<'a>(&'a self) -> BoxFuture<'a, Result> { async move { let mut hasher = TrackingWriter::new(0, HashWriter::new()); - let mut sig_contents = BTreeMap::new(); - for (name, entry) in &self.0 { + let mut sig_contents = OrdMap::new(); + for (name, entry) in &**self { sig_contents.insert(name.clone(), entry.to_missing().await?); } - Self(sig_contents) - .serialize_toc(&mut WriteQueue::new(0), &mut hasher) - .await?; + Self { + contents: sig_contents, + sort_by: None, + } + .serialize_toc(&mut WriteQueue::new(0), &mut hasher) + .await?; Ok(hasher.into_inner().finalize()) } .boxed() @@ -177,23 +255,42 @@ impl DirectoryContents { queue: &mut WriteQueue<'a, S>, w: &mut W, ) -> Result<(), Error> { - varint::serialize_varint(self.0.len() as u64, w).await?; - for (name, entry) in self.0.iter() { + varint::serialize_varint(self.len() as u64, w).await?; + for (name, entry) in self.iter().sorted_by(|a, b| match (a, b, &self.sort_by) { + ((_, a), (_, b), _) if a.as_contents().is_dir() && !b.as_contents().is_dir() => { + std::cmp::Ordering::Less + } + ((_, a), (_, b), _) if !a.as_contents().is_dir() && b.as_contents().is_dir() => { + std::cmp::Ordering::Greater + } + ((a, _), (b, _), Some(sort_by)) => sort_by(&***a, &***b), + _ => std::cmp::Ordering::Equal, + }) { varint::serialize_varstring(&**name, w).await?; entry.serialize_header(queue.add(entry).await?, w).await?; } Ok(()) } + pub fn into_dyn(self) -> DirectoryContents { + DirectoryContents { + contents: self + .contents + .into_iter() + .map(|(k, v)| (k, v.into_dyn())) + .collect(), + sort_by: self.sort_by, + } + } } impl std::ops::Deref for DirectoryContents { - type Target = BTreeMap>; + type Target = OrdMap>; fn deref(&self) -> &Self::Target { - &self.0 + &self.contents } } impl std::ops::DerefMut for DirectoryContents { fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 + &mut self.contents } } diff --git a/core/startos/src/s9pk/merkle_archive/file_contents.rs b/core/startos/src/s9pk/merkle_archive/file_contents.rs index c02c0e879..7529fd2d0 100644 --- a/core/startos/src/s9pk/merkle_archive/file_contents.rs +++ b/core/startos/src/s9pk/merkle_archive/file_contents.rs @@ -3,9 +3,9 @@ use tokio::io::AsyncRead; use crate::prelude::*; use crate::s9pk::merkle_archive::hash::{Hash, HashWriter}; use crate::s9pk::merkle_archive::sink::{Sink, TrackingWriter}; -use crate::s9pk::merkle_archive::source::{ArchiveSource, FileSource, Section}; +use crate::s9pk::merkle_archive::source::{ArchiveSource, DynFileSource, FileSource, Section}; -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct FileContents(S); impl FileContents { pub fn new(source: S) -> Self { @@ -73,6 +73,9 @@ impl FileContents { } Ok(()) } + pub fn into_dyn(self) -> FileContents { + FileContents(DynFileSource::new(self.0)) + } } impl std::ops::Deref for FileContents { type Target = S; diff --git a/core/startos/src/s9pk/merkle_archive/mod.rs b/core/startos/src/s9pk/merkle_archive/mod.rs index f83cd2464..abddb3c1e 100644 --- a/core/startos/src/s9pk/merkle_archive/mod.rs +++ b/core/startos/src/s9pk/merkle_archive/mod.rs @@ -1,3 +1,7 @@ +use std::path::Path; +use std::sync::Arc; + +use ed25519::signature::Keypair; use ed25519_dalek::{Signature, SigningKey, VerifyingKey}; use tokio::io::AsyncRead; @@ -6,7 +10,7 @@ use crate::s9pk::merkle_archive::directory_contents::DirectoryContents; use crate::s9pk::merkle_archive::file_contents::FileContents; use crate::s9pk::merkle_archive::hash::Hash; use crate::s9pk::merkle_archive::sink::Sink; -use crate::s9pk::merkle_archive::source::{ArchiveSource, FileSource, Section}; +use crate::s9pk::merkle_archive::source::{ArchiveSource, DynFileSource, FileSource, Section}; use crate::s9pk::merkle_archive::write_queue::WriteQueue; pub mod directory_contents; @@ -19,13 +23,13 @@ mod test; pub mod varint; pub mod write_queue; -#[derive(Debug)] +#[derive(Debug, Clone)] enum Signer { Signed(VerifyingKey, Signature), Signer(SigningKey), } -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct MerkleArchive { signer: Signer, contents: DirectoryContents, @@ -37,14 +41,33 @@ impl MerkleArchive { contents, } } + pub fn signer(&self) -> VerifyingKey { + match &self.signer { + Signer::Signed(k, _) => *k, + Signer::Signer(k) => k.verifying_key(), + } + } pub const fn header_size() -> u64 { 32 // pubkey + 64 // signature + + 32 // sighash + DirectoryContents::>::header_size() } pub fn contents(&self) -> &DirectoryContents { &self.contents } + pub fn contents_mut(&mut self) -> &mut DirectoryContents { + &mut self.contents + } + pub fn set_signer(&mut self, key: SigningKey) { + self.signer = Signer::Signer(key); + } + pub fn sort_by( + &mut self, + sort_by: impl Fn(&str, &str) -> std::cmp::Ordering + Send + Sync + 'static, + ) { + self.contents.sort_by(sort_by) + } } impl MerkleArchive> { #[instrument(skip_all)] @@ -80,6 +103,9 @@ impl MerkleArchive { pub async fn update_hashes(&mut self, only_missing: bool) -> Result<(), Error> { self.contents.update_hashes(only_missing).await } + pub fn filter(&mut self, filter: impl Fn(&Path) -> bool) -> Result<(), Error> { + self.contents.filter(filter) + } #[instrument(skip_all)] pub async fn serialize(&self, w: &mut W, verify: bool) -> Result<(), Error> { use tokio::io::AsyncWriteExt; @@ -103,9 +129,15 @@ impl MerkleArchive { queue.serialize(w, verify).await?; Ok(()) } + pub fn into_dyn(self) -> MerkleArchive { + MerkleArchive { + signer: self.signer, + contents: self.contents.into_dyn(), + } + } } -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct Entry { hash: Option, contents: EntryContents, @@ -117,12 +149,27 @@ impl Entry { contents, } } + pub fn file(source: S) -> Self { + Self::new(EntryContents::File(FileContents::new(source))) + } pub fn hash(&self) -> Option { self.hash } pub fn as_contents(&self) -> &EntryContents { &self.contents } + pub fn as_file(&self) -> Option<&FileContents> { + match self.as_contents() { + EntryContents::File(f) => Some(f), + _ => None, + } + } + pub fn as_directory(&self) -> Option<&DirectoryContents> { + match self.as_contents() { + EntryContents::Directory(d) => Some(d), + _ => None, + } + } pub fn as_contents_mut(&mut self) -> &mut EntryContents { self.hash = None; &mut self.contents @@ -130,11 +177,24 @@ impl Entry { pub fn into_contents(self) -> EntryContents { self.contents } + pub fn into_file(self) -> Option> { + match self.into_contents() { + EntryContents::File(f) => Some(f), + _ => None, + } + } + pub fn into_directory(self) -> Option> { + match self.into_contents() { + EntryContents::Directory(d) => Some(d), + _ => None, + } + } pub fn header_size(&self) -> u64 { 32 // hash + self.contents.header_size() } } +impl Entry {} impl Entry> { #[instrument(skip_all)] pub async fn deserialize( @@ -156,6 +216,24 @@ impl Entry> { } } impl Entry { + pub fn filter(&mut self, filter: impl Fn(&Path) -> bool) -> Result<(), Error> { + if let EntryContents::Directory(d) = &mut self.contents { + d.filter(filter)?; + } + Ok(()) + } + pub async fn read_file_to_vec(&self) -> Result, Error> { + match self.as_contents() { + EntryContents::File(f) => Ok(f.to_vec(self.hash).await?), + EntryContents::Directory(_) => Err(Error::new( + eyre!("expected file, found directory"), + ErrorKind::ParseS9pk, + )), + EntryContents::Missing => { + Err(Error::new(eyre!("entry is missing"), ErrorKind::ParseS9pk)) + } + } + } pub async fn to_missing(&self) -> Result { let hash = if let Some(hash) = self.hash { hash @@ -190,9 +268,15 @@ impl Entry { w.write_all(hash.as_bytes()).await?; self.contents.serialize_header(position, w).await } + pub fn into_dyn(self) -> Entry { + Entry { + hash: self.hash, + contents: self.contents.into_dyn(), + } + } } -#[derive(Debug)] +#[derive(Debug, Clone)] pub enum EntryContents { Missing, File(FileContents), @@ -214,6 +298,9 @@ impl EntryContents { Self::Directory(_) => DirectoryContents::::header_size(), } } + pub fn is_dir(&self) -> bool { + matches!(self, &EntryContents::Directory(_)) + } } impl EntryContents> { #[instrument(skip_all)] @@ -265,4 +352,11 @@ impl EntryContents { Self::Directory(d) => Some(d.serialize_header(position, w).await?), }) } + pub fn into_dyn(self) -> EntryContents { + match self { + Self::Missing => EntryContents::Missing, + Self::File(f) => EntryContents::File(f.into_dyn()), + Self::Directory(d) => EntryContents::Directory(d.into_dyn()), + } + } } diff --git a/core/startos/src/s9pk/merkle_archive/source/http.rs b/core/startos/src/s9pk/merkle_archive/source/http.rs index f38fd7028..1cb9ba961 100644 --- a/core/startos/src/s9pk/merkle_archive/source/http.rs +++ b/core/startos/src/s9pk/merkle_archive/source/http.rs @@ -1,12 +1,9 @@ -use std::sync::Arc; - use bytes::Bytes; use futures::stream::BoxStream; use futures::{StreamExt, TryStreamExt}; -use http::header::{ACCEPT_RANGES, RANGE}; +use reqwest::header::{ACCEPT_RANGES, CONTENT_LENGTH, RANGE}; use reqwest::{Client, Url}; use tokio::io::AsyncRead; -use tokio::sync::Mutex; use tokio_util::io::StreamReader; use crate::prelude::*; @@ -16,6 +13,7 @@ use crate::s9pk::merkle_archive::source::ArchiveSource; pub struct HttpSource { url: Url, client: Client, + size: Option, range_support: Result< (), (), // Arc>> @@ -23,24 +21,31 @@ pub struct HttpSource { } impl HttpSource { pub async fn new(client: Client, url: Url) -> Result { - let range_support = client + let head = client .head(url.clone()) .send() .await .with_kind(ErrorKind::Network)? .error_for_status() - .with_kind(ErrorKind::Network)? + .with_kind(ErrorKind::Network)?; + let range_support = head .headers() .get(ACCEPT_RANGES) .and_then(|s| s.to_str().ok()) == Some("bytes"); + let size = head + .headers() + .get(CONTENT_LENGTH) + .and_then(|s| s.to_str().ok()) + .and_then(|s| s.parse().ok()); Ok(Self { url, client, + size, range_support: if range_support { Ok(()) } else { - todo!() // Err(Arc::new(Mutex::new(None))) + Err(()) // Err(Arc::new(Mutex::new(None))) }, }) } @@ -48,6 +53,9 @@ impl HttpSource { #[async_trait::async_trait] impl ArchiveSource for HttpSource { type Reader = HttpReader; + async fn size(&self) -> Option { + self.size + } async fn fetch(&self, position: u64, size: u64) -> Result { match self.range_support { Ok(_) => Ok(HttpReader::Range(StreamReader::new(if size > 0 { diff --git a/core/startos/src/s9pk/merkle_archive/source/mod.rs b/core/startos/src/s9pk/merkle_archive/source/mod.rs index 3a7d60a40..97c94b480 100644 --- a/core/startos/src/s9pk/merkle_archive/source/mod.rs +++ b/core/startos/src/s9pk/merkle_archive/source/mod.rs @@ -12,15 +12,15 @@ pub mod http; pub mod multi_cursor_file; #[async_trait::async_trait] -pub trait FileSource: Send + Sync + Sized + 'static { +pub trait FileSource: Clone + Send + Sync + Sized + 'static { type Reader: AsyncRead + Unpin + Send; async fn size(&self) -> Result; async fn reader(&self) -> Result; - async fn copy(&self, w: &mut W) -> Result<(), Error> { + async fn copy(&self, w: &mut W) -> Result<(), Error> { tokio::io::copy(&mut self.reader().await?, w).await?; Ok(()) } - async fn copy_verify( + async fn copy_verify( &self, w: &mut W, verify: Option, @@ -37,6 +37,75 @@ pub trait FileSource: Send + Sync + Sized + 'static { } } +#[derive(Clone)] +pub struct DynFileSource(Arc); +impl DynFileSource { + pub fn new(source: T) -> Self { + Self(Arc::new(source)) + } +} +#[async_trait::async_trait] +impl FileSource for DynFileSource { + type Reader = Box; + async fn size(&self) -> Result { + self.0.size().await + } + async fn reader(&self) -> Result { + self.0.reader().await + } + async fn copy( + &self, + mut w: &mut W, + ) -> Result<(), Error> { + self.0.copy(&mut w).await + } + async fn copy_verify( + &self, + mut w: &mut W, + verify: Option, + ) -> Result<(), Error> { + self.0.copy_verify(&mut w, verify).await + } + async fn to_vec(&self, verify: Option) -> Result, Error> { + self.0.to_vec(verify).await + } +} + +#[async_trait::async_trait] +trait DynableFileSource: Send + Sync + 'static { + async fn size(&self) -> Result; + async fn reader(&self) -> Result, Error>; + async fn copy(&self, w: &mut (dyn AsyncWrite + Unpin + Send)) -> Result<(), Error>; + async fn copy_verify( + &self, + w: &mut (dyn AsyncWrite + Unpin + Send), + verify: Option, + ) -> Result<(), Error>; + async fn to_vec(&self, verify: Option) -> Result, Error>; +} +#[async_trait::async_trait] +impl DynableFileSource for T { + async fn size(&self) -> Result { + FileSource::size(self).await + } + async fn reader(&self) -> Result, Error> { + Ok(Box::new(FileSource::reader(self).await?)) + } + async fn copy(&self, w: &mut (dyn AsyncWrite + Unpin + Send)) -> Result<(), Error> { + FileSource::copy(self, w).await + } + async fn copy_verify( + &self, + w: &mut (dyn AsyncWrite + Unpin + Send), + verify: Option, + ) -> Result<(), Error> { + FileSource::copy_verify(self, w, verify).await + } + async fn to_vec(&self, verify: Option) -> Result, Error> { + FileSource::to_vec(self, verify).await + } +} + #[async_trait::async_trait] impl FileSource for PathBuf { type Reader = File; @@ -57,7 +126,7 @@ impl FileSource for Arc<[u8]> { async fn reader(&self) -> Result { Ok(std::io::Cursor::new(self.clone())) } - async fn copy(&self, w: &mut W) -> Result<(), Error> { + async fn copy(&self, w: &mut W) -> Result<(), Error> { use tokio::io::AsyncWriteExt; w.write_all(&*self).await?; @@ -68,8 +137,11 @@ impl FileSource for Arc<[u8]> { #[async_trait::async_trait] pub trait ArchiveSource: Clone + Send + Sync + Sized + 'static { type Reader: AsyncRead + Unpin + Send; + async fn size(&self) -> Option { + None + } async fn fetch(&self, position: u64, size: u64) -> Result; - async fn copy_to( + async fn copy_to( &self, position: u64, size: u64, @@ -99,7 +171,7 @@ impl ArchiveSource for Arc<[u8]> { } } -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct Section { source: S, position: u64, @@ -114,7 +186,7 @@ impl FileSource for Section { async fn reader(&self) -> Result { self.source.fetch(self.position, self.size).await } - async fn copy(&self, w: &mut W) -> Result<(), Error> { + async fn copy(&self, w: &mut W) -> Result<(), Error> { self.source.copy_to(self.position, self.size, w).await } } diff --git a/core/startos/src/s9pk/merkle_archive/source/multi_cursor_file.rs b/core/startos/src/s9pk/merkle_archive/source/multi_cursor_file.rs index cda3e5103..afb808471 100644 --- a/core/startos/src/s9pk/merkle_archive/source/multi_cursor_file.rs +++ b/core/startos/src/s9pk/merkle_archive/source/multi_cursor_file.rs @@ -1,16 +1,20 @@ -use std::io::SeekFrom; -use std::os::fd::{AsRawFd, RawFd}; +use std::os::fd::{AsRawFd, FromRawFd, RawFd}; use std::path::{Path, PathBuf}; use std::sync::Arc; +use std::{borrow::Borrow, io::SeekFrom}; use tokio::fs::File; -use tokio::io::AsyncRead; +use tokio::io::{AsyncRead, AsyncReadExt}; use tokio::sync::{Mutex, OwnedMutexGuard}; use crate::disk::mount::filesystem::loop_dev::LoopDev; use crate::prelude::*; use crate::s9pk::merkle_archive::source::{ArchiveSource, Section}; +fn path_from_fd(fd: RawFd) -> PathBuf { + Path::new("/proc/self/fd").join(fd.to_string()) +} + #[derive(Clone)] pub struct MultiCursorFile { fd: RawFd, @@ -18,7 +22,14 @@ pub struct MultiCursorFile { } impl MultiCursorFile { fn path(&self) -> PathBuf { - Path::new("/proc/self/fd").join(self.fd.to_string()) + path_from_fd(self.fd) + } + pub async fn open(fd: &impl AsRawFd) -> Result { + let fd = fd.as_raw_fd(); + Ok(Self { + fd, + file: Arc::new(Mutex::new(File::open(path_from_fd(fd)).await?)), + }) } } impl From for MultiCursorFile { @@ -47,8 +58,8 @@ impl AsyncRead for FileSectionReader { return std::task::Poll::Ready(Ok(())); } let before = buf.filled().len() as u64; - let res = std::pin::Pin::new(&mut **this.file.get_mut()) - .poll_read(cx, &mut buf.take(*this.remaining as usize)); + let res = std::pin::Pin::new(&mut (&mut **this.file.get_mut()).take(*this.remaining)) + .poll_read(cx, buf); *this.remaining = this .remaining .saturating_sub(buf.filled().len() as u64 - before); @@ -59,13 +70,36 @@ impl AsyncRead for FileSectionReader { #[async_trait::async_trait] impl ArchiveSource for MultiCursorFile { type Reader = FileSectionReader; + async fn size(&self) -> Option { + tokio::fs::metadata(self.path()).await.ok().map(|m| m.len()) + } async fn fetch(&self, position: u64, size: u64) -> Result { use tokio::io::AsyncSeekExt; let mut file = if let Ok(file) = self.file.clone().try_lock_owned() { file } else { - Arc::new(Mutex::new(File::open(self.path()).await?)) + #[cfg(target_os = "linux")] + let file = File::open(self.path()).await?; + #[cfg(target_os = "macos")] // here be dragons + let file = unsafe { + let mut buf = [0u8; libc::PATH_MAX as usize]; + if libc::fcntl( + self.fd, + libc::F_GETPATH, + buf.as_mut_ptr().cast::(), + ) == -1 + { + return Err(std::io::Error::last_os_error().into()); + } + File::open( + &*std::ffi::CStr::from_bytes_until_nul(&buf) + .with_kind(ErrorKind::Utf8)? + .to_string_lossy(), + ) + .await? + }; + Arc::new(Mutex::new(file)) .try_lock_owned() .expect("freshly created") }; @@ -77,8 +111,8 @@ impl ArchiveSource for MultiCursorFile { } } -impl From> for LoopDev { - fn from(value: Section) -> Self { +impl From<&Section> for LoopDev { + fn from(value: &Section) -> Self { LoopDev::new(value.source.path(), value.position, value.size) } } diff --git a/core/startos/src/s9pk/merkle_archive/write_queue.rs b/core/startos/src/s9pk/merkle_archive/write_queue.rs index 973ffcf30..9496d5e83 100644 --- a/core/startos/src/s9pk/merkle_archive/write_queue.rs +++ b/core/startos/src/s9pk/merkle_archive/write_queue.rs @@ -4,7 +4,6 @@ use crate::prelude::*; use crate::s9pk::merkle_archive::sink::Sink; use crate::s9pk::merkle_archive::source::FileSource; use crate::s9pk::merkle_archive::{Entry, EntryContents}; -use crate::util::MaybeOwned; pub struct WriteQueue<'a, S> { next_available_position: u64, diff --git a/core/startos/src/s9pk/mod.rs b/core/startos/src/s9pk/mod.rs index 6720f2999..83924293a 100644 --- a/core/startos/src/s9pk/mod.rs +++ b/core/startos/src/s9pk/mod.rs @@ -1,5 +1,39 @@ pub mod merkle_archive; +pub mod rpc; pub mod v1; pub mod v2; -pub use v1::*; +use std::io::SeekFrom; +use std::path::Path; + +use tokio::fs::File; +use tokio::io::{AsyncReadExt, AsyncSeekExt}; +pub use v2::{manifest, S9pk}; + +use crate::context::CliContext; +use crate::prelude::*; +use crate::s9pk::v1::reader::S9pkReader; +use crate::s9pk::v2::compat::MAGIC_AND_VERSION; + +pub async fn load(ctx: &CliContext, path: impl AsRef) -> Result { + // TODO: return s9pk + const MAGIC_LEN: usize = MAGIC_AND_VERSION.len(); + let mut magic = [0_u8; MAGIC_LEN]; + let mut file = tokio::fs::File::open(&path).await?; + file.read_exact(&mut magic).await?; + file.seek(SeekFrom::Start(0)).await?; + if magic == v2::compat::MAGIC_AND_VERSION { + tracing::info!("Converting package to v2 s9pk"); + let new_path = path.as_ref().with_extension("compat.s9pk"); + S9pk::from_v1( + S9pkReader::from_reader(file, true).await?, + &new_path, + ctx.developer_key()?.clone(), + ) + .await?; + tokio::fs::rename(&new_path, &path).await?; + file = tokio::fs::File::open(&path).await?; + tracing::info!("Converted s9pk successfully"); + } + Ok(file) +} diff --git a/core/startos/src/s9pk/rpc.rs b/core/startos/src/s9pk/rpc.rs new file mode 100644 index 000000000..e11faa2ff --- /dev/null +++ b/core/startos/src/s9pk/rpc.rs @@ -0,0 +1,227 @@ +use std::path::{Path, PathBuf}; +use std::sync::Arc; + +use clap::Parser; +use itertools::Itertools; +use models::ImageId; +use rpc_toolkit::{from_fn_async, Empty, HandlerExt, ParentHandler}; +use serde::{Deserialize, Serialize}; +use tokio::fs::File; +use tokio::process::Command; + +use crate::context::CliContext; +use crate::prelude::*; +use crate::s9pk::manifest::Manifest; +use crate::s9pk::merkle_archive::source::DynFileSource; +use crate::s9pk::merkle_archive::Entry; +use crate::s9pk::v2::compat::CONTAINER_TOOL; +use crate::s9pk::S9pk; +use crate::util::io::TmpDir; +use crate::util::serde::{apply_expr, HandlerExtSerde}; +use crate::util::Invoke; + +pub const SKIP_ENV: &[&str] = &["TERM", "container", "HOME", "HOSTNAME"]; + +pub fn s9pk() -> ParentHandler { + ParentHandler::new() + .subcommand("edit", edit()) + .subcommand("inspect", inspect()) +} + +#[derive(Deserialize, Serialize, Parser)] +struct S9pkPath { + s9pk: PathBuf, +} + +fn edit() -> ParentHandler { + let only_parent = |a, _| a; + ParentHandler::::new() + .subcommand( + "add-image", + from_fn_async(add_image) + .with_inherited(only_parent) + .no_display(), + ) + .subcommand( + "manifest", + from_fn_async(edit_manifest) + .with_inherited(only_parent) + .with_display_serializable(), + ) +} + +fn inspect() -> ParentHandler { + let only_parent = |a, _| a; + ParentHandler::::new() + .subcommand( + "file-tree", + from_fn_async(file_tree) + .with_inherited(only_parent) + .with_display_serializable(), + ) + .subcommand( + "manifest", + from_fn_async(inspect_manifest) + .with_inherited(only_parent) + .with_display_serializable(), + ) +} + +#[derive(Deserialize, Serialize, Parser)] +struct AddImageParams { + id: ImageId, + image: String, +} +async fn add_image( + ctx: CliContext, + AddImageParams { id, image }: AddImageParams, + S9pkPath { s9pk: s9pk_path }: S9pkPath, +) -> Result<(), Error> { + let tmpdir = TmpDir::new().await?; + let sqfs_path = tmpdir.join("image.squashfs"); + let arch = String::from_utf8( + Command::new(CONTAINER_TOOL) + .arg("run") + .arg("--rm") + .arg("--entrypoint") + .arg("uname") + .arg(&image) + .arg("-m") + .invoke(ErrorKind::Docker) + .await?, + )?; + let env = String::from_utf8( + Command::new(CONTAINER_TOOL) + .arg("run") + .arg("--rm") + .arg("--entrypoint") + .arg("env") + .arg(&image) + .invoke(ErrorKind::Docker) + .await?, + )? + .lines() + .filter(|l| { + l.trim() + .split_once("=") + .map_or(false, |(v, _)| !SKIP_ENV.contains(&v)) + }) + .join("\n") + + "\n"; + let workdir = Path::new( + String::from_utf8( + Command::new(CONTAINER_TOOL) + .arg("run") + .arg("--rm") + .arg("--entrypoint") + .arg("pwd") + .arg(&image) + .invoke(ErrorKind::Docker) + .await?, + )? + .trim(), + ) + .to_owned(); + let container_id = String::from_utf8( + Command::new(CONTAINER_TOOL) + .arg("create") + .arg(&image) + .invoke(ErrorKind::Docker) + .await?, + )?; + Command::new("bash") + .arg("-c") + .arg(format!( + "{CONTAINER_TOOL} export {container_id} | mksquashfs - {sqfs} -tar -force-uid 100000 -force-gid 100000", // TODO: real uid mapping + container_id = container_id.trim(), + sqfs = sqfs_path.display() + )) + .invoke(ErrorKind::Docker) + .await?; + Command::new(CONTAINER_TOOL) + .arg("rm") + .arg(container_id.trim()) + .invoke(ErrorKind::Docker) + .await?; + let mut s9pk = S9pk::from_file(super::load(&ctx, &s9pk_path).await?) + .await? + .into_dyn(); + let archive = s9pk.as_archive_mut(); + archive.set_signer(ctx.developer_key()?.clone()); + archive.contents_mut().insert_path( + Path::new("images") + .join(arch.trim()) + .join(&id) + .with_extension("squashfs"), + Entry::file(DynFileSource::new(sqfs_path)), + )?; + archive.contents_mut().insert_path( + Path::new("images") + .join(arch.trim()) + .join(&id) + .with_extension("env"), + Entry::file(DynFileSource::new(Arc::from(Vec::from(env)))), + )?; + archive.contents_mut().insert_path( + Path::new("images") + .join(arch.trim()) + .join(&id) + .with_extension("json"), + Entry::file(DynFileSource::new(Arc::from( + serde_json::to_vec(&serde_json::json!({ + "workdir": workdir + })) + .with_kind(ErrorKind::Serialization)?, + ))), + )?; + let tmp_path = s9pk_path.with_extension("s9pk.tmp"); + let mut tmp_file = File::create(&tmp_path).await?; + s9pk.serialize(&mut tmp_file, true).await?; + tmp_file.sync_all().await?; + tokio::fs::rename(&tmp_path, &s9pk_path).await?; + + Ok(()) +} + +#[derive(Deserialize, Serialize, Parser)] +struct EditManifestParams { + expression: String, +} +async fn edit_manifest( + ctx: CliContext, + EditManifestParams { expression }: EditManifestParams, + S9pkPath { s9pk: s9pk_path }: S9pkPath, +) -> Result { + let mut s9pk = S9pk::from_file(super::load(&ctx, &s9pk_path).await?).await?; + let old = serde_json::to_value(s9pk.as_manifest()).with_kind(ErrorKind::Serialization)?; + *s9pk.as_manifest_mut() = serde_json::from_value(apply_expr(old.into(), &expression)?.into()) + .with_kind(ErrorKind::Serialization)?; + let manifest = s9pk.as_manifest().clone(); + let tmp_path = s9pk_path.with_extension("s9pk.tmp"); + let mut tmp_file = File::create(&tmp_path).await?; + s9pk.as_archive_mut() + .set_signer(ctx.developer_key()?.clone()); + s9pk.serialize(&mut tmp_file, true).await?; + tmp_file.sync_all().await?; + tokio::fs::rename(&tmp_path, &s9pk_path).await?; + + Ok(manifest) +} + +async fn file_tree( + ctx: CliContext, + _: Empty, + S9pkPath { s9pk }: S9pkPath, +) -> Result, Error> { + let s9pk = S9pk::from_file(super::load(&ctx, &s9pk).await?).await?; + Ok(s9pk.as_archive().contents().file_paths("")) +} + +async fn inspect_manifest( + ctx: CliContext, + _: Empty, + S9pkPath { s9pk }: S9pkPath, +) -> Result { + let s9pk = S9pk::from_file(super::load(&ctx, &s9pk).await?).await?; + Ok(s9pk.as_manifest().clone()) +} diff --git a/core/startos/src/s9pk/v1/manifest.rs b/core/startos/src/s9pk/v1/manifest.rs index 3eee540ed..b2fa85a5e 100644 --- a/core/startos/src/s9pk/v1/manifest.rs +++ b/core/startos/src/s9pk/v1/manifest.rs @@ -1,27 +1,17 @@ -use std::collections::BTreeMap; use std::path::{Path, PathBuf}; -use color_eyre::eyre::eyre; +use imbl_value::InOMap; pub use models::PackageId; use serde::{Deserialize, Serialize}; use url::Url; use super::git_hash::GitHash; -use crate::action::Actions; -use crate::backup::BackupActions; -use crate::config::action::ConfigActions; use crate::dependencies::Dependencies; -use crate::migration::Migrations; -use crate::net::interface::Interfaces; use crate::prelude::*; -use crate::procedure::docker::DockerContainers; -use crate::procedure::PackageProcedure; -use crate::status::health_check::HealthChecks; -use crate::util::serde::Regex; +use crate::s9pk::manifest::{Alerts, Description, HardwareRequirements}; use crate::util::Version; use crate::version::{Current, VersionT}; use crate::volume::Volumes; -use crate::Error; fn current_version() -> Version { Current::new().semver().into() @@ -36,13 +26,11 @@ pub struct Manifest { pub id: PackageId, #[serde(default)] pub git_hash: Option, + #[serde(default)] + pub assets: Assets, pub title: String, pub version: Version, pub description: Description, - #[serde(default)] - pub assets: Assets, - #[serde(default)] - pub build: Option>, pub release_notes: String, pub license: String, // type of license pub wrapper_repo: Url, @@ -52,24 +40,10 @@ pub struct Manifest { pub donation_url: Option, #[serde(default)] pub alerts: Alerts, - pub main: PackageProcedure, - pub health_checks: HealthChecks, - pub config: Option, - pub properties: Option, pub volumes: Volumes, - // #[serde(default)] - pub interfaces: Interfaces, - // #[serde(default)] - pub backup: BackupActions, - #[serde(default)] - pub migrations: Migrations, - #[serde(default)] - pub actions: Actions, - // #[serde(default)] - // pub permissions: Permissions, #[serde(default)] pub dependencies: Dependencies, - pub containers: Option, + pub config: Option>, #[serde(default)] pub replaces: Vec, @@ -78,43 +52,6 @@ pub struct Manifest { pub hardware_requirements: HardwareRequirements, } -impl Manifest { - pub fn package_procedures(&self) -> impl Iterator { - use std::iter::once; - let main = once(&self.main); - let cfg_get = self.config.as_ref().map(|a| &a.get).into_iter(); - let cfg_set = self.config.as_ref().map(|a| &a.set).into_iter(); - let props = self.properties.iter(); - let backups = vec![&self.backup.create, &self.backup.restore].into_iter(); - let migrations = self - .migrations - .to - .values() - .chain(self.migrations.from.values()); - let actions = self.actions.0.values().map(|a| &a.implementation); - main.chain(cfg_get) - .chain(cfg_set) - .chain(props) - .chain(backups) - .chain(migrations) - .chain(actions) - } - - pub fn with_git_hash(mut self, git_hash: GitHash) -> Self { - self.git_hash = Some(git_hash); - self - } -} - -#[derive(Clone, Debug, Default, Deserialize, Serialize)] -#[serde(rename_all = "kebab-case")] -pub struct HardwareRequirements { - #[serde(default)] - device: BTreeMap, - ram: Option, - pub arch: Option>, -} - #[derive(Clone, Debug, Default, Deserialize, Serialize)] #[serde(rename_all = "kebab-case")] pub struct Assets { @@ -176,36 +113,3 @@ impl Assets { .unwrap_or(Path::new("scripts")) } } - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct Description { - pub short: String, - pub long: String, -} -impl Description { - pub fn validate(&self) -> Result<(), Error> { - if self.short.chars().skip(160).next().is_some() { - return Err(Error::new( - eyre!("Short description must be 160 characters or less."), - crate::ErrorKind::ValidateS9pk, - )); - } - if self.long.chars().skip(5000).next().is_some() { - return Err(Error::new( - eyre!("Long description must be 5000 characters or less."), - crate::ErrorKind::ValidateS9pk, - )); - } - Ok(()) - } -} - -#[derive(Clone, Debug, Default, Deserialize, Serialize)] -#[serde(rename_all = "kebab-case")] -pub struct Alerts { - pub install: Option, - pub uninstall: Option, - pub restore: Option, - pub start: Option, - pub stop: Option, -} diff --git a/core/startos/src/s9pk/v1/mod.rs b/core/startos/src/s9pk/v1/mod.rs index e1bf4caba..ca49ca597 100644 --- a/core/startos/src/s9pk/v1/mod.rs +++ b/core/startos/src/s9pk/v1/mod.rs @@ -1,25 +1,7 @@ -use std::ffi::OsStr; use std::path::PathBuf; -use color_eyre::eyre::eyre; -use futures::TryStreamExt; -use imbl::OrdMap; -use rpc_toolkit::command; -use serde_json::Value; -use tokio::io::AsyncRead; -use tracing::instrument; - -use crate::context::SdkContext; -use crate::s9pk::builder::S9pkPacker; -use crate::s9pk::docker::DockerMultiArch; -use crate::s9pk::git_hash::GitHash; -use crate::s9pk::manifest::Manifest; -use crate::s9pk::reader::S9pkReader; -use crate::util::display_none; -use crate::util::io::BufferedWriteReader; -use crate::util::serde::IoFormat; -use crate::volume::Volume; -use crate::{Error, ErrorKind, ResultExt}; +use clap::Parser; +use serde::{Deserialize, Serialize}; pub mod builder; pub mod docker; @@ -30,217 +12,9 @@ pub mod reader; pub const SIG_CONTEXT: &[u8] = b"s9pk"; -#[command(cli_only, display(display_none))] -#[instrument(skip_all)] -pub async fn pack(#[context] ctx: SdkContext, #[arg] path: Option) -> Result<(), Error> { - use tokio::fs::File; - - let path = if let Some(path) = path { - path - } else { - std::env::current_dir()? - }; - let manifest_value: Value = if path.join("manifest.toml").exists() { - IoFormat::Toml - .from_async_reader(File::open(path.join("manifest.toml")).await?) - .await? - } else if path.join("manifest.yaml").exists() { - IoFormat::Yaml - .from_async_reader(File::open(path.join("manifest.yaml")).await?) - .await? - } else if path.join("manifest.json").exists() { - IoFormat::Json - .from_async_reader(File::open(path.join("manifest.json")).await?) - .await? - } else { - return Err(Error::new( - eyre!("manifest not found"), - crate::ErrorKind::Pack, - )); - }; - - let manifest: Manifest = serde_json::from_value::(manifest_value.clone()) - .with_kind(crate::ErrorKind::Deserialization)? - .with_git_hash(GitHash::from_path(&path).await?); - let extra_keys = - enumerate_extra_keys(&serde_json::to_value(&manifest).unwrap(), &manifest_value); - for k in extra_keys { - tracing::warn!("Unrecognized Manifest Key: {}", k); - } - - let outfile_path = path.join(format!("{}.s9pk", manifest.id)); - let mut outfile = File::create(outfile_path).await?; - S9pkPacker::builder() - .manifest(&manifest) - .writer(&mut outfile) - .license( - File::open(path.join(manifest.assets.license_path())) - .await - .with_ctx(|_| { - ( - crate::ErrorKind::Filesystem, - manifest.assets.license_path().display().to_string(), - ) - })?, - ) - .icon( - File::open(path.join(manifest.assets.icon_path())) - .await - .with_ctx(|_| { - ( - crate::ErrorKind::Filesystem, - manifest.assets.icon_path().display().to_string(), - ) - })?, - ) - .instructions( - File::open(path.join(manifest.assets.instructions_path())) - .await - .with_ctx(|_| { - ( - crate::ErrorKind::Filesystem, - manifest.assets.instructions_path().display().to_string(), - ) - })?, - ) - .docker_images({ - let docker_images_path = path.join(manifest.assets.docker_images_path()); - let res: Box = if tokio::fs::metadata(&docker_images_path).await?.is_dir() { - let tars: Vec<_> = tokio_stream::wrappers::ReadDirStream::new(tokio::fs::read_dir(&docker_images_path).await?).try_collect().await?; - let mut arch_info = DockerMultiArch::default(); - for tar in &tars { - if tar.path().extension() == Some(OsStr::new("tar")) { - arch_info.available.insert(tar.path().file_stem().unwrap_or_default().to_str().unwrap_or_default().to_owned()); - } - } - if arch_info.available.contains("aarch64") { - arch_info.default = "aarch64".to_owned(); - } else { - arch_info.default = arch_info.available.iter().next().cloned().unwrap_or_default(); - } - let arch_info_cbor = IoFormat::Cbor.to_vec(&arch_info)?; - Box::new(BufferedWriteReader::new(|w| async move { - let mut docker_images = tokio_tar::Builder::new(w); - let mut multiarch_header = tokio_tar::Header::new_gnu(); - multiarch_header.set_path("multiarch.cbor")?; - multiarch_header.set_size(arch_info_cbor.len() as u64); - multiarch_header.set_cksum(); - docker_images.append(&multiarch_header, std::io::Cursor::new(arch_info_cbor)).await?; - for tar in tars - { - docker_images - .append_path_with_name( - tar.path(), - tar.file_name(), - ) - .await?; - } - Ok::<_, std::io::Error>(()) - }, 1024 * 1024)) - } else { - Box::new(File::open(docker_images_path) - .await - .with_ctx(|_| { - ( - crate::ErrorKind::Filesystem, - manifest.assets.docker_images_path().display().to_string(), - ) - })?) - }; - res - }) - .assets({ - let asset_volumes = manifest - .volumes - .iter() - .filter(|(_, v)| matches!(v, &&Volume::Assets {})).map(|(id, _)| id.clone()).collect::>(); - let assets_path = manifest.assets.assets_path().to_owned(); - let path = path.clone(); - - BufferedWriteReader::new(|w| async move { - let mut assets = tokio_tar::Builder::new(w); - for asset_volume in asset_volumes - { - assets - .append_dir_all( - &asset_volume, - path.join(&assets_path).join(&asset_volume), - ) - .await?; - } - Ok::<_, std::io::Error>(()) - }, 1024 * 1024) - }) - .scripts({ - let script_path = path.join(manifest.assets.scripts_path()).join("embassy.js"); - let needs_script = manifest.package_procedures().any(|a| a.is_script()); - let has_script = script_path.exists(); - match (needs_script, has_script) { - (true, true) => Some(File::open(script_path).await?), - (true, false) => { - return Err(Error::new(eyre!("Script is declared in manifest, but no such script exists at ./scripts/embassy.js"), ErrorKind::Pack).into()) - } - (false, true) => { - tracing::warn!("Manifest does not declare any actions that use scripts, but a script exists at ./scripts/embassy.js"); - None - } - (false, false) => None - } - }) - .build() - .pack(&ctx.developer_key()?) - .await?; - outfile.sync_all().await?; - - Ok(()) -} - -#[command(rename = "s9pk", cli_only, display(display_none))] -pub async fn verify(#[arg] path: PathBuf) -> Result<(), Error> { - let mut s9pk = S9pkReader::open(path, true).await?; - s9pk.validate().await?; - - Ok(()) -} - -fn enumerate_extra_keys(reference: &Value, candidate: &Value) -> Vec { - match (reference, candidate) { - (Value::Object(m_r), Value::Object(m_c)) => { - let om_r: OrdMap = m_r.clone().into_iter().collect(); - let om_c: OrdMap = m_c.clone().into_iter().collect(); - let common = om_r.clone().intersection(om_c.clone()); - let top_extra = common.clone().symmetric_difference(om_c.clone()); - let mut all_extra = top_extra - .keys() - .map(|s| format!(".{}", s)) - .collect::>(); - for (k, v) in common { - all_extra.extend( - enumerate_extra_keys(&v, om_c.get(&k).unwrap()) - .into_iter() - .map(|s| format!(".{}{}", k, s)), - ) - } - all_extra - } - (_, Value::Object(m1)) => m1.clone().keys().map(|s| format!(".{}", s)).collect(), - _ => Vec::new(), - } -} - -#[test] -fn test_enumerate_extra_keys() { - use serde_json::json; - let extras = enumerate_extra_keys( - &json!({ - "test": 1, - "test2": null, - }), - &json!({ - "test": 1, - "test2": { "test3": null }, - "test4": null - }), - ); - println!("{:?}", extras) +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct VerifyParams { + pub path: PathBuf, } diff --git a/core/startos/src/s9pk/v1/reader.rs b/core/startos/src/s9pk/v1/reader.rs index e901b1a14..82f62e1df 100644 --- a/core/startos/src/s9pk/v1/reader.rs +++ b/core/startos/src/s9pk/v1/reader.rs @@ -1,4 +1,3 @@ -use std::collections::BTreeSet; use std::io::SeekFrom; use std::ops::Range; use std::path::Path; @@ -10,22 +9,17 @@ use color_eyre::eyre::eyre; use digest::Output; use ed25519_dalek::VerifyingKey; use futures::TryStreamExt; -use models::ImageId; +use models::{ImageId, PackageId}; use sha2::{Digest, Sha512}; use tokio::fs::File; -use tokio::io::{AsyncRead, AsyncReadExt, AsyncSeek, AsyncSeekExt, ReadBuf}; +use tokio::io::{AsyncRead, AsyncReadExt, AsyncSeek, AsyncSeekExt, BufReader, ReadBuf}; use tracing::instrument; use super::header::{FileSection, Header, TableOfContents}; -use super::manifest::{Manifest, PackageId}; use super::SIG_CONTEXT; -use crate::install::progress::InstallProgressTracker; -use crate::s9pk::docker::DockerReader; +use crate::prelude::*; +use crate::s9pk::v1::docker::DockerReader; use crate::util::Version; -use crate::{Error, ResultExt}; - -const MAX_REPLACES: usize = 10; -const MAX_TITLE_LEN: usize = 30; #[pin_project::pin_project] #[derive(Debug)] @@ -144,7 +138,7 @@ impl FromStr for ImageTag { } } -pub struct S9pkReader { +pub struct S9pkReader> { hash: Option>, hash_string: Option, developer_key: VerifyingKey, @@ -159,103 +153,10 @@ impl S9pkReader { .await .with_ctx(|_| (crate::error::ErrorKind::Filesystem, p.display().to_string()))?; - Self::from_reader(rdr, check_sig).await - } -} -impl S9pkReader> { - pub fn validated(&mut self) { - self.rdr.validated() + Self::from_reader(BufReader::new(rdr), check_sig).await } } impl S9pkReader { - #[instrument(skip_all)] - pub async fn validate(&mut self) -> Result<(), Error> { - if self.toc.icon.length > 102_400 { - // 100 KiB - return Err(Error::new( - eyre!("icon must be less than 100KiB"), - crate::ErrorKind::ValidateS9pk, - )); - } - let image_tags = self.image_tags().await?; - let man = self.manifest().await?; - let containers = &man.containers; - let validated_image_ids = image_tags - .into_iter() - .map(|i| i.validate(&man.id, &man.version).map(|_| i.image_id)) - .collect::, _>>()?; - man.description.validate()?; - man.actions.0.iter().try_for_each(|(_, action)| { - action.validate( - containers, - &man.eos_version, - &man.volumes, - &validated_image_ids, - ) - })?; - man.backup.validate( - containers, - &man.eos_version, - &man.volumes, - &validated_image_ids, - )?; - if let Some(cfg) = &man.config { - cfg.validate( - containers, - &man.eos_version, - &man.volumes, - &validated_image_ids, - )?; - } - man.health_checks - .validate(&man.eos_version, &man.volumes, &validated_image_ids)?; - man.interfaces.validate()?; - man.main - .validate(&man.eos_version, &man.volumes, &validated_image_ids, false) - .with_ctx(|_| (crate::ErrorKind::ValidateS9pk, "Main"))?; - man.migrations.validate( - containers, - &man.eos_version, - &man.volumes, - &validated_image_ids, - )?; - - if man.replaces.len() >= MAX_REPLACES { - return Err(Error::new( - eyre!("Cannot have more than {MAX_REPLACES} replaces"), - crate::ErrorKind::ValidateS9pk, - )); - } - if let Some(too_big) = man.replaces.iter().find(|x| x.len() >= MAX_REPLACES) { - return Err(Error::new( - eyre!("We have found a replaces of ({too_big}) that exceeds the max length of {MAX_TITLE_LEN} "), - crate::ErrorKind::ValidateS9pk, - )); - } - if man.title.len() >= MAX_TITLE_LEN { - return Err(Error::new( - eyre!("Cannot have more than a length of {MAX_TITLE_LEN} for title"), - crate::ErrorKind::ValidateS9pk, - )); - } - - if man.containers.is_some() - && matches!(man.main, crate::procedure::PackageProcedure::Docker(_)) - { - return Err(Error::new( - eyre!("Cannot have a main docker and a main in containers"), - crate::ErrorKind::ValidateS9pk, - )); - } - if let Some(props) = &man.properties { - props - .validate(&man.eos_version, &man.volumes, &validated_image_ids, true) - .with_ctx(|_| (crate::ErrorKind::ValidateS9pk, "Properties"))?; - } - man.volumes.validate(&man.interfaces)?; - - Ok(()) - } #[instrument(skip_all)] pub async fn image_tags(&mut self) -> Result, Error> { let mut tar = tokio_tar::Archive::new(self.docker_images().await?); @@ -361,7 +262,7 @@ impl S9pkReader { self.read_handle(self.toc.manifest).await } - pub async fn manifest(&mut self) -> Result { + pub async fn manifest(&mut self) -> Result { let slice = self.manifest_raw().await?.to_vec().await?; serde_cbor::de::from_reader(slice.as_slice()) .with_ctx(|_| (crate::ErrorKind::ParseS9pk, "Deserializing Manifest (CBOR)")) diff --git a/core/startos/src/s9pk/v2/compat.rs b/core/startos/src/s9pk/v2/compat.rs new file mode 100644 index 000000000..e2ef8bdbb --- /dev/null +++ b/core/startos/src/s9pk/v2/compat.rs @@ -0,0 +1,358 @@ +use std::io::Cursor; +use std::path::{Path, PathBuf}; +use std::sync::Arc; + +use itertools::Itertools; +use tokio::fs::File; +use tokio::io::{AsyncRead, AsyncSeek, AsyncWriteExt}; +use tokio::process::Command; + +use crate::prelude::*; +use crate::s9pk::manifest::Manifest; +use crate::s9pk::merkle_archive::directory_contents::DirectoryContents; +use crate::s9pk::merkle_archive::source::multi_cursor_file::MultiCursorFile; +use crate::s9pk::merkle_archive::source::{FileSource, Section}; +use crate::s9pk::merkle_archive::{Entry, MerkleArchive}; +use crate::s9pk::rpc::SKIP_ENV; +use crate::s9pk::v1::manifest::Manifest as ManifestV1; +use crate::s9pk::v1::reader::S9pkReader; +use crate::s9pk::v2::S9pk; +use crate::util::io::TmpDir; +use crate::util::Invoke; +use crate::volume::Volume; +use crate::ARCH; + +pub const MAGIC_AND_VERSION: &[u8] = &[0x3b, 0x3b, 0x01]; + +#[cfg(not(feature = "docker"))] +pub const CONTAINER_TOOL: &str = "podman"; + +#[cfg(feature = "docker")] +pub const CONTAINER_TOOL: &str = "docker"; + +type DynRead = Box; +fn into_dyn_read(r: R) -> DynRead { + Box::new(r) +} + +#[derive(Clone)] +enum CompatSource { + Buffered(Arc<[u8]>), + File(PathBuf), +} +#[async_trait::async_trait] +impl FileSource for CompatSource { + type Reader = Box; + async fn size(&self) -> Result { + match self { + Self::Buffered(a) => Ok(a.len() as u64), + Self::File(f) => Ok(tokio::fs::metadata(f).await?.len()), + } + } + async fn reader(&self) -> Result { + match self { + Self::Buffered(a) => Ok(into_dyn_read(Cursor::new(a.clone()))), + Self::File(f) => Ok(into_dyn_read(File::open(f).await?)), + } + } +} + +impl S9pk> { + #[instrument(skip_all)] + pub async fn from_v1( + mut reader: S9pkReader, + destination: impl AsRef, + signer: ed25519_dalek::SigningKey, + ) -> Result { + let scratch_dir = TmpDir::new().await?; + + let mut archive = DirectoryContents::::new(); + + // manifest.json + let manifest_raw = reader.manifest().await?; + let manifest = from_value::(manifest_raw.clone())?; + let mut new_manifest = Manifest::from(manifest.clone()); + + // LICENSE.md + let license: Arc<[u8]> = reader.license().await?.to_vec().await?.into(); + archive.insert_path( + "LICENSE.md", + Entry::file(CompatSource::Buffered(license.into())), + )?; + + // instructions.md + let instructions: Arc<[u8]> = reader.instructions().await?.to_vec().await?.into(); + archive.insert_path( + "instructions.md", + Entry::file(CompatSource::Buffered(instructions.into())), + )?; + + // icon.md + let icon: Arc<[u8]> = reader.icon().await?.to_vec().await?.into(); + archive.insert_path( + format!("icon.{}", manifest.assets.icon_type()), + Entry::file(CompatSource::Buffered(icon.into())), + )?; + + // images + let images_dir = scratch_dir.join("images"); + tokio::fs::create_dir_all(&images_dir).await?; + Command::new(CONTAINER_TOOL) + .arg("load") + .input(Some(&mut reader.docker_images().await?)) + .invoke(ErrorKind::Docker) + .await?; + #[derive(serde::Deserialize)] + #[serde(rename_all = "PascalCase")] + struct DockerImagesOut { + repository: Option, + tag: Option, + #[serde(default)] + names: Vec, + } + for image in { + #[cfg(feature = "docker")] + let images = std::str::from_utf8( + &Command::new(CONTAINER_TOOL) + .arg("images") + .arg("--format=json") + .invoke(ErrorKind::Docker) + .await?, + )? + .lines() + .map(|l| serde_json::from_str::(l)) + .collect::, _>>() + .with_kind(ErrorKind::Deserialization)? + .into_iter(); + #[cfg(not(feature = "docker"))] + let images = serde_json::from_slice::>( + &Command::new(CONTAINER_TOOL) + .arg("images") + .arg("--format=json") + .invoke(ErrorKind::Docker) + .await?, + ) + .with_kind(ErrorKind::Deserialization)? + .into_iter(); + images + } + .flat_map(|i| { + if let (Some(repository), Some(tag)) = (i.repository, i.tag) { + vec![format!("{repository}:{tag}")] + } else { + i.names + .into_iter() + .filter_map(|i| i.strip_prefix("docker.io/").map(|s| s.to_owned())) + .collect() + } + }) + .filter_map(|i| { + i.strip_suffix(&format!(":{}", manifest.version)) + .map(|s| s.to_owned()) + }) + .filter_map(|i| { + i.strip_prefix(&format!("start9/{}/", manifest.id)) + .map(|s| s.to_owned()) + }) { + new_manifest.images.push(image.parse()?); + let sqfs_path = images_dir.join(&image).with_extension("squashfs"); + let image_name = format!("start9/{}/{}:{}", manifest.id, image, manifest.version); + let id = String::from_utf8( + Command::new(CONTAINER_TOOL) + .arg("create") + .arg(&image_name) + .invoke(ErrorKind::Docker) + .await?, + )?; + let env = String::from_utf8( + Command::new(CONTAINER_TOOL) + .arg("run") + .arg("--rm") + .arg("--entrypoint") + .arg("env") + .arg(&image_name) + .invoke(ErrorKind::Docker) + .await?, + )? + .lines() + .filter(|l| { + l.trim() + .split_once("=") + .map_or(false, |(v, _)| !SKIP_ENV.contains(&v)) + }) + .join("\n") + + "\n"; + let workdir = Path::new( + String::from_utf8( + Command::new(CONTAINER_TOOL) + .arg("run") + .arg("--rm") + .arg("--entrypoint") + .arg("pwd") + .arg(&image_name) + .invoke(ErrorKind::Docker) + .await?, + )? + .trim(), + ) + .to_owned(); + Command::new("bash") + .arg("-c") + .arg(format!( + "{CONTAINER_TOOL} export {id} | mksquashfs - {sqfs} -tar", + id = id.trim(), + sqfs = sqfs_path.display() + )) + .invoke(ErrorKind::Docker) + .await?; + Command::new(CONTAINER_TOOL) + .arg("rm") + .arg(id.trim()) + .invoke(ErrorKind::Docker) + .await?; + archive.insert_path( + Path::new("images") + .join(&*ARCH) + .join(&image) + .with_extension("squashfs"), + Entry::file(CompatSource::File(sqfs_path)), + )?; + archive.insert_path( + Path::new("images") + .join(&*ARCH) + .join(&image) + .with_extension("env"), + Entry::file(CompatSource::Buffered(Vec::from(env).into())), + )?; + archive.insert_path( + Path::new("images") + .join(&*ARCH) + .join(&image) + .with_extension("json"), + Entry::file(CompatSource::Buffered( + serde_json::to_vec(&serde_json::json!({ + "workdir": workdir + })) + .with_kind(ErrorKind::Serialization)? + .into(), + )), + )?; + } + Command::new(CONTAINER_TOOL) + .arg("image") + .arg("prune") + .arg("-af") + .invoke(ErrorKind::Docker) + .await?; + + // assets + let asset_dir = scratch_dir.join("assets"); + tokio::fs::create_dir_all(&asset_dir).await?; + tokio_tar::Archive::new(reader.assets().await?) + .unpack(&asset_dir) + .await?; + for (asset_id, _) in manifest + .volumes + .iter() + .filter(|(_, v)| matches!(v, Volume::Assets { .. })) + { + let assets_path = asset_dir.join(&asset_id); + let sqfs_path = assets_path.with_extension("squashfs"); + Command::new("mksquashfs") + .arg(&assets_path) + .arg(&sqfs_path) + .invoke(ErrorKind::Filesystem) + .await?; + archive.insert_path( + Path::new("assets").join(&asset_id), + Entry::file(CompatSource::File(sqfs_path)), + )?; + } + + // javascript + let js_dir = scratch_dir.join("javascript"); + let sqfs_path = js_dir.with_extension("squashfs"); + tokio::fs::create_dir_all(&js_dir).await?; + if let Some(mut scripts) = reader.scripts().await? { + let mut js_file = File::create(js_dir.join("embassy.js")).await?; + tokio::io::copy(&mut scripts, &mut js_file).await?; + js_file.sync_all().await?; + } + { + let mut js_file = File::create(js_dir.join("embassyManifest.json")).await?; + js_file + .write_all(&serde_json::to_vec(&manifest_raw).with_kind(ErrorKind::Serialization)?) + .await?; + js_file.sync_all().await?; + } + Command::new("mksquashfs") + .arg(&js_dir) + .arg(&sqfs_path) + .invoke(ErrorKind::Filesystem) + .await?; + archive.insert_path( + Path::new("javascript.squashfs"), + Entry::file(CompatSource::File(sqfs_path)), + )?; + + archive.insert_path( + "manifest.json", + Entry::file(CompatSource::Buffered( + serde_json::to_vec::(&new_manifest) + .with_kind(ErrorKind::Serialization)? + .into(), + )), + )?; + + let mut s9pk = S9pk::new(MerkleArchive::new(archive, signer), None).await?; + let mut dest_file = File::create(destination.as_ref()).await?; + s9pk.serialize(&mut dest_file, false).await?; + dest_file.sync_all().await?; + + scratch_dir.delete().await?; + + Ok(S9pk::deserialize(&MultiCursorFile::from( + File::open(destination.as_ref()).await?, + )) + .await?) + } +} + +impl From for Manifest { + fn from(value: ManifestV1) -> Self { + let default_url = value.upstream_repo.clone(); + Self { + id: value.id, + title: value.title, + version: value.version, + release_notes: value.release_notes, + license: value.license, + replaces: value.replaces, + wrapper_repo: value.wrapper_repo, + upstream_repo: value.upstream_repo, + support_site: value.support_site.unwrap_or_else(|| default_url.clone()), + marketing_site: value.marketing_site.unwrap_or_else(|| default_url.clone()), + donation_url: value.donation_url, + description: value.description, + images: Vec::new(), + assets: value + .volumes + .iter() + .filter(|(_, v)| matches!(v, &&Volume::Assets { .. })) + .map(|(id, _)| id.clone()) + .collect(), + volumes: value + .volumes + .iter() + .filter(|(_, v)| matches!(v, &&Volume::Data { .. })) + .map(|(id, _)| id.clone()) + .collect(), + alerts: value.alerts, + dependencies: value.dependencies, + hardware_requirements: value.hardware_requirements, + git_hash: value.git_hash, + os_version: value.eos_version, + has_config: value.config.is_some(), + } + } +} diff --git a/core/startos/src/s9pk/v2/manifest.rs b/core/startos/src/s9pk/v2/manifest.rs new file mode 100644 index 000000000..d9affae9c --- /dev/null +++ b/core/startos/src/s9pk/v2/manifest.rs @@ -0,0 +1,95 @@ +use std::collections::BTreeMap; + +use color_eyre::eyre::eyre; +use helpers::const_true; +pub use models::PackageId; +use models::{ImageId, VolumeId}; +use serde::{Deserialize, Serialize}; +use url::Url; + +use crate::dependencies::Dependencies; +use crate::prelude::*; +use crate::s9pk::v1::git_hash::GitHash; +use crate::util::serde::Regex; +use crate::util::Version; +use crate::version::{Current, VersionT}; + +fn current_version() -> Version { + Current::new().semver().into() +} + +#[derive(Clone, Debug, Deserialize, Serialize, HasModel)] +#[serde(rename_all = "camelCase")] +#[model = "Model"] +pub struct Manifest { + pub id: PackageId, + pub title: String, + pub version: Version, + pub release_notes: String, + pub license: String, // type of license + #[serde(default)] + pub replaces: Vec, + pub wrapper_repo: Url, + pub upstream_repo: Url, + pub support_site: Url, + pub marketing_site: Url, + pub donation_url: Option, + pub description: Description, + pub images: Vec, + pub assets: Vec, // TODO: AssetsId + pub volumes: Vec, + #[serde(default)] + pub alerts: Alerts, + #[serde(default)] + pub dependencies: Dependencies, + #[serde(default)] + pub hardware_requirements: HardwareRequirements, + #[serde(default)] + pub git_hash: Option, + #[serde(default = "current_version")] + pub os_version: Version, + #[serde(default = "const_true")] + pub has_config: bool, +} + +#[derive(Clone, Debug, Default, Deserialize, Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct HardwareRequirements { + #[serde(default)] + device: BTreeMap, + ram: Option, + pub arch: Option>, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct Description { + pub short: String, + pub long: String, +} +impl Description { + pub fn validate(&self) -> Result<(), Error> { + if self.short.chars().skip(160).next().is_some() { + return Err(Error::new( + eyre!("Short description must be 160 characters or less."), + crate::ErrorKind::ValidateS9pk, + )); + } + if self.long.chars().skip(5000).next().is_some() { + return Err(Error::new( + eyre!("Long description must be 5000 characters or less."), + crate::ErrorKind::ValidateS9pk, + )); + } + Ok(()) + } +} + +#[derive(Clone, Debug, Default, Deserialize, Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct Alerts { + pub install: Option, + pub uninstall: Option, + pub restore: Option, + pub start: Option, + pub stop: Option, +} diff --git a/core/startos/src/s9pk/v2/mod.rs b/core/startos/src/s9pk/v2/mod.rs index be42d0612..af1cd1c17 100644 --- a/core/startos/src/s9pk/v2/mod.rs +++ b/core/startos/src/s9pk/v2/mod.rs @@ -1,23 +1,178 @@ +use std::ffi::OsStr; +use std::path::Path; +use std::sync::Arc; + +use imbl_value::InternedString; +use models::{mime, DataUrl, PackageId}; +use tokio::fs::File; + use crate::prelude::*; +use crate::s9pk::manifest::Manifest; +use crate::s9pk::merkle_archive::file_contents::FileContents; use crate::s9pk::merkle_archive::sink::Sink; -use crate::s9pk::merkle_archive::source::{ArchiveSource, FileSource, Section}; -use crate::s9pk::merkle_archive::MerkleArchive; +use crate::s9pk::merkle_archive::source::multi_cursor_file::MultiCursorFile; +use crate::s9pk::merkle_archive::source::{ArchiveSource, DynFileSource, FileSource, Section}; +use crate::s9pk::merkle_archive::{Entry, MerkleArchive}; +use crate::ARCH; const MAGIC_AND_VERSION: &[u8] = &[0x3b, 0x3b, 0x02]; -pub struct S9pk(MerkleArchive); +pub mod compat; +pub mod manifest; + +/** + / + ├── manifest.json + ├── icon. + ├── LICENSE.md + ├── instructions.md + ├── javascript.squashfs + ├── assets + │ └── .squashfs (xN) + └── images + └── + ├── .env (xN) + └── .squashfs (xN) +*/ + +fn priority(s: &str) -> Option { + match s { + "manifest.json" => Some(0), + a if Path::new(a).file_stem() == Some(OsStr::new("icon")) => Some(1), + "LICENSE.md" => Some(2), + "instructions.md" => Some(3), + "javascript.squashfs" => Some(4), + "assets" => Some(5), + "images" => Some(6), + _ => None, + } +} + +fn filter(p: &Path) -> bool { + match p.iter().count() { + 1 if p.file_name() == Some(OsStr::new("manifest.json")) => true, + 1 if p.file_stem() == Some(OsStr::new("icon")) => true, + 1 if p.file_name() == Some(OsStr::new("LICENSE.md")) => true, + 1 if p.file_name() == Some(OsStr::new("instructions.md")) => true, + 1 if p.file_name() == Some(OsStr::new("javascript.squashfs")) => true, + 1 if p.file_name() == Some(OsStr::new("assets")) => true, + 1 if p.file_name() == Some(OsStr::new("images")) => true, + 2 if p.parent() == Some(Path::new("assets")) => { + p.extension().map_or(false, |ext| ext == "squashfs") + } + 2 if p.parent() == Some(Path::new("images")) => p.file_name() == Some(OsStr::new(&*ARCH)), + 3 if p.parent() == Some(&*Path::new("images").join(&*ARCH)) => p + .extension() + .map_or(false, |ext| ext == "squashfs" || ext == "env"), + _ => false, + } +} + +#[derive(Clone)] +pub struct S9pk> { + manifest: Manifest, + manifest_dirty: bool, + archive: MerkleArchive, + size: Option, +} +impl S9pk { + pub fn as_manifest(&self) -> &Manifest { + &self.manifest + } + pub fn as_manifest_mut(&mut self) -> &mut Manifest { + self.manifest_dirty = true; + &mut self.manifest + } + pub fn as_archive(&self) -> &MerkleArchive { + &self.archive + } + pub fn as_archive_mut(&mut self) -> &mut MerkleArchive { + &mut self.archive + } + pub fn size(&self) -> Option { + self.size + } +} + impl S9pk { + pub async fn new(archive: MerkleArchive, size: Option) -> Result { + let manifest = extract_manifest(&archive).await?; + Ok(Self { + manifest, + manifest_dirty: false, + archive, + size, + }) + } + + pub async fn icon(&self) -> Result<(InternedString, FileContents), Error> { + let mut best_icon = None; + for (path, icon) in self + .archive + .contents() + .with_stem("icon") + .filter(|(p, _)| { + Path::new(&*p) + .extension() + .and_then(|e| e.to_str()) + .and_then(mime) + .map_or(false, |e| e.starts_with("image/")) + }) + .filter_map(|(k, v)| v.into_file().map(|f| (k, f))) + { + let size = icon.size().await?; + best_icon = match best_icon { + Some((s, a)) if s >= size => Some((s, a)), + _ => Some((size, (path, icon))), + }; + } + best_icon + .map(|(_, a)| a) + .ok_or_else(|| Error::new(eyre!("no icon found in archive"), ErrorKind::ParseS9pk)) + } + + pub async fn icon_data_url(&self) -> Result, Error> { + let (name, contents) = self.icon().await?; + let mime = Path::new(&*name) + .extension() + .and_then(|e| e.to_str()) + .and_then(mime) + .unwrap_or("image/png"); + DataUrl::from_reader(mime, contents.reader().await?, Some(contents.size().await?)).await + } + pub async fn serialize(&mut self, w: &mut W, verify: bool) -> Result<(), Error> { use tokio::io::AsyncWriteExt; w.write_all(MAGIC_AND_VERSION).await?; - self.0.serialize(w, verify).await?; + if !self.manifest_dirty { + self.archive.serialize(w, verify).await?; + } else { + let mut dyn_s9pk = self.clone().into_dyn(); + dyn_s9pk.as_archive_mut().contents_mut().insert_path( + "manifest.json", + Entry::file(DynFileSource::new(Arc::<[u8]>::from( + serde_json::to_vec(&self.manifest).with_kind(ErrorKind::Serialization)?, + ))), + )?; + dyn_s9pk.archive.serialize(w, verify).await?; + } Ok(()) } + + pub fn into_dyn(self) -> S9pk { + S9pk { + manifest: self.manifest, + manifest_dirty: self.manifest_dirty, + archive: self.archive.into_dyn(), + size: self.size, + } + } } impl S9pk> { + #[instrument(skip_all)] pub async fn deserialize(source: &S) -> Result { use tokio::io::AsyncReadExt; @@ -36,6 +191,46 @@ impl S9pk> { "Invalid Magic or Unexpected Version" ); - Ok(Self(MerkleArchive::deserialize(source, &mut header).await?)) + let mut archive = MerkleArchive::deserialize(source, &mut header).await?; + + archive.filter(filter)?; + + archive.sort_by(|a, b| match (priority(a), priority(b)) { + (Some(a), Some(b)) => a.cmp(&b), + (Some(_), None) => std::cmp::Ordering::Less, + (None, Some(_)) => std::cmp::Ordering::Greater, + (None, None) => std::cmp::Ordering::Equal, + }); + + Self::new(archive, source.size().await).await + } +} +impl S9pk { + pub async fn from_file(file: File) -> Result { + Self::deserialize(&MultiCursorFile::from(file)).await + } + pub async fn open(path: impl AsRef, id: Option<&PackageId>) -> Result { + let res = Self::from_file(tokio::fs::File::open(path).await?).await?; + if let Some(id) = id { + ensure_code!( + &res.as_manifest().id == id, + ErrorKind::ValidateS9pk, + "manifest.id does not match expected" + ); + } + Ok(res) } } + +async fn extract_manifest(archive: &MerkleArchive) -> Result { + let manifest = serde_json::from_slice( + &archive + .contents() + .get_path("manifest.json") + .or_not_found("manifest.json")? + .read_file_to_vec() + .await?, + ) + .with_kind(ErrorKind::Deserialization)?; + Ok(manifest) +} diff --git a/core/startos/src/service/cli.rs b/core/startos/src/service/cli.rs new file mode 100644 index 000000000..d3bdccd72 --- /dev/null +++ b/core/startos/src/service/cli.rs @@ -0,0 +1,66 @@ +use std::path::{Path, PathBuf}; +use std::sync::Arc; + +use clap::Parser; +use imbl_value::Value; +use once_cell::sync::OnceCell; +use rpc_toolkit::yajrc::RpcError; +use rpc_toolkit::{call_remote_socket, yajrc, CallRemote, Context}; +use tokio::runtime::Runtime; + +use crate::lxc::HOST_RPC_SERVER_SOCKET; + +#[derive(Debug, Default, Parser)] +pub struct ContainerClientConfig { + #[arg(long = "socket")] + pub socket: Option, +} + +pub struct ContainerCliSeed { + socket: PathBuf, + runtime: OnceCell, +} + +#[derive(Clone)] +pub struct ContainerCliContext(Arc); +impl ContainerCliContext { + pub fn init(cfg: ContainerClientConfig) -> Self { + Self(Arc::new(ContainerCliSeed { + socket: cfg + .socket + .unwrap_or_else(|| Path::new("/").join(HOST_RPC_SERVER_SOCKET)), + runtime: OnceCell::new(), + })) + } +} +impl Context for ContainerCliContext { + fn runtime(&self) -> tokio::runtime::Handle { + self.0 + .runtime + .get_or_init(|| { + tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap() + }) + .handle() + .clone() + } +} + +#[async_trait::async_trait] +impl CallRemote for ContainerCliContext { + async fn call_remote(&self, method: &str, params: Value) -> Result { + call_remote_socket( + tokio::net::UnixStream::connect(&self.0.socket) + .await + .map_err(|e| RpcError { + data: Some(e.to_string().into()), + ..yajrc::INTERNAL_ERROR + })?, + method, + params, + ) + .await + } +} diff --git a/core/startos/src/service/config.rs b/core/startos/src/service/config.rs new file mode 100644 index 000000000..c64e2be65 --- /dev/null +++ b/core/startos/src/service/config.rs @@ -0,0 +1,22 @@ +use std::collections::BTreeMap; + +use models::PackageId; + +use crate::config::ConfigureContext; +use crate::prelude::*; +use crate::service::Service; + +impl Service { + pub async fn configure( + &self, + ConfigureContext { + breakages, + timeout, + config, + overrides, + dry_run, + }: ConfigureContext, + ) -> Result, Error> { + todo!() + } +} diff --git a/core/startos/src/service/control.rs b/core/startos/src/service/control.rs new file mode 100644 index 000000000..17c432755 --- /dev/null +++ b/core/startos/src/service/control.rs @@ -0,0 +1,45 @@ +use crate::prelude::*; +use crate::service::start_stop::StartStop; +use crate::service::transition::TransitionKind; +use crate::service::{Service, ServiceActor}; +use crate::util::actor::{BackgroundJobs, Handler}; + +struct Start; +#[async_trait::async_trait] +impl Handler for ServiceActor { + type Response = (); + async fn handle(&mut self, _: Start, _: &mut BackgroundJobs) -> Self::Response { + self.0.desired_state.send_replace(StartStop::Start); + self.0.synchronized.notified().await + } +} +impl Service { + pub async fn start(&self) -> Result<(), Error> { + self.actor.send(Start).await + } +} + +struct Stop; +#[async_trait::async_trait] +impl Handler for ServiceActor { + type Response = (); + async fn handle(&mut self, _: Stop, _: &mut BackgroundJobs) -> Self::Response { + self.0.desired_state.send_replace(StartStop::Stop); + if self.0.transition_state.borrow().as_ref().map(|t| t.kind()) + == Some(TransitionKind::Restarting) + { + if let Some(restart) = self.0.transition_state.send_replace(None) { + restart.abort().await; + } else { + #[cfg(feature = "unstable")] + unreachable!() + } + } + self.0.synchronized.notified().await + } +} +impl Service { + pub async fn stop(&self) -> Result<(), Error> { + self.actor.send(Stop).await + } +} diff --git a/core/startos/src/service/fake.cert.key b/core/startos/src/service/fake.cert.key new file mode 100644 index 000000000..a4eb56cb7 --- /dev/null +++ b/core/startos/src/service/fake.cert.key @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEINn5jiv9VFgEwdUJsDksSTAjPKwkl2DCmCmumu4D1GnNoAoGCCqGSM49 +AwEHoUQDQgAE5KuqP+Wdn8pzmNMxK2hya6mKj1H0j5b47y97tIXqf5ajTi8koRPl +yao3YcqdtBtN37aw4rVlXVwEJIozZgyiyA== +-----END EC PRIVATE KEY----- \ No newline at end of file diff --git a/core/startos/src/service/fake.cert.pem b/core/startos/src/service/fake.cert.pem new file mode 100644 index 000000000..fdacaff16 --- /dev/null +++ b/core/startos/src/service/fake.cert.pem @@ -0,0 +1,13 @@ +-----BEGIN CERTIFICATE----- +MIIB9DCCAZmgAwIBAgIUIWsFiA8JqIqeUo+Psn91oCQIcdwwCgYIKoZIzj0EAwIw +TzELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNPMRowGAYDVQQKDBFTdGFydDkgTGFi +cywgSW5jLjEXMBUGA1UEAwwOZmFrZW5hbWUubG9jYWwwHhcNMjQwMjE0MTk1MTUz +WhcNMjUwMjEzMTk1MTUzWjBPMQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ08xGjAY +BgNVBAoMEVN0YXJ0OSBMYWJzLCBJbmMuMRcwFQYDVQQDDA5mYWtlbmFtZS5sb2Nh +bDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOSrqj/lnZ/Kc5jTMStocmupio9R +9I+W+O8ve7SF6n+Wo04vJKET5cmqN2HKnbQbTd+2sOK1ZV1cBCSKM2YMosijUzBR +MB0GA1UdDgQWBBR+qd4W//H34Eg90yAPjYz3nZK79DAfBgNVHSMEGDAWgBR+qd4W +//H34Eg90yAPjYz3nZK79DAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0kA +MEYCIQDNSN9YWkGbntG+nC+NzEyqE9FcvYZ8TaF3sOnthqSVKwIhAM2N+WJG/p4C +cPl4HSPPgDaOIhVZzxSje2ycb7wvFtpH +-----END CERTIFICATE----- \ No newline at end of file diff --git a/core/startos/src/service/mod.rs b/core/startos/src/service/mod.rs new file mode 100644 index 000000000..fd8412c02 --- /dev/null +++ b/core/startos/src/service/mod.rs @@ -0,0 +1,542 @@ +use std::sync::Arc; +use std::time::Duration; + +use chrono::{DateTime, Utc}; +use clap::Parser; +use futures::future::BoxFuture; +use imbl::OrdMap; +use models::{ActionId, HealthCheckId, PackageId, ProcedureName}; +use persistent_container::PersistentContainer; +use rpc_toolkit::{from_fn_async, CallRemoteHandler, Handler, HandlerArgs}; +use serde::{Deserialize, Serialize}; +use start_stop::StartStop; +use tokio::sync::{watch, Notify}; + +use crate::action::ActionResult; +use crate::config::action::ConfigRes; +use crate::context::{CliContext, RpcContext}; +use crate::core::rpc_continuations::RequestGuid; +use crate::db::model::{ + CurrentDependencies, CurrentDependents, InstalledPackageInfo, PackageDataEntry, + PackageDataEntryInstalled, PackageDataEntryMatchModel, StaticFiles, +}; +use crate::disk::mount::guard::GenericMountGuard; +use crate::install::PKG_ARCHIVE_DIR; +use crate::prelude::*; +use crate::progress::{self, NamedProgress, Progress}; +use crate::s9pk::S9pk; +use crate::service::service_map::InstallProgressHandles; +use crate::service::transition::{TempDesiredState, TransitionKind, TransitionState}; +use crate::status::health_check::HealthCheckResult; +use crate::status::{DependencyConfigErrors, MainStatus, Status}; +use crate::util::actor::{Actor, BackgroundJobs, SimpleActor}; +use crate::volume::data_dir; + +pub mod cli; +mod config; +mod control; +pub mod persistent_container; +mod rpc; +pub mod service_effect_handler; +pub mod service_map; +mod start_stop; +mod transition; +mod util; + +pub use service_map::ServiceMap; + +pub const HEALTH_CHECK_COOLDOWN_SECONDS: u64 = 15; +pub const HEALTH_CHECK_GRACE_PERIOD_SECONDS: u64 = 5; +pub const SYNC_RETRY_COOLDOWN_SECONDS: u64 = 10; + +pub type Task<'a> = BoxFuture<'a, Result<(), Error>>; + +/// TODO +pub enum BackupReturn { + TODO, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +pub enum LoadDisposition { + Retry, + Undo, +} + +pub struct Service { + actor: SimpleActor, + seed: Arc, +} +impl Service { + #[instrument(skip_all)] + async fn new(ctx: RpcContext, s9pk: S9pk, start: StartStop) -> Result { + let id = s9pk.as_manifest().id.clone(); + let desired_state = watch::channel(start).0; + let temp_desired_state = TempDesiredState(Arc::new(watch::channel(None).0)); + let persistent_container = PersistentContainer::new( + &ctx, + s9pk, + // desired_state.subscribe(), + // temp_desired_state.subscribe(), + ) + .await?; + let seed = Arc::new(ServiceActorSeed { + id, + running_status: persistent_container.running_status.subscribe(), + persistent_container, + ctx, + desired_state, + temp_desired_state, + transition_state: Arc::new(watch::channel(None).0), + synchronized: Arc::new(Notify::new()), + }); + seed.persistent_container + .init(Arc::downgrade(&seed)) + .await?; + Ok(Self { + actor: SimpleActor::new(ServiceActor(seed.clone())), + seed, + }) + } + + #[instrument(skip_all)] + pub async fn load( + ctx: &RpcContext, + id: &PackageId, + disposition: LoadDisposition, + ) -> Result, Error> { + let handle_installed = { + let ctx = ctx.clone(); + move |s9pk: S9pk, i: Model| async move { + for volume_id in &s9pk.as_manifest().volumes { + let tmp_path = + data_dir(&ctx.datadir, &s9pk.as_manifest().id.clone(), volume_id); + if tokio::fs::metadata(&tmp_path).await.is_err() { + tokio::fs::create_dir_all(&tmp_path).await?; + } + } + let start_stop = if i.as_status().as_main().de()?.running() { + StartStop::Start + } else { + StartStop::Stop + }; + Self::new(ctx, s9pk, start_stop).await.map(Some) + } + }; + let s9pk_dir = ctx.datadir.join(PKG_ARCHIVE_DIR).join("installed"); // TODO: make this based on hash + let s9pk_path = s9pk_dir.join(id).with_extension("s9pk"); + match ctx + .db + .peek() + .await + .into_package_data() + .into_idx(id) + .map(|pde| pde.into_match()) + { + Some(PackageDataEntryMatchModel::Installing(_)) => { + if disposition == LoadDisposition::Retry { + if let Ok(s9pk) = S9pk::open(s9pk_path, Some(id)).await.map_err(|e| { + tracing::error!("Error opening s9pk for install: {e}"); + tracing::debug!("{e:?}") + }) { + if let Ok(service) = Self::install(ctx.clone(), s9pk, None, None) + .await + .map_err(|e| { + tracing::error!("Error installing service: {e}"); + tracing::debug!("{e:?}") + }) + { + return Ok(Some(service)); + } + } + } + // TODO: delete s9pk? + ctx.db + .mutate(|v| v.as_package_data_mut().remove(id)) + .await?; + Ok(None) + } + Some(PackageDataEntryMatchModel::Updating(e)) => { + if disposition == LoadDisposition::Retry + && e.as_install_progress().de()?.phases.iter().any( + |NamedProgress { name, progress }| { + name.eq_ignore_ascii_case("download") + && progress == &Progress::Complete(true) + }, + ) + { + if let Ok(s9pk) = S9pk::open(&s9pk_path, Some(id)).await.map_err(|e| { + tracing::error!("Error opening s9pk for update: {e}"); + tracing::debug!("{e:?}") + }) { + if let Ok(service) = Self::install( + ctx.clone(), + s9pk, + Some(e.as_installed().as_manifest().as_version().de()?), + None, + ) + .await + .map_err(|e| { + tracing::error!("Error installing service: {e}"); + tracing::debug!("{e:?}") + }) { + return Ok(Some(service)); + } + } + } + let s9pk = S9pk::open(s9pk_path, Some(id)).await?; + ctx.db + .mutate({ + let manifest = s9pk.as_manifest().clone(); + |db| { + db.as_package_data_mut() + .as_idx_mut(&manifest.id) + .or_not_found(&manifest.id)? + .ser(&PackageDataEntry::Installed(PackageDataEntryInstalled { + static_files: e.as_static_files().de()?, + manifest, + installed: e.as_installed().de()?, + })) + } + }) + .await?; + handle_installed(s9pk, e.as_installed().clone()).await + } + Some(PackageDataEntryMatchModel::Removing(_)) + | Some(PackageDataEntryMatchModel::Restoring(_)) => { + if let Ok(s9pk) = S9pk::open(s9pk_path, Some(id)).await.map_err(|e| { + tracing::error!("Error opening s9pk for removal: {e}"); + tracing::debug!("{e:?}") + }) { + if let Ok(service) = Self::new(ctx.clone(), s9pk, StartStop::Stop) + .await + .map_err(|e| { + tracing::error!("Error loading service for removal: {e}"); + tracing::debug!("{e:?}") + }) + { + if service + .uninstall(None) + .await + .map_err(|e| { + tracing::error!("Error uninstalling service: {e}"); + tracing::debug!("{e:?}") + }) + .is_ok() + { + return Ok(None); + } + } + } + + ctx.db + .mutate(|v| v.as_package_data_mut().remove(id)) + .await?; + + Ok(None) + } + Some(PackageDataEntryMatchModel::Installed(i)) => { + handle_installed( + S9pk::open(s9pk_path, Some(id)).await?, + i.as_installed().clone(), + ) + .await + } + Some(PackageDataEntryMatchModel::Error(e)) => Err(Error::new( + eyre!("Failed to parse PackageDataEntry, found {e:?}"), + ErrorKind::Deserialization, + )), + None => Ok(None), + } + } + + #[instrument(skip_all)] + pub async fn install( + ctx: RpcContext, + s9pk: S9pk, + src_version: Option, + progress: Option, + ) -> Result { + let manifest = s9pk.as_manifest().clone(); + let developer_key = s9pk.as_archive().signer(); + let icon = s9pk.icon_data_url().await?; + let static_files = StaticFiles::local(&manifest.id, &manifest.version, icon); + let service = Self::new(ctx.clone(), s9pk, StartStop::Stop).await?; + service + .seed + .persistent_container + .execute(ProcedureName::Init, to_value(&src_version)?, None) // TODO timeout + .await + .with_kind(ErrorKind::MigrationFailed)?; // TODO: handle cancellation + if let Some(mut progress) = progress { + progress.finalization_progress.complete(); + progress.progress_handle.complete(); + tokio::task::yield_now().await; + } + ctx.db + .mutate(|d| { + d.as_package_data_mut() + .as_idx_mut(&manifest.id) + .or_not_found(&manifest.id)? + .ser(&PackageDataEntry::Installed(PackageDataEntryInstalled { + installed: InstalledPackageInfo { + current_dependencies: Default::default(), // TODO + current_dependents: Default::default(), // TODO + dependency_info: Default::default(), // TODO + developer_key, + status: Status { + configured: false, // TODO + main: MainStatus::Stopped, // TODO + dependency_config_errors: Default::default(), // TODO + }, + interface_addresses: Default::default(), // TODO + marketplace_url: None, // TODO + manifest: manifest.clone(), + last_backup: None, // TODO + store: Value::Null, // TODO + store_exposed_dependents: Default::default(), // TODO + store_exposed_ui: Default::default(), // TODO + }, + manifest, + static_files, + })) + }) + .await?; + Ok(service) + } + + pub async fn restore( + ctx: RpcContext, + s9pk: S9pk, + guard: impl GenericMountGuard, + progress: Option, + ) -> Result { + // TODO + Err(Error::new(eyre!("not yet implemented"), ErrorKind::Unknown)) + } + + pub async fn get_config(&self) -> Result { + let container = &self.seed.persistent_container; + container + .execute::( + ProcedureName::GetConfig, + Value::Null, + Some(Duration::from_secs(30)), // TODO timeout + ) + .await + .with_kind(ErrorKind::ConfigGen) + } + + // TODO DO the Action Get + + pub async fn action(&self, id: ActionId, input: Value) -> Result { + let container = &self.seed.persistent_container; + container + .execute::( + ProcedureName::RunAction(id), + input, + Some(Duration::from_secs(30)), + ) + .await + .with_kind(ErrorKind::Action) + } + + pub async fn shutdown(self) -> Result<(), Error> { + self.actor + .shutdown(crate::util::actor::PendingMessageStrategy::FinishAll { timeout: None }) // TODO timeout + .await; + if let Some((hdl, shutdown)) = self.seed.persistent_container.rpc_server.send_replace(None) + { + shutdown.shutdown(); + hdl.await.with_kind(ErrorKind::Cancelled)?; + } + Arc::try_unwrap(self.seed) + .map_err(|_| { + Error::new( + eyre!("ServiceActorSeed held somewhere after actor shutdown"), + ErrorKind::Unknown, + ) + })? + .persistent_container + .exit() + .await?; + Ok(()) + } + + pub async fn uninstall(self, target_version: Option) -> Result<(), Error> { + self.seed + .persistent_container + .execute(ProcedureName::Uninit, to_value(&target_version)?, None) // TODO timeout + .await?; + self.shutdown().await + } + pub async fn backup(&self, guard: impl GenericMountGuard) -> Result { + // TODO + Err(Error::new(eyre!("not yet implemented"), ErrorKind::Unknown)) + } +} + +#[derive(Clone)] +struct RunningStatus { + health: OrdMap, + started: DateTime, +} + +pub(self) struct ServiceActorSeed { + ctx: RpcContext, + id: PackageId, + persistent_container: PersistentContainer, + desired_state: watch::Sender, + temp_desired_state: TempDesiredState, + transition_state: Arc>>, + running_status: watch::Receiver>, + synchronized: Arc, +} + +struct ServiceActor(Arc); +impl Actor for ServiceActor { + fn init(&mut self, jobs: &mut BackgroundJobs) { + let seed = self.0.clone(); + jobs.add_job(async move { + let id = seed.id.clone(); + let mut current = seed.persistent_container.current_state.subscribe(); + let mut desired = seed.desired_state.subscribe(); + let mut temp_desired = seed.temp_desired_state.subscribe(); + let mut transition = seed.transition_state.subscribe(); + let mut running = seed.running_status.clone(); + loop { + let (desired_state, current_state, transition_kind, running_status) = ( + temp_desired.borrow().unwrap_or(*desired.borrow()), + *current.borrow(), + transition.borrow().as_ref().map(|t| t.kind()), + running.borrow().clone(), + ); + + if let Err(e) = async { + seed.ctx + .db + .mutate(|d| { + if let Some(i) = d + .as_package_data_mut() + .as_idx_mut(&id) + .and_then(|p| p.as_installed_mut()) + { + i.as_status_mut().as_main_mut().ser(&match ( + transition_kind, + desired_state, + current_state, + running_status, + ) { + (Some(TransitionKind::Restarting), _, _, _) => { + MainStatus::Restarting + } + (Some(TransitionKind::BackingUp), _, _, Some(status)) => { + MainStatus::BackingUp { + started: Some(status.started), + health: status.health.clone(), + } + } + (Some(TransitionKind::BackingUp), _, _, None) => { + MainStatus::BackingUp { + started: None, + health: OrdMap::new(), + } + } + (None, StartStop::Stop, StartStop::Stop, _) => { + MainStatus::Stopped + } + (None, StartStop::Stop, StartStop::Start, _) => { + MainStatus::Stopping { + timeout: todo!("sigterm timeout"), + } + } + (None, StartStop::Start, StartStop::Stop, _) => { + MainStatus::Starting + } + (None, StartStop::Start, StartStop::Start, None) => { + MainStatus::Starting + } + (None, StartStop::Start, StartStop::Start, Some(status)) => { + MainStatus::Running { + started: status.started, + health: status.health.clone(), + } + } + })?; + } + Ok(()) + }) + .await?; + match (desired_state, current_state) { + (StartStop::Start, StartStop::Stop) => { + seed.persistent_container.start().await + } + (StartStop::Stop, StartStop::Start) => { + seed.persistent_container + .stop(todo!("s9pk sigterm timeout")) + .await + } + _ => Ok(()), + } + } + .await + { + tracing::error!("error synchronizing state of service: {e}"); + tracing::debug!("{e:?}"); + + seed.synchronized.notify_waiters(); + + tracing::error!("Retrying in {}s...", SYNC_RETRY_COOLDOWN_SECONDS); + tokio::time::sleep(Duration::from_secs(SYNC_RETRY_COOLDOWN_SECONDS)).await; + continue; + } + + seed.synchronized.notify_waiters(); + + tokio::select! { + _ = current.changed() => (), + _ = desired.changed() => (), + _ = temp_desired.changed() => (), + _ = transition.changed() => (), + _ = running.changed() => (), + } + } + }) + } +} + +#[derive(Deserialize, Serialize, Parser)] +pub struct ConnectParams { + pub id: PackageId, +} + +pub async fn connect_rpc( + ctx: RpcContext, + ConnectParams { id }: ConnectParams, +) -> Result { + let id_ref = &id; + crate::lxc::connect( + &ctx, + ctx.services + .get(&id) + .await + .as_ref() + .or_not_found(lazy_format!("service for {id_ref}"))? + .seed + .persistent_container + .lxc_container + .get() + .or_not_found(lazy_format!("container for {id_ref}"))?, + ) + .await +} + +pub async fn connect_rpc_cli( + handle_args: HandlerArgs, +) -> Result<(), Error> { + let ctx = handle_args.context.clone(); + let guid = CallRemoteHandler::::new(from_fn_async(connect_rpc)) + .handle_async(handle_args) + .await?; + + crate::lxc::connect_cli(&ctx, guid).await +} diff --git a/core/startos/src/service/persistent_container.rs b/core/startos/src/service/persistent_container.rs new file mode 100644 index 000000000..6716ed472 --- /dev/null +++ b/core/startos/src/service/persistent_container.rs @@ -0,0 +1,365 @@ +use std::collections::BTreeMap; +use std::path::Path; +use std::sync::{Arc, Weak}; +use std::time::Duration; + +use futures::future::ready; +use futures::Future; +use helpers::NonDetachingJoinHandle; +use imbl_value::InternedString; +use models::{ProcedureName, VolumeId}; +use rpc_toolkit::{Empty, Server, ShutdownHandle}; +use serde::de::DeserializeOwned; +use tokio::fs::File; +use tokio::process::Command; +use tokio::sync::{oneshot, watch, Mutex, OnceCell}; +use tracing::instrument; + +use super::service_effect_handler::{service_effect_handler, EffectContext}; +use super::ServiceActorSeed; +use crate::context::RpcContext; +use crate::disk::mount::filesystem::bind::Bind; +use crate::disk::mount::filesystem::idmapped::IdMapped; +use crate::disk::mount::filesystem::loop_dev::LoopDev; +use crate::disk::mount::filesystem::overlayfs::OverlayGuard; +use crate::disk::mount::filesystem::{MountType, ReadOnly}; +use crate::disk::mount::guard::{GenericMountGuard, MountGuard}; +use crate::lxc::{LxcConfig, LxcContainer, HOST_RPC_SERVER_SOCKET}; +use crate::prelude::*; +use crate::s9pk::merkle_archive::source::FileSource; +use crate::s9pk::S9pk; +use crate::service::start_stop::StartStop; +use crate::service::{rpc, RunningStatus}; +use crate::util::rpc_client::UnixRpcClient; +use crate::util::Invoke; +use crate::volume::{asset_dir, data_dir}; +use crate::ARCH; + +const RPC_CONNECT_TIMEOUT: Duration = Duration::from_secs(10); + +struct ProcedureId(u64); + +// @DRB On top of this we need to also have the procedures to have the effects and get the results back for them, maybe lock them to the running instance? +/// This contains the LXC container running the javascript init system +/// that can be used via a JSON RPC Client connected to a unix domain +/// socket served by the container +pub struct PersistentContainer { + pub(super) s9pk: S9pk, + pub(super) lxc_container: OnceCell, + rpc_client: UnixRpcClient, + pub(super) rpc_server: watch::Sender, ShutdownHandle)>>, + // procedures: Mutex>, + js_mount: MountGuard, + volumes: BTreeMap, + assets: BTreeMap, + pub(super) overlays: Arc>>, + pub(super) current_state: watch::Sender, + // pub(super) desired_state: watch::Receiver, + // pub(super) temp_desired_state: watch::Receiver>, + pub(super) running_status: watch::Sender>, +} + +impl PersistentContainer { + #[instrument(skip_all)] + pub async fn new( + ctx: &RpcContext, + s9pk: S9pk, + // desired_state: watch::Receiver, + // temp_desired_state: watch::Receiver>, + ) -> Result { + let lxc_container = ctx.lxc_manager.create(LxcConfig::default()).await?; + let rpc_client = lxc_container.connect_rpc(Some(RPC_CONNECT_TIMEOUT)).await?; + let js_mount = MountGuard::mount( + &LoopDev::from( + &**s9pk + .as_archive() + .contents() + .get_path("javascript.squashfs") + .and_then(|f| f.as_file()) + .or_not_found("javascript")?, + ), + lxc_container.rootfs_dir().join("usr/lib/startos/package"), + ReadOnly, + ) + .await?; + let mut volumes = BTreeMap::new(); + for volume in &s9pk.as_manifest().volumes { + let mount = MountGuard::mount( + &IdMapped::new( + Bind::new(data_dir(&ctx.datadir, &s9pk.as_manifest().id, volume)), + 0, + 100000, + 65536, + ), + lxc_container + .rootfs_dir() + .join("media/startos/volumes") + .join(volume), + MountType::ReadWrite, + ) + .await?; + volumes.insert(volume.clone(), mount); + } + let mut assets = BTreeMap::new(); + for asset in &s9pk.as_manifest().assets { + assets.insert( + asset.clone(), + MountGuard::mount( + &Bind::new( + asset_dir( + &ctx.datadir, + &s9pk.as_manifest().id, + &s9pk.as_manifest().version, + ) + .join(asset), + ), + lxc_container + .rootfs_dir() + .join("media/startos/assets") + .join(asset), + MountType::ReadWrite, + ) + .await?, + ); + } + let image_path = lxc_container.rootfs_dir().join("media/startos/images"); + tokio::fs::create_dir_all(&image_path).await?; + for image in &s9pk.as_manifest().images { + let env_filename = Path::new(image.as_ref()).with_extension("env"); + if let Some(env) = s9pk + .as_archive() + .contents() + .get_path(Path::new("images").join(&*ARCH).join(&env_filename)) + .and_then(|e| e.as_file()) + { + env.copy(&mut File::create(image_path.join(&env_filename)).await?) + .await?; + } + let json_filename = Path::new(image.as_ref()).with_extension("json"); + if let Some(json) = s9pk + .as_archive() + .contents() + .get_path(Path::new("images").join(&*ARCH).join(&json_filename)) + .and_then(|e| e.as_file()) + { + json.copy(&mut File::create(image_path.join(&json_filename)).await?) + .await?; + } + } + Ok(Self { + s9pk, + lxc_container: OnceCell::new_with(Some(lxc_container)), + rpc_client, + rpc_server: watch::channel(None).0, + // procedures: Default::default(), + js_mount, + volumes, + assets, + overlays: Arc::new(Mutex::new(BTreeMap::new())), + current_state: watch::channel(StartStop::Stop).0, + // desired_state, + // temp_desired_state, + running_status: watch::channel(None).0, + }) + } + + #[instrument(skip_all)] + pub async fn init(&self, seed: Weak) -> Result<(), Error> { + let socket_server_context = EffectContext::new(seed); + let server = Server::new( + move || ready(Ok(socket_server_context.clone())), + service_effect_handler(), + ); + let path = self + .lxc_container + .get() + .ok_or_else(|| { + Error::new( + eyre!("PersistentContainer has been destroyed"), + ErrorKind::Incoherent, + ) + })? + .rpc_dir() + .join(HOST_RPC_SERVER_SOCKET); + let (send, recv) = oneshot::channel(); + let handle = NonDetachingJoinHandle::from(tokio::spawn(async move { + let (shutdown, fut) = match async { + let res = server.run_unix(&path, |err| { + tracing::error!("error on unix socket {}: {err}", path.display()) + })?; + Command::new("chown") + .arg("100000:100000") + .arg(&path) + .invoke(ErrorKind::Filesystem) + .await?; + Ok::<_, Error>(res) + } + .await + { + Ok((shutdown, fut)) => (Ok(shutdown), Some(fut)), + Err(e) => (Err(e), None), + }; + if send.send(shutdown).is_err() { + panic!("failed to send shutdown handle"); + } + if let Some(fut) = fut { + fut.await; + } + })); + let shutdown = recv.await.map_err(|_| { + Error::new( + eyre!("unix socket server thread panicked"), + ErrorKind::Unknown, + ) + })??; + if self + .rpc_server + .send_replace(Some((handle, shutdown))) + .is_some() + { + return Err(Error::new( + eyre!("PersistentContainer already initialized"), + ErrorKind::InvalidRequest, + )); + } + + self.rpc_client.request(rpc::Init, Empty {}).await?; + + Ok(()) + } + + #[instrument(skip_all)] + fn destroy(&mut self) -> impl Future> + 'static { + let rpc_client = self.rpc_client.clone(); + let rpc_server = self.rpc_server.send_replace(None); + let js_mount = self.js_mount.take(); + let volumes = std::mem::take(&mut self.volumes); + let assets = std::mem::take(&mut self.assets); + let overlays = self.overlays.clone(); + let lxc_container = self.lxc_container.take(); + async move { + let mut errs = ErrorCollection::new(); + errs.handle(dbg!(rpc_client.request(rpc::Exit, Empty {}).await)); + if let Some((hdl, shutdown)) = rpc_server { + shutdown.shutdown(); + errs.handle(hdl.await.with_kind(ErrorKind::Cancelled)); + } + for (_, volume) in volumes { + errs.handle(volume.unmount(true).await); + } + for (_, assets) in assets { + errs.handle(assets.unmount(true).await); + } + for (_, overlay) in std::mem::take(&mut *overlays.lock().await) { + errs.handle(overlay.unmount(true).await); + } + errs.handle(js_mount.unmount(true).await); + if let Some(lxc_container) = lxc_container { + errs.handle(lxc_container.exit().await); + } + errs.into_result() + } + } + + #[instrument(skip_all)] + pub async fn exit(mut self) -> Result<(), Error> { + self.destroy().await?; + + Ok(()) + } + + #[instrument(skip_all)] + pub async fn start(&self) -> Result<(), Error> { + self.execute( + ProcedureName::StartMain, + Value::Null, + Some(Duration::from_secs(5)), // TODO + ) + .await?; + Ok(()) + } + + #[instrument(skip_all)] + pub async fn stop(&self, timeout: Option) -> Result<(), Error> { + self.execute(ProcedureName::StopMain, Value::Null, timeout) + .await?; + Ok(()) + } + + #[instrument(skip_all)] + pub async fn execute( + &self, + name: ProcedureName, + input: Value, + timeout: Option, + ) -> Result + where + O: DeserializeOwned, + { + self._execute(name, input, timeout) + .await + .and_then(from_value) + } + + #[instrument(skip_all)] + pub async fn sanboxed( + &self, + name: ProcedureName, + input: Value, + timeout: Option, + ) -> Result + where + O: DeserializeOwned, + { + self._sandboxed(name, input, timeout) + .await + .and_then(from_value) + } + + #[instrument(skip_all)] + async fn _execute( + &self, + name: ProcedureName, + input: Value, + timeout: Option, + ) -> Result { + let fut = self + .rpc_client + .request(rpc::Execute, rpc::ExecuteParams::new(name, input, timeout)); + + Ok(if let Some(timeout) = timeout { + tokio::time::timeout(timeout, fut) + .await + .with_kind(ErrorKind::Timeout)?? + } else { + fut.await? + }) + } + + #[instrument(skip_all)] + async fn _sandboxed( + &self, + name: ProcedureName, + input: Value, + timeout: Option, + ) -> Result { + let fut = self + .rpc_client + .request(rpc::Sandbox, rpc::ExecuteParams::new(name, input, timeout)); + + Ok(if let Some(timeout) = timeout { + tokio::time::timeout(timeout, fut) + .await + .with_kind(ErrorKind::Timeout)?? + } else { + fut.await? + }) + } +} + +impl Drop for PersistentContainer { + fn drop(&mut self) { + let destroy = self.destroy(); + tokio::spawn(async move { destroy.await.unwrap() }); + } +} diff --git a/core/startos/src/service/rpc.rs b/core/startos/src/service/rpc.rs new file mode 100644 index 000000000..05e6dcfab --- /dev/null +++ b/core/startos/src/service/rpc.rs @@ -0,0 +1,96 @@ +use std::time::Duration; + +use imbl_value::Value; +use models::ProcedureName; +use rpc_toolkit::yajrc::{RpcError, RpcMethod}; +use rpc_toolkit::Empty; + +use crate::prelude::*; + +#[derive(Clone)] +pub struct Init; +impl RpcMethod for Init { + type Params = Empty; + type Response = (); + fn as_str<'a>(&'a self) -> &'a str { + "init" + } +} +impl serde::Serialize for Init { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + serializer.serialize_str(self.as_str()) + } +} + +#[derive(Clone)] +pub struct Exit; +impl RpcMethod for Exit { + type Params = Empty; + type Response = (); + fn as_str<'a>(&'a self) -> &'a str { + "exit" + } +} +impl serde::Serialize for Exit { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + serializer.serialize_str(self.as_str()) + } +} + +#[derive(Clone, serde::Deserialize, serde::Serialize)] +pub struct ExecuteParams { + procedure: String, + input: Value, + timeout: Option, +} +impl ExecuteParams { + pub fn new(procedure: ProcedureName, input: Value, timeout: Option) -> Self { + Self { + procedure: procedure.js_function_name(), + input, + timeout: timeout.map(|d| d.as_millis()), + } + } +} + +#[derive(Clone)] +pub struct Execute; +impl RpcMethod for Execute { + type Params = ExecuteParams; + type Response = Value; + fn as_str<'a>(&'a self) -> &'a str { + "execute" + } +} +impl serde::Serialize for Execute { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + serializer.serialize_str(self.as_str()) + } +} + +#[derive(Clone)] +pub struct Sandbox; +impl RpcMethod for Sandbox { + type Params = ExecuteParams; + type Response = Value; + fn as_str<'a>(&'a self) -> &'a str { + "sandbox" + } +} +impl serde::Serialize for Sandbox { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + serializer.serialize_str(self.as_str()) + } +} diff --git a/core/startos/src/service/service_effect_handler.rs b/core/startos/src/service/service_effect_handler.rs new file mode 100644 index 000000000..c015195e5 --- /dev/null +++ b/core/startos/src/service/service_effect_handler.rs @@ -0,0 +1,684 @@ +use std::ffi::OsString; +use std::os::unix::process::CommandExt; +use std::path::{Path, PathBuf}; +use std::str::FromStr; +use std::sync::{Arc, Weak}; + +use clap::builder::{TypedValueParser, ValueParserFactory}; +use clap::Parser; +use imbl_value::json; +use models::{ActionId, HealthCheckId, ImageId, PackageId}; +use patch_db::json_ptr::JsonPointer; +use rpc_toolkit::{from_fn, from_fn_async, AnyContext, Context, Empty, HandlerExt, ParentHandler}; +use tokio::process::Command; + +use crate::disk::mount::filesystem::idmapped::IdMapped; +use crate::disk::mount::filesystem::loop_dev::LoopDev; +use crate::disk::mount::filesystem::overlayfs::OverlayGuard; +use crate::prelude::*; +use crate::s9pk::rpc::SKIP_ENV; +use crate::service::cli::ContainerCliContext; +use crate::service::start_stop::StartStop; +use crate::service::ServiceActorSeed; +use crate::status::health_check::HealthCheckResult; +use crate::status::MainStatus; +use crate::util::clap::FromStrParser; +use crate::util::new_guid; +use crate::{db::model::ExposedUI, util::Invoke}; +use crate::{echo, ARCH}; + +#[derive(Clone)] +pub(super) struct EffectContext(Weak); +impl EffectContext { + pub fn new(seed: Weak) -> Self { + Self(seed) + } +} +impl Context for EffectContext {} +impl EffectContext { + fn deref(&self) -> Result, Error> { + if let Some(seed) = Weak::upgrade(&self.0) { + Ok(seed) + } else { + Err(Error::new( + eyre!("Service has already been destroyed"), + ErrorKind::InvalidRequest, + )) + } + } +} + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +struct RpcData { + id: i64, + method: String, + params: Value, +} +pub fn service_effect_handler() -> ParentHandler { + ParentHandler::new() + .subcommand("gitInfo", from_fn(crate::version::git_info)) + .subcommand( + "echo", + from_fn(echo).with_remote_cli::(), + ) + .subcommand("chroot", from_fn(chroot).no_display()) + .subcommand("exists", from_fn_async(exists).no_cli()) + .subcommand("executeAction", from_fn_async(execute_action).no_cli()) + .subcommand("getConfigured", from_fn_async(get_configured).no_cli()) + .subcommand( + "stopped", + from_fn_async(stopped) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "running", + from_fn_async(running) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "restart", + from_fn_async(restart) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "shutdown", + from_fn_async(shutdown) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "setConfigured", + from_fn_async(set_configured) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "setMainStatus", + from_fn_async(set_main_status).with_remote_cli::(), + ) + .subcommand("setHealth", from_fn_async(set_health).no_cli()) + .subcommand("getStore", from_fn_async(get_store).no_cli()) + .subcommand("setStore", from_fn_async(set_store).no_cli()) + .subcommand( + "exposeForDependents", + from_fn_async(expose_for_dependents).no_cli(), + ) + .subcommand("exposeUi", from_fn_async(expose_ui).no_cli()) + .subcommand( + "createOverlayedImage", + from_fn_async(create_overlayed_image) + .with_custom_display_fn::(|_, path| { + Ok(println!("{}", path.display())) + }) + .with_remote_cli::(), + ) + .subcommand( + "getSslCertificate", + from_fn_async(get_ssl_certificate).no_cli(), + ) + .subcommand("getSslKey", from_fn_async(get_ssl_key).no_cli()) + // TODO @DrBonez when we get the new api for 4.0 + // .subcommand("setDependencies",from_fn(set_dependencies)) + // .subcommand("embassyGetInterface",from_fn(embassy_get_interface)) + // .subcommand("mount",from_fn(mount)) + // .subcommand("removeAction",from_fn(remove_action)) + // .subcommand("removeAddress",from_fn(remove_address)) + // .subcommand("exportAction",from_fn(export_action)) + // .subcommand("bind",from_fn(bind)) + // .subcommand("clearNetworkInterfaces",from_fn(clear_network_interfaces)) + // .subcommand("exportNetworkInterface",from_fn(export_network_interface)) + // .subcommand("clearBindings",from_fn(clear_bindings)) + // .subcommand("getHostnames",from_fn(get_hostnames)) + // .subcommand("getInterface",from_fn(get_interface)) + // .subcommand("listInterface",from_fn(list_interface)) + // .subcommand("getIPHostname",from_fn(get_ip_hostname)) + // .subcommand("getContainerIp",from_fn(get_container_ip)) + // .subcommand("getLocalHostname",from_fn(get_local_hostname)) + // .subcommand("getPrimaryUrl",from_fn(get_primary_url)) + // .subcommand("getServicePortForward",from_fn(get_service_port_forward)) + // .subcommand("getServiceTorHostname",from_fn(get_service_tor_hostname)) + // .subcommand("getSystemSmtp",from_fn(get_system_smtp)) + // .subcommand("reverseProxy",from_fn(reverse_pro)xy) + // TODO Callbacks +} + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, Parser)] +#[serde(rename_all = "camelCase")] +struct ChrootParams { + #[arg(short = 'e', long = "env")] + env: Option, + #[arg(short = 'w', long = "workdir")] + workdir: Option, + #[arg(short = 'u', long = "user")] + user: Option, + path: PathBuf, + command: OsString, + args: Vec, +} +fn chroot( + _: AnyContext, + ChrootParams { + env, + workdir, + user, + path, + command, + args, + }: ChrootParams, +) -> Result<(), Error> { + let mut cmd = std::process::Command::new(command); + if let Some(env) = env { + for (k, v) in std::fs::read_to_string(env)? + .lines() + .map(|l| l.trim()) + .filter_map(|l| l.split_once("=")) + .filter(|(k, _)| !SKIP_ENV.contains(&k)) + { + cmd.env(k, v); + } + } + std::os::unix::fs::chroot(path)?; + if let Some(uid) = user.as_deref().and_then(|u| u.parse::().ok()) { + cmd.uid(uid); + } else if let Some(user) = user { + let (uid, gid) = std::fs::read_to_string("/etc/passwd")? + .lines() + .find_map(|l| { + let mut split = l.trim().split(":"); + if user != split.next()? { + return None; + } + split.next(); // throw away x + Some((split.next()?.parse().ok()?, split.next()?.parse().ok()?)) + // uid gid + }) + .or_not_found(lazy_format!("{user} in /etc/passwd"))?; + cmd.uid(uid); + cmd.gid(gid); + }; + if let Some(workdir) = workdir { + cmd.current_dir(workdir); + } + cmd.args(args); + Err(cmd.exec().into()) +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct GetSslCertificateParams { + package_id: Option, + algorithm: Option, //"ecdsa" | "ed25519" +} + +async fn get_ssl_certificate( + context: EffectContext, + GetSslCertificateParams { + package_id, + algorithm, + }: GetSslCertificateParams, +) -> Result { + let fake = include_str!("./fake.cert.pem"); + Ok(json!([fake, fake, fake])) +} + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct GetSslKeyParams { + package_id: Option, + algorithm: Option, //"ecdsa" | "ed25519" +} + +async fn get_ssl_key( + context: EffectContext, + GetSslKeyParams { + package_id, + algorithm, + }: GetSslKeyParams, +) -> Result { + let fake = include_str!("./fake.cert.key"); + Ok(json!(fake)) +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct GetStoreParams { + package_id: Option, + path: JsonPointer, +} + +async fn get_store( + context: EffectContext, + GetStoreParams { package_id, path }: GetStoreParams, +) -> Result { + let context = context.deref()?; + let peeked = context.ctx.db.peek().await; + let package_id = package_id.unwrap_or(context.id.clone()); + let value = peeked + .as_package_data() + .as_idx(&package_id) + .or_not_found(&package_id)? + .as_installed() + .or_not_found(&package_id)? + .as_store() + .de()?; + + Ok(path + .get(&value) + .ok_or_else(|| Error::new(eyre!("Did not find value at path"), ErrorKind::NotFound))? + .clone()) +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct SetStoreParams { + value: Value, + path: JsonPointer, +} + +async fn set_store( + context: EffectContext, + SetStoreParams { value, path }: SetStoreParams, +) -> Result<(), Error> { + let context = context.deref()?; + let package_id = context.id.clone(); + context + .ctx + .db + .mutate(|db| { + let model = db + .as_package_data_mut() + .as_idx_mut(&package_id) + .or_not_found(&package_id)? + .as_installed_mut() + .or_not_found(&package_id)? + .as_store_mut(); + let mut model_value = model.de()?; + path.set(&mut model_value, value, true) + .with_kind(ErrorKind::ParseDbField)?; + model.ser(&model_value) + }) + .await?; + Ok(()) +} + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct ExposeForDependentsParams { + paths: Vec, +} + +async fn expose_for_dependents( + context: EffectContext, + ExposeForDependentsParams { paths }: ExposeForDependentsParams, +) -> Result<(), Error> { + let context = context.deref()?; + let package_id = context.id.clone(); + context + .ctx + .db + .mutate(|db| { + db.as_package_data_mut() + .as_idx_mut(&package_id) + .or_not_found(&package_id)? + .as_installed_mut() + .or_not_found(&package_id)? + .as_store_exposed_dependents_mut() + .ser(&paths) + }) + .await?; + Ok(()) +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct ExposeUiParams { + paths: Vec, +} + +async fn expose_ui( + context: EffectContext, + ExposeUiParams { paths }: ExposeUiParams, +) -> Result<(), Error> { + let context = context.deref()?; + let package_id = context.id.clone(); + context + .ctx + .db + .mutate(|db| { + db.as_package_data_mut() + .as_idx_mut(&package_id) + .or_not_found(&package_id)? + .as_installed_mut() + .or_not_found(&package_id)? + .as_store_exposed_ui_mut() + .ser(&paths) + }) + .await?; + Ok(()) +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +struct ParamsPackageId { + package: PackageId, +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, Parser)] +#[serde(rename_all = "camelCase")] +#[command(rename_all = "camelCase")] +struct ParamsMaybePackageId { + package_id: Option, +} + +async fn exists(context: EffectContext, params: ParamsPackageId) -> Result { + let context = context.deref()?; + let peeked = context.ctx.db.peek().await; + let package = peeked.as_package_data().as_idx(¶ms.package).is_some(); + Ok(json!(package)) +} + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct ExecuteAction { + service_id: Option, + action_id: ActionId, + input: Value, +} +async fn execute_action( + context: EffectContext, + ExecuteAction { + action_id, + input, + service_id, + }: ExecuteAction, +) -> Result { + let context = context.deref()?; + let package_id = service_id.clone().unwrap_or_else(|| context.id.clone()); + let service = context.ctx.services.get(&package_id).await; + let service = service.as_ref().ok_or_else(|| { + Error::new( + eyre!("Could not find package {package_id}"), + ErrorKind::Unknown, + ) + })?; + + Ok(json!(service.action(action_id, input).await?)) +} +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct FromService {} +async fn get_configured(context: EffectContext, _: Empty) -> Result { + let context = context.deref()?; + let peeked = context.ctx.db.peek().await; + let package_id = &context.id; + let package = peeked + .as_package_data() + .as_idx(&package_id) + .or_not_found(&package_id)? + .as_installed() + .or_not_found(&package_id)? + .as_status() + .as_configured() + .de()?; + Ok(json!(package)) +} + +async fn stopped(context: EffectContext, params: ParamsMaybePackageId) -> Result { + let context = context.deref()?; + let peeked = context.ctx.db.peek().await; + let package_id = params.package_id.unwrap_or_else(|| context.id.clone()); + let package = peeked + .as_package_data() + .as_idx(&package_id) + .or_not_found(&package_id)? + .as_installed() + .or_not_found(&package_id)? + .as_status() + .as_main() + .de()?; + Ok(json!(matches!(package, MainStatus::Stopped))) +} +async fn running(context: EffectContext, params: ParamsMaybePackageId) -> Result { + let context = context.deref()?; + let peeked = context.ctx.db.peek().await; + let package_id = params.package_id.unwrap_or_else(|| context.id.clone()); + let package = peeked + .as_package_data() + .as_idx(&package_id) + .or_not_found(&package_id)? + .as_installed() + .or_not_found(&package_id)? + .as_status() + .as_main() + .de()?; + Ok(json!(matches!(package, MainStatus::Running { .. }))) +} + +async fn restart(context: EffectContext, _: Empty) -> Result { + let context = context.deref()?; + let service = context.ctx.services.get(&context.id).await; + let service = service.as_ref().ok_or_else(|| { + Error::new( + eyre!("Could not find package {}", context.id), + ErrorKind::Unknown, + ) + })?; + service.restart().await?; + Ok(json!(())) +} + +async fn shutdown(context: EffectContext, _: Empty) -> Result { + let context = context.deref()?; + let service = context.ctx.services.get(&context.id).await; + let service = service.as_ref().ok_or_else(|| { + Error::new( + eyre!("Could not find package {}", context.id), + ErrorKind::Unknown, + ) + })?; + service.stop().await?; + Ok(json!(())) +} + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, Parser)] +#[serde(rename_all = "camelCase")] +#[command(rename_all = "camelCase")] +struct SetConfigured { + configured: bool, +} +async fn set_configured(context: EffectContext, params: SetConfigured) -> Result { + let context = context.deref()?; + let package_id = &context.id; + context + .ctx + .db + .mutate(|db| { + db.as_package_data_mut() + .as_idx_mut(package_id) + .or_not_found(package_id)? + .as_installed_mut() + .or_not_found(package_id)? + .as_status_mut() + .as_configured_mut() + .ser(¶ms.configured) + }) + .await?; + Ok(json!(())) +} + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +enum Status { + Running, + Stopped, +} +impl FromStr for Status { + type Err = color_eyre::eyre::Report; + fn from_str(s: &str) -> Result { + match s { + "running" => Ok(Self::Running), + "stopped" => Ok(Self::Stopped), + _ => Err(eyre!("unknown status {s}")), + } + } +} +impl ValueParserFactory for Status { + type Parser = FromStrParser; + fn value_parser() -> Self::Parser { + FromStrParser::new() + } +} + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, Parser)] +#[serde(rename_all = "camelCase")] +#[command(rename_all = "camelCase")] +struct SetMainStatus { + status: Status, +} +async fn set_main_status(context: EffectContext, params: SetMainStatus) -> Result { + let context = context.deref()?; + context + .persistent_container + .current_state + .send_replace(match params.status { + Status::Running => StartStop::Start, + Status::Stopped => StartStop::Stop, + }); + Ok(Value::Null) +} + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct SetHealth { + name: HealthCheckId, + health_result: Option, +} + +async fn set_health(context: EffectContext, params: SetHealth) -> Result { + let context = context.deref()?; + // TODO DrBonez + BLU-J Need to change the type from + // ```rs + // #[serde(tag = "result")] + // pub enum HealthCheckResult { + // Success, + // Disabled, + // Starting, + // Loading { message: String }, + // Failure { error: String }, + // } + // ``` + // to + // ```ts + // setHealth(o: { + // name: string + // status: HealthStatus + // message?: string + // }): Promise + // ``` + + let package_id = &context.id; + context + .ctx + .db + .mutate(move |db| { + let mut main = db + .as_package_data() + .as_idx(package_id) + .or_not_found(package_id)? + .as_installed() + .or_not_found(package_id)? + .as_status() + .as_main() + .de()?; + match &mut main { + &mut MainStatus::Running { ref mut health, .. } + | &mut MainStatus::BackingUp { ref mut health, .. } => { + health.remove(¶ms.name); + if let SetHealth { + name, + health_result: Some(health_result), + } = params + { + health.insert(name, health_result); + } + } + _ => return Ok(()), + }; + db.as_package_data_mut() + .as_idx_mut(package_id) + .or_not_found(package_id)? + .as_installed_mut() + .or_not_found(package_id)? + .as_status_mut() + .as_main_mut() + .ser(&main) + }) + .await?; + Ok(json!(())) +} + +#[derive(serde::Deserialize, serde::Serialize, Parser)] +#[serde(rename_all = "camelCase")] +#[command(rename_all = "camelCase")] +pub struct CreateOverlayedImageParams { + image_id: ImageId, +} + +#[instrument(skip_all)] +pub async fn create_overlayed_image( + ctx: EffectContext, + CreateOverlayedImageParams { image_id }: CreateOverlayedImageParams, +) -> Result { + let ctx = ctx.deref()?; + let path = Path::new("images") + .join(&*ARCH) + .join(&image_id) + .with_extension("squashfs"); + if let Some(image) = ctx + .persistent_container + .s9pk + .as_archive() + .contents() + .get_path(dbg!(&path)) + .and_then(|e| e.as_file()) + { + let guid = new_guid(); + let rootfs_dir = ctx + .persistent_container + .lxc_container + .get() + .ok_or_else(|| { + Error::new( + eyre!("PersistentContainer has been destroyed"), + ErrorKind::Incoherent, + ) + })? + .rootfs_dir(); + let mountpoint = rootfs_dir.join("media/startos/overlays").join(&*guid); + tokio::fs::create_dir_all(&mountpoint).await?; + Command::new("chown") + .arg("100000:100000") + .arg(&mountpoint) + .invoke(ErrorKind::Filesystem) + .await?; + let container_mountpoint = Path::new("/").join( + mountpoint + .strip_prefix(rootfs_dir) + .with_kind(ErrorKind::Incoherent)?, + ); + tracing::info!("Mounting overlay {guid} for {image_id}"); + let guard = OverlayGuard::mount( + &IdMapped::new(LoopDev::from(&**image), 0, 100000, 65536), + mountpoint, + ) + .await?; + tracing::info!("Mounted overlay {guid} for {image_id}"); + ctx.persistent_container + .overlays + .lock() + .await + .insert(guid.clone(), guard); + Ok(container_mountpoint) + } else { + Err(Error::new( + eyre!("image {image_id} not found in s9pk"), + ErrorKind::NotFound, + )) + } +} diff --git a/core/startos/src/service/service_map.rs b/core/startos/src/service/service_map.rs new file mode 100644 index 000000000..1fddbb8d1 --- /dev/null +++ b/core/startos/src/service/service_map.rs @@ -0,0 +1,384 @@ +use std::sync::Arc; +use std::time::Duration; + +use color_eyre::eyre::eyre; +use futures::future::BoxFuture; +use futures::{Future, FutureExt}; +use helpers::NonDetachingJoinHandle; +use imbl::OrdMap; +use imbl_value::InternedString; +use tokio::sync::{Mutex, OwnedRwLockReadGuard, OwnedRwLockWriteGuard, RwLock}; +use tracing::instrument; + +use crate::context::RpcContext; +use crate::db::model::{ + InstalledPackageInfo, PackageDataEntry, PackageDataEntryInstalled, PackageDataEntryInstalling, + PackageDataEntryRestoring, PackageDataEntryUpdating, StaticFiles, +}; +use crate::disk::mount::guard::GenericMountGuard; +use crate::install::PKG_ARCHIVE_DIR; +use crate::notifications::NotificationLevel; +use crate::prelude::*; +use crate::progress::{ + FullProgressTracker, FullProgressTrackerHandle, PhaseProgressTrackerHandle, + ProgressTrackerWriter, +}; +use crate::s9pk::manifest::PackageId; +use crate::s9pk::merkle_archive::source::FileSource; +use crate::s9pk::S9pk; +use crate::service::{LoadDisposition, Service}; + +pub type DownloadInstallFuture = BoxFuture<'static, Result>; +pub type InstallFuture = BoxFuture<'static, Result<(), Error>>; + +pub(super) struct InstallProgressHandles { + pub(super) finalization_progress: PhaseProgressTrackerHandle, + pub(super) progress_handle: FullProgressTrackerHandle, +} + +/// This is the structure to contain all the services +#[derive(Default)] +pub struct ServiceMap(Mutex>>>>); +impl ServiceMap { + async fn entry(&self, id: &PackageId) -> Arc>> { + self.0 + .lock() + .await + .entry(id.clone()) + .or_insert_with(|| Arc::new(RwLock::new(None))) + .clone() + } + + #[instrument(skip_all)] + pub async fn get(&self, id: &PackageId) -> OwnedRwLockReadGuard> { + self.entry(id).await.read_owned().await + } + + #[instrument(skip_all)] + pub async fn get_mut(&self, id: &PackageId) -> OwnedRwLockWriteGuard> { + self.entry(id).await.write_owned().await + } + + #[instrument(skip_all)] + pub async fn init(&self, ctx: &RpcContext) -> Result<(), Error> { + for id in ctx.db.peek().await.as_package_data().keys()? { + if let Err(e) = self.load(ctx, &id, LoadDisposition::Retry).await { + tracing::error!("Error loading installed package as service: {e}"); + tracing::debug!("{e:?}"); + } + } + Ok(()) + } + + #[instrument(skip_all)] + pub async fn load( + &self, + ctx: &RpcContext, + id: &PackageId, + disposition: LoadDisposition, + ) -> Result<(), Error> { + let mut shutdown_err = Ok(()); + let mut service = self.get_mut(id).await; + if let Some(service) = service.take() { + shutdown_err = service.shutdown().await; + } + // TODO: retry on error? + *service = Service::load(ctx, id, disposition).await?; + shutdown_err?; + Ok(()) + } + + #[instrument(skip_all)] + pub async fn install( + &self, + ctx: RpcContext, + mut s9pk: S9pk, + recovery_source: Option, + ) -> Result { + let manifest = Arc::new(s9pk.as_manifest().clone()); + let id = manifest.id.clone(); + let icon = s9pk.icon_data_url().await?; + let mut service = self.get_mut(&id).await; + + let op_name = if recovery_source.is_none() { + if service.is_none() { + "Install" + } else { + "Update" + } + } else { + "Restore" + }; + + let size = s9pk.size(); + let mut progress = FullProgressTracker::new(); + let download_progress_contribution = size.unwrap_or(60); + let progress_handle = progress.handle(); + let mut download_progress = progress_handle.add_phase( + InternedString::intern("Download"), + Some(download_progress_contribution), + ); + if let Some(size) = size { + download_progress.set_total(size); + } + let mut finalization_progress = progress_handle.add_phase( + InternedString::intern(op_name), + Some(download_progress_contribution / 2), + ); + let restoring = recovery_source.is_some(); + + let mut reload_guard = ServiceReloadGuard::new(ctx.clone(), id.clone(), op_name); + + reload_guard + .handle(ctx.db.mutate({ + let manifest = manifest.clone(); + let id = id.clone(); + let install_progress = progress.snapshot(); + move |db| { + let pde = match db + .as_package_data() + .as_idx(&id) + .map(|x| x.de()) + .transpose()? + { + Some(PackageDataEntry::Installed(PackageDataEntryInstalled { + installed, + static_files, + .. + })) => PackageDataEntry::Updating(PackageDataEntryUpdating { + install_progress, + installed, + manifest: (*manifest).clone(), + static_files, + }), + None if restoring => { + PackageDataEntry::Restoring(PackageDataEntryRestoring { + install_progress, + static_files: StaticFiles::local( + &manifest.id, + &manifest.version, + icon, + ), + manifest: (*manifest).clone(), + }) + } + None => PackageDataEntry::Installing(PackageDataEntryInstalling { + install_progress, + static_files: StaticFiles::local(&manifest.id, &manifest.version, icon), + manifest: (*manifest).clone(), + }), + _ => { + return Err(Error::new( + eyre!("Cannot install over a package in a transient state"), + crate::ErrorKind::InvalidRequest, + )) + } + }; + db.as_package_data_mut().insert(&manifest.id, &pde) + } + })) + .await?; + + Ok(async move { + let (installed_path, sync_progress_task) = reload_guard + .handle(async { + let download_path = ctx + .datadir + .join(PKG_ARCHIVE_DIR) + .join("downloading") + .join(&id) + .with_extension("s9pk"); + + let deref_id = id.clone(); + let sync_progress_task = + NonDetachingJoinHandle::from(tokio::spawn(progress.sync_to_db( + ctx.db.clone(), + move |v| { + v.as_package_data_mut() + .as_idx_mut(&deref_id) + .and_then(|e| e.as_install_progress_mut()) + }, + Some(Duration::from_millis(100)), + ))); + + let mut progress_writer = ProgressTrackerWriter::new( + crate::util::io::create_file(&download_path).await?, + download_progress, + ); + s9pk.serialize(&mut progress_writer, true).await?; + let (file, mut download_progress) = progress_writer.into_inner(); + file.sync_all().await?; + download_progress.complete(); + + let installed_path = ctx + .datadir + .join(PKG_ARCHIVE_DIR) + .join("installed") + .join(&id) + .with_extension("s9pk"); + + crate::util::io::rename(&download_path, &installed_path).await?; + + Ok::<_, Error>((installed_path, sync_progress_task)) + }) + .await?; + Ok(reload_guard + .handle_last(async move { + let s9pk = S9pk::open(&installed_path, Some(&id)).await?; + let prev = if let Some(service) = service.take() { + ensure_code!( + recovery_source.is_none(), + ErrorKind::InvalidRequest, + "cannot restore over existing package" + ); + let version = service + .seed + .persistent_container + .s9pk + .as_manifest() + .version + .clone(); + service + .uninstall(Some(s9pk.as_manifest().version.clone())) + .await?; + finalization_progress.complete(); + progress_handle.complete(); + Some(version) + } else { + None + }; + if let Some(recovery_source) = recovery_source { + *service = Some( + Service::restore( + ctx, + s9pk, + recovery_source, + Some(InstallProgressHandles { + finalization_progress, + progress_handle, + }), + ) + .await?, + ); + } else { + *service = Some( + Service::install( + ctx, + s9pk, + prev, + Some(InstallProgressHandles { + finalization_progress, + progress_handle, + }), + ) + .await?, + ); + } + sync_progress_task.await.map_err(|_| { + Error::new(eyre!("progress sync task panicked"), ErrorKind::Unknown) + })??; + Ok(()) + }) + .boxed()) + } + .boxed()) + } + + /// This is ran during the cleanup, so when we are uninstalling the service + #[instrument(skip_all)] + pub async fn uninstall(&self, ctx: &RpcContext, id: &PackageId) -> Result<(), Error> { + if let Some(service) = self.get_mut(id).await.take() { + ServiceReloadGuard::new(ctx.clone(), id.clone(), "Uninstall") + .handle_last(service.uninstall(None)) + .await?; + } + Ok(()) + } + + pub async fn shutdown_all(&self) -> Result<(), Error> { + let lock = self.0.lock().await; + let mut futs = Vec::with_capacity(lock.len()); + for service in lock.values().cloned() { + futs.push(async move { + if let Some(service) = service.write_owned().await.take() { + service.shutdown().await? + } + Ok::<_, Error>(()) + }); + } + drop(lock); + let mut errors = ErrorCollection::new(); + for res in futures::future::join_all(futs).await { + errors.handle(res); + } + errors.into_result() + } +} + +pub struct ServiceReloadGuard(Option); +impl Drop for ServiceReloadGuard { + fn drop(&mut self) { + if let Some(info) = self.0.take() { + tokio::spawn(info.reload(None)); + } + } +} +impl ServiceReloadGuard { + pub fn new(ctx: RpcContext, id: PackageId, operation: &'static str) -> Self { + Self(Some(ServiceReloadInfo { ctx, id, operation })) + } + + pub async fn handle( + &mut self, + operation: impl Future>, + ) -> Result { + let mut errors = ErrorCollection::new(); + match operation.await { + Ok(a) => Ok(a), + Err(e) => { + if let Some(info) = self.0.take() { + errors.handle(info.reload(Some(e.clone_output())).await); + } + errors.handle::<(), _>(Err(e)); + errors.into_result().map(|_| unreachable!()) // TODO: there's gotta be a more elegant way? + } + } + } + pub async fn handle_last( + mut self, + operation: impl Future>, + ) -> Result { + let res = self.handle(operation).await; + self.0.take(); + res + } +} + +struct ServiceReloadInfo { + ctx: RpcContext, + id: PackageId, + operation: &'static str, +} +impl ServiceReloadInfo { + async fn reload(self, error: Option) -> Result<(), Error> { + self.ctx + .services + .load(&self.ctx, &self.id, LoadDisposition::Undo) + .await?; + if let Some(error) = error { + self.ctx + .notification_manager + .notify( + self.ctx.db.clone(), + Some(self.id.clone()), + NotificationLevel::Error, + format!("{} Failed", self.operation), + error.to_string(), + (), + None, + ) + .await?; + } + Ok(()) + } +} diff --git a/core/startos/src/manager/start_stop.rs b/core/startos/src/service/start_stop.rs similarity index 93% rename from core/startos/src/manager/start_stop.rs rename to core/startos/src/service/start_stop.rs index 3842abe57..bc24574ac 100644 --- a/core/startos/src/manager/start_stop.rs +++ b/core/startos/src/service/start_stop.rs @@ -16,7 +16,7 @@ impl From for StartStop { match value { MainStatus::Stopped => StartStop::Stop, MainStatus::Restarting => StartStop::Start, - MainStatus::Stopping => StartStop::Stop, + MainStatus::Stopping { .. } => StartStop::Stop, MainStatus::Starting => StartStop::Start, MainStatus::Running { started: _, diff --git a/core/startos/src/service/transition/backup.rs b/core/startos/src/service/transition/backup.rs new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/core/startos/src/service/transition/backup.rs @@ -0,0 +1 @@ + diff --git a/core/startos/src/service/transition/mod.rs b/core/startos/src/service/transition/mod.rs new file mode 100644 index 000000000..29c1be38d --- /dev/null +++ b/core/startos/src/service/transition/mod.rs @@ -0,0 +1,74 @@ +use std::ops::Deref; +use std::sync::Arc; + +use futures::{Future, FutureExt}; +use tokio::sync::watch; + +use crate::service::start_stop::StartStop; +use crate::util::actor::BackgroundJobs; +use crate::util::future::{CancellationHandle, RemoteCancellable}; + +pub mod backup; +pub mod restart; + +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] +pub enum TransitionKind { + BackingUp, + Restarting, +} + +/// Used only in the manager/mod and is used to keep track of the state of the manager during the +/// transitional states +pub struct TransitionState { + cancel_handle: CancellationHandle, + kind: TransitionKind, +} + +impl TransitionState { + pub fn kind(&self) -> TransitionKind { + self.kind + } + pub async fn abort(mut self) { + self.cancel_handle.cancel_and_wait().await + } + fn new( + task: impl Future + Send + 'static, + kind: TransitionKind, + jobs: &mut BackgroundJobs, + ) -> Self { + let task = RemoteCancellable::new(task); + let cancel_handle = task.cancellation_handle(); + jobs.add_job(task.map(|_| ())); + Self { + cancel_handle, + kind, + } + } +} +impl Drop for TransitionState { + fn drop(&mut self) { + self.cancel_handle.cancel(); + } +} + +#[derive(Clone)] +pub struct TempDesiredState(pub(super) Arc>>); +impl TempDesiredState { + pub fn stop(&self) { + self.0.send_replace(Some(StartStop::Stop)); + } + pub fn start(&self) { + self.0.send_replace(Some(StartStop::Start)); + } +} +impl Drop for TempDesiredState { + fn drop(&mut self) { + self.0.send_replace(None); + } +} +impl Deref for TempDesiredState { + type Target = watch::Sender>; + fn deref(&self) -> &Self::Target { + &*self.0 + } +} diff --git a/core/startos/src/service/transition/restart.rs b/core/startos/src/service/transition/restart.rs new file mode 100644 index 000000000..71a889305 --- /dev/null +++ b/core/startos/src/service/transition/restart.rs @@ -0,0 +1,39 @@ +use futures::FutureExt; + +use crate::prelude::*; +use crate::service::start_stop::StartStop; +use crate::service::transition::{TransitionKind, TransitionState}; +use crate::service::{Service, ServiceActor}; +use crate::util::actor::{BackgroundJobs, Handler}; +use crate::util::future::RemoteCancellable; + +struct Restart; +#[async_trait::async_trait] +impl Handler for ServiceActor { + type Response = (); + async fn handle(&mut self, _: Restart, jobs: &mut BackgroundJobs) -> Self::Response { + let temp = self.0.temp_desired_state.clone(); + let mut current = self.0.persistent_container.current_state.subscribe(); + let transition = RemoteCancellable::new(async move { + temp.stop(); + current.wait_for(|s| *s == StartStop::Stop).await; + temp.start(); + current.wait_for(|s| *s == StartStop::Start).await; + }); + let cancel_handle = transition.cancellation_handle(); + jobs.add_job(transition.map(|_| ())); + let notified = self.0.synchronized.notified(); + if let Some(t) = self.0.transition_state.send_replace(Some(TransitionState { + kind: TransitionKind::Restarting, + cancel_handle, + })) { + t.abort().await; + } + notified.await + } +} +impl Service { + pub async fn restart(&self) -> Result<(), Error> { + self.actor.send(Restart).await + } +} diff --git a/core/startos/src/service/util.rs b/core/startos/src/service/util.rs new file mode 100644 index 000000000..3c53c2366 --- /dev/null +++ b/core/startos/src/service/util.rs @@ -0,0 +1,14 @@ +use futures::Future; +use tokio::sync::Notify; + +use crate::prelude::*; + +pub async fn cancellable( + cancel_transition: &Notify, + transition: impl Future, +) -> Result { + tokio::select! { + a = transition => Ok(a), + _ = cancel_transition.notified() => Err(Error::new(eyre!("transition was cancelled"), ErrorKind::Cancelled)), + } +} diff --git a/core/startos/src/setup.rs b/core/startos/src/setup.rs index 64c324095..0f47874e9 100644 --- a/core/startos/src/setup.rs +++ b/core/startos/src/setup.rs @@ -5,8 +5,8 @@ use std::time::Duration; use color_eyre::eyre::eyre; use josekit::jwk::Jwk; use openssl::x509::X509; -use rpc_toolkit::command; use rpc_toolkit::yajrc::RpcError; +use rpc_toolkit::{from_fn_async, HandlerExt, ParentHandler}; use serde::{Deserialize, Serialize}; use sqlx::Connection; use tokio::fs::File; @@ -18,36 +18,55 @@ use tracing::instrument; use crate::account::AccountInfo; use crate::backup::restore::recover_full_embassy; use crate::backup::target::BackupTargetFS; -use crate::context::rpc::RpcContextConfig; use crate::context::setup::SetupResult; use crate::context::SetupContext; use crate::disk::fsck::RepairStrategy; use crate::disk::main::DEFAULT_PASSWORD; use crate::disk::mount::filesystem::cifs::Cifs; use crate::disk::mount::filesystem::ReadWrite; -use crate::disk::mount::guard::TmpMountGuard; +use crate::disk::mount::guard::{GenericMountGuard, TmpMountGuard}; use crate::disk::util::{pvscan, recovery_info, DiskInfo, EmbassyOsRecoveryInfo}; use crate::disk::REPAIR_DISK_PATH; use crate::hostname::Hostname; use crate::init::{init, InitResult}; -use crate::middleware::encrypt::EncryptedWire; use crate::net::ssl::root_ca_start_time; use crate::prelude::*; +use crate::util::crypto::EncryptedWire; use crate::util::io::{dir_copy, dir_size, Counter}; use crate::{Error, ErrorKind, ResultExt}; -#[command(subcommands(status, disk, attach, execute, cifs, complete, get_pubkey, exit))] -pub fn setup() -> Result<(), Error> { - Ok(()) +pub fn setup() -> ParentHandler { + ParentHandler::new() + .subcommand( + "status", + from_fn_async(status) + .with_metadata("authenticated", Value::Bool(false)) + .no_cli(), + ) + .subcommand("disk", disk()) + .subcommand("attach", from_fn_async(attach).no_cli()) + .subcommand("execute", from_fn_async(execute).no_cli()) + .subcommand("cifs", cifs()) + .subcommand("complete", from_fn_async(complete).no_cli()) + .subcommand( + "get-pubkey", + from_fn_async(get_pubkey) + .with_metadata("authenticated", Value::Bool(false)) + .no_cli(), + ) + .subcommand("exit", from_fn_async(exit).no_cli()) } -#[command(subcommands(list_disks))] -pub fn disk() -> Result<(), Error> { - Ok(()) +pub fn disk() -> ParentHandler { + ParentHandler::new().subcommand( + "list", + from_fn_async(list_disks) + .with_metadata("authenticated", Value::Bool(false)) + .no_cli(), + ) } -#[command(rename = "list", rpc_only, metadata(authenticated = false))] -pub async fn list_disks(#[context] ctx: SetupContext) -> Result, Error> { +pub async fn list_disks(ctx: SetupContext) -> Result, Error> { crate::disk::util::list(&ctx.os_partitions).await } @@ -55,8 +74,7 @@ async fn setup_init( ctx: &SetupContext, password: Option, ) -> Result<(Hostname, OnionAddressV3, X509), Error> { - let InitResult { secret_store, db } = - init(&RpcContextConfig::load(ctx.config_path.clone()).await?).await?; + let InitResult { secret_store, db } = init(&ctx.config).await?; let mut secrets_handle = secret_store.acquire().await?; let mut secrets_tx = secrets_handle.begin().await?; @@ -82,11 +100,17 @@ async fn setup_init( )) } -#[command(rpc_only)] +#[derive(Deserialize, Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct AttachParams { + #[serde(rename = "embassy-password")] + password: Option, + guid: Arc, +} + pub async fn attach( - #[context] ctx: SetupContext, - #[arg] guid: Arc, - #[arg(rename = "embassy-password")] password: Option, + ctx: SetupContext, + AttachParams { password, guid }: AttachParams, ) -> Result<(), Error> { let mut status = ctx.setup_status.write().await; if status.is_some() { @@ -169,8 +193,7 @@ pub struct SetupStatus { pub complete: bool, } -#[command(rpc_only, metadata(authenticated = false))] -pub async fn status(#[context] ctx: SetupContext) -> Result, RpcError> { +pub async fn status(ctx: SetupContext) -> Result, RpcError> { ctx.setup_status.read().await.clone().transpose() } @@ -178,25 +201,34 @@ pub async fn status(#[context] ctx: SetupContext) -> Result, /// This way the frontend can send a secret, like the password for the setup/ recovory /// without knowing the password over clearnet. We use the public key shared across the network /// since it is fine to share the public, and encrypt against the public. -#[command(rename = "get-pubkey", rpc_only, metadata(authenticated = false))] -pub async fn get_pubkey(#[context] ctx: SetupContext) -> Result { +pub async fn get_pubkey(ctx: SetupContext) -> Result { let secret = ctx.as_ref().clone(); let pub_key = secret.to_public_key()?; Ok(pub_key) } -#[command(subcommands(verify_cifs))] -pub fn cifs() -> Result<(), Error> { - Ok(()) +pub fn cifs() -> ParentHandler { + ParentHandler::new().subcommand("verify", from_fn_async(verify_cifs).no_cli()) +} + +#[derive(Deserialize, Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct VerifyCifsParams { + hostname: String, + path: PathBuf, + username: String, + password: Option, } -#[command(rename = "verify", rpc_only)] +// #[command(rename = "verify", rpc_only)] pub async fn verify_cifs( - #[context] ctx: SetupContext, - #[arg] hostname: String, - #[arg] path: PathBuf, - #[arg] username: String, - #[arg] password: Option, + ctx: SetupContext, + VerifyCifsParams { + hostname, + path, + username, + password, + }: VerifyCifsParams, ) -> Result { let password: Option = password.map(|x| x.decrypt(&*ctx)).flatten(); let guard = TmpMountGuard::mount( @@ -209,12 +241,12 @@ pub async fn verify_cifs( ReadWrite, ) .await?; - let embassy_os = recovery_info(&guard).await?; + let embassy_os = recovery_info(guard.path()).await?; guard.unmount().await?; embassy_os.ok_or_else(|| Error::new(eyre!("No Backup Found"), crate::ErrorKind::NotFound)) } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Serialize)] #[serde(tag = "type")] #[serde(rename_all = "kebab-case")] pub enum RecoverySource { @@ -222,13 +254,24 @@ pub enum RecoverySource { Backup { target: BackupTargetFS }, } -#[command(rpc_only)] +#[derive(Deserialize, Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct ExecuteParams { + embassy_logicalname: PathBuf, + embassy_password: EncryptedWire, + recovery_source: Option, + recovery_password: Option, +} + +// #[command(rpc_only)] pub async fn execute( - #[context] ctx: SetupContext, - #[arg(rename = "embassy-logicalname")] embassy_logicalname: PathBuf, - #[arg(rename = "embassy-password")] embassy_password: EncryptedWire, - #[arg(rename = "recovery-source")] recovery_source: Option, - #[arg(rename = "recovery-password")] recovery_password: Option, + ctx: SetupContext, + ExecuteParams { + embassy_logicalname, + embassy_password, + recovery_source, + recovery_password, + }: ExecuteParams, ) -> Result<(), Error> { let embassy_password = match embassy_password.decrypt(&*ctx) { Some(a) => a, @@ -312,8 +355,8 @@ pub async fn execute( } #[instrument(skip_all)] -#[command(rpc_only)] -pub async fn complete(#[context] ctx: SetupContext) -> Result { +// #[command(rpc_only)] +pub async fn complete(ctx: SetupContext) -> Result { let (guid, setup_result) = if let Some((guid, setup_result)) = &*ctx.setup_result.read().await { (guid.clone(), setup_result.clone()) } else { @@ -329,8 +372,8 @@ pub async fn complete(#[context] ctx: SetupContext) -> Result Result<(), Error> { +// #[command(rpc_only)] +pub async fn exit(ctx: SetupContext) -> Result<(), Error> { ctx.shutdown.send(()).expect("failed to shutdown"); Ok(()) } @@ -383,8 +426,7 @@ async fn fresh_setup( let sqlite_pool = ctx.secret_store().await?; account.save(&sqlite_pool).await?; sqlite_pool.close().await; - let InitResult { secret_store, .. } = - init(&RpcContextConfig::load(ctx.config_path.clone()).await?).await?; + let InitResult { secret_store, .. } = init(&ctx.config).await?; secret_store.close().await; Ok(( account.hostname.clone(), diff --git a/core/startos/src/shutdown.rs b/core/startos/src/shutdown.rs index e5ff969b6..bd99bbbd1 100644 --- a/core/startos/src/shutdown.rs +++ b/core/startos/src/shutdown.rs @@ -1,15 +1,12 @@ use std::path::PathBuf; use std::sync::Arc; -use rpc_toolkit::command; - use crate::context::RpcContext; use crate::disk::main::export; use crate::init::{STANDBY_MODE_PATH, SYSTEM_REBUILD_PATH}; use crate::prelude::*; use crate::sound::SHUTDOWN; -use crate::util::docker::CONTAINER_TOOL; -use crate::util::{display_none, Invoke}; +use crate::util::Invoke; use crate::PLATFORM; #[derive(Debug, Clone)] @@ -44,28 +41,6 @@ impl Shutdown { tracing::error!("Error Stopping Journald: {}", e); tracing::debug!("{:?}", e); } - if CONTAINER_TOOL == "docker" { - if let Err(e) = Command::new("systemctl") - .arg("stop") - .arg("docker") - .invoke(crate::ErrorKind::Docker) - .await - { - tracing::error!("Error Stopping Docker: {}", e); - tracing::debug!("{:?}", e); - } - } else if CONTAINER_TOOL == "podman" { - if let Err(e) = Command::new("podman") - .arg("rm") - .arg("-f") - .arg("netdummy") - .invoke(crate::ErrorKind::Docker) - .await - { - tracing::error!("Error Stopping Podman: {}", e); - tracing::debug!("{:?}", e); - } - } if let Some((guid, datadir)) = &self.export_args { if let Err(e) = export(guid, datadir).await { tracing::error!("Error Exporting Volume Group: {}", e); @@ -100,8 +75,7 @@ impl Shutdown { } } -#[command(display(display_none))] -pub async fn shutdown(#[context] ctx: RpcContext) -> Result<(), Error> { +pub async fn shutdown(ctx: RpcContext) -> Result<(), Error> { ctx.db .mutate(|db| { db.as_server_info_mut() @@ -120,8 +94,7 @@ pub async fn shutdown(#[context] ctx: RpcContext) -> Result<(), Error> { Ok(()) } -#[command(display(display_none))] -pub async fn restart(#[context] ctx: RpcContext) -> Result<(), Error> { +pub async fn restart(ctx: RpcContext) -> Result<(), Error> { ctx.db .mutate(|db| { db.as_server_info_mut() @@ -140,8 +113,7 @@ pub async fn restart(#[context] ctx: RpcContext) -> Result<(), Error> { Ok(()) } -#[command(display(display_none))] -pub async fn rebuild(#[context] ctx: RpcContext) -> Result<(), Error> { +pub async fn rebuild(ctx: RpcContext) -> Result<(), Error> { tokio::fs::write(SYSTEM_REBUILD_PATH, b"").await?; restart(ctx).await } diff --git a/core/startos/src/ssh.rs b/core/startos/src/ssh.rs index 697e05727..d762b63a0 100644 --- a/core/startos/src/ssh.rs +++ b/core/startos/src/ssh.rs @@ -1,25 +1,33 @@ use std::path::Path; use chrono::Utc; -use clap::ArgMatches; +use clap::builder::ValueParserFactory; +use clap::Parser; use color_eyre::eyre::eyre; -use rpc_toolkit::command; +use rpc_toolkit::{command, from_fn_async, AnyContext, Empty, HandlerExt, ParentHandler}; +use serde::{Deserialize, Serialize}; use sqlx::{Pool, Postgres}; use tracing::instrument; -use crate::context::RpcContext; -use crate::util::display_none; -use crate::util::serde::{display_serializable, IoFormat}; +use crate::context::{CliContext, RpcContext}; +use crate::util::clap::FromStrParser; +use crate::util::serde::{display_serializable, HandlerExtSerde, WithIoFormat}; use crate::{Error, ErrorKind}; static SSH_AUTHORIZED_KEYS_FILE: &str = "/home/start9/.ssh/authorized_keys"; -#[derive(Debug, serde::Deserialize, serde::Serialize)] +#[derive(Clone, Debug, Deserialize, Serialize)] pub struct PubKey( #[serde(serialize_with = "crate::util::serde::serialize_display")] #[serde(deserialize_with = "crate::util::serde::deserialize_from_str")] openssh_keys::PublicKey, ); +impl ValueParserFactory for PubKey { + type Parser = FromStrParser; + fn value_parser() -> Self::Parser { + FromStrParser::new() + } +} #[derive(serde::Serialize, serde::Deserialize)] #[serde(rename_all = "kebab-case")] @@ -50,14 +58,41 @@ impl std::str::FromStr for PubKey { } } -#[command(subcommands(add, delete, list,))] -pub fn ssh() -> Result<(), Error> { - Ok(()) +// #[command(subcommands(add, delete, list,))] +pub fn ssh() -> ParentHandler { + ParentHandler::new() + .subcommand( + "add", + from_fn_async(add) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "delete", + from_fn_async(delete) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "list", + from_fn_async(list) + .with_display_serializable() + .with_custom_display_fn::(|handle, result| { + Ok(display_all_ssh_keys(handle.params, result)) + }) + .with_remote_cli::(), + ) +} + +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct AddParams { + key: PubKey, } -#[command(display(display_none))] #[instrument(skip_all)] -pub async fn add(#[context] ctx: RpcContext, #[arg] key: PubKey) -> Result { +pub async fn add(ctx: RpcContext, AddParams { key }: AddParams) -> Result { let pool = &ctx.secret_store; // check fingerprint for duplicates let fp = key.0.fingerprint_md5(); @@ -90,9 +125,19 @@ pub async fn add(#[context] ctx: RpcContext, #[arg] key: PubKey) -> Result Err(Error::new(eyre!("Duplicate ssh key"), ErrorKind::Duplicate)), } } -#[command(display(display_none))] + +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct DeleteParams { + fingerprint: String, +} + #[instrument(skip_all)] -pub async fn delete(#[context] ctx: RpcContext, #[arg] fingerprint: String) -> Result<(), Error> { +pub async fn delete( + ctx: RpcContext, + DeleteParams { fingerprint }: DeleteParams, +) -> Result<(), Error> { let pool = &ctx.secret_store; // check if fingerprint is in DB // if in DB, remove it from DB @@ -114,11 +159,11 @@ pub async fn delete(#[context] ctx: RpcContext, #[arg] fingerprint: String) -> R } } -fn display_all_ssh_keys(all: Vec, matches: &ArgMatches) { +fn display_all_ssh_keys(params: WithIoFormat, result: Vec) { use prettytable::*; - if matches.is_present("format") { - return display_serializable(all, matches); + if let Some(format) = params.format { + return display_serializable(format, params); } let mut table = Table::new(); @@ -128,7 +173,7 @@ fn display_all_ssh_keys(all: Vec, matches: &ArgMatches) { "FINGERPRINT", "HOSTNAME", ]); - for key in all { + for key in result { let row = row![ &format!("{}", key.created_at), &key.alg, @@ -140,14 +185,8 @@ fn display_all_ssh_keys(all: Vec, matches: &ArgMatches) { table.print_tty(false).unwrap(); } -#[command(display(display_all_ssh_keys))] #[instrument(skip_all)] -pub async fn list( - #[context] ctx: RpcContext, - #[allow(unused_variables)] - #[arg(long = "format")] - format: Option, -) -> Result, Error> { +pub async fn list(ctx: RpcContext, _: Empty) -> Result, Error> { let pool = &ctx.secret_store; // list keys in DB and return them let entries = sqlx::query!("SELECT fingerprint, openssh_pubkey, created_at FROM ssh_keys") diff --git a/core/startos/src/status/health_check.rs b/core/startos/src/status/health_check.rs index 1b3e8f6b5..8189454c7 100644 --- a/core/startos/src/status/health_check.rs +++ b/core/startos/src/status/health_check.rs @@ -1,107 +1,5 @@ -use std::collections::{BTreeMap, BTreeSet}; - -use chrono::{DateTime, Utc}; pub use models::HealthCheckId; -use models::ImageId; use serde::{Deserialize, Serialize}; -use tracing::instrument; - -use crate::context::RpcContext; -use crate::procedure::{NoOutput, PackageProcedure, ProcedureName}; -use crate::s9pk::manifest::PackageId; -use crate::util::serde::Duration; -use crate::util::Version; -use crate::volume::Volumes; -use crate::{Error, ResultExt}; - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct HealthChecks(pub BTreeMap); -impl HealthChecks { - #[instrument(skip_all)] - pub fn validate( - &self, - eos_version: &Version, - volumes: &Volumes, - image_ids: &BTreeSet, - ) -> Result<(), Error> { - for check in self.0.values() { - check - .implementation - .validate(eos_version, volumes, image_ids, false) - .with_ctx(|_| { - ( - crate::ErrorKind::ValidateS9pk, - format!("Health Check {}", check.name), - ) - })?; - } - Ok(()) - } - pub async fn check_all( - &self, - ctx: &RpcContext, - started: DateTime, - pkg_id: &PackageId, - pkg_version: &Version, - volumes: &Volumes, - ) -> Result, Error> { - let res = futures::future::try_join_all(self.0.iter().map(|(id, check)| async move { - Ok::<_, Error>(( - id.clone(), - check - .check(ctx, id, started, pkg_id, pkg_version, volumes) - .await?, - )) - })) - .await?; - Ok(res.into_iter().collect()) - } -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -#[serde(rename_all = "kebab-case")] -pub struct HealthCheck { - pub name: String, - pub success_message: Option, - #[serde(flatten)] - implementation: PackageProcedure, - pub timeout: Option, -} -impl HealthCheck { - #[instrument(skip_all)] - pub async fn check( - &self, - ctx: &RpcContext, - id: &HealthCheckId, - started: DateTime, - pkg_id: &PackageId, - pkg_version: &Version, - volumes: &Volumes, - ) -> Result { - let res = self - .implementation - .execute( - ctx, - pkg_id, - pkg_version, - ProcedureName::Health(id.clone()), - volumes, - Some(Utc::now().signed_duration_since(started).num_milliseconds()), - Some( - self.timeout - .map_or(std::time::Duration::from_secs(30), |d| *d), - ), - ) - .await?; - Ok(match res { - Ok(NoOutput) => HealthCheckResult::Success, - Err((59, _)) => HealthCheckResult::Disabled, - Err((60, _)) => HealthCheckResult::Starting, - Err((61, message)) => HealthCheckResult::Loading { message }, - Err((_, error)) => HealthCheckResult::Failure { error }, - }) - } -} #[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)] #[serde(rename_all = "kebab-case")] diff --git a/core/startos/src/status/mod.rs b/core/startos/src/status/mod.rs index 2a5a9391f..ffc1a98bb 100644 --- a/core/startos/src/status/mod.rs +++ b/core/startos/src/status/mod.rs @@ -1,6 +1,7 @@ use std::collections::BTreeMap; use chrono::{DateTime, Utc}; +use imbl::OrdMap; use models::PackageId; use serde::{Deserialize, Serialize}; @@ -34,15 +35,17 @@ impl Map for DependencyConfigErrors { pub enum MainStatus { Stopped, Restarting, - Stopping, + Stopping { + timeout: crate::util::serde::Duration, + }, Starting, Running { started: DateTime, - health: BTreeMap, + health: OrdMap, }, BackingUp { started: Option>, - health: BTreeMap, + health: OrdMap, }, } impl MainStatus { @@ -54,29 +57,29 @@ impl MainStatus { started: Some(_), .. } => true, MainStatus::Stopped - | MainStatus::Stopping + | MainStatus::Stopping { .. } | MainStatus::Restarting | MainStatus::BackingUp { started: None, .. } => false, } } - pub fn stop(&mut self) { - match self { - MainStatus::Starting { .. } | MainStatus::Running { .. } => { - *self = MainStatus::Stopping; - } - MainStatus::BackingUp { started, .. } => { - *started = None; - } - MainStatus::Stopped | MainStatus::Stopping | MainStatus::Restarting => (), - } - } + // pub fn stop(&mut self) { + // match self { + // MainStatus::Starting { .. } | MainStatus::Running { .. } => { + // *self = MainStatus::Stopping; + // } + // MainStatus::BackingUp { started, .. } => { + // *started = None; + // } + // MainStatus::Stopped | MainStatus::Stopping | MainStatus::Restarting => (), + // } + // } pub fn started(&self) -> Option> { match self { MainStatus::Running { started, .. } => Some(*started), MainStatus::BackingUp { started, .. } => *started, MainStatus::Stopped => None, MainStatus::Restarting => None, - MainStatus::Stopping => None, + MainStatus::Stopping { .. } => None, MainStatus::Starting { .. } => None, } } @@ -84,7 +87,7 @@ impl MainStatus { let (started, health) = match self { MainStatus::Starting { .. } => (Some(Utc::now()), Default::default()), MainStatus::Running { started, health } => (Some(started.clone()), health.clone()), - MainStatus::Stopped | MainStatus::Stopping | MainStatus::Restarting => { + MainStatus::Stopped | MainStatus::Stopping { .. } | MainStatus::Restarting => { (None, Default::default()) } MainStatus::BackingUp { .. } => return self.clone(), diff --git a/core/startos/src/system.rs b/core/startos/src/system.rs index b5cd42844..5a5509da7 100644 --- a/core/startos/src/system.rs +++ b/core/startos/src/system.rs @@ -2,11 +2,11 @@ use std::collections::BTreeSet; use std::fmt; use chrono::Utc; -use clap::ArgMatches; +use clap::Parser; use color_eyre::eyre::eyre; use futures::FutureExt; -use rpc_toolkit::command; use rpc_toolkit::yajrc::RpcError; +use rpc_toolkit::{command, from_fn_async, AnyContext, Empty, HandlerExt, ParentHandler}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use tokio::process::Command; use tokio::sync::broadcast::Receiver; @@ -22,13 +22,27 @@ use crate::logs::{ use crate::prelude::*; use crate::shutdown::Shutdown; use crate::util::cpupower::{get_available_governors, set_governor, Governor}; -use crate::util::serde::{display_serializable, IoFormat}; -use crate::util::{display_none, Invoke}; +use crate::util::serde::{display_serializable, HandlerExtSerde, WithIoFormat}; +use crate::util::Invoke; use crate::{Error, ErrorKind, ResultExt}; -#[command(subcommands(zram, governor))] -pub async fn experimental() -> Result<(), Error> { - Ok(()) +pub fn experimental() -> ParentHandler { + ParentHandler::new() + .subcommand( + "zram", + from_fn_async(zram) + .no_display() + .with_remote_cli::(), + ) + .subcommand( + "governor", + from_fn_async(governor) + .with_display_serializable() + .with_custom_display_fn::(|handle, result| { + Ok(display_governor_info(handle.params, result)) + }) + .with_remote_cli::(), + ) } pub async fn enable_zram() -> Result<(), Error> { @@ -59,8 +73,14 @@ pub async fn enable_zram() -> Result<(), Error> { Ok(()) } -#[command(display(display_none))] -pub async fn zram(#[context] ctx: RpcContext, #[arg] enable: bool) -> Result<(), Error> { +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct ZramParams { + enable: bool, +} + +pub async fn zram(ctx: RpcContext, ZramParams { enable }: ZramParams) -> Result<(), Error> { let db = ctx.db.peek().await; let zram = db.as_server_info().as_zram().de()?; @@ -93,17 +113,17 @@ pub struct GovernorInfo { available: BTreeSet, } -fn display_governor_info(arg: GovernorInfo, matches: &ArgMatches) { +fn display_governor_info(params: WithIoFormat, result: GovernorInfo) { use prettytable::*; - if matches.is_present("format") { - return display_serializable(arg, matches); + if let Some(format) = params.format { + return display_serializable(format, params); } let mut table = Table::new(); table.add_row(row![bc -> "GOVERNORS"]); - for entry in arg.available { - if Some(&entry) == arg.current.as_ref() { + for entry in result.available { + if Some(&entry) == result.current.as_ref() { table.add_row(row![g -> format!("* {entry} (current)")]); } else { table.add_row(row![entry]); @@ -112,13 +132,16 @@ fn display_governor_info(arg: GovernorInfo, matches: &ArgMatches) { table.print_tty(false).unwrap(); } -#[command(display(display_governor_info))] +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct GovernorParams { + set: Option, +} + pub async fn governor( - #[context] ctx: RpcContext, - #[allow(unused_variables)] - #[arg(long = "format")] - format: Option, - #[arg] set: Option, + ctx: RpcContext, + GovernorParams { set, .. }: GovernorParams, ) -> Result { let available = get_available_governors().await?; if let Some(set) = set { @@ -143,13 +166,13 @@ pub struct TimeInfo { uptime: u64, } -fn display_time(arg: TimeInfo, matches: &ArgMatches) { +pub fn display_time(params: WithIoFormat, arg: TimeInfo) { use std::fmt::Write; use prettytable::*; - if matches.is_present("format") { - return display_serializable(arg, matches); + if let Some(format) = params.format { + return display_serializable(format, arg); } let days = arg.uptime / (24 * 60 * 60); @@ -185,35 +208,57 @@ fn display_time(arg: TimeInfo, matches: &ArgMatches) { table.print_tty(false).unwrap(); } -#[command(display(display_time))] -pub async fn time( - #[context] ctx: RpcContext, - #[allow(unused_variables)] - #[arg(long = "format")] - format: Option, -) -> Result { +pub async fn time(ctx: RpcContext, _: Empty) -> Result { Ok(TimeInfo { now: Utc::now().to_rfc3339(), uptime: ctx.start_time.elapsed().as_secs(), }) } - -#[command( - custom_cli(cli_logs(async, context(CliContext))), - subcommands(self(logs_nofollow(async)), logs_follow), - display(display_none) -)] -pub async fn logs( - #[arg(short = 'l', long = "limit")] limit: Option, - #[arg(short = 'c', long = "cursor")] cursor: Option, - #[arg(short = 'B', long = "before", default)] before: bool, - #[arg(short = 'f', long = "follow", default)] follow: bool, -) -> Result<(Option, Option, bool, bool), Error> { - Ok((limit, cursor, before, follow)) +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct LogsParams { + #[arg(short = 'l', long = "limit")] + limit: Option, + #[arg(short = 'c', long = "cursor")] + cursor: Option, + #[arg(short = 'B', long = "before")] + #[serde(default)] + before: bool, + #[arg(short = 'f', long = "follow")] + #[serde(default)] + follow: bool, +} + +pub fn logs() -> ParentHandler { + ParentHandler::new() + .root_handler( + from_fn_async(cli_logs) + .no_display() + .with_inherited(|params, _| params), + ) + .root_handler( + from_fn_async(logs_nofollow) + .with_inherited(|params, _| params) + .no_cli(), + ) + .subcommand( + "follow", + from_fn_async(logs_follow) + .with_inherited(|params, _| params) + .no_cli(), + ) } + pub async fn cli_logs( ctx: CliContext, - (limit, cursor, before, follow): (Option, Option, bool, bool), + _: Empty, + LogsParams { + limit, + cursor, + before, + follow, + }: LogsParams, ) -> Result<(), RpcError> { if follow { if cursor.is_some() { @@ -234,37 +279,68 @@ pub async fn cli_logs( } } pub async fn logs_nofollow( - _ctx: (), - (limit, cursor, before, _): (Option, Option, bool, bool), + _ctx: AnyContext, + _: Empty, + LogsParams { + limit, + cursor, + before, + .. + }: LogsParams, ) -> Result { fetch_logs(LogSource::System, limit, cursor, before).await } -#[command(rpc_only, rename = "follow", display(display_none))] pub async fn logs_follow( - #[context] ctx: RpcContext, - #[parent_data] (limit, _, _, _): (Option, Option, bool, bool), + ctx: RpcContext, + _: Empty, + LogsParams { limit, .. }: LogsParams, ) -> Result { follow_logs(ctx, LogSource::System, limit).await } - -#[command( - rename = "kernel-logs", - custom_cli(cli_kernel_logs(async, context(CliContext))), - subcommands(self(kernel_logs_nofollow(async)), kernel_logs_follow), - display(display_none) -)] -pub async fn kernel_logs( - #[arg(short = 'l', long = "limit")] limit: Option, - #[arg(short = 'c', long = "cursor")] cursor: Option, - #[arg(short = 'B', long = "before", default)] before: bool, - #[arg(short = 'f', long = "follow", default)] follow: bool, -) -> Result<(Option, Option, bool, bool), Error> { - Ok((limit, cursor, before, follow)) +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct KernelLogsParams { + #[arg(short = 'l', long = "limit")] + limit: Option, + #[arg(short = 'c', long = "cursor")] + cursor: Option, + #[arg(short = 'B', long = "before")] + #[serde(default)] + before: bool, + #[arg(short = 'f', long = "follow")] + #[serde(default)] + follow: bool, +} +pub fn kernel_logs() -> ParentHandler { + ParentHandler::new() + .root_handler( + from_fn_async(cli_kernel_logs) + .no_display() + .with_inherited(|params, _| params), + ) + .root_handler( + from_fn_async(kernel_logs_nofollow) + .with_inherited(|params, _| params) + .no_cli(), + ) + .subcommand( + "follow", + from_fn_async(kernel_logs_follow) + .with_inherited(|params, _| params) + .no_cli(), + ) } pub async fn cli_kernel_logs( ctx: CliContext, - (limit, cursor, before, follow): (Option, Option, bool, bool), + _: Empty, + KernelLogsParams { + limit, + cursor, + before, + follow, + }: KernelLogsParams, ) -> Result<(), RpcError> { if follow { if cursor.is_some() { @@ -285,16 +361,22 @@ pub async fn cli_kernel_logs( } } pub async fn kernel_logs_nofollow( - _ctx: (), - (limit, cursor, before, _): (Option, Option, bool, bool), + _ctx: AnyContext, + _: Empty, + KernelLogsParams { + limit, + cursor, + before, + .. + }: KernelLogsParams, ) -> Result { fetch_logs(LogSource::Kernel, limit, cursor, before).await } -#[command(rpc_only, rename = "follow", display(display_none))] pub async fn kernel_logs_follow( - #[context] ctx: RpcContext, - #[parent_data] (limit, _, _, _): (Option, Option, bool, bool), + ctx: RpcContext, + _: Empty, + KernelLogsParams { limit, .. }: KernelLogsParams, ) -> Result { follow_logs(ctx, LogSource::Kernel, limit).await } @@ -453,13 +535,8 @@ pub struct Metrics { disk: MetricsDisk, } -#[command(display(display_serializable))] -pub async fn metrics( - #[context] ctx: RpcContext, - #[allow(unused_variables)] - #[arg(long = "format")] - format: Option, -) -> Result { +// #[command(display(display_serializable))] +pub async fn metrics(ctx: RpcContext, _: Empty) -> Result { match ctx.metrics_cache.read().await.clone() { None => Err(Error { source: color_eyre::eyre::eyre!("No Metrics Found"), diff --git a/core/startos/src/update/mod.rs b/core/startos/src/update/mod.rs index 4ce57a8d1..a1d9a8363 100644 --- a/core/startos/src/update/mod.rs +++ b/core/startos/src/update/mod.rs @@ -1,13 +1,14 @@ use std::path::PathBuf; use std::sync::atomic::{AtomicBool, Ordering}; -use clap::ArgMatches; +use clap::Parser; use color_eyre::eyre::{eyre, Result}; use emver::Version; use helpers::{Rsync, RsyncOptions}; use lazy_static::lazy_static; use reqwest::Url; use rpc_toolkit::command; +use serde::{Deserialize, Serialize}; use tokio::process::Command; use tokio_stream::StreamExt; use tracing::instrument; @@ -33,17 +34,19 @@ lazy_static! { static ref UPDATED: AtomicBool = AtomicBool::new(false); } +#[derive(Deserialize, Serialize, Parser)] +#[serde(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] +pub struct UpdateSystemParams { + marketplace_url: Url, +} + /// An user/ daemon would call this to update the system to the latest version and do the updates available, /// and this will return something if there is an update, and in that case there will need to be a restart. -#[command( - rename = "update", - display(display_update_result), - metadata(sync_db = true) -)] #[instrument(skip_all)] pub async fn update_system( - #[context] ctx: RpcContext, - #[arg(rename = "marketplace-url")] marketplace_url: Url, + ctx: RpcContext, + UpdateSystemParams { marketplace_url }: UpdateSystemParams, ) -> Result { if UPDATED.load(Ordering::SeqCst) { return Ok(UpdateResult::NoUpdates); @@ -63,7 +66,7 @@ pub enum UpdateResult { Updating, } -fn display_update_result(status: UpdateResult, _: &ArgMatches) { +pub fn display_update_result(params: UpdateSystemParams, status: UpdateResult) { match status { UpdateResult::Updating => { println!("Updating..."); diff --git a/core/startos/src/upload.rs b/core/startos/src/upload.rs new file mode 100644 index 000000000..91651df51 --- /dev/null +++ b/core/startos/src/upload.rs @@ -0,0 +1,272 @@ +use std::path::PathBuf; +use std::pin::Pin; +use std::sync::Arc; +use std::task::Poll; +use std::time::Duration; + +use axum::body::Body; +use axum::response::Response; +use clap::Parser; +use futures::{FutureExt, StreamExt}; +use http::header::CONTENT_LENGTH; +use http::StatusCode; +use tokio::fs::File; +use tokio::io::{AsyncRead, AsyncWrite, AsyncWriteExt}; +use tokio::sync::{watch, OwnedMutexGuard}; + +use crate::context::RpcContext; +use crate::core::rpc_continuations::{RequestGuid, RpcContinuation}; +use crate::prelude::*; +use crate::s9pk::merkle_archive::source::multi_cursor_file::{FileSectionReader, MultiCursorFile}; +use crate::s9pk::merkle_archive::source::ArchiveSource; +use crate::util::io::TmpDir; + +pub async fn upload(ctx: &RpcContext) -> Result<(RequestGuid, UploadingFile), Error> { + let guid = RequestGuid::new(); + let (mut handle, file) = UploadingFile::new().await?; + ctx.add_continuation( + guid.clone(), + RpcContinuation::rest( + Box::new(|request| { + async move { + let headers = request.headers(); + let content_length = match headers.get(CONTENT_LENGTH).map(|a| a.to_str()) { + None => { + return Response::builder() + .status(StatusCode::BAD_REQUEST) + .body(Body::from("Content-Length is required")) + .with_kind(ErrorKind::Network) + } + Some(Err(_)) => { + return Response::builder() + .status(StatusCode::BAD_REQUEST) + .body(Body::from("Invalid Content-Length")) + .with_kind(ErrorKind::Network) + } + Some(Ok(a)) => match a.parse::() { + Err(_) => { + return Response::builder() + .status(StatusCode::BAD_REQUEST) + .body(Body::from("Invalid Content-Length")) + .with_kind(ErrorKind::Network) + } + Ok(a) => a, + }, + }; + + handle + .progress + .send_modify(|p| p.expected_size = Some(content_length)); + + let mut body = request.into_body().into_data_stream(); + while let Some(next) = body.next().await { + if let Err(e) = async { + handle + .write_all(&next.map_err(|e| { + std::io::Error::new(std::io::ErrorKind::Other, e) + })?) + .await?; + Ok(()) + } + .await + { + handle.progress.send_if_modified(|p| p.handle_error(&e)); + break; + } + } + + Response::builder() + .status(StatusCode::NO_CONTENT) + .body(Body::empty()) + .with_kind(ErrorKind::Network) + } + .boxed() + }), + Duration::from_secs(30), + ), + ) + .await; + Ok((guid, file)) +} + +#[derive(Default)] +struct Progress { + expected_size: Option, + written: u64, + error: Option, +} +impl Progress { + fn handle_error(&mut self, e: &std::io::Error) -> bool { + if self.error.is_none() { + self.error = Some(Error::new(eyre!("{e}"), ErrorKind::Network)); + true + } else { + false + } + } + fn handle_write(&mut self, res: &std::io::Result) -> bool { + match res { + Ok(a) => { + self.written += *a as u64; + true + } + Err(e) => self.handle_error(e), + } + } + async fn expected_size(watch: &mut watch::Receiver) -> Option { + watch + .wait_for(|progress| progress.error.is_some() || progress.expected_size.is_some()) + .await + .ok() + .and_then(|a| a.expected_size) + } + async fn ready_for(watch: &mut watch::Receiver, size: u64) -> Result<(), Error> { + if let Some(e) = watch + .wait_for(|progress| progress.error.is_some() || progress.written >= size) + .await + .map_err(|_| { + Error::new( + eyre!("failed to determine upload progress"), + ErrorKind::Network, + ) + })? + .error + .as_ref() + .map(|e| e.clone_output()) + { + Err(e) + } else { + Ok(()) + } + } + fn complete(&mut self) -> bool { + match self { + Self { + expected_size: Some(size), + written, + .. + } if *written == *size => false, + Self { + expected_size: Some(size), + written, + error, + } if *written > *size && error.is_none() => { + *error = Some(Error::new( + eyre!("Too many bytes received"), + ErrorKind::Network, + )); + true + } + Self { error, .. } if error.is_none() => { + *error = Some(Error::new( + eyre!("Connection closed or timed out before full file received"), + ErrorKind::Network, + )); + true + } + _ => false, + } + } +} + +#[derive(Clone)] +pub struct UploadingFile { + tmp_dir: Arc, + file: MultiCursorFile, + progress: watch::Receiver, +} +impl UploadingFile { + pub async fn new() -> Result<(UploadHandle, Self), Error> { + let progress = watch::channel(Progress::default()); + let tmp_dir = Arc::new(TmpDir::new().await?); + let file = File::create(tmp_dir.join("upload.tmp")).await?; + let uploading = Self { + tmp_dir, + file: MultiCursorFile::open(&file).await?, + progress: progress.1, + }; + Ok(( + UploadHandle { + file, + progress: progress.0, + }, + uploading, + )) + } + pub async fn delete(self) -> Result<(), Error> { + if let Ok(tmp_dir) = Arc::try_unwrap(self.tmp_dir) { + tmp_dir.delete().await?; + } + Ok(()) + } +} +#[async_trait::async_trait] +impl ArchiveSource for UploadingFile { + type Reader = ::Reader; + async fn size(&self) -> Option { + Progress::expected_size(&mut self.progress.clone()).await + } + async fn fetch(&self, position: u64, size: u64) -> Result { + Progress::ready_for(&mut self.progress.clone(), position + size).await?; + self.file.fetch(position, size).await + } +} + +#[pin_project::pin_project(PinnedDrop)] +pub struct UploadHandle { + #[pin] + file: File, + progress: watch::Sender, +} +#[pin_project::pinned_drop] +impl PinnedDrop for UploadHandle { + fn drop(self: Pin<&mut Self>) { + let this = self.project(); + this.progress.send_if_modified(|p| p.complete()); + } +} +impl AsyncWrite for UploadHandle { + fn poll_write( + self: Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + buf: &[u8], + ) -> Poll> { + let this = self.project(); + match this.file.poll_write(cx, buf) { + Poll::Ready(res) => { + this.progress + .send_if_modified(|progress| progress.handle_write(&res)); + Poll::Ready(res) + } + Poll::Pending => Poll::Pending, + } + } + fn poll_flush( + self: Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + ) -> Poll> { + let this = self.project(); + match this.file.poll_flush(cx) { + Poll::Ready(Err(e)) => { + this.progress + .send_if_modified(|progress| progress.handle_error(&e)); + Poll::Ready(Err(e)) + } + a => a, + } + } + fn poll_shutdown( + self: Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + ) -> Poll> { + let this = self.project(); + match this.file.poll_shutdown(cx) { + Poll::Ready(Err(e)) => { + this.progress + .send_if_modified(|progress| progress.handle_error(&e)); + Poll::Ready(Err(e)) + } + a => a, + } + } +} diff --git a/core/startos/src/util/actor.rs b/core/startos/src/util/actor.rs new file mode 100644 index 000000000..89ee948e5 --- /dev/null +++ b/core/startos/src/util/actor.rs @@ -0,0 +1,192 @@ +use std::any::Any; +use std::future::ready; +use std::time::Duration; + +use futures::future::BoxFuture; +use futures::{Future, FutureExt, TryFutureExt}; +use helpers::NonDetachingJoinHandle; +use tokio::sync::oneshot::error::TryRecvError; +use tokio::sync::{mpsc, oneshot}; + +use crate::prelude::*; +use crate::util::Never; + +pub trait Actor: Send + 'static { + #[allow(unused_variables)] + fn init(&mut self, jobs: &mut BackgroundJobs) {} +} + +#[async_trait::async_trait] +pub trait Handler: Actor { + type Response: Any + Send; + async fn handle(&mut self, msg: M, jobs: &mut BackgroundJobs) -> Self::Response; +} + +#[async_trait::async_trait] +trait Message: Send { + async fn handle_with( + self: Box, + actor: &mut A, + jobs: &mut BackgroundJobs, + ) -> Box; +} +#[async_trait::async_trait] +impl Message for M +where + A: Handler, +{ + async fn handle_with( + self: Box, + actor: &mut A, + jobs: &mut BackgroundJobs, + ) -> Box { + Box::new(actor.handle(*self, jobs).await) + } +} + +type Request = (Box>, oneshot::Sender>); + +#[derive(Default)] +pub struct BackgroundJobs { + jobs: Vec>, +} +impl BackgroundJobs { + pub fn add_job(&mut self, fut: impl Future + Send + 'static) { + self.jobs.push(fut.boxed()); + } +} +impl Future for BackgroundJobs { + type Output = Never; + fn poll( + mut self: std::pin::Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll { + let complete = self + .jobs + .iter_mut() + .enumerate() + .filter_map(|(i, f)| match f.poll_unpin(cx) { + std::task::Poll::Pending => None, + std::task::Poll::Ready(_) => Some(i), + }) + .collect::>(); + for idx in complete.into_iter().rev() { + #[allow(clippy::let_underscore_future)] + let _ = self.jobs.swap_remove(idx); + } + std::task::Poll::Pending + } +} + +pub struct SimpleActor { + shutdown: oneshot::Sender<()>, + runtime: NonDetachingJoinHandle<()>, + messenger: mpsc::UnboundedSender>, +} +impl SimpleActor { + pub fn new(mut actor: A) -> Self { + let (shutdown_send, mut shutdown_recv) = oneshot::channel(); + let (messenger_send, mut messenger_recv) = mpsc::unbounded_channel::>(); + let runtime = NonDetachingJoinHandle::from(tokio::spawn(async move { + let mut bg = BackgroundJobs::default(); + actor.init(&mut bg); + loop { + tokio::select! { + _ = &mut bg => (), + msg = messenger_recv.recv() => match msg { + Some((msg, reply)) if shutdown_recv.try_recv() == Err(TryRecvError::Empty) => { + let mut new_bg = BackgroundJobs::default(); + tokio::select! { + res = msg.handle_with(&mut actor, &mut new_bg) => { reply.send(res); }, + _ = &mut bg => (), + } + bg.jobs.append(&mut new_bg.jobs); + } + _ => break, + }, + } + } + })); + Self { + shutdown: shutdown_send, + runtime, + messenger: messenger_send, + } + } + + /// Message is guaranteed to be queued immediately + pub fn queue( + &self, + message: M, + ) -> impl Future> + where + A: Handler, + { + if self.runtime.is_finished() { + return futures::future::Either::Left(ready(Err(Error::new( + eyre!("actor runtime has exited"), + ErrorKind::Unknown, + )))); + } + let (reply_send, reply_recv) = oneshot::channel(); + self.messenger.send((Box::new(message), reply_send)); + futures::future::Either::Right( + reply_recv + .map_err(|_| Error::new(eyre!("actor runtime has exited"), ErrorKind::Unknown)) + .and_then(|a| { + ready( + a.downcast() + .map_err(|_| { + Error::new( + eyre!("received incorrect type in response"), + ErrorKind::Incoherent, + ) + }) + .map(|a| *a), + ) + }), + ) + } + + pub async fn send(&self, message: M) -> Result + where + A: Handler, + { + self.queue(message).await + } + + pub async fn shutdown(self, strategy: PendingMessageStrategy) { + drop(self.messenger); + let timeout = match strategy { + PendingMessageStrategy::CancelAll => { + self.shutdown.send(()); + Some(Duration::from_secs(0)) + } + PendingMessageStrategy::FinishCurrentCancelPending { timeout } => { + self.shutdown.send(()); + timeout + } + PendingMessageStrategy::FinishAll { timeout } => timeout, + }; + let aborter = if let Some(timeout) = timeout { + let hdl = self.runtime.abort_handle(); + async move { + tokio::time::sleep(timeout).await; + hdl.abort(); + } + .boxed() + } else { + futures::future::pending().boxed() + }; + tokio::select! { + _ = aborter => (), + _ = self.runtime => (), + } + } +} + +pub enum PendingMessageStrategy { + CancelAll, + FinishCurrentCancelPending { timeout: Option }, + FinishAll { timeout: Option }, +} diff --git a/core/startos/src/util/clap.rs b/core/startos/src/util/clap.rs new file mode 100644 index 000000000..7c3b5a0bc --- /dev/null +++ b/core/startos/src/util/clap.rs @@ -0,0 +1,36 @@ +use std::marker::PhantomData; +use std::str::FromStr; + +use clap::builder::TypedValueParser; + +use crate::prelude::*; + +pub struct FromStrParser(PhantomData); +impl FromStrParser { + pub fn new() -> Self { + Self(PhantomData) + } +} +impl Clone for FromStrParser { + fn clone(&self) -> Self { + Self(PhantomData) + } +} +impl TypedValueParser for FromStrParser +where + T: FromStr + Clone + Send + Sync + 'static, + T::Err: std::fmt::Display, +{ + type Value = T; + fn parse_ref( + &self, + _: &clap::Command, + _: Option<&clap::Arg>, + value: &std::ffi::OsStr, + ) -> Result { + value + .to_string_lossy() + .parse() + .map_err(|e| clap::Error::raw(clap::error::ErrorKind::ValueValidation, e)) + } +} diff --git a/core/startos/src/util/config.rs b/core/startos/src/util/config.rs deleted file mode 100644 index f719f563f..000000000 --- a/core/startos/src/util/config.rs +++ /dev/null @@ -1,58 +0,0 @@ -use std::fs::File; -use std::path::{Path, PathBuf}; - -use patch_db::Value; -use serde::Deserialize; - -use crate::prelude::*; -use crate::util::serde::IoFormat; -use crate::{Config, Error}; - -pub const DEVICE_CONFIG_PATH: &str = "/media/embassy/config/config.yaml"; -pub const CONFIG_PATH: &str = "/etc/embassy/config.yaml"; -pub const CONFIG_PATH_LOCAL: &str = ".embassy/config.yaml"; - -pub fn local_config_path() -> Option { - if let Ok(home) = std::env::var("HOME") { - Some(Path::new(&home).join(CONFIG_PATH_LOCAL)) - } else { - None - } -} - -/// BLOCKING -pub fn load_config_from_paths<'a, T: for<'de> Deserialize<'de>>( - paths: impl IntoIterator>, -) -> Result { - let mut config = Default::default(); - for path in paths { - if path.as_ref().exists() { - let format: IoFormat = path - .as_ref() - .extension() - .and_then(|s| s.to_str()) - .map(|f| f.parse()) - .transpose()? - .unwrap_or_default(); - let new = format.from_reader(File::open(path)?)?; - config = merge_configs(config, new); - } - } - from_value(Value::Object(config)) -} - -pub fn merge_configs(mut first: Config, second: Config) -> Config { - for (k, v) in second.into_iter() { - let new = match first.remove(&k) { - None => v, - Some(old) => match (old, v) { - (Value::Object(first), Value::Object(second)) => { - Value::Object(merge_configs(first, second)) - } - (first, _) => first, - }, - }; - first.insert(k, new); - } - first -} diff --git a/core/startos/src/util/crypto.rs b/core/startos/src/util/crypto.rs index 5c1aed01e..aaafe6536 100644 --- a/core/startos/src/util/crypto.rs +++ b/core/startos/src/util/crypto.rs @@ -7,3 +7,119 @@ pub fn ed25519_expand_key(key: &SecretKey) -> [u8; EXPANDED_SECRET_KEY_LENGTH] { ) .to_bytes() } + +use aes::cipher::{CipherKey, NewCipher, Nonce, StreamCipher}; +use aes::Aes256Ctr; +use hmac::Hmac; +use josekit::jwk::Jwk; +use serde::{Deserialize, Serialize}; +use sha2::Sha256; +use tracing::instrument; + +pub fn pbkdf2(password: impl AsRef<[u8]>, salt: impl AsRef<[u8]>) -> CipherKey { + let mut aeskey = CipherKey::::default(); + pbkdf2::pbkdf2::>( + password.as_ref(), + salt.as_ref(), + 1000, + aeskey.as_mut_slice(), + ) + .unwrap(); + aeskey +} + +pub fn encrypt_slice(input: impl AsRef<[u8]>, password: impl AsRef<[u8]>) -> Vec { + let prefix: [u8; 32] = rand::random(); + let aeskey = pbkdf2(password.as_ref(), &prefix[16..]); + let ctr = Nonce::::from_slice(&prefix[..16]); + let mut aes = Aes256Ctr::new(&aeskey, ctr); + let mut res = Vec::with_capacity(32 + input.as_ref().len()); + res.extend_from_slice(&prefix[..]); + res.extend_from_slice(input.as_ref()); + aes.apply_keystream(&mut res[32..]); + res +} + +pub fn decrypt_slice(input: impl AsRef<[u8]>, password: impl AsRef<[u8]>) -> Vec { + if input.as_ref().len() < 32 { + return Vec::new(); + } + let (prefix, rest) = input.as_ref().split_at(32); + let aeskey = pbkdf2(password.as_ref(), &prefix[16..]); + let ctr = Nonce::::from_slice(&prefix[..16]); + let mut aes = Aes256Ctr::new(&aeskey, ctr); + let mut res = rest.to_vec(); + aes.apply_keystream(&mut res); + res +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct EncryptedWire { + encrypted: serde_json::Value, +} +impl EncryptedWire { + #[instrument(skip_all)] + pub fn decrypt(self, current_secret: impl AsRef) -> Option { + let current_secret = current_secret.as_ref(); + + let decrypter = match josekit::jwe::alg::ecdh_es::EcdhEsJweAlgorithm::EcdhEs + .decrypter_from_jwk(current_secret) + { + Ok(a) => a, + Err(e) => { + tracing::warn!("Could not setup awk"); + tracing::debug!("{:?}", e); + return None; + } + }; + let encrypted = match serde_json::to_string(&self.encrypted) { + Ok(a) => a, + Err(e) => { + tracing::warn!("Could not deserialize"); + tracing::debug!("{:?}", e); + + return None; + } + }; + let (decoded, _) = match josekit::jwe::deserialize_json(&encrypted, &decrypter) { + Ok(a) => a, + Err(e) => { + tracing::warn!("Could not decrypt"); + tracing::debug!("{:?}", e); + return None; + } + }; + match String::from_utf8(decoded) { + Ok(a) => Some(a), + Err(e) => { + tracing::warn!("Could not decrypt into utf8"); + tracing::debug!("{:?}", e); + return None; + } + } + } +} + +/// We created this test by first making the private key, then restoring from this private key for recreatability. +/// After this the frontend then encoded an password, then we are testing that the output that we got (hand coded) +/// will be the shape we want. +#[test] +fn test_gen_awk() { + let private_key: Jwk = serde_json::from_str( + r#"{ + "kty": "EC", + "crv": "P-256", + "d": "3P-MxbUJtEhdGGpBCRFXkUneGgdyz_DGZWfIAGSCHOU", + "x": "yHTDYSfjU809fkSv9MmN4wuojf5c3cnD7ZDN13n-jz4", + "y": "8Mpkn744A5KDag0DmX2YivB63srjbugYZzWc3JOpQXI" + }"#, + ) + .unwrap(); + let encrypted: EncryptedWire = serde_json::from_str(r#"{ + "encrypted": { "protected": "eyJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWxnIjoiRUNESC1FUyIsImtpZCI6ImgtZnNXUVh2Tm95dmJEazM5dUNsQ0NUdWc5N3MyZnJockJnWUVBUWVtclUiLCJlcGsiOnsia3R5IjoiRUMiLCJjcnYiOiJQLTI1NiIsIngiOiJmRkF0LXNWYWU2aGNkdWZJeUlmVVdUd3ZvWExaTkdKRHZIWVhIckxwOXNNIiwieSI6IjFvVFN6b00teHlFZC1SLUlBaUFHdXgzS1dJZmNYZHRMQ0JHLUh6MVkzY2sifX0", "iv": "NbwvfvWOdLpZfYRIZUrkcw", "ciphertext": "Zc5Br5kYOlhPkIjQKOLMJw", "tag": "EPoch52lDuCsbUUulzZGfg" } + }"#).unwrap(); + assert_eq!( + "testing12345", + &encrypted.decrypt(std::sync::Arc::new(private_key)).unwrap() + ); +} diff --git a/core/startos/src/util/docker.rs b/core/startos/src/util/docker.rs deleted file mode 100644 index fb6bc15f4..000000000 --- a/core/startos/src/util/docker.rs +++ /dev/null @@ -1,239 +0,0 @@ -use std::net::Ipv4Addr; -use std::time::Duration; - -use models::{Error, ErrorKind, PackageId, ResultExt, Version}; -use nix::sys::signal::Signal; -use tokio::process::Command; - -use crate::util::Invoke; - -#[cfg(feature = "docker")] -pub const CONTAINER_TOOL: &str = "docker"; -#[cfg(not(feature = "docker"))] -pub const CONTAINER_TOOL: &str = "podman"; - -#[cfg(feature = "docker")] -pub const CONTAINER_DATADIR: &str = "/var/lib/docker"; -#[cfg(not(feature = "docker"))] -pub const CONTAINER_DATADIR: &str = "/var/lib/containers"; - -pub struct DockerImageSha(String); - -// docker images start9/${package}/*:${version} -q --no-trunc -pub async fn images_for( - package: &PackageId, - version: &Version, -) -> Result, Error> { - Ok(String::from_utf8( - Command::new(CONTAINER_TOOL) - .arg("images") - .arg(format!("start9/{package}/*:{version}")) - .arg("--no-trunc") - .arg("-q") - .invoke(ErrorKind::Docker) - .await?, - )? - .lines() - .map(|l| DockerImageSha(l.trim().to_owned())) - .collect()) -} - -// docker rmi -f ${sha} -pub async fn remove_image(sha: &DockerImageSha) -> Result<(), Error> { - match Command::new(CONTAINER_TOOL) - .arg("rmi") - .arg("-f") - .arg(&sha.0) - .invoke(ErrorKind::Docker) - .await - .map(|_| ()) - { - Err(e) - if e.source - .to_string() - .to_ascii_lowercase() - .contains("no such image") => - { - Ok(()) - } - a => a, - }?; - Ok(()) -} - -// docker image prune -f -pub async fn prune_images() -> Result<(), Error> { - Command::new(CONTAINER_TOOL) - .arg("image") - .arg("prune") - .arg("-f") - .invoke(ErrorKind::Docker) - .await?; - Ok(()) -} - -// docker container inspect ${name} --format '{{.NetworkSettings.Networks.start9.IPAddress}}' -pub async fn get_container_ip(name: &str) -> Result, Error> { - match Command::new(CONTAINER_TOOL) - .arg("container") - .arg("inspect") - .arg(name) - .arg("--format") - .arg("{{.NetworkSettings.Networks.start9.IPAddress}}") - .invoke(ErrorKind::Docker) - .await - { - Err(e) - if e.source - .to_string() - .to_ascii_lowercase() - .contains("no such container") => - { - Ok(None) - } - Err(e) => Err(e), - Ok(a) => { - let out = std::str::from_utf8(&a)?.trim(); - if out.is_empty() { - Ok(None) - } else { - Ok(Some({ - out.parse() - .with_ctx(|_| (ErrorKind::ParseNetAddress, out.to_string()))? - })) - } - } - } -} - -// docker stop -t ${timeout} -s ${signal} ${name} -pub async fn stop_container( - name: &str, - timeout: Option, - signal: Option, -) -> Result<(), Error> { - let mut cmd = Command::new(CONTAINER_TOOL); - cmd.arg("stop"); - if let Some(dur) = timeout { - cmd.arg("-t").arg(dur.as_secs().to_string()); - } - if let Some(sig) = signal { - cmd.arg("-s").arg(sig.to_string()); - } - cmd.arg(name); - match cmd.invoke(ErrorKind::Docker).await { - Ok(_) => Ok(()), - Err(mut e) - if e.source - .to_string() - .to_ascii_lowercase() - .contains("no such container") => - { - e.kind = ErrorKind::NotFound; - Err(e) - } - Err(e) => Err(e), - } -} - -// docker kill -s ${signal} ${name} -pub async fn kill_container(name: &str, signal: Option) -> Result<(), Error> { - let mut cmd = Command::new(CONTAINER_TOOL); - cmd.arg("kill"); - if let Some(sig) = signal { - cmd.arg("-s").arg(sig.to_string()); - } - cmd.arg(name); - match cmd.invoke(ErrorKind::Docker).await { - Ok(_) => Ok(()), - Err(mut e) - if e.source - .to_string() - .to_ascii_lowercase() - .contains("no such container") => - { - e.kind = ErrorKind::NotFound; - Err(e) - } - Err(e) => Err(e), - } -} - -// docker pause ${name} -pub async fn pause_container(name: &str) -> Result<(), Error> { - let mut cmd = Command::new(CONTAINER_TOOL); - cmd.arg("pause"); - cmd.arg(name); - match cmd.invoke(ErrorKind::Docker).await { - Ok(_) => Ok(()), - Err(mut e) - if e.source - .to_string() - .to_ascii_lowercase() - .contains("no such container") => - { - e.kind = ErrorKind::NotFound; - Err(e) - } - Err(e) => Err(e), - } -} - -// docker unpause ${name} -pub async fn unpause_container(name: &str) -> Result<(), Error> { - let mut cmd = Command::new(CONTAINER_TOOL); - cmd.arg("unpause"); - cmd.arg(name); - match cmd.invoke(ErrorKind::Docker).await { - Ok(_) => Ok(()), - Err(mut e) - if e.source - .to_string() - .to_ascii_lowercase() - .contains("no such container") => - { - e.kind = ErrorKind::NotFound; - Err(e) - } - Err(e) => Err(e), - } -} - -// docker rm -f ${name} -pub async fn remove_container(name: &str, force: bool) -> Result<(), Error> { - let mut cmd = Command::new(CONTAINER_TOOL); - cmd.arg("rm"); - if force { - cmd.arg("-f"); - } - cmd.arg(name); - match cmd.invoke(ErrorKind::Docker).await { - Ok(_) => Ok(()), - Err(e) - if e.source - .to_string() - .to_ascii_lowercase() - .contains("no such container") => - { - Ok(()) - } - Err(e) => Err(e), - } -} - -// docker network create -d bridge --subnet ${subnet} --opt com.podman.network.bridge.name=${bridge_name} -pub async fn create_bridge_network( - name: &str, - subnet: &str, - bridge_name: &str, -) -> Result<(), Error> { - let mut cmd = Command::new(CONTAINER_TOOL); - cmd.arg("network").arg("create"); - cmd.arg("-d").arg("bridge"); - cmd.arg("--subnet").arg(subnet); - cmd.arg("--opt") - .arg(format!("com.docker.network.bridge.name={bridge_name}")); - cmd.arg(name); - cmd.invoke(ErrorKind::Docker).await?; - Ok(()) -} diff --git a/core/startos/src/util/future.rs b/core/startos/src/util/future.rs new file mode 100644 index 000000000..9f18ed613 --- /dev/null +++ b/core/startos/src/util/future.rs @@ -0,0 +1,119 @@ +use std::pin::Pin; +use std::task::{Context, Poll}; + +use futures::future::abortable; +use futures::stream::{AbortHandle, Abortable}; +use futures::{Future, FutureExt}; +use tokio::sync::watch; + +#[pin_project::pin_project(PinnedDrop)] +pub struct DropSignaling { + #[pin] + fut: F, + on_drop: watch::Sender, +} +impl DropSignaling { + pub fn new(fut: F) -> Self { + Self { + fut, + on_drop: watch::channel(false).0, + } + } + pub fn subscribe(&self) -> DropHandle { + DropHandle(self.on_drop.subscribe()) + } +} +impl Future for DropSignaling +where + F: Future, +{ + type Output = F::Output; + fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + let this = self.project(); + this.fut.poll(cx) + } +} +#[pin_project::pinned_drop] +impl PinnedDrop for DropSignaling { + fn drop(self: Pin<&mut Self>) { + let _ = self.on_drop.send(true); + } +} + +#[derive(Clone)] +pub struct DropHandle(watch::Receiver); +impl DropHandle { + pub async fn wait(&mut self) { + self.0.wait_for(|a| *a).await; + } +} + +#[pin_project::pin_project] +pub struct RemoteCancellable { + #[pin] + fut: Abortable>, + on_drop: DropHandle, + handle: AbortHandle, +} +impl RemoteCancellable { + pub fn new(fut: F) -> Self { + let sig_fut = DropSignaling::new(fut); + let on_drop = sig_fut.subscribe(); + let (fut, handle) = abortable(sig_fut); + Self { + fut, + on_drop, + handle, + } + } +} +impl RemoteCancellable { + pub fn cancellation_handle(&self) -> CancellationHandle { + CancellationHandle { + on_drop: self.on_drop.clone(), + handle: self.handle.clone(), + } + } +} +impl Future for RemoteCancellable +where + F: Future, +{ + type Output = Option; + fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + let this = self.project(); + this.fut.poll(cx).map(|a| a.ok()) + } +} + +#[derive(Clone)] +pub struct CancellationHandle { + on_drop: DropHandle, + handle: AbortHandle, +} +impl CancellationHandle { + pub fn cancel(&mut self) { + self.handle.abort(); + } + + pub async fn cancel_and_wait(&mut self) { + self.handle.abort(); + self.on_drop.wait().await + } +} + +#[tokio::test] +async fn test_cancellable() { + use std::sync::Arc; + + let arc = Arc::new(()); + let weak = Arc::downgrade(&arc); + let cancellable = RemoteCancellable::new(async move { + futures::future::pending::<()>().await; + drop(arc) + }); + let mut handle = cancellable.cancellation_handle(); + tokio::spawn(cancellable); + handle.cancel_and_wait().await; + assert!(weak.strong_count() == 0); +} diff --git a/core/startos/src/util/http_reader.rs b/core/startos/src/util/http_reader.rs index 87e8c114e..02a9f57ae 100644 --- a/core/startos/src/util/http_reader.rs +++ b/core/startos/src/util/http_reader.rs @@ -6,11 +6,11 @@ use std::io::Error as StdIOError; use std::pin::Pin; use std::task::{Context, Poll}; +use bytes::Bytes; use color_eyre::eyre::eyre; use futures::Stream; -use http::header::{ACCEPT_RANGES, CONTENT_LENGTH, RANGE}; -use hyper::body::Bytes; use pin_project::pin_project; +use reqwest::header::{ACCEPT_RANGES, CONTENT_LENGTH, RANGE}; use reqwest::{Client, Url}; use tokio::io::{AsyncRead, AsyncSeek}; @@ -359,22 +359,3 @@ async fn main_test() { assert_eq!(buf.len(), test_reader.total_bytes) } - -#[tokio::test] -#[ignore] -async fn s9pk_test() { - use tokio::io::BufReader; - - let http_url = Url::parse("http://qhc6ac47cytstejcepk2ia3ipadzjhlkc5qsktsbl4e7u2krfmfuaqqd.onion/content/files/2022/09/ghost.s9pk").unwrap(); - - println!("Getting this resource: {}", http_url); - let test_reader = - BufReader::with_capacity(1024 * 1024, HttpReader::new(http_url).await.unwrap()); - - let mut s9pk = crate::s9pk::reader::S9pkReader::from_reader(test_reader, false) - .await - .unwrap(); - - let manifest = s9pk.manifest().await.unwrap(); - assert_eq!(&manifest.id.to_string(), "ghost"); -} diff --git a/core/startos/src/util/io.rs b/core/startos/src/util/io.rs index 282a2db8e..f5a951142 100644 --- a/core/startos/src/util/io.rs +++ b/core/startos/src/util/io.rs @@ -1,7 +1,7 @@ use std::future::Future; use std::io::Cursor; use std::os::unix::prelude::MetadataExt; -use std::path::Path; +use std::path::{Path, PathBuf}; use std::sync::atomic::AtomicU64; use std::task::Poll; use std::time::Duration; @@ -10,13 +10,14 @@ use futures::future::{BoxFuture, Fuse}; use futures::{AsyncSeek, FutureExt, TryStreamExt}; use helpers::NonDetachingJoinHandle; use nix::unistd::{Gid, Uid}; +use tokio::fs::File; use tokio::io::{ duplex, AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt, DuplexStream, ReadBuf, WriteHalf, }; use tokio::net::TcpStream; use tokio::time::{Instant, Sleep}; -use crate::ResultExt; +use crate::prelude::*; pub trait AsyncReadSeek: AsyncRead + AsyncSeek {} impl AsyncReadSeek for T {} @@ -669,3 +670,77 @@ impl AsyncWrite for TimeoutStream { res } } + +pub struct TmpFile {} + +#[derive(Debug)] +pub struct TmpDir { + path: PathBuf, +} +impl TmpDir { + pub async fn new() -> Result { + let path = Path::new("/var/tmp/startos").join(base32::encode( + base32::Alphabet::RFC4648 { padding: false }, + &rand::random::<[u8; 8]>(), + )); + if tokio::fs::metadata(&path).await.is_ok() { + return Err(Error::new( + eyre!("{path:?} already exists"), + ErrorKind::Filesystem, + )); + } + tokio::fs::create_dir_all(&path).await?; + Ok(Self { path }) + } + + pub async fn delete(self) -> Result<(), Error> { + tokio::fs::remove_dir_all(&self.path).await?; + Ok(()) + } +} +impl std::ops::Deref for TmpDir { + type Target = Path; + fn deref(&self) -> &Self::Target { + &self.path + } +} +impl AsRef for TmpDir { + fn as_ref(&self) -> &Path { + &*self + } +} +impl Drop for TmpDir { + fn drop(&mut self) { + if self.path.exists() { + let path = std::mem::take(&mut self.path); + tokio::spawn(async move { + tokio::fs::remove_dir_all(&path).await.unwrap(); + }); + } + } +} + +pub async fn create_file(path: impl AsRef) -> Result { + let path = path.as_ref(); + if let Some(parent) = path.parent() { + tokio::fs::create_dir_all(parent) + .await + .with_ctx(|_| (ErrorKind::Filesystem, lazy_format!("mkdir -p {parent:?}")))?; + } + File::create(path) + .await + .with_ctx(|_| (ErrorKind::Filesystem, lazy_format!("create {path:?}"))) +} + +pub async fn rename(src: impl AsRef, dst: impl AsRef) -> Result<(), Error> { + let src = src.as_ref(); + let dst = dst.as_ref(); + if let Some(parent) = dst.parent() { + tokio::fs::create_dir_all(parent) + .await + .with_ctx(|_| (ErrorKind::Filesystem, lazy_format!("mkdir -p {parent:?}")))?; + } + tokio::fs::rename(src, dst) + .await + .with_ctx(|_| (ErrorKind::Filesystem, lazy_format!("mv {src:?} -> {dst:?}"))) +} diff --git a/core/startos/src/util/mod.rs b/core/startos/src/util/mod.rs index 34c05934b..772a64a32 100644 --- a/core/startos/src/util/mod.rs +++ b/core/startos/src/util/mod.rs @@ -9,11 +9,11 @@ use std::task::{Context, Poll}; use std::time::Duration; use async_trait::async_trait; -use clap::ArgMatches; use color_eyre::eyre::{self, eyre}; use fd_lock_rs::FdLock; use helpers::canonicalize; pub use helpers::NonDetachingJoinHandle; +use imbl_value::InternedString; use lazy_static::lazy_static; pub use models::Version; use pin_project::pin_project; @@ -24,14 +24,16 @@ use tracing::instrument; use crate::shutdown::Shutdown; use crate::{Error, ErrorKind, ResultExt as _}; -pub mod config; +pub mod actor; +pub mod clap; pub mod cpupower; pub mod crypto; -pub mod docker; +pub mod future; pub mod http_reader; pub mod io; pub mod logger; pub mod lshw; +pub mod rpc_client; pub mod serde; #[derive(Clone, Copy, Debug, ::serde::Deserialize, ::serde::Serialize)] @@ -48,8 +50,12 @@ impl std::fmt::Display for Never { } } impl std::error::Error for Never {} +impl AsRef for Never { + fn as_ref(&self) -> &T { + match *self {} + } +} -#[async_trait::async_trait] pub trait Invoke<'a> { type Extended<'ext> where @@ -60,7 +66,10 @@ pub trait Invoke<'a> { &'ext mut self, input: Option<&'ext mut Input>, ) -> Self::Extended<'ext>; - async fn invoke(&mut self, error_kind: crate::ErrorKind) -> Result, Error>; + fn invoke( + &mut self, + error_kind: crate::ErrorKind, + ) -> impl Future, Error>> + Send; } pub struct ExtendedCommand<'a> { @@ -80,7 +89,6 @@ impl<'a> std::ops::DerefMut for ExtendedCommand<'a> { } } -#[async_trait::async_trait] impl<'a> Invoke<'a> for tokio::process::Command { type Extended<'ext> = ExtendedCommand<'ext> where @@ -118,7 +126,6 @@ impl<'a> Invoke<'a> for tokio::process::Command { } } -#[async_trait::async_trait] impl<'a> Invoke<'a> for ExtendedCommand<'a> { type Extended<'ext> = &'ext mut ExtendedCommand<'ext> where @@ -146,7 +153,7 @@ impl<'a> Invoke<'a> for ExtendedCommand<'a> { } self.cmd.stdout(Stdio::piped()); self.cmd.stderr(Stdio::piped()); - let mut child = self.cmd.spawn()?; + let mut child = self.cmd.spawn().with_kind(error_kind)?; if let (Some(mut stdin), Some(input)) = (child.stdin.take(), self.input.take()) { use tokio::io::AsyncWriteExt; tokio::io::copy(input, &mut stdin).await?; @@ -275,8 +282,6 @@ impl std::io::Write for FmtWriter { } } -pub fn display_none(_: T, _: &ArgMatches) {} - pub struct Container(RwLock>); impl Container { pub fn new(value: Option) -> Self { @@ -490,3 +495,13 @@ impl<'a, T> From<&'a T> for MaybeOwned<'a, T> { MaybeOwned::Borrowed(value) } } + +pub fn new_guid() -> InternedString { + use rand::RngCore; + let mut buf = [0; 40]; + rand::thread_rng().fill_bytes(&mut buf); + InternedString::intern(base32::encode( + base32::Alphabet::RFC4648 { padding: false }, + &buf, + )) +} diff --git a/core/helpers/src/rpc_client.rs b/core/startos/src/util/rpc_client.rs similarity index 69% rename from core/helpers/src/rpc_client.rs rename to core/startos/src/util/rpc_client.rs index bdb505b40..36fe0031a 100644 --- a/core/helpers/src/rpc_client.rs +++ b/core/startos/src/util/rpc_client.rs @@ -5,17 +5,18 @@ use std::sync::{Arc, Weak}; use futures::future::BoxFuture; use futures::{FutureExt, TryFutureExt}; +use helpers::NonDetachingJoinHandle; use lazy_async_pool::Pool; use models::{Error, ErrorKind, ResultExt}; +use rpc_toolkit::yajrc::{self, Id, RpcError, RpcMethod, RpcRequest, RpcResponse}; use serde::{Deserialize, Serialize}; use serde_json::{json, Value}; use tokio::io::{AsyncBufReadExt, AsyncRead, AsyncWrite, AsyncWriteExt, BufReader}; use tokio::net::UnixStream; use tokio::runtime::Handle; -use tokio::sync::{oneshot, Mutex}; -use yajrc::{Id, RpcError, RpcMethod, RpcRequest, RpcResponse}; +use tokio::sync::{oneshot, Mutex, OnceCell}; -use crate::NonDetachingJoinHandle; +use crate::util::io::TmpDir; type DynWrite = Box; type ResponseMap = BTreeMap>>; @@ -24,7 +25,7 @@ const MAX_TRIES: u64 = 3; pub struct RpcClient { id: Arc, - _handler: NonDetachingJoinHandle<()>, + handler: NonDetachingJoinHandle<()>, writer: DynWrite, responses: Weak>, } @@ -42,11 +43,11 @@ impl RpcClient { let weak_responses = Arc::downgrade(&responses); RpcClient { id, - _handler: tokio::spawn(async move { + handler: tokio::spawn(async move { let mut lines = BufReader::new(reader).lines(); while let Some(line) = lines.next_line().await.transpose() { match line.map_err(Error::from).and_then(|l| { - serde_json::from_str::(&l) + serde_json::from_str::(dbg!(&l)) .with_kind(ErrorKind::Deserialization) }) { Ok(l) => { @@ -54,7 +55,7 @@ impl RpcClient { if let Some(res) = responses.lock().await.remove(&id) { if let Err(e) = res.send(l.result) { tracing::warn!( - "RpcClient Response for Unknown ID: {:?}", + "RpcClient Response after request aborted: {:?}", e ); } @@ -74,6 +75,14 @@ impl RpcClient { } } } + for (_, res) in std::mem::take(&mut *responses.lock().await) { + if let Err(e) = res.send(Err(RpcError { + data: Some("client disconnected before response received".into()), + ..yajrc::INTERNAL_ERROR + })) { + tracing::warn!("RpcClient Response after request aborted: {:?}", e); + } + } }) .into(), writer, @@ -105,10 +114,10 @@ impl RpcClient { let (send, recv) = oneshot::channel(); w.lock().await.insert(id.clone(), send); self.writer - .write_all((serde_json::to_string(&request)? + "\n").as_bytes()) + .write_all((dbg!(serde_json::to_string(&request))? + "\n").as_bytes()) .await .map_err(|e| { - let mut err = yajrc::INTERNAL_ERROR.clone(); + let mut err = rpc_toolkit::yajrc::INTERNAL_ERROR.clone(); err.data = Some(json!(e.to_string())); err })?; @@ -123,14 +132,15 @@ impl RpcClient { } tracing::debug!( "Client has finished {:?}", - futures::poll!(&mut self._handler) + futures::poll!(&mut self.handler) ); - let mut err = yajrc::INTERNAL_ERROR.clone(); + let mut err = rpc_toolkit::yajrc::INTERNAL_ERROR.clone(); err.data = Some(json!("RpcClient thread has terminated")); Err(err) } } +#[derive(Clone)] pub struct UnixRpcClient { pool: Pool< RpcClient, @@ -141,18 +151,35 @@ pub struct UnixRpcClient { } impl UnixRpcClient { pub fn new(path: PathBuf) -> Self { + let tmpdir = Arc::new(OnceCell::new()); let rt = Handle::current(); let id = Arc::new(AtomicUsize::new(0)); Self { pool: Pool::new( 0, Box::new(move || { - let path = path.clone(); + let mut path = path.clone(); let id = id.clone(); - rt.spawn(async move { + let tmpdir = tmpdir.clone(); + NonDetachingJoinHandle::from(rt.spawn(async move { + if path.as_os_str().len() >= 108 + // libc::sockaddr_un.sun_path.len() + { + let new_path = tmpdir + .get_or_try_init(|| TmpDir::new()) + .await + .map_err(|e| { + std::io::Error::new(std::io::ErrorKind::Other, e.source) + })? + .join("link.sock"); + if tokio::fs::metadata(&new_path).await.is_err() { + tokio::fs::symlink(&path, &new_path).await?; + } + path = new_path; + } let (r, w) = UnixStream::connect(&path).await?.into_split(); Ok(RpcClient::new(w, r, id)) - }) + })) .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e)) .and_then(|x| async move { x }) .boxed() @@ -173,15 +200,23 @@ impl UnixRpcClient { { let mut tries = 0; let res = loop { - tries += 1; let mut client = self.pool.clone().get().await?; + if client.handler.is_finished() { + client.destroy(); + continue; + } let res = client.request(method.clone(), params.clone()).await; match &res { - Err(e) if e.code == yajrc::INTERNAL_ERROR.code => { + Err(e) if e.code == rpc_toolkit::yajrc::INTERNAL_ERROR.code => { + let mut e = Error::from(e.clone()); + e.kind = ErrorKind::Filesystem; + tracing::error!("{e}"); + tracing::debug!("{e:?}"); client.destroy(); } _ => break res, } + tries += 1; if tries > MAX_TRIES { tracing::warn!("Max Tries exceeded"); break res; diff --git a/core/startos/src/util/serde.rs b/core/startos/src/util/serde.rs index 4a6f7551b..d17d1ac9a 100644 --- a/core/startos/src/util/serde.rs +++ b/core/startos/src/util/serde.rs @@ -1,15 +1,21 @@ +use std::any::TypeId; +use std::collections::VecDeque; use std::marker::PhantomData; use std::ops::Deref; -use std::process::exit; use std::str::FromStr; -use clap::ArgMatches; +use clap::builder::ValueParserFactory; +use clap::{ArgMatches, CommandFactory, FromArgMatches}; use color_eyre::eyre::eyre; +use imbl::OrdMap; +use rpc_toolkit::{AnyContext, Handler, HandlerArgs, HandlerArgsFor, HandlerTypes, PrintCliResult}; +use serde::de::DeserializeOwned; use serde::ser::{SerializeMap, SerializeSeq}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde_json::Value; use super::IntoDoubleEndedIterator; +use crate::util::clap::FromStrParser; use crate::{Error, ResultExt}; pub fn deserialize_from_str< @@ -266,7 +272,7 @@ impl<'de> serde::de::Deserialize<'de> for ValuePrimative { } } -#[derive(Clone, Copy, Debug, Deserialize, Serialize)] +#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, Eq, PartialOrd, Ord)] #[serde(rename_all = "kebab-case")] pub enum IoFormat { Json, @@ -425,36 +431,207 @@ impl IoFormat { } } -pub fn display_serializable(t: T, matches: &ArgMatches) { - let format = match matches.value_of("format").map(|f| f.parse()) { - Some(Ok(f)) => f, - Some(Err(_)) => { - eprintln!("unrecognized formatter"); - exit(1) - } - None => IoFormat::default(), - }; +pub fn display_serializable(format: IoFormat, result: T) { format - .to_writer(std::io::stdout(), &t) - .expect("Error serializing result to stdout") -} - -pub fn parse_stdin_deserializable Deserialize<'de>>( - stdin: &mut std::io::Stdin, - matches: &ArgMatches, -) -> Result { - let format = match matches.value_of("format").map(|f| f.parse()) { - Some(Ok(f)) => f, - Some(Err(_)) => { - eprintln!("unrecognized formatter"); - exit(1) + .to_writer(std::io::stdout(), &result) + .expect("Error serializing result to stdout"); + if format == IoFormat::JsonPretty { + println!() + } +} + +#[derive(Deserialize, Serialize)] +pub struct WithIoFormat { + pub format: Option, + #[serde(flatten)] + pub rest: T, +} +impl FromArgMatches for WithIoFormat { + fn from_arg_matches(matches: &ArgMatches) -> Result { + Ok(Self { + rest: T::from_arg_matches(matches)?, + format: matches.get_one("format").copied(), + }) + } + fn update_from_arg_matches(&mut self, matches: &ArgMatches) -> Result<(), clap::Error> { + self.rest.update_from_arg_matches(matches)?; + self.format = matches.get_one("format").copied(); + Ok(()) + } +} +impl CommandFactory for WithIoFormat { + fn command() -> clap::Command { + let cmd = T::command(); + if !cmd.get_arguments().any(|a| a.get_id() == "format") { + cmd.arg( + clap::Arg::new("format") + .long("format") + .value_parser(|s: &str| s.parse::().map_err(|e| eyre!("{e}"))), + ) + } else { + cmd } - None => IoFormat::default(), - }; - format.from_reader(stdin) + } + fn command_for_update() -> clap::Command { + let cmd = T::command_for_update(); + if !cmd.get_arguments().any(|a| a.get_id() == "format") { + cmd.arg( + clap::Arg::new("format") + .long("format") + .value_parser(|s: &str| s.parse::().map_err(|e| eyre!("{e}"))), + ) + } else { + cmd + } + } +} + +pub trait HandlerExtSerde: Handler { + fn with_display_serializable(self) -> DisplaySerializable; +} +impl HandlerExtSerde for T { + fn with_display_serializable(self) -> DisplaySerializable { + DisplaySerializable(self) + } +} + +#[derive(Debug, Clone)] +pub struct DisplaySerializable(pub T); +impl HandlerTypes for DisplaySerializable { + type Params = WithIoFormat; + type InheritedParams = T::InheritedParams; + type Ok = T::Ok; + type Err = T::Err; +} +#[async_trait::async_trait] +impl Handler for DisplaySerializable { + type Context = T::Context; + fn handle_sync( + &self, + HandlerArgs { + context, + parent_method, + method, + params, + inherited_params, + raw_params, + }: HandlerArgsFor, + ) -> Result { + self.0.handle_sync(HandlerArgs { + context, + parent_method, + method, + params: params.rest, + inherited_params, + raw_params, + }) + } + async fn handle_async( + &self, + HandlerArgs { + context, + parent_method, + method, + params, + inherited_params, + raw_params, + }: HandlerArgsFor, + ) -> Result { + self.0 + .handle_async(HandlerArgs { + context, + parent_method, + method, + params: params.rest, + inherited_params, + raw_params, + }) + .await + } + fn contexts(&self) -> Option> { + self.0.contexts() + } + fn metadata( + &self, + method: VecDeque<&'static str>, + ctx_ty: TypeId, + ) -> OrdMap<&'static str, imbl_value::Value> { + self.0.metadata(method, ctx_ty) + } + fn method_from_dots(&self, method: &str, ctx_ty: TypeId) -> Option> { + self.0.method_from_dots(method, ctx_ty) + } +} +impl PrintCliResult for DisplaySerializable +where + T::Ok: Serialize, +{ + type Context = AnyContext; + fn print( + &self, + HandlerArgs { params, .. }: HandlerArgsFor, + result: Self::Ok, + ) -> Result<(), Self::Err> { + display_serializable(params.format.unwrap_or_default(), result); + Ok(()) + } +} + +#[derive(Deserialize, Serialize)] +pub struct StdinDeserializable(pub T); +impl FromArgMatches for StdinDeserializable +where + T: DeserializeOwned, +{ + fn from_arg_matches(matches: &ArgMatches) -> Result { + let format = matches + .get_one::("format") + .copied() + .unwrap_or_default(); + Ok(Self(format.from_reader(&mut std::io::stdin()).map_err( + |e| clap::Error::raw(clap::error::ErrorKind::ValueValidation, e), + )?)) + } + fn update_from_arg_matches(&mut self, matches: &ArgMatches) -> Result<(), clap::Error> { + let format = matches + .get_one::("format") + .copied() + .unwrap_or_default(); + self.0 = format + .from_reader(&mut std::io::stdin()) + .map_err(|e| clap::Error::raw(clap::error::ErrorKind::ValueValidation, e))?; + Ok(()) + } +} +impl clap::Args for StdinDeserializable +where + T: DeserializeOwned, +{ + fn augment_args(cmd: clap::Command) -> clap::Command { + if !cmd.get_arguments().any(|a| a.get_id() == "format") { + cmd.arg( + clap::Arg::new("format") + .long("format") + .value_parser(|s: &str| s.parse::().map_err(|e| eyre!("{e}"))), + ) + } else { + cmd + } + } + fn augment_args_for_update(cmd: clap::Command) -> clap::Command { + if !cmd.get_arguments().any(|a| a.get_id() == "format") { + cmd.arg( + clap::Arg::new("format") + .long("format") + .value_parser(|s: &str| s.parse::().map_err(|e| eyre!("{e}"))), + ) + } else { + cmd + } + } } -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] pub struct Duration(std::time::Duration); impl Deref for Duration { type Target = std::time::Duration; @@ -518,6 +695,12 @@ impl std::str::FromStr for Duration { })) } } +impl ValueParserFactory for Duration { + type Parser = FromStrParser; + fn value_parser() -> Self::Parser { + FromStrParser::new() + } +} impl std::fmt::Display for Duration { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let nanos = self.as_nanos(); @@ -843,3 +1026,67 @@ impl Serialize for Regex { serialize_display(&self.0, serializer) } } + +// TODO: make this not allocate +#[derive(Debug)] +pub struct NoOutput; +impl<'de> Deserialize<'de> for NoOutput { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let _ = Value::deserialize(deserializer); + Ok(NoOutput) + } +} + +pub fn apply_expr(input: jaq_core::Val, expr: &str) -> Result { + let (expr, errs) = jaq_core::parse::parse(expr, jaq_core::parse::main()); + + let Some(expr) = expr else { + return Err(Error::new( + eyre!("Failed to parse expression: {:?}", errs), + crate::ErrorKind::InvalidRequest, + )); + }; + + let mut errs = Vec::new(); + + let mut defs = jaq_core::Definitions::core(); + for def in jaq_std::std() { + defs.insert(def, &mut errs); + } + + let filter = defs.finish(expr, Vec::new(), &mut errs); + + if !errs.is_empty() { + return Err(Error::new( + eyre!("Failed to compile expression: {:?}", errs), + crate::ErrorKind::InvalidRequest, + )); + }; + + let inputs = jaq_core::RcIter::new(std::iter::empty()); + let mut res_iter = filter.run(jaq_core::Ctx::new([], &inputs), input); + + let Some(res) = res_iter + .next() + .transpose() + .map_err(|e| eyre!("{e}")) + .with_kind(crate::ErrorKind::Deserialization)? + else { + return Err(Error::new( + eyre!("expr returned no results"), + crate::ErrorKind::InvalidRequest, + )); + }; + + if res_iter.next().is_some() { + return Err(Error::new( + eyre!("expr returned too many results"), + crate::ErrorKind::InvalidRequest, + )); + } + + Ok(res) +} diff --git a/core/startos/src/version/mod.rs b/core/startos/src/version/mod.rs index 4c6f157a5..3e4f7c4a2 100644 --- a/core/startos/src/version/mod.rs +++ b/core/startos/src/version/mod.rs @@ -2,7 +2,7 @@ use std::cmp::Ordering; use async_trait::async_trait; use color_eyre::eyre::eyre; -use rpc_toolkit::command; +use imbl_value::InternedString; use sqlx::PgPool; use crate::prelude::*; @@ -189,9 +189,8 @@ pub async fn init(db: &PatchDb, secrets: &PgPool) -> Result<(), Error> { pub const COMMIT_HASH: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/../../GIT_HASH.txt")); -#[command(rename = "git-info", local, metadata(authenticated = false))] -pub fn git_info() -> Result<&'static str, Error> { - Ok(COMMIT_HASH) +pub fn git_info() -> Result { + Ok(InternedString::intern(COMMIT_HASH)) } #[cfg(test)] diff --git a/core/startos/src/volume.rs b/core/startos/src/volume.rs index 1633b7d18..47d1ffc34 100644 --- a/core/startos/src/volume.rs +++ b/core/startos/src/volume.rs @@ -3,6 +3,7 @@ use std::ops::{Deref, DerefMut}; use std::path::{Path, PathBuf}; pub use helpers::script_dir; +use models::PackageId; pub use models::VolumeId; use serde::{Deserialize, Serialize}; use tracing::instrument; @@ -11,7 +12,6 @@ use crate::context::RpcContext; use crate::net::interface::{InterfaceId, Interfaces}; use crate::net::PACKAGE_CERT_PATH; use crate::prelude::*; -use crate::s9pk::manifest::PackageId; use crate::util::Version; use crate::{Error, ResultExt}; diff --git a/core/startos/startd.service b/core/startos/startd.service index 894298e54..56cf92e22 100644 --- a/core/startos/startd.service +++ b/core/startos/startd.service @@ -1,8 +1,5 @@ [Unit] Description=StartOS Daemon -After=network-online.target -Requires=network-online.target -Wants=avahi-daemon.service [Service] Type=simple diff --git a/debian/postinst b/debian/postinst index 6a65a749d..731298af9 100755 --- a/debian/postinst +++ b/debian/postinst @@ -121,3 +121,9 @@ rm -f /etc/motd ln -sf /usr/lib/startos/motd /etc/update-motd.d/00-embassy chmod -x /etc/update-motd.d/* chmod +x /etc/update-motd.d/00-embassy + +# LXC +echo "root:100000:65536" >>/etc/subuid +echo "root:100000:65536" >>/etc/subgid +echo "lxc.idmap = u 0 100000 65536" >>/etc/lxc/default.conf +echo "lxc.idmap = g 0 100000 65536" >>/etc/lxc/default.conf diff --git a/devmode.sh b/devmode.sh new file mode 100755 index 000000000..19b0651de --- /dev/null +++ b/devmode.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +export ENVIRONMENT=dev +export GIT_BRANCH_AS_HASH=1 diff --git a/image-recipe/README.md b/image-recipe/README.md index cbaf8944a..9eba04727 100644 --- a/image-recipe/README.md +++ b/image-recipe/README.md @@ -8,13 +8,9 @@ official StartOS images, you can use the `run-local-build.sh` helper script: ```bash # Prerequisites -sudo apt-get install -y debspawn +sudo apt-get install -y debspawn binfmt-support sudo mkdir -p /etc/debspawn/ && echo "AllowUnsafePermissions=true" | sudo tee /etc/debspawn/global.toml -# Get dpkg -mkdir -p overlays/startos/root -wget -O overlays/startos/root/startos_0.3.x-1_amd64.deb - # Build image ./run-local-build.sh ``` diff --git a/image-recipe/build.sh b/image-recipe/build.sh index 836fc49ed..28aa574ae 100755 --- a/image-recipe/build.sh +++ b/image-recipe/build.sh @@ -18,10 +18,6 @@ echo "Saving results in: $RESULTS_DIR" IMAGE_BASENAME=startos-${VERSION_FULL}_${IB_TARGET_PLATFORM} -mkdir -p $prep_results_dir - -cd $prep_results_dir - QEMU_ARCH=${IB_TARGET_ARCH} BOOTLOADERS=grub-efi,syslinux if [ "$QEMU_ARCH" = 'amd64' ]; then @@ -30,6 +26,19 @@ elif [ "$QEMU_ARCH" = 'arm64' ]; then QEMU_ARCH=aarch64 BOOTLOADERS=grub-efi fi + +# TODO: remove when util-linux is released at v2.39 +cd $base_dir +git clone --depth=1 --branch=v2.39.3 https://github.com/util-linux/util-linux.git +cd util-linux +./autogen.sh +CC=$QEMU_ARCH-linux-gnu-gcc ./configure --host=$QEMU_ARCH-linux-gnu --disable-all-programs --enable-mount --enable-libmount --enable-libblkid --enable-libuuid --enable-static-programs +CC=$QEMU_ARCH-linux-gnu-gcc make -j mount.static + +mkdir -p $prep_results_dir + +cd $prep_results_dir + NON_FREE= if [[ "${IB_TARGET_PLATFORM}" =~ -nonfree$ ]] || [ "${IB_TARGET_PLATFORM}" = "raspberrypi" ]; then NON_FREE=1 @@ -64,6 +73,7 @@ elif [ "${IB_TARGET_PLATFORM}" = "rockchip64" ]; then PLATFORM_CONFIG_EXTRAS="$PLATFORM_CONFIG_EXTRAS --linux-flavours rockchip64" fi + cat > /etc/wgetrc << EOF retry_connrefused = on tries = 100 @@ -91,6 +101,9 @@ lb config \ mkdir -p config/includes.chroot/deb cp $base_dir/deb/${IMAGE_BASENAME}.deb config/includes.chroot/deb/ +mkdir -p config/includes.chroot/usr/local/bin +cp $base_dir/util-linux/mount.static config/includes.chroot/usr/local/bin/mount.next + if [ "${IB_TARGET_PLATFORM}" = "raspberrypi" ]; then cp -r $base_dir/raspberrypi/squashfs/* config/includes.chroot/ fi @@ -139,13 +152,11 @@ if [ "${IB_TARGET_PLATFORM}" = "raspberrypi" ]; then echo "deb https://archive.raspberrypi.org/debian/ bullseye main" > config/archives/raspi.list fi -if [ "${IB_SUITE}" = "bullseye" ]; then - cat > config/archives/backports.pref <<- EOF - Package: * - Pin: release a=bullseye-backports - Pin-Priority: 500 - EOF -fi +cat > config/archives/backports.pref <<- EOF +Package: * +Pin: release a=stable-backports +Pin-Priority: 500 +EOF if [ "${IB_TARGET_PLATFORM}" = "rockchip64" ]; then curl -fsSL https://apt.armbian.com/armbian.key | gpg --dearmor -o config/archives/armbian.key @@ -204,6 +215,10 @@ if [ "${IB_TARGET_PLATFORM}" = "raspberrypi" ]; then update-initramfs -c -k \$v done ln -sf /usr/bin/pi-beep /usr/local/bin/beep + wget https://archive.raspberrypi.org/debian/pool/main/w/wireless-regdb/wireless-regdb_2018.05.09-0~rpt1_all.deb + echo 1b7b1076257726609535b71d146a5721622d19a0843061ee7568188e836dd10f wireless-regdb_2018.05.09-0~rpt1_all.deb | sha256sum -c + apt-get install ./wireless-regdb_2018.05.09-0~rpt1_all.deb + rm wireless-regdb_2018.05.09-0~rpt1_all.deb fi useradd --shell /bin/bash -G embassy -m start9 diff --git a/image-recipe/prepare.sh b/image-recipe/prepare.sh index 1c6779608..8962d8448 100755 --- a/image-recipe/prepare.sh +++ b/image-recipe/prepare.sh @@ -22,3 +22,16 @@ apt-get install -yq \ e2fsprogs \ squashfs-tools \ rsync +# TODO: remove when util-linux is released at v2.39.3 +apt-get install -yq \ + git \ + build-essential \ + crossbuild-essential-arm64 \ + crossbuild-essential-amd64 \ + automake \ + autoconf \ + gettext \ + libtool \ + pkg-config \ + autopoint \ + bison \ No newline at end of file diff --git a/patch-db b/patch-db index 6af2221ad..7096f15e9 160000 --- a/patch-db +++ b/patch-db @@ -1 +1 @@ -Subproject commit 6af2221add56f0a557b37a268ef9fb2299a05255 +Subproject commit 7096f15e9b218f59b8ded1fd1133c70b82de74c5 diff --git a/sdk/.gitignore b/sdk/.gitignore new file mode 100644 index 000000000..a7ca92b2d --- /dev/null +++ b/sdk/.gitignore @@ -0,0 +1,5 @@ +.vscode +dist/ +node_modules/ +lib/coverage +lib/test/output.ts \ No newline at end of file diff --git a/sdk/LICENSE b/sdk/LICENSE new file mode 100644 index 000000000..793257b96 --- /dev/null +++ b/sdk/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Start9 Labs + +Permission is hereby granted, 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: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions 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. diff --git a/sdk/Makefile b/sdk/Makefile new file mode 100644 index 000000000..8370650b8 --- /dev/null +++ b/sdk/Makefile @@ -0,0 +1,44 @@ +TS_FILES := $(shell find ./**/*.ts ) +version = $(shell git tag --sort=committerdate | tail -1) +test: $(TS_FILES) lib/test/output.ts + npm test + +clean: + rm -rf dist/* | true + +lib/test/output.ts: lib/test/makeOutput.ts scripts/oldSpecToBuilder.ts + npm run buildOutput + +buildOutput: lib/test/output.ts fmt + echo 'done' + + +bundle: $(TS_FILES) package.json .FORCE node_modules test fmt + npx tsc + npx tsc --project tsconfig-cjs.json + cp package.json dist/package.json + cp README.md dist/README.md + cp LICENSE dist/LICENSE + touch dist + +full-bundle: + make clean + make bundle + +check: + npm run check + +fmt: node_modules + npx prettier --write "**/*.ts" + +node_modules: package.json + npm install + +publish: clean bundle package.json README.md LICENSE + cd dist && npm publish --access=public +link: bundle + cp package.json dist/package.json + cp README.md dist/README.md + cp LICENSE dist/LICENSE + cd dist && npm link +.FORCE: diff --git a/sdk/README.md b/sdk/README.md new file mode 100644 index 000000000..d51b25b58 --- /dev/null +++ b/sdk/README.md @@ -0,0 +1,18 @@ +# Start SDK + +## Config Conversion + +- Copy the old config json (from the getConfig.ts) +- Install the start-sdk with `npm i` +- paste the config into makeOutput.ts::oldSpecToBuilder (second param) +- Make the third param + +```ts + { + StartSdk: "start-sdk/lib", + } +``` + +- run the script `npm run buildOutput` to make the output.ts +- Copy this whole file into startos/procedures/config/spec.ts +- Fix all the TODO diff --git a/sdk/jest.config.js b/sdk/jest.config.js new file mode 100644 index 000000000..c6aed8f3d --- /dev/null +++ b/sdk/jest.config.js @@ -0,0 +1,8 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: "ts-jest", + automock: false, + testEnvironment: "node", + rootDir: "./lib/", + modulePathIgnorePatterns: ["./dist/"], +}; diff --git a/sdk/lib/StartSdk.ts b/sdk/lib/StartSdk.ts new file mode 100644 index 000000000..85f157aa9 --- /dev/null +++ b/sdk/lib/StartSdk.ts @@ -0,0 +1,534 @@ +import { ManifestVersion, SDKManifest } from "./manifest/ManifestTypes" +import { RequiredDefault, Value } from "./config/builder/value" +import { Config, ExtractConfigType, LazyBuild } from "./config/builder/config" +import { + DefaultString, + ListValueSpecText, + Pattern, + RandomString, + UniqueBy, + ValueSpecDatetime, + ValueSpecText, +} from "./config/configTypes" +import { Variants } from "./config/builder/variants" +import { CreatedAction, createAction } from "./actions/createAction" +import { + ActionMetadata, + Effects, + ActionResult, + BackupOptions, + DeepPartial, + MaybePromise, +} from "./types" +import * as patterns from "./util/patterns" +import { Utils } from "./util/utils" +import { DependencyConfig, Update } from "./dependencyConfig/DependencyConfig" +import { BackupSet, Backups } from "./backup/Backups" +import { smtpConfig } from "./config/configConstants" +import { Daemons } from "./mainFn/Daemons" +import { healthCheck } from "./health/HealthCheck" +import { checkPortListening } from "./health/checkFns/checkPortListening" +import { checkWebUrl, runHealthScript } from "./health/checkFns" +import { List } from "./config/builder/list" +import { Migration } from "./inits/migrations/Migration" +import { Install, InstallFn } from "./inits/setupInstall" +import { setupActions } from "./actions/setupActions" +import { setupDependencyConfig } from "./dependencyConfig/setupDependencyConfig" +import { SetupBackupsParams, setupBackups } from "./backup/setupBackups" +import { setupInit } from "./inits/setupInit" +import { + EnsureUniqueId, + Migrations, + setupMigrations, +} from "./inits/migrations/setupMigrations" +import { Uninstall, UninstallFn, setupUninstall } from "./inits/setupUninstall" +import { setupMain } from "./mainFn" +import { defaultTrigger } from "./trigger/defaultTrigger" +import { changeOnFirstSuccess, cooldownTrigger } from "./trigger" +import setupConfig, { Read, Save } from "./config/setupConfig" +import { setupDependencyMounts } from "./dependency/setupDependencyMounts" +import { + InterfacesReceipt, + SetInterfaces, + setupInterfaces, +} from "./interfaces/setupInterfaces" +import { successFailure } from "./trigger/successFailure" +import { SetupExports } from "./inits/setupExports" + +// prettier-ignore +type AnyNeverCond = + T extends [] ? Else : + T extends [never, ...Array] ? Then : + T extends [any, ...infer U] ? AnyNeverCond : + never + +export class StartSdk { + private constructor(readonly manifest: Manifest) {} + static of() { + return new StartSdk(null as never) + } + withManifest(manifest: Manifest) { + return new StartSdk(manifest) + } + withStore>() { + return new StartSdk(this.manifest) + } + + build(isReady: AnyNeverCond<[Manifest, Store], "Build not ready", true>) { + return { + configConstants: { smtpConfig }, + createAction: < + ConfigType extends + | Record + | Config + | Config, + Type extends Record = ExtractConfigType, + >( + metaData: Omit & { + input: Config | Config + }, + fn: (options: { + effects: Effects + utils: Utils + input: Type + }) => Promise, + ) => { + const { input, ...rest } = metaData + return createAction(rest, fn, input) + }, + createDynamicAction: < + ConfigType extends + | Record + | Config + | Config, + Type extends Record = ExtractConfigType, + >( + metaData: (options: { + effects: Effects + utils: Utils + }) => MaybePromise>, + fn: (options: { + effects: Effects + utils: Utils + input: Type + }) => Promise, + input: Config | Config, + ) => { + return createAction( + metaData, + fn, + input, + ) + }, + + HealthCheck: { + of: healthCheck, + }, + healthCheck: { + checkPortListening, + checkWebUrl, + runHealthScript, + }, + patterns, + setupActions: (...createdActions: CreatedAction[]) => + setupActions(...createdActions), + setupBackups: (...args: SetupBackupsParams) => + setupBackups(...args), + setupConfig: < + ConfigType extends Config | Config, + Type extends Record = ExtractConfigType, + >( + spec: ConfigType, + write: Save, + read: Read, + ) => setupConfig(spec, write, read), + setupConfigRead: < + ConfigSpec extends + | Config, any> + | Config, never>, + >( + _configSpec: ConfigSpec, + fn: Read, + ) => fn, + setupConfigSave: < + ConfigSpec extends + | Config, any> + | Config, never>, + >( + _configSpec: ConfigSpec, + fn: Save, + ) => fn, + setupDependencyConfig: >( + config: Config | Config, + autoConfigs: { + [K in keyof Manifest["dependencies"]]: DependencyConfig< + Manifest, + Store, + Input, + any + > + }, + ) => setupDependencyConfig(config, autoConfigs), + setupExports: (fn: SetupExports) => fn, + setupDependencyMounts, + setupInit: ( + migrations: Migrations, + install: Install, + uninstall: Uninstall, + setInterfaces: SetInterfaces, + setupExports: SetupExports, + ) => + setupInit( + migrations, + install, + uninstall, + setInterfaces, + setupExports, + ), + setupInstall: (fn: InstallFn) => Install.of(fn), + setupInterfaces: < + ConfigInput extends Record, + Output extends InterfacesReceipt, + >( + config: Config, + fn: SetInterfaces, + ) => setupInterfaces(config, fn), + setupMain: ( + fn: (o: { + effects: Effects + started(onTerm: () => PromiseLike): PromiseLike + utils: Utils + }) => Promise>, + ) => setupMain(fn), + setupMigrations: < + Migrations extends Array>, + >( + ...migrations: EnsureUniqueId + ) => + setupMigrations( + this.manifest, + ...migrations, + ), + setupUninstall: (fn: UninstallFn) => + setupUninstall(fn), + trigger: { + defaultTrigger, + cooldownTrigger, + changeOnFirstSuccess, + successFailure, + }, + + Backups: { + volumes: (...volumeNames: Array) => + Backups.volumes(...volumeNames), + addSets: ( + ...options: BackupSet[] + ) => Backups.addSets(...options), + withOptions: (options?: Partial) => + Backups.with_options(options), + }, + Config: { + of: < + Spec extends Record | Value>, + >( + spec: Spec, + ) => Config.of(spec), + }, + Daemons: { of: Daemons.of }, + DependencyConfig: { + of< + LocalConfig extends Record, + RemoteConfig extends Record, + >({ + localConfig, + remoteConfig, + dependencyConfig, + update, + }: { + localConfig: Config | Config + remoteConfig: Config | Config + dependencyConfig: (options: { + effects: Effects + localConfig: LocalConfig + utils: Utils + }) => Promise> + update?: Update, RemoteConfig> + }) { + return new DependencyConfig< + Manifest, + Store, + LocalConfig, + RemoteConfig + >(dependencyConfig, update) + }, + }, + List: { + text: List.text, + number: List.number, + obj: >( + a: { + name: string + description?: string | null + warning?: string | null + /** Default [] */ + default?: [] + minLength?: number | null + maxLength?: number | null + }, + aSpec: { + spec: Config + displayAs?: null | string + uniqueBy?: null | UniqueBy + }, + ) => List.obj(a, aSpec), + dynamicText: ( + getA: LazyBuild< + Store, + { + name: string + description?: string | null + warning?: string | null + /** Default = [] */ + default?: string[] + minLength?: number | null + maxLength?: number | null + disabled?: false | string + generate?: null | RandomString + spec: { + /** Default = false */ + masked?: boolean + placeholder?: string | null + minLength?: number | null + maxLength?: number | null + patterns: Pattern[] + /** Default = "text" */ + inputmode?: ListValueSpecText["inputmode"] + } + } + >, + ) => List.dynamicText(getA), + dynamicNumber: ( + getA: LazyBuild< + Store, + { + name: string + description?: string | null + warning?: string | null + /** Default = [] */ + default?: string[] + minLength?: number | null + maxLength?: number | null + disabled?: false | string + spec: { + integer: boolean + min?: number | null + max?: number | null + step?: number | null + units?: string | null + placeholder?: string | null + } + } + >, + ) => List.dynamicNumber(getA), + }, + Migration: { + of: (options: { + version: Version + up: (opts: { + effects: Effects + utils: Utils + }) => Promise + down: (opts: { + effects: Effects + utils: Utils + }) => Promise + }) => Migration.of(options), + }, + Value: { + toggle: Value.toggle, + text: Value.text, + textarea: Value.textarea, + number: Value.number, + color: Value.color, + datetime: Value.datetime, + select: Value.select, + multiselect: Value.multiselect, + object: Value.object, + union: Value.union, + list: Value.list, + dynamicToggle: ( + a: LazyBuild< + Store, + { + name: string + description?: string | null + warning?: string | null + default: boolean + disabled?: false | string + } + >, + ) => Value.dynamicToggle(a), + dynamicText: ( + getA: LazyBuild< + Store, + { + name: string + description?: string | null + warning?: string | null + required: RequiredDefault + + /** Default = false */ + masked?: boolean + placeholder?: string | null + minLength?: number | null + maxLength?: number | null + patterns?: Pattern[] + /** Default = 'text' */ + inputmode?: ValueSpecText["inputmode"] + generate?: null | RandomString + } + >, + ) => Value.dynamicText(getA), + dynamicTextarea: ( + getA: LazyBuild< + Store, + { + name: string + description?: string | null + warning?: string | null + required: boolean + minLength?: number | null + maxLength?: number | null + placeholder?: string | null + disabled?: false | string + generate?: null | RandomString + } + >, + ) => Value.dynamicTextarea(getA), + dynamicNumber: ( + getA: LazyBuild< + Store, + { + name: string + description?: string | null + warning?: string | null + required: RequiredDefault + min?: number | null + max?: number | null + /** Default = '1' */ + step?: number | null + integer: boolean + units?: string | null + placeholder?: string | null + disabled?: false | string + } + >, + ) => Value.dynamicNumber(getA), + dynamicColor: ( + getA: LazyBuild< + Store, + { + name: string + description?: string | null + warning?: string | null + required: RequiredDefault + + disabled?: false | string + } + >, + ) => Value.dynamicColor(getA), + dynamicDatetime: ( + getA: LazyBuild< + Store, + { + name: string + description?: string | null + warning?: string | null + required: RequiredDefault + /** Default = 'datetime-local' */ + inputmode?: ValueSpecDatetime["inputmode"] + min?: string | null + max?: string | null + disabled?: false | string + } + >, + ) => Value.dynamicDatetime(getA), + dynamicSelect: ( + getA: LazyBuild< + Store, + { + name: string + description?: string | null + warning?: string | null + required: RequiredDefault + values: Record + disabled?: false | string + } + >, + ) => Value.dynamicSelect(getA), + dynamicMultiselect: ( + getA: LazyBuild< + Store, + { + name: string + description?: string | null + warning?: string | null + default: string[] + values: Record + minLength?: number | null + maxLength?: number | null + disabled?: false | string + } + >, + ) => Value.dynamicMultiselect(getA), + filteredUnion: < + Required extends RequiredDefault, + Type extends Record, + >( + getDisabledFn: LazyBuild, + a: { + name: string + description?: string | null + warning?: string | null + required: Required + }, + aVariants: Variants | Variants, + ) => + Value.filteredUnion( + getDisabledFn, + a, + aVariants, + ), + + dynamicUnion: < + Required extends RequiredDefault, + Type extends Record, + >( + getA: LazyBuild< + Store, + { + disabled: string[] | false | string + name: string + description?: string | null + warning?: string | null + required: Required + } + >, + aVariants: Variants | Variants, + ) => Value.dynamicUnion(getA, aVariants), + }, + Variants: { + of: < + VariantValues extends { + [K in string]: { + name: string + spec: Config + } + }, + >( + a: VariantValues, + ) => Variants.of(a), + }, + } + } +} diff --git a/sdk/lib/actions/createAction.ts b/sdk/lib/actions/createAction.ts new file mode 100644 index 000000000..d14b7ce0d --- /dev/null +++ b/sdk/lib/actions/createAction.ts @@ -0,0 +1,101 @@ +import { Config, ExtractConfigType } from "../config/builder/config" +import { SDKManifest } from "../manifest/ManifestTypes" +import { ActionMetadata, ActionResult, Effects, ExportedAction } from "../types" +import { createUtils } from "../util" +import { Utils } from "../util/utils" + +export type MaybeFn = + | Value + | ((options: { + effects: Effects + utils: Utils + }) => Promise | Value) +export class CreatedAction< + Manifest extends SDKManifest, + Store, + ConfigType extends + | Record + | Config + | Config, + Type extends Record = ExtractConfigType, +> { + private constructor( + public readonly myMetaData: MaybeFn< + Manifest, + Store, + Omit + >, + readonly fn: (options: { + effects: Effects + utils: Utils + input: Type + }) => Promise, + readonly input: Config, + public validator = input.validator, + ) {} + + static of< + Manifest extends SDKManifest, + Store, + ConfigType extends + | Record + | Config + | Config, + Type extends Record = ExtractConfigType, + >( + metaData: MaybeFn>, + fn: (options: { + effects: Effects + utils: Utils + input: Type + }) => Promise, + inputConfig: Config | Config, + ) { + return new CreatedAction( + metaData, + fn, + inputConfig as Config, + ) + } + + exportedAction: ExportedAction = ({ effects, input }) => { + return this.fn({ + effects, + utils: createUtils(effects), + input: this.validator.unsafeCast(input), + }) + } + + run = async ({ effects, input }: { effects: Effects; input?: Type }) => { + return this.fn({ + effects, + utils: createUtils(effects), + input: this.validator.unsafeCast(input), + }) + } + + async metaData(options: { effects: Effects; utils: Utils }) { + if (this.myMetaData instanceof Function) + return await this.myMetaData(options) + return this.myMetaData + } + + async ActionMetadata(options: { + effects: Effects + utils: Utils + }): Promise { + return { + ...(await this.metaData(options)), + input: await this.input.build(options), + } + } + + async getConfig({ effects }: { effects: Effects }) { + return this.input.build({ + effects, + utils: createUtils(effects) as any, + }) + } +} + +export const createAction = CreatedAction.of diff --git a/sdk/lib/actions/index.ts b/sdk/lib/actions/index.ts new file mode 100644 index 000000000..603684b67 --- /dev/null +++ b/sdk/lib/actions/index.ts @@ -0,0 +1,3 @@ +import "./createAction" + +import "./setupActions" diff --git a/sdk/lib/actions/setupActions.ts b/sdk/lib/actions/setupActions.ts new file mode 100644 index 000000000..84a0e4345 --- /dev/null +++ b/sdk/lib/actions/setupActions.ts @@ -0,0 +1,42 @@ +import { SDKManifest } from "../manifest/ManifestTypes" +import { Effects, ExpectedExports } from "../types" +import { createUtils } from "../util" +import { once } from "../util/once" +import { Utils } from "../util/utils" +import { CreatedAction } from "./createAction" + +export function setupActions( + ...createdActions: CreatedAction[] +) { + const myActions = async (options: { + effects: Effects + utils: Utils + }) => { + const actions: Record> = {} + for (const action of createdActions) { + const actionMetadata = await action.metaData(options) + actions[actionMetadata.id] = action + } + return actions + } + const answer: { + actions: ExpectedExports.actions + actionsMetadata: ExpectedExports.actionsMetadata + } = { + actions(options: { effects: Effects }) { + const utils = createUtils(options.effects) + + return myActions({ + ...options, + utils, + }) + }, + async actionsMetadata({ effects }: { effects: Effects }) { + const utils = createUtils(effects) + return Promise.all( + createdActions.map((x) => x.ActionMetadata({ effects, utils })), + ) + }, + } + return answer +} diff --git a/sdk/lib/backup/Backups.ts b/sdk/lib/backup/Backups.ts new file mode 100644 index 000000000..659da0ec7 --- /dev/null +++ b/sdk/lib/backup/Backups.ts @@ -0,0 +1,181 @@ +import { SDKManifest } from "../manifest/ManifestTypes" +import * as T from "../types" + +export type BACKUP = "BACKUP" +export const DEFAULT_OPTIONS: T.BackupOptions = { + delete: true, + force: true, + ignoreExisting: false, + exclude: [], +} +export type BackupSet = { + srcPath: string + srcVolume: Volumes | BACKUP + dstPath: string + dstVolume: Volumes | BACKUP + options?: Partial +} +/** + * This utility simplifies the volume backup process. + * ```ts + * export const { createBackup, restoreBackup } = Backups.volumes("main").build(); + * ``` + * + * Changing the options of the rsync, (ie exludes) use either + * ```ts + * Backups.volumes("main").set_options({exclude: ['bigdata/']}).volumes('excludedVolume').build() + * // or + * Backups.with_options({exclude: ['bigdata/']}).volumes('excludedVolume').build() + * ``` + * + * Using the more fine control, using the addSets for more control + * ```ts + * Backups.addSets({ + * srcVolume: 'main', srcPath:'smallData/', dstPath: 'main/smallData/', dstVolume: : Backups.BACKUP + * }, { + * srcVolume: 'main', srcPath:'bigData/', dstPath: 'main/bigData/', dstVolume: : Backups.BACKUP, options: {exclude:['bigData/excludeThis']}} + * ).build()q + * ``` + */ +export class Backups { + static BACKUP: BACKUP = "BACKUP" + + private constructor( + private options = DEFAULT_OPTIONS, + private backupSet = [] as BackupSet[], + ) {} + static volumes( + ...volumeNames: Array + ): Backups { + return new Backups().addSets( + ...volumeNames.map((srcVolume) => ({ + srcVolume, + srcPath: "./", + dstPath: `./${srcVolume}/`, + dstVolume: Backups.BACKUP, + })), + ) + } + static addSets( + ...options: BackupSet[] + ) { + return new Backups().addSets(...options) + } + static with_options( + options?: Partial, + ) { + return new Backups({ ...DEFAULT_OPTIONS, ...options }) + } + + static withOptions = Backups.with_options + setOptions(options?: Partial) { + this.options = { + ...this.options, + ...options, + } + return this + } + volumes(...volumeNames: Array) { + return this.addSets( + ...volumeNames.map((srcVolume) => ({ + srcVolume, + srcPath: "./", + dstPath: `./${srcVolume}/`, + dstVolume: Backups.BACKUP, + })), + ) + } + addSets(...options: BackupSet[]) { + options.forEach((x) => + this.backupSet.push({ ...x, options: { ...this.options, ...x.options } }), + ) + return this + } + build() { + const createBackup: T.ExpectedExports.createBackup = async ({ + effects, + }) => { + // const previousItems = ( + // await effects + // .readDir({ + // volumeId: Backups.BACKUP, + // path: ".", + // }) + // .catch(() => []) + // ).map((x) => `${x}`) + // const backupPaths = this.backupSet + // .filter((x) => x.dstVolume === Backups.BACKUP) + // .map((x) => x.dstPath) + // .map((x) => x.replace(/\.\/([^]*)\//, "$1")) + // const filteredItems = previousItems.filter( + // (x) => backupPaths.indexOf(x) === -1, + // ) + // for (const itemToRemove of filteredItems) { + // effects.console.error(`Trying to remove ${itemToRemove}`) + // await effects + // .removeDir({ + // volumeId: Backups.BACKUP, + // path: itemToRemove, + // }) + // .catch(() => + // effects.removeFile({ + // volumeId: Backups.BACKUP, + // path: itemToRemove, + // }), + // ) + // .catch(() => { + // console.warn(`Failed to remove ${itemToRemove} from backup volume`) + // }) + // } + for (const item of this.backupSet) { + // if (notEmptyPath(item.dstPath)) { + // await effects.createDir({ + // volumeId: item.dstVolume, + // path: item.dstPath, + // }) + // } + // await effects + // .runRsync({ + // ...item, + // options: { + // ...this.options, + // ...item.options, + // }, + // }) + // .wait() + } + return + } + const restoreBackup: T.ExpectedExports.restoreBackup = async ({ + effects, + }) => { + for (const item of this.backupSet) { + // if (notEmptyPath(item.srcPath)) { + // await new Promise((resolve, reject) => fs.mkdir(items.src)).createDir( + // { + // volumeId: item.srcVolume, + // path: item.srcPath, + // }, + // ) + // } + // await effects + // .runRsync({ + // options: { + // ...this.options, + // ...item.options, + // }, + // srcVolume: item.dstVolume, + // dstVolume: item.srcVolume, + // srcPath: item.dstPath, + // dstPath: item.srcPath, + // }) + // .wait() + } + return + } + return { createBackup, restoreBackup } + } +} +function notEmptyPath(file: string) { + return ["", ".", "./"].indexOf(file) === -1 +} diff --git a/sdk/lib/backup/index.ts b/sdk/lib/backup/index.ts new file mode 100644 index 000000000..fe9cd8569 --- /dev/null +++ b/sdk/lib/backup/index.ts @@ -0,0 +1,3 @@ +import "./Backups" + +import "./setupBackups" diff --git a/sdk/lib/backup/setupBackups.ts b/sdk/lib/backup/setupBackups.ts new file mode 100644 index 000000000..d171a4aa7 --- /dev/null +++ b/sdk/lib/backup/setupBackups.ts @@ -0,0 +1,43 @@ +import { Backups } from "./Backups" +import { SDKManifest } from "../manifest/ManifestTypes" +import { ExpectedExports } from "../types" +import { _ } from "../util" + +export type SetupBackupsParams = Array< + M["volumes"][0] | Backups +> + +export function setupBackups( + ...args: _> +) { + const backups = Array>() + const volumes = new Set() + for (const arg of args) { + if (arg instanceof Backups) { + backups.push(arg) + } else { + volumes.add(arg) + } + } + backups.push(Backups.volumes(...volumes)) + const answer: { + createBackup: ExpectedExports.createBackup + restoreBackup: ExpectedExports.restoreBackup + } = { + get createBackup() { + return (async (options) => { + for (const backup of backups) { + await backup.build().createBackup(options) + } + }) as ExpectedExports.createBackup + }, + get restoreBackup() { + return (async (options) => { + for (const backup of backups) { + await backup.build().restoreBackup(options) + } + }) as ExpectedExports.restoreBackup + }, + } + return answer +} diff --git a/sdk/lib/config/builder/config.ts b/sdk/lib/config/builder/config.ts new file mode 100644 index 000000000..81009abaa --- /dev/null +++ b/sdk/lib/config/builder/config.ts @@ -0,0 +1,139 @@ +import { ValueSpec } from "../configTypes" +import { Utils } from "../../util/utils" +import { Value } from "./value" +import { _ } from "../../util" +import { Effects } from "../../types" +import { Parser, object } from "ts-matches" + +export type LazyBuildOptions = { + effects: Effects + utils: Utils +} +export type LazyBuild = ( + options: LazyBuildOptions, +) => Promise | ExpectedOut + +// prettier-ignore +export type ExtractConfigType | Config, any> | Config, never>> = + A extends Config | Config ? B : + A + +export type ConfigSpecOf, Store = never> = { + [K in keyof A]: Value +} + +export type MaybeLazyValues = LazyBuild | A +/** + * Configs are the specs that are used by the os configuration form for this service. + * Here is an example of a simple configuration + ```ts + const smallConfig = Config.of({ + test: Value.boolean({ + name: "Test", + description: "This is the description for the test", + warning: null, + default: false, + }), + }); + ``` + + The idea of a config is that now the form is going to ask for + Test: [ ] and the value is going to be checked as a boolean. + There are more complex values like selects, lists, and objects. See {@link Value} + + Also, there is the ability to get a validator/parser from this config spec. + ```ts + const matchSmallConfig = smallConfig.validator(); + type SmallConfig = typeof matchSmallConfig._TYPE; + ``` + + Here is an example of a more complex configuration which came from a configuration for a service + that works with bitcoin, like c-lightning. + ```ts + + export const hostname = Value.string({ + name: "Hostname", + default: null, + description: "Domain or IP address of bitcoin peer", + warning: null, + required: true, + masked: false, + placeholder: null, + pattern: + "(^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$)|((^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$)|(^[a-z2-7]{16}\\.onion$)|(^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$))", + patternDescription: + "Must be either a domain name, or an IPv4 or IPv6 address. Do not include protocol scheme (eg 'http://') or port.", +}); +export const port = Value.number({ + name: "Port", + default: null, + description: "Port that peer is listening on for inbound p2p connections", + warning: null, + required: false, + range: "[0,65535]", + integral: true, + units: null, + placeholder: null, +}); +export const addNodesSpec = Config.of({ hostname: hostname, port: port }); + + ``` + */ +export class Config, Store = never> { + private constructor( + private readonly spec: { + [K in keyof Type]: Value | Value + }, + public validator: Parser, + ) {} + async build(options: LazyBuildOptions) { + const answer = {} as { + [K in keyof Type]: ValueSpec + } + for (const k in this.spec) { + answer[k] = await this.spec[k].build(options as any) + } + return answer + } + + static of< + Spec extends Record | Value>, + Store = never, + >(spec: Spec) { + const validatorObj = {} as { + [K in keyof Spec]: Parser + } + for (const key in spec) { + validatorObj[key] = spec[key].validator + } + const validator = object(validatorObj) + return new Config< + { + [K in keyof Spec]: Spec[K] extends + | Value + | Value + ? T + : never + }, + Store + >(spec, validator as any) + } + + /** + * Use this during the times that the input needs a more specific type. + * Used in types that the value/ variant/ list/ config is constructed somewhere else. + ```ts + const a = Config.text({ + name: "a", + required: false, + }) + + return Config.of()({ + myValue: a.withStore(), + }) + ``` + */ + withStore() { + return this as any as Config + } +} diff --git a/sdk/lib/config/builder/index.ts b/sdk/lib/config/builder/index.ts new file mode 100644 index 000000000..a0d794b16 --- /dev/null +++ b/sdk/lib/config/builder/index.ts @@ -0,0 +1,4 @@ +import "./config" +import "./list" +import "./value" +import "./variants" diff --git a/sdk/lib/config/builder/list.ts b/sdk/lib/config/builder/list.ts new file mode 100644 index 000000000..23de0c495 --- /dev/null +++ b/sdk/lib/config/builder/list.ts @@ -0,0 +1,279 @@ +import { Config, LazyBuild } from "./config" +import { + ListValueSpecText, + Pattern, + RandomString, + UniqueBy, + ValueSpecList, + ValueSpecListOf, + ValueSpecText, +} from "../configTypes" +import { Parser, arrayOf, number, string } from "ts-matches" +/** + * Used as a subtype of Value.list +```ts +export const authorizationList = List.string({ + "name": "Authorization", + "range": "[0,*)", + "default": [], + "description": "Username and hashed password for JSON-RPC connections. RPC clients connect using the usual http basic authentication.", + "warning": null +}, {"masked":false,"placeholder":null,"pattern":"^[a-zA-Z0-9_-]+:([0-9a-fA-F]{2})+\\$([0-9a-fA-F]{2})+$","patternDescription":"Each item must be of the form \":$\"."}); +export const auth = Value.list(authorizationList); +``` +*/ +export class List { + private constructor( + public build: LazyBuild, + public validator: Parser, + ) {} + static text( + a: { + name: string + description?: string | null + warning?: string | null + /** Default = [] */ + default?: string[] + minLength?: number | null + maxLength?: number | null + }, + aSpec: { + /** Default = false */ + masked?: boolean + placeholder?: string | null + minLength?: number | null + maxLength?: number | null + patterns: Pattern[] + /** Default = "text" */ + inputmode?: ListValueSpecText["inputmode"] + generate?: null | RandomString + }, + ) { + return new List(() => { + const spec = { + type: "text" as const, + placeholder: null, + minLength: null, + maxLength: null, + masked: false, + inputmode: "text" as const, + generate: null, + ...aSpec, + } + const built: ValueSpecListOf<"text"> = { + description: null, + warning: null, + default: [], + type: "list" as const, + minLength: null, + maxLength: null, + disabled: false, + ...a, + spec, + } + return built + }, arrayOf(string)) + } + static dynamicText( + getA: LazyBuild< + Store, + { + name: string + description?: string | null + warning?: string | null + /** Default = [] */ + default?: string[] + minLength?: number | null + maxLength?: number | null + disabled?: false | string + generate?: null | RandomString + spec: { + /** Default = false */ + masked?: boolean + placeholder?: string | null + minLength?: number | null + maxLength?: number | null + patterns: Pattern[] + /** Default = "text" */ + inputmode?: ListValueSpecText["inputmode"] + } + } + >, + ) { + return new List(async (options) => { + const { spec: aSpec, ...a } = await getA(options) + const spec = { + type: "text" as const, + placeholder: null, + minLength: null, + maxLength: null, + masked: false, + inputmode: "text" as const, + generate: null, + ...aSpec, + } + const built: ValueSpecListOf<"text"> = { + description: null, + warning: null, + default: [], + type: "list" as const, + minLength: null, + maxLength: null, + disabled: false, + ...a, + spec, + } + return built + }, arrayOf(string)) + } + static number( + a: { + name: string + description?: string | null + warning?: string | null + /** Default = [] */ + default?: string[] + minLength?: number | null + maxLength?: number | null + }, + aSpec: { + integer: boolean + min?: number | null + max?: number | null + step?: number | null + units?: string | null + placeholder?: string | null + }, + ) { + return new List(() => { + const spec = { + type: "number" as const, + placeholder: null, + min: null, + max: null, + step: null, + units: null, + ...aSpec, + } + const built: ValueSpecListOf<"number"> = { + description: null, + warning: null, + minLength: null, + maxLength: null, + default: [], + type: "list" as const, + disabled: false, + ...a, + spec, + } + return built + }, arrayOf(number)) + } + static dynamicNumber( + getA: LazyBuild< + Store, + { + name: string + description?: string | null + warning?: string | null + /** Default = [] */ + default?: string[] + minLength?: number | null + maxLength?: number | null + disabled?: false | string + spec: { + integer: boolean + min?: number | null + max?: number | null + step?: number | null + units?: string | null + placeholder?: string | null + } + } + >, + ) { + return new List(async (options) => { + const { spec: aSpec, ...a } = await getA(options) + const spec = { + type: "number" as const, + placeholder: null, + min: null, + max: null, + step: null, + units: null, + ...aSpec, + } + return { + description: null, + warning: null, + minLength: null, + maxLength: null, + default: [], + type: "list" as const, + disabled: false, + ...a, + spec, + } + }, arrayOf(number)) + } + static obj, Store>( + a: { + name: string + description?: string | null + warning?: string | null + /** Default [] */ + default?: [] + minLength?: number | null + maxLength?: number | null + }, + aSpec: { + spec: Config + displayAs?: null | string + uniqueBy?: null | UniqueBy + }, + ) { + return new List(async (options) => { + const { spec: previousSpecSpec, ...restSpec } = aSpec + const specSpec = await previousSpecSpec.build(options) + const spec = { + type: "object" as const, + displayAs: null, + uniqueBy: null, + ...restSpec, + spec: specSpec, + } + const value = { + spec, + default: [], + ...a, + } + return { + description: null, + warning: null, + minLength: null, + maxLength: null, + type: "list" as const, + disabled: false, + ...value, + } + }, arrayOf(aSpec.spec.validator)) + } + + /** + * Use this during the times that the input needs a more specific type. + * Used in types that the value/ variant/ list/ config is constructed somewhere else. + ```ts + const a = Config.text({ + name: "a", + required: false, + }) + + return Config.of()({ + myValue: a.withStore(), + }) + ``` + */ + withStore() { + return this as any as List + } +} diff --git a/sdk/lib/config/builder/value.ts b/sdk/lib/config/builder/value.ts new file mode 100644 index 000000000..01673a6df --- /dev/null +++ b/sdk/lib/config/builder/value.ts @@ -0,0 +1,783 @@ +import { Config, LazyBuild, LazyBuildOptions } from "./config" +import { List } from "./list" +import { Variants } from "./variants" +import { + FilePath, + Pattern, + RandomString, + ValueSpec, + ValueSpecDatetime, + ValueSpecText, + ValueSpecTextarea, +} from "../configTypes" +import { DefaultString } from "../configTypes" +import { _ } from "../../util" +import { + Parser, + anyOf, + arrayOf, + boolean, + literal, + literals, + number, + object, + string, + unknown, +} from "ts-matches" +import { once } from "../../util/once" + +export type RequiredDefault = + | false + | { + default: A | null + } + +function requiredLikeToAbove, A>( + requiredLike: Input, +) { + // prettier-ignore + return { + required: (typeof requiredLike === 'object' ? true : requiredLike) as ( + Input extends { default: unknown} ? true: + Input extends true ? true : + false + ), + default:(typeof requiredLike === 'object' ? requiredLike.default : null) as ( + Input extends { default: infer Default } ? Default : + null + ) + }; +} +type AsRequired = MaybeRequiredType extends + | { default: unknown } + | never + ? Type + : Type | null | undefined + +type InputAsRequired = A extends + | { required: { default: any } | never } + | never + ? Type + : Type | null | undefined +const testForAsRequiredParser = once( + () => object({ required: object({ default: unknown }) }).test, +) +function asRequiredParser< + Type, + Input, + Return extends + | Parser + | Parser, +>(parser: Parser, input: Input): Return { + if (testForAsRequiredParser()(input)) return parser as any + return parser.optional() as any +} + +/** + * A value is going to be part of the form in the FE of the OS. + * Something like a boolean, a string, a number, etc. + * in the fe it will ask for the name of value, and use the rest of the value to determine how to render it. + * While writing with a value, you will start with `Value.` then let the IDE suggest the rest. + * for things like string, the options are going to be in {}. + * Keep an eye out for another config builder types as params. + * Note, usually this is going to be used in a `Config` {@link Config} builder. + ```ts +const username = Value.string({ + name: "Username", + default: "bitcoin", + description: "The username for connecting to Bitcoin over RPC.", + warning: null, + required: true, + masked: true, + placeholder: null, + pattern: "^[a-zA-Z0-9_]+$", + patternDescription: "Must be alphanumeric (can contain underscore).", +}); + ``` + */ +export class Value { + protected constructor( + public build: LazyBuild, + public validator: Parser, + ) {} + static toggle(a: { + name: string + description?: string | null + warning?: string | null + default: boolean + /** Immutable means it can only be configed at the first config then never again + Default is false */ + immutable?: boolean + }) { + return new Value( + async () => ({ + description: null, + warning: null, + type: "toggle" as const, + disabled: false, + immutable: a.immutable ?? false, + ...a, + }), + boolean, + ) + } + static dynamicToggle( + a: LazyBuild< + Store, + { + name: string + description?: string | null + warning?: string | null + default: boolean + disabled?: false | string + } + >, + ) { + return new Value( + async (options) => ({ + description: null, + warning: null, + type: "toggle" as const, + disabled: false, + immutable: false, + ...(await a(options)), + }), + boolean, + ) + } + static text>(a: { + name: string + description?: string | null + warning?: string | null + required: Required + + /** Default = false */ + masked?: boolean + placeholder?: string | null + minLength?: number | null + maxLength?: number | null + patterns?: Pattern[] + /** Default = 'text' */ + inputmode?: ValueSpecText["inputmode"] + /** Immutable means it can only be configured at the first config then never again + * Default is false + */ + immutable?: boolean + generate?: null | RandomString + }) { + return new Value, never>( + async () => ({ + type: "text" as const, + description: null, + warning: null, + masked: false, + placeholder: null, + minLength: null, + maxLength: null, + patterns: [], + inputmode: "text", + disabled: false, + immutable: a.immutable ?? false, + generate: a.generate ?? null, + ...a, + ...requiredLikeToAbove(a.required), + }), + asRequiredParser(string, a), + ) + } + static dynamicText( + getA: LazyBuild< + Store, + { + name: string + description?: string | null + warning?: string | null + required: RequiredDefault + + /** Default = false */ + masked?: boolean + placeholder?: string | null + minLength?: number | null + maxLength?: number | null + patterns?: Pattern[] + /** Default = 'text' */ + inputmode?: ValueSpecText["inputmode"] + disabled?: string | false + /** Immutable means it can only be configured at the first config then never again + * Default is false + */ + generate?: null | RandomString + } + >, + ) { + return new Value(async (options) => { + const a = await getA(options) + return { + type: "text" as const, + description: null, + warning: null, + masked: false, + placeholder: null, + minLength: null, + maxLength: null, + patterns: [], + inputmode: "text", + disabled: false, + immutable: false, + generate: a.generate ?? null, + ...a, + ...requiredLikeToAbove(a.required), + } + }, string.optional()) + } + static textarea(a: { + name: string + description?: string | null + warning?: string | null + required: boolean + minLength?: number | null + maxLength?: number | null + placeholder?: string | null + /** Immutable means it can only be configed at the first config then never again + Default is false */ + immutable?: boolean + }) { + return new Value(async () => { + const built: ValueSpecTextarea = { + description: null, + warning: null, + minLength: null, + maxLength: null, + placeholder: null, + type: "textarea" as const, + disabled: false, + immutable: a.immutable ?? false, + ...a, + } + return built + }, string) + } + static dynamicTextarea( + getA: LazyBuild< + Store, + { + name: string + description?: string | null + warning?: string | null + required: boolean + minLength?: number | null + maxLength?: number | null + placeholder?: string | null + disabled?: false | string + } + >, + ) { + return new Value(async (options) => { + const a = await getA(options) + return { + description: null, + warning: null, + minLength: null, + maxLength: null, + placeholder: null, + type: "textarea" as const, + disabled: false, + immutable: false, + ...a, + } + }, string) + } + static number>(a: { + name: string + description?: string | null + warning?: string | null + required: Required + min?: number | null + max?: number | null + /** Default = '1' */ + step?: number | null + integer: boolean + units?: string | null + placeholder?: string | null + /** Immutable means it can only be configed at the first config then never again + Default is false */ + immutable?: boolean + }) { + return new Value, never>( + () => ({ + type: "number" as const, + description: null, + warning: null, + min: null, + max: null, + step: null, + units: null, + placeholder: null, + disabled: false, + immutable: a.immutable ?? false, + ...a, + ...requiredLikeToAbove(a.required), + }), + asRequiredParser(number, a), + ) + } + static dynamicNumber( + getA: LazyBuild< + Store, + { + name: string + description?: string | null + warning?: string | null + required: RequiredDefault + min?: number | null + max?: number | null + /** Default = '1' */ + step?: number | null + integer: boolean + units?: string | null + placeholder?: string | null + disabled?: false | string + } + >, + ) { + return new Value(async (options) => { + const a = await getA(options) + return { + type: "number" as const, + description: null, + warning: null, + min: null, + max: null, + step: null, + units: null, + placeholder: null, + disabled: false, + immutable: false, + ...a, + ...requiredLikeToAbove(a.required), + } + }, number.optional()) + } + static color>(a: { + name: string + description?: string | null + warning?: string | null + required: Required + /** Immutable means it can only be configed at the first config then never again + Default is false */ + immutable?: boolean + }) { + return new Value, never>( + () => ({ + type: "color" as const, + description: null, + warning: null, + disabled: false, + immutable: a.immutable ?? false, + ...a, + ...requiredLikeToAbove(a.required), + }), + + asRequiredParser(string, a), + ) + } + + static dynamicColor( + getA: LazyBuild< + Store, + { + name: string + description?: string | null + warning?: string | null + required: RequiredDefault + disabled?: false | string + } + >, + ) { + return new Value(async (options) => { + const a = await getA(options) + return { + type: "color" as const, + description: null, + warning: null, + disabled: false, + immutable: false, + ...a, + ...requiredLikeToAbove(a.required), + } + }, string.optional()) + } + static datetime>(a: { + name: string + description?: string | null + warning?: string | null + required: Required + /** Default = 'datetime-local' */ + inputmode?: ValueSpecDatetime["inputmode"] + min?: string | null + max?: string | null + /** Immutable means it can only be configed at the first config then never again + Default is false */ + immutable?: boolean + }) { + return new Value, never>( + () => ({ + type: "datetime" as const, + description: null, + warning: null, + inputmode: "datetime-local", + min: null, + max: null, + step: null, + disabled: false, + immutable: a.immutable ?? false, + ...a, + ...requiredLikeToAbove(a.required), + }), + asRequiredParser(string, a), + ) + } + static dynamicDatetime( + getA: LazyBuild< + Store, + { + name: string + description?: string | null + warning?: string | null + required: RequiredDefault + /** Default = 'datetime-local' */ + inputmode?: ValueSpecDatetime["inputmode"] + min?: string | null + max?: string | null + disabled?: false | string + } + >, + ) { + return new Value(async (options) => { + const a = await getA(options) + return { + type: "datetime" as const, + description: null, + warning: null, + inputmode: "datetime-local", + min: null, + max: null, + disabled: false, + immutable: false, + ...a, + ...requiredLikeToAbove(a.required), + } + }, string.optional()) + } + static select< + Required extends RequiredDefault, + B extends Record, + >(a: { + name: string + description?: string | null + warning?: string | null + required: Required + values: B + /** + * Disabled: false means that there is nothing disabled, good to modify + * string means that this is the message displayed and the whole thing is disabled + * string[] means that the options are disabled + */ + disabled?: false | string | (string & keyof B)[] + /** Immutable means it can only be configed at the first config then never again + Default is false */ + immutable?: boolean + }) { + return new Value, never>( + () => ({ + description: null, + warning: null, + type: "select" as const, + disabled: false, + immutable: a.immutable ?? false, + ...a, + ...requiredLikeToAbove(a.required), + }), + asRequiredParser( + anyOf( + ...Object.keys(a.values).map((x: keyof B & string) => literal(x)), + ), + a, + ) as any, + ) + } + static dynamicSelect( + getA: LazyBuild< + Store, + { + name: string + description?: string | null + warning?: string | null + required: RequiredDefault + values: Record + /** + * Disabled: false means that there is nothing disabled, good to modify + * string means that this is the message displayed and the whole thing is disabled + * string[] means that the options are disabled + */ + disabled?: false | string | string[] + } + >, + ) { + return new Value(async (options) => { + const a = await getA(options) + return { + description: null, + warning: null, + type: "select" as const, + disabled: false, + immutable: false, + ...a, + ...requiredLikeToAbove(a.required), + } + }, string.optional()) + } + static multiselect>(a: { + name: string + description?: string | null + warning?: string | null + default: string[] + values: Values + minLength?: number | null + maxLength?: number | null + /** Immutable means it can only be configed at the first config then never again + Default is false */ + immutable?: boolean + /** + * Disabled: false means that there is nothing disabled, good to modify + * string means that this is the message displayed and the whole thing is disabled + * string[] means that the options are disabled + */ + disabled?: false | string | (string & keyof Values)[] + }) { + return new Value<(keyof Values)[], never>( + () => ({ + type: "multiselect" as const, + minLength: null, + maxLength: null, + warning: null, + description: null, + disabled: false, + immutable: a.immutable ?? false, + ...a, + }), + arrayOf( + literals(...(Object.keys(a.values) as any as [keyof Values & string])), + ), + ) + } + static dynamicMultiselect( + getA: LazyBuild< + Store, + { + name: string + description?: string | null + warning?: string | null + default: string[] + values: Record + minLength?: number | null + maxLength?: number | null + /** + * Disabled: false means that there is nothing disabled, good to modify + * string means that this is the message displayed and the whole thing is disabled + * string[] means that the options are disabled + */ + disabled?: false | string | string[] + } + >, + ) { + return new Value(async (options) => { + const a = await getA(options) + return { + type: "multiselect" as const, + minLength: null, + maxLength: null, + warning: null, + description: null, + disabled: false, + immutable: false, + ...a, + } + }, arrayOf(string)) + } + static object, Store>( + a: { + name: string + description?: string | null + warning?: string | null + }, + spec: Config, + ) { + return new Value(async (options) => { + const built = await spec.build(options as any) + return { + type: "object" as const, + description: null, + warning: null, + ...a, + spec: built, + } + }, spec.validator) + } + static file, Store>(a: { + name: string + description?: string | null + warning?: string | null + extensions: string[] + required: Required + }) { + const buildValue = { + type: "file" as const, + description: null, + warning: null, + ...a, + } + return new Value, Store>( + () => ({ + ...buildValue, + + ...requiredLikeToAbove(a.required), + }), + asRequiredParser(object({ filePath: string }), a), + ) + } + static dynamicFile( + a: LazyBuild< + Store, + { + name: string + description?: string | null + warning?: string | null + extensions: string[] + required: Required + } + >, + ) { + return new Value( + async (options) => ({ + type: "file" as const, + description: null, + warning: null, + ...(await a(options)), + }), + string.optional(), + ) + } + static union, Type, Store>( + a: { + name: string + description?: string | null + warning?: string | null + required: Required + /** Immutable means it can only be configed at the first config then never again + Default is false */ + immutable?: boolean + /** + * Disabled: false means that there is nothing disabled, good to modify + * string means that this is the message displayed and the whole thing is disabled + * string[] means that the options are disabled + */ + disabled?: false | string | string[] + }, + aVariants: Variants, + ) { + return new Value, Store>( + async (options) => ({ + type: "union" as const, + description: null, + warning: null, + disabled: false, + ...a, + variants: await aVariants.build(options as any), + ...requiredLikeToAbove(a.required), + immutable: a.immutable ?? false, + }), + asRequiredParser(aVariants.validator, a), + ) + } + static filteredUnion< + Required extends RequiredDefault, + Type extends Record, + Store = never, + >( + getDisabledFn: LazyBuild, + a: { + name: string + description?: string | null + warning?: string | null + required: Required + }, + aVariants: Variants | Variants, + ) { + return new Value, Store>( + async (options) => ({ + type: "union" as const, + description: null, + warning: null, + ...a, + variants: await aVariants.build(options as any), + ...requiredLikeToAbove(a.required), + disabled: (await getDisabledFn(options)) || false, + immutable: false, + }), + asRequiredParser(aVariants.validator, a), + ) + } + static dynamicUnion< + Required extends RequiredDefault, + Type extends Record, + Store = never, + >( + getA: LazyBuild< + Store, + { + disabled: string[] | false | string + name: string + description?: string | null + warning?: string | null + required: Required + } + >, + aVariants: Variants | Variants, + ) { + return new Value(async (options) => { + const newValues = await getA(options) + return { + type: "union" as const, + description: null, + warning: null, + ...newValues, + variants: await aVariants.build(options as any), + ...requiredLikeToAbove(newValues.required), + immutable: false, + } + }, aVariants.validator.optional()) + } + + static list(a: List) { + return new Value((options) => a.build(options), a.validator) + } + + /** + * Use this during the times that the input needs a more specific type. + * Used in types that the value/ variant/ list/ config is constructed somewhere else. + ```ts + const a = Config.text({ + name: "a", + required: false, + }) + + return Config.of()({ + myValue: a.withStore(), + }) + ``` + */ + withStore() { + return this as any as Value + } +} diff --git a/sdk/lib/config/builder/variants.ts b/sdk/lib/config/builder/variants.ts new file mode 100644 index 000000000..1e7a2a384 --- /dev/null +++ b/sdk/lib/config/builder/variants.ts @@ -0,0 +1,120 @@ +import { InputSpec, ValueSpecUnion } from "../configTypes" +import { LazyBuild, Config } from "./config" +import { Parser, anyOf, literals, object } from "ts-matches" + +/** + * Used in the the Value.select { @link './value.ts' } + * to indicate the type of select variants that are available. The key for the record passed in will be the + * key to the tag.id in the Value.select +```ts + +export const disabled = Config.of({}); +export const size = Value.number({ + name: "Max Chain Size", + default: 550, + description: "Limit of blockchain size on disk.", + warning: "Increasing this value will require re-syncing your node.", + required: true, + range: "[550,1000000)", + integral: true, + units: "MiB", + placeholder: null, +}); +export const automatic = Config.of({ size: size }); +export const size1 = Value.number({ + name: "Failsafe Chain Size", + default: 65536, + description: "Prune blockchain if size expands beyond this.", + warning: null, + required: true, + range: "[550,1000000)", + integral: true, + units: "MiB", + placeholder: null, +}); +export const manual = Config.of({ size: size1 }); +export const pruningSettingsVariants = Variants.of({ + disabled: { name: "Disabled", spec: disabled }, + automatic: { name: "Automatic", spec: automatic }, + manual: { name: "Manual", spec: manual }, +}); +export const pruning = Value.union( + { + name: "Pruning Settings", + description: + '- Disabled: Disable pruning\n- Automatic: Limit blockchain size on disk to a certain number of megabytes\n- Manual: Prune blockchain with the "pruneblockchain" RPC\n', + warning: null, + required: true, + default: "disabled", + }, + pruningSettingsVariants +); +``` + */ +export class Variants { + static text: any + private constructor( + public build: LazyBuild, + public validator: Parser, + ) {} + static of< + VariantValues extends { + [K in string]: { + name: string + spec: Config | Config + } + }, + Store = never, + >(a: VariantValues) { + const validator = anyOf( + ...Object.entries(a).map(([name, { spec }]) => + object({ + unionSelectKey: literals(name), + unionValueKey: spec.validator, + }), + ), + ) as Parser + + return new Variants< + { + [K in keyof VariantValues]: { + unionSelectKey: K + // prettier-ignore + unionValueKey: + VariantValues[K]["spec"] extends (Config | Config) ? B : + never + } + }[keyof VariantValues], + Store + >(async (options) => { + const variants = {} as { + [K in keyof VariantValues]: { name: string; spec: InputSpec } + } + for (const key in a) { + const value = a[key] + variants[key] = { + name: value.name, + spec: await value.spec.build(options as any), + } + } + return variants + }, validator) + } + /** + * Use this during the times that the input needs a more specific type. + * Used in types that the value/ variant/ list/ config is constructed somewhere else. + ```ts + const a = Config.text({ + name: "a", + required: false, + }) + + return Config.of()({ + myValue: a.withStore(), + }) + ``` + */ + withStore() { + return this as any as Variants + } +} diff --git a/sdk/lib/config/configConstants.ts b/sdk/lib/config/configConstants.ts new file mode 100644 index 000000000..13cfe32b9 --- /dev/null +++ b/sdk/lib/config/configConstants.ts @@ -0,0 +1,80 @@ +import { SmtpValue } from "../types" +import { email } from "../util/patterns" +import { Config, ConfigSpecOf } from "./builder/config" +import { Value } from "./builder/value" +import { Variants } from "./builder/variants" + +/** + * Base SMTP settings, to be used by StartOS for system wide SMTP + */ +export const customSmtp = Config.of, never>({ + server: Value.text({ + name: "SMTP Server", + required: { + default: null, + }, + }), + port: Value.number({ + name: "Port", + required: { default: 587 }, + min: 1, + max: 65535, + integer: true, + }), + from: Value.text({ + name: "From Address", + required: { + default: null, + }, + placeholder: "test@example.com", + inputmode: "email", + patterns: [email], + }), + login: Value.text({ + name: "Login", + required: { + default: null, + }, + }), + password: Value.text({ + name: "Password", + required: false, + masked: true, + }), +}) + +/** + * For service config. Gives users 3 options for SMTP: (1) disabled, (2) use system SMTP settings, (3) use custom SMTP settings + */ +export const smtpConfig = Value.filteredUnion( + async ({ effects, utils }) => { + const smtp = await utils.getSystemSmtp().once() + return smtp ? [] : ["system"] + }, + { + name: "SMTP", + description: "Optionally provide an SMTP server for sending emails", + required: { default: "disabled" }, + }, + Variants.of({ + disabled: { name: "Disabled", spec: Config.of({}) }, + system: { + name: "System Credentials", + spec: Config.of({ + customFrom: Value.text({ + name: "Custom From Address", + description: + "A custom from address for this service. If not provided, the system from address will be used.", + required: false, + placeholder: "test@example.com", + inputmode: "email", + patterns: [email], + }), + }), + }, + custom: { + name: "Custom Credentials", + spec: customSmtp, + }, + }), +) diff --git a/sdk/lib/config/configDependencies.ts b/sdk/lib/config/configDependencies.ts new file mode 100644 index 000000000..6b31abc81 --- /dev/null +++ b/sdk/lib/config/configDependencies.ts @@ -0,0 +1,25 @@ +import { SDKManifest } from "../manifest/ManifestTypes" +import { Dependency } from "../types" + +export type ConfigDependencies = { + exists(id: keyof T["dependencies"]): Dependency + running(id: keyof T["dependencies"]): Dependency +} + +export const configDependenciesSet = < + T extends SDKManifest, +>(): ConfigDependencies => ({ + exists(id: keyof T["dependencies"]) { + return { + id, + kind: "exists", + } as Dependency + }, + + running(id: keyof T["dependencies"]) { + return { + id, + kind: "running", + } as Dependency + }, +}) diff --git a/sdk/lib/config/configTypes.ts b/sdk/lib/config/configTypes.ts new file mode 100644 index 000000000..14e0e1d1d --- /dev/null +++ b/sdk/lib/config/configTypes.ts @@ -0,0 +1,249 @@ +export type InputSpec = Record +export type ValueType = + | "text" + | "textarea" + | "number" + | "color" + | "datetime" + | "toggle" + | "select" + | "multiselect" + | "list" + | "object" + | "file" + | "union" +export type ValueSpec = ValueSpecOf +/** core spec types. These types provide the metadata for performing validations */ +// prettier-ignore +export type ValueSpecOf = T extends "text" + ? ValueSpecText + : T extends "textarea" + ? ValueSpecTextarea + : T extends "number" + ? ValueSpecNumber + : T extends "color" + ? ValueSpecColor + : T extends "datetime" + ? ValueSpecDatetime + : T extends "toggle" + ? ValueSpecToggle + : T extends "select" + ? ValueSpecSelect + : T extends "multiselect" + ? ValueSpecMultiselect + : T extends "list" + ? ValueSpecList + : T extends "object" + ? ValueSpecObject + : T extends "file" + ? ValueSpecFile + : T extends "union" + ? ValueSpecUnion + : never + +export interface ValueSpecText extends ListValueSpecText, WithStandalone { + required: boolean + default: DefaultString | null + disabled: false | string + generate: null | RandomString + /** Immutable means it can only be configed at the first config then never again */ + immutable: boolean +} +export interface ValueSpecTextarea extends WithStandalone { + type: "textarea" + placeholder: string | null + minLength: number | null + maxLength: number | null + required: boolean + disabled: false | string + /** Immutable means it can only be configed at the first config then never again */ + immutable: boolean +} + +export type FilePath = { + filePath: string +} +export interface ValueSpecNumber extends ListValueSpecNumber, WithStandalone { + required: boolean + default: number | null + disabled: false | string + /** Immutable means it can only be configed at the first config then never again */ + immutable: boolean +} +export interface ValueSpecColor extends WithStandalone { + type: "color" + required: boolean + default: string | null + disabled: false | string + /** Immutable means it can only be configed at the first config then never again */ + immutable: boolean +} +export interface ValueSpecDatetime extends WithStandalone { + type: "datetime" + required: boolean + inputmode: "date" | "time" | "datetime-local" + min: string | null + max: string | null + default: string | null + disabled: false | string + /** Immutable means it can only be configed at the first config then never again */ + immutable: boolean +} +export interface ValueSpecSelect extends SelectBase, WithStandalone { + type: "select" + required: boolean + default: string | null + /** + * Disabled: false means that there is nothing disabled, good to modify + * string means that this is the message displayed and the whole thing is disabled + * string[] means that the options are disabled + */ + disabled: false | string | string[] + /** Immutable means it can only be configed at the first config then never again */ + immutable: boolean +} +export interface ValueSpecMultiselect extends SelectBase, WithStandalone { + type: "multiselect" + minLength: number | null + maxLength: number | null + /** + * Disabled: false means that there is nothing disabled, good to modify + * string means that this is the message displayed and the whole thing is disabled + * string[] means that the options are disabled + */ + disabled: false | string | string[] + default: string[] + /** Immutable means it can only be configed at the first config then never again */ + immutable: boolean +} +export interface ValueSpecToggle extends WithStandalone { + type: "toggle" + default: boolean | null + disabled: false | string + /** Immutable means it can only be configed at the first config then never again */ + immutable: boolean +} +export interface ValueSpecUnion extends WithStandalone { + type: "union" + variants: Record< + string, + { + name: string + spec: InputSpec + } + > + /** + * Disabled: false means that there is nothing disabled, good to modify + * string means that this is the message displayed and the whole thing is disabled + * string[] means that the options are disabled + */ + disabled: false | string | string[] + required: boolean + default: string | null + /** Immutable means it can only be configed at the first config then never again */ + immutable: boolean +} +export interface ValueSpecFile extends WithStandalone { + type: "file" + extensions: string[] + required: boolean +} +export interface ValueSpecObject extends WithStandalone { + type: "object" + spec: InputSpec +} +export interface WithStandalone { + name: string + description: string | null + warning: string | null +} +export interface SelectBase { + values: Record +} +export type ListValueSpecType = "text" | "number" | "object" +/** represents a spec for the values of a list */ +export type ListValueSpecOf = T extends "text" + ? ListValueSpecText + : T extends "number" + ? ListValueSpecNumber + : T extends "object" + ? ListValueSpecObject + : never +/** represents a spec for a list */ +export type ValueSpecList = ValueSpecListOf +export interface ValueSpecListOf + extends WithStandalone { + type: "list" + spec: ListValueSpecOf + minLength: number | null + maxLength: number | null + disabled: false | string + default: + | string[] + | number[] + | DefaultString[] + | Record[] + | readonly string[] + | readonly number[] + | readonly DefaultString[] + | readonly Record[] +} +export interface Pattern { + regex: string + description: string +} +export interface ListValueSpecText { + type: "text" + patterns: Pattern[] + minLength: number | null + maxLength: number | null + masked: boolean + + generate: null | RandomString + inputmode: "text" | "email" | "tel" | "url" + placeholder: string | null +} +export interface ListValueSpecNumber { + type: "number" + min: number | null + max: number | null + integer: boolean + step: number | null + units: string | null + placeholder: string | null +} +export interface ListValueSpecObject { + type: "object" + /** this is a mapped type of the config object at this level, replacing the object's values with specs on those values */ + spec: InputSpec + /** indicates whether duplicates can be permitted in the list */ + uniqueBy: UniqueBy + /** this should be a handlebars template which can make use of the entire config which corresponds to 'spec' */ + displayAs: string | null +} +export type UniqueBy = + | null + | string + | { + any: readonly UniqueBy[] | UniqueBy[] + } + | { + all: readonly UniqueBy[] | UniqueBy[] + } +export type DefaultString = string | RandomString +export type RandomString = { + charset: string + len: number +} +// sometimes the type checker needs just a little bit of help +export function isValueSpecListOf( + t: ValueSpec, + s: S, +): t is ValueSpecListOf & { spec: ListValueSpecOf } { + return "spec" in t && t.spec.type === s +} +export const unionSelectKey = "unionSelectKey" as const +export type UnionSelectKey = typeof unionSelectKey + +export const unionValueKey = "unionValueKey" as const +export type UnionValueKey = typeof unionValueKey diff --git a/sdk/lib/config/index.ts b/sdk/lib/config/index.ts new file mode 100644 index 000000000..510dc1ca0 --- /dev/null +++ b/sdk/lib/config/index.ts @@ -0,0 +1,5 @@ +import "./builder" + +import "./setupConfig" +import "./configDependencies" +import "./configConstants" diff --git a/sdk/lib/config/setupConfig.ts b/sdk/lib/config/setupConfig.ts new file mode 100644 index 000000000..ee693dda2 --- /dev/null +++ b/sdk/lib/config/setupConfig.ts @@ -0,0 +1,98 @@ +import { Effects, ExpectedExports } from "../types" +import { SDKManifest } from "../manifest/ManifestTypes" +import * as D from "./configDependencies" +import { Config, ExtractConfigType } from "./builder/config" +import { Utils, createUtils } from "../util/utils" +import nullIfEmpty from "../util/nullIfEmpty" +import { InterfaceReceipt } from "../interfaces/interfaceReceipt" +import { InterfacesReceipt as InterfacesReceipt } from "../interfaces/setupInterfaces" + +declare const dependencyProof: unique symbol +export type DependenciesReceipt = void & { + [dependencyProof]: never +} + +export type Save< + Store, + A extends + | Record + | Config, any> + | Config, never>, + Manifest extends SDKManifest, +> = (options: { + effects: Effects + input: ExtractConfigType & Record + utils: Utils + dependencies: D.ConfigDependencies +}) => Promise<{ + dependenciesReceipt: DependenciesReceipt + interfacesReceipt: InterfacesReceipt + restart: boolean +}> +export type Read< + Manifest extends SDKManifest, + Store, + A extends + | Record + | Config, any> + | Config, never>, +> = (options: { + effects: Effects + utils: Utils +}) => Promise & Record)> +/** + * We want to setup a config export with a get and set, this + * is going to be the default helper to setup config, because it will help + * enforce that we have a spec, write, and reading. + * @param options + * @returns + */ +export function setupConfig< + Store, + ConfigType extends + | Record + | Config + | Config, + Manifest extends SDKManifest, + Type extends Record = ExtractConfigType, +>( + spec: Config | Config, + write: Save, + read: Read, +) { + const validator = spec.validator + return { + setConfig: (async ({ effects, input }) => { + if (!validator.test(input)) { + await console.error(String(validator.errorMessage(input))) + return { error: "Set config type error for config" } + } + await effects.clearBindings() + await effects.clearNetworkInterfaces() + const { restart } = await write({ + input: JSON.parse(JSON.stringify(input)), + effects, + utils: createUtils(effects), + dependencies: D.configDependenciesSet(), + }) + if (restart) { + await effects.restart() + } + }) as ExpectedExports.setConfig, + getConfig: (async ({ effects }) => { + const myUtils = createUtils(effects) + const configValue = nullIfEmpty( + (await read({ effects, utils: myUtils })) || null, + ) + return { + spec: await spec.build({ + effects, + utils: myUtils as any, + }), + config: configValue, + } + }) as ExpectedExports.getConfig, + } +} + +export default setupConfig diff --git a/sdk/lib/dependency/mountDependencies.ts b/sdk/lib/dependency/mountDependencies.ts new file mode 100644 index 000000000..31f9cdadc --- /dev/null +++ b/sdk/lib/dependency/mountDependencies.ts @@ -0,0 +1,43 @@ +import { Effects } from "../types" +import { _ } from "../util" +import { + Path, + ManifestId, + VolumeName, + NamedPath, + matchPath, +} from "./setupDependencyMounts" + +export type MountDependenciesOut = _< + // prettier-ignore + A extends Path ? string : A extends Record ? { + [P in keyof A]: MountDependenciesOut; + } : never +> +export async function mountDependencies< + In extends + | Record>> + | Record> + | Record + | Path, +>(effects: Effects, value: In): Promise> { + if (matchPath.test(value)) { + const mountPath = `${value.manifestId}/${value.volume}/${value.name}` + + return (await effects.mount({ + location: mountPath, + target: { + packageId: value.manifestId, + path: value.path, + readonly: value.readonly, + volumeId: value.volume, + }, + })) as MountDependenciesOut + } + return Object.fromEntries( + Object.entries(value).map(([key, value]) => [ + key, + mountDependencies(effects, value), + ]), + ) as Record as MountDependenciesOut +} diff --git a/sdk/lib/dependency/setupDependencyMounts.ts b/sdk/lib/dependency/setupDependencyMounts.ts new file mode 100644 index 000000000..15e2ca1a3 --- /dev/null +++ b/sdk/lib/dependency/setupDependencyMounts.ts @@ -0,0 +1,72 @@ +import { boolean, object, string } from "ts-matches" +import { SDKManifest } from "../manifest/ManifestTypes" +import { deepMerge } from "../util/deepMerge" + +export type VolumeName = string +export type NamedPath = string +export type ManifestId = string + +export const matchPath = object({ + name: string, + volume: string, + path: string, + manifestId: string, + readonly: boolean, +}) +export type Path = typeof matchPath._TYPE +export type BuildPath< + ManifestId extends string, + VolumeId extends string, + PathName extends string, + Value extends Path, +> = { + [PId in ManifestId]: { + [V in VolumeId]: { + [N in PathName]: Value + } + } +} +class SetupDependencyMounts { + private constructor(readonly building: Building) {} + + static of() { + return new SetupDependencyMounts({}) + } + + addPath< + Name extends string, + Volume extends M["volumes"][0] & string, + Path extends string, + ManifestId extends M["id"], + M extends SDKManifest, + >(addPath: { + name: Name + volume: Volume + path: Path + manifest: M + readonly: boolean + }) { + const { manifest, ...restPath } = addPath + const newPath = { + ...restPath, + manifestId: manifest.id as ManifestId, + } as const + type NewBuilding = Building & + BuildPath + const building = deepMerge(this.building, { + [newPath.manifestId]: { + [newPath.volume]: { + [newPath.name]: newPath, + }, + }, + }) as NewBuilding + return new SetupDependencyMounts(building) + } + build() { + return this.building + } +} + +export function setupDependencyMounts() { + return SetupDependencyMounts.of() +} diff --git a/sdk/lib/dependencyConfig/DependencyConfig.ts b/sdk/lib/dependencyConfig/DependencyConfig.ts new file mode 100644 index 000000000..10dcb4bd8 --- /dev/null +++ b/sdk/lib/dependencyConfig/DependencyConfig.ts @@ -0,0 +1,47 @@ +import { + DependencyConfig as DependencyConfigType, + DeepPartial, + Effects, +} from "../types" +import { Utils, createUtils } from "../util/utils" +import { deepEqual } from "../util/deepEqual" +import { deepMerge } from "../util/deepMerge" +import { SDKManifest } from "../manifest/ManifestTypes" + +export type Update = (options: { + remoteConfig: RemoteConfig + queryResults: QueryResults +}) => Promise + +export class DependencyConfig< + Manifest extends SDKManifest, + Store, + Input extends Record, + RemoteConfig extends Record, +> { + static defaultUpdate = async (options: { + queryResults: unknown + remoteConfig: unknown + }): Promise => { + return deepMerge({}, options.remoteConfig, options.queryResults || {}) + } + constructor( + readonly dependencyConfig: (options: { + effects: Effects + localConfig: Input + utils: Utils + }) => Promise>, + readonly update: Update< + void | DeepPartial, + RemoteConfig + > = DependencyConfig.defaultUpdate as any, + ) {} + + async query(options: { effects: Effects; localConfig: unknown }) { + return this.dependencyConfig({ + localConfig: options.localConfig as Input, + effects: options.effects, + utils: createUtils(options.effects), + }) + } +} diff --git a/sdk/lib/dependencyConfig/index.ts b/sdk/lib/dependencyConfig/index.ts new file mode 100644 index 000000000..3fe78b4f3 --- /dev/null +++ b/sdk/lib/dependencyConfig/index.ts @@ -0,0 +1,9 @@ +// prettier-ignore +export type ReadonlyDeep = + A extends Function ? A : + A extends {} ? { readonly [K in keyof A]: ReadonlyDeep } : A; +export type MaybePromise = Promise | A +export type Message = string + +import "./DependencyConfig" +import "./setupDependencyConfig" diff --git a/sdk/lib/dependencyConfig/setupDependencyConfig.ts b/sdk/lib/dependencyConfig/setupDependencyConfig.ts new file mode 100644 index 000000000..3b6776945 --- /dev/null +++ b/sdk/lib/dependencyConfig/setupDependencyConfig.ts @@ -0,0 +1,22 @@ +import { Config } from "../config/builder/config" +import { SDKManifest } from "../manifest/ManifestTypes" +import { ExpectedExports } from "../types" +import { DependencyConfig } from "./DependencyConfig" + +export function setupDependencyConfig< + Store, + Input extends Record, + Manifest extends SDKManifest, +>( + _config: Config | Config, + autoConfigs: { + [key in keyof Manifest["dependencies"] & string]: DependencyConfig< + Manifest, + Store, + Input, + any + > + }, +): ExpectedExports.dependencyConfig { + return autoConfigs +} diff --git a/sdk/lib/emverLite/mod.ts b/sdk/lib/emverLite/mod.ts new file mode 100644 index 000000000..f672613aa --- /dev/null +++ b/sdk/lib/emverLite/mod.ts @@ -0,0 +1,307 @@ +import * as matches from "ts-matches" + +const starSub = /((\d+\.)*\d+)\.\*/ +// prettier-ignore +export type ValidEmVer = `${number}${`.${number}` | ""}${`.${number}` | ""}${`-${string}` | ""}`; +// prettier-ignore +export type ValidEmVerRange = `${'>=' | '<='| '<' | '>' | ''}${'^' | '~' | ''}${number | '*'}${`.${number | '*'}` | ""}${`.${number | '*'}` | ""}${`-${string}` | ""}`; + +function incrementLastNumber(list: number[]) { + const newList = [...list] + newList[newList.length - 1]++ + return newList +} +/** + * Will take in a range, like `>1.2` or `<1.2.3.4` or `=1.2` or `1.*` + * and return a checker, that has the check function for checking that a version is in the valid + * @param range + * @returns + */ +export function rangeOf(range: string | Checker): Checker { + return Checker.parse(range) +} + +/** + * Used to create a checker that will `and` all the ranges passed in + * @param ranges + * @returns + */ +export function rangeAnd(...ranges: (string | Checker)[]): Checker { + if (ranges.length === 0) { + throw new Error("No ranges given") + } + const [firstCheck, ...rest] = ranges + return Checker.parse(firstCheck).and(...rest) +} + +/** + * Used to create a checker that will `or` all the ranges passed in + * @param ranges + * @returns + */ +export function rangeOr(...ranges: (string | Checker)[]): Checker { + if (ranges.length === 0) { + throw new Error("No ranges given") + } + const [firstCheck, ...rest] = ranges + return Checker.parse(firstCheck).or(...rest) +} + +/** + * This will negate the checker, so given a checker that checks for >= 1.0.0, it will check for < 1.0.0 + * @param range + * @returns + */ +export function notRange(range: string | Checker): Checker { + return rangeOf(range).not() +} + +/** + * EmVer is a set of versioning of any pattern like 1 or 1.2 or 1.2.3 or 1.2.3.4 or .. + */ +export class EmVer { + /** + * Convert the range, should be 1.2.* or * into a emver + * Or an already made emver + * IsUnsafe + */ + static from(range: string | EmVer): EmVer { + if (range instanceof EmVer) { + return range + } + return EmVer.parse(range) + } + /** + * Convert the range, should be 1.2.* or * into a emver + * IsUnsafe + */ + static parse(rangeExtra: string): EmVer { + const [range, extra] = rangeExtra.split("-") + const values = range.split(".").map((x) => parseInt(x)) + for (const value of values) { + if (isNaN(value)) { + throw new Error(`Couldn't parse range: ${range}`) + } + } + return new EmVer(values, extra) + } + private constructor( + public readonly values: number[], + readonly extra: string | null, + ) {} + + /** + * Used when we need a new emver that has the last number incremented, used in the 1.* like things + */ + public withLastIncremented() { + return new EmVer(incrementLastNumber(this.values), null) + } + + public greaterThan(other: EmVer): boolean { + for (const i in this.values) { + if (other.values[i] == null) { + return true + } + if (this.values[i] > other.values[i]) { + return true + } + + if (this.values[i] < other.values[i]) { + return false + } + } + return false + } + + public equals(other: EmVer): boolean { + if (other.values.length !== this.values.length) { + return false + } + for (const i in this.values) { + if (this.values[i] !== other.values[i]) { + return false + } + } + return true + } + public greaterThanOrEqual(other: EmVer): boolean { + return this.greaterThan(other) || this.equals(other) + } + public lessThanOrEqual(other: EmVer): boolean { + return !this.greaterThan(other) + } + public lessThan(other: EmVer): boolean { + return !this.greaterThanOrEqual(other) + } + /** + * Return a enum string that describes (used for switching/iffs) + * to know comparison + * @param other + * @returns + */ + public compare(other: EmVer) { + if (this.equals(other)) { + return "equal" as const + } else if (this.greaterThan(other)) { + return "greater" as const + } else { + return "less" as const + } + } + /** + * Used when sorting emver's in a list using the sort method + * @param other + * @returns + */ + public compareForSort(other: EmVer) { + return matches + .matches(this.compare(other)) + .when("equal", () => 0 as const) + .when("greater", () => 1 as const) + .when("less", () => -1 as const) + .unwrap() + } + + toString() { + return `${this.values.join(".")}${this.extra ? `-${this.extra}` : ""}` + } +} + +/** + * A checker is a function that takes a version and returns true if the version matches the checker. + * Used when we are doing range checking, like saying ">=1.0.0".check("1.2.3") will be true + */ +export class Checker { + /** + * Will take in a range, like `>1.2` or `<1.2.3.4` or `=1.2` or `1.*` + * and return a checker, that has the check function for checking that a version is in the valid + * @param range + * @returns + */ + static parse(range: string | Checker): Checker { + if (range instanceof Checker) { + return range + } + range = range.trim() + if (range.indexOf("||") !== -1) { + return rangeOr(...range.split("||").map((x) => Checker.parse(x))) + } + if (range.indexOf("&&") !== -1) { + return rangeAnd(...range.split("&&").map((x) => Checker.parse(x))) + } + if (range === "*") { + return new Checker((version) => { + EmVer.from(version) + return true + }) + } + if (range.startsWith("!")) { + return Checker.parse(range.substring(1)).not() + } + const starSubMatches = starSub.exec(range) + if (starSubMatches != null) { + const emVarLower = EmVer.parse(starSubMatches[1]) + const emVarUpper = emVarLower.withLastIncremented() + + return new Checker((version) => { + const v = EmVer.from(version) + return ( + (v.greaterThan(emVarLower) || v.equals(emVarLower)) && + !v.greaterThan(emVarUpper) && + !v.equals(emVarUpper) + ) + }) + } + + switch (range.substring(0, 2)) { + case ">=": { + const emVar = EmVer.parse(range.substring(2)) + return new Checker((version) => { + const v = EmVer.from(version) + return v.greaterThanOrEqual(emVar) + }) + } + case "<=": { + const emVar = EmVer.parse(range.substring(2)) + return new Checker((version) => { + const v = EmVer.from(version) + return v.lessThanOrEqual(emVar) + }) + } + } + + switch (range.substring(0, 1)) { + case ">": { + const emVar = EmVer.parse(range.substring(1)) + return new Checker((version) => { + const v = EmVer.from(version) + return v.greaterThan(emVar) + }) + } + case "<": { + const emVar = EmVer.parse(range.substring(1)) + return new Checker((version) => { + const v = EmVer.from(version) + return v.lessThan(emVar) + }) + } + case "=": { + const emVar = EmVer.parse(range.substring(1)) + return new Checker((version) => { + const v = EmVer.from(version) + return v.equals(emVar) + }) + } + } + throw new Error("Couldn't parse range: " + range) + } + constructor( + /** + * Check is the function that will be given a emver or unparsed emver and should give if it follows + * a pattern + */ + public readonly check: (value: ValidEmVer | EmVer) => boolean, + ) {} + + /** + * Used when we want the `and` condition with another checker + */ + public and(...others: (Checker | string)[]): Checker { + return new Checker((value) => { + if (!this.check(value)) { + return false + } + for (const other of others) { + if (!Checker.parse(other).check(value)) { + return false + } + } + return true + }) + } + + /** + * Used when we want the `or` condition with another checker + */ + public or(...others: (Checker | string)[]): Checker { + return new Checker((value) => { + if (this.check(value)) { + return true + } + for (const other of others) { + if (Checker.parse(other).check(value)) { + return true + } + } + return false + }) + } + + /** + * A useful example is making sure we don't match an exact version, like !=1.2.3 + * @returns + */ + public not(): Checker { + return new Checker((value) => !this.check(value)) + } +} diff --git a/sdk/lib/health/HealthCheck.ts b/sdk/lib/health/HealthCheck.ts new file mode 100644 index 000000000..8f0bcf81e --- /dev/null +++ b/sdk/lib/health/HealthCheck.ts @@ -0,0 +1,65 @@ +import { InterfaceReceipt } from "../interfaces/interfaceReceipt" +import { Daemon, Effects } from "../types" +import { CheckResult } from "./checkFns/CheckResult" +import { HealthReceipt } from "./HealthReceipt" +import { Trigger } from "../trigger" +import { TriggerInput } from "../trigger/TriggerInput" +import { defaultTrigger } from "../trigger/defaultTrigger" +import { once } from "../util/once" + +export function healthCheck(o: { + effects: Effects + name: string + trigger?: Trigger + fn(): Promise | CheckResult + onFirstSuccess?: () => unknown | Promise +}) { + new Promise(async () => { + let currentValue: TriggerInput = { + hadSuccess: false, + } + const getCurrentValue = () => currentValue + const trigger = (o.trigger ?? defaultTrigger)(getCurrentValue) + const triggerFirstSuccess = once(() => + Promise.resolve( + "onFirstSuccess" in o && o.onFirstSuccess + ? o.onFirstSuccess() + : undefined, + ), + ) + for ( + let res = await trigger.next(); + !res.done; + res = await trigger.next() + ) { + try { + const { status, message } = await o.fn() + await o.effects.setHealth({ + name: o.name, + status, + message, + }) + currentValue.hadSuccess = true + currentValue.lastResult = "passing" + await triggerFirstSuccess().catch((err) => { + console.error(err) + }) + } catch (e) { + await o.effects.setHealth({ + name: o.name, + status: "failing", + message: asMessage(e), + }) + currentValue.lastResult = "failing" + } + } + }) + return {} as HealthReceipt +} +function asMessage(e: unknown) { + if (typeof e === "object" && e != null && "message" in e) + return String(e.message) + const value = String(e) + if (value.length == null) return undefined + return value +} diff --git a/sdk/lib/health/HealthReceipt.ts b/sdk/lib/health/HealthReceipt.ts new file mode 100644 index 000000000..a0995ba0a --- /dev/null +++ b/sdk/lib/health/HealthReceipt.ts @@ -0,0 +1,4 @@ +declare const HealthProof: unique symbol +export type HealthReceipt = { + [HealthProof]: never +} diff --git a/sdk/lib/health/checkFns/CheckResult.ts b/sdk/lib/health/checkFns/CheckResult.ts new file mode 100644 index 000000000..1b2f54f39 --- /dev/null +++ b/sdk/lib/health/checkFns/CheckResult.ts @@ -0,0 +1,6 @@ +import { HealthStatus } from "../../types" + +export type CheckResult = { + status: HealthStatus + message?: string +} diff --git a/sdk/lib/health/checkFns/checkPortListening.ts b/sdk/lib/health/checkFns/checkPortListening.ts new file mode 100644 index 000000000..07144071b --- /dev/null +++ b/sdk/lib/health/checkFns/checkPortListening.ts @@ -0,0 +1,67 @@ +import { Effects } from "../../types" +import { createUtils } from "../../util" +import { stringFromStdErrOut } from "../../util/stringFromStdErrOut" +import { CheckResult } from "./CheckResult" +export function containsAddress(x: string, port: number) { + const readPorts = x + .split("\n") + .filter(Boolean) + .splice(1) + .map((x) => x.split(" ").filter(Boolean)[1]?.split(":")?.[1]) + .filter(Boolean) + .map((x) => Number.parseInt(x, 16)) + .filter(Number.isFinite) + return readPorts.indexOf(port) >= 0 +} + +/** + * This is used to check if a port is listening on the system. + * Used during the health check fn or the check main fn. + */ +export async function checkPortListening( + effects: Effects, + port: number, + options: { + errorMessage: string + successMessage: string + timeoutMessage?: string + timeout?: number + }, +): Promise { + const utils = createUtils(effects) + return Promise.race([ + Promise.resolve().then(async () => { + const hasAddress = + containsAddress( + await utils.childProcess + .exec(`cat /proc/net/tcp`, {}) + .then(stringFromStdErrOut), + port, + ) || + containsAddress( + await utils.childProcess + .exec("cat /proc/net/udp", {}) + .then(stringFromStdErrOut), + port, + ) + if (hasAddress) { + return { status: "passing", message: options.successMessage } + } + return { + status: "failing", + message: options.errorMessage, + } + }), + new Promise((resolve) => { + setTimeout( + () => + resolve({ + status: "failing", + message: + options.timeoutMessage || `Timeout trying to check port ${port}`, + }), + options.timeout ?? 1_000, + ) + }), + ]) +} diff --git a/sdk/lib/health/checkFns/checkWebUrl.ts b/sdk/lib/health/checkFns/checkWebUrl.ts new file mode 100644 index 000000000..81da2b425 --- /dev/null +++ b/sdk/lib/health/checkFns/checkWebUrl.ts @@ -0,0 +1,32 @@ +import { Effects } from "../../types" +import { CheckResult } from "./CheckResult" +import { timeoutPromise } from "./index" +import "isomorphic-fetch" + +/** + * This is a helper function to check if a web url is reachable. + * @param url + * @param createSuccess + * @returns + */ +export const checkWebUrl = async ( + effects: Effects, + url: string, + { + timeout = 1000, + successMessage = `Reached ${url}`, + errorMessage = `Error while fetching URL: ${url}`, + } = {}, +): Promise => { + return Promise.race([fetch(url), timeoutPromise(timeout)]) + .then((x) => ({ + status: "passing" as const, + message: successMessage, + })) + .catch((e) => { + console.warn(`Error while fetching URL: ${url}`) + console.error(JSON.stringify(e)) + console.error(e.toString()) + return { status: "failing" as const, message: errorMessage } + }) +} diff --git a/sdk/lib/health/checkFns/index.ts b/sdk/lib/health/checkFns/index.ts new file mode 100644 index 000000000..d33d5ad0d --- /dev/null +++ b/sdk/lib/health/checkFns/index.ts @@ -0,0 +1,11 @@ +import { runHealthScript } from "./runHealthScript" +export { checkPortListening } from "./checkPortListening" +export { CheckResult } from "./CheckResult" +export { checkWebUrl } from "./checkWebUrl" + +export function timeoutPromise(ms: number, { message = "Timed out" } = {}) { + return new Promise((resolve, reject) => + setTimeout(() => reject(new Error(message)), ms), + ) +} +export { runHealthScript } diff --git a/sdk/lib/health/checkFns/runHealthScript.ts b/sdk/lib/health/checkFns/runHealthScript.ts new file mode 100644 index 000000000..4bc4556e9 --- /dev/null +++ b/sdk/lib/health/checkFns/runHealthScript.ts @@ -0,0 +1,38 @@ +import { CommandType, Effects } from "../../types" +import { createUtils } from "../../util" +import { stringFromStdErrOut } from "../../util/stringFromStdErrOut" +import { CheckResult } from "./CheckResult" +import { timeoutPromise } from "./index" + +/** + * Running a health script, is used when we want to have a simple + * script in bash or something like that. It should return something that is useful + * in {result: string} else it is considered an error + * @param param0 + * @returns + */ +export const runHealthScript = async ( + effects: Effects, + runCommand: string, + { + timeout = 30000, + errorMessage = `Error while running command: ${runCommand}`, + message = (res: string) => + `Have ran script ${runCommand} and the result: ${res}`, + } = {}, +): Promise => { + const utils = createUtils(effects) + const res = await Promise.race([ + utils.childProcess.exec(runCommand, { timeout }).then(stringFromStdErrOut), + timeoutPromise(timeout), + ]).catch((e) => { + console.warn(errorMessage) + console.warn(JSON.stringify(e)) + console.warn(e.toString()) + throw { status: "failing", message: errorMessage } as CheckResult + }) + return { + status: "passing", + message: message(res), + } as CheckResult +} diff --git a/sdk/lib/health/index.ts b/sdk/lib/health/index.ts new file mode 100644 index 000000000..b6e1d26f5 --- /dev/null +++ b/sdk/lib/health/index.ts @@ -0,0 +1,3 @@ +import "./checkFns" + +import "./HealthReceipt" diff --git a/sdk/lib/index.ts b/sdk/lib/index.ts new file mode 100644 index 000000000..746bc12e9 --- /dev/null +++ b/sdk/lib/index.ts @@ -0,0 +1,23 @@ +export { Daemons } from "./mainFn/Daemons" +export { EmVer } from "./emverLite/mod" +export { Overlay } from "./util/Overlay" +export { Utils } from "./util/utils" +export * as actions from "./actions" +export * as backup from "./backup" +export * as config from "./config" +export * as configBuilder from "./config/builder" +export * as configTypes from "./config/configTypes" +export * as dependencyConfig from "./dependencyConfig" +export * as health from "./health" +export * as healthFns from "./health/checkFns" +export * as inits from "./inits" +export * as mainFn from "./mainFn" +export * as manifest from "./manifest" +export * as toml from "@iarna/toml" +export * as types from "./types" +export * as util from "./util" +export * as yaml from "yaml" + +export * as matches from "ts-matches" +export * as YAML from "yaml" +export * as TOML from "@iarna/toml" diff --git a/sdk/lib/inits/index.ts b/sdk/lib/inits/index.ts new file mode 100644 index 000000000..0a326a61e --- /dev/null +++ b/sdk/lib/inits/index.ts @@ -0,0 +1,3 @@ +import "./setupInit" +import "./setupUninstall" +import "./setupInstall" diff --git a/sdk/lib/inits/migrations/Migration.ts b/sdk/lib/inits/migrations/Migration.ts new file mode 100644 index 000000000..06e8e6e39 --- /dev/null +++ b/sdk/lib/inits/migrations/Migration.ts @@ -0,0 +1,48 @@ +import { ManifestVersion, SDKManifest } from "../../manifest/ManifestTypes" +import { Effects } from "../../types" +import { Utils } from "../../util/utils" + +export class Migration< + Manifest extends SDKManifest, + Store, + Version extends ManifestVersion, +> { + constructor( + readonly options: { + version: Version + up: (opts: { + effects: Effects + utils: Utils + }) => Promise + down: (opts: { + effects: Effects + utils: Utils + }) => Promise + }, + ) {} + static of< + Manifest extends SDKManifest, + Store, + Version extends ManifestVersion, + >(options: { + version: Version + up: (opts: { + effects: Effects + utils: Utils + }) => Promise + down: (opts: { + effects: Effects + utils: Utils + }) => Promise + }) { + return new Migration(options) + } + + async up(opts: { effects: Effects; utils: Utils }) { + this.up(opts) + } + + async down(opts: { effects: Effects; utils: Utils }) { + this.down(opts) + } +} diff --git a/sdk/lib/inits/migrations/setupMigrations.ts b/sdk/lib/inits/migrations/setupMigrations.ts new file mode 100644 index 000000000..dabe3122c --- /dev/null +++ b/sdk/lib/inits/migrations/setupMigrations.ts @@ -0,0 +1,76 @@ +import { EmVer } from "../../emverLite/mod" +import { SDKManifest } from "../../manifest/ManifestTypes" +import { ExpectedExports } from "../../types" +import { createUtils } from "../../util" +import { once } from "../../util/once" +import { Migration } from "./Migration" + +export class Migrations { + private constructor( + readonly manifest: SDKManifest, + readonly migrations: Array>, + ) {} + private sortedMigrations = once(() => { + const migrationsAsVersions = ( + this.migrations as Array> + ).map((x) => [EmVer.parse(x.options.version), x] as const) + migrationsAsVersions.sort((a, b) => a[0].compareForSort(b[0])) + return migrationsAsVersions + }) + private currentVersion = once(() => EmVer.parse(this.manifest.version)) + static of< + Manifest extends SDKManifest, + Store, + Migrations extends Array>, + >(manifest: SDKManifest, ...migrations: EnsureUniqueId) { + return new Migrations( + manifest, + migrations as Array>, + ) + } + async init({ + effects, + previousVersion, + }: Parameters[0]) { + const utils = createUtils(effects) + if (!!previousVersion) { + const previousVersionEmVer = EmVer.parse(previousVersion) + for (const [_, migration] of this.sortedMigrations() + .filter((x) => x[0].greaterThan(previousVersionEmVer)) + .filter((x) => x[0].lessThanOrEqual(this.currentVersion()))) { + await migration.up({ effects, utils }) + } + } + } + async uninit({ + effects, + nextVersion, + }: Parameters[0]) { + const utils = createUtils(effects) + if (!!nextVersion) { + const nextVersionEmVer = EmVer.parse(nextVersion) + const reversed = [...this.sortedMigrations()].reverse() + for (const [_, migration] of reversed + .filter((x) => x[0].greaterThan(nextVersionEmVer)) + .filter((x) => x[0].lessThanOrEqual(this.currentVersion()))) { + await migration.down({ effects, utils }) + } + } + } +} + +export function setupMigrations< + Manifest extends SDKManifest, + Store, + Migrations extends Array>, +>(manifest: SDKManifest, ...migrations: EnsureUniqueId) { + return Migrations.of(manifest, ...migrations) +} + +// prettier-ignore +export type EnsureUniqueId = + B extends [] ? A : + B extends [Migration, ...infer Rest] ? ( + id extends ids ? "One of the ids are not unique"[] : + EnsureUniqueId + ) : "There exists a migration that is not a Migration"[] diff --git a/sdk/lib/inits/setupExports.ts b/sdk/lib/inits/setupExports.ts new file mode 100644 index 000000000..bad6dd9ad --- /dev/null +++ b/sdk/lib/inits/setupExports.ts @@ -0,0 +1,18 @@ +import { Effects, ExposeServicePaths, ExposeUiPaths } from "../types" +import { Utils } from "../util/utils" + +export type SetupExports = (opts: { + effects: Effects + utils: Utils +}) => + | { + ui: ExposeUiPaths + services: ExposeServicePaths + } + | Promise<{ + ui: ExposeUiPaths + services: ExposeServicePaths + }> + +export const setupExports = (fn: (opts: SetupExports) => void) => + fn diff --git a/sdk/lib/inits/setupInit.ts b/sdk/lib/inits/setupInit.ts new file mode 100644 index 000000000..7d4586ef1 --- /dev/null +++ b/sdk/lib/inits/setupInit.ts @@ -0,0 +1,42 @@ +import { SetInterfaces } from "../interfaces/setupInterfaces" +import { SDKManifest } from "../manifest/ManifestTypes" +import { ExpectedExports } from "../types" +import { createUtils } from "../util" +import { Migrations } from "./migrations/setupMigrations" +import { SetupExports } from "./setupExports" +import { Install } from "./setupInstall" +import { Uninstall } from "./setupUninstall" + +export function setupInit( + migrations: Migrations, + install: Install, + uninstall: Uninstall, + setInterfaces: SetInterfaces, + setupExports: SetupExports, +): { + init: ExpectedExports.init + uninit: ExpectedExports.uninit +} { + return { + init: async (opts) => { + const utils = createUtils(opts.effects) + await migrations.init(opts) + await install.init(opts) + await setInterfaces({ + ...opts, + input: null, + utils, + }) + const { services, ui } = await setupExports({ + ...opts, + utils, + }) + await opts.effects.exposeForDependents(services) + await opts.effects.exposeUi(ui) + }, + uninit: async (opts) => { + await migrations.uninit(opts) + await uninstall.uninit(opts) + }, + } +} diff --git a/sdk/lib/inits/setupInstall.ts b/sdk/lib/inits/setupInstall.ts new file mode 100644 index 000000000..e49c0b545 --- /dev/null +++ b/sdk/lib/inits/setupInstall.ts @@ -0,0 +1,33 @@ +import { SDKManifest } from "../manifest/ManifestTypes" +import { Effects, ExpectedExports } from "../types" +import { Utils, createUtils } from "../util/utils" + +export type InstallFn = (opts: { + effects: Effects + utils: Utils +}) => Promise +export class Install { + private constructor(readonly fn: InstallFn) {} + static of( + fn: InstallFn, + ) { + return new Install(fn) + } + + async init({ + effects, + previousVersion, + }: Parameters[0]) { + if (!previousVersion) + await this.fn({ + effects, + utils: createUtils(effects), + }) + } +} + +export function setupInstall( + fn: InstallFn, +) { + return Install.of(fn) +} diff --git a/sdk/lib/inits/setupUninstall.ts b/sdk/lib/inits/setupUninstall.ts new file mode 100644 index 000000000..b411d2fc7 --- /dev/null +++ b/sdk/lib/inits/setupUninstall.ts @@ -0,0 +1,33 @@ +import { SDKManifest } from "../manifest/ManifestTypes" +import { Effects, ExpectedExports } from "../types" +import { Utils, createUtils } from "../util/utils" + +export type UninstallFn = (opts: { + effects: Effects + utils: Utils +}) => Promise +export class Uninstall { + private constructor(readonly fn: UninstallFn) {} + static of( + fn: UninstallFn, + ) { + return new Uninstall(fn) + } + + async uninit({ + effects, + nextVersion, + }: Parameters[0]) { + if (!nextVersion) + await this.fn({ + effects, + utils: createUtils(effects), + }) + } +} + +export function setupUninstall( + fn: UninstallFn, +) { + return Uninstall.of(fn) +} diff --git a/sdk/lib/interfaces/AddressReceipt.ts b/sdk/lib/interfaces/AddressReceipt.ts new file mode 100644 index 000000000..d57d85685 --- /dev/null +++ b/sdk/lib/interfaces/AddressReceipt.ts @@ -0,0 +1,4 @@ +declare const AddressProof: unique symbol +export type AddressReceipt = { + [AddressProof]: never +} diff --git a/sdk/lib/interfaces/Host.ts b/sdk/lib/interfaces/Host.ts new file mode 100644 index 000000000..190769daa --- /dev/null +++ b/sdk/lib/interfaces/Host.ts @@ -0,0 +1,205 @@ +import { object, string } from "ts-matches" +import { Effects } from "../types" +import { Origin } from "./Origin" + +const knownProtocols = { + http: { + secure: false, + ssl: false, + defaultPort: 80, + withSsl: "https", + }, + https: { + secure: true, + ssl: true, + defaultPort: 443, + }, + ws: { + secure: false, + ssl: false, + defaultPort: 80, + withSsl: "wss", + }, + wss: { + secure: true, + ssl: true, + defaultPort: 443, + }, + ssh: { + secure: true, + ssl: false, + defaultPort: 22, + }, + bitcoin: { + secure: true, + ssl: false, + defaultPort: 8333, + }, + grpc: { + secure: true, + ssl: true, + defaultPort: 50051, + }, + dns: { + secure: true, + ssl: false, + defaultPort: 53, + }, +} as const + +type Scheme = string | null + +type AddSslOptions = { + preferredExternalPort: number + scheme: Scheme + addXForwardedHeaders?: boolean /** default: false */ +} +type Security = { secure: false; ssl: false } | { secure: true; ssl: boolean } +export type PortOptions = { + scheme: Scheme + preferredExternalPort: number + addSsl: AddSslOptions | null +} & Security +type KnownProtocols = typeof knownProtocols +type ProtocolsWithSslVariants = { + [K in keyof KnownProtocols]: KnownProtocols[K] extends { + withSsl: string + } + ? K + : never +}[keyof KnownProtocols] +type NotProtocolsWithSslVariants = Exclude< + keyof KnownProtocols, + ProtocolsWithSslVariants +> + +type PortOptionsByKnownProtocol = + | ({ + protocol: ProtocolsWithSslVariants + preferredExternalPort?: number + scheme?: Scheme + } & ({ noAddSsl: true } | { addSsl?: Partial })) + | { + protocol: NotProtocolsWithSslVariants + preferredExternalPort?: number + scheme?: Scheme + addSsl?: AddSslOptions | null + } +type PortOptionsByProtocol = PortOptionsByKnownProtocol | PortOptions + +const hasStringProtocol = object({ + protocol: string, +}).test + +export class Host { + constructor( + readonly options: { + effects: Effects + kind: "static" | "single" | "multi" + id: string + }, + ) {} + + async bindPort( + internalPort: number, + options: PortOptionsByProtocol, + ): Promise> { + if (hasStringProtocol(options)) { + return await this.bindPortForKnown(options, internalPort) + } else { + return await this.bindPortForUnknown(internalPort, options) + } + } + + private async bindPortForUnknown( + internalPort: number, + options: + | ({ + scheme: Scheme + preferredExternalPort: number + addSsl: AddSslOptions | null + } & { secure: false; ssl: false }) + | ({ + scheme: Scheme + preferredExternalPort: number + addSsl: AddSslOptions | null + } & { secure: true; ssl: boolean }), + ) { + await this.options.effects.bind({ + kind: this.options.kind, + id: this.options.id, + internalPort: internalPort, + ...options, + }) + + return new Origin(this, options) + } + + private async bindPortForKnown( + options: PortOptionsByKnownProtocol, + internalPort: number, + ) { + const scheme = + options.scheme === undefined ? options.protocol : options.scheme + const protoInfo = knownProtocols[options.protocol] + const preferredExternalPort = + options.preferredExternalPort || + knownProtocols[options.protocol].defaultPort + const addSsl = this.getAddSsl(options, protoInfo) + + const security: Security = !protoInfo.secure + ? { + secure: protoInfo.secure, + ssl: protoInfo.ssl, + } + : { secure: false, ssl: false } + + const newOptions = { + scheme, + preferredExternalPort, + addSsl, + ...security, + } + + await this.options.effects.bind({ + kind: this.options.kind, + id: this.options.id, + internalPort, + ...newOptions, + }) + + return new Origin(this, newOptions) + } + + private getAddSsl( + options: PortOptionsByKnownProtocol, + protoInfo: KnownProtocols[keyof KnownProtocols], + ): AddSslOptions | null { + if ("noAddSsl" in options && options.noAddSsl) return null + if ("withSsl" in protoInfo && protoInfo.withSsl) + return { + preferredExternalPort: knownProtocols[protoInfo.withSsl].defaultPort, + scheme: protoInfo.withSsl, + ...("addSsl" in options ? options.addSsl : null), + } + return null + } +} + +export class StaticHost extends Host { + constructor(options: { effects: Effects; id: string }) { + super({ ...options, kind: "static" }) + } +} + +export class SingleHost extends Host { + constructor(options: { effects: Effects; id: string }) { + super({ ...options, kind: "single" }) + } +} + +export class MultiHost extends Host { + constructor(options: { effects: Effects; id: string }) { + super({ ...options, kind: "multi" }) + } +} diff --git a/sdk/lib/interfaces/NetworkInterfaceBuilder.ts b/sdk/lib/interfaces/NetworkInterfaceBuilder.ts new file mode 100644 index 000000000..8f47dea93 --- /dev/null +++ b/sdk/lib/interfaces/NetworkInterfaceBuilder.ts @@ -0,0 +1,73 @@ +import { Address, Effects } from "../types" +import { NetworkInterfaceType } from "../util/utils" +import { AddressReceipt } from "./AddressReceipt" +import { Host } from "./Host" +import { Origin } from "./Origin" + +/** + * A helper class for creating a Network Interface + * + * Network Interfaces are collections of web addresses that expose the same API or other resource, + * display to the user with under a common name and description. + * + * All URIs on an interface inherit the same ui: bool, basic auth credentials, path, and search (query) params + * + * @param options + * @returns + */ +export class NetworkInterfaceBuilder { + constructor( + readonly options: { + effects: Effects + name: string + id: string + description: string + hasPrimary: boolean + disabled: boolean + type: NetworkInterfaceType + username: null | string + path: string + search: Record + }, + ) {} + + /** + * A function to register a group of origins ( :// : ) with StartOS + * + * The returned addressReceipt serves as proof that the addresses were registered + * + * @param addresses + * @returns + */ + async export[]>( + origins: Origins, + ): Promise { + const { + name, + description, + hasPrimary, + disabled, + id, + type, + username, + path, + search, + } = this.options + + const addresses = Array.from(origins).map((o) => + o.build({ username, path, search, scheme: null }), + ) + + await this.options.effects.exportNetworkInterface({ + interfaceId: id, + name, + description, + hasPrimary, + disabled, + addresses, + type, + }) + + return addresses as Address[] & AddressReceipt + } +} diff --git a/sdk/lib/interfaces/Origin.ts b/sdk/lib/interfaces/Origin.ts new file mode 100644 index 000000000..1bab62811 --- /dev/null +++ b/sdk/lib/interfaces/Origin.ts @@ -0,0 +1,33 @@ +import { Address } from "../types" +import { Host, PortOptions } from "./Host" + +export class Origin { + constructor( + readonly host: T, + readonly options: PortOptions, + ) {} + + build({ username, path, search }: BuildOptions): Address { + const qpEntries = Object.entries(search) + .map( + ([key, val]) => `${encodeURIComponent(key)}=${encodeURIComponent(val)}`, + ) + .join("&") + + const qp = qpEntries.length ? `?${qpEntries}` : "" + + return { + hostId: this.host.options.id, + options: this.options, + suffix: `${path}${qp}`, + username, + } + } +} + +type BuildOptions = { + scheme: string | null + username: string | null + path: string + search: Record +} diff --git a/sdk/lib/interfaces/interfaceReceipt.ts b/sdk/lib/interfaces/interfaceReceipt.ts new file mode 100644 index 000000000..24873e67e --- /dev/null +++ b/sdk/lib/interfaces/interfaceReceipt.ts @@ -0,0 +1,4 @@ +declare const InterfaceProof: unique symbol +export type InterfaceReceipt = { + [InterfaceProof]: never +} diff --git a/sdk/lib/interfaces/setupInterfaces.ts b/sdk/lib/interfaces/setupInterfaces.ts new file mode 100644 index 000000000..c99164e93 --- /dev/null +++ b/sdk/lib/interfaces/setupInterfaces.ts @@ -0,0 +1,28 @@ +import { Config } from "../config/builder/config" +import { SDKManifest } from "../manifest/ManifestTypes" +import { Address, Effects } from "../types" +import { Utils } from "../util/utils" +import { AddressReceipt } from "./AddressReceipt" + +export type InterfacesReceipt = Array +export type SetInterfaces< + Manifest extends SDKManifest, + Store, + ConfigInput extends Record, + Output extends InterfacesReceipt, +> = (opts: { + effects: Effects + input: null | ConfigInput + utils: Utils +}) => Promise +export type SetupInterfaces = < + Manifest extends SDKManifest, + Store, + ConfigInput extends Record, + Output extends InterfacesReceipt, +>( + config: Config, + fn: SetInterfaces, +) => SetInterfaces +export const NO_INTERFACE_CHANGES = [] as InterfacesReceipt +export const setupInterfaces: SetupInterfaces = (_config, fn) => fn diff --git a/sdk/lib/mainFn/Daemons.ts b/sdk/lib/mainFn/Daemons.ts new file mode 100644 index 000000000..45ff723d0 --- /dev/null +++ b/sdk/lib/mainFn/Daemons.ts @@ -0,0 +1,155 @@ +import { HealthReceipt } from "../health/HealthReceipt" +import { CheckResult } from "../health/checkFns" +import { SDKManifest } from "../manifest/ManifestTypes" +import { Trigger } from "../trigger" +import { TriggerInput } from "../trigger/TriggerInput" +import { defaultTrigger } from "../trigger/defaultTrigger" +import { DaemonReturned, Effects, ValidIfNoStupidEscape } from "../types" +import { createUtils } from "../util" +import { Signals } from "../util/utils" +type Daemon< + Manifest extends SDKManifest, + Ids extends string, + Command extends string, + Id extends string, +> = { + id: "" extends Id ? never : Id + command: ValidIfNoStupidEscape | [string, ...string[]] + imageId: Manifest["images"][number] + env?: Record + ready: { + display: string | null + fn: () => Promise | CheckResult + trigger?: Trigger + } + requires: Exclude[] +} + +type ErrorDuplicateId = `The id '${Id}' is already used` +/** + * A class for defining and controlling the service daemons +```ts +Daemons.of({ + effects, + started, + interfaceReceipt, // Provide the interfaceReceipt to prove it was completed + healthReceipts, // Provide the healthReceipts or [] to prove they were at least considered +}).addDaemon('webui', { + command: 'hello-world', // The command to start the daemon + ready: { + display: 'Web Interface', + // The function to run to determine the health status of the daemon + fn: () => + checkPortListening(effects, 80, { + successMessage: 'The web interface is ready', + errorMessage: 'The web interface is not ready', + }), + }, + requires: [], +}) +``` + */ +export class Daemons { + private constructor( + readonly effects: Effects, + readonly started: (onTerm: () => PromiseLike) => PromiseLike, + readonly daemons?: Daemon[], + ) {} + /** + * Returns an empty new Daemons class with the provided config. + * + * Call .addDaemon() on the returned class to add a daemon. + * + * Daemons run in the order they are defined, with latter daemons being capable of + * depending on prior daemons + * @param config + * @returns + */ + static of(config: { + effects: Effects + started: (onTerm: () => PromiseLike) => PromiseLike + healthReceipts: HealthReceipt[] + }) { + return new Daemons(config.effects, config.started) + } + /** + * Returns the complete list of daemons, including the one defined here + * @param id + * @param newDaemon + * @returns + */ + addDaemon( + // prettier-ignore + id: + "" extends Id ? never : + ErrorDuplicateId extends Id ? never : + Id extends Ids ? ErrorDuplicateId : + Id, + newDaemon: Omit, "id">, + ) { + const daemons = ((this?.daemons ?? []) as any[]).concat({ + ...newDaemon, + id, + }) + return new Daemons(this.effects, this.started, daemons) + } + + async build() { + const daemonsStarted = {} as Record> + const { effects } = this + const daemons = this.daemons ?? [] + for (const daemon of daemons) { + const requiredPromise = Promise.all( + daemon.requires?.map((id) => daemonsStarted[id]) ?? [], + ) + daemonsStarted[daemon.id] = requiredPromise.then(async () => { + const { command, imageId } = daemon + const utils = createUtils(effects) + + const child = utils.runDaemon(imageId, command, { env: daemon.env }) + let currentInput: TriggerInput = {} + const getCurrentInput = () => currentInput + const trigger = (daemon.ready.trigger ?? defaultTrigger)( + getCurrentInput, + ) + return new Promise(async (resolve) => { + for ( + let res = await trigger.next(); + !res.done; + res = await trigger.next() + ) { + const response = await Promise.resolve(daemon.ready.fn()).catch( + (err) => + ({ + status: "failing", + message: "message" in err ? err.message : String(err), + }) as CheckResult, + ) + currentInput.lastResult = response.status || null + if (!currentInput.hadSuccess && response.status === "passing") { + currentInput.hadSuccess = true + resolve(child) + } + } + resolve(child) + }) + }) + } + return { + async term(options?: { signal?: Signals; timeout?: number }) { + await Promise.all( + Object.values>(daemonsStarted).map((x) => + x.then((x) => x.term(options)), + ), + ) + }, + async wait() { + await Promise.all( + Object.values>(daemonsStarted).map((x) => + x.then((x) => x.wait()), + ), + ) + }, + } + } +} diff --git a/sdk/lib/mainFn/index.ts b/sdk/lib/mainFn/index.ts new file mode 100644 index 000000000..7a6e11c6c --- /dev/null +++ b/sdk/lib/mainFn/index.ts @@ -0,0 +1,35 @@ +import { Effects, ExpectedExports } from "../types" +import { createMainUtils } from "../util" +import { Utils, createUtils } from "../util/utils" +import { Daemons } from "./Daemons" +import "../interfaces/NetworkInterfaceBuilder" +import "../interfaces/Origin" + +import "./Daemons" +import { SDKManifest } from "../manifest/ManifestTypes" + +/** + * Used to ensure that the main function is running with the valid proofs. + * We first do the folowing order of things + * 1. We get the interfaces + * 2. We setup all the commands to setup the system + * 3. We create the health checks + * 4. We setup the daemons init system + * @param fn + * @returns + */ +export const setupMain = ( + fn: (o: { + effects: Effects + started(onTerm: () => PromiseLike): PromiseLike + utils: Utils + }) => Promise>, +): ExpectedExports.main => { + return async (options) => { + const result = await fn({ + ...options, + utils: createMainUtils(options.effects), + }) + return result + } +} diff --git a/sdk/lib/manifest/ManifestTypes.ts b/sdk/lib/manifest/ManifestTypes.ts new file mode 100644 index 000000000..4b25ff1d0 --- /dev/null +++ b/sdk/lib/manifest/ManifestTypes.ts @@ -0,0 +1,105 @@ +import { ValidEmVer } from "../emverLite/mod" +import { ActionMetadata } from "../types" + +export interface Container { + /** This should be pointing to a docker container name */ + image: string + /** These should match the manifest data volumes */ + mounts: Record + /** Default is 64mb */ + shmSizeMb?: `${number}${"mb" | "gb" | "b" | "kb"}` + /** if more than 30s to shutdown */ + sigtermTimeout?: `${number}${"s" | "m" | "h"}` +} + +export type ManifestVersion = ValidEmVer + +export type SDKManifest = { + /** The package identifier used by the OS. This must be unique amongst all other known packages */ + readonly id: string + /** A human readable service title */ + readonly title: string + /** Service version - accepts up to four digits, where the last confirms to revisions necessary for StartOs + * - see documentation: https://github.com/Start9Labs/emver-rs. This value will change with each release of + * the service + */ + readonly version: ManifestVersion + /** Release notes for the update - can be a string, paragraph or URL */ + readonly releaseNotes: string + /** The type of license for the project. Include the LICENSE in the root of the project directory. A license is required for a Start9 package.*/ + readonly license: string // name of license + /** A list of normie (hosted, SaaS, custodial, etc) services this services intends to replace */ + readonly replaces: Readonly + /** The Start9 wrapper repository URL for the package. This repo contains the manifest file (this), + * any scripts necessary for configuration, backups, actions, or health checks (more below). This key + * must exist. But could be embedded into the source repository + */ + readonly wrapperRepo: string + /** The original project repository URL. There is no upstream repo in this example */ + readonly upstreamRepo: string + /** URL to the support site / channel for the project. This key can be omitted if none exists, or it can link to the original project repository issues */ + readonly supportSite: string + /** URL to the marketing site for the project. If there is no marketing site, it can link to the original project repository */ + readonly marketingSite: string + /** URL where users can donate to the upstream project */ + readonly donationUrl: string | null + /**Human readable descriptions for the service. These are used throughout the StartOS user interface, primarily in the marketplace. */ + readonly description: { + /**This is the first description visible to the user in the marketplace */ + readonly short: string + /** This description will display with additional details in the service's individual marketplace page */ + readonly long: string + } + + /** Defines the os images needed to run the container processes */ + readonly images: string[] + /** This denotes readonly asset directories that should be available to mount to the container. + * Assuming that there will be three files with names along the lines: + * icon.* : the icon that will be this packages icon on the ui + * LICENSE : What the license is for this service + * Instructions : to be seen in the ui section of the package + * */ + readonly assets: string[] + /** This denotes any data volumes that should be available to mount to the container */ + readonly volumes: string[] + + readonly alerts: { + readonly install: string | null + readonly update: string | null + readonly uninstall: string | null + readonly restore: string | null + readonly start: string | null + readonly stop: string | null + } + readonly dependencies: Readonly> +} + +export interface ManifestDependency { + /** The range of versions that would satisfy the dependency + * + * ie: >=3.4.5 <4.0.0 + */ + version: string + /** + * A human readable explanation on what the dependency is used for + */ + description: string | null + requirement: + | { + type: "opt-in" + /** + * The human readable explanation on how to opt-in to the dependency + */ + how: string + } + | { + type: "opt-out" + /** + * The human readable explanation on how to opt-out to the dependency + */ + how: string + } + | { + type: "required" + } +} diff --git a/sdk/lib/manifest/index.ts b/sdk/lib/manifest/index.ts new file mode 100644 index 000000000..806ef5e61 --- /dev/null +++ b/sdk/lib/manifest/index.ts @@ -0,0 +1,2 @@ +import "./setupManifest" +import "./ManifestTypes" diff --git a/sdk/lib/manifest/setupManifest.ts b/sdk/lib/manifest/setupManifest.ts new file mode 100644 index 000000000..41c74baa0 --- /dev/null +++ b/sdk/lib/manifest/setupManifest.ts @@ -0,0 +1,20 @@ +import { SDKManifest, ManifestVersion } from "./ManifestTypes" + +export function setupManifest< + Id extends string, + Version extends ManifestVersion, + Dependencies extends Record, + VolumesTypes extends string, + AssetTypes extends string, + ImagesTypes extends string, + Manifest extends SDKManifest & { + dependencies: Dependencies + id: Id + version: Version + assets: AssetTypes[] + images: ImagesTypes[] + volumes: VolumesTypes[] + }, +>(manifest: Manifest): Manifest { + return manifest +} diff --git a/sdk/lib/store/getStore.ts b/sdk/lib/store/getStore.ts new file mode 100644 index 000000000..4ea3a9419 --- /dev/null +++ b/sdk/lib/store/getStore.ts @@ -0,0 +1,61 @@ +import { Effects, EnsureStorePath } from "../types" + +export class GetStore { + constructor( + readonly effects: Effects, + readonly path: Path & EnsureStorePath, + readonly options: { + /** Defaults to what ever the package currently in */ + packageId?: string | undefined + } = {}, + ) {} + + /** + * Returns the value of Store at the provided path. Restart the service if the value changes + */ + const() { + return this.effects.store.get({ + ...this.options, + path: this.path as any, + callback: this.effects.restart, + }) + } + /** + * Returns the value of Store at the provided path. Does nothing if the value changes + */ + once() { + return this.effects.store.get({ + ...this.options, + path: this.path as any, + callback: () => {}, + }) + } + + /** + * Watches the value of Store at the provided path. Takes a custom callback function to run whenever the value changes + */ + async *watch() { + while (true) { + let callback: () => void + const waitForNext = new Promise((resolve) => { + callback = resolve + }) + yield await this.effects.store.get({ + ...this.options, + path: this.path as any, + callback: () => callback(), + }) + await waitForNext + } + } +} +export function getStore( + effects: Effects, + path: Path & EnsureStorePath, + options: { + /** Defaults to what ever the package currently in */ + packageId?: string | undefined + } = {}, +) { + return new GetStore(effects, path as any, options) +} diff --git a/sdk/lib/test/configBuilder.test.ts b/sdk/lib/test/configBuilder.test.ts new file mode 100644 index 000000000..fe9d123ea --- /dev/null +++ b/sdk/lib/test/configBuilder.test.ts @@ -0,0 +1,818 @@ +import { testOutput } from "./output.test" +import { Config } from "../config/builder/config" +import { List } from "../config/builder/list" +import { Value } from "../config/builder/value" +import { Variants } from "../config/builder/variants" +import { ValueSpec } from "../config/configTypes" + +describe("builder tests", () => { + test("text", async () => { + const bitcoinPropertiesBuilt: { + "peer-tor-address": ValueSpec + } = await Config.of({ + "peer-tor-address": Value.text({ + name: "Peer tor address", + description: "The Tor address of the peer interface", + required: { default: null }, + }), + }).build({} as any) + expect(bitcoinPropertiesBuilt).toMatchObject({ + "peer-tor-address": { + type: "text", + description: "The Tor address of the peer interface", + warning: null, + masked: false, + placeholder: null, + minLength: null, + maxLength: null, + patterns: [], + disabled: false, + inputmode: "text", + name: "Peer tor address", + required: true, + default: null, + }, + }) + }) +}) + +describe("values", () => { + test("toggle", async () => { + const value = Value.toggle({ + name: "Testing", + description: null, + warning: null, + default: false, + }) + const validator = value.validator + validator.unsafeCast(false) + testOutput()(null) + }) + test("text", async () => { + const value = Value.text({ + name: "Testing", + required: { default: null }, + }) + const validator = value.validator + const rawIs = await value.build({} as any) + validator.unsafeCast("test text") + expect(() => validator.unsafeCast(null)).toThrowError() + testOutput()(null) + }) + test("text with default", async () => { + const value = Value.text({ + name: "Testing", + required: { default: "this is a default value" }, + }) + const validator = value.validator + const rawIs = await value.build({} as any) + validator.unsafeCast("test text") + expect(() => validator.unsafeCast(null)).toThrowError() + testOutput()(null) + }) + test("optional text", async () => { + const value = Value.text({ + name: "Testing", + required: false, + }) + const validator = value.validator + const rawIs = await value.build({} as any) + validator.unsafeCast("test text") + validator.unsafeCast(null) + testOutput()(null) + }) + test("color", async () => { + const value = Value.color({ + name: "Testing", + required: false, + description: null, + warning: null, + }) + const validator = value.validator + validator.unsafeCast("#000000") + testOutput()(null) + }) + test("datetime", async () => { + const value = Value.datetime({ + name: "Testing", + required: { default: null }, + description: null, + warning: null, + inputmode: "date", + min: null, + max: null, + }) + const validator = value.validator + validator.unsafeCast("2021-01-01") + testOutput()(null) + }) + test("optional datetime", async () => { + const value = Value.datetime({ + name: "Testing", + required: false, + description: null, + warning: null, + inputmode: "date", + min: null, + max: null, + }) + const validator = value.validator + validator.unsafeCast("2021-01-01") + testOutput()(null) + }) + test("textarea", async () => { + const value = Value.textarea({ + name: "Testing", + required: false, + description: null, + warning: null, + minLength: null, + maxLength: null, + placeholder: null, + }) + const validator = value.validator + validator.unsafeCast("test text") + testOutput()(null) + }) + test("number", async () => { + const value = Value.number({ + name: "Testing", + required: { default: null }, + integer: false, + description: null, + warning: null, + min: null, + max: null, + step: null, + units: null, + placeholder: null, + }) + const validator = value.validator + validator.unsafeCast(2) + testOutput()(null) + }) + test("optional number", async () => { + const value = Value.number({ + name: "Testing", + required: false, + integer: false, + description: null, + warning: null, + min: null, + max: null, + step: null, + units: null, + placeholder: null, + }) + const validator = value.validator + validator.unsafeCast(2) + testOutput()(null) + }) + test("select", async () => { + const value = Value.select({ + name: "Testing", + required: { default: null }, + values: { + a: "A", + b: "B", + }, + description: null, + warning: null, + }) + const validator = value.validator + validator.unsafeCast("a") + validator.unsafeCast("b") + expect(() => validator.unsafeCast("c")).toThrowError() + testOutput()(null) + }) + test("nullable select", async () => { + const value = Value.select({ + name: "Testing", + required: false, + values: { + a: "A", + b: "B", + }, + description: null, + warning: null, + }) + const validator = value.validator + validator.unsafeCast("a") + validator.unsafeCast("b") + validator.unsafeCast(null) + testOutput()(null) + }) + test("multiselect", async () => { + const value = Value.multiselect({ + name: "Testing", + values: { + a: "A", + b: "B", + }, + default: [], + description: null, + warning: null, + minLength: null, + maxLength: null, + }) + const validator = value.validator + validator.unsafeCast([]) + validator.unsafeCast(["a", "b"]) + + expect(() => validator.unsafeCast(["e"])).toThrowError() + expect(() => validator.unsafeCast([4])).toThrowError() + testOutput>()(null) + }) + test("object", async () => { + const value = Value.object( + { + name: "Testing", + description: null, + warning: null, + }, + Config.of({ + a: Value.toggle({ + name: "test", + description: null, + warning: null, + default: false, + }), + }), + ) + const validator = value.validator + validator.unsafeCast({ a: true }) + testOutput()(null) + }) + test("union", async () => { + const value = Value.union( + { + name: "Testing", + required: { default: null }, + description: null, + warning: null, + }, + Variants.of({ + a: { + name: "a", + spec: Config.of({ + b: Value.toggle({ + name: "b", + description: null, + warning: null, + default: false, + }), + }), + }, + }), + ) + const validator = value.validator + validator.unsafeCast({ unionSelectKey: "a", unionValueKey: { b: false } }) + type Test = typeof validator._TYPE + testOutput()( + null, + ) + }) + test("list", async () => { + const value = Value.list( + List.number( + { + name: "test", + }, + { + integer: false, + }, + ), + ) + const validator = value.validator + validator.unsafeCast([1, 2, 3]) + testOutput()(null) + }) + + describe("dynamic", () => { + const fakeOptions = { + config: "config", + effects: "effects", + utils: "utils", + } as any + test("toggle", async () => { + const value = Value.dynamicToggle(async () => ({ + name: "Testing", + description: null, + warning: null, + default: false, + })) + const validator = value.validator + validator.unsafeCast(false) + expect(() => validator.unsafeCast(null)).toThrowError() + testOutput()(null) + expect(await value.build(fakeOptions)).toMatchObject({ + name: "Testing", + description: null, + warning: null, + default: false, + }) + }) + test("text", async () => { + const value = Value.dynamicText(async () => ({ + name: "Testing", + required: { default: null }, + })) + const validator = value.validator + const rawIs = await value.build({} as any) + validator.unsafeCast("test text") + validator.unsafeCast(null) + testOutput()(null) + expect(await value.build(fakeOptions)).toMatchObject({ + name: "Testing", + required: true, + default: null, + }) + }) + test("text with default", async () => { + const value = Value.dynamicText(async () => ({ + name: "Testing", + required: { default: "this is a default value" }, + })) + const validator = value.validator + validator.unsafeCast("test text") + validator.unsafeCast(null) + testOutput()(null) + expect(await value.build(fakeOptions)).toMatchObject({ + name: "Testing", + required: true, + default: "this is a default value", + }) + }) + test("optional text", async () => { + const value = Value.dynamicText(async () => ({ + name: "Testing", + required: false, + })) + const validator = value.validator + const rawIs = await value.build({} as any) + validator.unsafeCast("test text") + validator.unsafeCast(null) + testOutput()(null) + expect(await value.build(fakeOptions)).toMatchObject({ + name: "Testing", + required: false, + default: null, + }) + }) + test("color", async () => { + const value = Value.dynamicColor(async () => ({ + name: "Testing", + required: false, + description: null, + warning: null, + })) + const validator = value.validator + validator.unsafeCast("#000000") + validator.unsafeCast(null) + testOutput()(null) + expect(await value.build(fakeOptions)).toMatchObject({ + name: "Testing", + required: false, + default: null, + description: null, + warning: null, + }) + }) + test("datetime", async () => { + const value = Value.dynamicDatetime<{ test: "a" }>(async ({ utils }) => { + ;async () => { + ;(await utils.store.getOwn("/test").once()) satisfies "a" + } + + return { + name: "Testing", + required: { default: null }, + inputmode: "date", + } + }) + const validator = value.validator + validator.unsafeCast("2021-01-01") + validator.unsafeCast(null) + testOutput()(null) + expect(await value.build(fakeOptions)).toMatchObject({ + name: "Testing", + required: true, + default: null, + description: null, + warning: null, + inputmode: "date", + }) + }) + test("textarea", async () => { + const value = Value.dynamicTextarea(async () => ({ + name: "Testing", + required: false, + description: null, + warning: null, + minLength: null, + maxLength: null, + placeholder: null, + })) + const validator = value.validator + validator.unsafeCast("test text") + expect(() => validator.unsafeCast(null)).toThrowError() + testOutput()(null) + expect(await value.build(fakeOptions)).toMatchObject({ + name: "Testing", + required: false, + }) + }) + test("number", async () => { + const value = Value.dynamicNumber(() => ({ + name: "Testing", + required: { default: null }, + integer: false, + description: null, + warning: null, + min: null, + max: null, + step: null, + units: null, + placeholder: null, + })) + const validator = value.validator + validator.unsafeCast(2) + validator.unsafeCast(null) + expect(() => validator.unsafeCast("null")).toThrowError() + testOutput()(null) + expect(await value.build(fakeOptions)).toMatchObject({ + name: "Testing", + required: true, + }) + }) + test("select", async () => { + const value = Value.dynamicSelect(() => ({ + name: "Testing", + required: { default: null }, + values: { + a: "A", + b: "B", + }, + description: null, + warning: null, + })) + const validator = value.validator + validator.unsafeCast("a") + validator.unsafeCast("b") + validator.unsafeCast("c") + validator.unsafeCast(null) + testOutput()(null) + expect(await value.build(fakeOptions)).toMatchObject({ + name: "Testing", + required: true, + }) + }) + test("multiselect", async () => { + const value = Value.dynamicMultiselect(() => ({ + name: "Testing", + values: { + a: "A", + b: "B", + }, + default: [], + description: null, + warning: null, + minLength: null, + maxLength: null, + })) + const validator = value.validator + validator.unsafeCast([]) + validator.unsafeCast(["a", "b"]) + validator.unsafeCast(["c"]) + + expect(() => validator.unsafeCast([4])).toThrowError() + expect(() => validator.unsafeCast(null)).toThrowError() + testOutput>()(null) + expect(await value.build(fakeOptions)).toMatchObject({ + name: "Testing", + default: [], + }) + }) + }) + describe("filtering", () => { + test("union", async () => { + const value = Value.filteredUnion( + () => ["a", "c"], + { + name: "Testing", + required: { default: null }, + description: null, + warning: null, + }, + Variants.of({ + a: { + name: "a", + spec: Config.of({ + b: Value.toggle({ + name: "b", + description: null, + warning: null, + default: false, + }), + }), + }, + b: { + name: "b", + spec: Config.of({ + b: Value.toggle({ + name: "b", + description: null, + warning: null, + default: false, + }), + }), + }, + }), + ) + const validator = value.validator + validator.unsafeCast({ unionSelectKey: "a", unionValueKey: { b: false } }) + type Test = typeof validator._TYPE + testOutput< + Test, + | { unionSelectKey: "a"; unionValueKey: { b: boolean } } + | { unionSelectKey: "b"; unionValueKey: { b: boolean } } + >()(null) + + const built = await value.build({} as any) + expect(built).toMatchObject({ + name: "Testing", + variants: { + b: {}, + }, + }) + expect(built).toMatchObject({ + name: "Testing", + variants: { + a: {}, + b: {}, + }, + }) + expect(built).toMatchObject({ + name: "Testing", + variants: { + a: {}, + b: {}, + }, + disabled: ["a", "c"], + }) + }) + }) + test("dynamic union", async () => { + const value = Value.dynamicUnion( + () => ({ + disabled: ["a", "c"], + name: "Testing", + required: { default: null }, + description: null, + warning: null, + }), + Variants.of({ + a: { + name: "a", + spec: Config.of({ + b: Value.toggle({ + name: "b", + description: null, + warning: null, + default: false, + }), + }), + }, + b: { + name: "b", + spec: Config.of({ + b: Value.toggle({ + name: "b", + description: null, + warning: null, + default: false, + }), + }), + }, + }), + ) + const validator = value.validator + validator.unsafeCast({ unionSelectKey: "a", unionValueKey: { b: false } }) + type Test = typeof validator._TYPE + testOutput< + Test, + | { unionSelectKey: "a"; unionValueKey: { b: boolean } } + | { unionSelectKey: "b"; unionValueKey: { b: boolean } } + | null + | undefined + >()(null) + + const built = await value.build({} as any) + expect(built).toMatchObject({ + name: "Testing", + variants: { + b: {}, + }, + }) + expect(built).toMatchObject({ + name: "Testing", + variants: { + a: {}, + b: {}, + }, + }) + expect(built).toMatchObject({ + name: "Testing", + variants: { + a: {}, + b: {}, + }, + disabled: ["a", "c"], + }) + }) +}) + +describe("Builder List", () => { + test("obj", async () => { + const value = Value.list( + List.obj( + { + name: "test", + }, + { + spec: Config.of({ + test: Value.toggle({ + name: "test", + description: null, + warning: null, + default: false, + }), + }), + }, + ), + ) + const validator = value.validator + validator.unsafeCast([{ test: true }]) + testOutput()(null) + }) + test("text", async () => { + const value = Value.list( + List.text( + { + name: "test", + }, + { + patterns: [], + }, + ), + ) + const validator = value.validator + validator.unsafeCast(["test", "text"]) + testOutput()(null) + }) + describe("dynamic", () => { + test("text", async () => { + const value = Value.list( + List.dynamicText(() => ({ + name: "test", + spec: { patterns: [] }, + })), + ) + const validator = value.validator + validator.unsafeCast(["test", "text"]) + expect(() => validator.unsafeCast([3, 4])).toThrowError() + expect(() => validator.unsafeCast(null)).toThrowError() + testOutput()(null) + expect(await value.build({} as any)).toMatchObject({ + name: "test", + spec: { patterns: [] }, + }) + }) + }) + test("number", async () => { + const value = Value.list( + List.dynamicNumber(() => ({ + name: "test", + spec: { integer: true }, + })), + ) + const validator = value.validator + expect(() => validator.unsafeCast(["test", "text"])).toThrowError() + validator.unsafeCast([4, 2]) + expect(() => validator.unsafeCast(null)).toThrowError() + validator.unsafeCast([]) + testOutput()(null) + expect(await value.build({} as any)).toMatchObject({ + name: "test", + spec: { integer: true }, + }) + }) +}) + +describe("Nested nullable values", () => { + test("Testing text", async () => { + const value = Config.of({ + a: Value.text({ + name: "Temp Name", + description: + "If no name is provided, the name from config will be used", + required: false, + }), + }) + const validator = value.validator + validator.unsafeCast({ a: null }) + validator.unsafeCast({ a: "test" }) + expect(() => validator.unsafeCast({ a: 4 })).toThrowError() + testOutput()(null) + }) + test("Testing number", async () => { + const value = Config.of({ + a: Value.number({ + name: "Temp Name", + description: + "If no name is provided, the name from config will be used", + required: false, + warning: null, + placeholder: null, + integer: false, + min: null, + max: null, + step: null, + units: null, + }), + }) + const validator = value.validator + validator.unsafeCast({ a: null }) + validator.unsafeCast({ a: 5 }) + expect(() => validator.unsafeCast({ a: "4" })).toThrowError() + testOutput()(null) + }) + test("Testing color", async () => { + const value = Config.of({ + a: Value.color({ + name: "Temp Name", + description: + "If no name is provided, the name from config will be used", + required: false, + warning: null, + }), + }) + const validator = value.validator + validator.unsafeCast({ a: null }) + validator.unsafeCast({ a: "5" }) + expect(() => validator.unsafeCast({ a: 4 })).toThrowError() + testOutput()(null) + }) + test("Testing select", async () => { + const value = Config.of({ + a: Value.select({ + name: "Temp Name", + description: + "If no name is provided, the name from config will be used", + required: false, + warning: null, + values: { + a: "A", + }, + }), + }) + const higher = await Value.select({ + name: "Temp Name", + description: "If no name is provided, the name from config will be used", + required: false, + warning: null, + values: { + a: "A", + }, + }).build({} as any) + + const validator = value.validator + validator.unsafeCast({ a: null }) + validator.unsafeCast({ a: "a" }) + expect(() => validator.unsafeCast({ a: "4" })).toThrowError() + testOutput()(null) + }) + test("Testing multiselect", async () => { + const value = Config.of({ + a: Value.multiselect({ + name: "Temp Name", + description: + "If no name is provided, the name from config will be used", + + warning: null, + default: [], + values: { + a: "A", + }, + minLength: null, + maxLength: null, + }), + }) + const validator = value.validator + validator.unsafeCast({ a: [] }) + validator.unsafeCast({ a: ["a"] }) + expect(() => validator.unsafeCast({ a: ["4"] })).toThrowError() + expect(() => validator.unsafeCast({ a: "4" })).toThrowError() + testOutput()(null) + }) +}) diff --git a/sdk/lib/test/configTypes.test.ts b/sdk/lib/test/configTypes.test.ts new file mode 100644 index 000000000..7e3ff5ca6 --- /dev/null +++ b/sdk/lib/test/configTypes.test.ts @@ -0,0 +1,32 @@ +import { + ListValueSpecOf, + ValueSpec, + isValueSpecListOf, +} from "../config/configTypes" +import { Config } from "../config/builder/config" +import { List } from "../config/builder/list" +import { Value } from "../config/builder/value" + +describe("Config Types", () => { + test("isValueSpecListOf", async () => { + const options = [List.obj, List.text, List.number] + for (const option of options) { + const test = (option as any)( + {} as any, + { spec: Config.of({}) } as any, + ) as any + const someList = await Value.list(test).build({} as any) + if (isValueSpecListOf(someList, "text")) { + someList.spec satisfies ListValueSpecOf<"text"> + } else if (isValueSpecListOf(someList, "number")) { + someList.spec satisfies ListValueSpecOf<"number"> + } else if (isValueSpecListOf(someList, "object")) { + someList.spec satisfies ListValueSpecOf<"object"> + } else { + throw new Error( + "Failed to figure out the type: " + JSON.stringify(someList), + ) + } + } + }) +}) diff --git a/sdk/lib/test/emverList.test.ts b/sdk/lib/test/emverList.test.ts new file mode 100644 index 000000000..43919aa83 --- /dev/null +++ b/sdk/lib/test/emverList.test.ts @@ -0,0 +1,262 @@ +import { EmVer, notRange, rangeAnd, rangeOf, rangeOr } from "../emverLite/mod" +describe("EmVer", () => { + { + { + const checker = rangeOf("*") + test("rangeOf('*')", () => { + checker.check("1") + checker.check("1.2") + checker.check("1.2.3") + checker.check("1.2.3.4") + // @ts-expect-error + checker.check("1.2.3.4.5") + // @ts-expect-error + checker.check("1.2.3.4.5.6") + expect(checker.check("1")).toEqual(true) + expect(checker.check("1.2")).toEqual(true) + expect(checker.check("1.2.3.4")).toEqual(true) + }) + test("rangeOf('*') invalid", () => { + // @ts-expect-error + expect(() => checker.check("a")).toThrow() + // @ts-expect-error + expect(() => checker.check("")).toThrow() + expect(() => checker.check("1..3")).toThrow() + }) + } + + { + const checker = rangeOf(">1.2.3.4") + test(`rangeOf(">1.2.3.4") valid`, () => { + expect(checker.check("2-beta123")).toEqual(true) + expect(checker.check("2")).toEqual(true) + expect(checker.check("1.2.3.5")).toEqual(true) + // @ts-expect-error + expect(checker.check("1.2.3.4.1")).toEqual(true) + }) + + test(`rangeOf(">1.2.3.4") invalid`, () => { + expect(checker.check("1.2.3.4")).toEqual(false) + expect(checker.check("1.2.3")).toEqual(false) + expect(checker.check("1")).toEqual(false) + }) + } + { + const checker = rangeOf("=1.2.3") + test(`rangeOf("=1.2.3") valid`, () => { + expect(checker.check("1.2.3")).toEqual(true) + }) + + test(`rangeOf("=1.2.3") invalid`, () => { + expect(checker.check("2")).toEqual(false) + expect(checker.check("1.2.3.1")).toEqual(false) + expect(checker.check("1.2")).toEqual(false) + }) + } + { + const checker = rangeOf(">=1.2.3.4") + test(`rangeOf(">=1.2.3.4") valid`, () => { + expect(checker.check("2")).toEqual(true) + expect(checker.check("1.2.3.5")).toEqual(true) + // @ts-expect-error + expect(checker.check("1.2.3.4.1")).toEqual(true) + expect(checker.check("1.2.3.4")).toEqual(true) + }) + + test(`rangeOf(">=1.2.3.4") invalid`, () => { + expect(checker.check("1.2.3")).toEqual(false) + expect(checker.check("1")).toEqual(false) + }) + } + { + const checker = rangeOf("<1.2.3.4") + test(`rangeOf("<1.2.3.4") invalid`, () => { + expect(checker.check("2")).toEqual(false) + expect(checker.check("1.2.3.5")).toEqual(false) + // @ts-expect-error + expect(checker.check("1.2.3.4.1")).toEqual(false) + expect(checker.check("1.2.3.4")).toEqual(false) + }) + + test(`rangeOf("<1.2.3.4") valid`, () => { + expect(checker.check("1.2.3")).toEqual(true) + expect(checker.check("1")).toEqual(true) + }) + } + { + const checker = rangeOf("<=1.2.3.4") + test(`rangeOf("<=1.2.3.4") invalid`, () => { + expect(checker.check("2")).toEqual(false) + expect(checker.check("1.2.3.5")).toEqual(false) + // @ts-expect-error + expect(checker.check("1.2.3.4.1")).toEqual(false) + }) + + test(`rangeOf("<=1.2.3.4") valid`, () => { + expect(checker.check("1.2.3")).toEqual(true) + expect(checker.check("1")).toEqual(true) + expect(checker.check("1.2.3.4")).toEqual(true) + }) + } + + { + const checkA = rangeOf(">1") + const checkB = rangeOf("<=2") + + const checker = rangeAnd(checkA, checkB) + test(`simple and(checkers) valid`, () => { + expect(checker.check("2")).toEqual(true) + + expect(checker.check("1.1")).toEqual(true) + }) + test(`simple and(checkers) invalid`, () => { + expect(checker.check("2.1")).toEqual(false) + expect(checker.check("1")).toEqual(false) + expect(checker.check("0")).toEqual(false) + }) + } + { + const checkA = rangeOf("<1") + const checkB = rangeOf("=2") + + const checker = rangeOr(checkA, checkB) + test(`simple or(checkers) valid`, () => { + expect(checker.check("2")).toEqual(true) + expect(checker.check("0.1")).toEqual(true) + }) + test(`simple or(checkers) invalid`, () => { + expect(checker.check("2.1")).toEqual(false) + expect(checker.check("1")).toEqual(false) + expect(checker.check("1.1")).toEqual(false) + }) + } + + { + const checker = rangeOf("1.2.*") + test(`rangeOf(1.2.*) valid`, () => { + expect(checker.check("1.2")).toEqual(true) + expect(checker.check("1.2.1")).toEqual(true) + }) + test(`rangeOf(1.2.*) invalid`, () => { + expect(checker.check("1.3")).toEqual(false) + expect(checker.check("1.3.1")).toEqual(false) + + expect(checker.check("1.1.1")).toEqual(false) + expect(checker.check("1.1")).toEqual(false) + expect(checker.check("1")).toEqual(false) + + expect(checker.check("2")).toEqual(false) + }) + } + + { + const checker = notRange(rangeOf("1.2.*")) + test(`notRange(rangeOf(1.2.*)) valid`, () => { + expect(checker.check("1.3")).toEqual(true) + expect(checker.check("1.3.1")).toEqual(true) + + expect(checker.check("1.1.1")).toEqual(true) + expect(checker.check("1.1")).toEqual(true) + expect(checker.check("1")).toEqual(true) + + expect(checker.check("2")).toEqual(true) + }) + test(`notRange(rangeOf(1.2.*)) invalid `, () => { + expect(checker.check("1.2")).toEqual(false) + expect(checker.check("1.2.1")).toEqual(false) + }) + } + { + const checker = rangeOf("!1.2.*") + test(`!(rangeOf(1.2.*)) valid`, () => { + expect(checker.check("1.3")).toEqual(true) + expect(checker.check("1.3.1")).toEqual(true) + + expect(checker.check("1.1.1")).toEqual(true) + expect(checker.check("1.1")).toEqual(true) + expect(checker.check("1")).toEqual(true) + + expect(checker.check("2")).toEqual(true) + }) + test(`!(rangeOf(1.2.*)) invalid `, () => { + expect(checker.check("1.2")).toEqual(false) + expect(checker.check("1.2.1")).toEqual(false) + }) + } + { + test(`no and ranges`, () => { + expect(() => rangeAnd()).toThrow() + }) + test(`no or ranges`, () => { + expect(() => rangeOr()).toThrow() + }) + } + { + const checker = rangeOf("!>1.2.3.4") + test(`rangeOf("!>1.2.3.4") invalid`, () => { + expect(checker.check("2")).toEqual(false) + expect(checker.check("1.2.3.5")).toEqual(false) + // @ts-expect-error + expect(checker.check("1.2.3.4.1")).toEqual(false) + }) + + test(`rangeOf("!>1.2.3.4") valid`, () => { + expect(checker.check("1.2.3.4")).toEqual(true) + expect(checker.check("1.2.3")).toEqual(true) + expect(checker.check("1")).toEqual(true) + }) + } + + { + test(">1 && =1.2", () => { + const checker = rangeOf(">1 && =1.2") + + expect(checker.check("1.2")).toEqual(true) + expect(checker.check("1.2.1")).toEqual(false) + }) + test("=1 || =2", () => { + const checker = rangeOf("=1 || =2") + + expect(checker.check("1")).toEqual(true) + expect(checker.check("2")).toEqual(true) + expect(checker.check("3")).toEqual(false) + }) + + test(">1 && =1.2 || =2", () => { + const checker = rangeOf(">1 && =1.2 || =2") + + expect(checker.check("1.2")).toEqual(true) + expect(checker.check("1")).toEqual(false) + expect(checker.check("2")).toEqual(true) + expect(checker.check("3")).toEqual(false) + }) + + test("&& before || order of operationns: <1.5 && >1 || >1.5 && <3", () => { + const checker = rangeOf("<1.5 && >1 || >1.5 && <3") + expect(checker.check("1.1")).toEqual(true) + expect(checker.check("2")).toEqual(true) + + expect(checker.check("1.5")).toEqual(false) + expect(checker.check("1")).toEqual(false) + expect(checker.check("3")).toEqual(false) + }) + + test("Compare function on the emver", () => { + const a = EmVer.from("1.2.3") + const b = EmVer.from("1.2.4") + + expect(a.compare(b)).toEqual("less") + expect(b.compare(a)).toEqual("greater") + expect(a.compare(a)).toEqual("equal") + }) + test("Compare for sort function on the emver", () => { + const a = EmVer.from("1.2.3") + const b = EmVer.from("1.2.4") + + expect(a.compareForSort(b)).toEqual(-1) + expect(b.compareForSort(a)).toEqual(1) + expect(a.compareForSort(a)).toEqual(0) + }) + } + } +}) diff --git a/sdk/lib/test/health.readyCheck.test.ts b/sdk/lib/test/health.readyCheck.test.ts new file mode 100644 index 000000000..49efcc759 --- /dev/null +++ b/sdk/lib/test/health.readyCheck.test.ts @@ -0,0 +1,17 @@ +import { containsAddress } from "../health/checkFns/checkPortListening" + +describe("Health ready check", () => { + it("Should be able to parse an example information", () => { + let input = ` + + sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode + 0: 00000000:1F90 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 21634478 1 0000000000000000 100 0 0 10 0 + 1: 00000000:0050 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 21634477 1 0000000000000000 100 0 0 10 0 + 2: 0B00007F:9671 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 21635458 1 0000000000000000 100 0 0 10 0 + 3: 00000000:0D73 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 21634479 1 0000000000000000 100 0 0 10 0 + ` + + expect(containsAddress(input, 80)).toBe(true) + expect(containsAddress(input, 1234)).toBe(false) + }) +}) diff --git a/sdk/lib/test/host.test.ts b/sdk/lib/test/host.test.ts new file mode 100644 index 000000000..01ce6f3f2 --- /dev/null +++ b/sdk/lib/test/host.test.ts @@ -0,0 +1,27 @@ +import { NetworkInterfaceBuilder } from "../interfaces/NetworkInterfaceBuilder" +import { Effects } from "../types" +import { createUtils } from "../util" + +describe("host", () => { + test("Testing that the types work", () => { + async function test(effects: Effects) { + const utils = createUtils(effects) + const foo = utils.host.multi("foo") + const fooOrigin = await foo.bindPort(80, { protocol: "http" as const }) + const fooInterface = new NetworkInterfaceBuilder({ + effects, + name: "Foo", + id: "foo", + description: "A Foo", + hasPrimary: false, + disabled: false, + type: "ui", + username: "bar", + path: "/baz", + search: { qux: "yes" }, + }) + + await fooInterface.export([fooOrigin]) + } + }) +}) diff --git a/sdk/lib/test/makeOutput.ts b/sdk/lib/test/makeOutput.ts new file mode 100644 index 000000000..cef17a7e8 --- /dev/null +++ b/sdk/lib/test/makeOutput.ts @@ -0,0 +1,428 @@ +import { oldSpecToBuilder } from "../../scripts/oldSpecToBuilder" + +oldSpecToBuilder( + // Make the location + "./lib/test/output.ts", + // Put the config here + { + mediasources: { + type: "list", + subtype: "enum", + name: "Media Sources", + description: "List of Media Sources to use with Jellyfin", + range: "[1,*)", + default: ["nextcloud"], + spec: { + values: ["nextcloud", "filebrowser"], + "value-names": { + nextcloud: "NextCloud", + filebrowser: "File Browser", + }, + }, + }, + testListUnion: { + type: "list", + subtype: "union", + name: "Lightning Nodes", + description: "List of Lightning Network node instances to manage", + range: "[1,*)", + default: ["lnd"], + spec: { + type: "string", + "display-as": "{{name}}", + "unique-by": "name", + name: "Node Implementation", + tag: { + id: "type", + name: "Type", + description: + "- LND: Lightning Network Daemon from Lightning Labs\n- CLN: Core Lightning from Blockstream\n", + "variant-names": { + lnd: "Lightning Network Daemon (LND)", + "c-lightning": "Core Lightning (CLN)", + }, + }, + default: "lnd", + variants: { + lnd: { + name: { + type: "string", + name: "Node Name", + description: "Name of this node in the list", + default: "LND Wrapper", + nullable: false, + }, + }, + }, + }, + }, + rpc: { + type: "object", + name: "RPC Settings", + description: "RPC configuration options.", + spec: { + enable: { + type: "boolean", + name: "Enable", + description: "Allow remote RPC requests.", + default: true, + }, + username: { + type: "string", + nullable: false, + name: "Username", + description: "The username for connecting to Bitcoin over RPC.", + default: "bitcoin", + masked: true, + pattern: "^[a-zA-Z0-9_]+$", + "pattern-description": + "Must be alphanumeric (can contain underscore).", + }, + password: { + type: "string", + nullable: false, + name: "RPC Password", + description: "The password for connecting to Bitcoin over RPC.", + default: { + charset: "a-z,2-7", + len: 20, + }, + pattern: '^[^\\n"]*$', + "pattern-description": + "Must not contain newline or quote characters.", + copyable: true, + masked: true, + }, + bio: { + type: "string", + nullable: false, + name: "Username", + description: "The username for connecting to Bitcoin over RPC.", + default: "bitcoin", + masked: true, + pattern: "^[a-zA-Z0-9_]+$", + "pattern-description": + "Must be alphanumeric (can contain underscore).", + textarea: true, + }, + advanced: { + type: "object", + name: "Advanced", + description: "Advanced RPC Settings", + spec: { + auth: { + name: "Authorization", + description: + "Username and hashed password for JSON-RPC connections. RPC clients connect using the usual http basic authentication.", + type: "list", + subtype: "string", + default: [], + spec: { + pattern: + "^[a-zA-Z0-9_-]+:([0-9a-fA-F]{2})+\\$([0-9a-fA-F]{2})+$", + "pattern-description": + 'Each item must be of the form ":$".', + masked: false, + }, + range: "[0,*)", + }, + serialversion: { + name: "Serialization Version", + description: + "Return raw transaction or block hex with Segwit or non-SegWit serialization.", + type: "enum", + values: ["non-segwit", "segwit"], + "value-names": {}, + default: "segwit", + }, + servertimeout: { + name: "Rpc Server Timeout", + description: + "Number of seconds after which an uncompleted RPC call will time out.", + type: "number", + nullable: false, + range: "[5,300]", + integral: true, + units: "seconds", + default: 30, + }, + threads: { + name: "Threads", + description: + "Set the number of threads for handling RPC calls. You may wish to increase this if you are making lots of calls via an integration.", + type: "number", + nullable: false, + default: 16, + range: "[1,64]", + integral: true, + }, + workqueue: { + name: "Work Queue", + description: + "Set the depth of the work queue to service RPC calls. Determines how long the backlog of RPC requests can get before it just rejects new ones.", + type: "number", + nullable: false, + default: 128, + range: "[8,256]", + integral: true, + units: "requests", + }, + }, + }, + }, + }, + "zmq-enabled": { + type: "boolean", + name: "ZeroMQ Enabled", + description: "Enable the ZeroMQ interface", + default: true, + }, + txindex: { + type: "boolean", + name: "Transaction Index", + description: "Enable the Transaction Index (txindex)", + default: true, + }, + wallet: { + type: "object", + name: "Wallet", + description: "Wallet Settings", + spec: { + enable: { + name: "Enable Wallet", + description: "Load the wallet and enable wallet RPC calls.", + type: "boolean", + default: true, + }, + avoidpartialspends: { + name: "Avoid Partial Spends", + description: + "Group outputs by address, selecting all or none, instead of selecting on a per-output basis. This improves privacy at the expense of higher transaction fees.", + type: "boolean", + default: true, + }, + discardfee: { + name: "Discard Change Tolerance", + description: + "The fee rate (in BTC/kB) that indicates your tolerance for discarding change by adding it to the fee.", + type: "number", + nullable: false, + default: 0.0001, + range: "[0,.01]", + integral: false, + units: "BTC/kB", + }, + }, + }, + advanced: { + type: "object", + name: "Advanced", + description: "Advanced Settings", + spec: { + mempool: { + type: "object", + name: "Mempool", + description: "Mempool Settings", + spec: { + mempoolfullrbf: { + name: "Enable Full RBF", + description: + "Policy for your node to use for relaying and mining unconfirmed transactions. For details, see https://github.com/bitcoin/bitcoin/blob/master/doc/release-notes/release-notes-24.0.md#notice-of-new-option-for-transaction-replacement-policies", + type: "boolean", + default: false, + }, + persistmempool: { + type: "boolean", + name: "Persist Mempool", + description: "Save the mempool on shutdown and load on restart.", + default: true, + }, + maxmempool: { + type: "number", + nullable: false, + name: "Max Mempool Size", + description: + "Keep the transaction memory pool below megabytes.", + range: "[1,*)", + integral: true, + units: "MiB", + default: 300, + }, + mempoolexpiry: { + type: "number", + nullable: false, + name: "Mempool Expiration", + description: + "Do not keep transactions in the mempool longer than hours.", + range: "[1,*)", + integral: true, + units: "Hr", + default: 336, + }, + }, + }, + peers: { + type: "object", + name: "Peers", + description: "Peer Connection Settings", + spec: { + listen: { + type: "boolean", + name: "Make Public", + description: + "Allow other nodes to find your server on the network.", + default: true, + }, + onlyconnect: { + type: "boolean", + name: "Disable Peer Discovery", + description: "Only connect to specified peers.", + default: false, + }, + onlyonion: { + type: "boolean", + name: "Disable Clearnet", + description: "Only connect to peers over Tor.", + default: false, + }, + addnode: { + name: "Add Nodes", + description: "Add addresses of nodes to connect to.", + type: "list", + subtype: "object", + range: "[0,*)", + default: [], + spec: { + "unique-by": null, + spec: { + hostname: { + type: "string", + nullable: true, + name: "Hostname", + description: "Domain or IP address of bitcoin peer", + pattern: + "(^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$)|((^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$)|(^[a-z2-7]{16}\\.onion$)|(^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$))", + "pattern-description": + "Must be either a domain name, or an IPv4 or IPv6 address. Do not include protocol scheme (eg 'http://') or port.", + masked: false, + }, + port: { + type: "number", + nullable: true, + name: "Port", + description: + "Port that peer is listening on for inbound p2p connections", + range: "[0,65535]", + integral: true, + }, + }, + }, + }, + }, + }, + dbcache: { + type: "number", + nullable: true, + name: "Database Cache", + description: + "How much RAM to allocate for caching the TXO set. Higher values improve syncing performance, but increase your chance of using up all your system's memory or corrupting your database in the event of an ungraceful shutdown. Set this high but comfortably below your system's total RAM during IBD, then turn down to 450 (or leave blank) once the sync completes.", + warning: + "WARNING: Increasing this value results in a higher chance of ungraceful shutdowns, which can leave your node unusable if it happens during the initial block download. Use this setting with caution. Be sure to set this back to the default (450 or leave blank) once your node is synced. DO NOT press the STOP button if your dbcache is large. Instead, set this number back to the default, hit save, and wait for bitcoind to restart on its own.", + range: "(0,*)", + integral: true, + units: "MiB", + }, + pruning: { + type: "union", + name: "Pruning Settings", + description: + "Blockchain Pruning Options\nReduce the blockchain size on disk\n", + warning: + "If you set pruning to Manual and your disk is smaller than the total size of the blockchain, you MUST have something running that prunes these blocks or you may overfill your disk!\nDisabling pruning will convert your node into a full archival node. This requires a resync of the entire blockchain, a process that may take several days. Make sure you have enough free disk space or you may fill up your disk.\n", + tag: { + id: "mode", + name: "Pruning Mode", + description: + '- Disabled: Disable pruning\n- Automatic: Limit blockchain size on disk to a certain number of megabytes\n- Manual: Prune blockchain with the "pruneblockchain" RPC\n', + "variant-names": { + disabled: "Disabled", + automatic: "Automatic", + manual: "Manual", + }, + }, + variants: { + disabled: {}, + automatic: { + size: { + type: "number", + nullable: false, + name: "Max Chain Size", + description: "Limit of blockchain size on disk.", + warning: + "Increasing this value will require re-syncing your node.", + default: 550, + range: "[550,1000000)", + integral: true, + units: "MiB", + }, + }, + manual: { + size: { + type: "number", + nullable: false, + name: "Failsafe Chain Size", + description: "Prune blockchain if size expands beyond this.", + default: 65536, + range: "[550,1000000)", + integral: true, + units: "MiB", + }, + }, + }, + default: "disabled", + }, + blockfilters: { + type: "object", + name: "Block Filters", + description: "Settings for storing and serving compact block filters", + spec: { + blockfilterindex: { + type: "boolean", + name: "Compute Compact Block Filters (BIP158)", + description: + "Generate Compact Block Filters during initial sync (IBD) to enable 'getblockfilter' RPC. This is useful if dependent services need block filters to efficiently scan for addresses/transactions etc.", + default: true, + }, + peerblockfilters: { + type: "boolean", + name: "Serve Compact Block Filters to Peers (BIP157)", + description: + "Serve Compact Block Filters as a peer service to other nodes on the network. This is useful if you wish to connect an SPV client to your node to make it efficient to scan transactions without having to download all block data. 'Compute Compact Block Filters (BIP158)' is required.", + default: false, + }, + }, + }, + bloomfilters: { + type: "object", + name: "Bloom Filters (BIP37)", + description: "Setting for serving Bloom Filters", + spec: { + peerbloomfilters: { + type: "boolean", + name: "Serve Bloom Filters to Peers", + description: + "Peers have the option of setting filters on each connection they make after the version handshake has completed. Bloom filters are for clients implementing SPV (Simplified Payment Verification) that want to check that block headers connect together correctly, without needing to verify the full blockchain. The client must trust that the transactions in the chain are in fact valid. It is highly recommended AGAINST using for anything except Bisq integration.", + warning: + "This is ONLY for use with Bisq integration, please use Block Filters for all other applications.", + default: false, + }, + }, + }, + }, + }, + }, + { + // convert this to `start-sdk/lib` for conversions + StartSdk: "./output.sdk", + }, +) diff --git a/sdk/lib/test/mountDependencies.test.ts b/sdk/lib/test/mountDependencies.test.ts new file mode 100644 index 000000000..84e76aa54 --- /dev/null +++ b/sdk/lib/test/mountDependencies.test.ts @@ -0,0 +1,125 @@ +import { setupManifest } from "../manifest/setupManifest" +import { mountDependencies } from "../dependency/mountDependencies" +import { + BuildPath, + setupDependencyMounts, +} from "../dependency/setupDependencyMounts" + +describe("mountDependencies", () => { + const clnManifest = setupManifest({ + id: "cln", + title: "", + version: "1", + releaseNotes: "", + license: "", + replaces: [], + wrapperRepo: "", + upstreamRepo: "", + supportSite: "", + marketingSite: "", + donationUrl: null, + description: { + short: "", + long: "", + }, + assets: [], + images: [], + volumes: ["main"], + alerts: { + install: null, + update: null, + uninstall: null, + restore: null, + start: null, + stop: null, + }, + dependencies: {}, + }) + const clnManifestVolumes = clnManifest.volumes + const lndManifest = setupManifest({ + id: "lnd", + title: "", + version: "1", + releaseNotes: "", + license: "", + replaces: [], + wrapperRepo: "", + upstreamRepo: "", + supportSite: "", + marketingSite: "", + donationUrl: null, + description: { + short: "", + long: "", + }, + assets: [], + images: [], + volumes: ["main2"], + alerts: { + install: null, + update: null, + uninstall: null, + restore: null, + start: null, + stop: null, + }, + dependencies: {}, + }) + clnManifest.id + + test("Types work", () => { + const dependencyMounts = setupDependencyMounts() + .addPath({ + name: "root", + volume: "main", + path: "/", + manifest: clnManifest, + readonly: true, + }) + .addPath({ + name: "root", + manifest: lndManifest, + volume: "main2", + path: "/", + readonly: true, + }) + .addPath({ + name: "root", + manifest: lndManifest, + // @ts-expect-error Expect that main will throw because it is not in the thing + volume: "main", + path: "/", + readonly: true, + }) + .build() + ;() => { + const test = mountDependencies( + null as any, + dependencyMounts, + ) satisfies Promise<{ + cln: { + main: { + root: string + } + } + lnd: { + main2: { + root: string + } + } + }> + const test2 = mountDependencies( + null as any, + dependencyMounts.cln, + ) satisfies Promise<{ + main: { root: string } + }> + const test3 = mountDependencies( + null as any, + dependencyMounts.cln.main, + ) satisfies Promise<{ + root: string + }> + } + }) +}) diff --git a/sdk/lib/test/output.sdk.ts b/sdk/lib/test/output.sdk.ts new file mode 100644 index 000000000..e69ef2a68 --- /dev/null +++ b/sdk/lib/test/output.sdk.ts @@ -0,0 +1,45 @@ +import { StartSdk } from "../StartSdk" +import { setupManifest } from "../manifest/setupManifest" + +export type Manifest = any +export const sdk = StartSdk.of() + .withManifest( + setupManifest({ + id: "testOutput", + title: "", + version: "1.0", + releaseNotes: "", + license: "", + replaces: [], + wrapperRepo: "", + upstreamRepo: "", + supportSite: "", + marketingSite: "", + donationUrl: null, + description: { + short: "", + long: "", + }, + containers: {}, + images: [], + volumes: [], + assets: [], + alerts: { + install: null, + update: null, + uninstall: null, + restore: null, + start: null, + stop: null, + }, + dependencies: { + remoteTest: { + description: "", + requirement: { how: "", type: "opt-in" }, + version: "1.0", + }, + }, + }), + ) + .withStore<{ storeRoot: { storeLeaf: "value" } }>() + .build(true) diff --git a/sdk/lib/test/output.test.ts b/sdk/lib/test/output.test.ts new file mode 100644 index 000000000..2b3afb5de --- /dev/null +++ b/sdk/lib/test/output.test.ts @@ -0,0 +1,152 @@ +import { + UnionSelectKey, + unionSelectKey, + UnionValueKey, + unionValueKey, +} from "../config/configTypes" +import { ConfigSpec, matchConfigSpec } from "./output" +import * as _I from "../index" +import { camelCase } from "../../scripts/oldSpecToBuilder" +import { deepMerge } from "../util/deepMerge" + +export type IfEquals = + (() => G extends T ? 1 : 2) extends () => G extends U ? 1 : 2 ? Y : N +export function testOutput(): (c: IfEquals) => null { + return () => null +} + +/// Testing the types of the input spec +testOutput()(null) +testOutput()(null) +testOutput()(null) + +testOutput()(null) +testOutput< + ConfigSpec["rpc"]["advanced"]["serialversion"], + "segwit" | "non-segwit" +>()(null) +testOutput()(null) +testOutput< + ConfigSpec["advanced"]["peers"]["addnode"][0]["hostname"], + string | null | undefined +>()(null) +testOutput< + ConfigSpec["testListUnion"][0]["union"][UnionValueKey]["name"], + string +>()(null) +testOutput()( + null, +) +testOutput>()( + null, +) + +// @ts-expect-error Because enable should be a boolean +testOutput()(null) +// prettier-ignore +// @ts-expect-error Expect that the string is the one above +testOutput()(null); + +/// Here we test the output of the matchConfigSpec function +describe("Inputs", () => { + const validInput: ConfigSpec = { + mediasources: ["filebrowser"], + testListUnion: [ + { + union: { [unionSelectKey]: "lnd", [unionValueKey]: { name: "string" } }, + }, + ], + rpc: { + enable: true, + bio: "This is a bio", + username: "test", + password: "test", + advanced: { + auth: ["test"], + serialversion: "segwit", + servertimeout: 6, + threads: 3, + workqueue: 9, + }, + }, + "zmq-enabled": false, + txindex: false, + wallet: { enable: false, avoidpartialspends: false, discardfee: 0.0001 }, + advanced: { + mempool: { + maxmempool: 1, + persistmempool: true, + mempoolexpiry: 23, + mempoolfullrbf: true, + }, + peers: { + listen: true, + onlyconnect: true, + onlyonion: true, + addnode: [ + { + hostname: "test", + port: 1, + }, + ], + }, + dbcache: 5, + pruning: { + unionSelectKey: "disabled", + unionValueKey: {}, + }, + blockfilters: { + blockfilterindex: false, + peerblockfilters: false, + }, + bloomfilters: { peerbloomfilters: false }, + }, + } + + test("test valid input", () => { + const output = matchConfigSpec.unsafeCast(validInput) + expect(output).toEqual(validInput) + }) + test("test no longer care about the conversion of min/max and validating", () => { + matchConfigSpec.unsafeCast( + deepMerge({}, validInput, { rpc: { advanced: { threads: 0 } } }), + ) + }) + test("test errors should throw for number in string", () => { + expect(() => + matchConfigSpec.unsafeCast( + deepMerge({}, validInput, { rpc: { enable: 2 } }), + ), + ).toThrowError() + }) + test("Test that we set serialversion to something not segwit or non-segwit", () => { + expect(() => + matchConfigSpec.unsafeCast( + deepMerge({}, validInput, { + rpc: { advanced: { serialversion: "testing" } }, + }), + ), + ).toThrowError() + }) +}) + +describe("camelCase", () => { + test("'EquipmentClass name'", () => { + expect(camelCase("EquipmentClass name")).toEqual("equipmentClassName") + }) + test("'Equipment className'", () => { + expect(camelCase("Equipment className")).toEqual("equipmentClassName") + }) + test("'equipment class name'", () => { + expect(camelCase("equipment class name")).toEqual("equipmentClassName") + }) + test("'Equipment Class Name'", () => { + expect(camelCase("Equipment Class Name")).toEqual("equipmentClassName") + }) + test("'hyphen-name-format'", () => { + expect(camelCase("hyphen-name-format")).toEqual("hyphenNameFormat") + }) + test("'underscore_name_format'", () => { + expect(camelCase("underscore_name_format")).toEqual("underscoreNameFormat") + }) +}) diff --git a/sdk/lib/test/setupDependencyConfig.test.ts b/sdk/lib/test/setupDependencyConfig.test.ts new file mode 100644 index 000000000..4fac5d063 --- /dev/null +++ b/sdk/lib/test/setupDependencyConfig.test.ts @@ -0,0 +1,27 @@ +import { sdk } from "./output.sdk" + +describe("setupDependencyConfig", () => { + test("test", () => { + const testConfig = sdk.Config.of({ + test: sdk.Value.text({ + name: "testValue", + required: false, + }), + }) + + const testConfig2 = sdk.Config.of({ + test2: sdk.Value.text({ + name: "testValue2", + required: false, + }), + }) + const remoteTest = sdk.DependencyConfig.of({ + localConfig: testConfig, + remoteConfig: testConfig2, + dependencyConfig: async ({}) => {}, + }) + sdk.setupDependencyConfig(testConfig, { + remoteTest, + }) + }) +}) diff --git a/sdk/lib/test/store.test.ts b/sdk/lib/test/store.test.ts new file mode 100644 index 000000000..2ed8c4dfd --- /dev/null +++ b/sdk/lib/test/store.test.ts @@ -0,0 +1,115 @@ +import { Effects } from "../types" +import { createMainUtils } from "../util" +import { createUtils } from "../util/utils" + +type Store = { + config: { + someValue: "a" | "b" + } +} +type Manifest = any +const todo = (): A => { + throw new Error("not implemented") +} +const noop = () => {} +describe("Store", () => { + test("types", async () => { + ;async () => { + createUtils(todo()).store.setOwn("/config", { + someValue: "a", + }) + createUtils(todo()).store.setOwn( + "/config/someValue", + "b", + ) + createUtils(todo()).store.setOwn("", { + config: { someValue: "b" }, + }) + createUtils(todo()).store.setOwn( + "/config/someValue", + + // @ts-expect-error Type is wrong for the setting value + 5, + ) + createUtils(todo()).store.setOwn( + // @ts-expect-error Path is wrong + "/config/someVae3lue", + "someValue", + ) + + todo().store.set({ + path: "/config/someValue", + value: "b", + }) + todo().store.set({ + //@ts-expect-error Path is wrong + path: "/config/someValue", + //@ts-expect-error Path is wrong + value: "someValueIn", + }) + todo().store.set({ + //@ts-expect-error Path is wrong + path: "/config/some2Value", + value: "a", + }) + ;(await createMainUtils(todo()) + .store.getOwn("/config/someValue") + .const()) satisfies string + ;(await createMainUtils(todo()) + .store.getOwn("/config") + .const()) satisfies Store["config"] + await createMainUtils(todo()) + // @ts-expect-error Path is wrong + .store.getOwn("/config/somdsfeValue") + .const() + /// ----------------- ERRORS ----------------- + + createUtils(todo()).store.setOwn("", { + // @ts-expect-error Type is wrong for the setting value + config: { someValue: "notInAOrB" }, + }) + createUtils(todo()).store.setOwn( + "/config/someValue", + // @ts-expect-error Type is wrong for the setting value + "notInAOrB", + ) + ;(await createUtils(todo()) + .store.getOwn("/config/someValue") + // @ts-expect-error Const should normally not be callable + .const()) satisfies string + ;(await createUtils(todo()) + .store.getOwn("/config") + // @ts-expect-error Const should normally not be callable + .const()) satisfies Store["config"] + await createUtils(todo()) + // @ts-expect-error Path is wrong + .store.getOwn("/config/somdsfeValue") + // @ts-expect-error Const should normally not be callable + .const() + + /// + ;(await createUtils(todo()) + .store.getOwn("/config/someValue") + // @ts-expect-error satisfies type is wrong + .const()) satisfies number + ;(await createMainUtils(todo()) + // @ts-expect-error Path is wrong + .store.getOwn("/config/") + .const()) satisfies Store["config"] + ;(await todo().store.get({ + path: "/config/someValue", + callback: noop, + })) satisfies string + await todo().store.get({ + // @ts-expect-error Path is wrong as in it doesn't match above + path: "/config/someV2alue", + callback: noop, + }) + await todo().store.get({ + // @ts-expect-error Path is wrong as in it doesn't exists in wrapper type + path: "/config/someV2alue", + callback: noop, + }) + } + }) +}) diff --git a/sdk/lib/test/util.deepMerge.test.ts b/sdk/lib/test/util.deepMerge.test.ts new file mode 100644 index 000000000..25a4a7d22 --- /dev/null +++ b/sdk/lib/test/util.deepMerge.test.ts @@ -0,0 +1,26 @@ +import { deepEqual } from "../util/deepEqual" +import { deepMerge } from "../util/deepMerge" + +describe("deepMerge", () => { + test("deepMerge({}, {a: 1}, {b: 2}) should return {a: 1, b: 2}", () => { + expect(deepMerge({}, { a: 1 }, { b: 2 })).toEqual({ a: 1, b: 2 }) + }) + test("deepMerge(null, [1,2,3]) should equal [1,2,3]", () => { + expect(deepMerge(null, [1, 2, 3])).toEqual([1, 2, 3]) + }) + test("deepMerge({a: {b: 1, c:2}}, {a: {b: 3}}) should equal {a: {b: 3, c: 2}}", () => { + expect(deepMerge({ a: { b: 1, c: 2 } }, { a: { b: 3 } })).toEqual({ + a: { b: 3, c: 2 }, + }) + }) + test("deepMerge({a: {b: 1, c:2}}, {a: {b: 3}}) should equal {a: {b: 3, c: 2}} with deep equal", () => { + expect( + deepEqual(deepMerge({ a: { b: 1, c: 2 } }, { a: { b: 3 } }), { + a: { b: 3, c: 2 }, + }), + ).toBeTruthy() + }) + test("deepMerge([1,2,3], [2,3,4]) should equal [2,3,4]", () => { + expect(deepMerge([1, 2, 3], [2, 3, 4])).toEqual([2, 3, 4]) + }) +}) diff --git a/sdk/lib/test/util.getNetworkInterface.test.ts b/sdk/lib/test/util.getNetworkInterface.test.ts new file mode 100644 index 000000000..bfddb4e8e --- /dev/null +++ b/sdk/lib/test/util.getNetworkInterface.test.ts @@ -0,0 +1,20 @@ +import { getHostname } from "../util/getNetworkInterface" + +describe("getHostname ", () => { + const inputToExpected = [ + ["http://localhost:3000", "localhost"], + ["http://localhost", "localhost"], + ["localhost", "localhost"], + ["http://127.0.0.1/", "127.0.0.1"], + ["http://127.0.0.1/testing/1234?314345", "127.0.0.1"], + ["127.0.0.1/", "127.0.0.1"], + ["http://mail.google.com/", "mail.google.com"], + ["mail.google.com/", "mail.google.com"], + ] + + for (const [input, expectValue] of inputToExpected) { + test(`should return ${expectValue} for ${input}`, () => { + expect(getHostname(input)).toEqual(expectValue) + }) + } +}) diff --git a/sdk/lib/test/utils.splitCommand.test.ts b/sdk/lib/test/utils.splitCommand.test.ts new file mode 100644 index 000000000..71f214c07 --- /dev/null +++ b/sdk/lib/test/utils.splitCommand.test.ts @@ -0,0 +1,42 @@ +import { getHostname } from "../util/getNetworkInterface" +import { splitCommand } from "../util/splitCommand" + +describe("splitCommand ", () => { + const inputToExpected = [ + ["cat", ["cat"]], + [["cat"], ["cat"]], + [ + ["cat", "hello all my homies"], + ["cat", "hello all my homies"], + ], + ["cat hello world", ["cat", "hello", "world"]], + ["cat hello 'big world'", ["cat", "hello", "big world"]], + [`cat hello "big world"`, ["cat", "hello", "big world"]], + [ + `cat hello "big world's are the greatest"`, + ["cat", "hello", "big world's are the greatest"], + ], + // Too many spaces + ["cat ", ["cat"]], + [["cat "], ["cat "]], + [ + ["cat ", "hello all my homies "], + ["cat ", "hello all my homies "], + ], + ["cat hello world ", ["cat", "hello", "world"]], + [ + " cat hello 'big world' ", + ["cat", "hello", "big world"], + ], + [ + ` cat hello "big world" `, + ["cat", "hello", "big world"], + ], + ] + + for (const [input, expectValue] of inputToExpected) { + test(`should return ${expectValue} for ${input}`, () => { + expect(splitCommand(input as any)).toEqual(expectValue) + }) + } +}) diff --git a/sdk/lib/trigger/TriggerInput.ts b/sdk/lib/trigger/TriggerInput.ts new file mode 100644 index 000000000..9a52d8ca5 --- /dev/null +++ b/sdk/lib/trigger/TriggerInput.ts @@ -0,0 +1,6 @@ +import { HealthStatus } from "../types" + +export type TriggerInput = { + lastResult?: HealthStatus + hadSuccess?: boolean +} diff --git a/sdk/lib/trigger/changeOnFirstSuccess.ts b/sdk/lib/trigger/changeOnFirstSuccess.ts new file mode 100644 index 000000000..28129e3e5 --- /dev/null +++ b/sdk/lib/trigger/changeOnFirstSuccess.ts @@ -0,0 +1,30 @@ +import { Trigger } from "./index" + +export function changeOnFirstSuccess(o: { + beforeFirstSuccess: Trigger + afterFirstSuccess: Trigger +}): Trigger { + return async function* (getInput) { + const beforeFirstSuccess = o.beforeFirstSuccess(getInput) + yield + let currentValue = getInput() + beforeFirstSuccess.next() + for ( + let res = await beforeFirstSuccess.next(); + currentValue?.lastResult !== "passing" && !res.done; + res = await beforeFirstSuccess.next() + ) { + yield + currentValue = getInput() + } + const afterFirstSuccess = o.afterFirstSuccess(getInput) + for ( + let res = await afterFirstSuccess.next(); + !res.done; + res = await afterFirstSuccess.next() + ) { + yield + currentValue = getInput() + } + } +} diff --git a/sdk/lib/trigger/cooldownTrigger.ts b/sdk/lib/trigger/cooldownTrigger.ts new file mode 100644 index 000000000..991e81054 --- /dev/null +++ b/sdk/lib/trigger/cooldownTrigger.ts @@ -0,0 +1,8 @@ +export function cooldownTrigger(timeMs: number) { + return async function* () { + while (true) { + await new Promise((resolve) => setTimeout(resolve, timeMs)) + yield + } + } +} diff --git a/sdk/lib/trigger/defaultTrigger.ts b/sdk/lib/trigger/defaultTrigger.ts new file mode 100644 index 000000000..bd52dc7cc --- /dev/null +++ b/sdk/lib/trigger/defaultTrigger.ts @@ -0,0 +1,8 @@ +import { cooldownTrigger } from "./cooldownTrigger" +import { changeOnFirstSuccess } from "./changeOnFirstSuccess" +import { successFailure } from "./successFailure" + +export const defaultTrigger = successFailure({ + duringSuccess: cooldownTrigger(0), + duringError: cooldownTrigger(30000), +}) diff --git a/sdk/lib/trigger/index.ts b/sdk/lib/trigger/index.ts new file mode 100644 index 000000000..6da034262 --- /dev/null +++ b/sdk/lib/trigger/index.ts @@ -0,0 +1,7 @@ +import { TriggerInput } from "./TriggerInput" +export { changeOnFirstSuccess } from "./changeOnFirstSuccess" +export { cooldownTrigger } from "./cooldownTrigger" + +export type Trigger = ( + getInput: () => TriggerInput, +) => AsyncIterator diff --git a/sdk/lib/trigger/successFailure.ts b/sdk/lib/trigger/successFailure.ts new file mode 100644 index 000000000..1886402c4 --- /dev/null +++ b/sdk/lib/trigger/successFailure.ts @@ -0,0 +1,32 @@ +import { Trigger } from "." + +export function successFailure(o: { + duringSuccess: Trigger + duringError: Trigger +}): Trigger { + return async function* (getInput) { + while (true) { + const beforeSuccess = o.duringSuccess(getInput) + yield + let currentValue = getInput() + beforeSuccess.next() + for ( + let res = await beforeSuccess.next(); + currentValue?.lastResult !== "passing" && !res.done; + res = await beforeSuccess.next() + ) { + yield + currentValue = getInput() + } + const duringError = o.duringError(getInput) + for ( + let res = await duringError.next(); + currentValue?.lastResult === "passing" && !res.done; + res = await duringError.next() + ) { + yield + currentValue = getInput() + } + } + } +} diff --git a/sdk/lib/types.ts b/sdk/lib/types.ts new file mode 100644 index 000000000..657c09c3d --- /dev/null +++ b/sdk/lib/types.ts @@ -0,0 +1,526 @@ +export * as configTypes from "./config/configTypes" +import { InputSpec } from "./config/configTypes" +import { DependenciesReceipt } from "./config/setupConfig" +import { PortOptions } from "./interfaces/Host" +import { Daemons } from "./mainFn/Daemons" +import { Overlay } from "./util/Overlay" +import { UrlString } from "./util/getNetworkInterface" +import { NetworkInterfaceType, Signals } from "./util/utils" + +export type ExportedAction = (options: { + effects: Effects + input?: Record +}) => Promise +export type MaybePromise = A | Promise +export namespace ExpectedExports { + version: 1 + /** Set configuration is called after we have modified and saved the configuration in the start9 ui. Use this to make a file for the docker to read from for configuration. */ + export type setConfig = (options: { + effects: Effects + input: Record + }) => Promise + /** Get configuration returns a shape that describes the format that the start9 ui will generate, and later send to the set config */ + export type getConfig = (options: { effects: Effects }) => Promise + // /** These are how we make sure the our dependency configurations are valid and if not how to fix them. */ + // export type dependencies = Dependencies; + /** For backing up service data though the startOS UI */ + export type createBackup = (options: { effects: Effects }) => Promise + /** For restoring service data that was previously backed up using the startOS UI create backup flow. Backup restores are also triggered via the startOS UI, or doing a system restore flow during setup. */ + export type restoreBackup = (options: { + effects: Effects + }) => Promise + + // /** Health checks are used to determine if the service is working properly after starting + // * A good use case is if we are using a web server, seeing if we can get to the web server. + // */ + // export type health = { + // /** Should be the health check id */ + // [id: string]: (options: { effects: Effects; input: TimeMs }) => Promise; + // }; + + /** + * Actions are used so we can effect the service, like deleting a directory. + * One old use case is to add a action where we add a file, that will then be run during the + * service starting, and that file would indicate that it would rescan all the data. + */ + export type actions = (options: { effects: Effects }) => MaybePromise<{ + [id: string]: { + run: ExportedAction + getConfig: (options: { effects: Effects }) => Promise + } + }> + + export type actionsMetadata = (options: { + effects: Effects + }) => Promise> + + /** + * This is the entrypoint for the main container. Used to start up something like the service that the + * package represents, like running a bitcoind in a bitcoind-wrapper. + */ + export type main = (options: { + effects: Effects + started(onTerm: () => PromiseLike): PromiseLike + }) => Promise> + + /** + * After a shutdown, if we wanted to do any operations to clean up things, like + * set the action as unavailable or something. + */ + export type afterShutdown = (options: { + effects: Effects + }) => Promise + + /** + * Every time a package completes an install, this function is called before the main. + * Can be used to do migration like things. + */ + export type init = (options: { + effects: Effects + previousVersion: null | string + }) => Promise + /** This will be ran during any time a package is uninstalled, for example during a update + * this will be called. + */ + export type uninit = (options: { + effects: Effects + nextVersion: null | string + }) => Promise + + /** Auto configure is used to make sure that other dependencies have the values t + * that this service could use. + */ + export type dependencyConfig = Record +} +export type TimeMs = number +export type VersionString = string + +/** + * AutoConfigure is used as the value to the key of package id, + * this is used to make sure that other dependencies have the values that this service could use. + */ +export type DependencyConfig = { + /** During autoconfigure, we have access to effects and local data. We are going to figure out all the data that we need and send it to update. For the sdk it is the desired delta */ + query(options: { effects: Effects; localConfig: unknown }): Promise + /** This is the second part. Given the query results off the previous function, we will determine what to change the remote config to. In our sdk normall we are going to use the previous as a deep merge. */ + update(options: { + queryResults: unknown + remoteConfig: unknown + }): Promise +} + +export type ValidIfNoStupidEscape = A extends + | `${string}'"'"'${string}` + | `${string}\\"${string}` + ? never + : "" extends A & "" + ? never + : A + +export type ConfigRes = { + /** This should be the previous config, that way during set config we start with the previous */ + config?: null | Record + /** Shape that is describing the form in the ui */ + spec: InputSpec +} + +declare const DaemonProof: unique symbol +export type DaemonReceipt = { + [DaemonProof]: never +} +export type Daemon = { + wait(): Promise + term(): Promise + [DaemonProof]: never +} + +export type HealthStatus = "passing" | "warning" | "failing" | "disabled" + +export type SmtpValue = { + server: string + port: number + from: string + login: string + password: string | null | undefined +} + +export type CommandType = + | ValidIfNoStupidEscape + | [string, ...string[]] + +export type DaemonReturned = { + wait(): Promise + term(options?: { signal?: Signals; timeout?: number }): Promise +} + +export type ActionMetadata = { + name: string + description: string + id: string + input: InputSpec + allowedStatuses: "only-running" | "only-stopped" | "any" | "disabled" + /** + * So the ordering of the actions is by alphabetical order of the group, then followed by the alphabetical of the actions + */ + group?: string +} +export declare const hostName: unique symbol +export type HostName = string & { [hostName]: never } +/** ${scheme}://${username}@${host}:${externalPort}${suffix} */ +export type Address = { + username: string | null + hostId: string + options: PortOptions + suffix: string +} + +export type InterfaceId = string + +export type NetworkInterface = { + interfaceId: InterfaceId + /** The title of this field to be displayed */ + name: string + /** Human readable description, used as tooltip usually */ + description: string + /** Whether or not one address must be the primary address */ + hasPrimary: boolean + /** Disabled interfaces do not serve, but they retain their metadata and addresses */ + disabled: boolean + /** All URIs */ + addresses: Address[] + + /** The netowrk interface could be serveral types, something like ui, p2p, or network */ + type: NetworkInterfaceType +} +// prettier-ignore +export type ExposeAllServicePaths = + Store extends Record ? {[K in keyof Store & string]: ExposeAllServicePaths}[keyof Store & string] : + PreviousPath +// prettier-ignore +export type ExposeAllUiPaths = + Store extends Record ? {[K in keyof Store & string]: ExposeAllUiPaths}[keyof Store & string] : + Store extends string ? PreviousPath : + never +export type ExposeServicePaths = Array<{ + /** The path to the value in the Store. [JsonPath](https://jsonpath.com/) */ + path: ExposeAllServicePaths +}> + +export type ExposeUiPaths = Array<{ + /** The path to the value in the Store. [JsonPath](https://jsonpath.com/) */ + path: ExposeAllUiPaths + /** A human readable title for the value */ + title: string + /** A human readable description or explanation of the value */ + description?: string + /** (string/number only) Whether or not to mask the value, for example, when displaying a password */ + masked?: boolean + /** (string/number only) Whether or not to include a button for copying the value to clipboard */ + copyable?: boolean + /** (string/number only) Whether or not to include a button for displaying the value as a QR code */ + qr?: boolean +}> +/** Used to reach out from the pure js runtime */ +export type Effects = { + executeAction(opts: { + serviceId?: string + input: Input + }): Promise + + /** A low level api used by makeOverlay */ + createOverlayedImage(options: { imageId: string }): Promise + + /** Removes all network bindings */ + clearBindings(): Promise + /** Creates a host connected to the specified port with the provided options */ + bind( + options: { + kind: "static" | "single" | "multi" + id: string + internalPort: number + } & PortOptions, + ): Promise + /** Retrieves the current hostname(s) associated with a host id */ + getHostnames(options: { + kind: "static" | "single" + hostId: string + packageId?: string + callback: () => void + }): Promise<[HostName]> + getHostnames(options: { + kind?: "multi" + packageId?: string + hostId: string + callback: () => void + }): Promise<[HostName, ...HostName[]]> + + // /** + // * Run rsync between two volumes. This is used to backup data between volumes. + // * This is a long running process, and a structure that we can either wait for, or get the progress of. + // */ + // runRsync(options: { + // srcVolume: string + // dstVolume: string + // srcPath: string + // dstPath: string + // // rsync options: https://linux.die.net/man/1/rsync + // options: BackupOptions + // }): { + // id: () => Promise + // wait: () => Promise + // progress: () => Promise + // } + + store: { + /** Get a value in a json like data, can be observed and subscribed */ + get(options: { + /** If there is no packageId it is assumed the current package */ + packageId?: string + /** The path defaults to root level, using the [JsonPath](https://jsonpath.com/) */ + path: Path & EnsureStorePath + callback: (config: unknown, previousConfig: unknown) => void + }): Promise> + /** Used to store values that can be accessed and subscribed to */ + set(options: { + /** Sets the value for the wrapper at the path, it will override, using the [JsonPath](https://jsonpath.com/) */ + path: Path & EnsureStorePath + value: ExtractStore + }): Promise + } + + getSystemSmtp(input: { + callback: (config: unknown, previousConfig: unknown) => void + }): Promise + + getLocalHostname(): Promise + getIPHostname(): Promise + /** Get the address for another service for tor interfaces */ + getServiceTorHostname( + interfaceId: InterfaceId, + packageId?: string, + ): Promise + /** Get the IP address of the container */ + getContainerIp(): Promise + /** + * Get the port address for another service + */ + getServicePortForward( + internalPort: number, + packageId?: string, + ): Promise + + /** Removes all network interfaces */ + clearNetworkInterfaces(): Promise + /** When we want to create a link in the front end interfaces, and example is + * exposing a url to view a web service + */ + exportNetworkInterface(options: NetworkInterface): Promise + + exposeForDependents( + options: ExposeServicePaths, + ): Promise + + exposeUi(options: ExposeUiPaths): Promise + /** + * There are times that we want to see the addresses that where exported + * @param options.addressId If we want to filter the address id + * + * Note: any auth should be filtered out already + */ + getInterface(options: { + packageId?: PackageId + interfaceId: InterfaceId + callback: () => void + }): Promise + + /** + * The user sets the primary url for a interface + * @param options + */ + getPrimaryUrl(options: { + packageId?: PackageId + interfaceId: InterfaceId + callback: () => void + }): Promise + + /** + * There are times that we want to see the addresses that where exported + * @param options.addressId If we want to filter the address id + * + * Note: any auth should be filtered out already + */ + listInterface(options: { + packageId?: PackageId + callback: () => void + }): Promise + + /** + *Remove an address that was exported. Used problably during main or during setConfig. + * @param options + */ + removeAddress(options: { id: string }): Promise + + /** + * + * @param options + */ + exportAction(options: ActionMetadata): Promise + /** + * Remove an action that was exported. Used problably during main or during setConfig. + */ + removeAction(options: { id: string }): Promise + + getConfigured(): Promise + /** + * This called after a valid set config as well as during init. + * @param configured + */ + setConfigured(configured: boolean): Promise + + /** + * + * @returns PEM encoded fullchain (ecdsa) + */ + getSslCertificate: ( + packageId?: string, + algorithm?: "ecdsa" | "ed25519", + ) => Promise<[string, string, string]> + /** + * @returns PEM encoded ssl key (ecdsa) + */ + getSslKey: ( + packageId?: string, + algorithm?: "ecdsa" | "ed25519", + ) => Promise + + setHealth(o: { + name: string + status: HealthStatus + message?: string + }): Promise + + /** Set the dependencies of what the service needs, usually ran during the set config as a best practice */ + setDependencies(dependencies: Dependencies): Promise + /** Exists could be useful during the runtime to know if some service exists, option dep */ + exists(packageId: PackageId): Promise + /** Exists could be useful during the runtime to know if some service is running, option dep */ + running(packageId: PackageId): Promise + + /** Instead of creating proxies with nginx, we have a utility to create and maintain a proxy in the lifetime of this running. */ + reverseProxy(options: { + bind: { + /** Optional, default is 0.0.0.0 */ + ip?: string + port: number + ssl: boolean + } + dst: { + /** Optional: default is 127.0.0.1 */ + ip?: string // optional, default 127.0.0.1 + port: number + ssl: boolean + } + http?: { + // optional, will do TCP layer proxy only if not present + headers?: (headers: Record) => Record + } + }): Promise<{ stop(): Promise }> + restart(): void + shutdown(): void + + mount(options: { + location: string + target: { + packageId: string + volumeId: string + path: string + readonly: boolean + } + }): Promise + + stopped(packageId?: string): Promise +} + +// prettier-ignore +export type ExtractStore = + Path extends `/${infer A }/${infer Rest }` ? (A extends keyof Store ? ExtractStore : never) : + Path extends `/${infer A }` ? (A extends keyof Store ? Store[A] : never) : + Path extends '' ? Store : + never + +// prettier-ignore +type _EnsureStorePath = + Path extends`/${infer A }/${infer Rest}` ? (Store extends {[K in A & string]: infer NextStore} ? _EnsureStorePath : never) : + Path extends `/${infer A }` ? (Store extends {[K in A]: infer B} ? Origin : never) : + Path extends '' ? Origin : + never +// prettier-ignore +export type EnsureStorePath = _EnsureStorePath + +/** rsync options: https://linux.die.net/man/1/rsync + */ +export type BackupOptions = { + delete: boolean + force: boolean + ignoreExisting: boolean + exclude: string[] +} +/** + * This is the metadata that is returned from the metadata call. + */ +export type Metadata = { + fileType: string + isDir: boolean + isFile: boolean + isSymlink: boolean + len: number + modified?: Date + accessed?: Date + created?: Date + readonly: boolean + uid: number + gid: number + mode: number +} + +export type MigrationRes = { + configured: boolean +} + +export type ActionResult = { + message: string + value: null | { + value: string + copyable: boolean + qr: boolean + } +} +export type SetResult = { + /** These are the unix process signals */ + signal: Signals + "depends-on": DependsOn +} + +export type PackageId = string +export type Message = string +export type DependencyKind = "running" | "exists" + +export type DependsOn = { + [packageId: string]: string[] +} + +export type KnownError = + | { error: string } + | { + "error-code": [number, string] | readonly [number, string] + } + +export type Dependency = { + id: PackageId + kind: DependencyKind +} +export type Dependencies = Array + +export type DeepPartial = T extends {} + ? { [P in keyof T]?: DeepPartial } + : T diff --git a/sdk/lib/util/GetSystemSmtp.ts b/sdk/lib/util/GetSystemSmtp.ts new file mode 100644 index 000000000..1853afd78 --- /dev/null +++ b/sdk/lib/util/GetSystemSmtp.ts @@ -0,0 +1,37 @@ +import { Effects } from "../types" + +export class GetSystemSmtp { + constructor(readonly effects: Effects) {} + + /** + * Returns the system SMTP credentials. Restarts the service if the credentials change + */ + const() { + return this.effects.getSystemSmtp({ + callback: this.effects.restart, + }) + } + /** + * Returns the system SMTP credentials. Does nothing if the credentials change + */ + once() { + return this.effects.getSystemSmtp({ + callback: () => {}, + }) + } + /** + * Watches the system SMTP credentials. Takes a custom callback function to run whenever the credentials change + */ + async *watch() { + while (true) { + let callback: () => void + const waitForNext = new Promise((resolve) => { + callback = resolve + }) + yield await this.effects.getSystemSmtp({ + callback: () => callback(), + }) + await waitForNext + } + } +} diff --git a/sdk/lib/util/Overlay.ts b/sdk/lib/util/Overlay.ts new file mode 100644 index 000000000..5f928289d --- /dev/null +++ b/sdk/lib/util/Overlay.ts @@ -0,0 +1,154 @@ +import * as fs from "fs/promises" +import * as T from "../types" +import * as cp from "child_process" +import { promisify } from "util" +import { Buffer } from "node:buffer" +export const execFile = promisify(cp.execFile) +const WORKDIR = (imageId: string) => `/media/startos/images/${imageId}/` +export class Overlay { + private constructor( + readonly effects: T.Effects, + readonly imageId: string, + readonly rootfs: string, + ) {} + static async of(effects: T.Effects, imageId: string) { + const rootfs = await effects.createOverlayedImage({ imageId }) + + for (const dirPart of ["dev", "sys", "proc", "run"] as const) { + await fs.mkdir(`${rootfs}/${dirPart}`, { recursive: true }) + await execFile("mount", [ + "--rbind", + `/${dirPart}`, + `${rootfs}/${dirPart}`, + ]) + } + + return new Overlay(effects, imageId, rootfs) + } + + async mount(options: MountOptions, path: string): Promise { + path = path.startsWith("/") + ? `${this.rootfs}${path}` + : `${this.rootfs}/${path}` + if (options.type === "volume") { + await execFile("mount", [ + "--bind", + `/media/startos/volumes/${options.id}`, + path, + ]) + } else if (options.type === "assets") { + await execFile("mount", [ + "--bind", + `/media/startos/assets/${options.id}`, + path, + ]) + } else if (options.type === "pointer") { + await this.effects.mount({ location: path, target: options }) + } else { + throw new Error(`unknown type ${(options as any).type}`) + } + return this + } + + async destroy() { + await execFile("umount", ["-R", this.rootfs]) + await fs.rm(this.rootfs, { recursive: true, force: true }) + } + + async exec( + command: string[], + options?: CommandOptions, + ): Promise<{ stdout: string | Buffer; stderr: string | Buffer }> { + const imageMeta = await fs + .readFile(`/media/startos/images/${this.imageId}.json`, { + encoding: "utf8", + }) + .catch(() => "{}") + .then(JSON.parse) + let extra: string[] = [] + if (options?.user) { + extra.push(`--user=${options.user}`) + delete options.user + } + let workdir = imageMeta.workdir || "/" + if (options?.cwd) { + workdir = options.cwd + delete options.cwd + } + return await execFile( + "start-cli", + [ + "chroot", + `--env=/media/startos/images/${this.imageId}.env`, + `--workdir=${workdir}`, + ...extra, + this.rootfs, + ...command, + ], + options, + ) + } + + async spawn( + command: string[], + options?: CommandOptions, + ): Promise { + const imageMeta = await fs + .readFile(`/media/startos/images/${this.imageId}.json`, { + encoding: "utf8", + }) + .catch(() => "{}") + .then(JSON.parse) + let extra: string[] = [] + if (options?.user) { + extra.push(`--user=${options.user}`) + delete options.user + } + let workdir = imageMeta.workdir || "/" + if (options?.cwd) { + workdir = options.cwd + delete options.cwd + } + return cp.spawn( + "start-cli", + [ + "chroot", + `--env=/media/startos/images/${this.imageId}.env`, + `--workdir=${workdir}`, + ...extra, + this.rootfs, + ...command, + ], + options, + ) + } +} + +export type CommandOptions = { + env?: { [variable: string]: string } + cwd?: string + user?: string +} + +export type MountOptions = + | MountOptionsVolume + | MountOptionsAssets + | MountOptionsPointer + +export type MountOptionsVolume = { + type: "volume" + id: string +} + +export type MountOptionsAssets = { + type: "assets" + id: string +} + +export type MountOptionsPointer = { + type: "pointer" + packageId: string + volumeId: string + path: string + readonly: boolean +} diff --git a/sdk/lib/util/deepEqual.ts b/sdk/lib/util/deepEqual.ts new file mode 100644 index 000000000..8e6ba4b65 --- /dev/null +++ b/sdk/lib/util/deepEqual.ts @@ -0,0 +1,19 @@ +import { object } from "ts-matches" + +export function deepEqual(...args: unknown[]) { + if (!object.test(args[args.length - 1])) return args[args.length - 1] + const objects = args.filter(object.test) + if (objects.length === 0) { + for (const x of args) if (x !== args[0]) return false + return true + } + if (objects.length !== args.length) return false + const allKeys = new Set(objects.flatMap((x) => Object.keys(x))) + for (const key of allKeys) { + for (const x of objects) { + if (!(key in x)) return false + if (!deepEqual((objects[0] as any)[key], (x as any)[key])) return false + } + } + return true +} diff --git a/sdk/lib/util/deepMerge.ts b/sdk/lib/util/deepMerge.ts new file mode 100644 index 000000000..ae68c242f --- /dev/null +++ b/sdk/lib/util/deepMerge.ts @@ -0,0 +1,17 @@ +import { object } from "ts-matches" + +export function deepMerge(...args: unknown[]): unknown { + const lastItem = (args as any)[args.length - 1] + if (!object.test(lastItem)) return lastItem + const objects = args.filter(object.test).filter((x) => !Array.isArray(x)) + if (objects.length === 0) return lastItem as any + if (objects.length === 1) objects.unshift({}) + const allKeys = new Set(objects.flatMap((x) => Object.keys(x))) + for (const key of allKeys) { + const filteredValues = objects.flatMap((x) => + key in x ? [(x as any)[key]] : [], + ) + ;(objects as any)[0][key] = deepMerge(...filteredValues) + } + return objects[0] as any +} diff --git a/sdk/lib/util/fileHelper.ts b/sdk/lib/util/fileHelper.ts new file mode 100644 index 000000000..56706f95a --- /dev/null +++ b/sdk/lib/util/fileHelper.ts @@ -0,0 +1,147 @@ +import * as matches from "ts-matches" +import * as YAML from "yaml" +import * as TOML from "@iarna/toml" +import * as T from "../types" +import * as fs from "fs" + +const previousPath = /(.+?)\/([^/]*)$/ + +/** + * Used in the get config and the set config exported functions. + * The idea is that we are going to be reading/ writing to a file, or multiple files. And then we use this tool + * to keep the same path on the read and write, and have methods for helping with structured data. + * And if we are not using a structured data, we can use the raw method which forces the construction of a BiMap + * ```ts + import {InputSpec} from './InputSpec.ts' + import {matches, T} from '../deps.ts'; + const { object, string, number, boolean, arrayOf, array, anyOf, allOf } = matches + const someValidator = object({ + data: string + }) + const jsonFile = FileHelper.json({ + path: 'data.json', + validator: someValidator, + volume: 'main' + }) + const tomlFile = FileHelper.toml({ + path: 'data.toml', + validator: someValidator, + volume: 'main' + }) + const rawFile = FileHelper.raw({ + path: 'data.amazingSettings', + volume: 'main' + fromData(dataIn: Data): string { + return `myDatais ///- ${dataIn.data}` + }, + toData(rawData: string): Data { + const [,data] = /myDatais \/\/\/- (.*)/.match(rawData) + return {data} + } + }) + + export const setConfig : T.ExpectedExports.setConfig= async (effects, config) => { + await jsonFile.write({ data: 'here lies data'}, effects) + } + + export const getConfig: T.ExpectedExports.getConfig = async (effects, config) => ({ + spec: InputSpec, + config: nullIfEmpty({ + ...jsonFile.get(effects) + }) + ``` + */ +export class FileHelper { + protected constructor( + readonly path: string, + readonly writeData: (dataIn: A) => string, + readonly readData: (stringValue: string) => A, + ) {} + async write(data: A, effects: T.Effects) { + if (previousPath.exec(this.path)) { + await new Promise((resolve, reject) => + fs.mkdir(this.path, (err: any) => (!err ? resolve(null) : reject(err))), + ) + } + + await new Promise((resolve, reject) => + fs.writeFile(this.path, this.writeData(data), (err: any) => + !err ? resolve(null) : reject(err), + ), + ) + } + async read(effects: T.Effects) { + if (!fs.existsSync(this.path)) { + return null + } + return this.readData( + await new Promise((resolve, reject) => + fs.readFile(this.path, (err: any, data: any) => + !err ? resolve(data.toString("utf-8")) : reject(err), + ), + ), + ) + } + /** + * Create a File Helper for an arbitrary file type. + * + * Provide custom functions for translating data to the file format and visa versa. + */ + static raw( + path: string, + toFile: (dataIn: A) => string, + fromFile: (rawData: string) => A, + ) { + return new FileHelper(path, toFile, fromFile) + } + /** + * Create a File Helper for a .json file + */ + static json(path: string, shape: matches.Validator) { + return new FileHelper( + path, + (inData) => { + return JSON.stringify(inData, null, 2) + }, + (inString) => { + return shape.unsafeCast(JSON.parse(inString)) + }, + ) + } + /** + * Create a File Helper for a .toml file + */ + static toml>( + path: string, + shape: matches.Validator, + ) { + return new FileHelper( + path, + (inData) => { + return TOML.stringify(inData as any) + }, + (inString) => { + return shape.unsafeCast(TOML.parse(inString)) + }, + ) + } + /** + * Create a File Helper for a .yaml file + */ + static yaml>( + path: string, + shape: matches.Validator, + ) { + return new FileHelper( + path, + (inData) => { + return JSON.stringify(inData, null, 2) + }, + (inString) => { + return shape.unsafeCast(YAML.parse(inString)) + }, + ) + } +} + +export default FileHelper diff --git a/sdk/lib/util/getDefaultString.ts b/sdk/lib/util/getDefaultString.ts new file mode 100644 index 000000000..fa35b4e66 --- /dev/null +++ b/sdk/lib/util/getDefaultString.ts @@ -0,0 +1,10 @@ +import { DefaultString } from "../config/configTypes" +import { getRandomString } from "./getRandomString" + +export function getDefaultString(defaultSpec: DefaultString): string { + if (typeof defaultSpec === "string") { + return defaultSpec + } else { + return getRandomString(defaultSpec) + } +} diff --git a/sdk/lib/util/getNetworkInterface.ts b/sdk/lib/util/getNetworkInterface.ts new file mode 100644 index 000000000..91c401429 --- /dev/null +++ b/sdk/lib/util/getNetworkInterface.ts @@ -0,0 +1,313 @@ +import { Address, Effects, HostName, NetworkInterface } from "../types" +import * as regexes from "./regexes" +import { NetworkInterfaceType } from "./utils" + +export type UrlString = string +export type HostId = string + +const getHostnameRegex = /^(\w+:\/\/)?([^\/\:]+)(:\d{1,3})?(\/)?/ +export const getHostname = (url: string): HostName | null => { + const founds = url.match(getHostnameRegex)?.[2] + if (!founds) return null + const parts = founds.split("@") + const last = parts[parts.length - 1] as HostName | null + return last +} + +export type Filled = { + hostnames: HostName[] + onionHostnames: HostName[] + localHostnames: HostName[] + ipHostnames: HostName[] + ipv4Hostnames: HostName[] + ipv6Hostnames: HostName[] + nonIpHostnames: HostName[] + allHostnames: HostName[] + + urls: UrlString[] + onionUrls: UrlString[] + localUrls: UrlString[] + ipUrls: UrlString[] + ipv4Urls: UrlString[] + ipv6Urls: UrlString[] + nonIpUrls: UrlString[] + allUrls: UrlString[] +} +export type FilledAddress = Address & Filled +export type NetworkInterfaceFilled = { + interfaceId: string + /** The title of this field to be displayed */ + name: string + /** Human readable description, used as tooltip usually */ + description: string + /** Whether or not the interface has a primary URL */ + hasPrimary: boolean + /** Whether or not the interface disabled */ + disabled: boolean + /** All URIs */ + addresses: FilledAddress[] + + /** Indicates if we are a ui/ p2p/ api/ other for the kind of interface that this is representing */ + type: NetworkInterfaceType + + primaryHostname: HostName | null + primaryUrl: UrlString | null +} & Filled +const either = + (...args: ((a: A) => boolean)[]) => + (a: A) => + args.some((x) => x(a)) +const negate = + (fn: (a: A) => boolean) => + (a: A) => + !fn(a) +const unique = (values: A[]) => Array.from(new Set(values)) +const addressHostToUrl = ( + { options, username, suffix }: Address, + host: HostName, +): UrlString => { + const scheme = host.endsWith(".onion") + ? options.scheme + : options.addSsl + ? options.addSsl.scheme + : options.scheme // TODO: encode whether hostname transport is "secure"? + return `${scheme ? `${scheme}//` : ""}${ + username ? `${username}@` : "" + }${host}${suffix}` +} +export const filledAddress = ( + mapHostnames: { + [hostId: string]: HostName[] + }, + address: Address, +): FilledAddress => { + const toUrl = addressHostToUrl.bind(null, address) + const hostnames = mapHostnames[address.hostId] ?? [] + return { + ...address, + hostnames, + get onionHostnames() { + return hostnames.filter(regexes.torHostname.test) + }, + get localHostnames() { + return hostnames.filter(regexes.localHostname.test) + }, + get ipHostnames() { + return hostnames.filter(either(regexes.ipv4.test, regexes.ipv6.test)) + }, + get ipv4Hostnames() { + return hostnames.filter(regexes.ipv4.test) + }, + get ipv6Hostnames() { + return hostnames.filter(regexes.ipv6.test) + }, + get nonIpHostnames() { + return hostnames.filter( + negate(either(regexes.ipv4.test, regexes.ipv6.test)), + ) + }, + allHostnames: hostnames, + get urls() { + return hostnames.map(toUrl) + }, + get onionUrls() { + return hostnames.filter(regexes.torHostname.test).map(toUrl) + }, + get localUrls() { + return hostnames.filter(regexes.localHostname.test).map(toUrl) + }, + get ipUrls() { + return hostnames + .filter(either(regexes.ipv4.test, regexes.ipv6.test)) + .map(toUrl) + }, + get ipv4Urls() { + return hostnames.filter(regexes.ipv4.test).map(toUrl) + }, + get ipv6Urls() { + return hostnames.filter(regexes.ipv6.test).map(toUrl) + }, + get nonIpUrls() { + return hostnames + .filter(negate(either(regexes.ipv4.test, regexes.ipv6.test))) + .map(toUrl) + }, + get allUrls() { + return hostnames.map(toUrl) + }, + } +} + +export const networkInterfaceFilled = ( + interfaceValue: NetworkInterface, + primaryUrl: UrlString | null, + addresses: FilledAddress[], +): NetworkInterfaceFilled => { + return { + ...interfaceValue, + addresses, + get hostnames() { + return unique(addresses.flatMap((x) => x.hostnames)) + }, + get onionHostnames() { + return unique(addresses.flatMap((x) => x.onionHostnames)) + }, + get localHostnames() { + return unique(addresses.flatMap((x) => x.localHostnames)) + }, + get ipHostnames() { + return unique(addresses.flatMap((x) => x.ipHostnames)) + }, + get ipv4Hostnames() { + return unique(addresses.flatMap((x) => x.ipv4Hostnames)) + }, + get ipv6Hostnames() { + return unique(addresses.flatMap((x) => x.ipv6Hostnames)) + }, + get nonIpHostnames() { + return unique(addresses.flatMap((x) => x.nonIpHostnames)) + }, + get allHostnames() { + return unique(addresses.flatMap((x) => x.allHostnames)) + }, + get primaryHostname() { + if (primaryUrl == null) return null + return getHostname(primaryUrl) + }, + get urls() { + return unique(addresses.flatMap((x) => x.urls)) + }, + get onionUrls() { + return unique(addresses.flatMap((x) => x.onionUrls)) + }, + get localUrls() { + return unique(addresses.flatMap((x) => x.localUrls)) + }, + get ipUrls() { + return unique(addresses.flatMap((x) => x.ipUrls)) + }, + get ipv4Urls() { + return unique(addresses.flatMap((x) => x.ipv4Urls)) + }, + get ipv6Urls() { + return unique(addresses.flatMap((x) => x.ipv6Urls)) + }, + get nonIpUrls() { + return unique(addresses.flatMap((x) => x.nonIpUrls)) + }, + get allUrls() { + return unique(addresses.flatMap((x) => x.allUrls)) + }, + primaryUrl, + } +} +const makeInterfaceFilled = async ({ + effects, + interfaceId, + packageId, + callback, +}: { + effects: Effects + interfaceId: string + packageId: string | undefined + callback: () => void +}) => { + const interfaceValue = await effects.getInterface({ + interfaceId, + packageId, + callback, + }) + const hostIdsRecord = Promise.all( + unique(interfaceValue.addresses.map((x) => x.hostId)).map( + async (hostId) => + [ + hostId, + await effects.getHostnames({ + packageId, + hostId, + callback, + }), + ] as const, + ), + ) + const primaryUrl = effects.getPrimaryUrl({ + interfaceId, + packageId, + callback, + }) + + const fillAddress = filledAddress.bind( + null, + Object.fromEntries(await hostIdsRecord), + ) + const interfaceFilled: NetworkInterfaceFilled = networkInterfaceFilled( + interfaceValue, + await primaryUrl, + interfaceValue.addresses.map(fillAddress), + ) + return interfaceFilled +} + +export class GetNetworkInterface { + constructor( + readonly effects: Effects, + readonly opts: { interfaceId: string; packageId?: string }, + ) {} + + /** + * Returns the value of Store at the provided path. Restart the service if the value changes + */ + async const() { + const { interfaceId, packageId } = this.opts + const callback = this.effects.restart + const interfaceFilled: NetworkInterfaceFilled = await makeInterfaceFilled({ + effects: this.effects, + interfaceId, + packageId, + callback, + }) + + return interfaceFilled + } + /** + * Returns the value of NetworkInterfacesFilled at the provided path. Does nothing if the value changes + */ + async once() { + const { interfaceId, packageId } = this.opts + const callback = () => {} + const interfaceFilled: NetworkInterfaceFilled = await makeInterfaceFilled({ + effects: this.effects, + interfaceId, + packageId, + callback, + }) + + return interfaceFilled + } + + /** + * Watches the value of NetworkInterfacesFilled at the provided path. Takes a custom callback function to run whenever the value changes + */ + async *watch() { + const { interfaceId, packageId } = this.opts + while (true) { + let callback: () => void = () => {} + const waitForNext = new Promise((resolve) => { + callback = resolve + }) + yield await makeInterfaceFilled({ + effects: this.effects, + interfaceId, + packageId, + callback, + }) + await waitForNext + } + } +} +export function getNetworkInterface( + effects: Effects, + opts: { interfaceId: string; packageId?: string }, +) { + return new GetNetworkInterface(effects, opts) +} diff --git a/sdk/lib/util/getNetworkInterfaces.ts b/sdk/lib/util/getNetworkInterfaces.ts new file mode 100644 index 000000000..625b761f5 --- /dev/null +++ b/sdk/lib/util/getNetworkInterfaces.ts @@ -0,0 +1,120 @@ +import { Effects, HostName } from "../types" +import { + HostId, + NetworkInterfaceFilled, + filledAddress, + networkInterfaceFilled, +} from "./getNetworkInterface" + +const makeManyInterfaceFilled = async ({ + effects, + packageId, + callback, +}: { + effects: Effects + packageId: string | undefined + callback: () => void +}) => { + const interfaceValues = await effects.listInterface({ + packageId, + callback, + }) + const hostIdsRecord = Object.fromEntries( + await Promise.all( + Array.from( + new Set( + interfaceValues.flatMap((x) => x.addresses).map((x) => x.hostId), + ), + ).map( + async (hostId) => + [ + hostId, + await effects.getHostnames({ + packageId, + hostId, + callback, + }), + ] as const, + ), + ), + ) + const fillAddress = filledAddress.bind(null, hostIdsRecord) + + const interfacesFilled: NetworkInterfaceFilled[] = await Promise.all( + interfaceValues.map(async (interfaceValue) => + networkInterfaceFilled( + interfaceValue, + await effects.getPrimaryUrl({ + interfaceId: interfaceValue.interfaceId, + packageId, + callback, + }), + interfaceValue.addresses.map(fillAddress), + ), + ), + ) + return interfacesFilled +} + +export class GetNetworkInterfaces { + constructor( + readonly effects: Effects, + readonly opts: { packageId?: string }, + ) {} + + /** + * Returns the value of Store at the provided path. Restart the service if the value changes + */ + async const() { + const { packageId } = this.opts + const callback = this.effects.restart + const interfaceFilled: NetworkInterfaceFilled[] = + await makeManyInterfaceFilled({ + effects: this.effects, + packageId, + callback, + }) + + return interfaceFilled + } + /** + * Returns the value of NetworkInterfacesFilled at the provided path. Does nothing if the value changes + */ + async once() { + const { packageId } = this.opts + const callback = () => {} + const interfaceFilled: NetworkInterfaceFilled[] = + await makeManyInterfaceFilled({ + effects: this.effects, + packageId, + callback, + }) + + return interfaceFilled + } + + /** + * Watches the value of NetworkInterfacesFilled at the provided path. Takes a custom callback function to run whenever the value changes + */ + async *watch() { + const { packageId } = this.opts + while (true) { + let callback: () => void = () => {} + const waitForNext = new Promise((resolve) => { + callback = resolve + }) + yield await makeManyInterfaceFilled({ + effects: this.effects, + packageId, + callback, + }) + await waitForNext + } + } +} +export function getNetworkInterfaces( + effects: Effects, + opts: { packageId?: string }, +) { + return new GetNetworkInterfaces(effects, opts) +} diff --git a/sdk/lib/util/getRandomCharInSet.ts b/sdk/lib/util/getRandomCharInSet.ts new file mode 100644 index 000000000..b26eef648 --- /dev/null +++ b/sdk/lib/util/getRandomCharInSet.ts @@ -0,0 +1,98 @@ +// a,g,h,A-Z,,,,- + +import * as crypto from "crypto" +export function getRandomCharInSet(charset: string): string { + const set = stringToCharSet(charset) + let charIdx = crypto.randomInt(0, set.len) + for (let range of set.ranges) { + if (range.len > charIdx) { + return String.fromCharCode(range.start.charCodeAt(0) + charIdx) + } + charIdx -= range.len + } + throw new Error("unreachable") +} +function stringToCharSet(charset: string): CharSet { + let set: CharSet = { ranges: [], len: 0 } + let start: string | null = null + let end: string | null = null + let in_range = false + for (let char of charset) { + switch (char) { + case ",": + if (start !== null && end !== null) { + if (start!.charCodeAt(0) > end!.charCodeAt(0)) { + throw new Error("start > end of charset") + } + const len = end.charCodeAt(0) - start.charCodeAt(0) + 1 + set.ranges.push({ + start, + end, + len, + }) + set.len += len + start = null + end = null + in_range = false + } else if (start !== null && !in_range) { + set.len += 1 + set.ranges.push({ start, end: start, len: 1 }) + start = null + } else if (start !== null && in_range) { + end = "," + } else if (start === null && end === null && !in_range) { + start = "," + } else { + throw new Error('unexpected ","') + } + break + case "-": + if (start === null) { + start = "-" + } else if (!in_range) { + in_range = true + } else if (in_range && end === null) { + end = "-" + } else { + throw new Error('unexpected "-"') + } + break + default: + if (start === null) { + start = char + } else if (in_range && end === null) { + end = char + } else { + throw new Error(`unexpected "${char}"`) + } + } + } + if (start !== null && end !== null) { + if (start!.charCodeAt(0) > end!.charCodeAt(0)) { + throw new Error("start > end of charset") + } + const len = end.charCodeAt(0) - start.charCodeAt(0) + 1 + set.ranges.push({ + start, + end, + len, + }) + set.len += len + } else if (start !== null) { + set.len += 1 + set.ranges.push({ + start, + end: start, + len: 1, + }) + } + return set +} +type CharSet = { + ranges: { + start: string + end: string + len: number + }[] + len: number +} diff --git a/sdk/lib/util/getRandomString.ts b/sdk/lib/util/getRandomString.ts new file mode 100644 index 000000000..ea0989bcd --- /dev/null +++ b/sdk/lib/util/getRandomString.ts @@ -0,0 +1,11 @@ +import { RandomString } from "../config/configTypes" +import { getRandomCharInSet } from "./getRandomCharInSet" + +export function getRandomString(generator: RandomString): string { + let s = "" + for (let i = 0; i < generator.len; i++) { + s = s + getRandomCharInSet(generator.charset) + } + + return s +} diff --git a/sdk/lib/util/index.ts b/sdk/lib/util/index.ts new file mode 100644 index 000000000..81bd88da6 --- /dev/null +++ b/sdk/lib/util/index.ts @@ -0,0 +1,36 @@ +import * as T from "../types" + +import "./nullIfEmpty" +import "./fileHelper" +import "../store/getStore" +import "./deepEqual" +import "./deepMerge" +import "./Overlay" +import "./once" +import * as utils from "./utils" +import { SDKManifest } from "../manifest/ManifestTypes" + +// prettier-ignore +export type FlattenIntersection = +T extends ArrayLike ? T : +T extends object ? {} & {[P in keyof T]: T[P]} : + T; + +export type _ = FlattenIntersection + +export const isKnownError = (e: unknown): e is T.KnownError => + e instanceof Object && ("error" in e || "error-code" in e) + +declare const affine: unique symbol + +export const createUtils = utils.createUtils +export const createMainUtils = ( + effects: T.Effects, +) => createUtils(effects) + +type NeverPossible = { [affine]: string } +export type NoAny = NeverPossible extends A + ? keyof NeverPossible extends keyof A + ? never + : A + : A diff --git a/sdk/lib/util/nullIfEmpty.ts b/sdk/lib/util/nullIfEmpty.ts new file mode 100644 index 000000000..337b9098f --- /dev/null +++ b/sdk/lib/util/nullIfEmpty.ts @@ -0,0 +1,12 @@ +/** + * A useful tool when doing a getConfig. + * Look into the config {@link FileHelper} for an example of the use. + * @param s + * @returns + */ +export default function nullIfEmpty>( + s: null | A, +) { + if (s === null) return null + return Object.keys(s).length === 0 ? null : s +} diff --git a/sdk/lib/util/once.ts b/sdk/lib/util/once.ts new file mode 100644 index 000000000..5f689b0e1 --- /dev/null +++ b/sdk/lib/util/once.ts @@ -0,0 +1,9 @@ +export function once(fn: () => B): () => B { + let result: [B] | [] = [] + return () => { + if (!result.length) { + result = [fn()] + } + return result[0] + } +} diff --git a/sdk/lib/util/patterns.ts b/sdk/lib/util/patterns.ts new file mode 100644 index 000000000..ac281b081 --- /dev/null +++ b/sdk/lib/util/patterns.ts @@ -0,0 +1,59 @@ +import { Pattern } from "../config/configTypes" +import * as regexes from "./regexes" + +export const ipv6: Pattern = { + regex: regexes.ipv6.toString(), + description: "Must be a valid IPv6 address", +} + +export const ipv4: Pattern = { + regex: regexes.ipv4.toString(), + description: "Must be a valid IPv4 address", +} + +export const hostname: Pattern = { + regex: regexes.hostname.toString(), + description: "Must be a valid hostname", +} + +export const localHostname: Pattern = { + regex: regexes.localHostname.toString(), + description: 'Must be a valid ".local" hostname', +} + +export const torHostname: Pattern = { + regex: regexes.torHostname.toString(), + description: 'Must be a valid Tor (".onion") hostname', +} + +export const url: Pattern = { + regex: regexes.url.toString(), + description: "Must be a valid URL", +} + +export const localUrl: Pattern = { + regex: regexes.localUrl.toString(), + description: 'Must be a valid ".local" URL', +} + +export const torUrl: Pattern = { + regex: regexes.torUrl.toString(), + description: 'Must be a valid Tor (".onion") URL', +} + +export const ascii: Pattern = { + regex: regexes.ascii.toString(), + description: + "May only contain ASCII characters. See https://www.w3schools.com/charsets/ref_html_ascii.asp", +} + +export const email: Pattern = { + regex: regexes.email.toString(), + description: "Must be a valid email address", +} + +export const base64: Pattern = { + regex: regexes.base64.toString(), + description: + "May only contain base64 characters. See https://base64.guru/learn/base64-characters", +} diff --git a/sdk/lib/util/regexes.ts b/sdk/lib/util/regexes.ts new file mode 100644 index 000000000..f26196381 --- /dev/null +++ b/sdk/lib/util/regexes.ts @@ -0,0 +1,34 @@ +// https://ihateregex.io/expr/ipv6/ +export const ipv6 = + /(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/ + +// https://ihateregex.io/expr/ipv4/ +export const ipv4 = + /(\b25[0-5]|\b2[0-4][0-9]|\b[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}/ + +export const hostname = + /^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/ + +export const localHostname = /[-a-zA-Z0-9@:%._\+~#=]{1,256}\.local/ + +export const torHostname = /[-a-zA-Z0-9@:%._\+~#=]{1,256}\.onion/ + +// https://ihateregex.io/expr/url/ +export const url = + /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()!@:%_\+.~#?&\/\/=]*)/ + +export const localUrl = + /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.local\b([-a-zA-Z0-9()!@:%_\+.~#?&\/\/=]*)/ + +export const torUrl = + /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.onion\b([-a-zA-Z0-9()!@:%_\+.~#?&\/\/=]*)/ + +// https://ihateregex.io/expr/ascii/ +export const ascii = /^[ -~]*$/ + +//https://ihateregex.io/expr/email/ +export const email = /[^@ \t\r\n]+@[^@ \t\r\n]+\.[^@ \t\r\n]+/ + +//https://rgxdb.com/r/1NUN74O6 +export const base64 = + /^(?:[a-zA-Z0-9+\/]{4})*(?:|(?:[a-zA-Z0-9+\/]{3}=)|(?:[a-zA-Z0-9+\/]{2}==)|(?:[a-zA-Z0-9+\/]{1}===))$/ diff --git a/sdk/lib/util/splitCommand.ts b/sdk/lib/util/splitCommand.ts new file mode 100644 index 000000000..bf55a74c3 --- /dev/null +++ b/sdk/lib/util/splitCommand.ts @@ -0,0 +1,17 @@ +import { arrayOf, string } from "ts-matches" +import { ValidIfNoStupidEscape } from "../types" + +export const splitCommand = ( + command: ValidIfNoStupidEscape | [string, ...string[]], +): string[] => { + if (arrayOf(string).test(command)) return command + return String(command) + .split('"') + .flatMap((x, i) => + i % 2 !== 0 + ? [x] + : x.split("'").flatMap((x, i) => (i % 2 !== 0 ? [x] : x.split(" "))), + ) + .map((x) => x.trim()) + .filter(Boolean) +} diff --git a/sdk/lib/util/stringFromStdErrOut.ts b/sdk/lib/util/stringFromStdErrOut.ts new file mode 100644 index 000000000..452aaa029 --- /dev/null +++ b/sdk/lib/util/stringFromStdErrOut.ts @@ -0,0 +1,6 @@ +export async function stringFromStdErrOut(x: { + stdout: string + stderr: string +}) { + return x?.stderr ? Promise.reject(x.stderr) : x.stdout +} diff --git a/sdk/lib/util/utils.ts b/sdk/lib/util/utils.ts new file mode 100644 index 000000000..532ff12a2 --- /dev/null +++ b/sdk/lib/util/utils.ts @@ -0,0 +1,293 @@ +import nullIfEmpty from "./nullIfEmpty" +import { + CheckResult, + checkPortListening, + checkWebUrl, +} from "../health/checkFns" +import { + DaemonReturned, + Effects, + EnsureStorePath, + ExtractStore, + InterfaceId, + PackageId, + ValidIfNoStupidEscape, +} from "../types" +import { GetSystemSmtp } from "./GetSystemSmtp" +import { DefaultString } from "../config/configTypes" +import { getDefaultString } from "./getDefaultString" +import { GetStore, getStore } from "../store/getStore" +import { + MountDependenciesOut, + mountDependencies, +} from "../dependency/mountDependencies" +import { + ManifestId, + VolumeName, + NamedPath, + Path, +} from "../dependency/setupDependencyMounts" +import { Host, MultiHost, SingleHost, StaticHost } from "../interfaces/Host" +import { NetworkInterfaceBuilder } from "../interfaces/NetworkInterfaceBuilder" +import { GetNetworkInterface, getNetworkInterface } from "./getNetworkInterface" +import { + GetNetworkInterfaces, + getNetworkInterfaces, +} from "./getNetworkInterfaces" +import * as CP from "node:child_process" +import { promisify } from "node:util" +import { splitCommand } from "./splitCommand" +import { SDKManifest } from "../manifest/ManifestTypes" +import { MountOptions, Overlay, CommandOptions } from "./Overlay" +export type Signals = NodeJS.Signals + +export const SIGTERM: Signals = "SIGTERM" +export const SIGKILL: Signals = "SIGTERM" +export const NO_TIMEOUT = -1 + +const childProcess = { + exec: promisify(CP.exec), + execFile: promisify(CP.execFile), +} + +export type NetworkInterfaceType = "ui" | "p2p" | "api" | "other" + +export type Utils< + Manifest extends SDKManifest, + Store, + WrapperOverWrite = { const: never }, +> = { + checkPortListening( + port: number, + options: { + errorMessage: string + successMessage: string + timeoutMessage?: string + timeout?: number + }, + ): Promise + checkWebUrl( + url: string, + options?: { + timeout?: number + successMessage?: string + errorMessage?: string + }, + ): Promise + childProcess: typeof childProcess + createInterface: (options: { + name: string + id: string + description: string + hasPrimary: boolean + disabled: boolean + type: NetworkInterfaceType + username: null | string + path: string + search: Record + }) => NetworkInterfaceBuilder + getSystemSmtp: () => GetSystemSmtp & WrapperOverWrite + host: { + static: (id: string) => StaticHost + single: (id: string) => SingleHost + multi: (id: string) => MultiHost + } + mountDependencies: < + In extends + | Record>> + | Record> + | Record + | Path, + >( + value: In, + ) => Promise> + networkInterface: { + getOwn: (interfaceId: InterfaceId) => GetNetworkInterface & WrapperOverWrite + get: (opts: { + interfaceId: InterfaceId + packageId: PackageId + }) => GetNetworkInterface & WrapperOverWrite + getAllOwn: () => GetNetworkInterfaces & WrapperOverWrite + getAll: (opts: { + packageId: PackageId + }) => GetNetworkInterfaces & WrapperOverWrite + } + nullIfEmpty: typeof nullIfEmpty + runCommand: ( + imageId: Manifest["images"][number], + command: ValidIfNoStupidEscape | [string, ...string[]], + options: CommandOptions & { + mounts?: { path: string; options: MountOptions }[] + }, + ) => Promise<{ stdout: string | Buffer; stderr: string | Buffer }> + runDaemon: ( + imageId: Manifest["images"][number], + command: ValidIfNoStupidEscape | [string, ...string[]], + options: CommandOptions & { + mounts?: { path: string; options: MountOptions }[] + overlay?: Overlay + }, + ) => Promise + store: { + get: ( + packageId: string, + path: EnsureStorePath, + ) => GetStore & WrapperOverWrite + getOwn: ( + path: EnsureStorePath, + ) => GetStore & WrapperOverWrite + setOwn: ( + path: EnsureStorePath, + value: ExtractStore, + ) => Promise + } +} +export const createUtils = < + Manifest extends SDKManifest, + Store = never, + WrapperOverWrite = { const: never }, +>( + effects: Effects, +): Utils => { + return { + createInterface: (options: { + name: string + id: string + description: string + hasPrimary: boolean + disabled: boolean + type: NetworkInterfaceType + username: null | string + path: string + search: Record + }) => new NetworkInterfaceBuilder({ ...options, effects }), + childProcess, + getSystemSmtp: () => + new GetSystemSmtp(effects) as GetSystemSmtp & WrapperOverWrite, + + host: { + static: (id: string) => new StaticHost({ id, effects }), + single: (id: string) => new SingleHost({ id, effects }), + multi: (id: string) => new MultiHost({ id, effects }), + }, + nullIfEmpty, + + networkInterface: { + getOwn: (interfaceId: InterfaceId) => + getNetworkInterface(effects, { interfaceId }) as GetNetworkInterface & + WrapperOverWrite, + get: (opts: { interfaceId: InterfaceId; packageId: PackageId }) => + getNetworkInterface(effects, opts) as GetNetworkInterface & + WrapperOverWrite, + getAllOwn: () => + getNetworkInterfaces(effects, {}) as GetNetworkInterfaces & + WrapperOverWrite, + getAll: (opts: { packageId: PackageId }) => + getNetworkInterfaces(effects, opts) as GetNetworkInterfaces & + WrapperOverWrite, + }, + store: { + get: ( + packageId: string, + path: EnsureStorePath, + ) => + getStore(effects, path as any, { + packageId, + }) as any, + getOwn: (path: EnsureStorePath) => + getStore(effects, path as any) as any, + setOwn: ( + path: EnsureStorePath, + value: ExtractStore, + ) => effects.store.set({ value, path: path as any }), + }, + + runCommand: async ( + imageId: Manifest["images"][number], + command: ValidIfNoStupidEscape | [string, ...string[]], + options: CommandOptions & { + mounts?: { path: string; options: MountOptions }[] + }, + ): Promise<{ stdout: string | Buffer; stderr: string | Buffer }> => { + const commands = splitCommand(command) + const overlay = await Overlay.of(effects, imageId) + try { + for (let mount of options.mounts || []) { + await overlay.mount(mount.options, mount.path) + } + return await overlay.exec(commands) + } finally { + await overlay.destroy() + } + }, + runDaemon: async ( + imageId: Manifest["images"][number], + command: ValidIfNoStupidEscape | [string, ...string[]], + options: CommandOptions & { + mounts?: { path: string; options: MountOptions }[] + overlay?: Overlay + }, + ): Promise => { + const commands = splitCommand(command) + const overlay = options.overlay || (await Overlay.of(effects, imageId)) + for (let mount of options.mounts || []) { + await overlay.mount(mount.options, mount.path) + } + const childProcess = await overlay.spawn(commands, { + env: options.env, + }) + const answer = new Promise((resolve, reject) => { + childProcess.stdout.on("data", (data: any) => { + console.log(data.toString()) + }) + childProcess.stderr.on("data", (data: any) => { + console.error(data.toString()) + }) + + childProcess.on("close", (code: any) => { + if (code === 0) { + return resolve(null) + } + return reject(new Error(`${commands[0]} exited with code ${code}`)) + }) + }) + + return { + wait() { + return answer + }, + async term({ signal = SIGTERM, timeout = NO_TIMEOUT } = {}) { + try { + childProcess.kill(signal) + + if (timeout <= NO_TIMEOUT) { + const didTimeout = await Promise.race([ + new Promise((resolve) => setTimeout(resolve, timeout)).then( + () => true, + ), + answer.then(() => false), + ]) + if (didTimeout) childProcess.kill(SIGKILL) + } + await answer + } finally { + await overlay.destroy() + } + }, + } + }, + checkPortListening: checkPortListening.bind(null, effects), + checkWebUrl: checkWebUrl.bind(null, effects), + + mountDependencies: < + In extends + | Record>> + | Record> + | Record + | Path, + >( + value: In, + ) => mountDependencies(effects, value), + } +} +function noop(): void {} diff --git a/sdk/package-lock.json b/sdk/package-lock.json new file mode 100644 index 000000000..8c6d32fc8 --- /dev/null +++ b/sdk/package-lock.json @@ -0,0 +1,4320 @@ +{ + "name": "@start9labs/start-sdk", + "version": "0.4.0-rev0.lib0.rc8.beta7", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@start9labs/start-sdk", + "version": "0.4.0-rev0.lib0.rc8.beta7", + "license": "MIT", + "dependencies": { + "@iarna/toml": "^2.2.5", + "isomorphic-fetch": "^3.0.0", + "ts-matches": "^5.4.1", + "yaml": "^2.2.2" + }, + "devDependencies": { + "@types/jest": "^29.4.0", + "jest": "^29.4.3", + "prettier": "^3.2.5", + "ts-jest": "^29.0.5", + "ts-node": "^10.9.1", + "tsx": "^4.7.1", + "typescript": "^5.0.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", + "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", + "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.3", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.3", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.3", + "@babel/types": "^7.21.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/@babel/generator": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", + "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.3", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", + "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", + "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.3", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.3", + "@babel/types": "^7.21.3", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", + "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", + "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", + "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.5.0", + "@jest/reporters": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-resolve-dependencies": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "jest-watcher": "^29.5.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", + "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", + "dev": true, + "dependencies": { + "expect": "^29.5.0", + "jest-snapshot": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", + "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", + "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.5.0", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", + "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/types": "^29.5.0", + "jest-mock": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", + "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", + "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.25.16" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", + "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", + "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", + "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", + "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.5.0", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", + "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.25.24", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", + "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.0.tgz", + "integrity": "sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/node": { + "version": "18.15.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.10.tgz", + "integrity": "sha512-9avDaQJczATcXgfmMAW3MIWArOO7A+m90vuCFLr8AotWf8igO/mRoYukrk2cqZVtv38tHs33retzHEilM7FpeQ==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/babel-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", + "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.5.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@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-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.5.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001470", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001470.tgz", + "integrity": "sha512-065uNwY6QtHCBOExzbV6m236DDhYCCtPmQUCoQtwkVqzud8v5QPidoMr6CoMkC2nfp6nksjttqWQRRh75LqUmA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.341", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.341.tgz", + "integrity": "sha512-R4A8VfUBQY9WmAhuqY5tjHRf5fH2AAf6vqitBOE0y6u2PgHgqHSrhZmu78dIX3fVZtjqlwJNX1i2zwC3VpHtQQ==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isomorphic-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", + "dependencies": { + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" + } + }, + "node_modules/isomorphic-fetch/node_modules/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", + "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", + "dev": true, + "dependencies": { + "@jest/core": "^29.5.0", + "@jest/types": "^29.5.0", + "import-local": "^3.0.2", + "jest-cli": "^29.5.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", + "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.5.0", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.5.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", + "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", + "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.5.0", + "@jest/types": "^29.5.0", + "babel-jest": "^29.5.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.5.0", + "jest-environment-node": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", + "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", + "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.5.0", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", + "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", + "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.5.0", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", + "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", + "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", + "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.5.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", + "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", + "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", + "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", + "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.5.0", + "@jest/environment": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-leak-detector": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-resolve": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-util": "^29.5.0", + "jest-watcher": "^29.5.0", + "jest-worker": "^29.5.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", + "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/globals": "^29.5.0", + "@jest/source-map": "^29.4.3", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", + "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.5.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/jest-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", + "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", + "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.5.0", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", + "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.5.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", + "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.5.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz", + "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-jest": { + "version": "29.0.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.5.tgz", + "integrity": "sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/ts-matches": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ts-matches/-/ts-matches-5.4.1.tgz", + "integrity": "sha512-kXrY75F0s0WD15N2bWKDScKlKgwnusN6dTRzGs1N7LlxQRnazrsBISC1HL4sy2adsyk65Zbx3Ui3IGN8leAFOQ==" + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tsx": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.1.tgz", + "integrity": "sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==", + "dev": true, + "dependencies": { + "esbuild": "~0.19.10", + "get-tsconfig": "^4.7.2" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dev": true, + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/sdk/package.json b/sdk/package.json new file mode 100644 index 000000000..110b4bc8f --- /dev/null +++ b/sdk/package.json @@ -0,0 +1,59 @@ +{ + "name": "@start9labs/start-sdk", + "version": "0.4.0-rev0.lib0.rc8.beta7", + "description": "Software development kit to facilitate packaging services for StartOS", + "main": "./cjs/lib/index.js", + "types": "./cjs/lib/index.d.ts", + "module": "./mjs/lib/index.js", + "sideEffects": true, + "exports": { + ".": { + "import": "./mjs/lib/index.js", + "require": "./cjs/lib/index.js", + "types": "./cjs/lib/index.d.ts" + } + }, + "typesVersion": { + ">=3.1": { + "*": [ + "cjs/lib/*" + ] + } + }, + "scripts": { + "test": "jest -c ./jest.config.js --coverage", + "buildOutput": "ts-node --project ./tsconfig-cjs.json ./lib/test/makeOutput.ts && npx prettier --write '**/*.ts'", + "check": "tsc --noEmit" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Start9Labs/start-sdk.git" + }, + "author": "Start9 Labs", + "license": "MIT", + "bugs": { + "url": "https://github.com/Start9Labs/start-sdk/issues" + }, + "homepage": "https://github.com/Start9Labs/start-sdk#readme", + "dependencies": { + "@iarna/toml": "^2.2.5", + "isomorphic-fetch": "^3.0.0", + "ts-matches": "^5.4.1", + "yaml": "^2.2.2" + }, + "prettier": { + "trailingComma": "all", + "tabWidth": 2, + "semi": false, + "singleQuote": false + }, + "devDependencies": { + "@types/jest": "^29.4.0", + "jest": "^29.4.3", + "prettier": "^3.2.5", + "ts-jest": "^29.0.5", + "ts-node": "^10.9.1", + "tsx": "^4.7.1", + "typescript": "^5.0.4" + } +} diff --git a/sdk/scripts/oldSpecToBuilder.ts b/sdk/scripts/oldSpecToBuilder.ts new file mode 100644 index 000000000..ce8ea4e5f --- /dev/null +++ b/sdk/scripts/oldSpecToBuilder.ts @@ -0,0 +1,413 @@ +import * as fs from "fs" + +// https://stackoverflow.com/questions/2970525/converting-any-string-into-camel-case +export function camelCase(value: string) { + return value + .replace(/([\(\)\[\]])/g, "") + .replace(/^([A-Z])|[\s-_](\w)/g, function (match, p1, p2, offset) { + if (p2) return p2.toUpperCase() + return p1.toLowerCase() + }) +} + +export async function oldSpecToBuilder( + file: string, + inputData: Promise | any, + options?: Parameters[1], +) { + await fs.writeFile( + file, + await makeFileContentFromOld(inputData, options), + (err) => console.error(err), + ) +} + +function isString(x: unknown): x is string { + return typeof x === "string" +} + +export default async function makeFileContentFromOld( + inputData: Promise | any, + { StartSdk = "start-sdk", nested = true } = {}, +) { + const outputLines: string[] = [] + outputLines.push(` +import { sdk } from "${StartSdk}" +const {Config, List, Value, Variants} = sdk +`) + const data = await inputData + + const namedConsts = new Set(["Config", "Value", "List"]) + const configName = newConst("configSpec", convertInputSpec(data)) + const configMatcherName = newConst( + "matchConfigSpec", + `${configName}.validator`, + ) + outputLines.push( + `export type ConfigSpec = typeof ${configMatcherName}._TYPE;`, + ) + + return outputLines.join("\n") + + function newConst(key: string, data: string, type?: string) { + const variableName = getNextConstName(camelCase(key)) + outputLines.push( + `export const ${variableName}${!type ? "" : `: ${type}`} = ${data};`, + ) + return variableName + } + function maybeNewConst(key: string, data: string) { + if (nested) return data + return newConst(key, data) + } + function convertInputSpecInner(data: any) { + let answer = "{" + for (const [key, value] of Object.entries(data)) { + const variableName = maybeNewConst(key, convertValueSpec(value)) + + answer += `${JSON.stringify(key)}: ${variableName},` + } + return `${answer}}` + } + + function convertInputSpec(data: any) { + return `Config.of(${convertInputSpecInner(data)})` + } + function convertValueSpec(value: any): string { + switch (value.type) { + case "string": { + if (value.textarea) { + return `${rangeToTodoComment( + value?.range, + )}Value.textarea(${JSON.stringify( + { + name: value.name || null, + description: value.description || null, + warning: value.warning || null, + required: !(value.nullable || false), + placeholder: value.placeholder || null, + maxLength: null, + minLength: null, + }, + null, + 2, + )})` + } + return `${rangeToTodoComment(value?.range)}Value.text(${JSON.stringify( + { + name: value.name || null, + // prettier-ignore + required: ( + value.default != null ? {default: value.default} : + value.nullable === false ? {default: null} : + !value.nullable + ), + description: value.description || null, + warning: value.warning || null, + masked: value.masked || false, + placeholder: value.placeholder || null, + inputmode: "text", + patterns: value.pattern + ? [ + { + regex: value.pattern, + description: value["pattern-description"], + }, + ] + : [], + minLength: null, + maxLength: null, + }, + null, + 2, + )})` + } + case "number": { + return `${rangeToTodoComment( + value?.range, + )}Value.number(${JSON.stringify( + { + name: value.name || null, + description: value.description || null, + warning: value.warning || null, + // prettier-ignore + required: ( + value.default != null ? {default: value.default} : + value.nullable === false ? {default: null} : + !value.nullable + ), + min: null, + max: null, + step: null, + integer: value.integral || false, + units: value.units || null, + placeholder: value.placeholder || null, + }, + null, + 2, + )})` + } + case "boolean": { + return `Value.toggle(${JSON.stringify( + { + name: value.name || null, + default: value.default || false, + description: value.description || null, + warning: value.warning || null, + }, + null, + 2, + )})` + } + case "enum": { + const allValueNames = new Set([ + ...(value?.["values"] || []), + ...Object.keys(value?.["value-names"] || {}), + ]) + const values = Object.fromEntries( + Array.from(allValueNames) + .filter(isString) + .map((key) => [key, value?.spec?.["value-names"]?.[key] || key]), + ) + return `Value.select(${JSON.stringify( + { + name: value.name || null, + description: value.description || null, + warning: value.warning || null, + + // prettier-ignore + required:( + value.default != null ? {default: value.default} : + value.nullable === false ? {default: null} : + !value.nullable + ), + values, + }, + null, + 2, + )} as const)` + } + case "object": { + const specName = maybeNewConst( + value.name + "_spec", + convertInputSpec(value.spec), + ) + return `Value.object({ + name: ${JSON.stringify(value.name || null)}, + description: ${JSON.stringify(value.description || null)}, + warning: ${JSON.stringify(value.warning || null)}, + }, ${specName})` + } + case "union": { + const variants = maybeNewConst( + value.name + "_variants", + convertVariants(value.variants, value.tag["variant-names"] || {}), + ) + + return `Value.union({ + name: ${JSON.stringify(value.name || null)}, + description: ${JSON.stringify(value.tag.description || null)}, + warning: ${JSON.stringify(value.tag.warning || null)}, + + // prettier-ignore + required: ${JSON.stringify( + // prettier-ignore + value.default != null ? {default: value.default} : + value.nullable === false ? {default: null} : + !value.nullable, + )}, + }, ${variants})` + } + case "list": { + if (value.subtype === "enum") { + const allValueNames = new Set([ + ...(value?.spec?.["values"] || []), + ...Object.keys(value?.spec?.["value-names"] || {}), + ]) + const values = Object.fromEntries( + Array.from(allValueNames) + .filter(isString) + .map((key: string) => [ + key, + value?.spec?.["value-names"]?.[key] ?? key, + ]), + ) + return `Value.multiselect(${JSON.stringify( + { + name: value.name || null, + minLength: null, + maxLength: null, + default: value.default ?? null, + description: value.description || null, + warning: value.warning || null, + values, + }, + null, + 2, + )})` + } + const list = maybeNewConst(value.name + "_list", convertList(value)) + return `Value.list(${list})` + } + case "pointer": { + return `/* TODO deal with point removed point "${value.name}" */null as any` + } + } + throw Error(`Unknown type "${value.type}"`) + } + + function convertList(value: any) { + switch (value.subtype) { + case "string": { + return `${rangeToTodoComment(value?.range)}List.text(${JSON.stringify( + { + name: value.name || null, + minLength: null, + maxLength: null, + default: value.default || null, + description: value.description || null, + warning: value.warning || null, + }, + null, + 2, + )}, ${JSON.stringify({ + masked: value?.spec?.masked || false, + placeholder: value?.spec?.placeholder || null, + patterns: value?.spec?.pattern + ? [ + { + regex: value.spec.pattern, + description: value?.spec?.["pattern-description"], + }, + ] + : [], + minLength: null, + maxLength: null, + })})` + } + case "number": { + return `${rangeToTodoComment(value?.range)}List.number(${JSON.stringify( + { + name: value.name || null, + minLength: null, + maxLength: null, + default: value.default || null, + description: value.description || null, + warning: value.warning || null, + }, + null, + 2, + )}, ${JSON.stringify({ + integer: value?.spec?.integral || false, + min: null, + max: null, + units: value?.spec?.units || null, + placeholder: value?.spec?.placeholder || null, + })})` + } + case "enum": { + return "/* error!! list.enum */" + } + case "object": { + const specName = maybeNewConst( + value.name + "_spec", + convertInputSpec(value.spec.spec), + ) + return `${rangeToTodoComment(value?.range)}List.obj({ + name: ${JSON.stringify(value.name || null)}, + minLength: ${JSON.stringify(null)}, + maxLength: ${JSON.stringify(null)}, + default: ${JSON.stringify(value.default || null)}, + description: ${JSON.stringify(value.description || null)}, + warning: ${JSON.stringify(value.warning || null)}, + }, { + spec: ${specName}, + displayAs: ${JSON.stringify(value?.spec?.["display-as"] || null)}, + uniqueBy: ${JSON.stringify(value?.spec?.["unique-by"] || null)}, + })` + } + case "union": { + const variants = maybeNewConst( + value.name + "_variants", + convertVariants( + value.spec.variants, + value.spec["variant-names"] || {}, + ), + ) + const unionValueName = maybeNewConst( + value.name + "_union", + `${rangeToTodoComment(value?.range)} + Value.union({ + name: ${JSON.stringify(value?.spec?.tag?.name || null)}, + description: ${JSON.stringify( + value?.spec?.tag?.description || null, + )}, + warning: ${JSON.stringify(value?.spec?.tag?.warning || null)}, + required: ${JSON.stringify( + // prettier-ignore + 'default' in value?.spec ? {default: value?.spec?.default} : + !!value?.spec?.tag?.nullable || false ? {default: null} : + false, + )}, + }, ${variants}) + `, + ) + const listConfig = maybeNewConst( + value.name + "_list_config", + ` + Config.of({ + "union": ${unionValueName} + }) + `, + ) + return `${rangeToTodoComment(value?.range)}List.obj({ + name:${JSON.stringify(value.name || null)}, + minLength:${JSON.stringify(null)}, + maxLength:${JSON.stringify(null)}, + default: [], + description: ${JSON.stringify(value.description || null)}, + warning: ${JSON.stringify(value.warning || null)}, + }, { + spec: ${listConfig}, + displayAs: ${JSON.stringify(value?.spec?.["display-as"] || null)}, + uniqueBy: ${JSON.stringify(value?.spec?.["unique-by"] || null)}, + })` + } + } + throw new Error(`Unknown subtype "${value.subtype}"`) + } + + function convertVariants( + variants: Record, + variantNames: Record, + ): string { + let answer = "Variants.of({" + for (const [key, value] of Object.entries(variants)) { + const variantSpec = maybeNewConst(key, convertInputSpec(value)) + answer += `"${key}": {name: "${ + variantNames[key] || key + }", spec: ${variantSpec}},` + } + return `${answer}})` + } + + function getNextConstName(name: string, i = 0): string { + const newName = !i ? name : name + i + if (namedConsts.has(newName)) { + return getNextConstName(name, i + 1) + } + namedConsts.add(newName) + return newName + } +} + +function rangeToTodoComment(range: string | undefined) { + if (!range) return "" + return `/* TODO: Convert range for this value (${range})*/` +} + +// oldSpecToBuilder( +// "./config.ts", +// // Put config here +// {}, +// ) diff --git a/sdk/tsconfig-base.json b/sdk/tsconfig-base.json new file mode 100644 index 000000000..cc14a817c --- /dev/null +++ b/sdk/tsconfig-base.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "module": "esnext", + "strict": true, + "outDir": "dist", + "preserveConstEnums": true, + "sourceMap": true, + "target": "es2017", + "pretty": true, + "declaration": true, + "noImplicitAny": true, + "esModuleInterop": true, + "types": ["node", "jest"], + "moduleResolution": "node", + "skipLibCheck": true + }, + "include": ["lib/**/*"], + "exclude": ["lib/**/*.spec.ts", "lib/**/*.gen.ts", "list", "node_modules"] +} diff --git a/sdk/tsconfig-cjs.json b/sdk/tsconfig-cjs.json new file mode 100644 index 000000000..8413cf248 --- /dev/null +++ b/sdk/tsconfig-cjs.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig-base.json", + "compilerOptions": { + "module": "commonjs", + "outDir": "dist/cjs", + "target": "es2018" + } +} diff --git a/sdk/tsconfig.json b/sdk/tsconfig.json new file mode 100644 index 000000000..8ae7d62a8 --- /dev/null +++ b/sdk/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig-base.json", + "compilerOptions": { + "module": "esnext", + "outDir": "dist/mjs", + "target": "esnext" + } +} diff --git a/system-images/compat/Cargo.lock b/system-images/compat/Cargo.lock index c1e0959fb..0f82176f4 100644 --- a/system-images/compat/Cargo.lock +++ b/system-images/compat/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.19.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ "gimli", ] @@ -32,25 +32,26 @@ dependencies = [ [[package]] name = "ahash" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" dependencies = [ - "getrandom 0.2.8", + "getrandom 0.2.12", "once_cell", "version_check", ] [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" dependencies = [ "cfg-if", - "getrandom 0.2.8", + "getrandom 0.2.12", "once_cell", "version_check", + "zerocopy", ] [[package]] @@ -77,6 +78,12 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -101,26 +108,74 @@ dependencies = [ "winapi", ] +[[package]] +name = "anstream" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" + +[[package]] +name = "anstyle-parse" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + [[package]] name = "anyhow" -version = "1.0.68" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" dependencies = [ "backtrace", ] [[package]] name = "arrayref" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" [[package]] name = "arrayvec" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "ascii-canvas" @@ -133,9 +188,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" dependencies = [ "concurrent-queue", "event-listener", @@ -144,9 +199,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f658e2baef915ba0f26f1f7c42bfb8e12f532a01f449a090ded75ae7a07e9ba2" +checksum = "a116f46a969224200a0a97f29cfd4c50e7534e4b4826bd23ea2c3c533039c82c" dependencies = [ "brotli", "flate2", @@ -175,18 +230,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.48", ] [[package]] name = "async-trait" -version = "0.1.74" +version = "0.1.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.48", ] [[package]] @@ -198,6 +253,16 @@ dependencies = [ "num-traits", ] +[[package]] +name = "atomic-write-file" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edcdbedc2236483ab103a53415653d6b4442ea6141baf1ffa85df29635e88436" +dependencies = [ + "nix 0.27.1", + "rand 0.8.5", +] + [[package]] name = "atty" version = "0.2.14" @@ -215,11 +280,88 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "axum" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" +dependencies = [ + "async-trait", + "axum-core", + "base64 0.21.7", + "bytes", + "futures-util", + "http 1.0.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.1.0", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sha1", + "sync_wrapper", + "tokio", + "tokio-tungstenite", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 1.0.0", + "http-body 1.0.0", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-server" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ad46c3ec4e12f4a4b6835e173ba21c25e484c9d02b49770bf006ce5367c036" +dependencies = [ + "bytes", + "futures-util", + "http 1.0.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.1.0", + "hyper-util", + "pin-project-lite", + "tokio", + "tower", + "tower-service", +] + [[package]] name = "backtrace" -version = "0.3.67" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ "addr2line", "cc", @@ -250,9 +392,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.4" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64ct" @@ -262,9 +404,9 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "basic-cookies" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb53b6b315f924c7f113b162e53b3901c05fc9966baf84d201dfcc7432a4bb38" +checksum = "67bd8fd42c16bdb08688243dc5f0cc117a3ca9efeeaba3a345a18a6159ad96f7" dependencies = [ "lalrpop", "lalrpop-util", @@ -313,9 +455,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" dependencies = [ "serde", ] @@ -340,13 +482,26 @@ dependencies = [ [[package]] name = "blake2b_simd" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72936ee4afc7f8f736d1c38383b56480b5497b4617b4a77bdbf1d2ababc76127" +checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" dependencies = [ "arrayref", "arrayvec", - "constant_time_eq 0.1.5", + "constant_time_eq", +] + +[[package]] +name = "blake3" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", ] [[package]] @@ -361,9 +516,9 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] @@ -376,9 +531,9 @@ checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" [[package]] name = "brotli" -version = "3.3.4" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" +checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -387,43 +542,31 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.3.4" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" +checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", ] -[[package]] -name = "bstr" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" -dependencies = [ - "lazy_static", - "memchr", - "regex-automata 0.1.10", - "serde", -] - [[package]] name = "bumpalo" -version = "3.12.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.3.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cc" @@ -442,9 +585,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb" dependencies = [ "android-tzdata", "iana-time-zone", @@ -452,23 +595,23 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.48.5", + "windows-targets 0.52.0", ] [[package]] name = "chumsky" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23170228b96236b5a7299057ac284a321457700bc8c41a4476052f0f4ba5349d" +checksum = "8eebd66744a15ded14960ab4ccdbfb51ad3b81f51f3f04a80adac98c985396c9" dependencies = [ - "hashbrown 0.12.3", + "hashbrown 0.14.3", ] [[package]] name = "ciborium" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" dependencies = [ "ciborium-io", "ciborium-ll", @@ -477,18 +620,18 @@ dependencies = [ [[package]] name = "ciborium-io" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" [[package]] name = "ciborium-ll" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", - "half", + "half 2.3.1", ] [[package]] @@ -533,13 +676,47 @@ checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ "atty", "bitflags 1.3.2", - "clap_lex", - "indexmap 1.9.2", + "clap_lex 0.2.4", + "indexmap 1.9.3", "strsim 0.10.0", "termcolor", "textwrap 0.16.0", ] +[[package]] +name = "clap" +version = "4.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7" +dependencies = [ + "anstream", + "anstyle", + "clap_lex 0.6.0", + "strsim 0.10.0", +] + +[[package]] +name = "clap_derive" +version = "4.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "clap_lex" version = "0.2.4" @@ -550,14 +727,10 @@ dependencies = [ ] [[package]] -name = "codespan-reporting" -version = "0.11.1" +name = "clap_lex" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width", -] +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" [[package]] name = "color-eyre" @@ -576,9 +749,9 @@ dependencies = [ [[package]] name = "color-spantrace" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" +checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" dependencies = [ "once_cell", "owo-colors", @@ -586,6 +759,12 @@ dependencies = [ "tracing-error", ] +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + [[package]] name = "compat" version = "0.1.0" @@ -597,7 +776,7 @@ dependencies = [ "emver", "failure", "imbl-value", - "indexmap 1.9.2", + "indexmap 1.9.3", "itertools 0.10.5", "lazy_static", "linear-map", @@ -607,7 +786,7 @@ dependencies = [ "pest_derive", "rand 0.8.5", "regex", - "rust-argon2 1.0.0", + "rust-argon2 1.0.1", "serde", "serde_json", "serde_yaml 0.8.26", @@ -616,86 +795,58 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.1.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c278839b831783b70278b14df4d45e1beb1aad306c07bb796637de9a0e323e8e" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" dependencies = [ "crossbeam-utils", ] [[package]] name = "console" -version = "0.15.7" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ "encode_unicode 0.3.6", "lazy_static", "libc", "unicode-width", - "windows-sys 0.45.0", + "windows-sys 0.52.0", ] [[package]] name = "const-oid" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "const_format" -version = "0.2.31" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c990efc7a285731f9a4378d81aff2f0e85a2c8781a05ef0f8baa8dac54d0ff48" +checksum = "e3a214c7af3d04997541b18d432afaff4c455e79e2029079647e72fc2bd27673" dependencies = [ "const_format_proc_macros", ] [[package]] name = "const_format_proc_macros" -version = "0.2.31" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e026b6ce194a874cb9cf32cd5772d1ef9767cc8fcb5765948d74f37a9d8b2bf6" +checksum = "c7f6ff08fd20f4f299298a28e2dfa8a8ba1036e6cd2460ac1de7b425d76f2500" dependencies = [ "proc-macro2", "quote", "unicode-xid", ] -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - [[package]] name = "constant_time_eq" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" -[[package]] -name = "container-init" -version = "0.1.0" -dependencies = [ - "async-stream", - "color-eyre", - "futures", - "helpers", - "imbl", - "nix 0.27.1", - "procfs", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tracing", - "tracing-error", - "tracing-futures", - "tracing-subscriber", - "yajrc 0.1.0 (git+https://github.com/dr-bonez/yajrc.git?branch=develop)", -] - [[package]] name = "convert_case" version = "0.4.0" @@ -745,15 +896,16 @@ dependencies = [ [[package]] name = "cookie_store" -version = "0.16.1" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e4b6aa369f41f5faa04bb80c9b1f4216ea81646ed6124d76ba5c49a7aafd9cd" +checksum = "d606d0fba62e13cf04db20536c05cb7f13673c161cb47a47a82b9b9e7d3f1daa" dependencies = [ "cookie 0.16.2", "idna 0.2.3", "log", "publicsuffix", "serde", + "serde_derive", "serde_json", "time", "url", @@ -778,9 +930,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -788,33 +940,33 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] [[package]] name = "crc" -version = "3.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53757d12b596c16c78b83458d732a5d1a17ab3f53f2f7412f6fb57cc8a140ab3" +checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" dependencies = [ "crc-catalog", ] [[package]] name = "crc-catalog" -version = "2.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cace84e55f07e7301bae1c519df89cdad8cc3cd868413d3fdbdeca9ff3db484" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" @@ -827,21 +979,43 @@ dependencies = [ [[package]] name = "crossbeam-queue" -version = "0.3.8" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.14" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + +[[package]] +name = "crossterm" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" +checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" dependencies = [ - "cfg-if", + "bitflags 2.4.2", + "crossterm_winapi", + "futures-core", + "libc", + "mio", + "parking_lot", + "signal-hook", + "signal-hook-mio", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", ] [[package]] @@ -852,9 +1026,9 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-bigint" -version = "0.5.3" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "740fe28e594155f10cfc383984cbefd529d7396050557148f79cb0f621204124" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", "rand_core 0.6.4", @@ -874,9 +1048,9 @@ dependencies = [ [[package]] name = "crypto-mac" -version = "0.11.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" dependencies = [ "generic-array", "subtle", @@ -884,22 +1058,21 @@ dependencies = [ [[package]] name = "csv" -version = "1.1.6" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" dependencies = [ - "bstr", "csv-core", - "itoa 0.4.8", + "itoa", "ryu", "serde", ] [[package]] name = "csv-core" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" dependencies = [ "memchr", ] @@ -951,57 +1124,13 @@ dependencies = [ [[package]] name = "curve25519-dalek-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.37", -] - -[[package]] -name = "cxx" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d1075c37807dcf850c379432f0df05ba52cc30f279c5cfc43cc221ce7f8579" -dependencies = [ - "cc", - "cxxbridge-flags", - "cxxbridge-macro", - "link-cplusplus", -] - -[[package]] -name = "cxx-build" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5044281f61b27bc598f2f6647d480aed48d2bf52d6eb0b627d84c0361b17aa70" -dependencies = [ - "cc", - "codespan-reporting", - "once_cell", - "proc-macro2", - "quote", - "scratch", - "syn 1.0.107", -] - -[[package]] -name = "cxxbridge-flags" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b50bc93ba22c27b0d31128d2d130a0a6b3d267ae27ef7e4fae2167dfe8781c" - -[[package]] -name = "cxxbridge-macro" -version = "1.0.86" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e61fda7e62115119469c7b3591fd913ecca96fb766cfd3f2e2502ab7bc87a5" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 1.0.107", + "syn 2.0.48", ] [[package]] @@ -1025,7 +1154,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.37", + "syn 2.0.48", ] [[package]] @@ -1036,17 +1165,17 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn 2.0.37", + "syn 2.0.48", ] [[package]] name = "dashmap" -version = "5.4.0" +version = "5.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.12.3", + "hashbrown 0.14.3", "lock_api", "once_cell", "parking_lot_core", @@ -1054,9 +1183,9 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.3.3" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" [[package]] name = "der" @@ -1069,6 +1198,16 @@ dependencies = [ "zeroize", ] +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + [[package]] name = "derive_more" version = "0.99.17" @@ -1079,7 +1218,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 1.0.107", + "syn 1.0.109", ] [[package]] @@ -1103,7 +1242,7 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.3", + "block-buffer 0.10.4", "const-oid", "crypto-common", "subtle", @@ -1138,9 +1277,9 @@ checksum = "69dde51e8fef5e12c1d65e0929b03d66e4c0c18282bc30ed2ca050ad6f44dd82" [[package]] name = "dotenvy" -version = "0.15.6" +version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d8c417d7a8cb362e0c37e5d815f5eb7c37f79ff93707329d5a194e42e54ca0" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" [[package]] name = "drain" @@ -1153,21 +1292,21 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.12" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "304e6508efa593091e97a9abbc10f90aa7ca635b6d2784feff3c89d41dd12272" +checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" [[package]] name = "ecdsa" -version = "0.16.8" +version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", "digest 0.10.7", "elliptic-curve", "rfc6979", - "signature 2.0.0", + "signature 2.2.0", "spki", ] @@ -1188,7 +1327,7 @@ checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ "pkcs8", "serde", - "signature 2.0.0", + "signature 2.2.0", ] [[package]] @@ -1207,33 +1346,34 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7277392b266383ef8396db7fdeb1e77b6c52fed775f5df15bb24f35b72156980" +checksum = "1f628eaec48bfd21b865dc2950cfa014450c01d2fa2b69a86c2fd5844ec523c0" dependencies = [ "curve25519-dalek 4.1.1", "ed25519 2.2.3", "rand_core 0.6.4", "serde", "sha2 0.10.8", - "signature 2.0.0", + "signature 2.2.0", + "subtle", "zeroize", ] [[package]] name = "either" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" dependencies = [ "serde", ] [[package]] name = "elliptic-curve" -version = "0.13.6" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97ca172ae9dc9f9b779a6e3a65d308f2af74e5b8c921299075bdb4a0370e914" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -1262,9 +1402,9 @@ dependencies = [ [[package]] name = "ena" -version = "0.14.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7402b94a93c24e742487327a7cd839dc9d36fec9de9fb25b09f2dae459f36c3" +checksum = "c533630cf40e9caa44bd91aadc88a75d75a4c3a12b4cfde353cbed41daa1e1f1" dependencies = [ "log", ] @@ -1283,9 +1423,9 @@ checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "encoding_rs" -version = "0.8.31" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ "cfg-if", ] @@ -1299,20 +1439,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.37", -] - -[[package]] -name = "env_logger" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" -dependencies = [ - "humantime", - "is-terminal", - "log", - "regex", - "termcolor", + "syn 2.0.48", ] [[package]] @@ -1323,23 +1450,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" -dependencies = [ - "errno-dragonfly", - "libc", - "winapi", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ - "cc", "libc", + "windows-sys 0.52.0", ] [[package]] @@ -1361,9 +1477,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "eyre" -version = "0.6.8" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" +checksum = "b6267a1fa6f59179ea4afc8e50fd8612a3cc60bc858f786ff877a4a8cb042799" dependencies = [ "indenter", "once_cell", @@ -1387,18 +1503,15 @@ checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" dependencies = [ "proc-macro2", "quote", - "syn 1.0.107", + "syn 1.0.109", "synstructure", ] [[package]] name = "fastrand" -version = "1.8.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" -dependencies = [ - "instant", -] +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "fd-lock-rs" @@ -1421,22 +1534,28 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.1" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0870c84016d4b481be5c9f323c24f65e31e901ae618f0e80f4308fb00de1d2d" +checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" [[package]] name = "filetime" -version = "0.2.19" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e884668cd0c7480504233e951174ddc3b382f7c2666e3b7310b5c4e7b0c37f9" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.2.16", - "windows-sys 0.42.0", + "redox_syscall 0.4.1", + "windows-sys 0.52.0", ] +[[package]] +name = "finl_unicode" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" + [[package]] name = "fixedbitset" version = "0.4.2" @@ -1445,9 +1564,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.25" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", "miniz_oxide", @@ -1487,9 +1606,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -1511,9 +1630,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -1526,9 +1645,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -1536,15 +1655,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -1564,38 +1683,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.48", ] [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -1633,9 +1752,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", @@ -1644,9 +1763,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.27.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec7af912d60cdbd3677c1af9352ebae6fb8394d165568a2234df0fa00f87793" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "gpt" @@ -1654,7 +1773,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8283e7331b8c93b9756e0cfdbcfb90312852f953c6faf9bf741e684cc3b6ad69" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "crc", "log", "uuid", @@ -1673,17 +1792,36 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.21" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" dependencies = [ "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http", - "indexmap 1.9.2", + "http 0.2.11", + "indexmap 2.1.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 1.0.0", + "indexmap 2.1.0", "slab", "tokio", "tokio-util", @@ -1696,14 +1834,21 @@ version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" +[[package]] +name = "half" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" +dependencies = [ + "cfg-if", + "crunchy", +] + [[package]] name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.6", -] [[package]] name = "hashbrown" @@ -1711,22 +1856,26 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.7", ] [[package]] name = "hashbrown" -version = "0.14.1" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +dependencies = [ + "ahash 0.8.7", + "allocator-api2", +] [[package]] name = "hashlink" -version = "0.8.1" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69fe1fcf8b4278d860ad0548329f892a3631fb63f82574df68275f34cdbe0ffa" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ - "hashbrown 0.12.3", + "hashbrown 0.14.3", ] [[package]] @@ -1747,12 +1896,12 @@ dependencies = [ "lazy_async_pool", "models", "pin-project", + "rpc-toolkit 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde", "serde_json", "tokio", "tokio-stream", "tracing", - "yajrc 0.1.0 (git+https://github.com/dr-bonez/yajrc.git?branch=develop)", ] [[package]] @@ -1766,18 +1915,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" [[package]] name = "hex" @@ -1793,9 +1933,9 @@ checksum = "85ef6b41c333e6dd2a4aaa59125a19b633cd17e7aaf372b2260809777bcdef4a" [[package]] name = "hkdf" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ "hmac 0.12.1", ] @@ -1821,32 +1961,66 @@ dependencies = [ [[package]] name = "home" -version = "0.5.5" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "http" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +dependencies = [ + "bytes", + "fnv", + "itoa", ] [[package]] name = "http" -version = "0.2.9" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea" dependencies = [ "bytes", "fnv", - "itoa 1.0.5", + "itoa", ] [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http", + "http 0.2.11", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http 1.0.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840" +dependencies = [ + "bytes", + "futures-util", + "http 1.0.0", + "http-body 1.0.0", "pin-project-lite", ] @@ -1858,40 +2032,53 @@ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" - -[[package]] -name = "humantime" -version = "2.1.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" dependencies = [ "bytes", "futures-channel", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.3.24", + "http 0.2.11", + "http-body 0.4.6", "httparse", "httpdate", - "itoa 1.0.5", + "itoa", "pin-project-lite", - "socket2 0.4.7", + "socket2", "tokio", "tower-service", "tracing", "want", ] +[[package]] +name = "hyper" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5aa53871fc917b1a9ed87b683a5d86db645e23acb32c2e0785a353e522fb75" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.2", + "http 1.0.0", + "http-body 1.0.0", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "tokio", +] + [[package]] name = "hyper-tls" version = "0.5.0" @@ -1899,51 +2086,51 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper", + "hyper 0.14.28", "native-tls", "tokio", "tokio-native-tls", ] [[package]] -name = "hyper-ws-listener" -version = "0.3.0" +name = "hyper-util" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbfe4981e45b0a7403a55d4af12f8d30e173e722409658c3857243990e72180" +checksum = "bdea9aac0dbe5a9240d68cfd9501e2db94222c6dc06843e06640b9e07f0fdc67" dependencies = [ - "anyhow", - "base64 0.21.4", - "env_logger", - "futures", - "hyper", - "log", - "sha-1", + "bytes", + "futures-channel", + "futures-util", + "http 1.0.0", + "http-body 1.0.0", + "hyper 1.1.0", + "pin-project-lite", + "socket2", "tokio", - "tokio-tungstenite", + "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.53" +version = "0.1.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765" +checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "winapi", + "windows-core", ] [[package]] name = "iana-time-zone-haiku" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ - "cxx", - "cxx-build", + "cc", ] [[package]] @@ -1983,11 +2170,21 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "imbl" -version = "2.0.2" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b4555023847ca2cd6fd11f20b553886e6981c7e8aee9b3e7e960b4b17fb440" +checksum = "978d142c8028edf52095703af2fad11d6f611af1246685725d6b850634647085" dependencies = [ "bitmaps", "imbl-sized-chunks", @@ -1999,9 +2196,9 @@ dependencies = [ [[package]] name = "imbl-sized-chunks" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6957ea0b2541c5ca561d3ef4538044af79f8a05a1eb3a3b148936aaceaa1076" +checksum = "144006fb58ed787dcae3f54575ff4349755b00ccc99f4b4873860b654be1ed63" dependencies = [ "bitmaps", ] @@ -2009,7 +2206,7 @@ dependencies = [ [[package]] name = "imbl-value" version = "0.1.0" -source = "git+https://github.com/Start9Labs/imbl-value.git#929395141c3a882ac366c12ac9402d0ebaa2201b" +source = "git+https://github.com/Start9Labs/imbl-value.git#48dc39a762a3b4f9300d3b9f850cbd394e777ae0" dependencies = [ "imbl", "serde", @@ -2045,9 +2242,9 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "indexmap" -version = "1.9.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", @@ -2056,12 +2253,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown 0.14.1", + "hashbrown 0.14.3", "serde", ] @@ -2098,20 +2295,20 @@ dependencies = [ ] [[package]] -name = "io-lifetimes" -version = "1.0.4" +name = "integer-encoding" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7d6c6f8c91b4b9ed43484ad1a938e393caf35960fce7f82a040497207bd8e9e" +checksum = "924df4f0e24e2e7f9cdd90babb0b96f93b20f3ecfa949ea9e6613756b8c8e1bf" dependencies = [ - "libc", - "windows-sys 0.42.0", + "async-trait", + "tokio", ] [[package]] name = "ipnet" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" dependencies = [ "serde", ] @@ -2128,14 +2325,13 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.4" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b6b32576413a8e69b90e952e4a026476040d81017b80445deda5f2d3921857" +checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" dependencies = [ - "hermit-abi 0.3.1", - "io-lifetimes", + "hermit-abi 0.3.4", "rustix", - "windows-sys 0.45.0", + "windows-sys 0.52.0", ] [[package]] @@ -2177,24 +2373,18 @@ dependencies = [ [[package]] name = "itertools" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" dependencies = [ "either", ] [[package]] name = "itoa" -version = "0.4.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" - -[[package]] -name = "itoa" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "jaq-core" @@ -2202,10 +2392,10 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb52eeac20f256459e909bd4a03bb8c4fab6a1fdbb8ed52d00f644152df48ece" dependencies = [ - "ahash 0.7.6", + "ahash 0.7.7", "dyn-clone", "hifijson", - "indexmap 1.9.2", + "indexmap 1.9.3", "itertools 0.10.5", "jaq-parse", "log", @@ -2236,12 +2426,12 @@ dependencies = [ [[package]] name = "josekit" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5754487a088f527b1407df470db8e654e4064dccbbe1fe850e0773721e9962b7" +checksum = "cd20997283339a19226445db97d632c8dc7adb6b8172537fe0e9e540fb141df2" dependencies = [ "anyhow", - "base64 0.21.4", + "base64 0.21.7", "flate2", "once_cell", "openssl", @@ -2254,9 +2444,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.60" +version = "0.3.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" dependencies = [ "wasm-bindgen", ] @@ -2294,30 +2484,30 @@ dependencies = [ [[package]] name = "keccak" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3afef3b6eff9ce9d8ff9b3601125eec7f0c8cbac7abd14f355d053fa56c98768" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ "cpufeatures", ] [[package]] name = "lalrpop" -version = "0.19.8" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30455341b0e18f276fa64540aff54deafb54c589de6aca68659c63dd2d5d823" +checksum = "da4081d44f4611b66c6dd725e6de3169f9f63905421e8626fcb86b6a898998b8" dependencies = [ "ascii-canvas", - "atty", "bit-set", "diff", "ena", + "is-terminal", "itertools 0.10.5", "lalrpop-util", "petgraph", "pico-args", "regex", - "regex-syntax 0.6.28", + "regex-syntax 0.7.5", "string_cache", "term", "tiny-keccak", @@ -2326,9 +2516,9 @@ dependencies = [ [[package]] name = "lalrpop-util" -version = "0.19.8" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf796c978e9b4d983414f4caedc9273aa33ee214c5b887bd55fde84c85d2dc4" +checksum = "3f35c735096c0293d313e8f2a641627472b83d01b937177fe76e5e2708d31e0d" dependencies = [ "regex", ] @@ -2343,6 +2533,12 @@ dependencies = [ "futures", ] +[[package]] +name = "lazy_format" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e479e99b287d578ed5f6cd4c92cdf48db219088adb9c5b14f7c155b71dfba792" + [[package]] name = "lazy_static" version = "1.4.0" @@ -2354,21 +2550,32 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.149" +version = "0.2.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" [[package]] name = "libm" -version = "0.2.6" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.2", + "libc", + "redox_syscall 0.4.1", +] [[package]] name = "libsqlite3-sys" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326" +checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" dependencies = [ "cc", "pkg-config", @@ -2385,15 +2592,6 @@ dependencies = [ "serde_test", ] -[[package]] -name = "link-cplusplus" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" -dependencies = [ - "cc", -] - [[package]] name = "linked-hash-map" version = "0.5.6" @@ -2402,15 +2600,15 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.1.4" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -2433,9 +2631,15 @@ dependencies = [ [[package]] name = "matches" -version = "0.1.9" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "matchit" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "mbrman" @@ -2452,18 +2656,19 @@ dependencies = [ [[package]] name = "md-5" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ + "cfg-if", "digest 0.10.7", ] [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "memoffset" @@ -2485,9 +2690,9 @@ dependencies = [ [[package]] name = "mime" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "minimal-lexical" @@ -2497,20 +2702,21 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.6.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ "adler", ] [[package]] name = "mio" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", + "log", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.48.0", ] @@ -2519,19 +2725,20 @@ dependencies = [ name = "models" version = "0.1.0" dependencies = [ - "base64 0.21.4", + "base64 0.21.7", "color-eyre", - "ed25519-dalek 2.0.0", + "ed25519-dalek 2.1.0", "emver", "ipnet", "lazy_static", "mbrman", + "num_enum", "openssl", "patch-db", "rand 0.8.5", "regex", "reqwest", - "rpc-toolkit", + "rpc-toolkit 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde", "serde_json", "sqlx", @@ -2622,7 +2829,7 @@ version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "cfg-if", "libc", ] @@ -2663,9 +2870,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" dependencies = [ "autocfg", "num-integer", @@ -2674,9 +2881,9 @@ dependencies = [ [[package]] name = "num-bigint-dig" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2399c9463abc5f909349d8aa9ba080e0b88b3ce2885389b60b993f39b1a56905" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" dependencies = [ "byteorder", "lazy_static", @@ -2733,9 +2940,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", "libm", @@ -2743,33 +2950,33 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi 0.3.4", "libc", ] [[package]] name = "num_enum" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70bf6736f74634d299d00086f02986875b3c2d924781a6a2cb6c201e73da0ceb" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" dependencies = [ "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ea360eafe1022f7cc56cd7b869ed57330fb2453d0c7831d99b74c65d2f5597" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.48", ] [[package]] @@ -2780,18 +2987,18 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "object" -version = "0.30.2" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b8c786513eb403643f2a88c244c2aaa270ef2153f55094587d0c48a3cf22a83" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -2805,7 +3012,7 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c75a0ec2d1b302412fb503224289325fcc0e44600176864804c7211b055cfd58" dependencies = [ - "base64 0.21.4", + "base64 0.21.7", "byteorder", "md-5", "sha2 0.10.8", @@ -2814,11 +3021,11 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.57" +version = "0.10.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c" +checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "cfg-if", "foreign-types", "libc", @@ -2829,13 +3036,13 @@ dependencies = [ [[package]] name = "openssl-macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 1.0.107", + "syn 2.0.48", ] [[package]] @@ -2846,18 +3053,18 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "300.1.5+3.1.3" +version = "300.2.1+3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "559068e4c12950d7dcaa1857a61725c0d38d4fc03ff8e070ab31a75d6e316491" +checksum = "3fe476c29791a5ca0d1273c697e96085bbabbbea2ef7afd5617e78a4b40332d3" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.93" +version = "0.9.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db4d56a4c0478783083cfafcc42493dd4a981d41669da64b4572a2a089b51b1d" +checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae" dependencies = [ "cc", "libc", @@ -2868,9 +3075,9 @@ dependencies = [ [[package]] name = "os_str_bytes" -version = "6.4.1" +version = "6.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" [[package]] name = "overload" @@ -2908,6 +3115,20 @@ dependencies = [ "sha2 0.10.8", ] +[[package]] +name = "p521" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc9e2161f1f215afdfce23677034ae137bbd45016a880c2eb3ba8eb95f085b2" +dependencies = [ + "base16ct", + "ecdsa", + "elliptic-curve", + "primeorder", + "rand_core 0.6.4", + "sha2 0.10.8", +] + [[package]] name = "parking_lot" version = "0.12.1" @@ -2920,22 +3141,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.6" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1ef8814b5c993410bb3adfad7a5ed269563e4a2f90c41f5d85be7fb47133bf" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.2.16", + "redox_syscall 0.4.1", "smallvec", - "windows-sys 0.42.0", + "windows-targets 0.48.5", ] [[package]] name = "paste" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "patch-db" @@ -2965,7 +3186,7 @@ version = "0.1.0" dependencies = [ "patch-db-macro-internals", "proc-macro2", - "syn 1.0.107", + "syn 1.0.109", ] [[package]] @@ -2975,7 +3196,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 1.0.107", + "syn 1.0.109", ] [[package]] @@ -2999,25 +3220,26 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.5.3" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4257b4a04d91f7e9e6290be5d3da4804dd5784fafde3a497d73eb2b4a158c30a" +checksum = "1f200d8d83c44a45b21764d1916299752ca035d15ecd46faca3e9a2a2bf6ad06" dependencies = [ + "memchr", "thiserror", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.5.3" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241cda393b0cdd65e62e07e12454f1f25d57017dcc514b1514cd3c4645e3a0a6" +checksum = "bcd6ab1236bbdb3a49027e920e693192ebfe8913f6d60e294de57463a493cfde" dependencies = [ "pest", "pest_generator", @@ -3025,22 +3247,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.5.3" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46b53634d8c8196302953c74d5352f33d0c512a9499bd2ce468fc9f4128fa27c" +checksum = "2a31940305ffc96863a735bef7c7994a00b325a7138fdbc5bda0f1a0476d3275" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 1.0.107", + "syn 2.0.48", ] [[package]] name = "pest_meta" -version = "2.5.3" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef4f1332a8d4678b41966bb4cc1d0676880e84183a1ecc3f4b69f03e99c7a51" +checksum = "a7ff62f5259e53b78d1af898941cdcdccfae7385cf7d793a6e55de5d05bb4b7d" dependencies = [ "once_cell", "pest", @@ -3049,12 +3271,12 @@ dependencies = [ [[package]] name = "petgraph" -version = "0.6.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 1.9.2", + "indexmap 2.1.0", ] [[package]] @@ -3068,28 +3290,28 @@ dependencies = [ [[package]] name = "pico-args" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db8bcd96cb740d03149cbad5518db9fd87126a10ab519c011893b1754134c468" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.48", ] [[package]] @@ -3127,21 +3349,27 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" [[package]] name = "platforms" -version = "3.1.2" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4503fa043bf02cee09a9582e9554b4c6403b2ef55e4612e96561d294419429f8" +checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" [[package]] name = "portable-atomic" -version = "1.4.3" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" + +[[package]] +name = "powerfmt" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31114a898e107c51bb1609ffaf55a0e011cf6a4d7f1170d0015a165082c0338b" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" @@ -3171,63 +3399,46 @@ dependencies = [ [[package]] name = "primeorder" -version = "0.13.2" +version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c2fcef82c0ec6eefcc179b978446c399b3cdf73c392c35604e399eee6df1ee3" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" dependencies = [ "elliptic-curve", ] [[package]] name = "proc-macro-crate" -version = "1.2.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "once_cell", - "thiserror", - "toml 0.5.10", + "toml_edit 0.21.0", ] [[package]] name = "proc-macro2" -version = "1.0.67" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] -[[package]] -name = "procfs" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943ca7f9f29bab5844ecd8fdb3992c5969b6622bb9609b9502fef9b4310e3f1f" -dependencies = [ - "bitflags 1.3.2", - "byteorder", - "chrono", - "flate2", - "hex", - "lazy_static", - "rustix", -] - [[package]] name = "proptest" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c003ac8c77cb07bb74f5f198bce836a689bcd5a42574612bf14d17bfd08c20e" +checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.4.1", + "bitflags 2.4.2", "lazy_static", "num-traits", "rand 0.8.5", "rand_chacha 0.3.1", "rand_xorshift", - "regex-syntax 0.7.5", + "regex-syntax 0.8.2", "rusty-fork", "tempfile", "unarray", @@ -3241,7 +3452,7 @@ checksum = "9cf16337405ca084e9c78985114633b6827711d22b9e6ef6c6c0d665eb3f0b6e" dependencies = [ "proc-macro2", "quote", - "syn 1.0.107", + "syn 1.0.109", ] [[package]] @@ -3268,9 +3479,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -3340,7 +3551,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.8", + "getrandom 0.2.12", ] [[package]] @@ -3385,26 +3596,35 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "redox_users" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" dependencies = [ - "getrandom 0.2.8", - "redox_syscall 0.2.16", + "getrandom 0.2.12", + "libredox", "thiserror", ] [[package]] name = "regex" -version = "1.10.2" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.3", + "regex-automata 0.4.5", "regex-syntax 0.8.2", ] @@ -3414,14 +3634,14 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" dependencies = [ - "regex-syntax 0.6.28", + "regex-syntax 0.6.29", ] [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick", "memchr", @@ -3430,9 +3650,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.28" +version = "0.6.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" @@ -3446,32 +3666,23 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - [[package]] name = "reqwest" -version = "0.11.22" +version = "0.11.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" +checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" dependencies = [ - "base64 0.21.4", + "base64 0.21.7", "bytes", "cookie 0.16.2", - "cookie_store 0.16.1", + "cookie_store 0.16.2", "encoding_rs", "futures-core", "futures-util", - "h2", - "http", - "http-body", - "hyper", + "h2 0.3.24", + "http 0.2.11", + "http-body 0.4.6", + "hyper 0.14.28", "hyper-tls", "ipnet", "js-sys", @@ -3522,50 +3733,78 @@ dependencies = [ [[package]] name = "ring" -version = "0.16.20" +version = "0.17.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" dependencies = [ "cc", + "getrandom 0.2.12", "libc", - "once_cell", - "spin 0.5.2", + "spin 0.9.8", "untrusted", - "web-sys", - "winapi", + "windows-sys 0.48.0", ] [[package]] name = "rpassword" -version = "7.2.0" +version = "7.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6678cf63ab3491898c0d021b493c94c9b221d91295294a2a5746eacbe5928322" +checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" dependencies = [ "libc", "rtoolbox", - "winapi", + "windows-sys 0.48.0", ] [[package]] name = "rpc-toolkit" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5353673ffd8265292281141560d2b851e4da49e83e2f5e255fd473736d45ee10" +checksum = "c48252a30abb9426a3239fa8dfd2c8dd2647bb24db0b6145db2df04ae53fe647" dependencies = [ "clap 3.2.25", "futures", - "hyper", + "hyper 0.14.28", "lazy_static", "openssl", "reqwest", - "rpc-toolkit-macro", + "rpc-toolkit-macro 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde", "serde_cbor 0.11.2", "serde_json", "thiserror", "tokio", "url", - "yajrc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "yajrc", +] + +[[package]] +name = "rpc-toolkit" +version = "0.2.3" +source = "git+https://github.com/Start9Labs/rpc-toolkit.git?branch=refactor/traits#9e989e23adb440bc72faa585b28e5aa2667a0a0d" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "clap 4.4.18", + "futures", + "http 1.0.0", + "http-body-util", + "imbl-value", + "itertools 0.12.0", + "lazy_format", + "lazy_static", + "openssl", + "pin-project", + "reqwest", + "rpc-toolkit-macro 0.2.2 (git+https://github.com/Start9Labs/rpc-toolkit.git?branch=refactor/traits)", + "serde", + "serde_json", + "thiserror", + "tokio", + "tokio-stream", + "url", + "yajrc", ] [[package]] @@ -3575,8 +3814,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8e4b9cb00baf2d61bcd35e98d67dcb760382a3b4540df7e63b38d053c8a7b8b" dependencies = [ "proc-macro2", - "rpc-toolkit-macro-internals", - "syn 1.0.107", + "rpc-toolkit-macro-internals 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.109", +] + +[[package]] +name = "rpc-toolkit-macro" +version = "0.2.2" +source = "git+https://github.com/Start9Labs/rpc-toolkit.git?branch=refactor/traits#9e989e23adb440bc72faa585b28e5aa2667a0a0d" +dependencies = [ + "proc-macro2", + "rpc-toolkit-macro-internals 0.2.2 (git+https://github.com/Start9Labs/rpc-toolkit.git?branch=refactor/traits)", + "syn 1.0.109", ] [[package]] @@ -3587,27 +3836,36 @@ checksum = "d3e2ce21b936feaecdab9c9a8e75b9dca64374ccc11951a58045ad6559b75f42" dependencies = [ "proc-macro2", "quote", - "syn 1.0.107", + "syn 1.0.109", +] + +[[package]] +name = "rpc-toolkit-macro-internals" +version = "0.2.2" +source = "git+https://github.com/Start9Labs/rpc-toolkit.git?branch=refactor/traits#9e989e23adb440bc72faa585b28e5aa2667a0a0d" +dependencies = [ + "itertools 0.12.0", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] name = "rsa" -version = "0.9.2" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ab43bb47d23c1a631b4b680199a45255dce26fa9ab2fa902581f624ff13e6a8" +checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" dependencies = [ - "byteorder", "const-oid", "digest 0.10.7", "num-bigint-dig", "num-integer", - "num-iter", "num-traits", "pkcs1", "pkcs8", "rand_core 0.6.4", "sha2 0.10.8", - "signature 2.0.0", + "signature 2.2.0", "spki", "subtle", "zeroize", @@ -3615,42 +3873,42 @@ dependencies = [ [[package]] name = "rtoolbox" -version = "0.0.1" +version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "034e22c514f5c0cb8a10ff341b9b048b5ceb21591f31c8f44c43b960f9b3524a" +checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e" dependencies = [ "libc", - "winapi", + "windows-sys 0.48.0", ] [[package]] name = "rust-argon2" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b50162d19404029c1ceca6f6980fe40d45c8b369f6f44446fa14bb39573b5bb9" +checksum = "a5885493fdf0be6cdff808d1533ce878d21cfa49c7086fa00c66355cd9141bfc" dependencies = [ - "base64 0.13.1", + "base64 0.21.7", "blake2b_simd", - "constant_time_eq 0.1.5", + "constant_time_eq", "crossbeam-utils", ] [[package]] name = "rust-argon2" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e71971821b3ae0e769e4a4328dbcb517607b434db7697e9aba17203ec14e46a" +checksum = "9d9848531d60c9cbbcf9d166c885316c24bc0e2a9d3eba0956bb6cbbd79bc6e8" dependencies = [ - "base64 0.21.4", + "base64 0.21.7", "blake2b_simd", - "constant_time_eq 0.3.0", + "constant_time_eq", ] [[package]] name = "rustc-demangle" -version = "0.1.21" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustc_version" @@ -3663,99 +3921,138 @@ dependencies = [ [[package]] name = "rustix" -version = "0.36.6" +version = "0.38.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4feacf7db682c6c329c4ede12649cd36ecab0f3be5b7d74e6a20304725db4549" +checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.2", "errno", - "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.42.0", + "windows-sys 0.52.0", ] [[package]] name = "rustls" -version = "0.21.7" +version = "0.21.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ - "log", "ring", - "rustls-webpki", + "rustls-webpki 0.101.7", "sct", ] +[[package]] +name = "rustls" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" +dependencies = [ + "log", + "ring", + "rustls-pki-types", + "rustls-webpki 0.102.1", + "subtle", + "zeroize", +] + [[package]] name = "rustls-pemfile" -version = "1.0.2" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-pki-types" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e9d979b3ce68192e42760c7810125eb6cf2ea10efae545a156063e61f314e2a" + +[[package]] +name = "rustls-webpki" +version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "base64 0.21.4", + "ring", + "untrusted", ] [[package]] name = "rustls-webpki" -version = "0.101.6" +version = "0.102.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe" +checksum = "ef4ca26037c909dedb327b48c3327d0ba91d3dd3c4e05dad328f210ffb68e95b" dependencies = [ "ring", + "rustls-pki-types", "untrusted", ] [[package]] name = "rustversion" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5583e89e108996506031660fe09baa5011b9dd0341b89029313006d1fb508d70" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "rusty-fork" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "rustyline-async" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca4447465ceb8c01c253cc81660b242547c58e4a59c85b13294a6e70de8b9e" dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", + "crossterm", + "futures-channel", + "futures-util", + "pin-project", + "thingbuf", + "thiserror", + "unicode-segmentation", + "unicode-width", ] [[package]] name = "ryu" -version = "1.0.12" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" [[package]] name = "schannel" -version = "0.1.21" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ - "windows-sys 0.42.0", + "windows-sys 0.52.0", ] [[package]] name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "scratch" -version = "1.0.3" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddccb15bcce173023b3fedd9436f882a0739b8dfb45e4f6b6002bee5929f61b2" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sct" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ "ring", "untrusted", @@ -3777,9 +4074,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.7.0" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ "bitflags 1.3.2", "core-foundation", @@ -3790,9 +4087,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.6.1" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", @@ -3800,18 +4097,18 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.152" +version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" +checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" dependencies = [ "serde_derive", ] @@ -3829,7 +4126,7 @@ dependencies = [ name = "serde_cbor" version = "0.11.1" dependencies = [ - "half", + "half 1.8.2", "serde", ] @@ -3839,47 +4136,57 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" dependencies = [ - "half", + "half 1.8.2", "serde", ] [[package]] name = "serde_derive" -version = "1.0.152" +version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" +checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" dependencies = [ "proc-macro2", "quote", - "syn 1.0.107", + "syn 2.0.48", ] [[package]] name = "serde_json" -version = "1.0.91" +version = "1.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883" +checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" dependencies = [ - "indexmap 1.9.2", - "itoa 1.0.5", + "indexmap 2.1.0", + "itoa", "ryu", "serde", ] +[[package]] +name = "serde_path_to_error" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebd154a240de39fdebcf5775d2675c204d7c13cf39a4c697be6493c8e734337c" +dependencies = [ + "itoa", + "serde", +] + [[package]] name = "serde_spanned" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" dependencies = [ "serde", ] [[package]] name = "serde_test" -version = "1.0.152" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3611210d2d67e3513204742004d6ac6f589e521861dabb0f649b070eea8bed9e" +checksum = "5a2f49ace1498612d14f7e0b8245519584db8299541dfe31a06374a828d620ab" dependencies = [ "serde", ] @@ -3891,22 +4198,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.5", + "itoa", "ryu", "serde", ] [[package]] name = "serde_with" -version = "3.4.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64cd236ccc1b7a29e7e2739f27c0b2dd199804abc4290e32f59f3b68d6405c23" +checksum = "f5c9fdb6b00a489875b22efd4b78fe2b363b72265cc5f6eb2e2b9ee270e6140c" dependencies = [ - "base64 0.21.4", + "base64 0.21.7", "chrono", "hex", - "indexmap 1.9.2", - "indexmap 2.0.2", + "indexmap 1.9.3", + "indexmap 2.1.0", "serde", "serde_json", "serde_with_macros", @@ -3915,14 +4222,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.4.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93634eb5f75a2323b16de4748022ac4297f9e76b6dced2be287a099f41b5e788" +checksum = "dbff351eb4b33600a2e138dfa0b10b65a238ea8ff8fb2387c422c5022a3e8298" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.48", ] [[package]] @@ -3931,7 +4238,7 @@ version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" dependencies = [ - "indexmap 1.9.2", + "indexmap 1.9.3", "ryu", "serde", "yaml-rust", @@ -3939,33 +4246,22 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.9.25" +version = "0.9.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a49e178e4452f45cb61d0cd8cebc1b0fafd3e41929e996cef79aa3aca91f574" +checksum = "b1bf28c79a99f70ee1f1d83d10c875d2e70618417fda01ad1785e027579d9d38" dependencies = [ - "indexmap 2.0.2", - "itoa 1.0.5", + "indexmap 2.1.0", + "itoa", "ryu", "serde", "unsafe-libyaml", ] -[[package]] -name = "sha-1" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - [[package]] name = "sha1" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", @@ -4010,18 +4306,45 @@ dependencies = [ [[package]] name = "sharded-slab" -version = "0.1.4" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ "lazy_static", ] +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + +[[package]] +name = "signal-hook" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-mio" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" +dependencies = [ + "libc", + "mio", + "signal-hook", +] + [[package]] name = "signal-hook-registry" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" dependencies = [ "libc", ] @@ -4034,9 +4357,9 @@ checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" [[package]] name = "signature" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fe458c98333f9c8152221191a77e2a44e8325d0193484af2e9421a53019e57d" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest 0.10.7", "rand_core 0.6.4", @@ -4055,40 +4378,30 @@ dependencies = [ [[package]] name = "siphasher" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "slab" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] [[package]] name = "smallvec" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" - -[[package]] -name = "socket2" -version = "0.4.7" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" -dependencies = [ - "libc", - "winapi", -] +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "socket2" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", "windows-sys 0.48.0", @@ -4111,9 +4424,9 @@ dependencies = [ [[package]] name = "spki" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", "der", @@ -4121,20 +4434,20 @@ dependencies = [ [[package]] name = "sqlformat" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c12bc9199d1db8234678b7051747c07f517cdcf019262d1847b94ec8b1aee3e" +checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" dependencies = [ - "itertools 0.10.5", + "itertools 0.12.0", "nom", "unicode_categories", ] [[package]] name = "sqlx" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e50c216e3624ec8e7ecd14c6a6a6370aad6ee5d8cfc3ab30b5162eeeef2ed33" +checksum = "dba03c279da73694ef99763320dea58b51095dfe87d001b1d4b5fe78ba8763cf" dependencies = [ "sqlx-core", "sqlx-macros", @@ -4145,11 +4458,11 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d6753e460c998bbd4cd8c6f0ed9a64346fcca0723d6e75e52fdc351c5d2169d" +checksum = "d84b0a3c3739e220d94b3239fd69fb1f74bc36e16643423bd99de3b43c21bfbd" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.7", "atoi", "byteorder", "bytes", @@ -4166,13 +4479,13 @@ dependencies = [ "futures-util", "hashlink", "hex", - "indexmap 2.0.2", + "indexmap 2.1.0", "log", "memchr", "once_cell", "paste", "percent-encoding", - "rustls", + "rustls 0.21.10", "rustls-pemfile", "serde", "serde_json", @@ -4189,23 +4502,24 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a793bb3ba331ec8359c1853bd39eed32cdd7baaf22c35ccf5c92a7e8d1189ec" +checksum = "89961c00dc4d7dffb7aee214964b065072bff69e36ddb9e2c107541f75e4f2a5" dependencies = [ "proc-macro2", "quote", "sqlx-core", "sqlx-macros-core", - "syn 1.0.107", + "syn 1.0.109", ] [[package]] name = "sqlx-macros-core" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a4ee1e104e00dedb6aa5ffdd1343107b0a4702e862a84320ee7cc74782d96fc" +checksum = "d0bd4519486723648186a08785143599760f7cc81c52334a55d6a83ea1e20841" dependencies = [ + "atomic-write-file", "dotenvy", "either", "heck", @@ -4220,7 +4534,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 1.0.107", + "syn 1.0.109", "tempfile", "tokio", "url", @@ -4228,13 +4542,13 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "864b869fdf56263f4c95c45483191ea0af340f9f3e3e7b4d57a61c7c87a970db" +checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4" dependencies = [ "atoi", - "base64 0.21.4", - "bitflags 2.4.1", + "base64 0.21.7", + "bitflags 2.4.2", "byteorder", "bytes", "chrono", @@ -4250,7 +4564,7 @@ dependencies = [ "hex", "hkdf", "hmac 0.12.1", - "itoa 1.0.5", + "itoa", "log", "md-5", "memchr", @@ -4271,13 +4585,13 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb7ae0e6a97fb3ba33b23ac2671a5ce6e3cabe003f451abd5a56e7951d975624" +checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24" dependencies = [ "atoi", - "base64 0.21.4", - "bitflags 2.4.1", + "base64 0.21.7", + "bitflags 2.4.2", "byteorder", "chrono", "crc", @@ -4291,7 +4605,7 @@ dependencies = [ "hkdf", "hmac 0.12.1", "home", - "itoa 1.0.5", + "itoa", "log", "md-5", "memchr", @@ -4311,9 +4625,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59dc83cf45d89c555a577694534fcd1b55c545a816c816ce51f20bbe56a4f3f" +checksum = "210976b7d948c7ba9fced8ca835b11cbb2d677c59c79de41ac0d397e14547490" dependencies = [ "atoi", "chrono", @@ -4330,6 +4644,7 @@ dependencies = [ "sqlx-core", "tracing", "url", + "urlencoding", ] [[package]] @@ -4353,9 +4668,9 @@ dependencies = [ "convert_case 0.6.0", "proc-macro2", "quote", - "regex-syntax 0.6.28", + "regex-syntax 0.6.29", "strsim 0.10.0", - "syn 2.0.37", + "syn 2.0.48", "unicode-width", ] @@ -4382,18 +4697,19 @@ dependencies = [ [[package]] name = "ssh-key" -version = "0.6.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2180b3bc4955efd5661a97658d3cf4c8107e0d132f619195afe9486c13cca313" +checksum = "01f8f4ea73476c0aa5d5e6a75ce1e8634e2c3f82005ef3bbed21547ac57f2bf7" dependencies = [ - "ed25519-dalek 2.0.0", + "ed25519-dalek 2.1.0", "p256", "p384", + "p521", "rand_core 0.6.4", "rsa", "sec1", "sha2 0.10.8", - "signature 2.0.0", + "signature 2.2.0", "ssh-cipher", "ssh-encoding", "subtle", @@ -4408,17 +4724,19 @@ dependencies = [ "async-compression", "async-stream", "async-trait", + "axum", + "axum-server", "base32", - "base64 0.21.4", + "base64 0.21.7", "base64ct", "basic-cookies", + "blake3", "bytes", "chrono", "ciborium", - "clap 3.2.25", + "clap 4.4.18", "color-eyre", "console", - "container-init", "cookie 0.18.0", "cookie_store 0.20.0", "current_platform", @@ -4426,7 +4744,7 @@ dependencies = [ "divrem", "ed25519 2.2.3", "ed25519-dalek 1.0.1", - "ed25519-dalek 2.0.0", + "ed25519-dalek 2.1.0", "emver", "fd-lock-rs", "futures", @@ -4434,22 +4752,23 @@ dependencies = [ "helpers", "hex", "hmac 0.12.1", - "http", - "hyper", - "hyper-ws-listener", + "http 1.0.0", "imbl", "imbl-value", "include_dir", - "indexmap 2.0.2", + "indexmap 2.1.0", "indicatif", + "integer-encoding", "ipnet", "iprange", "isocountry", - "itertools 0.11.0", + "itertools 0.12.0", "jaq-core", "jaq-std", "josekit", "jsonpath_lib", + "lazy_async_pool", + "lazy_format", "lazy_static", "libc", "log", @@ -4460,6 +4779,7 @@ dependencies = [ "nom", "num", "num_enum", + "once_cell", "openssh-keys", "openssl", "p256", @@ -4475,15 +4795,16 @@ dependencies = [ "reqwest", "reqwest_cookie_store", "rpassword", - "rpc-toolkit", - "rust-argon2 2.0.0", - "scopeguard", + "rpc-toolkit 0.2.3 (git+https://github.com/Start9Labs/rpc-toolkit.git?branch=refactor/traits)", + "rust-argon2 2.1.0", + "rustyline-async", "semver", "serde", "serde_json", "serde_with", - "serde_yaml 0.9.25", + "serde_yaml 0.9.30", "sha2 0.10.8", + "shell-words", "simple-logging", "sqlx", "sscanf", @@ -4498,7 +4819,7 @@ dependencies = [ "tokio-tar", "tokio-tungstenite", "tokio-util", - "toml 0.8.2", + "toml 0.8.8", "torut", "tracing", "tracing-error", @@ -4528,9 +4849,9 @@ dependencies = [ [[package]] name = "string_cache" -version = "0.8.4" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213494b7a2b503146286049378ce02b482200519accc31872ee8be91fa820a08" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" dependencies = [ "new_debug_unreachable", "once_cell", @@ -4541,10 +4862,11 @@ dependencies = [ [[package]] name = "stringprep" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1" +checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" dependencies = [ + "finl_unicode", "unicode-bidi", "unicode-normalization", ] @@ -4563,15 +4885,15 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "subtle" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "1.0.107" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", @@ -4580,15 +4902,21 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.37" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "synstructure" version = "0.12.6" @@ -4597,7 +4925,7 @@ checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ "proc-macro2", "quote", - "syn 1.0.107", + "syn 1.0.109", "unicode-xid", ] @@ -4636,21 +4964,20 @@ checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" dependencies = [ "filetime", "libc", - "xattr 1.0.1", + "xattr 1.3.1", ] [[package]] name = "tempfile" -version = "3.3.0" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" dependencies = [ "cfg-if", "fastrand", - "libc", - "redox_syscall 0.2.16", - "remove_dir_all", - "winapi", + "redox_syscall 0.4.1", + "rustix", + "windows-sys 0.52.0", ] [[package]] @@ -4688,24 +5015,34 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" +[[package]] +name = "thingbuf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4706f1bfb859af03f099ada2de3cea3e515843c2d3e93b7893f16d94a37f9415" +dependencies = [ + "parking_lot", + "pin-project", +] + [[package]] name = "thiserror" -version = "1.0.49" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.49" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.48", ] [[package]] @@ -4721,20 +5058,23 @@ dependencies = [ [[package]] name = "thread_local" -version = "1.1.4" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" dependencies = [ + "cfg-if", "once_cell", ] [[package]] name = "time" -version = "0.3.17" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" +checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" dependencies = [ - "itoa 1.0.5", + "deranged", + "itoa", + "powerfmt", "serde", "time-core", "time-macros", @@ -4742,15 +5082,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.6" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" dependencies = [ "time-core", ] @@ -4775,15 +5115,15 @@ dependencies = [ [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.33.0" +version = "1.35.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" +checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" dependencies = [ "backtrace", "bytes", @@ -4793,20 +5133,20 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.4", + "socket2", "tokio-macros", "windows-sys 0.48.0", ] [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.48", ] [[package]] @@ -4821,11 +5161,12 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.24.1" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" dependencies = [ - "rustls", + "rustls 0.22.2", + "rustls-pki-types", "tokio", ] @@ -4869,9 +5210,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.20.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" dependencies = [ "futures-util", "log", @@ -4883,9 +5224,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", @@ -4895,15 +5236,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "toml" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1333c76748e868a4d9d1017b5ab53171dfd095f70c712fdb4653a406547f598f" -dependencies = [ - "serde", -] - [[package]] name = "toml" version = "0.7.8" @@ -4918,21 +5250,21 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.2" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.20.2", + "toml_edit 0.21.0", ] [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" dependencies = [ "serde", ] @@ -4943,7 +5275,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.0.2", + "indexmap 2.1.0", "serde", "serde_spanned", "toml_datetime", @@ -4952,11 +5284,11 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.20.2" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" dependencies = [ - "indexmap 2.0.2", + "indexmap 2.1.0", "serde", "serde_spanned", "toml_datetime", @@ -4983,6 +5315,28 @@ dependencies = [ "tokio", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + [[package]] name = "tower-service" version = "0.3.2" @@ -4991,9 +5345,9 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.39" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2ef2af84856a50c1d430afce2fdded0a4ec7eda868db86409b4543df0797f9" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ "log", "pin-project-lite", @@ -5009,7 +5363,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.48", ] [[package]] @@ -5055,20 +5409,20 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ - "lazy_static", "log", + "once_cell", "tracing-core", ] [[package]] name = "tracing-subscriber" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "matchers", "nu-ansi-term", @@ -5093,9 +5447,9 @@ dependencies = [ [[package]] name = "trust-dns-proto" -version = "0.23.1" +version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "559ac980345f7f5020883dd3bcacf176355225e01916f8c2efecad7534f682c6" +checksum = "3119112651c157f4488931a01e586aa459736e9d6046d3bd9105ffb69352d374" dependencies = [ "async-trait", "cfg-if", @@ -5118,9 +5472,9 @@ dependencies = [ [[package]] name = "trust-dns-server" -version = "0.23.1" +version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4307166910ddf09378e651e9d4730c44900e9e0e1f157a6b955e48b539cd1d6" +checksum = "c540f73c2b2ec2f6c54eabd0900e7aafb747a820224b742f556e8faabb461bc7" dependencies = [ "async-trait", "bytes", @@ -5140,20 +5494,20 @@ dependencies = [ [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tungstenite" -version = "0.20.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" dependencies = [ "byteorder", "bytes", "data-encoding", - "http", + "http 1.0.0", "httparse", "log", "native-tls", @@ -5166,35 +5520,35 @@ dependencies = [ [[package]] name = "typed-builder" -version = "0.17.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c6a006a6d3d6a6f143fda41cf4d1ad35110080687628c9f2117bd3cc7924f3" +checksum = "444d8748011b93cb168770e8092458cb0f8854f931ff82fdf6ddfbd72a9c933e" dependencies = [ "typed-builder-macro", ] [[package]] name = "typed-builder-macro" -version = "0.17.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fa054ee5e2346187d631d2f1d1fd3b33676772d6d03a2d84e1c5213b31674ee" +checksum = "563b3b88238ec95680aef36bdece66896eaa7ce3c0f1b4f39d38fb2435261352" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn 2.0.48", ] [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" [[package]] name = "unarray" @@ -5204,24 +5558,24 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicase" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" dependencies = [ "version_check", ] [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" -version = "1.0.6" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" @@ -5234,15 +5588,15 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" [[package]] name = "unicode-width" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" [[package]] name = "unicode-xid" @@ -5258,24 +5612,24 @@ checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" [[package]] name = "unsafe-libyaml" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" +checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" [[package]] name = "untrusted" -version = "0.7.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", - "idna 0.4.0", + "idna 0.5.0", "percent-encoding", "serde", ] @@ -5292,13 +5646,19 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + [[package]] name = "uuid" -version = "1.4.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" +checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" dependencies = [ - "getrandom 0.2.8", + "getrandom 0.2.12", ] [[package]] @@ -5336,11 +5696,10 @@ dependencies = [ [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -5358,9 +5717,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.83" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -5368,24 +5727,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.83" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.107", + "syn 2.0.48", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.33" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" +checksum = "bde2032aeb86bdfaecc8b261eef3cba735cc426c1f3a3416d1e0791be95fc461" dependencies = [ "cfg-if", "js-sys", @@ -5395,9 +5754,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.83" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5405,22 +5764,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.83" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" dependencies = [ "proc-macro2", "quote", - "syn 1.0.107", + "syn 2.0.48", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.83" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" +checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" [[package]] name = "wasm-streams" @@ -5437,9 +5796,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.60" +version = "0.3.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" +checksum = "58cd2333b6e0be7a39605f0e255892fd7418a682d8da8fe042fe25128794d2ed" dependencies = [ "js-sys", "wasm-bindgen", @@ -5447,18 +5806,15 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.24.0" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888" -dependencies = [ - "rustls-webpki", -] +checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" [[package]] name = "whoami" -version = "1.3.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45dbc71f0cdca27dc261a9bd37ddec174e4a0af2b900b890f378460f745426e3" +checksum = "22fc3756b8a9133049b26c7f61ab35416c130e8c09b660f5b3958b446f52cc50" [[package]] name = "winapi" @@ -5478,9 +5834,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -5492,27 +5848,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.1", - "windows_aarch64_msvc 0.42.1", - "windows_i686_gnu 0.42.1", - "windows_i686_msvc 0.42.1", - "windows_x86_64_gnu 0.42.1", - "windows_x86_64_gnullvm 0.42.1", - "windows_x86_64_msvc 0.42.1", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" +name = "windows-core" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.42.1", + "windows-targets 0.52.0", ] [[package]] @@ -5525,18 +5866,12 @@ dependencies = [ ] [[package]] -name = "windows-targets" -version = "0.42.1" +name = "windows-sys" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows_aarch64_gnullvm 0.42.1", - "windows_aarch64_msvc 0.42.1", - "windows_i686_gnu 0.42.1", - "windows_i686_msvc 0.42.1", - "windows_x86_64_gnu 0.42.1", - "windows_x86_64_gnullvm 0.42.1", - "windows_x86_64_msvc 0.42.1", + "windows-targets 0.52.0", ] [[package]] @@ -5555,10 +5890,19 @@ dependencies = [ ] [[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.1" +name = "windows-targets" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", +] [[package]] name = "windows_aarch64_gnullvm" @@ -5567,10 +5911,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] -name = "windows_aarch64_msvc" -version = "0.42.1" +name = "windows_aarch64_gnullvm" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" [[package]] name = "windows_aarch64_msvc" @@ -5579,10 +5923,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] -name = "windows_i686_gnu" -version = "0.42.1" +name = "windows_aarch64_msvc" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" [[package]] name = "windows_i686_gnu" @@ -5591,10 +5935,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] -name = "windows_i686_msvc" -version = "0.42.1" +name = "windows_i686_gnu" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" [[package]] name = "windows_i686_msvc" @@ -5603,10 +5947,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] -name = "windows_x86_64_gnu" -version = "0.42.1" +name = "windows_i686_msvc" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" [[package]] name = "windows_x86_64_gnu" @@ -5615,10 +5959,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.1" +name = "windows_x86_64_gnu" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" [[package]] name = "windows_x86_64_gnullvm" @@ -5627,10 +5971,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] -name = "windows_x86_64_msvc" -version = "0.42.1" +name = "windows_x86_64_gnullvm" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" [[package]] name = "windows_x86_64_msvc" @@ -5638,11 +5982,17 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + [[package]] name = "winnow" -version = "0.5.17" +version = "0.5.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3b801d0e0a6726477cc207f60162da452f3a95adb368399bef20a946e06f65c" +checksum = "b7cf47b659b318dccbd69cc4797a39ae128f533dce7902a1096044d1967b9c16" dependencies = [ "memchr", ] @@ -5677,29 +6027,20 @@ dependencies = [ [[package]] name = "xattr" -version = "1.0.1" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4686009f71ff3e5c4dbcf1a282d0a44db3f021ba69350cd42086b3e5f1c6985" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ "libc", + "linux-raw-sys", + "rustix", ] [[package]] name = "yajrc" -version = "0.1.0" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b40687b4c165cb760e35730055c8840f36897e7c98099b2d3d66ba8cb624c79a" -dependencies = [ - "anyhow", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "yajrc" -version = "0.1.0" -source = "git+https://github.com/dr-bonez/yajrc.git?branch=develop#72a22f7ac2197d7a5cdce4be601cf20e5280eec5" +checksum = "ce7af47ad983c2f8357333ef87d859e66deb7eef4bf6f9e1ae7b5e99044a48bf" dependencies = [ "anyhow", "serde", @@ -5722,29 +6063,48 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f355ab62ebe30b758c1f4ab096a306722c4b7dbfb9d8c07d18c70d71a945588" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.7", "hashbrown 0.13.2", "lazy_static", "serde", ] +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.3.3" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 1.0.107", - "synstructure", + "syn 2.0.48", ] From eae75c13bb6d47286990810e9daee03ab61d8a23 Mon Sep 17 00:00:00 2001 From: Matt Hill Date: Sat, 17 Feb 2024 13:07:41 -0700 Subject: [PATCH 049/169] update network interfaces types --- sdk/lib/interfaces/Host.ts | 4 ++- sdk/lib/types.ts | 73 ++++++++++++++++++++++++++++++++++---- web/package-lock.json | 26 +++++++++++++- web/package.json | 5 +-- 4 files changed, 98 insertions(+), 10 deletions(-) diff --git a/sdk/lib/interfaces/Host.ts b/sdk/lib/interfaces/Host.ts index 190769daa..94f4777f7 100644 --- a/sdk/lib/interfaces/Host.ts +++ b/sdk/lib/interfaces/Host.ts @@ -87,6 +87,8 @@ type PortOptionsByKnownProtocol = } type PortOptionsByProtocol = PortOptionsByKnownProtocol | PortOptions +export type HostKind = "static" | "single" | "multi" + const hasStringProtocol = object({ protocol: string, }).test @@ -95,7 +97,7 @@ export class Host { constructor( readonly options: { effects: Effects - kind: "static" | "single" | "multi" + kind: HostKind id: string }, ) {} diff --git a/sdk/lib/types.ts b/sdk/lib/types.ts index 657c09c3d..72b2aa31c 100644 --- a/sdk/lib/types.ts +++ b/sdk/lib/types.ts @@ -1,9 +1,8 @@ export * as configTypes from "./config/configTypes" import { InputSpec } from "./config/configTypes" import { DependenciesReceipt } from "./config/setupConfig" -import { PortOptions } from "./interfaces/Host" +import { HostKind, PortOptions } from "./interfaces/Host" import { Daemons } from "./mainFn/Daemons" -import { Overlay } from "./util/Overlay" import { UrlString } from "./util/getNetworkInterface" import { NetworkInterfaceType, Signals } from "./util/utils" @@ -165,7 +164,7 @@ export type ActionMetadata = { group?: string } export declare const hostName: unique symbol -export type HostName = string & { [hostName]: never } +export type Hostname = string & { [hostName]: never } /** ${scheme}://${username}@${host}:${externalPort}${suffix} */ export type Address = { username: string | null @@ -174,6 +173,68 @@ export type Address = { suffix: string } +export type ListenKind = "onion" | "ip" + +export type ListenInfoBase = { + kind: ListenKind +} + +export type ListenInfoOnion = ListenInfoBase & { + kind: "onion" +} + +export type ListenInfoIp = ListenInfoBase & { + kind: "ip" + interfaceId: string +} + +export type ListenInfo = ListenInfoOnion | ListenInfoIp + +export type HostBase = { + id: string + kind: HostKind +} + +export type SingleHost = HostBase & { + kind: "single" | "static" +} & ( + | { + listen: null + hostname: null + } + | { + listen: ListenInfoOnion + hostname: string + } + | { + listen: ListenInfoIp + hostname: + | string + | { domain: string; subdomain: string | null; port: number } + } + ) + +export type MultiHost = HostBase & { + kind: "multi" +} & { + hostnames: + | { + listen: null + hostname: null + } + | { + listen: ListenInfoOnion + hostname: string + } + | { + listen: ListenInfoIp + hostname: ( + | string + | { domain: string; subdomain: string | null; port: number } + )[] + } +} + export type InterfaceId = string export type NetworkInterface = { @@ -189,7 +250,7 @@ export type NetworkInterface = { /** All URIs */ addresses: Address[] - /** The netowrk interface could be serveral types, something like ui, p2p, or network */ + /** The network interface could be several types, something like ui, p2p, or network */ type: NetworkInterfaceType } // prettier-ignore @@ -246,13 +307,13 @@ export type Effects = { hostId: string packageId?: string callback: () => void - }): Promise<[HostName]> + }): Promise<[Hostname]> getHostnames(options: { kind?: "multi" packageId?: string hostId: string callback: () => void - }): Promise<[HostName, ...HostName[]]> + }): Promise<[Hostname, ...Hostname[]]> // /** // * Run rsync between two volumes. This is used to backup data between volumes. diff --git a/web/package-lock.json b/web/package-lock.json index 160cb31bb..bcd2967f1 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -25,6 +25,7 @@ "@ng-web-apis/resize-observer": "^2.0.0", "@start9labs/argon2": "^0.2.2", "@start9labs/emver": "^0.1.5", + "@start9labs/start-sdk": "file:../sdk/dist", "@taiga-ui/addon-charts": "3.20.0", "@taiga-ui/cdk": "3.20.0", "@taiga-ui/core": "3.20.0", @@ -47,7 +48,7 @@ "mustache": "^4.2.0", "ng-qrcode": "^7.0.0", "node-jose": "^2.2.0", - "patch-db-client": "file: ../../../patch-db/client", + "patch-db-client": "file:../patch-db/client", "pbkdf2": "^3.1.2", "rxjs": "^7.8.1", "swiper": "^8.2.4", @@ -1970,6 +1971,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "../sdk/dist": { + "version": "0.4.0-rev0.lib0.rc8.beta7", + "license": "MIT", + "dependencies": { + "@iarna/toml": "^2.2.5", + "isomorphic-fetch": "^3.0.0", + "ts-matches": "^5.4.1", + "yaml": "^2.2.2" + }, + "devDependencies": { + "@types/jest": "^29.4.0", + "jest": "^29.4.3", + "prettier": "^3.2.5", + "ts-jest": "^29.0.5", + "ts-node": "^10.9.1", + "tsx": "^4.7.1", + "typescript": "^5.0.4" + } + }, "node_modules/@adobe/css-tools": { "version": "4.0.1", "dev": true, @@ -5291,6 +5311,10 @@ "version": "0.1.5", "license": "MIT" }, + "node_modules/@start9labs/start-sdk": { + "resolved": "../sdk/dist", + "link": true + }, "node_modules/@stencil/core": { "version": "2.18.0", "license": "MIT", diff --git a/web/package.json b/web/package.json index 7784543fe..e4ae2220f 100644 --- a/web/package.json +++ b/web/package.json @@ -12,7 +12,7 @@ "check:install-wiz": "tsc --project projects/install-wizard/tsconfig.json --noEmit --skipLibCheck", "check:setup": "tsc --project projects/setup-wizard/tsconfig.json --noEmit --skipLibCheck", "check:ui": "tsc --project projects/ui/tsconfig.json --noEmit --skipLibCheck", - "build:deps": "rm -rf .angular/cache && cd ../patch-db/client && npm ci && npm run build", + "build:deps": "rm -rf .angular/cache && (cd ../patch-db/client && npm ci && npm run build) && (cd ../sdk && make bundle)", "build:dui": "ng run diagnostic-ui:build", "build:install-wiz": "ng run install-wizard:build", "build:setup": "ng run setup-wizard:build", @@ -50,6 +50,7 @@ "@ng-web-apis/resize-observer": "^2.0.0", "@start9labs/argon2": "^0.2.2", "@start9labs/emver": "^0.1.5", + "@start9labs/start-sdk": "file:../sdk/dist", "@taiga-ui/addon-charts": "3.20.0", "@taiga-ui/cdk": "3.20.0", "@taiga-ui/core": "3.20.0", @@ -72,7 +73,7 @@ "mustache": "^4.2.0", "ng-qrcode": "^7.0.0", "node-jose": "^2.2.0", - "patch-db-client": "file: ../../../patch-db/client", + "patch-db-client": "file:../patch-db/client", "pbkdf2": "^3.1.2", "rxjs": "^7.8.1", "swiper": "^8.2.4", From d7bc7a2d38f92ade4d56ccdac6b15b0f985f8c04 Mon Sep 17 00:00:00 2001 From: Matt Hill Date: Mon, 19 Feb 2024 12:40:52 -0700 Subject: [PATCH 050/169] make service interfaces and hosts one to one --- .../src/Adapters/HostSystemStartOs.ts | 16 +- .../src/service/service_effect_handler.rs | 4 +- sdk/lib/config/setupConfig.ts | 2 +- sdk/lib/interfaces/Host.ts | 4 +- sdk/lib/interfaces/Origin.ts | 8 +- ...eBuilder.ts => ServiceInterfaceBuilder.ts} | 28 ++- sdk/lib/interfaces/setupInterfaces.ts | 4 +- sdk/lib/mainFn/index.ts | 2 +- sdk/lib/test/host.test.ts | 4 +- sdk/lib/test/util.getNetworkInterface.test.ts | 2 +- sdk/lib/test/utils.splitCommand.test.ts | 2 +- sdk/lib/types.ts | 126 +++++------ ...orkInterface.ts => getServiceInterface.ts} | 204 ++++++------------ ...kInterfaces.ts => getServiceInterfaces.ts} | 69 +++--- sdk/lib/util/utils.ts | 52 +++-- 15 files changed, 219 insertions(+), 308 deletions(-) rename sdk/lib/interfaces/{NetworkInterfaceBuilder.ts => ServiceInterfaceBuilder.ts} (68%) rename sdk/lib/util/{getNetworkInterface.ts => getServiceInterface.ts} (50%) rename sdk/lib/util/{getNetworkInterfaces.ts => getServiceInterfaces.ts} (55%) diff --git a/container-runtime/src/Adapters/HostSystemStartOs.ts b/container-runtime/src/Adapters/HostSystemStartOs.ts index b9dc7725a..e4177044e 100644 --- a/container-runtime/src/Adapters/HostSystemStartOs.ts +++ b/container-runtime/src/Adapters/HostSystemStartOs.ts @@ -106,11 +106,11 @@ export class HostSystemStartOs implements Effects { T.Effects["clearBindings"] > } - clearNetworkInterfaces( - ...[]: Parameters + clearServiceInterfaces( + ...[]: Parameters ) { - return this.rpcRound("clearNetworkInterfaces", null) as ReturnType< - T.Effects["clearNetworkInterfaces"] + return this.rpcRound("clearServiceInterfaces", null) as ReturnType< + T.Effects["clearServiceInterfaces"] > } createOverlayedImage(options: { imageId: string }): Promise { @@ -131,11 +131,11 @@ export class HostSystemStartOs implements Effects { T.Effects["exportAction"] > } - exportNetworkInterface( - ...[options]: Parameters + exportServiceInterface( + ...[options]: Parameters ) { - return this.rpcRound("exportNetworkInterface", options) as ReturnType< - T.Effects["exportNetworkInterface"] + return this.rpcRound("exportServiceInterface", options) as ReturnType< + T.Effects["exportServiceInterface"] > } exposeForDependents(...[options]: any) { diff --git a/core/startos/src/service/service_effect_handler.rs b/core/startos/src/service/service_effect_handler.rs index c015195e5..d5a4561f7 100644 --- a/core/startos/src/service/service_effect_handler.rs +++ b/core/startos/src/service/service_effect_handler.rs @@ -128,8 +128,8 @@ pub fn service_effect_handler() -> ParentHandler { // .subcommand("removeAddress",from_fn(remove_address)) // .subcommand("exportAction",from_fn(export_action)) // .subcommand("bind",from_fn(bind)) - // .subcommand("clearNetworkInterfaces",from_fn(clear_network_interfaces)) - // .subcommand("exportNetworkInterface",from_fn(export_network_interface)) + // .subcommand("clearServiceInterfaces",from_fn(clear_network_interfaces)) + // .subcommand("exportServiceInterface",from_fn(export_network_interface)) // .subcommand("clearBindings",from_fn(clear_bindings)) // .subcommand("getHostnames",from_fn(get_hostnames)) // .subcommand("getInterface",from_fn(get_interface)) diff --git a/sdk/lib/config/setupConfig.ts b/sdk/lib/config/setupConfig.ts index ee693dda2..95f9fd1ac 100644 --- a/sdk/lib/config/setupConfig.ts +++ b/sdk/lib/config/setupConfig.ts @@ -68,7 +68,7 @@ export function setupConfig< return { error: "Set config type error for config" } } await effects.clearBindings() - await effects.clearNetworkInterfaces() + await effects.clearServiceInterfaces() const { restart } = await write({ input: JSON.parse(JSON.stringify(input)), effects, diff --git a/sdk/lib/interfaces/Host.ts b/sdk/lib/interfaces/Host.ts index 94f4777f7..e767bd18b 100644 --- a/sdk/lib/interfaces/Host.ts +++ b/sdk/lib/interfaces/Host.ts @@ -55,7 +55,7 @@ type AddSslOptions = { addXForwardedHeaders?: boolean /** default: false */ } type Security = { secure: false; ssl: false } | { secure: true; ssl: boolean } -export type PortOptions = { +export type BindOptions = { scheme: Scheme preferredExternalPort: number addSsl: AddSslOptions | null @@ -85,7 +85,7 @@ type PortOptionsByKnownProtocol = scheme?: Scheme addSsl?: AddSslOptions | null } -type PortOptionsByProtocol = PortOptionsByKnownProtocol | PortOptions +type PortOptionsByProtocol = PortOptionsByKnownProtocol | BindOptions export type HostKind = "static" | "single" | "multi" diff --git a/sdk/lib/interfaces/Origin.ts b/sdk/lib/interfaces/Origin.ts index 1bab62811..053e76ae8 100644 --- a/sdk/lib/interfaces/Origin.ts +++ b/sdk/lib/interfaces/Origin.ts @@ -1,13 +1,13 @@ -import { Address } from "../types" -import { Host, PortOptions } from "./Host" +import { AddressInfo } from "../types" +import { Host, BindOptions } from "./Host" export class Origin { constructor( readonly host: T, - readonly options: PortOptions, + readonly options: BindOptions, ) {} - build({ username, path, search }: BuildOptions): Address { + build({ username, path, search }: BuildOptions): AddressInfo { const qpEntries = Object.entries(search) .map( ([key, val]) => `${encodeURIComponent(key)}=${encodeURIComponent(val)}`, diff --git a/sdk/lib/interfaces/NetworkInterfaceBuilder.ts b/sdk/lib/interfaces/ServiceInterfaceBuilder.ts similarity index 68% rename from sdk/lib/interfaces/NetworkInterfaceBuilder.ts rename to sdk/lib/interfaces/ServiceInterfaceBuilder.ts index 8f47dea93..241cf52dc 100644 --- a/sdk/lib/interfaces/NetworkInterfaceBuilder.ts +++ b/sdk/lib/interfaces/ServiceInterfaceBuilder.ts @@ -1,5 +1,5 @@ -import { Address, Effects } from "../types" -import { NetworkInterfaceType } from "../util/utils" +import { AddressInfo, Effects } from "../types" +import { ServiceInterfaceType } from "../util/utils" import { AddressReceipt } from "./AddressReceipt" import { Host } from "./Host" import { Origin } from "./Origin" @@ -15,7 +15,7 @@ import { Origin } from "./Origin" * @param options * @returns */ -export class NetworkInterfaceBuilder { +export class ServiceInterfaceBuilder { constructor( readonly options: { effects: Effects @@ -24,7 +24,7 @@ export class NetworkInterfaceBuilder { description: string hasPrimary: boolean disabled: boolean - type: NetworkInterfaceType + type: ServiceInterfaceType username: null | string path: string search: Record @@ -36,12 +36,12 @@ export class NetworkInterfaceBuilder { * * The returned addressReceipt serves as proof that the addresses were registered * - * @param addresses + * @param addressInfo * @returns */ - async export[]>( - origins: Origins, - ): Promise { + async export>( + origin: OriginForHost, + ): Promise { const { name, description, @@ -54,20 +54,18 @@ export class NetworkInterfaceBuilder { search, } = this.options - const addresses = Array.from(origins).map((o) => - o.build({ username, path, search, scheme: null }), - ) + const addressInfo = origin.build({ username, path, search, scheme: null }) - await this.options.effects.exportNetworkInterface({ - interfaceId: id, + await this.options.effects.exportServiceInterface({ + id, name, description, hasPrimary, disabled, - addresses, + addressInfo, type, }) - return addresses as Address[] & AddressReceipt + return addressInfo as AddressInfo & AddressReceipt } } diff --git a/sdk/lib/interfaces/setupInterfaces.ts b/sdk/lib/interfaces/setupInterfaces.ts index c99164e93..1514cabf3 100644 --- a/sdk/lib/interfaces/setupInterfaces.ts +++ b/sdk/lib/interfaces/setupInterfaces.ts @@ -1,10 +1,10 @@ import { Config } from "../config/builder/config" import { SDKManifest } from "../manifest/ManifestTypes" -import { Address, Effects } from "../types" +import { AddressInfo, Effects } from "../types" import { Utils } from "../util/utils" import { AddressReceipt } from "./AddressReceipt" -export type InterfacesReceipt = Array +export type InterfacesReceipt = Array export type SetInterfaces< Manifest extends SDKManifest, Store, diff --git a/sdk/lib/mainFn/index.ts b/sdk/lib/mainFn/index.ts index 7a6e11c6c..58f0228b2 100644 --- a/sdk/lib/mainFn/index.ts +++ b/sdk/lib/mainFn/index.ts @@ -2,7 +2,7 @@ import { Effects, ExpectedExports } from "../types" import { createMainUtils } from "../util" import { Utils, createUtils } from "../util/utils" import { Daemons } from "./Daemons" -import "../interfaces/NetworkInterfaceBuilder" +import "../interfaces/ServiceInterfaceBuilder" import "../interfaces/Origin" import "./Daemons" diff --git a/sdk/lib/test/host.test.ts b/sdk/lib/test/host.test.ts index 01ce6f3f2..880a8f1a1 100644 --- a/sdk/lib/test/host.test.ts +++ b/sdk/lib/test/host.test.ts @@ -1,4 +1,4 @@ -import { NetworkInterfaceBuilder } from "../interfaces/NetworkInterfaceBuilder" +import { ServiceInterfaceBuilder } from "../interfaces/ServiceInterfaceBuilder" import { Effects } from "../types" import { createUtils } from "../util" @@ -8,7 +8,7 @@ describe("host", () => { const utils = createUtils(effects) const foo = utils.host.multi("foo") const fooOrigin = await foo.bindPort(80, { protocol: "http" as const }) - const fooInterface = new NetworkInterfaceBuilder({ + const fooInterface = new ServiceInterfaceBuilder({ effects, name: "Foo", id: "foo", diff --git a/sdk/lib/test/util.getNetworkInterface.test.ts b/sdk/lib/test/util.getNetworkInterface.test.ts index bfddb4e8e..df7ac73c6 100644 --- a/sdk/lib/test/util.getNetworkInterface.test.ts +++ b/sdk/lib/test/util.getNetworkInterface.test.ts @@ -1,4 +1,4 @@ -import { getHostname } from "../util/getNetworkInterface" +import { getHostname } from "../util/getServiceInterface" describe("getHostname ", () => { const inputToExpected = [ diff --git a/sdk/lib/test/utils.splitCommand.test.ts b/sdk/lib/test/utils.splitCommand.test.ts index 71f214c07..aafddb177 100644 --- a/sdk/lib/test/utils.splitCommand.test.ts +++ b/sdk/lib/test/utils.splitCommand.test.ts @@ -1,4 +1,4 @@ -import { getHostname } from "../util/getNetworkInterface" +import { getHostname } from "../util/getServiceInterface" import { splitCommand } from "../util/splitCommand" describe("splitCommand ", () => { diff --git a/sdk/lib/types.ts b/sdk/lib/types.ts index 72b2aa31c..de03e34b2 100644 --- a/sdk/lib/types.ts +++ b/sdk/lib/types.ts @@ -1,10 +1,10 @@ export * as configTypes from "./config/configTypes" import { InputSpec } from "./config/configTypes" import { DependenciesReceipt } from "./config/setupConfig" -import { HostKind, PortOptions } from "./interfaces/Host" +import { HostKind, BindOptions } from "./interfaces/Host" import { Daemons } from "./mainFn/Daemons" -import { UrlString } from "./util/getNetworkInterface" -import { NetworkInterfaceType, Signals } from "./util/utils" +import { UrlString } from "./util/getServiceInterface" +import { ServiceInterfaceType, Signals } from "./util/utils" export type ExportedAction = (options: { effects: Effects @@ -165,80 +165,57 @@ export type ActionMetadata = { } export declare const hostName: unique symbol export type Hostname = string & { [hostName]: never } + /** ${scheme}://${username}@${host}:${externalPort}${suffix} */ -export type Address = { +export type AddressInfo = { username: string | null hostId: string - options: PortOptions + options: BindOptions suffix: string } -export type ListenKind = "onion" | "ip" - -export type ListenInfoBase = { - kind: ListenKind +export type HostnameInfoIp = { + kind: "ip" + networkInterfaceId: string + hostname: + | { + kind: "ipv4" | "ipv6" | "local" + value: string + port: number | null + sslPort: number | null + } + | { + kind: "domain" + domain: string + subdomain: string | null + port: number | null + sslPort: number | null + } } -export type ListenInfoOnion = ListenInfoBase & { +export type HostnameInfoOnion = { kind: "onion" + hostname: { value: string; port: number | null; sslPort: number | null } } -export type ListenInfoIp = ListenInfoBase & { - kind: "ip" - interfaceId: string -} +export type HostnameInfo = HostnameInfoIp | HostnameInfoOnion -export type ListenInfo = ListenInfoOnion | ListenInfoIp - -export type HostBase = { - id: string - kind: HostKind -} - -export type SingleHost = HostBase & { +export type SingleHost = { kind: "single" | "static" -} & ( - | { - listen: null - hostname: null - } - | { - listen: ListenInfoOnion - hostname: string - } - | { - listen: ListenInfoIp - hostname: - | string - | { domain: string; subdomain: string | null; port: number } - } - ) + hostname: HostnameInfo | null +} -export type MultiHost = HostBase & { +export type MultiHost = { kind: "multi" -} & { - hostnames: - | { - listen: null - hostname: null - } - | { - listen: ListenInfoOnion - hostname: string - } - | { - listen: ListenInfoIp - hostname: ( - | string - | { domain: string; subdomain: string | null; port: number } - )[] - } + hostnames: HostnameInfo[] } -export type InterfaceId = string +export type HostInfo = SingleHost | MultiHost + +export type ServiceInterfaceId = string -export type NetworkInterface = { - interfaceId: InterfaceId +export type ServiceInterface = { + id: ServiceInterfaceId /** The title of this field to be displayed */ name: string /** Human readable description, used as tooltip usually */ @@ -247,11 +224,10 @@ export type NetworkInterface = { hasPrimary: boolean /** Disabled interfaces do not serve, but they retain their metadata and addresses */ disabled: boolean - /** All URIs */ - addresses: Address[] - + /** URI Information */ + addressInfo: AddressInfo /** The network interface could be several types, something like ui, p2p, or network */ - type: NetworkInterfaceType + type: ServiceInterfaceType } // prettier-ignore export type ExposeAllServicePaths = @@ -299,7 +275,7 @@ export type Effects = { kind: "static" | "single" | "multi" id: string internalPort: number - } & PortOptions, + } & BindOptions, ): Promise /** Retrieves the current hostname(s) associated with a host id */ getHostnames(options: { @@ -307,13 +283,13 @@ export type Effects = { hostId: string packageId?: string callback: () => void - }): Promise<[Hostname]> + }): Promise<[] | [Hostname]> getHostnames(options: { kind?: "multi" packageId?: string hostId: string callback: () => void - }): Promise<[Hostname, ...Hostname[]]> + }): Promise // /** // * Run rsync between two volumes. This is used to backup data between volumes. @@ -357,7 +333,7 @@ export type Effects = { getIPHostname(): Promise /** Get the address for another service for tor interfaces */ getServiceTorHostname( - interfaceId: InterfaceId, + serviceInterfaceId: ServiceInterfaceId, packageId?: string, ): Promise /** Get the IP address of the container */ @@ -371,11 +347,11 @@ export type Effects = { ): Promise /** Removes all network interfaces */ - clearNetworkInterfaces(): Promise + clearServiceInterfaces(): Promise /** When we want to create a link in the front end interfaces, and example is * exposing a url to view a web service */ - exportNetworkInterface(options: NetworkInterface): Promise + exportServiceInterface(options: ServiceInterface): Promise exposeForDependents( options: ExposeServicePaths, @@ -388,11 +364,11 @@ export type Effects = { * * Note: any auth should be filtered out already */ - getInterface(options: { + getServiceInterface(options: { packageId?: PackageId - interfaceId: InterfaceId + serviceInterfaceId: ServiceInterfaceId callback: () => void - }): Promise + }): Promise /** * The user sets the primary url for a interface @@ -400,7 +376,7 @@ export type Effects = { */ getPrimaryUrl(options: { packageId?: PackageId - interfaceId: InterfaceId + serviceInterfaceId: ServiceInterfaceId callback: () => void }): Promise @@ -410,10 +386,10 @@ export type Effects = { * * Note: any auth should be filtered out already */ - listInterface(options: { + listServiceInterfaces(options: { packageId?: PackageId callback: () => void - }): Promise + }): Promise /** *Remove an address that was exported. Used problably during main or during setConfig. diff --git a/sdk/lib/util/getNetworkInterface.ts b/sdk/lib/util/getServiceInterface.ts similarity index 50% rename from sdk/lib/util/getNetworkInterface.ts rename to sdk/lib/util/getServiceInterface.ts index 91c401429..69083c66f 100644 --- a/sdk/lib/util/getNetworkInterface.ts +++ b/sdk/lib/util/getServiceInterface.ts @@ -1,28 +1,28 @@ -import { Address, Effects, HostName, NetworkInterface } from "../types" +import { AddressInfo, Effects, Hostname, ServiceInterface } from "../types" import * as regexes from "./regexes" -import { NetworkInterfaceType } from "./utils" +import { ServiceInterfaceType } from "./utils" export type UrlString = string export type HostId = string const getHostnameRegex = /^(\w+:\/\/)?([^\/\:]+)(:\d{1,3})?(\/)?/ -export const getHostname = (url: string): HostName | null => { +export const getHostname = (url: string): Hostname | null => { const founds = url.match(getHostnameRegex)?.[2] if (!founds) return null const parts = founds.split("@") - const last = parts[parts.length - 1] as HostName | null + const last = parts[parts.length - 1] as Hostname | null return last } export type Filled = { - hostnames: HostName[] - onionHostnames: HostName[] - localHostnames: HostName[] - ipHostnames: HostName[] - ipv4Hostnames: HostName[] - ipv6Hostnames: HostName[] - nonIpHostnames: HostName[] - allHostnames: HostName[] + hostnames: Hostname[] + onionHostnames: Hostname[] + localHostnames: Hostname[] + ipHostnames: Hostname[] + ipv4Hostnames: Hostname[] + ipv6Hostnames: Hostname[] + nonIpHostnames: Hostname[] + allHostnames: Hostname[] urls: UrlString[] onionUrls: UrlString[] @@ -33,9 +33,9 @@ export type Filled = { nonIpUrls: UrlString[] allUrls: UrlString[] } -export type FilledAddress = Address & Filled -export type NetworkInterfaceFilled = { - interfaceId: string +export type FilledAddressInfo = AddressInfo & Filled +export type ServiceInterfaceFilled = { + id: string /** The title of this field to be displayed */ name: string /** Human readable description, used as tooltip usually */ @@ -44,15 +44,15 @@ export type NetworkInterfaceFilled = { hasPrimary: boolean /** Whether or not the interface disabled */ disabled: boolean - /** All URIs */ - addresses: FilledAddress[] - - /** Indicates if we are a ui/ p2p/ api/ other for the kind of interface that this is representing */ - type: NetworkInterfaceType - - primaryHostname: HostName | null + /** URI information */ + addressInfo: FilledAddressInfo + /** Indicates if we are a ui/p2p/api for the kind of interface that this is representing */ + type: ServiceInterfaceType + /** The primary hostname for the service, as chosen by the user */ + primaryHostname: Hostname | null + /** The primary URL for the service, as chosen by the user */ primaryUrl: UrlString | null -} & Filled +} const either = (...args: ((a: A) => boolean)[]) => (a: A) => @@ -63,8 +63,8 @@ const negate = !fn(a) const unique = (values: A[]) => Array.from(new Set(values)) const addressHostToUrl = ( - { options, username, suffix }: Address, - host: HostName, + { options, username, suffix }: AddressInfo, + host: Hostname, ): UrlString => { const scheme = host.endsWith(".onion") ? options.scheme @@ -76,15 +76,12 @@ const addressHostToUrl = ( }${host}${suffix}` } export const filledAddress = ( - mapHostnames: { - [hostId: string]: HostName[] - }, - address: Address, -): FilledAddress => { - const toUrl = addressHostToUrl.bind(null, address) - const hostnames = mapHostnames[address.hostId] ?? [] + hostnames: Hostname[], + addressInfo: AddressInfo, +): FilledAddressInfo => { + const toUrl = addressHostToUrl.bind(null, addressInfo) return { - ...address, + ...addressInfo, hostnames, get onionHostnames() { return hostnames.filter(regexes.torHostname.test) @@ -138,131 +135,60 @@ export const filledAddress = ( } } -export const networkInterfaceFilled = ( - interfaceValue: NetworkInterface, - primaryUrl: UrlString | null, - addresses: FilledAddress[], -): NetworkInterfaceFilled => { - return { - ...interfaceValue, - addresses, - get hostnames() { - return unique(addresses.flatMap((x) => x.hostnames)) - }, - get onionHostnames() { - return unique(addresses.flatMap((x) => x.onionHostnames)) - }, - get localHostnames() { - return unique(addresses.flatMap((x) => x.localHostnames)) - }, - get ipHostnames() { - return unique(addresses.flatMap((x) => x.ipHostnames)) - }, - get ipv4Hostnames() { - return unique(addresses.flatMap((x) => x.ipv4Hostnames)) - }, - get ipv6Hostnames() { - return unique(addresses.flatMap((x) => x.ipv6Hostnames)) - }, - get nonIpHostnames() { - return unique(addresses.flatMap((x) => x.nonIpHostnames)) - }, - get allHostnames() { - return unique(addresses.flatMap((x) => x.allHostnames)) - }, - get primaryHostname() { - if (primaryUrl == null) return null - return getHostname(primaryUrl) - }, - get urls() { - return unique(addresses.flatMap((x) => x.urls)) - }, - get onionUrls() { - return unique(addresses.flatMap((x) => x.onionUrls)) - }, - get localUrls() { - return unique(addresses.flatMap((x) => x.localUrls)) - }, - get ipUrls() { - return unique(addresses.flatMap((x) => x.ipUrls)) - }, - get ipv4Urls() { - return unique(addresses.flatMap((x) => x.ipv4Urls)) - }, - get ipv6Urls() { - return unique(addresses.flatMap((x) => x.ipv6Urls)) - }, - get nonIpUrls() { - return unique(addresses.flatMap((x) => x.nonIpUrls)) - }, - get allUrls() { - return unique(addresses.flatMap((x) => x.allUrls)) - }, - primaryUrl, - } -} const makeInterfaceFilled = async ({ effects, - interfaceId, + id, packageId, callback, }: { effects: Effects - interfaceId: string + id: string packageId: string | undefined callback: () => void }) => { - const interfaceValue = await effects.getInterface({ - interfaceId, + const serviceInterfaceValue = await effects.getServiceInterface({ + serviceInterfaceId: id, + packageId, + callback, + }) + const hostIdRecord = await effects.getHostnames({ packageId, + hostId: serviceInterfaceValue.addressInfo.hostId, callback, }) - const hostIdsRecord = Promise.all( - unique(interfaceValue.addresses.map((x) => x.hostId)).map( - async (hostId) => - [ - hostId, - await effects.getHostnames({ - packageId, - hostId, - callback, - }), - ] as const, - ), - ) - const primaryUrl = effects.getPrimaryUrl({ - interfaceId, + const primaryUrl = await effects.getPrimaryUrl({ + serviceInterfaceId: id, packageId, callback, }) - const fillAddress = filledAddress.bind( - null, - Object.fromEntries(await hostIdsRecord), - ) - const interfaceFilled: NetworkInterfaceFilled = networkInterfaceFilled( - interfaceValue, - await primaryUrl, - interfaceValue.addresses.map(fillAddress), - ) + const interfaceFilled: ServiceInterfaceFilled = { + ...serviceInterfaceValue, + primaryUrl: primaryUrl, + addressInfo: filledAddress(hostIdRecord, serviceInterfaceValue.addressInfo), + get primaryHostname() { + if (primaryUrl == null) return null + return getHostname(primaryUrl) + }, + } return interfaceFilled } -export class GetNetworkInterface { +export class GetServiceInterface { constructor( readonly effects: Effects, - readonly opts: { interfaceId: string; packageId?: string }, + readonly opts: { id: string; packageId?: string }, ) {} /** * Returns the value of Store at the provided path. Restart the service if the value changes */ async const() { - const { interfaceId, packageId } = this.opts + const { id, packageId } = this.opts const callback = this.effects.restart - const interfaceFilled: NetworkInterfaceFilled = await makeInterfaceFilled({ + const interfaceFilled: ServiceInterfaceFilled = await makeInterfaceFilled({ effects: this.effects, - interfaceId, + id, packageId, callback, }) @@ -270,14 +196,14 @@ export class GetNetworkInterface { return interfaceFilled } /** - * Returns the value of NetworkInterfacesFilled at the provided path. Does nothing if the value changes + * Returns the value of ServiceInterfacesFilled at the provided path. Does nothing if the value changes */ async once() { - const { interfaceId, packageId } = this.opts + const { id, packageId } = this.opts const callback = () => {} - const interfaceFilled: NetworkInterfaceFilled = await makeInterfaceFilled({ + const interfaceFilled: ServiceInterfaceFilled = await makeInterfaceFilled({ effects: this.effects, - interfaceId, + id, packageId, callback, }) @@ -286,10 +212,10 @@ export class GetNetworkInterface { } /** - * Watches the value of NetworkInterfacesFilled at the provided path. Takes a custom callback function to run whenever the value changes + * Watches the value of ServiceInterfacesFilled at the provided path. Takes a custom callback function to run whenever the value changes */ async *watch() { - const { interfaceId, packageId } = this.opts + const { id, packageId } = this.opts while (true) { let callback: () => void = () => {} const waitForNext = new Promise((resolve) => { @@ -297,7 +223,7 @@ export class GetNetworkInterface { }) yield await makeInterfaceFilled({ effects: this.effects, - interfaceId, + id, packageId, callback, }) @@ -305,9 +231,9 @@ export class GetNetworkInterface { } } } -export function getNetworkInterface( +export function getServiceInterface( effects: Effects, - opts: { interfaceId: string; packageId?: string }, + opts: { id: string; packageId?: string }, ) { - return new GetNetworkInterface(effects, opts) + return new GetServiceInterface(effects, opts) } diff --git a/sdk/lib/util/getNetworkInterfaces.ts b/sdk/lib/util/getServiceInterfaces.ts similarity index 55% rename from sdk/lib/util/getNetworkInterfaces.ts rename to sdk/lib/util/getServiceInterfaces.ts index 625b761f5..9c45fd002 100644 --- a/sdk/lib/util/getNetworkInterfaces.ts +++ b/sdk/lib/util/getServiceInterfaces.ts @@ -1,10 +1,9 @@ -import { Effects, HostName } from "../types" +import { Effects } from "../types" import { - HostId, - NetworkInterfaceFilled, + ServiceInterfaceFilled, filledAddress, - networkInterfaceFilled, -} from "./getNetworkInterface" + getHostname, +} from "./getServiceInterface" const makeManyInterfaceFilled = async ({ effects, @@ -15,7 +14,7 @@ const makeManyInterfaceFilled = async ({ packageId: string | undefined callback: () => void }) => { - const interfaceValues = await effects.listInterface({ + const serviceInterfaceValues = await effects.listServiceInterfaces({ packageId, callback, }) @@ -23,7 +22,9 @@ const makeManyInterfaceFilled = async ({ await Promise.all( Array.from( new Set( - interfaceValues.flatMap((x) => x.addresses).map((x) => x.hostId), + serviceInterfaceValues + .flatMap((x) => x.addressInfo) + .map((x) => x.hostId), ), ).map( async (hostId) => @@ -38,25 +39,37 @@ const makeManyInterfaceFilled = async ({ ), ), ) - const fillAddress = filledAddress.bind(null, hostIdsRecord) - const interfacesFilled: NetworkInterfaceFilled[] = await Promise.all( - interfaceValues.map(async (interfaceValue) => - networkInterfaceFilled( - interfaceValue, - await effects.getPrimaryUrl({ - interfaceId: interfaceValue.interfaceId, - packageId, - callback, - }), - interfaceValue.addresses.map(fillAddress), - ), - ), + const serviceInterfacesFilled: ServiceInterfaceFilled[] = await Promise.all( + serviceInterfaceValues.map(async (serviceInterfaceValue) => { + const hostIdRecord = await effects.getHostnames({ + packageId, + hostId: serviceInterfaceValue.addressInfo.hostId, + callback, + }) + const primaryUrl = await effects.getPrimaryUrl({ + serviceInterfaceId: serviceInterfaceValue.id, + packageId, + callback, + }) + return { + ...serviceInterfaceValue, + primaryUrl: primaryUrl, + addressInfo: filledAddress( + hostIdRecord, + serviceInterfaceValue.addressInfo, + ), + get primaryHostname() { + if (primaryUrl == null) return null + return getHostname(primaryUrl) + }, + } + }), ) - return interfacesFilled + return serviceInterfacesFilled } -export class GetNetworkInterfaces { +export class GetServiceInterfaces { constructor( readonly effects: Effects, readonly opts: { packageId?: string }, @@ -68,7 +81,7 @@ export class GetNetworkInterfaces { async const() { const { packageId } = this.opts const callback = this.effects.restart - const interfaceFilled: NetworkInterfaceFilled[] = + const interfaceFilled: ServiceInterfaceFilled[] = await makeManyInterfaceFilled({ effects: this.effects, packageId, @@ -78,12 +91,12 @@ export class GetNetworkInterfaces { return interfaceFilled } /** - * Returns the value of NetworkInterfacesFilled at the provided path. Does nothing if the value changes + * Returns the value of ServiceInterfacesFilled at the provided path. Does nothing if the value changes */ async once() { const { packageId } = this.opts const callback = () => {} - const interfaceFilled: NetworkInterfaceFilled[] = + const interfaceFilled: ServiceInterfaceFilled[] = await makeManyInterfaceFilled({ effects: this.effects, packageId, @@ -94,7 +107,7 @@ export class GetNetworkInterfaces { } /** - * Watches the value of NetworkInterfacesFilled at the provided path. Takes a custom callback function to run whenever the value changes + * Watches the value of ServiceInterfacesFilled at the provided path. Takes a custom callback function to run whenever the value changes */ async *watch() { const { packageId } = this.opts @@ -112,9 +125,9 @@ export class GetNetworkInterfaces { } } } -export function getNetworkInterfaces( +export function getServiceInterfaces( effects: Effects, opts: { packageId?: string }, ) { - return new GetNetworkInterfaces(effects, opts) + return new GetServiceInterfaces(effects, opts) } diff --git a/sdk/lib/util/utils.ts b/sdk/lib/util/utils.ts index 532ff12a2..8f28191e4 100644 --- a/sdk/lib/util/utils.ts +++ b/sdk/lib/util/utils.ts @@ -9,13 +9,11 @@ import { Effects, EnsureStorePath, ExtractStore, - InterfaceId, + ServiceInterfaceId, PackageId, ValidIfNoStupidEscape, } from "../types" import { GetSystemSmtp } from "./GetSystemSmtp" -import { DefaultString } from "../config/configTypes" -import { getDefaultString } from "./getDefaultString" import { GetStore, getStore } from "../store/getStore" import { MountDependenciesOut, @@ -27,13 +25,13 @@ import { NamedPath, Path, } from "../dependency/setupDependencyMounts" -import { Host, MultiHost, SingleHost, StaticHost } from "../interfaces/Host" -import { NetworkInterfaceBuilder } from "../interfaces/NetworkInterfaceBuilder" -import { GetNetworkInterface, getNetworkInterface } from "./getNetworkInterface" +import { MultiHost, SingleHost, StaticHost } from "../interfaces/Host" +import { ServiceInterfaceBuilder } from "../interfaces/ServiceInterfaceBuilder" +import { GetServiceInterface, getServiceInterface } from "./getServiceInterface" import { - GetNetworkInterfaces, - getNetworkInterfaces, -} from "./getNetworkInterfaces" + GetServiceInterfaces, + getServiceInterfaces, +} from "./getServiceInterfaces" import * as CP from "node:child_process" import { promisify } from "node:util" import { splitCommand } from "./splitCommand" @@ -50,7 +48,7 @@ const childProcess = { execFile: promisify(CP.execFile), } -export type NetworkInterfaceType = "ui" | "p2p" | "api" | "other" +export type ServiceInterfaceType = "ui" | "p2p" | "api" export type Utils< Manifest extends SDKManifest, @@ -81,11 +79,11 @@ export type Utils< description: string hasPrimary: boolean disabled: boolean - type: NetworkInterfaceType + type: ServiceInterfaceType username: null | string path: string search: Record - }) => NetworkInterfaceBuilder + }) => ServiceInterfaceBuilder getSystemSmtp: () => GetSystemSmtp & WrapperOverWrite host: { static: (id: string) => StaticHost @@ -101,16 +99,16 @@ export type Utils< >( value: In, ) => Promise> - networkInterface: { - getOwn: (interfaceId: InterfaceId) => GetNetworkInterface & WrapperOverWrite + serviceInterface: { + getOwn: (id: ServiceInterfaceId) => GetServiceInterface & WrapperOverWrite get: (opts: { - interfaceId: InterfaceId + id: ServiceInterfaceId packageId: PackageId - }) => GetNetworkInterface & WrapperOverWrite - getAllOwn: () => GetNetworkInterfaces & WrapperOverWrite + }) => GetServiceInterface & WrapperOverWrite + getAllOwn: () => GetServiceInterfaces & WrapperOverWrite getAll: (opts: { packageId: PackageId - }) => GetNetworkInterfaces & WrapperOverWrite + }) => GetServiceInterfaces & WrapperOverWrite } nullIfEmpty: typeof nullIfEmpty runCommand: ( @@ -156,11 +154,11 @@ export const createUtils = < description: string hasPrimary: boolean disabled: boolean - type: NetworkInterfaceType + type: ServiceInterfaceType username: null | string path: string search: Record - }) => new NetworkInterfaceBuilder({ ...options, effects }), + }) => new ServiceInterfaceBuilder({ ...options, effects }), childProcess, getSystemSmtp: () => new GetSystemSmtp(effects) as GetSystemSmtp & WrapperOverWrite, @@ -172,18 +170,18 @@ export const createUtils = < }, nullIfEmpty, - networkInterface: { - getOwn: (interfaceId: InterfaceId) => - getNetworkInterface(effects, { interfaceId }) as GetNetworkInterface & + serviceInterface: { + getOwn: (id: ServiceInterfaceId) => + getServiceInterface(effects, { id }) as GetServiceInterface & WrapperOverWrite, - get: (opts: { interfaceId: InterfaceId; packageId: PackageId }) => - getNetworkInterface(effects, opts) as GetNetworkInterface & + get: (opts: { id: ServiceInterfaceId; packageId: PackageId }) => + getServiceInterface(effects, opts) as GetServiceInterface & WrapperOverWrite, getAllOwn: () => - getNetworkInterfaces(effects, {}) as GetNetworkInterfaces & + getServiceInterfaces(effects, {}) as GetServiceInterfaces & WrapperOverWrite, getAll: (opts: { packageId: PackageId }) => - getNetworkInterfaces(effects, opts) as GetNetworkInterfaces & + getServiceInterfaces(effects, opts) as GetServiceInterfaces & WrapperOverWrite, }, store: { From 7b41b295b767ad0b5cc9b411fee223a0d76a60e7 Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Thu, 22 Feb 2024 17:58:01 +0400 Subject: [PATCH 051/169] chore: refactor install and setup wizards (#2561) * chore: refactor install and setup wizards * chore: return tui-root --- web/angular.json | 11 +- web/package-lock.json | 26 +- web/package.json | 2 +- .../src/app/app-routing.module.ts | 22 -- .../install-wizard/src/app/app.component.html | 62 ++- .../install-wizard/src/app/app.component.scss | 61 ++- .../install-wizard/src/app/app.component.ts | 70 +++- .../install-wizard/src/app/app.module.ts | 45 ++- .../install-wizard/src/app/app.utils.ts | 27 ++ .../src/app/pages/home/home.module.ts | 32 -- .../src/app/pages/home/home.page.html | 107 ----- .../src/app/pages/home/home.page.scss | 28 -- .../src/app/pages/home/home.page.ts | 137 ------- .../src/app/services/{api => }/api.service.ts | 0 .../services/{api => }/live-api.service.ts | 0 .../services/{api => }/mock-api.service.ts | 0 web/projects/install-wizard/src/styles.scss | 59 --- .../src/pages/list/search/search.module.ts | 11 +- .../show/additional/additional.module.ts | 16 +- .../show/dependencies/dependencies.module.ts | 10 +- .../src/app/app-routing.module.ts | 56 --- .../setup-wizard/src/app/app.component.html | 6 - .../setup-wizard/src/app/app.component.scss | 8 - .../setup-wizard/src/app/app.component.ts | 29 +- .../setup-wizard/src/app/app.module.ts | 55 +-- .../setup-wizard/src/app/app.routes.ts | 33 ++ .../src/app/components/cifs.component.ts | 195 ++++++++++ .../app/components/documentation.component.ts | 145 +++++++ .../src/app/components/matrix.component.ts | 79 ++++ .../src/app/components/password.component.ts | 128 ++++++ .../src/app/components/recover.component.ts | 44 +++ .../modals/cifs-modal/cifs-modal.module.ts | 26 -- .../modals/cifs-modal/cifs-modal.page.html | 39 -- .../modals/cifs-modal/cifs-modal.page.scss | 3 - .../app/modals/cifs-modal/cifs-modal.page.ts | 117 ------ .../app/modals/password/password.module.ts | 20 - .../app/modals/password/password.page.html | 35 -- .../src/app/modals/password/password.page.ts | 77 ---- .../setup-wizard/src/app/pages/attach.page.ts | 108 ++++++ .../app/pages/attach/attach-routing.module.ts | 16 - .../src/app/pages/attach/attach.module.ts | 21 - .../src/app/pages/attach/attach.page.html | 67 ---- .../src/app/pages/attach/attach.page.scss | 0 .../src/app/pages/attach/attach.page.ts | 71 ---- .../pages/embassy/embassy-routing.module.ts | 16 - .../src/app/pages/embassy/embassy.module.ts | 25 -- .../src/app/pages/embassy/embassy.page.html | 87 ----- .../src/app/pages/embassy/embassy.page.scss | 0 .../setup-wizard/src/app/pages/home.page.ts | 144 +++++++ .../src/app/pages/home/home-routing.module.ts | 16 - .../src/app/pages/home/home.module.ts | 21 - .../src/app/pages/home/home.page.html | 129 ------- .../src/app/pages/home/home.page.scss | 13 - .../src/app/pages/home/home.page.ts | 53 --- .../src/app/pages/loading.page.ts | 20 + .../src/app/pages/loading/loading.module.ts | 17 - .../src/app/pages/loading/loading.page.html | 5 - .../src/app/pages/loading/loading.page.ts | 13 - .../src/app/pages/recover.page.ts | 163 ++++++++ .../pages/recover/drive-status.component.html | 14 - .../pages/recover/recover-routing.module.ts | 16 - .../src/app/pages/recover/recover.module.ts | 23 -- .../src/app/pages/recover/recover.page.html | 97 ----- .../src/app/pages/recover/recover.page.scss | 5 - .../src/app/pages/recover/recover.page.ts | 137 ------- .../embassy.page.ts => storage.page.ts} | 102 +++-- .../src/app/pages/success.page.ts | 175 +++++++++ .../download-doc/download-doc.component.html | 129 ------- .../download-doc/download-doc.component.ts | 14 - .../pages/success/success-routing.module.ts | 16 - .../src/app/pages/success/success.module.ts | 24 -- .../src/app/pages/success/success.page.html | 102 ----- .../src/app/pages/success/success.page.scss | 183 --------- .../src/app/pages/success/success.page.ts | 143 ------- .../src/app/pages/transfer.page.ts | 105 +++++ .../pages/transfer/transfer-routing.module.ts | 16 - .../src/app/pages/transfer/transfer.module.ts | 21 - .../src/app/pages/transfer/transfer.page.html | 61 --- .../src/app/pages/transfer/transfer.page.scss | 0 .../src/app/pages/transfer/transfer.page.ts | 68 ---- .../src/app/services/{api => }/api.service.ts | 0 .../services/{api => }/live-api.service.ts | 6 +- .../services/{api => }/mock-api.service.ts | 2 +- .../src/app/services/state.service.ts | 9 +- web/projects/setup-wizard/src/styles.scss | 364 +++--------------- web/projects/shared/package.json | 2 +- .../shared/src/components/drive.component.ts | 29 ++ .../initializing/initializing.component.html | 15 - .../initializing/initializing.component.scss | 33 -- .../initializing/initializing.component.ts | 62 ++- .../initializing/initializing.module.ts | 14 - .../text-spinner/text-spinner.component.html | 8 - .../text-spinner.component.module.ts | 11 - .../text-spinner/text-spinner.component.scss | 3 - .../text-spinner/text-spinner.component.ts | 10 - .../directives/responsive-col.directive.ts | 121 ------ .../shared/src/pipes/guid/guid.module.ts | 8 - .../shared/src/pipes/guid/guid.pipe.ts | 11 - web/projects/shared/src/public-api.ts | 8 +- web/projects/shared/src/util/to-guid.ts | 5 + web/projects/ui/src/app/app.component.html | 3 - web/projects/ui/src/app/app.module.ts | 2 - .../ui/src/app/apps/loading/loading.page.ts | 4 +- .../components/header/snek.component.ts | 6 +- .../src/app/common/logs/logs.component.html | 94 ----- .../app/common/logs/logs.component.module.ts | 13 - .../src/app/common/logs/logs.component.scss | 5 - .../ui/src/app/common/logs/logs.component.ts | 259 ------------- .../widget-list.component.module.ts | 3 +- 109 files changed, 1856 insertions(+), 3531 deletions(-) delete mode 100644 web/projects/install-wizard/src/app/app-routing.module.ts create mode 100644 web/projects/install-wizard/src/app/app.utils.ts delete mode 100644 web/projects/install-wizard/src/app/pages/home/home.module.ts delete mode 100644 web/projects/install-wizard/src/app/pages/home/home.page.html delete mode 100644 web/projects/install-wizard/src/app/pages/home/home.page.scss delete mode 100644 web/projects/install-wizard/src/app/pages/home/home.page.ts rename web/projects/install-wizard/src/app/services/{api => }/api.service.ts (100%) rename web/projects/install-wizard/src/app/services/{api => }/live-api.service.ts (100%) rename web/projects/install-wizard/src/app/services/{api => }/mock-api.service.ts (100%) delete mode 100644 web/projects/install-wizard/src/styles.scss delete mode 100644 web/projects/setup-wizard/src/app/app-routing.module.ts delete mode 100644 web/projects/setup-wizard/src/app/app.component.html delete mode 100644 web/projects/setup-wizard/src/app/app.component.scss create mode 100644 web/projects/setup-wizard/src/app/app.routes.ts create mode 100644 web/projects/setup-wizard/src/app/components/cifs.component.ts create mode 100644 web/projects/setup-wizard/src/app/components/documentation.component.ts create mode 100644 web/projects/setup-wizard/src/app/components/matrix.component.ts create mode 100644 web/projects/setup-wizard/src/app/components/password.component.ts create mode 100644 web/projects/setup-wizard/src/app/components/recover.component.ts delete mode 100644 web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.module.ts delete mode 100644 web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.html delete mode 100644 web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.scss delete mode 100644 web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.ts delete mode 100644 web/projects/setup-wizard/src/app/modals/password/password.module.ts delete mode 100644 web/projects/setup-wizard/src/app/modals/password/password.page.html delete mode 100644 web/projects/setup-wizard/src/app/modals/password/password.page.ts create mode 100644 web/projects/setup-wizard/src/app/pages/attach.page.ts delete mode 100644 web/projects/setup-wizard/src/app/pages/attach/attach-routing.module.ts delete mode 100644 web/projects/setup-wizard/src/app/pages/attach/attach.module.ts delete mode 100644 web/projects/setup-wizard/src/app/pages/attach/attach.page.html delete mode 100644 web/projects/setup-wizard/src/app/pages/attach/attach.page.scss delete mode 100644 web/projects/setup-wizard/src/app/pages/attach/attach.page.ts delete mode 100644 web/projects/setup-wizard/src/app/pages/embassy/embassy-routing.module.ts delete mode 100644 web/projects/setup-wizard/src/app/pages/embassy/embassy.module.ts delete mode 100644 web/projects/setup-wizard/src/app/pages/embassy/embassy.page.html delete mode 100644 web/projects/setup-wizard/src/app/pages/embassy/embassy.page.scss create mode 100644 web/projects/setup-wizard/src/app/pages/home.page.ts delete mode 100644 web/projects/setup-wizard/src/app/pages/home/home-routing.module.ts delete mode 100644 web/projects/setup-wizard/src/app/pages/home/home.module.ts delete mode 100644 web/projects/setup-wizard/src/app/pages/home/home.page.html delete mode 100644 web/projects/setup-wizard/src/app/pages/home/home.page.scss delete mode 100644 web/projects/setup-wizard/src/app/pages/home/home.page.ts create mode 100644 web/projects/setup-wizard/src/app/pages/loading.page.ts delete mode 100644 web/projects/setup-wizard/src/app/pages/loading/loading.module.ts delete mode 100644 web/projects/setup-wizard/src/app/pages/loading/loading.page.html delete mode 100644 web/projects/setup-wizard/src/app/pages/loading/loading.page.ts create mode 100644 web/projects/setup-wizard/src/app/pages/recover.page.ts delete mode 100644 web/projects/setup-wizard/src/app/pages/recover/drive-status.component.html delete mode 100644 web/projects/setup-wizard/src/app/pages/recover/recover-routing.module.ts delete mode 100644 web/projects/setup-wizard/src/app/pages/recover/recover.module.ts delete mode 100644 web/projects/setup-wizard/src/app/pages/recover/recover.page.html delete mode 100644 web/projects/setup-wizard/src/app/pages/recover/recover.page.scss delete mode 100644 web/projects/setup-wizard/src/app/pages/recover/recover.page.ts rename web/projects/setup-wizard/src/app/pages/{embassy/embassy.page.ts => storage.page.ts} (59%) create mode 100644 web/projects/setup-wizard/src/app/pages/success.page.ts delete mode 100644 web/projects/setup-wizard/src/app/pages/success/download-doc/download-doc.component.html delete mode 100644 web/projects/setup-wizard/src/app/pages/success/download-doc/download-doc.component.ts delete mode 100644 web/projects/setup-wizard/src/app/pages/success/success-routing.module.ts delete mode 100644 web/projects/setup-wizard/src/app/pages/success/success.module.ts delete mode 100644 web/projects/setup-wizard/src/app/pages/success/success.page.html delete mode 100644 web/projects/setup-wizard/src/app/pages/success/success.page.scss delete mode 100644 web/projects/setup-wizard/src/app/pages/success/success.page.ts create mode 100644 web/projects/setup-wizard/src/app/pages/transfer.page.ts delete mode 100644 web/projects/setup-wizard/src/app/pages/transfer/transfer-routing.module.ts delete mode 100644 web/projects/setup-wizard/src/app/pages/transfer/transfer.module.ts delete mode 100644 web/projects/setup-wizard/src/app/pages/transfer/transfer.page.html delete mode 100644 web/projects/setup-wizard/src/app/pages/transfer/transfer.page.scss delete mode 100644 web/projects/setup-wizard/src/app/pages/transfer/transfer.page.ts rename web/projects/setup-wizard/src/app/services/{api => }/api.service.ts (100%) rename web/projects/setup-wizard/src/app/services/{api => }/live-api.service.ts (96%) rename web/projects/setup-wizard/src/app/services/{api => }/mock-api.service.ts (99%) create mode 100644 web/projects/shared/src/components/drive.component.ts delete mode 100644 web/projects/shared/src/components/initializing/initializing.component.html delete mode 100644 web/projects/shared/src/components/initializing/initializing.component.scss delete mode 100644 web/projects/shared/src/components/initializing/initializing.module.ts delete mode 100644 web/projects/shared/src/components/text-spinner/text-spinner.component.html delete mode 100644 web/projects/shared/src/components/text-spinner/text-spinner.component.module.ts delete mode 100644 web/projects/shared/src/components/text-spinner/text-spinner.component.scss delete mode 100644 web/projects/shared/src/components/text-spinner/text-spinner.component.ts delete mode 100644 web/projects/shared/src/directives/responsive-col.directive.ts delete mode 100644 web/projects/shared/src/pipes/guid/guid.module.ts delete mode 100644 web/projects/shared/src/pipes/guid/guid.pipe.ts create mode 100644 web/projects/shared/src/util/to-guid.ts delete mode 100644 web/projects/ui/src/app/common/logs/logs.component.html delete mode 100644 web/projects/ui/src/app/common/logs/logs.component.module.ts delete mode 100644 web/projects/ui/src/app/common/logs/logs.component.scss delete mode 100644 web/projects/ui/src/app/common/logs/logs.component.ts diff --git a/web/angular.json b/web/angular.json index 963d90bb7..9e99210cd 100644 --- a/web/angular.json +++ b/web/angular.json @@ -184,12 +184,7 @@ } ], "styles": [ - "node_modules/@taiga-ui/core/styles/taiga-ui-theme.less", - "projects/shared/styles/taiga.scss", - "projects/shared/styles/variables.scss", - "projects/shared/styles/global.scss", - "projects/shared/styles/shared.scss", - "projects/install-wizard/src/styles.scss" + "node_modules/@taiga-ui/core/styles/taiga-ui-theme.less" ], "scripts": [] }, @@ -322,10 +317,6 @@ ], "styles": [ "node_modules/@taiga-ui/core/styles/taiga-ui-theme.less", - "projects/shared/styles/taiga.scss", - "projects/shared/styles/variables.scss", - "projects/shared/styles/global.scss", - "projects/shared/styles/shared.scss", "projects/setup-wizard/src/styles.scss" ], "scripts": [] diff --git a/web/package-lock.json b/web/package-lock.json index 0a28b4f8f..9537c894e 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -24,15 +24,15 @@ "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc8.beta2", - "@taiga-ui/addon-charts": "^3.65.0", - "@taiga-ui/addon-commerce": "^3.65.0", - "@taiga-ui/addon-mobile": "^3.65.0", - "@taiga-ui/cdk": "^3.65.0", - "@taiga-ui/core": "^3.65.0", - "@taiga-ui/experimental": "^3.65.0", - "@taiga-ui/icons": "^3.65.0", - "@taiga-ui/kit": "^3.65.0", - "@taiga-ui/styles": "^3.65.0", + "@taiga-ui/addon-charts": "3.65.0", + "@taiga-ui/addon-commerce": "3.65.0", + "@taiga-ui/addon-mobile": "3.65.0", + "@taiga-ui/cdk": "3.65.0", + "@taiga-ui/core": "3.65.0", + "@taiga-ui/experimental": "3.65.0", + "@taiga-ui/icons": "3.65.0", + "@taiga-ui/kit": "3.65.0", + "@taiga-ui/styles": "3.65.0", "@tinkoff/ng-dompurify": "4.0.0", "@tinkoff/ng-event-plugins": "3.1.0", "ansi-to-html": "^0.7.2", @@ -83,7 +83,7 @@ "ng-packagr": "^17.0.2", "node-html-parser": "^5.3.3", "postcss": "^8.4.21", - "prettier": "^3.1.1", + "prettier": "^3.2.5", "raw-loader": "^4.0.2", "ts-node": "^10.7.0", "tslint": "^6.1.3", @@ -14107,9 +14107,9 @@ } }, "node_modules/prettier": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", - "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" diff --git a/web/package.json b/web/package.json index a6498057f..e80feeea9 100644 --- a/web/package.json +++ b/web/package.json @@ -105,7 +105,7 @@ "ng-packagr": "^17.0.2", "node-html-parser": "^5.3.3", "postcss": "^8.4.21", - "prettier": "^3.1.1", + "prettier": "^3.2.5", "raw-loader": "^4.0.2", "ts-node": "^10.7.0", "tslint": "^6.1.3", diff --git a/web/projects/install-wizard/src/app/app-routing.module.ts b/web/projects/install-wizard/src/app/app-routing.module.ts deleted file mode 100644 index 80901192f..000000000 --- a/web/projects/install-wizard/src/app/app-routing.module.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { NgModule } from '@angular/core' -import { PreloadAllModules, RouterModule, Routes } from '@angular/router' - -const routes: Routes = [ - { - path: '', - loadChildren: () => - import('./pages/home/home.module').then(m => m.HomePageModule), - }, -] - -@NgModule({ - imports: [ - RouterModule.forRoot(routes, { - scrollPositionRestoration: 'enabled', - preloadingStrategy: PreloadAllModules, - useHash: true, - }), - ], - exports: [RouterModule], -}) -export class AppRoutingModule {} diff --git a/web/projects/install-wizard/src/app/app.component.html b/web/projects/install-wizard/src/app/app.component.html index 2d86be205..be4da9ab2 100644 --- a/web/projects/install-wizard/src/app/app.component.html +++ b/web/projects/install-wizard/src/app/app.component.html @@ -1,6 +1,58 @@ - - - - - + +

    + +
    +
    + @if (selected) { + + } +

    {{ selected ? 'Install Type' : 'Select Disk' }}

    +
    {{ error }}
    +
    +
    +
    + @for (drive of disks$ | async; track $index) { + + } +
    +
    + @if (guid) { + + } + + +
    +
    +
    +
    diff --git a/web/projects/install-wizard/src/app/app.component.scss b/web/projects/install-wizard/src/app/app.component.scss index b528fd9bd..d7d44fd08 100644 --- a/web/projects/install-wizard/src/app/app.component.scss +++ b/web/projects/install-wizard/src/app/app.component.scss @@ -1,8 +1,63 @@ -:host { - display: block; +@import '@taiga-ui/core/styles/taiga-ui-local'; + +::ng-deep html, +::ng-deep body, +tui-root { height: 100%; + margin: 0; + color: var(--tui-text-01); } -tui-root { +main { height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + background: var(--tui-base-08); +} + +.logo { + width: 6rem; + margin-bottom: -2rem; + z-index: 1; +} + +.card { + max-width: min(30rem, 90vw); +} + +.header { + position: relative; + display: flex; + flex-direction: column; + text-align: center; + padding-top: 0.25rem; + margin-bottom: -2rem; +} + +.back { + position: absolute; + top: 1rem; +} + +.pages { + display: flex; + align-items: center; + overflow: hidden; +} + +.options { + @include transition(margin); + + min-width: 100%; + display: flex; + flex-direction: column; + gap: 1.25rem; + padding: 1rem; + box-sizing: border-box; + + &_selected { + margin-left: -100%; + } } diff --git a/web/projects/install-wizard/src/app/app.component.ts b/web/projects/install-wizard/src/app/app.component.ts index 5ac82a652..a42a75f31 100644 --- a/web/projects/install-wizard/src/app/app.component.ts +++ b/web/projects/install-wizard/src/app/app.component.ts @@ -1,4 +1,10 @@ -import { Component } from '@angular/core' +import { Component, inject } from '@angular/core' +import { DiskInfo, LoadingService, toGuid } from '@start9labs/shared' +import { TuiDialogService } from '@taiga-ui/core' +import { TUI_PROMPT } from '@taiga-ui/kit' +import { filter, from } from 'rxjs' +import { SUCCESS, toWarning } from 'src/app/app.utils' +import { ApiService } from 'src/app/services/api.service' @Component({ selector: 'app-root', @@ -6,5 +12,65 @@ import { Component } from '@angular/core' styleUrls: ['app.component.scss'], }) export class AppComponent { - constructor() {} + private readonly loader = inject(LoadingService) + private readonly api = inject(ApiService) + private readonly dialogs = inject(TuiDialogService) + + readonly disks$ = from(this.api.getDisks()) + selected: DiskInfo | null = null + error = '' + + get guid() { + return toGuid(this.selected) + } + + async install(overwrite = false) { + const loader = this.loader.open('Installing StartOS...').subscribe() + const logicalname = this.selected?.logicalname || '' + + try { + await this.api.install({ logicalname, overwrite }) + this.reboot() + } catch (e: any) { + this.error = e.message + } finally { + loader.unsubscribe() + } + } + + warn() { + this.dialogs + .open(TUI_PROMPT, toWarning(this.selected)) + .pipe(filter(Boolean)) + .subscribe(() => { + this.install(true) + }) + } + + private async reboot() { + this.dialogs + .open( + 'Remove the USB stick and reboot your device to begin using your new Start9 server', + SUCCESS, + ) + .subscribe({ + complete: async () => { + const loader = this.loader.open('').subscribe() + + try { + await this.api.reboot() + this.dialogs + .open( + 'Please wait for StartOS to restart, then refresh this page', + { label: 'Rebooting', size: 's' }, + ) + .subscribe() + } catch (e: any) { + this.error = e.message + } finally { + loader.unsubscribe() + } + }, + }) + } } diff --git a/web/projects/install-wizard/src/app/app.module.ts b/web/projects/install-wizard/src/app/app.module.ts index 9cc91ba3f..3164d5d99 100644 --- a/web/projects/install-wizard/src/app/app.module.ts +++ b/web/projects/install-wizard/src/app/app.module.ts @@ -1,24 +1,26 @@ +import { HttpClientModule } from '@angular/common/http' import { NgModule } from '@angular/core' import { BrowserAnimationsModule } from '@angular/platform-browser/animations' -import { RouteReuseStrategy } from '@angular/router' -import { IonicModule, IonicRouteStrategy } from '@ionic/angular' -import { - TuiDialogModule, - TuiModeModule, - TuiRootModule, - TuiThemeNightModule, -} from '@taiga-ui/core' -import { AppComponent } from './app.component' -import { AppRoutingModule } from './app-routing.module' -import { HttpClientModule } from '@angular/common/http' -import { ApiService } from './services/api/api.service' -import { MockApiService } from './services/api/mock-api.service' -import { LiveApiService } from './services/api/live-api.service' import { + DriveComponent, LoadingModule, RELATIVE_URL, + UnitConversionPipesModule, WorkspaceConfig, } from '@start9labs/shared' +import { TuiDialogModule, TuiRootModule } from '@taiga-ui/core' +import { + TuiButtonModule, + TuiCardModule, + TuiCellModule, + TuiIconModule, + TuiSurfaceModule, + TuiTitleModule, +} from '@taiga-ui/experimental' +import { ApiService } from 'src/app/services/api.service' +import { LiveApiService } from 'src/app/services/live-api.service' +import { MockApiService } from 'src/app/services/mock-api.service' +import { AppComponent } from './app.component' const { useMocks, @@ -30,18 +32,19 @@ const { imports: [ HttpClientModule, BrowserAnimationsModule, - IonicModule.forRoot({ - mode: 'md', - }), - AppRoutingModule, TuiRootModule, TuiDialogModule, LoadingModule, - TuiModeModule, - TuiThemeNightModule, + DriveComponent, + TuiButtonModule, + TuiCardModule, + TuiCellModule, + TuiIconModule, + TuiSurfaceModule, + TuiTitleModule, + UnitConversionPipesModule, ], providers: [ - { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }, { provide: ApiService, useClass: useMocks ? MockApiService : LiveApiService, diff --git a/web/projects/install-wizard/src/app/app.utils.ts b/web/projects/install-wizard/src/app/app.utils.ts new file mode 100644 index 000000000..cf6735c2d --- /dev/null +++ b/web/projects/install-wizard/src/app/app.utils.ts @@ -0,0 +1,27 @@ +import { DiskInfo } from '@start9labs/shared' +import { TuiDialogOptions } from '@taiga-ui/core' +import { TuiPromptData } from '@taiga-ui/kit' + +export const SUCCESS: Partial> = { + label: 'Install Success', + closeable: false, + dismissible: false, + size: 's', + data: { button: 'Reboot' }, +} + +export function toWarning( + disk: DiskInfo | null, +): Partial> { + return { + label: 'Warning', + size: 's', + data: { + content: `This action will COMPLETELY erase the disk ${ + disk?.vendor || 'Unknown Vendor' + } - ${disk?.model || 'Unknown Model'} and install StartOS in its place`, + yes: 'Continue', + no: 'Cancel', + }, + } +} diff --git a/web/projects/install-wizard/src/app/pages/home/home.module.ts b/web/projects/install-wizard/src/app/pages/home/home.module.ts deleted file mode 100644 index e7cd274f6..000000000 --- a/web/projects/install-wizard/src/app/pages/home/home.module.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { NgModule } from '@angular/core' -import { RouterModule, Routes } from '@angular/router' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { FormsModule } from '@angular/forms' -import { HomePage } from './home.page' -import { SwiperModule } from 'swiper/angular' -import { - UnitConversionPipesModule, - GuidPipePipesModule, -} from '@start9labs/shared' - -const routes: Routes = [ - { - path: '', - component: HomePage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - IonicModule, - RouterModule.forChild(routes), - SwiperModule, - UnitConversionPipesModule, - GuidPipePipesModule, - ], - declarations: [HomePage], -}) -export class HomePageModule {} diff --git a/web/projects/install-wizard/src/app/pages/home/home.page.html b/web/projects/install-wizard/src/app/pages/home/home.page.html deleted file mode 100644 index 5bdaee493..000000000 --- a/web/projects/install-wizard/src/app/pages/home/home.page.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - -
    - -
    - - - - - - - - {{ !swiper || swiper.activeIndex === 0 ? 'Select Disk' : 'Install - Type' }} - - - {{ error }} - - - - - - - - - -

    - {{ disk.vendor || 'Unknown Vendor' }} - {{ disk.model || - 'Unknown Model' }} -

    -

    - {{ disk.logicalname }} - {{ disk.capacity | convertBytes - }} -

    -
    -
    -
    - - - - - - - - -

    - Re-Install StartOS -

    -

    Will preserve existing StartOS data

    -
    -
    - - - - - -

    - - {{ (selectedDisk | guid) ? 'Factory Reset' : 'Install - StartOS' }} - -

    -

    Will delete existing data on disk

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    diff --git a/web/projects/install-wizard/src/app/pages/home/home.page.scss b/web/projects/install-wizard/src/app/pages/home/home.page.scss deleted file mode 100644 index bc9c9b4a0..000000000 --- a/web/projects/install-wizard/src/app/pages/home/home.page.scss +++ /dev/null @@ -1,28 +0,0 @@ -/** Ionic CSS Variables overrides **/ -:root { - --ion-font-family: 'Benton Sans', sans-serif; -} - -ion-content { - --background: var(--ion-color-medium); -} - -ion-grid { - padding-top: 32px; - height: 100%; - max-width: 640px; -} - -.back-button { - position: absolute; - left: 16px; - top: 24px; - z-index: 1000000; -} - -ion-card-title { - margin: 16px 0; - font-family: 'Montserrat'; - font-size: x-large; - --color: var(--ion-color-light); -} diff --git a/web/projects/install-wizard/src/app/pages/home/home.page.ts b/web/projects/install-wizard/src/app/pages/home/home.page.ts deleted file mode 100644 index b2bf633ee..000000000 --- a/web/projects/install-wizard/src/app/pages/home/home.page.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { Component } from '@angular/core' -import { IonicSlides } from '@ionic/angular' -import { ApiService } from 'src/app/services/api/api.service' -import SwiperCore, { Swiper } from 'swiper' -import { DiskInfo, LoadingService } from '@start9labs/shared' -import { TuiDialogService } from '@taiga-ui/core' -import { TUI_PROMPT } from '@taiga-ui/kit' -import { filter } from 'rxjs' - -SwiperCore.use([IonicSlides]) - -@Component({ - selector: 'app-home', - templateUrl: 'home.page.html', - styleUrls: ['home.page.scss'], -}) -export class HomePage { - swiper?: Swiper - disks: DiskInfo[] = [] - selectedDisk?: DiskInfo - error = '' - - constructor( - private readonly loader: LoadingService, - private readonly api: ApiService, - private readonly dialogs: TuiDialogService, - ) {} - - async ngOnInit() { - this.disks = await this.api.getDisks() - } - - async ionViewDidEnter() { - if (this.swiper) { - this.swiper.allowTouchMove = false - } - } - - setSwiperInstance(swiper: any) { - this.swiper = swiper - } - - next(disk: DiskInfo) { - this.selectedDisk = disk - this.swiper?.slideNext(500) - } - - previous() { - this.swiper?.slidePrev(500) - } - - async tryInstall(overwrite: boolean) { - if (overwrite) { - return this.presentAlertDanger() - } - - this.install(false) - } - - private async install(overwrite: boolean) { - const loader = this.loader.open('Installing StartOS...').subscribe() - - try { - await this.api.install({ - logicalname: this.selectedDisk!.logicalname, - overwrite, - }) - this.presentAlertReboot() - } catch (e: any) { - this.error = e.message - } finally { - loader.unsubscribe() - } - } - - private presentAlertDanger() { - const { vendor, model } = this.selectedDisk! - - this.dialogs - .open(TUI_PROMPT, { - label: 'Warning', - size: 's', - data: { - content: `This action will COMPLETELY erase the disk ${ - vendor || 'Unknown Vendor' - } - ${model || 'Unknown Model'} and install StartOS in its place`, - yes: 'Continue', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => { - this.install(true) - }) - } - - private async presentAlertReboot() { - this.dialogs - .open( - 'Remove the USB stick and reboot your device to begin using your new Start9 server', - { - label: 'Install Success', - closeable: false, - dismissible: false, - size: 's', - data: { button: 'Reboot' }, - }, - ) - .subscribe({ - complete: () => { - this.reboot() - }, - }) - } - - private async reboot() { - const loader = this.loader.open('').subscribe() - - try { - await this.api.reboot() - this.presentAlertComplete() - } catch (e: any) { - this.error = e.message - } finally { - loader.unsubscribe() - } - } - - private presentAlertComplete() { - this.dialogs - .open('Please wait for StartOS to restart, then refresh this page', { - label: 'Rebooting', - size: 's', - }) - .subscribe() - } -} diff --git a/web/projects/install-wizard/src/app/services/api/api.service.ts b/web/projects/install-wizard/src/app/services/api.service.ts similarity index 100% rename from web/projects/install-wizard/src/app/services/api/api.service.ts rename to web/projects/install-wizard/src/app/services/api.service.ts diff --git a/web/projects/install-wizard/src/app/services/api/live-api.service.ts b/web/projects/install-wizard/src/app/services/live-api.service.ts similarity index 100% rename from web/projects/install-wizard/src/app/services/api/live-api.service.ts rename to web/projects/install-wizard/src/app/services/live-api.service.ts diff --git a/web/projects/install-wizard/src/app/services/api/mock-api.service.ts b/web/projects/install-wizard/src/app/services/mock-api.service.ts similarity index 100% rename from web/projects/install-wizard/src/app/services/api/mock-api.service.ts rename to web/projects/install-wizard/src/app/services/mock-api.service.ts diff --git a/web/projects/install-wizard/src/styles.scss b/web/projects/install-wizard/src/styles.scss deleted file mode 100644 index 540205695..000000000 --- a/web/projects/install-wizard/src/styles.scss +++ /dev/null @@ -1,59 +0,0 @@ -@font-face { - font-family: 'Montserrat'; - font-style: normal; - font-weight: normal; - src: url('/assets/fonts/Montserrat/Montserrat-Regular.ttf'); -} - -/** Ionic CSS Variables overrides **/ -:root { - --ion-font-family: 'Montserrat', sans-serif; - - --ion-color-primary: #0075e1; - - --ion-color-medium: #989aa2; - --ion-color-medium-rgb: 152,154,162; - --ion-color-medium-contrast: #000000; - --ion-color-medium-contrast-rgb: 0,0,0; - --ion-color-medium-shade: #86888f; - --ion-color-medium-tint: #a2a4ab; - - --ion-color-light: #222428; - --ion-color-light-rgb: 34,36,40; - --ion-color-light-contrast: #ffffff; - --ion-color-light-contrast-rgb: 255,255,255; - --ion-color-light-shade: #1e2023; - --ion-color-light-tint: #383a3e; - - --ion-item-background: #2b2b2b; - --ion-toolbar-background: #2b2b2b; - --ion-card-background: #2b2b2b; - - --ion-background-color: #282828; - --ion-background-color-rgb: 30,30,30; - --ion-text-color: var(--ion-color-dark); - --ion-text-color-rgb: var(--ion-color-dark-rgb); -} - -.loader { - --spinner-color: var(--ion-color-warning) !important; - z-index: 40000 !important; -} - -.alert-danger-message { - .alert-title { - color: var(--ion-color-danger); - } -} - -.alert-success-message { - .alert-title { - color: var(--ion-color-success); - } -} - -ion-alert { - .alert-button { - color: var(--ion-color-dark) !important; - } -} diff --git a/web/projects/marketplace/src/pages/list/search/search.module.ts b/web/projects/marketplace/src/pages/list/search/search.module.ts index 2da2a8e50..ea60b4fb2 100644 --- a/web/projects/marketplace/src/pages/list/search/search.module.ts +++ b/web/projects/marketplace/src/pages/list/search/search.module.ts @@ -1,11 +1,10 @@ -import { CommonModule } from "@angular/common"; -import { NgModule } from "@angular/core"; -import { FormsModule } from "@angular/forms"; -import { ResponsiveColDirective } from "@start9labs/shared"; -import { SearchComponent } from "./search.component"; +import { CommonModule } from '@angular/common' +import { NgModule } from '@angular/core' +import { FormsModule } from '@angular/forms' +import { SearchComponent } from './search.component' @NgModule({ - imports: [FormsModule, CommonModule, ResponsiveColDirective], + imports: [FormsModule, CommonModule], declarations: [SearchComponent], exports: [SearchComponent], }) diff --git a/web/projects/marketplace/src/pages/show/additional/additional.module.ts b/web/projects/marketplace/src/pages/show/additional/additional.module.ts index 13e353291..e84ac26b7 100644 --- a/web/projects/marketplace/src/pages/show/additional/additional.module.ts +++ b/web/projects/marketplace/src/pages/show/additional/additional.module.ts @@ -1,19 +1,17 @@ -import { CommonModule } from "@angular/common"; -import { NgModule } from "@angular/core"; -import { AdditionalComponent } from "./additional.component"; +import { CommonModule } from '@angular/common' +import { NgModule } from '@angular/core' +import { AdditionalComponent } from './additional.component' import { TuiRadioListModule, TuiStringifyContentPipeModule, -} from "@taiga-ui/kit"; -import { FormsModule } from "@angular/forms"; -import { TuiButtonModule, TuiLabelModule } from "@taiga-ui/core"; -import { AdditionalLinkModule } from "./additional-link/additional-link.component.module"; -import { ResponsiveColDirective } from "@start9labs/shared"; +} from '@taiga-ui/kit' +import { FormsModule } from '@angular/forms' +import { TuiButtonModule, TuiLabelModule } from '@taiga-ui/core' +import { AdditionalLinkModule } from './additional-link/additional-link.component.module' @NgModule({ imports: [ CommonModule, - ResponsiveColDirective, TuiRadioListModule, FormsModule, TuiStringifyContentPipeModule, diff --git a/web/projects/marketplace/src/pages/show/dependencies/dependencies.module.ts b/web/projects/marketplace/src/pages/show/dependencies/dependencies.module.ts index 168fe663f..01cadddf3 100644 --- a/web/projects/marketplace/src/pages/show/dependencies/dependencies.module.ts +++ b/web/projects/marketplace/src/pages/show/dependencies/dependencies.module.ts @@ -1,17 +1,11 @@ import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' import { RouterModule } from '@angular/router' -import { EmverPipesModule, ResponsiveColDirective } from '@start9labs/shared' +import { EmverPipesModule } from '@start9labs/shared' import { DependenciesComponent } from './dependencies.component' import { TuiAvatarModule } from '@taiga-ui/experimental' @NgModule({ - imports: [ - CommonModule, - RouterModule, - ResponsiveColDirective, - TuiAvatarModule, - EmverPipesModule, - ], + imports: [CommonModule, RouterModule, TuiAvatarModule, EmverPipesModule], declarations: [DependenciesComponent], exports: [DependenciesComponent], }) diff --git a/web/projects/setup-wizard/src/app/app-routing.module.ts b/web/projects/setup-wizard/src/app/app-routing.module.ts deleted file mode 100644 index aa56c382d..000000000 --- a/web/projects/setup-wizard/src/app/app-routing.module.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { NgModule } from '@angular/core' -import { PreloadAllModules, RouterModule, Routes } from '@angular/router' - -const routes: Routes = [ - { path: '', redirectTo: '/home', pathMatch: 'full' }, - { - path: 'home', - loadChildren: () => - import('./pages/home/home.module').then(m => m.HomePageModule), - }, - { - path: 'attach', - loadChildren: () => - import('./pages/attach/attach.module').then(m => m.AttachPageModule), - }, - { - path: 'recover', - loadChildren: () => - import('./pages/recover/recover.module').then(m => m.RecoverPageModule), - }, - { - path: 'transfer', - loadChildren: () => - import('./pages/transfer/transfer.module').then( - m => m.TransferPageModule, - ), - }, - { - path: 'storage', - loadChildren: () => - import('./pages/embassy/embassy.module').then(m => m.EmbassyPageModule), - }, - { - path: 'loading', - loadChildren: () => - import('./pages/loading/loading.module').then(m => m.LoadingPageModule), - }, - { - path: 'success', - loadChildren: () => - import('./pages/success/success.module').then(m => m.SuccessPageModule), - }, -] - -@NgModule({ - imports: [ - RouterModule.forRoot(routes, { - scrollPositionRestoration: 'enabled', - preloadingStrategy: PreloadAllModules, - useHash: true, - initialNavigation: 'disabled', - }), - ], - exports: [RouterModule], -}) -export class AppRoutingModule {} diff --git a/web/projects/setup-wizard/src/app/app.component.html b/web/projects/setup-wizard/src/app/app.component.html deleted file mode 100644 index 2d86be205..000000000 --- a/web/projects/setup-wizard/src/app/app.component.html +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/web/projects/setup-wizard/src/app/app.component.scss b/web/projects/setup-wizard/src/app/app.component.scss deleted file mode 100644 index b528fd9bd..000000000 --- a/web/projects/setup-wizard/src/app/app.component.scss +++ /dev/null @@ -1,8 +0,0 @@ -:host { - display: block; - height: 100%; -} - -tui-root { - height: 100%; -} diff --git a/web/projects/setup-wizard/src/app/app.component.ts b/web/projects/setup-wizard/src/app/app.component.ts index aee925f41..3f88d6f89 100644 --- a/web/projects/setup-wizard/src/app/app.component.ts +++ b/web/projects/setup-wizard/src/app/app.component.ts @@ -1,30 +1,31 @@ -import { Component } from '@angular/core' -import { NavController } from '@ionic/angular' -import { ApiService } from './services/api/api.service' +import { Component, inject } from '@angular/core' +import { Router } from '@angular/router' import { ErrorService } from '@start9labs/shared' +import { ApiService } from 'src/app/services/api.service' @Component({ selector: 'app-root', - templateUrl: 'app.component.html', - styleUrls: ['app.component.scss'], + template: ` + + + `, }) export class AppComponent { - constructor( - private readonly apiService: ApiService, - private readonly errorService: ErrorService, - private readonly navCtrl: NavController, - ) {} + private readonly api = inject(ApiService) + private readonly errorService = inject(ErrorService) + private readonly router = inject(Router) async ngOnInit() { try { - const inProgress = await this.apiService.getSetupStatus() + const inProgress = await this.api.getSetupStatus() + + let route = 'home' - let route = '/home' if (inProgress) { - route = inProgress.complete ? '/success' : '/loading' + route = inProgress.complete ? 'success' : 'loading' } - await this.navCtrl.navigateForward(route) + await this.router.navigate([route]) } catch (e: any) { this.errorService.handleError(e) } diff --git a/web/projects/setup-wizard/src/app/app.module.ts b/web/projects/setup-wizard/src/app/app.module.ts index b346a135c..fbe56a356 100644 --- a/web/projects/setup-wizard/src/app/app.module.ts +++ b/web/projects/setup-wizard/src/app/app.module.ts @@ -1,37 +1,27 @@ +import { HttpClientModule } from '@angular/common/http' import { NgModule } from '@angular/core' import { BrowserAnimationsModule } from '@angular/platform-browser/animations' -import { RouteReuseStrategy } from '@angular/router' -import { HttpClientModule } from '@angular/common/http' +import { PreloadAllModules, RouterModule } from '@angular/router' +import { + LoadingModule, + provideSetupLogsService, + provideSetupService, + RELATIVE_URL, + WorkspaceConfig, +} from '@start9labs/shared' import { TuiAlertModule, - tuiButtonOptionsProvider, TuiDialogModule, TuiModeModule, TuiRootModule, TuiThemeNightModule, } from '@taiga-ui/core' -import { ApiService } from './services/api/api.service' -import { MockApiService } from './services/api/mock-api.service' -import { LiveApiService } from './services/api/live-api.service' -import { - IonicModule, - IonicRouteStrategy, - iosTransitionAnimation, -} from '@ionic/angular' +import { tuiButtonOptionsProvider } from '@taiga-ui/experimental' +import { ApiService } from 'src/app/services/api.service' +import { LiveApiService } from 'src/app/services/live-api.service' +import { MockApiService } from 'src/app/services/mock-api.service' import { AppComponent } from './app.component' -import { AppRoutingModule } from './app-routing.module' -import { SuccessPageModule } from './pages/success/success.module' -import { HomePageModule } from './pages/home/home.module' -import { LoadingPageModule } from './pages/loading/loading.module' -import { RecoverPageModule } from './pages/recover/recover.module' -import { TransferPageModule } from './pages/transfer/transfer.module' -import { - LoadingModule, - provideSetupLogsService, - provideSetupService, - RELATIVE_URL, - WorkspaceConfig, -} from '@start9labs/shared' +import { ROUTES } from './app.routes' const { useMocks, @@ -42,21 +32,15 @@ const { declarations: [AppComponent], imports: [ BrowserAnimationsModule, - IonicModule.forRoot({ - mode: 'md', - navAnimation: iosTransitionAnimation, - }), - AppRoutingModule, HttpClientModule, - SuccessPageModule, - HomePageModule, - LoadingPageModule, - RecoverPageModule, - TransferPageModule, + RouterModule.forRoot(ROUTES, { + preloadingStrategy: PreloadAllModules, + initialNavigation: 'disabled', + }), + LoadingModule, TuiRootModule, TuiDialogModule, TuiAlertModule, - LoadingModule, TuiModeModule, TuiThemeNightModule, ], @@ -64,7 +48,6 @@ const { provideSetupService(ApiService), provideSetupLogsService(ApiService), tuiButtonOptionsProvider({ size: 'm' }), - { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }, { provide: ApiService, useClass: useMocks ? MockApiService : LiveApiService, diff --git a/web/projects/setup-wizard/src/app/app.routes.ts b/web/projects/setup-wizard/src/app/app.routes.ts new file mode 100644 index 000000000..388ebc740 --- /dev/null +++ b/web/projects/setup-wizard/src/app/app.routes.ts @@ -0,0 +1,33 @@ +import { Routes } from '@angular/router' + +export const ROUTES: Routes = [ + { path: '', redirectTo: '/home', pathMatch: 'full' }, + { + path: 'home', + loadComponent: () => import('src/app/pages/home.page'), + }, + { + path: 'attach', + loadComponent: () => import('src/app/pages/attach.page'), + }, + { + path: 'recover', + loadComponent: () => import('src/app/pages/recover.page'), + }, + { + path: 'transfer', + loadComponent: () => import('src/app/pages/transfer.page'), + }, + { + path: 'storage', + loadComponent: () => import('src/app/pages/storage.page'), + }, + { + path: 'loading', + loadComponent: () => import('src/app/pages/loading.page'), + }, + { + path: 'success', + loadComponent: () => import('src/app/pages/success.page'), + }, +] diff --git a/web/projects/setup-wizard/src/app/components/cifs.component.ts b/web/projects/setup-wizard/src/app/components/cifs.component.ts new file mode 100644 index 000000000..00fa27a5b --- /dev/null +++ b/web/projects/setup-wizard/src/app/components/cifs.component.ts @@ -0,0 +1,195 @@ +import { CommonModule } from '@angular/common' +import { Component, inject, Inject } from '@angular/core' +import { + FormControl, + FormGroup, + FormsModule, + ReactiveFormsModule, + Validators, +} from '@angular/forms' +import { LoadingService, StartOSDiskInfo } from '@start9labs/shared' +import { + TuiButtonModule, + TuiDialogContext, + TuiDialogService, + TuiErrorModule, +} from '@taiga-ui/core' +import { + TUI_VALIDATION_ERRORS, + TuiFieldErrorPipeModule, + TuiInputModule, + TuiInputPasswordModule, +} from '@taiga-ui/kit' +import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' +import { PASSWORD } from 'src/app/components/password.component' +import { + ApiService, + CifsBackupTarget, + CifsRecoverySource, +} from 'src/app/services/api.service' + +interface Context { + cifs: CifsRecoverySource + recoveryPassword: string +} + +@Component({ + standalone: true, + template: ` +
    + + Hostname + + + + + + Path + + + + + + Username + + + + + + Password + + +
    + + +
    +
    + `, + styles: [ + '.input { margin-top: 1rem }', + 'footer { display: flex; gap: 1rem; margin-top: 1rem }', + ], + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + TuiButtonModule, + TuiInputModule, + TuiInputPasswordModule, + TuiErrorModule, + TuiFieldErrorPipeModule, + ], + providers: [ + { + provide: TUI_VALIDATION_ERRORS, + useValue: { + required: 'This field is required', + }, + }, + ], +}) +export class CifsComponent { + private readonly dialogs = inject(TuiDialogService) + private readonly api = inject(ApiService) + private readonly loader = inject(LoadingService) + private readonly context = + inject>(POLYMORPHEUS_CONTEXT) + + readonly form = new FormGroup({ + hostname: new FormControl('', { + validators: [ + Validators.required, + Validators.pattern(/^[a-zA-Z0-9._-]+( [a-zA-Z0-9]+)*$/), + ], + nonNullable: true, + }), + path: new FormControl('', { + validators: [Validators.required], + nonNullable: true, + }), + username: new FormControl('', { + validators: [Validators.required], + nonNullable: true, + }), + password: new FormControl(), + }) + + cancel() { + this.context.$implicit.complete() + } + + async submit(): Promise { + const loader = this.loader + .open('Connecting to shared folder...') + .subscribe() + + try { + const diskInfo = await this.api.verifyCifs({ + ...this.form.getRawValue(), + type: 'cifs', + password: this.form.value.password + ? await this.api.encrypt(String(this.form.value.password)) + : null, + }) + + loader.unsubscribe() + + this.presentModalPassword(diskInfo) + } catch (e) { + loader.unsubscribe() + this.presentAlertFailed() + } + } + + private presentModalPassword(diskInfo: StartOSDiskInfo) { + const target: CifsBackupTarget = { + ...this.form.getRawValue(), + mountable: true, + 'embassy-os': diskInfo, + } + + this.dialogs + .open(PASSWORD, { + label: 'Unlock Drive', + size: 's', + data: { target }, + }) + .subscribe(recoveryPassword => { + this.context.completeWith({ + cifs: { ...this.form.getRawValue(), type: 'cifs' }, + recoveryPassword, + }) + }) + } + + private presentAlertFailed() { + this.dialogs + .open( + 'Unable to connect to shared folder. Ensure (1) target computer is connected to LAN, (2) target folder is being shared, and (3) hostname, path, and credentials are accurate.', + { + label: 'Connection Failed', + size: 's', + }, + ) + .subscribe() + } +} diff --git a/web/projects/setup-wizard/src/app/components/documentation.component.ts b/web/projects/setup-wizard/src/app/components/documentation.component.ts new file mode 100644 index 000000000..43473c1b9 --- /dev/null +++ b/web/projects/setup-wizard/src/app/components/documentation.component.ts @@ -0,0 +1,145 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core' + +@Component({ + standalone: true, + selector: 'app-documentation', + template: ` + + + + StartOS Address Info + + +
    +

    + StartOS Address Info +

    + +
    + + +
    +
    +

    + Access from home (LAN) +

    +

    + Visit the address below when you are connected to the same WiFi or + Local Area Network (LAN) as your server. +

    +

    + +

    + +

    + Access on the go (Tor) +

    +

    Visit the address below when you are away from home.

    +

    + Note: + This address will only work from a Tor-enabled browser. + + Follow the instructions + + to get setup. +

    +

    + +

    +
    +
    + + + `, + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class DocumentationComponent { + @Input({ required: true }) lanAddress!: string + + get crtName(): string { + return `${new URL(this.lanAddress).hostname}.crt` + } +} diff --git a/web/projects/setup-wizard/src/app/components/matrix.component.ts b/web/projects/setup-wizard/src/app/components/matrix.component.ts new file mode 100644 index 000000000..e2b04a6b3 --- /dev/null +++ b/web/projects/setup-wizard/src/app/components/matrix.component.ts @@ -0,0 +1,79 @@ +import { + Component, + Directive, + ElementRef, + inject, + NgZone, + OnInit, +} from '@angular/core' +import { WINDOW } from '@ng-web-apis/common' + +// a higher fade factor will make the characters fade quicker +const FADE_FACTOR = 0.07 + +@Component({ + standalone: true, + selector: 'canvas[matrix]', + template: 'Your browser does not support the canvas element.', + styles: ':host { position: fixed; }', +}) +export class MatrixComponent implements OnInit { + private readonly ngZone = inject(NgZone) + private readonly window = inject(WINDOW) + private readonly el: HTMLCanvasElement = inject(ElementRef).nativeElement + private readonly ctx = this.el.getContext('2d')! + + private tileSize = 16 + private columns: any[] = [] + private maxStackHeight = 0 + + ngOnInit() { + this.ngZone.runOutsideAngular(() => { + this.setupMatrixGrid() + this.tick() + }) + } + + private setupMatrixGrid() { + this.el.width = Math.max(this.window.innerWidth, 1920) + this.el.height = Math.max(this.window.innerHeight, 1080) + this.maxStackHeight = Math.ceil(this.ctx.canvas.height / this.tileSize) + // divide the canvas into columns + for (let i = 0; i < this.ctx.canvas.width / this.tileSize; ++i) { + const column = {} as any + // save the x position of the column + column.x = i * this.tileSize + // create a random stack height for the column + column.stackHeight = 10 + Math.random() * this.maxStackHeight + // add a counter to count the stack height + column.stackCounter = 0 + // add the column to the list + this.columns.push(column) + } + } + + private draw() { + // draw a semi transparent black rectangle on top of the scene to slowly fade older characters + this.ctx.fillStyle = `rgba(0, 0, 0, ${FADE_FACTOR})` + this.ctx.fillRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height) + // pick a font slightly smaller than the tile size + this.ctx.font = `${this.tileSize - 2}px monospace` + this.ctx.fillStyle = '#ff4961' + for (let i = 0; i < this.columns.length; ++i) { + // pick a random ascii character (change the 94 to a higher number to include more characters) + const { x, stackCounter } = this.columns[i] + const char = String.fromCharCode(33 + Math.floor(Math.random() * 94)) + this.ctx.fillText(char, x, stackCounter * this.tileSize + this.tileSize) + // if the stack is at its height limit, pick a new random height and reset the counter + if (++this.columns[i].stackCounter >= this.columns[i].stackHeight) { + this.columns[i].stackHeight = 10 + Math.random() * this.maxStackHeight + this.columns[i].stackCounter = 0 + } + } + } + + private tick() { + this.draw() + setTimeout(this.tick.bind(this), 50) + } +} diff --git a/web/projects/setup-wizard/src/app/components/password.component.ts b/web/projects/setup-wizard/src/app/components/password.component.ts new file mode 100644 index 000000000..2b41a4c0f --- /dev/null +++ b/web/projects/setup-wizard/src/app/components/password.component.ts @@ -0,0 +1,128 @@ +import { Component, inject } from '@angular/core' +import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms' +import * as argon2 from '@start9labs/argon2' +import { ErrorService } from '@start9labs/shared' +import { + TuiButtonModule, + TuiDialogContext, + TuiErrorModule, +} from '@taiga-ui/core' +import { TuiInputPasswordModule } from '@taiga-ui/kit' +import { + POLYMORPHEUS_CONTEXT, + PolymorpheusComponent, +} from '@tinkoff/ng-polymorpheus' +import { + CifsBackupTarget, + DiskBackupTarget, +} from 'src/app/services/api.service' + +interface DialogData { + target?: CifsBackupTarget | DiskBackupTarget + storageDrive?: boolean +} + +@Component({ + standalone: true, + template: ` + @if (storageDrive) { + Choose a password for your server. + Make it good. Write it down. + } @else { + Enter the password that was used to encrypt this drive. + } + +
    + + Enter Password + + + + @if (storageDrive) { + + Retype Password + + + + } +
    + + +
    +
    + `, + styles: ['footer { display: flex; gap: 1rem; margin-top: 1rem }'], + imports: [ + FormsModule, + ReactiveFormsModule, + TuiButtonModule, + TuiInputPasswordModule, + TuiErrorModule, + ], +}) +export class PasswordComponent { + private readonly errorService = inject(ErrorService) + private readonly context = + inject>(POLYMORPHEUS_CONTEXT) + + readonly target = this.context.data.target + readonly storageDrive = this.context.data.storageDrive + readonly password = new FormControl('', { nonNullable: true }) + readonly confirm = new FormControl('', { nonNullable: true }) + + get passwordError(): string | null { + if (!this.password.touched || this.target) return null + + if (!this.storageDrive && !this.target?.['embassy-os']) + return 'No recovery target' // unreachable + + if (this.password.value.length < 12) + return 'Must be 12 characters or greater' + + if (this.password.value.length > 64) + return 'Must be less than 65 characters' + + return null + } + + get confirmError(): string | null { + return this.confirm.touched && this.password.value !== this.confirm.value + ? 'Passwords do not match' + : null + } + + submit() { + if (this.storageDrive) { + this.context.completeWith(this.password.value) + + return + } + + try { + const passwordHash = this.target!['embassy-os']?.['password-hash'] || '' + + argon2.verify(passwordHash, this.password.value) + this.context.completeWith(this.password.value) + } catch (e) { + this.errorService.handleError('Incorrect password provided') + } + } + + cancel() { + this.context.$implicit.complete() + } +} + +export const PASSWORD = new PolymorpheusComponent(PasswordComponent) diff --git a/web/projects/setup-wizard/src/app/components/recover.component.ts b/web/projects/setup-wizard/src/app/components/recover.component.ts new file mode 100644 index 000000000..4303d709d --- /dev/null +++ b/web/projects/setup-wizard/src/app/components/recover.component.ts @@ -0,0 +1,44 @@ +import { Component, Input } from '@angular/core' +import { RouterLink } from '@angular/router' +import { + TuiCellModule, + TuiIconModule, + TuiTitleModule, +} from '@taiga-ui/experimental' + +@Component({ + standalone: true, + selector: 'app-recover', + template: ` + + + + Use Existing Drive + + Attach an existing StartOS data drive (not a backup) + + + + + + + Transfer + + Transfer data from an existing StartOS data drive (not a backup) to a + new, preferred drive + + + + + + + Restore From Backup (Disaster Recovery) + Restore StartOS data from an encrypted backup + + + `, + imports: [RouterLink, TuiIconModule, TuiCellModule, TuiTitleModule], +}) +export class RecoverComponent { + @Input() disabled = false +} diff --git a/web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.module.ts b/web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.module.ts deleted file mode 100644 index 3e26600bc..000000000 --- a/web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.module.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { FormsModule, ReactiveFormsModule } from '@angular/forms' -import { TuiButtonModule, TuiErrorModule } from '@taiga-ui/core' -import { - TuiFieldErrorPipeModule, - TuiInputModule, - TuiInputPasswordModule, -} from '@taiga-ui/kit' -import { CifsModal } from './cifs-modal.page' - -@NgModule({ - declarations: [CifsModal], - imports: [ - CommonModule, - FormsModule, - TuiButtonModule, - TuiInputModule, - TuiErrorModule, - ReactiveFormsModule, - TuiFieldErrorPipeModule, - TuiInputPasswordModule, - ], - exports: [CifsModal], -}) -export class CifsModalModule {} diff --git a/web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.html b/web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.html deleted file mode 100644 index 6250ad636..000000000 --- a/web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.html +++ /dev/null @@ -1,39 +0,0 @@ -
    - - Hostname - - - - - - Path - - - - - - Username - - - - - - Password - - -
    - - -
    -
    diff --git a/web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.scss b/web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.scss deleted file mode 100644 index 5638f9537..000000000 --- a/web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.scss +++ /dev/null @@ -1,3 +0,0 @@ -.input { - margin-top: 16px; -} diff --git a/web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.ts b/web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.ts deleted file mode 100644 index 4335f8a0e..000000000 --- a/web/projects/setup-wizard/src/app/modals/cifs-modal/cifs-modal.page.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { Component, Inject } from '@angular/core' -import { FormControl, FormGroup, Validators } from '@angular/forms' -import { TUI_VALIDATION_ERRORS } from '@taiga-ui/kit' -import { LoadingService, StartOSDiskInfo } from '@start9labs/shared' -import { TuiDialogContext, TuiDialogService } from '@taiga-ui/core' -import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' -import { - ApiService, - CifsBackupTarget, - CifsRecoverySource, -} from 'src/app/services/api/api.service' -import { PASSWORD } from '../password/password.page' - -@Component({ - selector: 'cifs-modal', - templateUrl: 'cifs-modal.page.html', - styleUrls: ['cifs-modal.page.scss'], - providers: [ - { - provide: TUI_VALIDATION_ERRORS, - useValue: { - required: 'This field is required', - }, - }, - ], -}) -export class CifsModal { - readonly form = new FormGroup({ - hostname: new FormControl('', { - validators: [ - Validators.required, - Validators.pattern(/^[a-zA-Z0-9._-]+( [a-zA-Z0-9]+)*$/), - ], - nonNullable: true, - }), - path: new FormControl('', { - validators: [Validators.required], - nonNullable: true, - }), - username: new FormControl('', { - validators: [Validators.required], - nonNullable: true, - }), - password: new FormControl(), - }) - - constructor( - @Inject(POLYMORPHEUS_CONTEXT) - private readonly context: TuiDialogContext<{ - cifs: CifsRecoverySource - recoveryPassword: string - }>, - private readonly dialogs: TuiDialogService, - private readonly api: ApiService, - private readonly loader: LoadingService, - ) {} - - cancel() { - this.context.$implicit.complete() - } - - async submit(): Promise { - const loader = this.loader - .open('Connecting to shared folder...') - .subscribe() - - try { - const diskInfo = await this.api.verifyCifs({ - ...this.form.getRawValue(), - type: 'cifs', - password: this.form.value.password - ? await this.api.encrypt(String(this.form.value.password)) - : null, - }) - - loader.unsubscribe() - - this.presentModalPassword(diskInfo) - } catch (e) { - loader.unsubscribe() - this.presentAlertFailed() - } - } - - private presentModalPassword(diskInfo: StartOSDiskInfo) { - const target: CifsBackupTarget = { - ...this.form.getRawValue(), - mountable: true, - 'embassy-os': diskInfo, - } - - this.dialogs - .open(PASSWORD, { - label: 'Unlock Drive', - size: 's', - data: { target }, - }) - .subscribe(recoveryPassword => { - this.context.completeWith({ - cifs: { ...this.form.getRawValue(), type: 'cifs' }, - recoveryPassword, - }) - }) - } - - private presentAlertFailed() { - this.dialogs - .open( - 'Unable to connect to shared folder. Ensure (1) target computer is connected to LAN, (2) target folder is being shared, and (3) hostname, path, and credentials are accurate.', - { - label: 'Connection Failed', - size: 's', - }, - ) - .subscribe() - } -} diff --git a/web/projects/setup-wizard/src/app/modals/password/password.module.ts b/web/projects/setup-wizard/src/app/modals/password/password.module.ts deleted file mode 100644 index ce89d0709..000000000 --- a/web/projects/setup-wizard/src/app/modals/password/password.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { FormsModule, ReactiveFormsModule } from '@angular/forms' -import { TuiButtonModule, TuiErrorModule } from '@taiga-ui/core' -import { TuiInputPasswordModule } from '@taiga-ui/kit' -import { PasswordPage } from './password.page' - -@NgModule({ - declarations: [PasswordPage], - imports: [ - CommonModule, - FormsModule, - TuiButtonModule, - TuiInputPasswordModule, - TuiErrorModule, - ReactiveFormsModule, - ], - exports: [PasswordPage], -}) -export class PasswordPageModule {} diff --git a/web/projects/setup-wizard/src/app/modals/password/password.page.html b/web/projects/setup-wizard/src/app/modals/password/password.page.html deleted file mode 100644 index 10dae39cd..000000000 --- a/web/projects/setup-wizard/src/app/modals/password/password.page.html +++ /dev/null @@ -1,35 +0,0 @@ -

    - Enter the password that was used to encrypt this drive. -

    - -

    - Choose a password for your server. - Make it good. Write it down. -

    -
    - -
    - - Enter Password - - - - - - Retype Password - - - - -
    - - -
    -
    diff --git a/web/projects/setup-wizard/src/app/modals/password/password.page.ts b/web/projects/setup-wizard/src/app/modals/password/password.page.ts deleted file mode 100644 index ec500c4ad..000000000 --- a/web/projects/setup-wizard/src/app/modals/password/password.page.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { Component, Inject } from '@angular/core' -import { FormControl } from '@angular/forms' -import * as argon2 from '@start9labs/argon2' -import { ErrorService } from '@start9labs/shared' -import { TuiDialogContext } from '@taiga-ui/core' -import { - PolymorpheusComponent, - POLYMORPHEUS_CONTEXT, -} from '@tinkoff/ng-polymorpheus' -import { - CifsBackupTarget, - DiskBackupTarget, -} from 'src/app/services/api/api.service' - -interface DialogData { - target?: CifsBackupTarget | DiskBackupTarget - storageDrive?: boolean -} - -@Component({ - selector: 'app-password', - templateUrl: 'password.page.html', -}) -export class PasswordPage { - readonly target = this.context.data.target - readonly storageDrive = this.context.data.storageDrive - readonly password = new FormControl('', { nonNullable: true }) - readonly confirm = new FormControl('', { nonNullable: true }) - - constructor( - @Inject(POLYMORPHEUS_CONTEXT) - private readonly context: TuiDialogContext, - private readonly errorService: ErrorService, - ) {} - - get passwordError(): string | null { - if (!this.password.touched || this.target) return null - - if (!this.storageDrive && !this.target?.['embassy-os']) - return 'No recovery target' // unreachable - - if (this.password.value.length < 12) - return 'Must be 12 characters or greater' - - if (this.password.value.length > 64) - return 'Must be less than 65 characters' - - return null - } - - get confirmError(): string | null { - return this.confirm.touched && this.password.value !== this.confirm.value - ? 'Passwords do not match' - : null - } - - verifyPw() { - try { - const passwordHash = this.target!['embassy-os']?.['password-hash'] || '' - - argon2.verify(passwordHash, this.password.value) - this.context.completeWith(this.password.value) - } catch (e) { - this.errorService.handleError('Incorrect password provided') - } - } - - submitPw() { - this.context.completeWith(this.password.value) - } - - cancel() { - this.context.$implicit.complete() - } -} - -export const PASSWORD = new PolymorpheusComponent(PasswordPage) diff --git a/web/projects/setup-wizard/src/app/pages/attach.page.ts b/web/projects/setup-wizard/src/app/pages/attach.page.ts new file mode 100644 index 000000000..005bbc7c2 --- /dev/null +++ b/web/projects/setup-wizard/src/app/pages/attach.page.ts @@ -0,0 +1,108 @@ +import { Component, inject } from '@angular/core' +import { Router } from '@angular/router' +import { + DiskInfo, + DriveComponent, + ErrorService, + LoadingService, + toGuid, +} from '@start9labs/shared' +import { TuiDialogService, TuiLoaderModule } from '@taiga-ui/core' +import { + TuiButtonModule, + TuiCardModule, + TuiCellModule, +} from '@taiga-ui/experimental' +import { PASSWORD } from 'src/app/components/password.component' +import { ApiService } from 'src/app/services/api.service' +import { StateService } from 'src/app/services/state.service' + +@Component({ + standalone: true, + template: ` +
    +
    Use existing drive
    +
    Select the physical drive containing your StartOS data
    + + @if (loading) { + + } @else { + @for (drive of drives; track drive) { + + } @empty { + No valid StartOS data drives found. Please make sure the drive is a + valid StartOS data drive (not a backup) and is firmly connected, then + refresh the page. + } + + } +
    + `, + imports: [ + TuiButtonModule, + TuiCardModule, + TuiCellModule, + TuiLoaderModule, + DriveComponent, + ], +}) +export default class AttachPage { + private readonly apiService = inject(ApiService) + private readonly router = inject(Router) + private readonly errorService = inject(ErrorService) + private readonly stateService = inject(StateService) + private readonly dialogs = inject(TuiDialogService) + private readonly loader = inject(LoadingService) + + loading = true + drives: DiskInfo[] = [] + + async ngOnInit() { + this.stateService.setupType = 'attach' + await this.getDrives() + } + + async refresh() { + this.loading = true + await this.getDrives() + } + + async getDrives() { + try { + this.drives = await this.apiService + .getDrives() + .then(drives => drives.filter(toGuid)) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + this.loading = false + } + } + + select(disk: DiskInfo) { + this.dialogs + .open(PASSWORD, { + label: 'Set Password', + size: 's', + data: { storageDrive: true }, + }) + .subscribe(password => { + this.attachDrive(toGuid(disk) || '', password) + }) + } + + private async attachDrive(guid: string, password: string) { + const loader = this.loader.open('Connecting to drive...').subscribe() + + try { + await this.stateService.importDrive(guid, password) + await this.router.navigate([`loading`]) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + loader.unsubscribe() + } + } +} diff --git a/web/projects/setup-wizard/src/app/pages/attach/attach-routing.module.ts b/web/projects/setup-wizard/src/app/pages/attach/attach-routing.module.ts deleted file mode 100644 index 8ba45b29c..000000000 --- a/web/projects/setup-wizard/src/app/pages/attach/attach-routing.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NgModule } from '@angular/core' -import { RouterModule, Routes } from '@angular/router' -import { AttachPage } from './attach.page' - -const routes: Routes = [ - { - path: '', - component: AttachPage, - }, -] - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class AttachPageRoutingModule {} diff --git a/web/projects/setup-wizard/src/app/pages/attach/attach.module.ts b/web/projects/setup-wizard/src/app/pages/attach/attach.module.ts deleted file mode 100644 index 486884878..000000000 --- a/web/projects/setup-wizard/src/app/pages/attach/attach.module.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { - GuidPipePipesModule, - UnitConversionPipesModule, -} from '@start9labs/shared' -import { AttachPage } from './attach.page' -import { AttachPageRoutingModule } from './attach-routing.module' - -@NgModule({ - declarations: [AttachPage], - imports: [ - CommonModule, - IonicModule, - AttachPageRoutingModule, - UnitConversionPipesModule, - GuidPipePipesModule, - ], -}) -export class AttachPageModule {} diff --git a/web/projects/setup-wizard/src/app/pages/attach/attach.page.html b/web/projects/setup-wizard/src/app/pages/attach/attach.page.html deleted file mode 100644 index 2c10d9545..000000000 --- a/web/projects/setup-wizard/src/app/pages/attach/attach.page.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - Use existing drive -
    - - Select the physical drive containing your StartOS data - -
    -
    - - - - - - - -

    - No valid StartOS data drives found. Please make sure the drive - is a valid StartOS data drive (not a backup) and is firmly - connected, then refresh the page. -

    - - - - - -

    {{ drive.logicalname }}

    -

    - {{ drive.vendor || 'Unknown Vendor' }} - {{ drive.model || - 'Unknown Model' }} -

    -

    Capacity: {{ drive.capacity | convertBytes }}

    -
    -
    -
    - - - Refresh - -
    -
    -
    -
    -
    -
    -
    diff --git a/web/projects/setup-wizard/src/app/pages/attach/attach.page.scss b/web/projects/setup-wizard/src/app/pages/attach/attach.page.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/setup-wizard/src/app/pages/attach/attach.page.ts b/web/projects/setup-wizard/src/app/pages/attach/attach.page.ts deleted file mode 100644 index 2662abc9d..000000000 --- a/web/projects/setup-wizard/src/app/pages/attach/attach.page.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { Component } from '@angular/core' -import { NavController } from '@ionic/angular' -import { DiskInfo, ErrorService, LoadingService } from '@start9labs/shared' -import { TuiDialogService } from '@taiga-ui/core' -import { ApiService } from 'src/app/services/api/api.service' -import { StateService } from 'src/app/services/state.service' -import { PASSWORD, PasswordPage } from 'src/app/modals/password/password.page' - -@Component({ - selector: 'app-attach', - templateUrl: 'attach.page.html', - styleUrls: ['attach.page.scss'], -}) -export class AttachPage { - loading = true - drives: DiskInfo[] = [] - - constructor( - private readonly apiService: ApiService, - private readonly navCtrl: NavController, - private readonly errorService: ErrorService, - private readonly stateService: StateService, - private readonly dialogs: TuiDialogService, - private readonly loader: LoadingService, - ) {} - - async ngOnInit() { - this.stateService.setupType = 'attach' - await this.getDrives() - } - - async refresh() { - this.loading = true - await this.getDrives() - } - - async getDrives() { - try { - this.drives = await this.apiService.getDrives() - } catch (e: any) { - this.errorService.handleError(e) - } finally { - this.loading = false - } - } - - select(guid: string) { - this.dialogs - .open(PASSWORD, { - label: 'Set Password', - size: 's', - data: { storageDrive: true }, - }) - .subscribe(password => { - this.attachDrive(guid, password) - }) - } - - private async attachDrive(guid: string, password: string) { - const loader = this.loader.open('Connecting to drive...').subscribe() - - try { - await this.stateService.importDrive(guid, password) - await this.navCtrl.navigateForward(`/loading`) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } -} diff --git a/web/projects/setup-wizard/src/app/pages/embassy/embassy-routing.module.ts b/web/projects/setup-wizard/src/app/pages/embassy/embassy-routing.module.ts deleted file mode 100644 index 9265ba721..000000000 --- a/web/projects/setup-wizard/src/app/pages/embassy/embassy-routing.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NgModule } from '@angular/core' -import { RouterModule, Routes } from '@angular/router' -import { EmbassyPage } from './embassy.page' - -const routes: Routes = [ - { - path: '', - component: EmbassyPage, - }, -] - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class EmbassyPageRoutingModule { } diff --git a/web/projects/setup-wizard/src/app/pages/embassy/embassy.module.ts b/web/projects/setup-wizard/src/app/pages/embassy/embassy.module.ts deleted file mode 100644 index 7a7594b41..000000000 --- a/web/projects/setup-wizard/src/app/pages/embassy/embassy.module.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { FormsModule } from '@angular/forms' -import { - GuidPipePipesModule, - UnitConversionPipesModule, -} from '@start9labs/shared' -import { EmbassyPage } from './embassy.page' -import { PasswordPageModule } from '../../modals/password/password.module' -import { EmbassyPageRoutingModule } from './embassy-routing.module' - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - IonicModule, - EmbassyPageRoutingModule, - PasswordPageModule, - UnitConversionPipesModule, - GuidPipePipesModule, - ], - declarations: [EmbassyPage], -}) -export class EmbassyPageModule {} diff --git a/web/projects/setup-wizard/src/app/pages/embassy/embassy.page.html b/web/projects/setup-wizard/src/app/pages/embassy/embassy.page.html deleted file mode 100644 index bc7e82036..000000000 --- a/web/projects/setup-wizard/src/app/pages/embassy/embassy.page.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - Select storage drive -
    - - This is the drive where your StartOS data will be stored. - -
    -
    - - - No drives found -
    - - Please connect a storage drive to your server. Then click - "Refresh". - -
    -
    -
    - - - - - - - - - - - -

    - {{ drive.vendor || 'Unknown Vendor' }} - {{ drive.model || - 'Unknown Model' }} -

    -

    - {{ drive.logicalname }} - {{ drive.capacity | convertBytes - }} -

    -

    - - Drive capacity too small. - -

    -
    -
    -
    - - - Refresh - -
    -
    -
    -
    -
    -
    -
    diff --git a/web/projects/setup-wizard/src/app/pages/embassy/embassy.page.scss b/web/projects/setup-wizard/src/app/pages/embassy/embassy.page.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/setup-wizard/src/app/pages/home.page.ts b/web/projects/setup-wizard/src/app/pages/home.page.ts new file mode 100644 index 000000000..1480543c7 --- /dev/null +++ b/web/projects/setup-wizard/src/app/pages/home.page.ts @@ -0,0 +1,144 @@ +import { CommonModule } from '@angular/common' +import { Component, inject, OnInit } from '@angular/core' +import { RouterLink } from '@angular/router' +import { ErrorService } from '@start9labs/shared' +import { + TuiButtonModule, + TuiCardModule, + TuiCellModule, + TuiIconModule, + TuiIconsModule, + TuiTitleModule, +} from '@taiga-ui/experimental' +import { RecoverComponent } from 'src/app/components/recover.component' +import { ApiService } from 'src/app/services/api.service' +import { StateService } from 'src/app/services/state.service' + +@Component({ + standalone: true, + template: ` + + @if (!loading) { +
    +
    + @if (recover) { + + } + {{ recover ? 'StartOS Setup' : 'Recover Options' }} +
    +
    +
    + + + + Start Fresh + + Get started with a brand new Start9 server + + + + +
    + +
    +
    + } + `, + styles: ` + @import '@taiga-ui/core/styles/taiga-ui-local'; + + .logo { + width: 6rem; + margin: auto auto -2rem; + z-index: 1; + + &:only-child { + margin: auto; + } + + + * { + margin-top: 0; + } + } + + .back { + position: absolute; + top: 1rem; + border-radius: 10rem; + } + + .pages { + display: flex; + align-items: center; + overflow: hidden; + } + + .options { + @include transition(margin); + + min-width: 100%; + display: flex; + flex-direction: column; + gap: 1.25rem; + padding: 1rem; + box-sizing: border-box; + + &_recover { + margin-left: -100%; + } + } + `, + imports: [ + CommonModule, + RouterLink, + TuiCardModule, + TuiButtonModule, + TuiIconsModule, + TuiCellModule, + TuiIconModule, + TuiTitleModule, + RecoverComponent, + ], +}) +export default class HomePage implements OnInit { + private readonly api = inject(ApiService) + private readonly errorService = inject(ErrorService) + private readonly stateService = inject(StateService) + + error = false + loading = true + recover = false + + async ngOnInit() { + this.stateService.setupType = 'fresh' + + try { + await this.api.getPubKey() + } catch (e: any) { + this.error = true + this.errorService.handleError(e) + } finally { + this.loading = false + } + } +} diff --git a/web/projects/setup-wizard/src/app/pages/home/home-routing.module.ts b/web/projects/setup-wizard/src/app/pages/home/home-routing.module.ts deleted file mode 100644 index fcc236c16..000000000 --- a/web/projects/setup-wizard/src/app/pages/home/home-routing.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NgModule } from '@angular/core' -import { RouterModule, Routes } from '@angular/router' -import { HomePage } from './home.page' - -const routes: Routes = [ - { - path: '', - component: HomePage, - }, -] - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class HomePageRoutingModule { } diff --git a/web/projects/setup-wizard/src/app/pages/home/home.module.ts b/web/projects/setup-wizard/src/app/pages/home/home.module.ts deleted file mode 100644 index 306796314..000000000 --- a/web/projects/setup-wizard/src/app/pages/home/home.module.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { FormsModule } from '@angular/forms' -import { HomePage } from './home.page' -import { PasswordPageModule } from '../../modals/password/password.module' -import { HomePageRoutingModule } from './home-routing.module' -import { SwiperModule } from 'swiper/angular' - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - IonicModule, - HomePageRoutingModule, - PasswordPageModule, - SwiperModule, - ], - declarations: [HomePage], -}) -export class HomePageModule {} diff --git a/web/projects/setup-wizard/src/app/pages/home/home.page.html b/web/projects/setup-wizard/src/app/pages/home/home.page.html deleted file mode 100644 index ab517cbcb..000000000 --- a/web/projects/setup-wizard/src/app/pages/home/home.page.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - -
    - -
    - - - - - - - {{ swiper?.activeIndex === 0 ? 'StartOS Setup' : 'Recover Options' - }} - - - - - - - - - - -

    Start Fresh

    -

    Get started with a brand new Start9 server

    -
    -
    - - - - - -

    Recover

    -

    Recover, restore, or transfer StartOS data

    -
    -
    -
    - - - - - - - -

    - Use Existing Drive -

    -

    Attach an existing StartOS data drive (not a backup)

    -
    -
    - - - - - -

    - Transfer -

    -

    - Transfer data from an existing StartOS data drive (not a - backup) to a new, preferred drive -
    -

    -
    -
    - - - - - -

    - - Restore From Backup (Disaster Recovery) - -

    -

    Restore StartOS data from an encrypted backup

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    diff --git a/web/projects/setup-wizard/src/app/pages/home/home.page.scss b/web/projects/setup-wizard/src/app/pages/home/home.page.scss deleted file mode 100644 index 508690bc7..000000000 --- a/web/projects/setup-wizard/src/app/pages/home/home.page.scss +++ /dev/null @@ -1,13 +0,0 @@ -.back-button { - position: absolute; - left: 16px; - top: 24px; - z-index: 1000000; -} - -.inline { - display: flex; - align-items: center; - text-align: center; - justify-content: center; -} diff --git a/web/projects/setup-wizard/src/app/pages/home/home.page.ts b/web/projects/setup-wizard/src/app/pages/home/home.page.ts deleted file mode 100644 index 88ab04160..000000000 --- a/web/projects/setup-wizard/src/app/pages/home/home.page.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Component } from '@angular/core' -import { IonicSlides } from '@ionic/angular' -import { ApiService } from 'src/app/services/api/api.service' -import SwiperCore, { Swiper } from 'swiper' -import { ErrorService } from '@start9labs/shared' -import { StateService } from 'src/app/services/state.service' - -SwiperCore.use([IonicSlides]) - -@Component({ - selector: 'app-home', - templateUrl: 'home.page.html', - styleUrls: ['home.page.scss'], -}) -export class HomePage { - swiper?: Swiper - error = false - loading = true - - constructor( - private readonly api: ApiService, - private readonly errorService: ErrorService, - private readonly stateService: StateService, - ) {} - - async ionViewDidEnter() { - this.stateService.setupType = 'fresh' - if (this.swiper) { - this.swiper.allowTouchMove = false - } - - try { - await this.api.getPubKey() - } catch (e: any) { - this.error = true - this.errorService.handleError(e) - } finally { - this.loading = false - } - } - - setSwiperInstance(swiper: any) { - this.swiper = swiper - } - - next() { - this.swiper?.slideNext(500) - } - - previous() { - this.swiper?.slidePrev(500) - } -} diff --git a/web/projects/setup-wizard/src/app/pages/loading.page.ts b/web/projects/setup-wizard/src/app/pages/loading.page.ts new file mode 100644 index 000000000..e65e791e7 --- /dev/null +++ b/web/projects/setup-wizard/src/app/pages/loading.page.ts @@ -0,0 +1,20 @@ +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { Router } from '@angular/router' +import { InitializingComponent } from '@start9labs/shared' +import { StateService } from 'src/app/services/state.service' + +@Component({ + standalone: true, + template: ` + + `, + imports: [InitializingComponent], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export default class LoadingPage { + readonly stateService = inject(StateService) + readonly router = inject(Router) +} diff --git a/web/projects/setup-wizard/src/app/pages/loading/loading.module.ts b/web/projects/setup-wizard/src/app/pages/loading/loading.module.ts deleted file mode 100644 index 3de110846..000000000 --- a/web/projects/setup-wizard/src/app/pages/loading/loading.module.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { NgModule } from '@angular/core' -import { RouterModule, Routes } from '@angular/router' -import { InitializingModule } from '@start9labs/shared' -import { LoadingPage } from './loading.page' - -const routes: Routes = [ - { - path: '', - component: LoadingPage, - }, -] - -@NgModule({ - imports: [InitializingModule, RouterModule.forChild(routes)], - declarations: [LoadingPage], -}) -export class LoadingPageModule {} diff --git a/web/projects/setup-wizard/src/app/pages/loading/loading.page.html b/web/projects/setup-wizard/src/app/pages/loading/loading.page.html deleted file mode 100644 index 54609eb9a..000000000 --- a/web/projects/setup-wizard/src/app/pages/loading/loading.page.html +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/web/projects/setup-wizard/src/app/pages/loading/loading.page.ts b/web/projects/setup-wizard/src/app/pages/loading/loading.page.ts deleted file mode 100644 index f88c23e86..000000000 --- a/web/projects/setup-wizard/src/app/pages/loading/loading.page.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Component } from '@angular/core' -import { NavController } from '@ionic/angular' -import { StateService } from 'src/app/services/state.service' - -@Component({ - templateUrl: 'loading.page.html', -}) -export class LoadingPage { - constructor( - readonly stateService: StateService, - readonly navCtrl: NavController, - ) {} -} diff --git a/web/projects/setup-wizard/src/app/pages/recover.page.ts b/web/projects/setup-wizard/src/app/pages/recover.page.ts new file mode 100644 index 000000000..a7c10e708 --- /dev/null +++ b/web/projects/setup-wizard/src/app/pages/recover.page.ts @@ -0,0 +1,163 @@ +import { Component, inject } from '@angular/core' +import { Router } from '@angular/router' +import { DriveComponent, ErrorService } from '@start9labs/shared' +import { TuiDialogService, TuiLoaderModule } from '@taiga-ui/core' +import { + TuiButtonModule, + TuiCardModule, + TuiCellModule, + TuiIconModule, + TuiTitleModule, +} from '@taiga-ui/experimental' +import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' +import { filter } from 'rxjs' +import { CifsComponent } from 'src/app/components/cifs.component' +import { PASSWORD } from 'src/app/components/password.component' +import { + ApiService, + CifsRecoverySource, + DiskBackupTarget, +} from 'src/app/services/api.service' +import { StateService } from 'src/app/services/state.service' + +@Component({ + standalone: true, + template: ` +
    +
    Restore from Backup
    + @if (loading) { + + } @else { +

    Network Folder

    + Restore StartOS data from a folder on another computer that is connected + to the same network as your server. + + + +

    Physical Drive

    + Restore StartOS data from a physical drive that is plugged directly into + your server. + + Warning. Do not use this option if you are using a Raspberry Pi with + an external SSD as your main data drive. The Raspberry Pi cannot not + support more than one external drive without additional power and can + cause data corruption. + + + @for (d of drives; track d) { + + } + + + } +
    + `, + imports: [ + TuiCardModule, + TuiLoaderModule, + TuiButtonModule, + TuiCellModule, + TuiIconModule, + TuiTitleModule, + DriveComponent, + ], +}) +export default class RecoverPage { + private readonly api = inject(ApiService) + private readonly router = inject(Router) + private readonly dialogs = inject(TuiDialogService) + private readonly errorService = inject(ErrorService) + private readonly stateService = inject(StateService) + + loading = true + drives: DiskBackupTarget[] = [] + + async ngOnInit() { + this.stateService.setupType = 'restore' + await this.getDrives() + } + + async refresh() { + this.loading = true + await this.getDrives() + } + + empty(drive: DiskBackupTarget) { + return !drive['embassy-os']?.full + } + + async getDrives() { + this.drives = [] + try { + await this.api.getDrives().then(disks => + disks + .filter(d => d.partitions.length) + .forEach(d => { + d.partitions.forEach(p => { + this.drives.push({ ...d, ...p }) + }) + }), + ) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + this.loading = false + } + } + + select(target: DiskBackupTarget) { + const { logicalname } = target + + if (!logicalname) return + + this.dialogs + .open(PASSWORD, { + label: 'Unlock Drive', + size: 's', + data: { target }, + }) + .pipe(filter(Boolean)) + .subscribe(password => { + this.onSource(logicalname, password) + }) + } + + onCifs() { + this.dialogs + .open<{ + cifs: CifsRecoverySource + recoveryPassword: string + }>(new PolymorpheusComponent(CifsComponent), { + label: 'Connect Network Folder', + }) + .subscribe(({ cifs, recoveryPassword }) => { + this.stateService.recoverySource = { type: 'backup', target: cifs } + this.stateService.recoveryPassword = recoveryPassword + this.router.navigate(['storage']) + }) + } + + private onSource(logicalname: string, password?: string) { + this.stateService.recoverySource = { + type: 'backup', + target: { type: 'disk', logicalname }, + } + this.stateService.recoveryPassword = password + this.router.navigate(['storage']) + } +} diff --git a/web/projects/setup-wizard/src/app/pages/recover/drive-status.component.html b/web/projects/setup-wizard/src/app/pages/recover/drive-status.component.html deleted file mode 100644 index 7f4a4e5bd..000000000 --- a/web/projects/setup-wizard/src/app/pages/recover/drive-status.component.html +++ /dev/null @@ -1,14 +0,0 @@ -
    - -

    - - StartOS backup detected -

    - - -

    - - No StartOS backup -

    -
    -
    diff --git a/web/projects/setup-wizard/src/app/pages/recover/recover-routing.module.ts b/web/projects/setup-wizard/src/app/pages/recover/recover-routing.module.ts deleted file mode 100644 index 524458fa8..000000000 --- a/web/projects/setup-wizard/src/app/pages/recover/recover-routing.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NgModule } from '@angular/core' -import { RouterModule, Routes } from '@angular/router' -import { RecoverPage } from './recover.page' - -const routes: Routes = [ - { - path: '', - component: RecoverPage, - }, -] - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class RecoverPageRoutingModule { } diff --git a/web/projects/setup-wizard/src/app/pages/recover/recover.module.ts b/web/projects/setup-wizard/src/app/pages/recover/recover.module.ts deleted file mode 100644 index eaf04f506..000000000 --- a/web/projects/setup-wizard/src/app/pages/recover/recover.module.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { FormsModule } from '@angular/forms' -import { UnitConversionPipesModule } from '@start9labs/shared' -import { DriveStatusComponent, RecoverPage } from './recover.page' -import { PasswordPageModule } from '../../modals/password/password.module' -import { RecoverPageRoutingModule } from './recover-routing.module' -import { CifsModalModule } from 'src/app/modals/cifs-modal/cifs-modal.module' - -@NgModule({ - declarations: [RecoverPage, DriveStatusComponent], - imports: [ - CommonModule, - FormsModule, - IonicModule, - RecoverPageRoutingModule, - PasswordPageModule, - UnitConversionPipesModule, - CifsModalModule, - ], -}) -export class RecoverPageModule {} diff --git a/web/projects/setup-wizard/src/app/pages/recover/recover.page.html b/web/projects/setup-wizard/src/app/pages/recover/recover.page.html deleted file mode 100644 index 32f71a3ad..000000000 --- a/web/projects/setup-wizard/src/app/pages/recover/recover.page.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - Restore from Backup - - - - - - - - -

    Network Folder

    -

    - Restore StartOS data from a folder on another computer that is - connected to the same network as your server. -

    - - - - - - Open - - - -
    -
    - - -

    Physical Drive

    -
    -

    - Restore StartOS data from a physical drive that is plugged - directly into your server. -

    -
    - - Warning. Do not use this option if you are using a Raspberry - Pi with an external SSD as your main data drive. The Raspberry - Pi cannot not support more than one external drive without - additional power and can cause data corruption. - -
    - - - - - -

    {{ drive.label || drive.logicalname }}

    - -

    - {{ drive.vendor || 'Unknown Vendor' }} - {{ drive.model || - 'Unknown Model' }} -

    -

    Capacity: {{ drive.capacity | convertBytes }}

    -
    -
    -
    - - - Refresh - -
    -
    -
    -
    -
    -
    -
    diff --git a/web/projects/setup-wizard/src/app/pages/recover/recover.page.scss b/web/projects/setup-wizard/src/app/pages/recover/recover.page.scss deleted file mode 100644 index 4acada7bf..000000000 --- a/web/projects/setup-wizard/src/app/pages/recover/recover.page.scss +++ /dev/null @@ -1,5 +0,0 @@ -.target-label { - font-weight: 500; - padding-bottom: 6px; - font-variant-caps: all-small-caps; -} \ No newline at end of file diff --git a/web/projects/setup-wizard/src/app/pages/recover/recover.page.ts b/web/projects/setup-wizard/src/app/pages/recover/recover.page.ts deleted file mode 100644 index c0042cd95..000000000 --- a/web/projects/setup-wizard/src/app/pages/recover/recover.page.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { Component, Input } from '@angular/core' -import { NavController } from '@ionic/angular' -import { CifsModal } from 'src/app/modals/cifs-modal/cifs-modal.page' -import { - ApiService, - CifsRecoverySource, - DiskBackupTarget, -} from 'src/app/services/api/api.service' -import { ErrorService } from '@start9labs/shared' -import { StateService } from 'src/app/services/state.service' -import { PASSWORD } from '../../modals/password/password.page' -import { TuiDialogService } from '@taiga-ui/core' -import { filter } from 'rxjs' -import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' - -@Component({ - selector: 'app-recover', - templateUrl: 'recover.page.html', - styleUrls: ['recover.page.scss'], -}) -export class RecoverPage { - loading = true - mappedDrives: MappedDisk[] = [] - - constructor( - private readonly apiService: ApiService, - private readonly navCtrl: NavController, - private readonly dialogs: TuiDialogService, - private readonly errorService: ErrorService, - private readonly stateService: StateService, - ) {} - - async ngOnInit() { - this.stateService.setupType = 'restore' - await this.getDrives() - } - - async refresh() { - this.loading = true - await this.getDrives() - } - - driveClickable(mapped: MappedDisk) { - return mapped.drive['embassy-os']?.full - } - - async getDrives() { - this.mappedDrives = [] - try { - const disks = await this.apiService.getDrives() - disks - .filter(d => d.partitions.length) - .forEach(d => { - d.partitions.forEach(p => { - const drive: DiskBackupTarget = { - vendor: d.vendor, - model: d.model, - logicalname: p.logicalname, - label: p.label, - capacity: p.capacity, - used: p.used, - 'embassy-os': p['embassy-os'], - } - this.mappedDrives.push({ - hasValidBackup: !!p['embassy-os']?.full, - drive, - }) - }) - }) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - this.loading = false - } - } - - presentModalCifs() { - this.dialogs - .open<{ cifs: CifsRecoverySource; recoveryPassword: string }>( - new PolymorpheusComponent(CifsModal), - { - label: 'Connect Network Folder', - }, - ) - .subscribe(({ cifs, recoveryPassword }) => { - this.stateService.recoverySource = { - type: 'backup', - target: cifs, - } - this.stateService.recoveryPassword = recoveryPassword - this.navCtrl.navigateForward('/storage') - }) - } - - async select(target: DiskBackupTarget) { - const { logicalname } = target - - if (!logicalname) return - - this.dialogs - .open(PASSWORD, { - label: 'Unlock Drive', - size: 's', - data: { target }, - }) - .pipe(filter(Boolean)) - .subscribe(password => { - this.selectRecoverySource(logicalname, password) - }) - } - - private async selectRecoverySource(logicalname: string, password?: string) { - this.stateService.recoverySource = { - type: 'backup', - target: { - type: 'disk', - logicalname, - }, - } - this.stateService.recoveryPassword = password - this.navCtrl.navigateForward(`/storage`) - } -} - -@Component({ - selector: 'drive-status', - templateUrl: './drive-status.component.html', - styleUrls: ['./recover.page.scss'], -}) -export class DriveStatusComponent { - @Input({ required: true }) hasValidBackup!: boolean -} - -interface MappedDisk { - hasValidBackup: boolean - drive: DiskBackupTarget -} diff --git a/web/projects/setup-wizard/src/app/pages/embassy/embassy.page.ts b/web/projects/setup-wizard/src/app/pages/storage.page.ts similarity index 59% rename from web/projects/setup-wizard/src/app/pages/embassy/embassy.page.ts rename to web/projects/setup-wizard/src/app/pages/storage.page.ts index 33c2298d0..6622d4083 100644 --- a/web/projects/setup-wizard/src/app/pages/embassy/embassy.page.ts +++ b/web/projects/setup-wizard/src/app/pages/storage.page.ts @@ -1,49 +1,83 @@ -import { Component } from '@angular/core' -import { NavController } from '@ionic/angular' +import { Component, inject } from '@angular/core' +import { Router } from '@angular/router' import { DiskInfo, + DriveComponent, ErrorService, - GuidPipe, LoadingService, + toGuid, } from '@start9labs/shared' -import { TuiDialogService } from '@taiga-ui/core' +import { TuiDialogService, TuiLoaderModule } from '@taiga-ui/core' +import { + TuiButtonModule, + TuiCardModule, + TuiCellModule, +} from '@taiga-ui/experimental' +import { TUI_PROMPT } from '@taiga-ui/kit' +import { filter, of, switchMap } from 'rxjs' +import { PASSWORD } from 'src/app/components/password.component' import { ApiService, BackupRecoverySource, - DiskRecoverySource, DiskMigrateSource, -} from 'src/app/services/api/api.service' + DiskRecoverySource, +} from 'src/app/services/api.service' import { StateService } from 'src/app/services/state.service' -import { PASSWORD, PasswordPage } from '../../modals/password/password.page' -import { TUI_PROMPT } from '@taiga-ui/kit' -import { filter, of, switchMap } from 'rxjs' @Component({ - selector: 'app-embassy', - templateUrl: 'embassy.page.html', - styleUrls: ['embassy.page.scss'], - providers: [GuidPipe], + standalone: true, + template: ` +
    + @if (loading || drives.length) { +
    Select storage drive
    + This is the drive where your StartOS data will be stored. + } @else { +
    No drives found
    + Please connect a storage drive to your server. Then click "Refresh". + } + + @if (loading) { + + } + + @for (d of drives; track d) { + + } + + +
    + `, + imports: [ + TuiCardModule, + TuiLoaderModule, + TuiCellModule, + TuiButtonModule, + DriveComponent, + ], }) -export class EmbassyPage { - storageDrives: DiskInfo[] = [] - loading = true +export default class StoragePage { + private readonly api = inject(ApiService) + private readonly router = inject(Router) + private readonly dialogs = inject(TuiDialogService) + private readonly stateService = inject(StateService) + private readonly loader = inject(LoadingService) + private readonly errorService = inject(ErrorService) - constructor( - private readonly apiService: ApiService, - private readonly navCtrl: NavController, - private readonly dialogs: TuiDialogService, - private readonly stateService: StateService, - private readonly loader: LoadingService, - private readonly errorService: ErrorService, - private readonly guidPipe: GuidPipe, - ) {} + drives: DiskInfo[] = [] + loading = true async ngOnInit() { await this.getDrives() } - tooSmall(drive: DiskInfo) { - return drive.capacity < 34359738368 + isSmall({ capacity }: DiskInfo) { + return capacity < 34359738368 } async refresh() { @@ -54,11 +88,11 @@ export class EmbassyPage { async getDrives() { this.loading = true try { - const disks = await this.apiService.getDrives() + const disks = await this.api.getDrives() if (this.stateService.setupType === 'fresh') { - this.storageDrives = disks + this.drives = disks } else if (this.stateService.setupType === 'restore') { - this.storageDrives = disks.filter( + this.drives = disks.filter( d => !d.partitions .map(p => p.logicalname) @@ -72,7 +106,7 @@ export class EmbassyPage { } else if (this.stateService.setupType === 'transfer') { const guid = (this.stateService.recoverySource as DiskMigrateSource) .guid - this.storageDrives = disks.filter(d => { + this.drives = disks.filter(d => { return ( d.guid !== guid && !d.partitions.map(p => p.guid).includes(guid) ) @@ -85,8 +119,8 @@ export class EmbassyPage { } } - chooseDrive(drive: DiskInfo) { - of(!this.guidPipe.transform(drive) && !drive.partitions.some(p => p.used)) + select(drive: DiskInfo) { + of(!toGuid(drive) && !drive.partitions.some(p => p.used)) .pipe( switchMap(unused => unused @@ -138,7 +172,7 @@ export class EmbassyPage { try { await this.stateService.setupEmbassy(logicalname, password) - await this.navCtrl.navigateForward(`/loading`) + await this.router.navigate([`loading`]) } catch (e: any) { this.errorService.handleError(e) } finally { diff --git a/web/projects/setup-wizard/src/app/pages/success.page.ts b/web/projects/setup-wizard/src/app/pages/success.page.ts new file mode 100644 index 000000000..fab7825df --- /dev/null +++ b/web/projects/setup-wizard/src/app/pages/success.page.ts @@ -0,0 +1,175 @@ +import { DOCUMENT } from '@angular/common' +import { + AfterViewInit, + Component, + ElementRef, + inject, + ViewChild, +} from '@angular/core' +import { DownloadHTMLService, ErrorService } from '@start9labs/shared' +import { + TuiButtonModule, + TuiCardModule, + TuiIconModule, + TuiSurfaceModule, +} from '@taiga-ui/experimental' +import { DocumentationComponent } from 'src/app/components/documentation.component' +import { MatrixComponent } from 'src/app/components/matrix.component' +import { ApiService } from 'src/app/services/api.service' +import { StateService } from 'src/app/services/state.service' + +@Component({ + standalone: true, + template: ` + + @if (isKiosk) { +
    +

    + + Setup Complete! +

    + +
    + } @else if (lanAddress) { +
    +

    + + Setup Complete! +

    + @if (stateService.setupType === 'restore') { +

    You can now safely unplug your backup drive

    + } @else if (stateService.setupType === 'transfer') { +

    You can now safely unplug your old StartOS data drive

    + } + + + + + Trust your Root CA + + In the new tab, follow instructions to trust your server's Root CA + and log in. + + + Open + + + +
    + } + `, + styles: ` + .heading { + display: flex; + gap: 1rem; + align-items: center; + margin: 0; + font: var(--tui-font-heading-4); + } + + .caps { + display: flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + text-transform: uppercase; + } + + [tuiCardLarge] { + color: var(--tui-text-01); + text-decoration: none; + text-align: center; + } + + a[tuiCardLarge]:not([href]) { + opacity: var(--tui-disabled-opacity); + pointer-events: none; + } + `, + imports: [ + TuiCardModule, + TuiIconModule, + TuiButtonModule, + TuiSurfaceModule, + MatrixComponent, + DocumentationComponent, + ], +}) +export default class SuccessPage implements AfterViewInit { + @ViewChild(DocumentationComponent, { read: ElementRef }) + private readonly documentation?: ElementRef + + private readonly document = inject(DOCUMENT) + private readonly errorService = inject(ErrorService) + private readonly api = inject(ApiService) + private readonly downloadHtml = inject(DownloadHTMLService) + + readonly stateService = inject(StateService) + readonly isKiosk = ['localhost', '127.0.0.1'].includes( + this.document.location.hostname, + ) + + torAddress?: string + lanAddress?: string + cert?: string + disableLogin = this.stateService.setupType === 'fresh' + + ngAfterViewInit() { + setTimeout(() => this.complete(), 1000) + } + + download() { + const torAddress = this.document.getElementById('tor-addr') + const lanAddress = this.document.getElementById('lan-addr') + const html = this.documentation?.nativeElement.innerHTML || '' + + if (torAddress) torAddress.innerHTML = this.torAddress! + if (lanAddress) lanAddress.innerHTML = this.lanAddress! + + this.document + .getElementById('cert') + ?.setAttribute( + 'href', + `data:application/x-x509-ca-cert;base64,${encodeURIComponent(this.cert!)}`, + ) + this.downloadHtml.download('StartOS-info.html', html).then(_ => { + this.disableLogin = false + }) + } + + exitKiosk() { + this.api.exit() + } + + private async complete() { + try { + const ret = await this.api.complete() + if (!this.isKiosk) { + this.torAddress = ret['tor-address'].replace(/^https:/, 'http:') + this.lanAddress = ret['lan-address'].replace(/^https:/, 'http:') + this.cert = ret['root-ca'] + + await this.api.exit() + } + } catch (e: any) { + this.errorService.handleError(e) + } + } +} diff --git a/web/projects/setup-wizard/src/app/pages/success/download-doc/download-doc.component.html b/web/projects/setup-wizard/src/app/pages/success/download-doc/download-doc.component.html deleted file mode 100644 index 51e2c8483..000000000 --- a/web/projects/setup-wizard/src/app/pages/success/download-doc/download-doc.component.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - StartOS Address Info - - -
    -

    - StartOS Address Info -

    - -
    -
    -

    Important!

    -

    - Download your server's Root CA and - - follow the instructions - - to establish a secure connection with your server. -

    -
    - -
    -
    -

    - Access from home (LAN) -

    -

    - Visit the address below when you are connected to the same WiFi or - Local Area Network (LAN) as your server. -

    -

    - -

    - -

    - Access on the go (Tor) -

    -

    Visit the address below when you are away from home.

    -

    - Note: - This address will only work from a Tor-enabled browser. - - Follow the instructions - - to get setup. -

    -

    - -

    -
    -
    - - diff --git a/web/projects/setup-wizard/src/app/pages/success/download-doc/download-doc.component.ts b/web/projects/setup-wizard/src/app/pages/success/download-doc/download-doc.component.ts deleted file mode 100644 index 6d8fb54d1..000000000 --- a/web/projects/setup-wizard/src/app/pages/success/download-doc/download-doc.component.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Component, Input } from '@angular/core' - -@Component({ - selector: 'download-doc', - templateUrl: 'download-doc.component.html', -}) -export class DownloadDocComponent { - @Input({ required: true }) lanAddress!: string - - get crtName(): string { - const hostname = new URL(this.lanAddress).hostname - return `${hostname}.crt` - } -} diff --git a/web/projects/setup-wizard/src/app/pages/success/success-routing.module.ts b/web/projects/setup-wizard/src/app/pages/success/success-routing.module.ts deleted file mode 100644 index 33c6de9be..000000000 --- a/web/projects/setup-wizard/src/app/pages/success/success-routing.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NgModule } from '@angular/core' -import { RouterModule, Routes } from '@angular/router' -import { SuccessPage } from './success.page' - -const routes: Routes = [ - { - path: '', - component: SuccessPage, - }, -] - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class SuccessPageRoutingModule {} diff --git a/web/projects/setup-wizard/src/app/pages/success/success.module.ts b/web/projects/setup-wizard/src/app/pages/success/success.module.ts deleted file mode 100644 index ef937ded7..000000000 --- a/web/projects/setup-wizard/src/app/pages/success/success.module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { FormsModule } from '@angular/forms' -import { ResponsiveColDirective } from '@start9labs/shared' - -import { SuccessPage } from './success.page' -import { PasswordPageModule } from '../../modals/password/password.module' -import { SuccessPageRoutingModule } from './success-routing.module' -import { DownloadDocComponent } from './download-doc/download-doc.component' - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - IonicModule, - PasswordPageModule, - SuccessPageRoutingModule, - ResponsiveColDirective, - ], - declarations: [SuccessPage, DownloadDocComponent], - exports: [SuccessPage], -}) -export class SuccessPageModule {} diff --git a/web/projects/setup-wizard/src/app/pages/success/success.page.html b/web/projects/setup-wizard/src/app/pages/success/success.page.html deleted file mode 100644 index dbce29073..000000000 --- a/web/projects/setup-wizard/src/app/pages/success/success.page.html +++ /dev/null @@ -1,102 +0,0 @@ -Your browser does not support the canvas element. - - - - - - - - - -
    - -

    Setup Complete!

    -
    - -
    -
    -
    -
    - - - - - -
    -
    - -

    Setup Complete!

    -
    -

    - You can now safely unplug your backup drive -

    -

    - You can now safely unplug your old StartOS data drive -

    -
    -
    - - - Download address info -

    - start.local was for setup purposes only. It will no - longer work. -

    -
    - -
    -

    Download

    - -
    -
    -
    - - - Trust your Root CA -

    - In the new tab, follow instructions to trust your - server's Root CA and log in. -

    -
    - -
    -
    -

    Open

    - -
    -
    -
    -
    -
    -
    -
    - - -
    -
    -
    -
    -
    -
    diff --git a/web/projects/setup-wizard/src/app/pages/success/success.page.scss b/web/projects/setup-wizard/src/app/pages/success/success.page.scss deleted file mode 100644 index 910849788..000000000 --- a/web/projects/setup-wizard/src/app/pages/success/success.page.scss +++ /dev/null @@ -1,183 +0,0 @@ -canvas { - position: fixed; - left: 0; - top: 0; - z-index: -1; -} - -h1 { - font-variant: all-small-caps; - margin: unset; -} - -ion-content { - position: absolute; - z-index: 0; - --background: transparent; -} - -ion-grid { - max-width: 760px; -} - -.inline-container { - display: flex; - justify-content: center; - align-items: center; -} - -.card-container { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - gap: 1rem; -} - -ion-card { - padding: 2.4rem; - - h1 { - color: var(--ion-color-success); - padding-left: 0.5rem; - } - ion-icon { - font-size: 40px; - } - - li { - margin-bottom: 2rem; - } - - // download info card - ion-card { - min-height: 260px; - width: 80%; - background: #615F5F; - color: var(--ion-text-color); - box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); - border-radius: 44px; - text-align: left; - cursor: pointer; - position: relative; - padding: 1rem 2rem; - transition: all 350ms ease; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - - &:hover { - transition-property: transform; - transform: scale(1.05); - transition-delay: 40ms; - } - - ion-card-title { - color: var(--ion-text-color); - font-size: 1.3rem; - } - - ion-footer { - position: absolute; - bottom: 10px; - left: 0; - color: var(--ion-text-color); - - p { - font-size: 1.1rem; - font-weight: bold; - margin: unset; - } - - ion-icon { - font-size: 1.6rem; - } - } - - .footer-md::before { - background-image: none; - } - } - - .login-button { - --background: var(--color-accent); - --padding-bottom: 2.5rem; - --padding-top: 2.5rem; - --padding-start: 2.5rem; - --padding-end: 2.5rem; - --border-radius: 44px; - font-size: 1.4rem !important; - font-weight: bold; - text-transform: none; - letter-spacing: normal; - transition: all 350ms ease; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - - &:hover { - transition-property: transform; - transform: scale(1.05); - transition-delay: 40ms; - } - - ion-icon { - font-size: 1.7rem; - } - } - - .launch-button { - --background: var(--alt-blue); - } - - #information:after, #launch:after { - content: ''; - position: absolute; - left: 0; - top: 79%; - width: 100%; - height: 100%; - background: var(--color-accent); - } - - #launch:after { - background: var(--alt-blue); - } - -} - -.mb-12 { - margin-bottom: 3rem; -} - -.pb-2 { - padding-bottom: 0.5rem; -} - -.pt-1 { - padding-top: 0.25rem; -} - - -.action-text { - font-variant-caps: all-small-caps; - padding-right: 0.5rem; - font-size: 1.5rem !important; - letter-spacing: 0.03rem; - padding-bottom: 0.1rem; -} - -@media (max-width: 700px) { - .setup { - flex-direction: column; - } - - ion-card { - ion-card { - width: 100%; - padding-bottom: unset; - } - #information:after { - top: 84%; - } - #launch:after { - top: 85%; - } - } -} \ No newline at end of file diff --git a/web/projects/setup-wizard/src/app/pages/success/success.page.ts b/web/projects/setup-wizard/src/app/pages/success/success.page.ts deleted file mode 100644 index 9847c0e67..000000000 --- a/web/projects/setup-wizard/src/app/pages/success/success.page.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { DOCUMENT } from '@angular/common' -import { Component, ElementRef, Inject, NgZone, ViewChild } from '@angular/core' -import { DownloadHTMLService, ErrorService } from '@start9labs/shared' -import { ApiService } from 'src/app/services/api/api.service' -import { StateService } from 'src/app/services/state.service' - -@Component({ - selector: 'success', - templateUrl: 'success.page.html', - styleUrls: ['success.page.scss'], -}) -export class SuccessPage { - @ViewChild('canvas', { static: true }) - private canvas: ElementRef = - {} as ElementRef - private ctx: CanvasRenderingContext2D = {} as CanvasRenderingContext2D - - torAddress?: string - lanAddress?: string - cert?: string - - tileSize = 16 - // a higher fade factor will make the characters fade quicker - fadeFactor = 0.07 - columns: any[] = [] - maxStackHeight: any - disableLogin = this.stateService.setupType === 'fresh' - - constructor( - @Inject(DOCUMENT) private readonly document: Document, - private readonly errorService: ErrorService, - private readonly stateService: StateService, - private readonly api: ApiService, - private readonly downloadHtml: DownloadHTMLService, - private readonly ngZone: NgZone, - ) {} - - get setupType() { - return this.stateService.setupType - } - - get isKiosk() { - return ['localhost', '127.0.0.1'].includes(this.document.location.hostname) - } - - async ngAfterViewInit() { - this.ngZone.runOutsideAngular(() => this.initMatrix()) - setTimeout(() => this.complete(), 1000) - } - - download() { - const torAddress = this.document.getElementById('tor-addr') - const lanAddress = this.document.getElementById('lan-addr') - - if (torAddress) torAddress.innerHTML = this.torAddress! - if (lanAddress) lanAddress.innerHTML = this.lanAddress! - - this.document - .getElementById('cert') - ?.setAttribute( - 'href', - 'data:application/x-x509-ca-cert;base64,' + - encodeURIComponent(this.cert!), - ) - let html = this.document.getElementById('downloadable')?.innerHTML || '' - this.downloadHtml.download('StartOS-info.html', html).then(_ => { - this.disableLogin = false - }) - } - - exitKiosk() { - this.api.exit() - } - - private async complete() { - try { - const ret = await this.api.complete() - if (!this.isKiosk) { - this.torAddress = ret['tor-address'].replace(/^https:/, 'http:') - this.lanAddress = ret['lan-address'].replace(/^https:/, 'http:') - this.cert = ret['root-ca'] - - await this.api.exit() - } - } catch (e: any) { - this.errorService.handleError(e) - } - } - - private initMatrix() { - this.ctx = this.canvas.nativeElement.getContext('2d')! - this.canvas.nativeElement.width = window.innerWidth - this.canvas.nativeElement.height = window.innerHeight - this.setupMatrixGrid() - this.tick() - } - - private setupMatrixGrid() { - this.maxStackHeight = Math.ceil(this.ctx.canvas.height / this.tileSize) - // divide the canvas into columns - for (let i = 0; i < this.ctx.canvas.width / this.tileSize; ++i) { - const column = {} as any - // save the x position of the column - column.x = i * this.tileSize - // create a random stack height for the column - column.stackHeight = 10 + Math.random() * this.maxStackHeight - // add a counter to count the stack height - column.stackCounter = 0 - // add the column to the list - this.columns.push(column) - } - } - - private draw() { - // draw a semi transparent black rectangle on top of the scene to slowly fade older characters - this.ctx.fillStyle = 'rgba( 0 , 0 , 0 , ' + this.fadeFactor + ' )' - this.ctx.fillRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height) - // pick a font slightly smaller than the tile size - this.ctx.font = this.tileSize - 2 + 'px monospace' - this.ctx.fillStyle = '#ff4961' - for (let i = 0; i < this.columns.length; ++i) { - // pick a random ascii character (change the 94 to a higher number to include more characters) - const randomCharacter = String.fromCharCode( - 33 + Math.floor(Math.random() * 94), - ) - this.ctx.fillText( - randomCharacter, - this.columns[i].x, - this.columns[i].stackCounter * this.tileSize + this.tileSize, - ) - // if the stack is at its height limit, pick a new random height and reset the counter - if (++this.columns[i].stackCounter >= this.columns[i].stackHeight) { - this.columns[i].stackHeight = 10 + Math.random() * this.maxStackHeight - this.columns[i].stackCounter = 0 - } - } - } - - private tick() { - this.draw() - setTimeout(this.tick.bind(this), 50) - } -} diff --git a/web/projects/setup-wizard/src/app/pages/transfer.page.ts b/web/projects/setup-wizard/src/app/pages/transfer.page.ts new file mode 100644 index 000000000..eca9b8820 --- /dev/null +++ b/web/projects/setup-wizard/src/app/pages/transfer.page.ts @@ -0,0 +1,105 @@ +import { Component, inject } from '@angular/core' +import { Router } from '@angular/router' +import { + DiskInfo, + DriveComponent, + ErrorService, + toGuid, +} from '@start9labs/shared' +import { + TuiDialogOptions, + TuiDialogService, + TuiLoaderModule, +} from '@taiga-ui/core' +import { + TuiButtonModule, + TuiCardModule, + TuiCellModule, +} from '@taiga-ui/experimental' +import { TUI_PROMPT, TuiPromptData } from '@taiga-ui/kit' +import { filter } from 'rxjs' +import { ApiService } from 'src/app/services/api.service' +import { StateService } from 'src/app/services/state.service' + +@Component({ + standalone: true, + template: ` +
    +
    Transfer
    + Select the physical drive containing your StartOS data + @if (loading) { + + } + @for (drive of drives; track drive) { + + } + +
    + `, + imports: [ + TuiCardModule, + TuiCellModule, + TuiButtonModule, + TuiLoaderModule, + DriveComponent, + ], +}) +export default class TransferPage { + private readonly apiService = inject(ApiService) + private readonly router = inject(Router) + private readonly dialogs = inject(TuiDialogService) + private readonly errorService = inject(ErrorService) + private readonly stateService = inject(StateService) + + loading = true + drives: DiskInfo[] = [] + + async ngOnInit() { + this.stateService.setupType = 'transfer' + await this.getDrives() + } + + async refresh() { + await this.getDrives() + } + + async getDrives() { + this.loading = true + + try { + this.drives = await this.apiService + .getDrives() + .then(drives => drives.filter(toGuid)) + } catch (e: any) { + this.errorService.handleError(e) + } finally { + this.loading = false + } + } + + select(drive: DiskInfo) { + this.dialogs + .open(TUI_PROMPT, OPTIONS) + .pipe(filter(Boolean)) + .subscribe(() => { + this.stateService.recoverySource = { + type: 'migrate', + guid: toGuid(drive) || '', + } + this.router.navigate([`storage`]) + }) + } +} + +const OPTIONS: Partial> = { + label: 'Warning', + size: 's', + data: { + content: + 'After transferring data from this drive, do not attempt to boot into it again as a Start9 Server. This may result in services malfunctioning, data corruption, or loss of funds.', + yes: 'Continue', + no: 'Cancel', + }, +} diff --git a/web/projects/setup-wizard/src/app/pages/transfer/transfer-routing.module.ts b/web/projects/setup-wizard/src/app/pages/transfer/transfer-routing.module.ts deleted file mode 100644 index acee2e7f3..000000000 --- a/web/projects/setup-wizard/src/app/pages/transfer/transfer-routing.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NgModule } from '@angular/core' -import { RouterModule, Routes } from '@angular/router' -import { TransferPage } from './transfer.page' - -const routes: Routes = [ - { - path: '', - component: TransferPage, - }, -] - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class TransferPageRoutingModule {} diff --git a/web/projects/setup-wizard/src/app/pages/transfer/transfer.module.ts b/web/projects/setup-wizard/src/app/pages/transfer/transfer.module.ts deleted file mode 100644 index 2dfd57b20..000000000 --- a/web/projects/setup-wizard/src/app/pages/transfer/transfer.module.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { - GuidPipePipesModule, - UnitConversionPipesModule, -} from '@start9labs/shared' -import { TransferPage } from './transfer.page' -import { TransferPageRoutingModule } from './transfer-routing.module' - -@NgModule({ - declarations: [TransferPage], - imports: [ - CommonModule, - IonicModule, - TransferPageRoutingModule, - UnitConversionPipesModule, - GuidPipePipesModule, - ], -}) -export class TransferPageModule {} diff --git a/web/projects/setup-wizard/src/app/pages/transfer/transfer.page.html b/web/projects/setup-wizard/src/app/pages/transfer/transfer.page.html deleted file mode 100644 index 958a1e6d8..000000000 --- a/web/projects/setup-wizard/src/app/pages/transfer/transfer.page.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - Transfer -
    - - Select the physical drive containing your StartOS data - -
    -
    - - - - - - - - - - - -

    {{ drive.logicalname }}

    -

    - {{ drive.vendor || 'Unknown Vendor' }} - {{ drive.model || - 'Unknown Model' }} -

    -

    Capacity: {{ drive.capacity | convertBytes }}

    -
    -
    -
    - - - Refresh - -
    -
    -
    -
    -
    -
    -
    diff --git a/web/projects/setup-wizard/src/app/pages/transfer/transfer.page.scss b/web/projects/setup-wizard/src/app/pages/transfer/transfer.page.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/setup-wizard/src/app/pages/transfer/transfer.page.ts b/web/projects/setup-wizard/src/app/pages/transfer/transfer.page.ts deleted file mode 100644 index 8cf58d7fa..000000000 --- a/web/projects/setup-wizard/src/app/pages/transfer/transfer.page.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { Component } from '@angular/core' -import { NavController } from '@ionic/angular' -import { ApiService } from 'src/app/services/api/api.service' -import { DiskInfo, ErrorService } from '@start9labs/shared' -import { StateService } from 'src/app/services/state.service' -import { TuiDialogService } from '@taiga-ui/core' -import { TUI_PROMPT } from '@taiga-ui/kit' -import { filter } from 'rxjs' - -@Component({ - selector: 'app-transfer', - templateUrl: 'transfer.page.html', - styleUrls: ['transfer.page.scss'], -}) -export class TransferPage { - loading = true - drives: DiskInfo[] = [] - - constructor( - private readonly apiService: ApiService, - private readonly navCtrl: NavController, - private readonly dialogs: TuiDialogService, - private readonly errorService: ErrorService, - private readonly stateService: StateService, - ) {} - - async ngOnInit() { - this.stateService.setupType = 'transfer' - await this.getDrives() - } - - async refresh() { - this.loading = true - await this.getDrives() - } - - async getDrives() { - try { - this.drives = await this.apiService.getDrives() - } catch (e: any) { - this.errorService.handleError(e) - } finally { - this.loading = false - } - } - - select(guid: string) { - this.dialogs - .open(TUI_PROMPT, { - label: 'Warning', - size: 's', - data: { - content: - 'After transferring data from this drive, do not attempt to boot into it again as a Start9 Server. This may result in services malfunctioning, data corruption, or loss of funds.', - yes: 'Continue', - no: 'Cancel', - }, - }) - .pipe(filter(Boolean)) - .subscribe(() => { - this.stateService.recoverySource = { - type: 'migrate', - guid, - } - this.navCtrl.navigateForward(`/storage`) - }) - } -} diff --git a/web/projects/setup-wizard/src/app/services/api/api.service.ts b/web/projects/setup-wizard/src/app/services/api.service.ts similarity index 100% rename from web/projects/setup-wizard/src/app/services/api/api.service.ts rename to web/projects/setup-wizard/src/app/services/api.service.ts diff --git a/web/projects/setup-wizard/src/app/services/api/live-api.service.ts b/web/projects/setup-wizard/src/app/services/live-api.service.ts similarity index 96% rename from web/projects/setup-wizard/src/app/services/api/live-api.service.ts rename to web/projects/setup-wizard/src/app/services/live-api.service.ts index b13967f91..666d2beb9 100644 --- a/web/projects/setup-wizard/src/app/services/api/live-api.service.ts +++ b/web/projects/setup-wizard/src/app/services/live-api.service.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core' +import { inject, Injectable } from '@angular/core' import { DiskListResponse, StartOSDiskInfo, @@ -28,9 +28,7 @@ import { Observable } from 'rxjs' providedIn: 'root', }) export class LiveApiService extends ApiService { - constructor(private readonly http: HttpService) { - super() - } + private readonly http = inject(HttpService) async getSetupStatus() { return this.rpcRequest({ diff --git a/web/projects/setup-wizard/src/app/services/api/mock-api.service.ts b/web/projects/setup-wizard/src/app/services/mock-api.service.ts similarity index 99% rename from web/projects/setup-wizard/src/app/services/api/mock-api.service.ts rename to web/projects/setup-wizard/src/app/services/mock-api.service.ts index e170683eb..00032ba9f 100644 --- a/web/projects/setup-wizard/src/app/services/api/mock-api.service.ts +++ b/web/projects/setup-wizard/src/app/services/mock-api.service.ts @@ -111,7 +111,7 @@ export class MockApiService extends ApiService { guid: 'guid-guid-guid-guid', }, ], - capacity: 1000190509056, + capacity: 1000190509, guid: null, }, ] diff --git a/web/projects/setup-wizard/src/app/services/state.service.ts b/web/projects/setup-wizard/src/app/services/state.service.ts index e70478559..b4b5a1264 100644 --- a/web/projects/setup-wizard/src/app/services/state.service.ts +++ b/web/projects/setup-wizard/src/app/services/state.service.ts @@ -1,17 +1,16 @@ -import { Injectable } from '@angular/core' -import { ApiService, RecoverySource } from './api/api.service' +import { inject, Injectable } from '@angular/core' +import { ApiService, RecoverySource } from './api.service' @Injectable({ providedIn: 'root', }) export class StateService { - setupType?: 'fresh' | 'restore' | 'attach' | 'transfer' + private readonly api = inject(ApiService) + setupType?: 'fresh' | 'restore' | 'attach' | 'transfer' recoverySource?: RecoverySource recoveryPassword?: string - constructor(private readonly api: ApiService) {} - async importDrive(guid: string, password: string): Promise { await this.api.attach({ guid, diff --git a/web/projects/setup-wizard/src/styles.scss b/web/projects/setup-wizard/src/styles.scss index b9f09b845..5ff5bd3c4 100644 --- a/web/projects/setup-wizard/src/styles.scss +++ b/web/projects/setup-wizard/src/styles.scss @@ -1,345 +1,69 @@ -@font-face { - font-family: 'Montserrat'; - font-style: normal; - font-weight: normal; - src: url('/assets/fonts/Montserrat/Montserrat-Regular.ttf'); -} - -@font-face { - font-family: 'Montserrat'; - font-style: normal; - font-weight: bold; - src: url('/assets/fonts/Montserrat/Montserrat-Bold.ttf'); -} - -@font-face { - font-family: 'Montserrat'; - font-style: normal; - font-weight: 600; - src: url('/assets/fonts/Montserrat/Montserrat-SemiBold.ttf'); -} - -@font-face { - font-family: 'Montserrat'; - font-style: normal; - font-weight: bold; - src: url('/assets/fonts/Montserrat/Montserrat-Bold.ttf'); -} - -@font-face { - font-family: 'Montserrat'; - font-style: normal; - font-weight: 500; - src: url('/assets/fonts/Montserrat/Montserrat-Medium.ttf'); -} - -@font-face { - font-family: 'Montserrat'; - font-style: normal; - font-weight: thin; - src: url('/assets/fonts/Montserrat/Montserrat-Light.ttf'); -} - -@font-face { - font-family: 'Benton Sans'; - font-style: normal; - font-weight: normal; - src: url('/assets/fonts/Benton_Sans/BentonSans-Regular.otf'); -} - -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: normal; - src: url('/assets/fonts/Open_Sans/OpenSans-Regular.ttf'); -} - -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: bold; - src: url('/assets/fonts/Open_Sans/OpenSans-Bold.ttf'); -} - -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 700; - src: url('/assets/fonts/Open_Sans/OpenSans-Bold.ttf'); -} - -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 600; - src: url('/assets/fonts/Open_Sans/OpenSans-SemiBold.ttf'); -} - -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: thin; - src: url('/assets/fonts/Open_Sans/OpenSans-Light.ttf'); -} - -/** Ionic CSS Variables overrides **/ -:root { - --ion-font-family: 'Montserrat', sans-serif; - - --ion-background-color: #333333; - --ion-background-color-rgb: 51, 51, 51; - - --ion-text-color: #F4F4F5; - --ion-text-color-rgb: 244, 244, 245; - - --ion-color-step-50: #3d3d3d; - --ion-color-step-100: #464646; - --ion-color-step-150: #505050; - --ion-color-step-200: #5a5a5a; - --ion-color-step-250: #636364; - --ion-color-step-300: #6d6d6d; - --ion-color-step-350: #777777; - --ion-color-step-400: #808081; - --ion-color-step-450: #8a8a8a; - --ion-color-step-500: #949494; - --ion-color-step-550: #9d9d9e; - --ion-color-step-600: #a7a7a7; - --ion-color-step-650: #b0b0b1; - --ion-color-step-700: #bababb; - --ion-color-step-750: #c4c4c5; - --ion-color-step-800: #cdcdce; - --ion-color-step-850: #d7d7d8; - --ion-color-step-900: #e1e1e2; - --ion-color-step-950: #eaeaeb; - - - --ion-color-dark: var(--ion-color-step-50) !important; - // --ion-color-base-rgb: - --ion-color-dark-contrast: var(--ion-color-step-950) !important; - // --ion-color-dark-contrast-rgb: - --ion-color-dark-shade: var(--ion-color-step-100) !important; - --ion-color-dark-tint: var(--ion-color-step-250) !important; - - --color-accent: #6866cc; - --color-dark-black: #121212; - - --alt-red: #FF4961; - --alt-orange: #F89248; - --alt-yellow: #E5D53E; - --alt-green: #3DCF6F; - --alt-blue: #00A8A8; - --alt-purple: #9747FF; -} - -h1, -h2, -h3, -h4 { - font-weight: 400; -} - -h1 { - font-size: 42px; -} - -ion-card-title { - margin: 16px 0; - font-family: 'Montserrat', sans-serif; - font-size: x-large; - --color: var(--ion-color-light); -} - -ion-card-subtitle { - font-size: 20px; - font-weight: 200; - max-width: 400px; - padding: 0.7rem; - color: var(--ion-color-step-900) !important; -} - -ion-label ion-text { - font-size: 1.2rem; - font-weight: 500; -} - -p { - color: var(--ion-color-dark-contrast) !important; - font-size: 1.12rem !important; - font-family: 'Open Sans', sans-serif; - font-weight: normal; -} - -ion-icon { - color: var(--ion-color-dark-contrast) !important; -} - -.small-caps { - font-variant-caps: all-small-caps; -} - -ion-grid { - padding-top: 32px; +html, +body { height: 100%; - max-width: 695px; -} - -ion-row { - height: 90%; -} - -ion-card { - border-radius: 31px; -} - -ion-item { - --highlight-color-valid: transparent; - --highlight-color-invalid: transparent; -} - -ion-avatar { - width: 27px; - height: 27px; -} - -ion-toast { - --background: var(--ion-color-light); - --button-color: var(--ion-color-dark); - --border-style: solid; - --border-width: 1px; - --color: white; -} - -.center-spinner { - height: 6vh; - width: 100%; -} - -.inline { - * { - display: inline-block; - vertical-align: middle; - padding-left: 0px 0.3rem; - } -} - -.claim-button { - margin-inline-start: 0; - margin-inline-end: 0; - margin-top: 24px; - min-width: 140px; -} - -.error-toast { - --border-color: var(--ion-color-danger); - width: 40%; - min-width: 400px; - --end: 8px; - right: 8px; - left: unset; - top: 64px; -} - -.error-border { - border: 2px solid var(--ion-color-danger); - border-radius: 4px; -} - -.success-border { - border: 2px solid var(--ion-color-success); - border-radius: 4px; } -.sc-ion-label-md-s p { - line-height: 23px; -} - -ion-button { - --padding-top: 1.3rem; - --padding-bottom: 1.3rem; -} - -ion-item { - border: var(--ion-color-step-750) 1px solid; - margin: 2rem; - --background: transparent; - --border-color: var(--ion-item-border-color, var(--ion-border-color, var(--ion-color-step-150, rgba(0, 0, 0, 0.13)))); - transition: all 350ms ease; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - - &:hover { - transition-property: transform; - transform: scale(1.05); - transition-delay: 40ms; - } - - ion-button { - --padding-top: unset; - --padding-bottom: unset; - } +app-root { + display: block; + height: 100%; } -.item.sc-ion-label-md-h, -.item .sc-ion-label-md-h { - white-space: normal; +tui-root { + height: 100%; } -.center-wrapper { +router-outlet + * { + height: 100%; + max-width: min(35rem, 100vw); display: flex; - justify-content: center; + flex-direction: column; align-items: center; - height: 100%; -} - - -.loader { - --spinner-color: var(--ion-color-tertiary) !important; -} - -.toolbar-background { - background: #2a2a2a !important; + box-sizing: border-box; + padding: 2rem; + margin: 0 auto; + + [tuiCardLarge] { + width: 100%; + background: var(--tui-base-02); + margin: auto; + } } -.toolbar-container { - padding-right: 2rem !important; +button:disabled { + opacity: var(--tui-disabled-opacity); + pointer-events: none; } -ion-header { - ion-toolbar { - --border-color: var(--ion-color-step-950); - --border-width: 0 0 1px 0; +header { + position: relative; + display: flex; + flex-direction: column; + text-align: center; + font: var(--tui-font-heading-4); - --min-height: 80px; - --padding-top: 20px; - --padding-bottom: 20px; - --padding-end: 2rem; + p { + font: var(--tui-font-text-m); + color: var(--tui-text-02); } } -ion-footer { - ion-toolbar { - --border-width: 0; - --padding-end: 2.3rem; - --padding-bottom: 2rem; - } +h2 { + margin: 0; + font: var(--tui-font-heading-6); } -.footer-md::before { - content: none; +.g-success { + color: var(--tui-success-fill); } -@media (max-width: 500px) { - h1 { - font-size: 36px; - } +.g-warning { + color: var(--tui-warning-fill); +} - ion-item { - margin: 0 0.5rem 2rem 0.5rem; - } +.g-error { + color: var(--tui-error-fill); } -p a { - color: var(--ion-text-color); - // text-decoration: none; - font-weight: 600; - text-underline-offset: 0.4rem; +.g-info { + color: var(--tui-info-fill); } diff --git a/web/projects/shared/package.json b/web/projects/shared/package.json index b0063e302..77f70e0b7 100644 --- a/web/projects/shared/package.json +++ b/web/projects/shared/package.json @@ -5,12 +5,12 @@ "@angular/common": "^17.0.6", "@angular/core": "^17.0.6", "@angular/router": "^17.0.6", - "@ionic/angular": ">=6.0.0", "@ng-web-apis/mutation-observer": ">=2.0.0", "@ng-web-apis/resize-observer": ">=2.0.0", "@start9labs/emver": "^0.1.5", "@taiga-ui/cdk": ">=3.0.0", "@taiga-ui/core": ">=3.0.0", + "@taiga-ui/experimental": ">=3.0.0", "@tinkoff/ng-dompurify": ">=4.0.0", "ansi-to-html": "^0.7.2" }, diff --git a/web/projects/shared/src/components/drive.component.ts b/web/projects/shared/src/components/drive.component.ts new file mode 100644 index 000000000..59ff90727 --- /dev/null +++ b/web/projects/shared/src/components/drive.component.ts @@ -0,0 +1,29 @@ +import { Component, Input } from '@angular/core' +import { TuiIconModule, TuiTitleModule } from '@taiga-ui/experimental' +import { UnitConversionPipesModule } from '../pipes/unit-conversion/unit-conversion.module' + +@Component({ + standalone: true, + selector: 'button[drive]', + template: ` + + + {{ drive.logicalname }} + + {{ drive.vendor || 'Unknown Vendor' }} - + {{ drive.model || 'Unknown Model' }} + + Capacity: {{ drive.capacity | convertBytes }} + + + `, + imports: [TuiIconModule, TuiTitleModule, UnitConversionPipesModule], +}) +export class DriveComponent { + @Input() drive!: { + logicalname: string | null + vendor: string | null + model: string | null + capacity: number + } +} diff --git a/web/projects/shared/src/components/initializing/initializing.component.html b/web/projects/shared/src/components/initializing/initializing.component.html deleted file mode 100644 index 836caf38c..000000000 --- a/web/projects/shared/src/components/initializing/initializing.component.html +++ /dev/null @@ -1,15 +0,0 @@ -
    -

    Initializing StartOS

    -
    - Progress: {{ (progress * 100).toFixed(0) }}% -
    - - -

    {{ getMessage(progress) }}

    -
    - - diff --git a/web/projects/shared/src/components/initializing/initializing.component.scss b/web/projects/shared/src/components/initializing/initializing.component.scss deleted file mode 100644 index 0675add7d..000000000 --- a/web/projects/shared/src/components/initializing/initializing.component.scss +++ /dev/null @@ -1,33 +0,0 @@ -.card { - border-radius: 0.25rem; - padding: 1rem; - margin: 1.5rem; - text-align: center; - // TODO: Theme - background: #e0e0e0; - color: #333; - --tui-clear-inverse: rgba(0, 0, 0, 0.1); -} - -.title { - font-size: 2.5rem; - margin: 1rem; -} - -.progress { - max-width: 40rem; - margin: 1rem auto; -} - -.logs { - display: flex; - flex-direction: column; - height: 18rem; - padding: 1rem; - margin: 0 1.5rem auto; - text-align: left; - overflow: hidden; - border-radius: 2rem; - // TODO: Theme - background: #181818; -} diff --git a/web/projects/shared/src/components/initializing/initializing.component.ts b/web/projects/shared/src/components/initializing/initializing.component.ts index e72cecb9e..5fc86f85d 100644 --- a/web/projects/shared/src/components/initializing/initializing.component.ts +++ b/web/projects/shared/src/components/initializing/initializing.component.ts @@ -1,11 +1,67 @@ -import { Component, inject, Input, Output } from '@angular/core' +import { CommonModule } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + inject, + Input, + Output, +} from '@angular/core' +import { TuiLetModule } from '@taiga-ui/cdk' +import { TuiProgressModule } from '@taiga-ui/kit' import { delay, filter } from 'rxjs' +import { LogsWindowComponent } from './logs-window.component' import { SetupService } from '../../services/setup.service' @Component({ + standalone: true, selector: 'app-initializing', - templateUrl: 'initializing.component.html', - styleUrls: ['initializing.component.scss'], + template: ` +
    +

    + Initializing StartOS +

    +
    + Progress: {{ (progress * 100).toFixed(0) }}% +
    + + +

    {{ getMessage(progress) }}

    +
    + + `, + styles: ` + section { + border-radius: 0.25rem; + padding: 1rem; + margin: 1.5rem; + text-align: center; + // TODO: Theme + background: #e0e0e0; + color: #333; + --tui-clear-inverse: rgba(0, 0, 0, 0.1); + } + + logs-window { + display: flex; + flex-direction: column; + height: 18rem; + padding: 1rem; + margin: 0 1.5rem auto; + text-align: left; + overflow: hidden; + border-radius: 2rem; + // TODO: Theme + background: #181818; + } + `, + imports: [CommonModule, LogsWindowComponent, TuiLetModule, TuiProgressModule], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class InitializingComponent { readonly progress$ = inject(SetupService) diff --git a/web/projects/shared/src/components/initializing/initializing.module.ts b/web/projects/shared/src/components/initializing/initializing.module.ts deleted file mode 100644 index 93c5c99d4..000000000 --- a/web/projects/shared/src/components/initializing/initializing.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { TuiLetModule } from '@taiga-ui/cdk' -import { TuiProgressModule } from '@taiga-ui/kit' - -import { LogsWindowComponent } from './logs-window.component' -import { InitializingComponent } from './initializing.component' - -@NgModule({ - imports: [CommonModule, TuiLetModule, LogsWindowComponent, TuiProgressModule], - declarations: [InitializingComponent], - exports: [InitializingComponent], -}) -export class InitializingModule {} diff --git a/web/projects/shared/src/components/text-spinner/text-spinner.component.html b/web/projects/shared/src/components/text-spinner/text-spinner.component.html deleted file mode 100644 index 789f4a120..000000000 --- a/web/projects/shared/src/components/text-spinner/text-spinner.component.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - -

    {{ text }}

    -
    -
    -
    diff --git a/web/projects/shared/src/components/text-spinner/text-spinner.component.module.ts b/web/projects/shared/src/components/text-spinner/text-spinner.component.module.ts deleted file mode 100644 index dacc85ffa..000000000 --- a/web/projects/shared/src/components/text-spinner/text-spinner.component.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { TextSpinnerComponent } from './text-spinner.component' - -@NgModule({ - declarations: [TextSpinnerComponent], - imports: [CommonModule, IonicModule], - exports: [TextSpinnerComponent], -}) -export class TextSpinnerComponentModule {} diff --git a/web/projects/shared/src/components/text-spinner/text-spinner.component.scss b/web/projects/shared/src/components/text-spinner/text-spinner.component.scss deleted file mode 100644 index 56fec7993..000000000 --- a/web/projects/shared/src/components/text-spinner/text-spinner.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -.full-height { - height: 100%; -} diff --git a/web/projects/shared/src/components/text-spinner/text-spinner.component.ts b/web/projects/shared/src/components/text-spinner/text-spinner.component.ts deleted file mode 100644 index f43b451ad..000000000 --- a/web/projects/shared/src/components/text-spinner/text-spinner.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component, Input } from '@angular/core' - -@Component({ - selector: 'text-spinner', - templateUrl: './text-spinner.component.html', - styleUrls: ['./text-spinner.component.scss'], -}) -export class TextSpinnerComponent { - @Input() text = '' -} diff --git a/web/projects/shared/src/directives/responsive-col.directive.ts b/web/projects/shared/src/directives/responsive-col.directive.ts deleted file mode 100644 index 56e92627d..000000000 --- a/web/projects/shared/src/directives/responsive-col.directive.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { - Directive, - OnInit, - Optional, - ElementRef, - Inject, - InjectionToken, - Input, - NgZone, -} from '@angular/core' -import { ResizeObserverService } from '@ng-web-apis/resize-observer' -import { distinctUntilChanged, map, Observable } from 'rxjs' -import { tuiZonefree, TuiDestroyService } from '@taiga-ui/cdk' -import { IonCol } from '@ionic/angular' -import { takeUntil } from 'rxjs' - -export type Step = 'xs' | 'sm' | 'md' | 'lg' | 'xl' - -const SIZE: readonly Step[] = ['xl', 'lg', 'md', 'sm', 'xs'] - -/** - * Not exported: - * https://github.com/ionic-team/ionic-framework/blob/main/core/src/utils/media.ts - * - * export const SIZE_TO_MEDIA: any = { - * xs: '(min-width: 0px)', - * sm: '(min-width: 576px)', - * md: '(min-width: 768px)', - * lg: '(min-width: 992px)', - * xl: '(min-width: 1200px)', - * }; - */ -export const BREAKPOINTS = new InjectionToken( - 'BREAKPOINTS', - { - factory: () => [ - [1200, 'xl'], - [992, 'lg'], - [768, 'md'], - [576, 'sm'], - [0, 'xs'], - ], - }, -) - -@Directive({ - selector: '[responsiveColViewport]', - exportAs: 'viewport', - providers: [ResizeObserverService], - standalone: true, -}) -export class ResponsiveColViewportDirective extends Observable { - @Input() - responsiveColViewport: Observable | '' = '' - - constructor( - @Inject(BREAKPOINTS) - private readonly breakpoints: readonly [number, Step][], - private readonly resize$: ResizeObserverService, - private readonly elementRef: ElementRef, - private readonly zone: NgZone, - ) { - super(subscriber => - (this.responsiveColViewport || this.stream$).subscribe(subscriber), - ) - } - - private readonly stream$ = this.resize$.pipe( - map(() => this.elementRef.nativeElement.clientWidth), - map(width => this.breakpoints.find(([step]) => width >= step)?.[1] || 'xs'), - distinctUntilChanged(), - tuiZonefree(this.zone), - ) -} - -@Directive({ - selector: 'ion-col[responsiveCol]', - providers: [TuiDestroyService], - standalone: true, -}) -export class ResponsiveColDirective implements OnInit { - readonly size: Record = { - xs: '12', - sm: '6', - md: '4', - lg: '3', - xl: '2', - } - - constructor( - @Optional() - viewport$: ResponsiveColViewportDirective | null, - destroy$: TuiDestroyService, - private readonly col: IonCol, - ) { - viewport$?.pipe(takeUntil(destroy$)).subscribe(size => { - const max = this.size[size] || this.findMax(size) - - this.col.sizeLg = max - this.col.sizeMd = max - this.col.sizeSm = max - this.col.sizeXl = max - this.col.sizeXs = max - }) - } - - ngOnInit() { - this.size.lg = this.col.sizeLg - this.size.md = this.col.sizeMd - this.size.sm = this.col.sizeSm - this.size.xl = this.col.sizeXl - this.size.xs = this.col.sizeXs - } - - private findMax(current: Step): string | undefined { - const start = SIZE.indexOf(current) - 1 - const max = SIZE.find((size, i) => i > start && this.size[size]) || current - - return this.size[max] - } -} diff --git a/web/projects/shared/src/pipes/guid/guid.module.ts b/web/projects/shared/src/pipes/guid/guid.module.ts deleted file mode 100644 index bd4e22f5f..000000000 --- a/web/projects/shared/src/pipes/guid/guid.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NgModule } from '@angular/core' -import { GuidPipe } from './guid.pipe' - -@NgModule({ - declarations: [GuidPipe], - exports: [GuidPipe], -}) -export class GuidPipePipesModule {} diff --git a/web/projects/shared/src/pipes/guid/guid.pipe.ts b/web/projects/shared/src/pipes/guid/guid.pipe.ts deleted file mode 100644 index a095bd929..000000000 --- a/web/projects/shared/src/pipes/guid/guid.pipe.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core' -import { DiskInfo } from '../../types/api' - -@Pipe({ - name: 'guid', -}) -export class GuidPipe implements PipeTransform { - transform(disk: DiskInfo): string | null { - return disk.guid || disk.partitions.find(p => p.guid)?.guid || null - } -} diff --git a/web/projects/shared/src/public-api.ts b/web/projects/shared/src/public-api.ts index f926e0da9..61d4e76fd 100644 --- a/web/projects/shared/src/public-api.ts +++ b/web/projects/shared/src/public-api.ts @@ -6,20 +6,17 @@ export * from './classes/http-error' export * from './classes/rpc-error' export * from './components/initializing/logs-window.component' -export * from './components/initializing/initializing.module' export * from './components/initializing/initializing.component' export * from './components/loading/loading.component' export * from './components/loading/loading.module' export * from './components/loading/loading.service' export * from './components/markdown/markdown.component' export * from './components/markdown/markdown.component.module' -export * from './components/text-spinner/text-spinner.component' -export * from './components/text-spinner/text-spinner.component.module' export * from './components/ticker/ticker.component' export * from './components/ticker/ticker.module' +export * from './components/drive.component' export * from './directives/drag-scroller.directive' -export * from './directives/responsive-col.directive' export * from './directives/safe-links.directive' export * from './directives/enter/enter.directive' export * from './directives/enter/enter.module' @@ -28,8 +25,6 @@ export * from './mocks/get-setup-status' export * from './pipes/emver/emver.module' export * from './pipes/emver/emver.pipe' -export * from './pipes/guid/guid.module' -export * from './pipes/guid/guid.pipe' export * from './pipes/markdown/markdown.module' export * from './pipes/markdown/markdown.pipe' export * from './pipes/shared/shared.module' @@ -70,5 +65,6 @@ export * from './util/get-pkg-id' export * from './util/invert' export * from './util/misc.util' export * from './util/rpc.util' +export * from './util/to-guid' export * from './util/to-local-iso-string' export * from './util/unused' diff --git a/web/projects/shared/src/util/to-guid.ts b/web/projects/shared/src/util/to-guid.ts new file mode 100644 index 000000000..a58c02ca4 --- /dev/null +++ b/web/projects/shared/src/util/to-guid.ts @@ -0,0 +1,5 @@ +import { DiskInfo } from '../types/api' + +export function toGuid(disk: DiskInfo | null): string | null { + return disk?.guid || disk?.partitions.find(p => p.guid)?.guid || null +} diff --git a/web/projects/ui/src/app/app.component.html b/web/projects/ui/src/app/app.component.html index f26e0cee2..c588d56ac 100644 --- a/web/projects/ui/src/app/app.component.html +++ b/web/projects/ui/src/app/app.component.html @@ -56,14 +56,11 @@ diff --git a/web/projects/ui/src/app/app.module.ts b/web/projects/ui/src/app/app.module.ts index 4ebc57315..9a42a28e4 100644 --- a/web/projects/ui/src/app/app.module.ts +++ b/web/projects/ui/src/app/app.module.ts @@ -10,7 +10,6 @@ import { LightThemeModule, LoadingModule, MarkdownModule, - ResponsiveColViewportDirective, SharedPipesModule, } from '@start9labs/shared' import { @@ -57,7 +56,6 @@ import { RoutingModule } from './routing.module' TuiAlertModule, TuiModeModule, TuiThemeNightModule, - ResponsiveColViewportDirective, DarkThemeModule, LightThemeModule, ServiceWorkerModule.register('ngsw-worker.js', { diff --git a/web/projects/ui/src/app/apps/loading/loading.page.ts b/web/projects/ui/src/app/apps/loading/loading.page.ts index da6970de8..028c5f1a4 100644 --- a/web/projects/ui/src/app/apps/loading/loading.page.ts +++ b/web/projects/ui/src/app/apps/loading/loading.page.ts @@ -1,7 +1,7 @@ import { Component, inject } from '@angular/core' import { NavController } from '@ionic/angular' import { - InitializingModule, + InitializingComponent, provideSetupLogsService, provideSetupService, } from '@start9labs/shared' @@ -20,7 +20,7 @@ import { ApiService } from 'src/app/services/api/embassy-api.service' provideSetupService(ApiService), provideSetupLogsService(ApiService), ], - imports: [InitializingModule], + imports: [InitializingComponent], }) export class LoadingPage { readonly navCtrl = inject(NavController) diff --git a/web/projects/ui/src/app/apps/portal/components/header/snek.component.ts b/web/projects/ui/src/app/apps/portal/components/header/snek.component.ts index 17caa60d5..1f6ba9771 100644 --- a/web/projects/ui/src/app/apps/portal/components/header/snek.component.ts +++ b/web/projects/ui/src/app/apps/portal/components/header/snek.component.ts @@ -45,10 +45,8 @@ import { TuiDialogContext } from '@taiga-ui/core' }) export class HeaderSnekComponent implements AfterViewInit, OnDestroy { private readonly document = inject(DOCUMENT) - private readonly dialog = inject(POLYMORPHEUS_CONTEXT) as TuiDialogContext< - number, - number - > + private readonly dialog = + inject>(POLYMORPHEUS_CONTEXT) highScore: number = this.dialog.data score = 0 diff --git a/web/projects/ui/src/app/common/logs/logs.component.html b/web/projects/ui/src/app/common/logs/logs.component.html deleted file mode 100644 index f786ef79e..000000000 --- a/web/projects/ui/src/app/common/logs/logs.component.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - {{ pageTitle }} - - - - - - - - - - -
    -
    -
    - - -
    -

    - Reconnecting -

    -

    - Waiting for network connectivity -

    -
    - - - -
    -
    -
    - - - -
    - -

    Autoscroll

    -
    - - Download - - -
    -
    diff --git a/web/projects/ui/src/app/common/logs/logs.component.module.ts b/web/projects/ui/src/app/common/logs/logs.component.module.ts deleted file mode 100644 index f00ff7660..000000000 --- a/web/projects/ui/src/app/common/logs/logs.component.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { LogsComponent } from './logs.component' -import { FormsModule } from '@angular/forms' -import { TextSpinnerComponentModule } from '@start9labs/shared' - -@NgModule({ - declarations: [LogsComponent], - imports: [CommonModule, IonicModule, TextSpinnerComponentModule, FormsModule], - exports: [LogsComponent], -}) -export class LogsComponentModule {} diff --git a/web/projects/ui/src/app/common/logs/logs.component.scss b/web/projects/ui/src/app/common/logs/logs.component.scss deleted file mode 100644 index 1e73b9928..000000000 --- a/web/projects/ui/src/app/common/logs/logs.component.scss +++ /dev/null @@ -1,5 +0,0 @@ -#container { - padding-bottom: 16px; - font-family: monospace; - white-space: pre-line; -} diff --git a/web/projects/ui/src/app/common/logs/logs.component.ts b/web/projects/ui/src/app/common/logs/logs.component.ts deleted file mode 100644 index 7cc250173..000000000 --- a/web/projects/ui/src/app/common/logs/logs.component.ts +++ /dev/null @@ -1,259 +0,0 @@ -import { Component, Input, ViewChild } from '@angular/core' -import { IonContent } from '@ionic/angular' -import { - bufferTime, - catchError, - filter, - finalize, - from, - Observable, - switchMap, - takeUntil, - tap, -} from 'rxjs' -import { WebSocketSubjectConfig } from 'rxjs/webSocket' -import { - FetchLogsReq, - FetchLogsRes, - toLocalIsoString, - Log, - DownloadHTMLService, - LoadingService, - ErrorService, -} from '@start9labs/shared' -import { TuiDestroyService } from '@taiga-ui/cdk' -import { RR } from 'src/app/services/api/api.types' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { ConnectionService } from 'src/app/services/connection.service' - -var Convert = require('ansi-to-html') -var convert = new Convert({ - newline: true, - bg: 'transparent', - colors: { - 4: 'Cyan', - }, - escapeXML: true, -}) - -@Component({ - selector: 'logs', - templateUrl: './logs.component.html', - styleUrls: ['./logs.component.scss'], - providers: [TuiDestroyService], -}) -export class LogsComponent { - @ViewChild(IonContent) - private content?: IonContent - - @Input({ required: true }) followLogs!: ( - params: RR.FollowServerLogsReq, - ) => Promise - @Input({ required: true }) fetchLogs!: ( - params: FetchLogsReq, - ) => Promise - @Input({ required: true }) context!: string - @Input() defaultBack = '' - @Input() pageTitle = '' - - loading = true - infiniteStatus: 0 | 1 | 2 = 0 - startCursor?: string - isOnBottom = true - autoScroll = true - websocketStatus: - | 'connecting' - | 'connected' - | 'reconnecting' - | 'disconnected' = 'connecting' - limit = 400 - count = 0 - - constructor( - private readonly errorService: ErrorService, - private readonly destroy$: TuiDestroyService, - private readonly api: ApiService, - private readonly loader: LoadingService, - private readonly downloadHtml: DownloadHTMLService, - private readonly connectionService: ConnectionService, - ) {} - - async ngOnInit() { - from(this.followLogs({ limit: this.limit })) - .pipe( - switchMap(({ 'start-cursor': startCursor, guid }) => { - this.startCursor = startCursor - return this.connect$(guid) - }), - takeUntil(this.destroy$), - finalize(() => console.log('CLOSING')), - ) - .subscribe() - } - - async doInfinite(e: any): Promise { - try { - const res = await this.fetchLogs({ - cursor: this.startCursor, - before: true, - limit: this.limit, - }) - - this.processRes(res) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - e.target.complete() - } - } - - handleScroll(e: any) { - if (e.detail.deltaY < -50) this.autoScroll = false - } - - handleScrollEnd() { - const bottomDiv = document.getElementById('bottom-div') - this.isOnBottom = - !!bottomDiv && - bottomDiv.getBoundingClientRect().top - 420 < window.innerHeight - } - - scrollToBottom() { - this.content?.scrollToBottom(200) - } - - async download() { - const loader = this.loader.open('Processing 10,000 logs...').subscribe() - - try { - const { entries } = await this.fetchLogs({ - before: true, - limit: 10000, - }) - - const styles = { - 'background-color': '#222428', - color: '#e0e0e0', - 'font-family': 'monospace', - } - const html = this.convertToAnsi(entries) - - this.downloadHtml.download(`${this.context}-logs.html`, html, styles) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } - - private reconnect$(): Observable { - return from(this.followLogs({})).pipe( - tap(_ => this.recordConnectionChange()), - switchMap(({ guid }) => this.connect$(guid, true)), - ) - } - - private connect$(guid: string, reconnect = false) { - const config: WebSocketSubjectConfig = { - url: `/rpc/${guid}`, - openObserver: { - next: () => { - this.websocketStatus = 'connected' - }, - }, - } - - return this.api.openLogsWebsocket$(config).pipe( - tap(_ => this.count++), - bufferTime(1000), - tap(msgs => { - this.loading = false - this.processRes({ entries: msgs }) - if (this.infiniteStatus === 0 && this.count >= this.limit) - this.infiniteStatus = 1 - }), - catchError(() => { - this.recordConnectionChange(false) - return this.connectionService.connected$.pipe( - tap( - connected => - (this.websocketStatus = connected - ? 'reconnecting' - : 'disconnected'), - ), - filter(Boolean), - switchMap(() => this.reconnect$()), - ) - }), - ) - } - - private recordConnectionChange(success = true) { - const container = document.getElementById('container') - const elem = document.getElementById('template')?.cloneNode() - if (!(elem instanceof HTMLElement)) return - elem.innerHTML = `
    ${ - success ? 'Reconnected' : 'Disconnected' - } at ${toLocalIsoString(new Date())}
    ` - container?.append(elem) - if (this.isOnBottom) { - setTimeout(() => { - this.scrollToBottom() - }, 25) - } - } - - private processRes(res: FetchLogsRes) { - const { entries, 'start-cursor': startCursor } = res - - if (!entries.length) return - - const container = document.getElementById('container') - const newLogs = document.getElementById('template')?.cloneNode() - - if (!(newLogs instanceof HTMLElement)) return - - newLogs.innerHTML = this.convertToAnsi(entries) - - // if response contains a startCursor, it means we are scrolling backwards - if (startCursor) { - this.startCursor = startCursor - - const beforeContainerHeight = container?.scrollHeight || 0 - container?.prepend(newLogs) - const afterContainerHeight = container?.scrollHeight || 0 - - // maintain scroll height - setTimeout(() => { - this.content?.scrollToPoint( - 0, - afterContainerHeight - beforeContainerHeight, - ) - }, 25) - - if (entries.length < this.limit) { - this.infiniteStatus = 2 - } - } else { - container?.append(newLogs) - if (this.autoScroll) { - setTimeout(() => { - this.scrollToBottom() - }, 25) - } - } - } - - private convertToAnsi(entries: Log[]) { - return entries - .map( - entry => - `${toLocalIsoString( - new Date(entry.timestamp), - )}  ${convert.toHtml(entry.message)}`, - ) - .join('
    ') - } -} diff --git a/web/projects/ui/src/app/common/widget-list/widget-list.component.module.ts b/web/projects/ui/src/app/common/widget-list/widget-list.component.module.ts index 0fdec7d01..b75bad20b 100644 --- a/web/projects/ui/src/app/common/widget-list/widget-list.component.module.ts +++ b/web/projects/ui/src/app/common/widget-list/widget-list.component.module.ts @@ -2,14 +2,13 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { IonicModule } from '@ionic/angular' import { RouterModule } from '@angular/router' -import { ResponsiveColDirective } from '@start9labs/shared' import { AnyLinkComponent } from './any-link/any-link.component' import { WidgetListComponent } from './widget-list.component' import { WidgetCardComponent } from './widget-card/widget-card.component' @NgModule({ declarations: [WidgetListComponent, WidgetCardComponent, AnyLinkComponent], - imports: [CommonModule, IonicModule, RouterModule, ResponsiveColDirective], + imports: [CommonModule, IonicModule, RouterModule], exports: [WidgetListComponent], }) export class WidgetListComponentModule {} From 089199e7c213c3ead2a656e45b7ef706071063ff Mon Sep 17 00:00:00 2001 From: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com> Date: Thu, 22 Feb 2024 14:00:49 -0700 Subject: [PATCH 052/169] Feature/lxc container runtime (#2562) * wip(fix): Dependencies * wip: context * wip(fix) Sorta auth * wip: warnings * wip(fix): registry/admin * wip(fix) marketplace * wip(fix) Some more converted and fixed with the linter and config * wip: Working on the static server * wip(fix)static server * wip: Remove some asynnc * wip: Something about the request and regular rpc * wip: gut install Co-authored-by: J H * wip: Convert the static server into the new system * wip delete file * test * wip(fix) vhost does not need the with safe defaults * wip: Adding in the wifi * wip: Fix the developer and the verify * wip: new install flow Co-authored-by: J H * fix middleware * wip * wip: Fix the auth * wip * continue service refactor * feature: Service get_config * feat: Action * wip: Fighting the great fight against the borrow checker * wip: Remove an error in a file that I just need to deel with later * chore: Add in some more lifetime stuff to the services * wip: Install fix on lifetime * cleanup * wip: Deal with the borrow later * more cleanup * resolve borrowchecker errors * wip(feat): add in the handler for the socket, for now * wip(feat): Update the service_effect_handler::action * chore: Add in the changes to make sure the from_service goes to context * chore: Change the * refactor service map * fix references to service map * fill out restore * wip: Before I work on the store stuff * fix backup module * handle some warnings * feat: add in the ui components on the rust side * feature: Update the procedures * chore: Update the js side of the main and a few of the others * chore: Update the rpc listener to match the persistant container * wip: Working on updating some things to have a better name * wip(feat): Try and get the rpc to return the correct shape? * lxc wip * wip(feat): Try and get the rpc to return the correct shape? * build for container runtime wip * remove container-init * fix build * fix error * chore: Update to work I suppose * lxc wip * remove docker module and feature * download alpine squashfs automatically * overlays effect Co-authored-by: Jade * chore: Add the overlay effect * feat: Add the mounter in the main * chore: Convert to use the mounts, still need to work with the sandbox * install fixes * fix ssl * fixes from testing * implement tmpfile for upload * wip * misc fixes * cleanup * cleanup * better progress reporting * progress for sideload * return real guid * add devmode script * fix lxc rootfs path * fix percentage bar * fix progress bar styling * fix build for unstable * tweaks * label progress * tweaks * update progress more often * make symlink in rpc_client * make socket dir * fix parent path * add start-cli to container * add echo and gitInfo commands * wip: Add the init + errors * chore: Add in the exit effect for the system * chore: Change the type to null for failure to parse * move sigterm timeout to stopping status * update order * chore: Update the return type * remove dbg * change the map error * chore: Update the thing to capture id * chore add some life changes * chore: Update the loging * chore: Update the package to run module * us From for RpcError * chore: Update to use import instead * chore: update * chore: Use require for the backup * fix a default * update the type that is wrong * chore: Update the type of the manifest * chore: Update to make null * only symlink if not exists * get rid of double result * better debug info for ErrorCollection * chore: Update effects * chore: fix * mount assets and volumes * add exec instead of spawn * fix mounting in image * fix overlay mounts Co-authored-by: Jade * misc fixes * feat: Fix two * fix: systemForEmbassy main * chore: Fix small part of main loop * chore: Modify the bundle * merge * fixMain loop" * move tsc to makefile * chore: Update the return types of the health check * fix client * chore: Convert the todo to use tsmatches * add in the fixes for the seen and create the hack to allow demo * chore: Update to include the systemForStartOs * chore UPdate to the latest types from the expected outout * fixes * fix typo * Don't emit if failure on tsc * wip Co-authored-by: Jade * add s9pk api * add inspection * add inspect manifest * newline after display serializable * fix squashfs in image name * edit manifest Co-authored-by: Jade * wait for response on repl * ignore sig for now * ignore sig for now * re-enable sig verification * fix * wip * env and chroot * add profiling logs * set uid & gid in squashfs to 100000 * set uid of sqfs to 100000 * fix mksquashfs args * add env to compat * fix * re-add docker feature flag * fix docker output format being stupid * here be dragons * chore: Add in the cross compiling for something * fix npm link * extract logs from container on exit * chore: Update for testing * add log capture to drop trait * chore: add in the modifications that I make * chore: Update small things for no updates * chore: Update the types of something * chore: Make main not complain * idmapped mounts * idmapped volumes * re-enable kiosk * chore: Add in some logging for the new system * bring in start-sdk * remove avahi * chore: Update the deps * switch to musl * chore: Update the version of prettier * chore: Organize' * chore: Update some of the headers back to the standard of fetch * fix musl build * fix idmapped mounts * fix cross build * use cross compiler for correct arch * feat: Add in the faked ssl stuff for the effects * @dr_bonez Did a solution here * chore: Something that DrBonez * chore: up * wip: We have a working server!!! * wip * uninstall * wip * tes * misc fixes * fix cli * replace interface with host * chore: Fix the types in some ts files * chore: quick update for the system for embassy to update the types * replace br-start9 with lxcbr0 * split patchdb into public/private * chore: Add changes for config set * Feat: Adding some debugging for the errors * wip: Working on getting the set config to work * chore: Update and fix the small issue with the deserialization * lightning, masked, schemeOverride, invert host-iface relationship * feat: Add in the changes for just the sdk * feat: Add in the changes for the new effects I suppose for now --------- Co-authored-by: J H <2364004+Blu-J@users.noreply.github.com> Co-authored-by: J H Co-authored-by: J H Co-authored-by: Matt Hill --- .../src/Adapters/HostSystemStartOs.ts | 77 +- container-runtime/src/Adapters/RpcListener.ts | 53 +- .../DockerProcedureContainer.ts | 7 +- .../Systems/SystemForEmbassy/index.ts | 60 +- .../src/Adapters/Systems/SystemForStartOs.ts | 5 +- container-runtime/src/Interfaces/System.ts | 3 +- .../src/Models/CallbackHolder.ts | 4 +- core/Cargo.lock | 495 ++-- core/build-prod.sh | 2 +- core/models/src/id/{interface.rs => host.rs} | 22 +- core/models/src/id/mod.rs | 4 +- core/startos/src/auth.rs | 3 +- core/startos/src/backup/backup_bulk.rs | 13 +- core/startos/src/backup/mod.rs | 7 +- core/startos/src/config/mod.rs | 79 +- core/startos/src/config/spec.rs | 2015 ----------------- core/startos/src/context/rpc.rs | 30 +- core/startos/src/db/mod.rs | 12 +- core/startos/src/db/model.rs | 127 +- core/startos/src/db/prelude.rs | 3 +- core/startos/src/dependencies.rs | 78 +- core/startos/src/init.rs | 4 +- core/startos/src/install/mod.rs | 67 +- core/startos/src/net/dhcp.rs | 3 +- core/startos/src/net/dns.rs | 4 +- core/startos/src/net/host/mod.rs | 29 + core/startos/src/net/host/multi.rs | 13 + core/startos/src/net/interface.rs | 122 - core/startos/src/net/keys.rs | 76 +- core/startos/src/net/mod.rs | 2 +- core/startos/src/net/net_controller.rs | 42 +- core/startos/src/net/ssl.rs | 2 +- core/startos/src/net/wifi.rs | 3 +- core/startos/src/notifications.rs | 12 +- core/startos/src/service/config.rs | 19 +- core/startos/src/service/mod.rs | 25 +- .../src/service/persistent_container.rs | 4 +- .../src/service/service_effect_handler.rs | 69 +- core/startos/src/service/service_map.rs | 10 +- core/startos/src/setup.rs | 8 +- core/startos/src/shutdown.rs | 6 +- core/startos/src/system.rs | 23 +- core/startos/src/update/mod.rs | 18 +- core/startos/src/util/actor.rs | 10 +- core/startos/src/version/mod.rs | 17 +- core/startos/src/version/v0_3_4.rs | 43 +- core/startos/src/version/v0_3_4_4.rs | 2 +- core/startos/src/version/v0_3_5.rs | 9 +- core/startos/src/volume.rs | 37 +- patch-db | 2 +- sdk/lib/interfaces/Host.ts | 19 +- sdk/lib/interfaces/Origin.ts | 72 +- sdk/lib/interfaces/ServiceInterfaceBuilder.ts | 48 +- sdk/lib/test/host.test.ts | 4 +- sdk/lib/types.ts | 42 +- sdk/lib/util/getServiceInterface.ts | 117 +- sdk/lib/util/getServiceInterfaces.ts | 26 +- sdk/lib/util/utils.ts | 6 +- 58 files changed, 1057 insertions(+), 3057 deletions(-) rename core/models/src/id/{interface.rs => host.rs} (74%) delete mode 100644 core/startos/src/config/spec.rs create mode 100644 core/startos/src/net/host/mod.rs create mode 100644 core/startos/src/net/host/multi.rs delete mode 100644 core/startos/src/net/interface.rs diff --git a/container-runtime/src/Adapters/HostSystemStartOs.ts b/container-runtime/src/Adapters/HostSystemStartOs.ts index e4177044e..007f783c0 100644 --- a/container-runtime/src/Adapters/HostSystemStartOs.ts +++ b/container-runtime/src/Adapters/HostSystemStartOs.ts @@ -38,7 +38,10 @@ export class HostSystemStartOs implements Effects { constructor(readonly callbackHolder: CallbackHolder) {} id = 0 - rpcRound(method: string, params: unknown) { + rpcRound( + method: K, + params: unknown, + ) { const id = this.id++ const client = net.createConnection({ path: SOCKET_PATH }, () => { client.write( @@ -74,7 +77,7 @@ export class HostSystemStartOs implements Effects { console.error("Debug: " + res.error.data.debug) } } - reject(new Error(message)) + reject(new Error(`${message}@${method}`)) } else if (testRpcResult(res)) { resolve(res.result) } else { @@ -91,13 +94,7 @@ export class HostSystemStartOs implements Effects { }) }) } - started = - // @ts-ignore - this.method !== MAIN - ? null - : () => { - return this.rpcRound("started", null) - } + bind(...[options]: Parameters) { return this.rpcRound("bind", options) as ReturnType } @@ -131,9 +128,9 @@ export class HostSystemStartOs implements Effects { T.Effects["exportAction"] > } - exportServiceInterface( - ...[options]: Parameters - ) { + exportServiceInterface: Effects["exportServiceInterface"] = ( + ...[options]: Parameters + ) => { return this.rpcRound("exportServiceInterface", options) as ReturnType< T.Effects["exportServiceInterface"] > @@ -158,31 +155,24 @@ export class HostSystemStartOs implements Effects { T.Effects["getContainerIp"] > } - getHostnames: any = (...[allOptions]: any[]) => { + getHostInfo: Effects["getHostInfo"] = (...[allOptions]: any[]) => { const options = { ...allOptions, callback: this.callbackHolder.addCallback(allOptions.callback), } - return this.rpcRound("getHostnames", options) as ReturnType< - T.Effects["getHostnames"] - > + return this.rpcRound("getHostInfo", options) as ReturnType< + T.Effects["getHostInfo"] + > as any } - getInterface(...[options]: Parameters) { - return this.rpcRound("getInterface", { + getServiceInterface( + ...[options]: Parameters + ) { + return this.rpcRound("getServiceInterface", { ...options, callback: this.callbackHolder.addCallback(options.callback), - }) as ReturnType - } - getIPHostname(...[]: Parameters) { - return this.rpcRound("getIPHostname", null) as ReturnType< - T.Effects["getIPHostname"] - > - } - getLocalHostname(...[]: Parameters) { - return this.rpcRound("getLocalHostname", null) as ReturnType< - T.Effects["getLocalHostname"] - > + }) as ReturnType } + getPrimaryUrl(...[options]: Parameters) { return this.rpcRound("getPrimaryUrl", { ...options, @@ -196,14 +186,6 @@ export class HostSystemStartOs implements Effects { T.Effects["getServicePortForward"] > } - getServiceTorHostname( - ...[interfaceId, packageId]: Parameters - ) { - return this.rpcRound("getServiceTorHostname", { - interfaceId, - packageId, - }) as ReturnType - } getSslCertificate( ...[packageId, algorithm]: Parameters ) { @@ -223,11 +205,13 @@ export class HostSystemStartOs implements Effects { callback: this.callbackHolder.addCallback(options.callback), }) as ReturnType } - listInterface(...[options]: Parameters) { - return this.rpcRound("listInterface", { + listServiceInterfaces( + ...[options]: Parameters + ) { + return this.rpcRound("listServiceInterfaces", { ...options, callback: this.callbackHolder.addCallback(options.callback), - }) as ReturnType + }) as ReturnType } mount(...[options]: Parameters) { return this.rpcRound("mount", options) as ReturnType @@ -304,17 +288,4 @@ export class HostSystemStartOs implements Effects { T.Effects["store"]["set"] >, } - - /** - * So, this is created - * @param options - * @returns - */ - embassyGetInterface(options: { - target: "tor-key" | "tor-address" | "lan-address" - packageId: string - interface: string - }) { - return this.rpcRound("embassyGetInterface", options) as Promise - } } diff --git a/container-runtime/src/Adapters/RpcListener.ts b/container-runtime/src/Adapters/RpcListener.ts index c9cbe9fef..815a5538e 100644 --- a/container-runtime/src/Adapters/RpcListener.ts +++ b/container-runtime/src/Adapters/RpcListener.ts @@ -11,6 +11,7 @@ import { matches, any, shape, + anyOf, } from "ts-matches" import { types as T } from "@start9labs/start-sdk" @@ -24,16 +25,28 @@ import { HostSystem } from "../Interfaces/HostSystem" import { jsonPath } from "../Models/JsonPath" import { System } from "../Interfaces/System" type MaybePromise = T | Promise -type SocketResponse = { jsonrpc: "2.0"; id: IdType } & ( - | { result: unknown } - | { - error: { - code: number - message: string - data: { details: string; debug?: string } - } - } +export const matchRpcResult = anyOf( + object({ result: any }), + object({ + error: object( + { + code: number, + message: string, + data: object( + { + details: string, + debug: any, + }, + ["details", "debug"], + ), + }, + ["data"], + ), + }), ) +export type RpcResult = typeof matchRpcResult._TYPE +type SocketResponse = { jsonrpc: "2.0"; id: IdType } & RpcResult + const SOCKET_PARENT = "/media/startos/rpc" const SOCKET_PATH = "/media/startos/rpc/service.sock" const jsonrpc = "2.0" as const @@ -186,23 +199,11 @@ export class RpcListener { input: params.input, timeout: params.timeout, }) - .then((result) => - "ok" in result - ? { - jsonrpc, - id, - result: result.ok === undefined ? null : result.ok, - } - : { - jsonrpc, - id, - error: { - code: result.err.code, - message: "Package Root Error", - data: { details: result.err.message }, - }, - }, - ) + .then((result) => ({ + jsonrpc, + id, + ...result, + })) .catch((error) => ({ jsonrpc, id, diff --git a/container-runtime/src/Adapters/Systems/SystemForEmbassy/DockerProcedureContainer.ts b/container-runtime/src/Adapters/Systems/SystemForEmbassy/DockerProcedureContainer.ts index 9cbda69dd..3129ce45d 100644 --- a/container-runtime/src/Adapters/Systems/SystemForEmbassy/DockerProcedureContainer.ts +++ b/container-runtime/src/Adapters/Systems/SystemForEmbassy/DockerProcedureContainer.ts @@ -33,8 +33,11 @@ export class DockerProcedureContainer { await overlay.mount({ type: "assets", id: mount }, mounts[mount]) } else if (volumeMount.type === "certificate") { volumeMount - const certChain = await effects.getSslCertificate() - const key = await effects.getSslKey() + const certChain = await effects.getSslCertificate( + null, + volumeMount["interface-id"], + ) + const key = await effects.getSslKey(null, volumeMount["interface-id"]) await fs.writeFile( `${path}/${volumeMount["interface-id"]}.cert.pem`, certChain.join("\n"), diff --git a/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts b/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts index ca1a69d2e..d96f826d7 100644 --- a/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts +++ b/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts @@ -28,6 +28,9 @@ import { import { HostSystemStartOs } from "../../HostSystemStartOs" import { JsonPath, unNestPath } from "../../../Models/JsonPath" import { HostSystem } from "../../../Interfaces/HostSystem" +import { RpcResult, matchRpcResult } from "../../RpcListener" +import { ServiceInterface } from "../../../../../sdk/dist/cjs/lib/types" +import { createUtils } from "../../../../../sdk/dist/cjs/lib/util" type Optional = A | undefined | null function todo(): never { @@ -68,7 +71,7 @@ export class SystemForEmbassy implements System { input: unknown timeout?: number | undefined }, - ): Promise { + ): Promise { return this._execute(effects, options) .then((x) => matches(x) @@ -76,16 +79,14 @@ export class SystemForEmbassy implements System { object({ result: any, }), - (x) => ({ - ok: x.result, - }), + (x) => x, ) .when( object({ error: string, }), (x) => ({ - err: { + error: { code: 0, message: x.error, }, @@ -96,20 +97,34 @@ export class SystemForEmbassy implements System { "error-code": tuple(number, string), }), ({ "error-code": [code, message] }) => ({ - err: { + error: { code, message, }, }), ) - .defaultTo({ ok: x }), + .defaultTo({ result: x }), ) - .catch((error) => ({ - err: { - code: 0, - message: "" + error, - }, - })) + .catch((error: unknown) => { + if (error instanceof Error) + return { + error: { + code: 0, + message: error.name, + data: { + details: error.message, + debug: `${error?.cause ?? "[noCause]"}:${error?.stack ?? "[noStack]"}`, + }, + }, + } + if (matchRpcResult.test(error)) return error + return { + error: { + code: 0, + message: String(error), + }, + } + }) } async exit(effects: HostSystemStartOs): Promise { if (this.currentRunning) await this.currentRunning.clean() @@ -157,6 +172,7 @@ export class SystemForEmbassy implements System { return this.dependenciesAutoconfig(effects, procedures[2], input) } } + throw new Error(`Could not find the path for ${options.procedure}`) } private async init( effects: HostSystemStartOs, @@ -864,6 +880,7 @@ async function updateConfig( ) { if (!dictionary([string, unknown]).test(spec)) return if (!dictionary([string, unknown]).test(mutConfigValue)) return + const utils = createUtils(effects) for (const key in spec) { const specValue = spec[key] @@ -890,11 +907,18 @@ async function updateConfig( mutConfigValue[key] = configValue } if (matchPointerPackage.test(specValue)) { - mutConfigValue[key] = await effects.embassyGetInterface({ - target: specValue.target, - packageId: specValue["package-id"], - interface: specValue["interface"], - }) + const filled = await utils.serviceInterface + .get({ + packageId: specValue["package-id"], + id: specValue.interface, + }) + .once() + if (specValue.target === "tor-key") + throw new Error("This service uses an unsupported target TorKey") + mutConfigValue[key] = + specValue.target === "lan-address" + ? filled.addressInfo.localHostnames[0] + : filled.addressInfo.onionHostnames[0] } } } diff --git a/container-runtime/src/Adapters/Systems/SystemForStartOs.ts b/container-runtime/src/Adapters/Systems/SystemForStartOs.ts index 9d2dcd4b8..95afb5fb4 100644 --- a/container-runtime/src/Adapters/Systems/SystemForStartOs.ts +++ b/container-runtime/src/Adapters/Systems/SystemForStartOs.ts @@ -3,6 +3,7 @@ import { unNestPath } from "../../Models/JsonPath" import { string } from "ts-matches" import { HostSystemStartOs } from "../HostSystemStartOs" import { Effects } from "../../Models/Effects" +import { RpcResult } from "../RpcListener" const LOCATION = "/usr/lib/startos/package/startos" export class SystemForStartOs implements System { private onTerm: (() => Promise) | undefined @@ -30,8 +31,8 @@ export class SystemForStartOs implements System { input: unknown timeout?: number | undefined }, - ): Promise { - return { ok: await this._execute(effects, options) } + ): Promise { + return { result: await this._execute(effects, options) } } async _execute( effects: Effects, diff --git a/container-runtime/src/Interfaces/System.ts b/container-runtime/src/Interfaces/System.ts index 7dcde3c52..86b2aa492 100644 --- a/container-runtime/src/Interfaces/System.ts +++ b/container-runtime/src/Interfaces/System.ts @@ -1,6 +1,7 @@ import { types as T } from "@start9labs/start-sdk" import { JsonPath } from "../Models/JsonPath" import { HostSystemStartOs } from "../Adapters/HostSystemStartOs" +import { RpcResult } from "../Adapters/RpcListener" export type ExecuteResult = | { ok: unknown } | { err: { code: number; message: string } } @@ -17,7 +18,7 @@ export interface System { input: unknown timeout?: number }, - ): Promise + ): Promise // sandbox( // effects: Effects, // options: { diff --git a/container-runtime/src/Models/CallbackHolder.ts b/container-runtime/src/Models/CallbackHolder.ts index 3aa4392ce..b562e8dd0 100644 --- a/container-runtime/src/Models/CallbackHolder.ts +++ b/container-runtime/src/Models/CallbackHolder.ts @@ -7,7 +7,9 @@ export class CallbackHolder { return this.root + (this.inc++).toString(36) } addCallback(callback: Function) { - return this.callbacks.set(this.newId(), callback) + const id = this.newId() + this.callbacks.set(id, callback) + return id } callCallback(index: string, args: any[]): Promise { const callback = this.callbacks.get(index) diff --git a/core/Cargo.lock b/core/Cargo.lock index ec677308d..95b7f3ca9 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -32,9 +32,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ "getrandom 0.2.12", "once_cell", @@ -43,9 +43,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" +checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff" dependencies = [ "cfg-if", "getrandom 0.2.12", @@ -115,9 +115,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" [[package]] name = "anstyle-parse" @@ -218,7 +218,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -229,7 +229,7 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -487,9 +487,9 @@ dependencies = [ [[package]] name = "bitmaps" -version = "3.2.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703642b98a00b3b90513279a8ede3fcfa479c126c5fb46e78f3051522f021403" +checksum = "a1d084b0137aaa901caf9f1e8b21daa6aa24d41cd806e111335541eff9683bd6" [[package]] name = "bitvec" @@ -575,9 +575,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "d32a994c2b3ca201d9b263612a374263f05e7adde37c4707f693dcd375076d1f" [[package]] name = "byteorder" @@ -608,9 +608,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.33" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb" +checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" dependencies = [ "android-tzdata", "iana-time-zone", @@ -686,16 +686,16 @@ dependencies = [ "bitflags 1.3.2", "clap_lex 0.2.4", "indexmap 1.9.3", - "strsim", + "strsim 0.10.0", "termcolor", "textwrap", ] [[package]] name = "clap" -version = "4.4.18" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c" +checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da" dependencies = [ "clap_builder", "clap_derive", @@ -703,26 +703,26 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.18" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7" +checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb" dependencies = [ "anstream", "anstyle", - "clap_lex 0.6.0", - "strsim", + "clap_lex 0.7.0", + "strsim 0.11.0", ] [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -736,9 +736,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "color-eyre" @@ -879,17 +879,6 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "cookie" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" -dependencies = [ - "percent-encoding", - "time", - "version_check", -] - [[package]] name = "cookie" version = "0.17.0" @@ -911,23 +900,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "cookie_store" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d606d0fba62e13cf04db20536c05cb7f13673c161cb47a47a82b9b9e7d3f1daa" -dependencies = [ - "cookie 0.16.2", - "idna 0.2.3", - "log", - "publicsuffix", - "serde", - "serde_derive", - "serde_json", - "time", - "url", -] - [[package]] name = "cookie_store" version = "0.20.0" @@ -987,9 +959,9 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" dependencies = [ "cfg-if", ] @@ -1133,9 +1105,9 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.1.1" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c" +checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" dependencies = [ "cfg-if", "cpufeatures", @@ -1156,14 +1128,14 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] name = "darling" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "c376d08ea6aa96aafe61237c7200d1241cb177b7d3a542d791f2d118e9cbb955" dependencies = [ "darling_core", "darling_macro", @@ -1171,27 +1143,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "33043dcd19068b8192064c704b3f83eb464f91f1ff527b44a4e2b08d9cdb8855" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim", - "syn 2.0.48", + "strsim 0.10.0", + "syn 2.0.49", ] [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "c5a91391accf613803c2a9bf9abccdbaa07c54b4244a5b64883f9c3c137c86be" dependencies = [ "darling_core", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -1359,11 +1331,11 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f628eaec48bfd21b865dc2950cfa014450c01d2fa2b69a86c2fd5844ec523c0" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ - "curve25519-dalek 4.1.1", + "curve25519-dalek 4.1.2", "ed25519 2.2.3", "rand_core 0.6.4", "serde", @@ -1375,9 +1347,9 @@ dependencies = [ [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" dependencies = [ "serde", ] @@ -1452,7 +1424,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -1490,9 +1462,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "eyre" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6267a1fa6f59179ea4afc8e50fd8612a3cc60bc858f786ff877a4a8cb042799" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" dependencies = [ "indenter", "once_cell", @@ -1525,9 +1497,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" +checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382" [[package]] name = "filetime" @@ -1686,7 +1658,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -1793,7 +1765,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.11", - "indexmap 2.1.0", + "indexmap 2.2.3", "slab", "tokio", "tokio-util", @@ -1812,7 +1784,7 @@ dependencies = [ "futures-sink", "futures-util", "http 1.0.0", - "indexmap 2.1.0", + "indexmap 2.2.3", "slab", "tokio", "tokio-util", @@ -1847,7 +1819,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.8", ] [[package]] @@ -1856,7 +1828,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.8", "allocator-api2", ] @@ -1919,9 +1891,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.4" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" +checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" [[package]] name = "hex" @@ -2116,12 +2088,11 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdea9aac0dbe5a9240d68cfd9501e2db94222c6dc06843e06640b9e07f0fdc67" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" dependencies = [ "bytes", - "futures-channel", "futures-util", "http 1.0.0", "http-body 1.0.0", @@ -2129,14 +2100,13 @@ dependencies = [ "pin-project-lite", "socket2", "tokio", - "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.59" +version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2161,17 +2131,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" -[[package]] -name = "idna" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - [[package]] name = "idna" version = "0.3.0" @@ -2275,9 +2234,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -2286,9 +2245,9 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb28741c9db9a713d93deb3bb9515c20788cef5815265bee4980e87bde7e0f25" +checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" dependencies = [ "console", "instant", @@ -2347,12 +2306,12 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.10" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ - "hermit-abi 0.3.4", - "rustix", + "hermit-abi 0.3.6", + "libc", "windows-sys 0.52.0", ] @@ -2395,9 +2354,9 @@ dependencies = [ [[package]] name = "itertools" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] @@ -2414,7 +2373,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb52eeac20f256459e909bd4a03bb8c4fab6a1fdbb8ed52d00f644152df48ece" dependencies = [ - "ahash 0.7.7", + "ahash 0.7.8", "dyn-clone", "hifijson", "indexmap 1.9.3", @@ -2466,9 +2425,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.67" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" +checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" dependencies = [ "wasm-bindgen", ] @@ -2572,9 +2531,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.152" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libm" @@ -2635,12 +2594,6 @@ dependencies = [ "regex-automata 0.1.10", ] -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - [[package]] name = "matchit" version = "0.7.3" @@ -2708,9 +2661,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", ] @@ -2733,7 +2686,7 @@ version = "0.1.0" dependencies = [ "base64 0.21.7", "color-eyre", - "ed25519-dalek 2.1.0", + "ed25519-dalek 2.1.1", "emver", "ipnet", "lazy_static", @@ -2890,28 +2843,33 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" +checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" dependencies = [ "num-traits", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-iter" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" dependencies = [ "autocfg", "num-integer", @@ -2932,9 +2890,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", "libm", @@ -2946,7 +2904,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.4", + "hermit-abi 0.3.6", "libc", ] @@ -2968,7 +2926,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -3034,7 +2992,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -3045,9 +3003,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "300.2.1+3.2.0" +version = "300.2.3+3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fe476c29791a5ca0d1273c697e96085bbabbbea2ef7afd5617e78a4b40332d3" +checksum = "5cff92b6f71555b61bb9315f7c64da3ca43d87531622120fea0195fc761b4843" dependencies = [ "cc", ] @@ -3223,7 +3181,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.1.0", + "indexmap 2.2.3", ] [[package]] @@ -3258,7 +3216,7 @@ checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -3296,9 +3254,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "platforms" @@ -3359,7 +3317,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "toml_edit 0.21.0", + "toml_edit 0.21.1", ] [[package]] @@ -3422,7 +3380,7 @@ dependencies = [ "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -3647,14 +3605,14 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" -version = "0.11.23" +version = "0.11.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" +checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" dependencies = [ "base64 0.21.7", "bytes", - "cookie 0.16.2", - "cookie_store 0.16.2", + "cookie 0.17.0", + "cookie_store", "encoding_rs", "futures-core", "futures-util", @@ -3671,9 +3629,11 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", + "sync_wrapper", "system-configuration", "tokio", "tokio-native-tls", @@ -3695,7 +3655,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba529055ea150e42e4eb9c11dcd380a41025ad4d594b0cb4904ef28b037e1061" dependencies = [ "bytes", - "cookie_store 0.20.0", + "cookie_store", "reqwest", "url", ] @@ -3712,16 +3672,17 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", + "cfg-if", "getrandom 0.2.12", "libc", "spin 0.9.8", "untrusted", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -3760,17 +3721,17 @@ dependencies = [ [[package]] name = "rpc-toolkit" version = "0.2.3" -source = "git+https://github.com/Start9Labs/rpc-toolkit.git?branch=refactor/traits#8d714d09a327249f16f77a8f5a160a2b7cfbf380" +source = "git+https://github.com/Start9Labs/rpc-toolkit.git?branch=refactor/traits#c89e0abdb15dd3bed9adb5339cf0b61a96f32b50" dependencies = [ "async-stream", "async-trait", "axum 0.7.4", - "clap 4.4.18", + "clap 4.5.1", "futures", "http 1.0.0", "http-body-util", "imbl-value", - "itertools 0.12.0", + "itertools 0.12.1", "lazy_format", "lazy_static", "openssl", @@ -3800,7 +3761,7 @@ dependencies = [ [[package]] name = "rpc-toolkit-macro" version = "0.2.2" -source = "git+https://github.com/Start9Labs/rpc-toolkit.git?branch=refactor/traits#8d714d09a327249f16f77a8f5a160a2b7cfbf380" +source = "git+https://github.com/Start9Labs/rpc-toolkit.git?branch=refactor/traits#c89e0abdb15dd3bed9adb5339cf0b61a96f32b50" dependencies = [ "proc-macro2", "rpc-toolkit-macro-internals 0.2.2 (git+https://github.com/Start9Labs/rpc-toolkit.git?branch=refactor/traits)", @@ -3821,9 +3782,9 @@ dependencies = [ [[package]] name = "rpc-toolkit-macro-internals" version = "0.2.2" -source = "git+https://github.com/Start9Labs/rpc-toolkit.git?branch=refactor/traits#8d714d09a327249f16f77a8f5a160a2b7cfbf380" +source = "git+https://github.com/Start9Labs/rpc-toolkit.git?branch=refactor/traits#c89e0abdb15dd3bed9adb5339cf0b61a96f32b50" dependencies = [ - "itertools 0.12.0", + "itertools 0.12.1", "proc-macro2", "quote", "syn 1.0.109", @@ -3888,9 +3849,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.30" +version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ "bitflags 2.4.2", "errno", @@ -3919,7 +3880,7 @@ dependencies = [ "log", "ring", "rustls-pki-types", - "rustls-webpki 0.102.1", + "rustls-webpki 0.102.2", "subtle", "zeroize", ] @@ -3935,9 +3896,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e9d979b3ce68192e42760c7810125eb6cf2ea10efae545a156063e61f314e2a" +checksum = "048a63e5b3ac996d78d402940b5fa47973d2d080c6c6fffa1d0f19c4445310b7" [[package]] name = "rustls-webpki" @@ -3951,9 +3912,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.1" +version = "0.102.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4ca26037c909dedb327b48c3327d0ba91d3dd3c4e05dad328f210ffb68e95b" +checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" dependencies = [ "ring", "rustls-pki-types", @@ -3980,9 +3941,9 @@ dependencies = [ [[package]] name = "rustyline-async" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca4447465ceb8c01c253cc81660b242547c58e4a59c85b13294a6e70de8b9e" +checksum = "8b6eb06391513b2184f0a5405c11a4a0a5302e8be442f4c5c35267187c2b37d5" dependencies = [ "crossterm", "futures-channel", @@ -4115,16 +4076,16 @@ checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] name = "serde_json" -version = "1.0.112" +version = "1.0.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d1bd37ce2324cf3bf85e5a25f96eb4baf0d5aa6eba43e7ae8958870c4ec48ed" +checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.3", "itoa", "ryu", "serde", @@ -4163,16 +4124,17 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.5.1" +version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5c9fdb6b00a489875b22efd4b78fe2b363b72265cc5f6eb2e2b9ee270e6140c" +checksum = "15d167997bd841ec232f5b2b8e0e26606df2e7caa4c31b95ea9ca52b200bd270" dependencies = [ "base64 0.21.7", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.1.0", + "indexmap 2.2.3", "serde", + "serde_derive", "serde_json", "serde_with_macros", "time", @@ -4180,23 +4142,23 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.5.1" +version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbff351eb4b33600a2e138dfa0b10b65a238ea8ff8fb2387c422c5022a3e8298" +checksum = "865f9743393e638991566a8b7a479043c2c8da94a33e0a31f18214c9cae0a64d" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] name = "serde_yaml" -version = "0.9.30" +version = "0.9.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1bf28c79a99f70ee1f1d83d10c875d2e70618417fda01ad1785e027579d9d38" +checksum = "adf8a49373e98a4c5f0ceb5d05aa7c648d75f63774981ed95b7c7443bbd50c6e" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.3", "itoa", "ryu", "serde", @@ -4384,7 +4346,7 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" dependencies = [ - "itertools 0.12.0", + "itertools 0.12.1", "nom", "unicode_categories", ] @@ -4408,7 +4370,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d84b0a3c3739e220d94b3239fd69fb1f74bc36e16643423bd99de3b43c21bfbd" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.8", "atoi", "byteorder", "bytes", @@ -4425,7 +4387,7 @@ dependencies = [ "futures-util", "hashlink", "hex", - "indexmap 2.1.0", + "indexmap 2.2.3", "log", "memchr", "once_cell", @@ -4615,8 +4577,8 @@ dependencies = [ "proc-macro2", "quote", "regex-syntax 0.6.29", - "strsim", - "syn 2.0.48", + "strsim 0.10.0", + "syn 2.0.49", "unicode-width", ] @@ -4647,7 +4609,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01f8f4ea73476c0aa5d5e6a75ce1e8634e2c3f82005ef3bbed21547ac57f2bf7" dependencies = [ - "ed25519-dalek 2.1.0", + "ed25519-dalek 2.1.1", "p256", "p384", "p521", @@ -4680,18 +4642,18 @@ dependencies = [ "bytes", "chrono", "ciborium", - "clap 4.4.18", + "clap 4.5.1", "color-eyre", "console", "console-subscriber", "cookie 0.18.0", - "cookie_store 0.20.0", + "cookie_store", "current_platform", "digest 0.10.7", "divrem", "ed25519 2.2.3", "ed25519-dalek 1.0.1", - "ed25519-dalek 2.1.0", + "ed25519-dalek 2.1.1", "emver", "fd-lock-rs", "futures", @@ -4703,13 +4665,13 @@ dependencies = [ "imbl", "imbl-value", "include_dir", - "indexmap 2.1.0", + "indexmap 2.2.3", "indicatif", "integer-encoding", "ipnet", "iprange", "isocountry", - "itertools 0.12.0", + "itertools 0.12.1", "jaq-core", "jaq-std", "josekit", @@ -4766,7 +4728,7 @@ dependencies = [ "tokio-tar", "tokio-tungstenite", "tokio-util", - "toml 0.8.8", + "toml 0.8.10", "torut", "tracing", "tracing-error", @@ -4824,6 +4786,12 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strsim" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" + [[package]] name = "subtle" version = "2.5.0" @@ -4843,9 +4811,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "915aea9e586f80826ee59f8453c1101f9d1c4b3964cd2460185ee8e299ada496" dependencies = [ "proc-macro2", "quote", @@ -4898,13 +4866,12 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.9.0" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" +checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" dependencies = [ "cfg-if", "fastrand", - "redox_syscall 0.4.1", "rustix", "windows-sys 0.52.0", ] @@ -4931,9 +4898,9 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" [[package]] name = "thingbuf" @@ -4947,22 +4914,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -4988,12 +4955,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" dependencies = [ "deranged", "itoa", + "num-conv", "powerfmt", "serde", "time-core", @@ -5008,10 +4976,11 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" dependencies = [ + "num-conv", "time-core", ] @@ -5041,9 +5010,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.35.1" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ "backtrace", "bytes", @@ -5077,7 +5046,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -5181,14 +5150,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" +checksum = "9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.21.0", + "toml_edit 0.22.6", ] [[package]] @@ -5206,24 +5175,35 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.3", "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.21.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.3", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6" +dependencies = [ + "indexmap 2.2.3", "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.6.1", ] [[package]] @@ -5325,7 +5305,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -5400,9 +5380,9 @@ dependencies = [ [[package]] name = "treediff" -version = "4.0.2" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52984d277bdf2a751072b5df30ec0377febdb02f7696d64c2d7d54630bac4303" +checksum = "4d127780145176e2b5d16611cc25a900150e86e9fd79d3bde6ff3a37359c9cb5" dependencies = [ "serde_json", ] @@ -5497,7 +5477,7 @@ checksum = "563b3b88238ec95680aef36bdece66896eaa7ce3c0f1b4f39d38fb2435261352" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -5544,9 +5524,9 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-width" @@ -5667,9 +5647,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.90" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" +checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -5677,24 +5657,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.90" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" +checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.40" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bde2032aeb86bdfaecc8b261eef3cba735cc426c1f3a3416d1e0791be95fc461" +checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97" dependencies = [ "cfg-if", "js-sys", @@ -5704,9 +5684,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.90" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" +checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5714,28 +5694,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.90" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" +checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.90" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" +checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" [[package]] name = "wasm-streams" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7" +checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" dependencies = [ "futures-util", "js-sys", @@ -5746,9 +5726,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.67" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58cd2333b6e0be7a39605f0e255892fd7418a682d8da8fe042fe25128794d2ed" +checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" dependencies = [ "js-sys", "wasm-bindgen", @@ -5756,9 +5736,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.3" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "whoami" @@ -5940,9 +5920,18 @@ checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winnow" -version = "0.5.35" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1931d78a9c73861da0134f453bb1f790ce49b2e30eba8410b4b79bac72b46a2d" +checksum = "d90f4e0f530c4c69f62b80d839e9ef3855edc9cba471a160c4d692deed62b401" dependencies = [ "memchr", ] @@ -6004,7 +5993,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f355ab62ebe30b758c1f4ab096a306722c4b7dbfb9d8c07d18c70d71a945588" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.8", "hashbrown 0.13.2", "lazy_static", "serde", @@ -6027,7 +6016,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -6047,5 +6036,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] diff --git a/core/build-prod.sh b/core/build-prod.sh index 0588384dc..8b6184942 100755 --- a/core/build-prod.sh +++ b/core/build-prod.sh @@ -22,7 +22,7 @@ if [[ "${ENVIRONMENT}" =~ (^|-)unstable($|-) ]]; then RUSTFLAGS="--cfg tokio_unstable" fi -alias 'rust-musl-builder'='docker run $USE_TTY --rm -e "RUSTFLAGS=$RUSTFLAGS" -v "$HOME/.cargo/registry":/root/.cargo/registry -v "$(pwd)":/home/rust/src -w /home/rust/src -P messense/rust-musl-cross:$ARCH-musl' +alias 'rust-musl-builder'='docker run $USE_TTY --rm -e "RUSTFLAGS=$RUSTFLAGS" -v "$HOME/.cargo/registry":/root/.cargo/registry -v "$HOME/.cargo/git":/root/.cargo/git -v "$(pwd)":/home/rust/src -w /home/rust/src -P messense/rust-musl-cross:$ARCH-musl' set +e fail= diff --git a/core/models/src/id/interface.rs b/core/models/src/id/host.rs similarity index 74% rename from core/models/src/id/interface.rs rename to core/models/src/id/host.rs index b9b32dd4a..91abd56e7 100644 --- a/core/models/src/id/interface.rs +++ b/core/models/src/id/host.rs @@ -6,48 +6,48 @@ use serde::{Deserialize, Deserializer, Serialize}; use crate::{Id, InvalidId}; #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)] -pub struct InterfaceId(Id); -impl FromStr for InterfaceId { +pub struct HostId(Id); +impl FromStr for HostId { type Err = InvalidId; fn from_str(s: &str) -> Result { Ok(Self(Id::try_from(s.to_owned())?)) } } -impl From for InterfaceId { +impl From for HostId { fn from(id: Id) -> Self { Self(id) } } -impl std::fmt::Display for InterfaceId { +impl std::fmt::Display for HostId { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", &self.0) } } -impl std::ops::Deref for InterfaceId { +impl std::ops::Deref for HostId { type Target = str; fn deref(&self) -> &Self::Target { &*self.0 } } -impl AsRef for InterfaceId { +impl AsRef for HostId { fn as_ref(&self) -> &str { self.0.as_ref() } } -impl<'de> Deserialize<'de> for InterfaceId { +impl<'de> Deserialize<'de> for HostId { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { - Ok(InterfaceId(Deserialize::deserialize(deserializer)?)) + Ok(HostId(Deserialize::deserialize(deserializer)?)) } } -impl AsRef for InterfaceId { +impl AsRef for HostId { fn as_ref(&self) -> &Path { self.0.as_ref().as_ref() } } -impl<'q> sqlx::Encode<'q, sqlx::Postgres> for InterfaceId { +impl<'q> sqlx::Encode<'q, sqlx::Postgres> for HostId { fn encode_by_ref( &self, buf: &mut >::ArgumentBuffer, @@ -55,7 +55,7 @@ impl<'q> sqlx::Encode<'q, sqlx::Postgres> for InterfaceId { <&str as sqlx::Encode<'q, sqlx::Postgres>>::encode_by_ref(&&**self, buf) } } -impl sqlx::Type for InterfaceId { +impl sqlx::Type for HostId { fn type_info() -> sqlx::postgres::PgTypeInfo { <&str as sqlx::Type>::type_info() } diff --git a/core/models/src/id/mod.rs b/core/models/src/id/mod.rs index ac32ceb22..068955336 100644 --- a/core/models/src/id/mod.rs +++ b/core/models/src/id/mod.rs @@ -7,8 +7,8 @@ use yasi::InternedString; mod action; mod address; mod health_check; +mod host; mod image; -mod interface; mod invalid_id; mod package; mod volume; @@ -16,8 +16,8 @@ mod volume; pub use action::ActionId; pub use address::AddressId; pub use health_check::HealthCheckId; +pub use host::HostId; pub use image::ImageId; -pub use interface::InterfaceId; pub use invalid_id::InvalidId; pub use package::{PackageId, SYSTEM_PACKAGE_ID}; pub use volume::VolumeId; diff --git a/core/startos/src/auth.rs b/core/startos/src/auth.rs index cdf2a4591..891f390bc 100644 --- a/core/startos/src/auth.rs +++ b/core/startos/src/auth.rs @@ -437,7 +437,8 @@ pub async fn reset_password_impl( let account_password = &account.password; ctx.db .mutate(|d| { - d.as_server_info_mut() + d.as_public_mut() + .as_server_info_mut() .as_password_hash_mut() .ser(account_password) }) diff --git a/core/startos/src/backup/backup_bulk.rs b/core/startos/src/backup/backup_bulk.rs index 5c68753c7..4660ab4bc 100644 --- a/core/startos/src/backup/backup_bulk.rs +++ b/core/startos/src/backup/backup_bulk.rs @@ -141,7 +141,8 @@ pub async fn backup_all( } ctx.db .mutate(|v| { - v.as_server_info_mut() + v.as_public_mut() + .as_server_info_mut() .as_status_info_mut() .as_backup_progress_mut() .ser(&None) @@ -159,6 +160,7 @@ async fn assure_backing_up( ) -> Result<(), Error> { db.mutate(|v| { let backing_up = v + .as_public_mut() .as_server_info_mut() .as_status_info_mut() .as_backup_progress_mut(); @@ -221,7 +223,7 @@ async fn perform_backup( ) })?; - let ui = ctx.db.peek().await.into_ui().de()?; + let ui = ctx.db.peek().await.into_public().into_ui().de()?; let mut os_backup_file = AtomicFile::new(backup_guard.path().join("os-backup.cbor"), None::) @@ -261,7 +263,12 @@ async fn perform_backup( backup_guard.save_and_unmount().await?; ctx.db - .mutate(|v| v.as_server_info_mut().as_last_backup_mut().ser(×tamp)) + .mutate(|v| { + v.as_public_mut() + .as_server_info_mut() + .as_last_backup_mut() + .ser(×tamp) + }) .await?; Ok(backup_report) diff --git a/core/startos/src/backup/mod.rs b/core/startos/src/backup/mod.rs index d1fd57898..de2dfbf7d 100644 --- a/core/startos/src/backup/mod.rs +++ b/core/startos/src/backup/mod.rs @@ -1,13 +1,12 @@ use std::collections::BTreeMap; use chrono::{DateTime, Utc}; -use models::PackageId; +use models::{HostId, PackageId}; use reqwest::Url; use rpc_toolkit::{from_fn_async, HandlerExt, ParentHandler}; use serde::{Deserialize, Serialize}; use crate::context::CliContext; -use crate::net::interface::InterfaceId; #[allow(unused_imports)] use crate::prelude::*; use crate::util::serde::{Base32, Base64}; @@ -50,8 +49,8 @@ pub fn backup() -> ParentHandler { struct BackupMetadata { pub timestamp: DateTime, #[serde(default)] - pub network_keys: BTreeMap>, + pub network_keys: BTreeMap>, #[serde(default)] - pub tor_keys: BTreeMap>, // DEPRECATED + pub tor_keys: BTreeMap>, // DEPRECATED pub marketplace_url: Option, } diff --git a/core/startos/src/config/mod.rs b/core/startos/src/config/mod.rs index 220e388c9..522e5c1a7 100644 --- a/core/startos/src/config/mod.rs +++ b/core/startos/src/config/mod.rs @@ -1,10 +1,9 @@ -use std::collections::BTreeMap; use std::sync::Arc; use std::time::Duration; use clap::Parser; use color_eyre::eyre::eyre; -use indexmap::IndexSet; +use indexmap::{IndexMap, IndexSet}; use itertools::Itertools; use models::{ErrorKind, OptionExt, PackageId}; use patch_db::value::InternedString; @@ -18,15 +17,15 @@ use crate::context::{CliContext, RpcContext}; use crate::prelude::*; use crate::util::serde::{HandlerExtSerde, StdinDeserializable}; +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +pub struct ConfigSpec(pub IndexMap); + pub mod action; -pub mod spec; pub mod util; -pub use spec::{ConfigSpec, Defaultable}; use util::NumRange; use self::action::ConfigRes; -use self::spec::ValueSpecPointer; pub type Config = patch_db::value::InOMap; pub trait TypeOf { @@ -53,8 +52,6 @@ pub enum ConfigurationError { NoMatch(#[from] NoMatchWithPath), #[error("System Error: {0}")] SystemError(Error), - #[error("Permission Denied: {0}")] - PermissionDenied(ValueSpecPointer), } impl From for Error { fn from(err: ConfigurationError) -> Self { @@ -122,8 +119,6 @@ pub enum MatchError { PropertyMatchesUnionTag(InternedString, String), #[error("Name of Property {0:?} Conflicts With Map Tag Name")] PropertyNameMatchesMapTag(String), - #[error("Pointer Is Invalid: {0}")] - InvalidPointer(spec::ValueSpecPointer), #[error("Object Key Is Invalid: {0}")] InvalidKey(String), #[error("Value In List Is Not Unique")] @@ -178,65 +173,19 @@ pub struct SetParams { // )] #[instrument(skip_all)] pub fn set() -> ParentHandler { - ParentHandler::new() - .root_handler( - from_fn_async(set_impl) - .with_metadata("sync_db", Value::Bool(true)) - .with_inherited(|set_params, id| (id, set_params)) - .no_display() - .with_remote_cli::(), - ) - .subcommand( - "dry", - from_fn_async(set_dry) - .with_inherited(|set_params, id| (id, set_params)) - .with_display_serializable() - .with_remote_cli::(), - ) -} - -pub async fn set_dry( - ctx: RpcContext, - _: Empty, - ( - id, - SetParams { - timeout, - config: StdinDeserializable(config), - }, - ): (PackageId, SetParams), -) -> Result, Error> { - let breakages = BTreeMap::new(); - let overrides = Default::default(); - - let configure_context = ConfigureContext { - breakages, - timeout: timeout.map(|t| *t), - config, - dry_run: true, - overrides, - }; - ctx.services - .get(&id) - .await - .as_ref() - .ok_or_else(|| { - Error::new( - eyre!("There is no manager running for {id}"), - ErrorKind::Unknown, - ) - })? - .configure(configure_context) - .await + ParentHandler::new().root_handler( + from_fn_async(set_impl) + .with_metadata("sync_db", Value::Bool(true)) + .with_inherited(|set_params, id| (id, set_params)) + .no_display() + .with_remote_cli::(), + ) } #[derive(Default)] pub struct ConfigureContext { - pub breakages: BTreeMap, pub timeout: Option, pub config: Option, - pub overrides: BTreeMap, - pub dry_run: bool, } #[instrument(skip_all)] @@ -251,15 +200,9 @@ pub async fn set_impl( }, ): (PackageId, SetParams), ) -> Result<(), Error> { - let breakages = BTreeMap::new(); - let overrides = Default::default(); - let configure_context = ConfigureContext { - breakages, timeout: timeout.map(|t| *t), config, - dry_run: false, - overrides, }; ctx.services .get(&id) diff --git a/core/startos/src/config/spec.rs b/core/startos/src/config/spec.rs deleted file mode 100644 index ec2667bfb..000000000 --- a/core/startos/src/config/spec.rs +++ /dev/null @@ -1,2015 +0,0 @@ -use std::borrow::Cow; -use std::collections::{BTreeMap, BTreeSet}; -use std::fmt; -use std::fmt::Debug; -use std::hash::{Hash, Hasher}; -use std::iter::FromIterator; -use std::ops::RangeBounds; -use std::sync::Arc; -use std::time::Duration; - -use async_trait::async_trait; -use imbl::Vector; -use imbl_value::InternedString; -use indexmap::{IndexMap, IndexSet}; -use itertools::Itertools; -use jsonpath_lib::Compiled as CompiledJsonPath; -use models::ProcedureName; -use patch_db::value::{Number, Value}; -use rand::{CryptoRng, Rng}; -use regex::Regex; -use serde::de::{MapAccess, Visitor}; -use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use sqlx::PgPool; - -use super::util::{self, CharSet, NumRange, UniqueBy, STATIC_NULL}; -use super::{Config, MatchError, NoMatchWithPath, TimeoutError, TypeOf}; -use crate::config::action::ConfigRes; -use crate::config::ConfigurationError; -use crate::context::RpcContext; -use crate::net::interface::InterfaceId; -use crate::net::keys::Key; -use crate::prelude::*; -use crate::s9pk::manifest::{Manifest, PackageId}; - -// Config Value Specifications -#[async_trait] -pub trait ValueSpec { - // This function defines whether the value supplied in the argument is - // consistent with the spec in &self - fn matches(&self, value: &Value) -> Result<(), NoMatchWithPath>; - // This function checks whether the value spec is consistent with itself, - // since not all inVariant can be checked by the type - fn validate(&self, manifest: &Manifest) -> Result<(), NoMatchWithPath>; - // update is to fill in values for environment pointers recursively - async fn update( - &self, - ctx: &RpcContext, - manifest: &Manifest, - config_overrides: &BTreeMap, - value: &mut Value, - ) -> Result<(), ConfigurationError>; - // returns all pointers that are live in the provided config - fn pointers(&self, value: &Value) -> Result, NoMatchWithPath>; - // requires returns whether the app id is the target of a pointer within it - fn requires(&self, id: &PackageId, value: &Value) -> bool; - // defines if 2 values of this type are equal for the purpose of uniqueness - fn eq(&self, lhs: &Value, rhs: &Value) -> bool; -} - -// Config Value Default Generation -// -// This behavior is defined by two independent traits as well as a third that -// represents a conjunction of those two traits: -// -// DefaultableWith - defines an associated type describing the information it -// needs to be able to generate a default value, as well as a function for -// extracting relevant pieces of that information and using it to actually -// generate the default value -// -// HasDefaultSpec - only purpose is to summon the default spec for the type -// -// Defaultable - this is a redundant trait that may replace 'DefaultableWith' -// and 'HasDefaultSpec'. -pub trait DefaultableWith { - type DefaultSpec: Sync; - type Error: std::error::Error; - - fn gen_with( - &self, - spec: &Self::DefaultSpec, - rng: &mut R, - timeout: &Option, - ) -> Result; -} -pub trait HasDefaultSpec: DefaultableWith { - fn default_spec(&self) -> &Self::DefaultSpec; -} - -pub trait Defaultable { - type Error; - - fn gen( - &self, - rng: &mut R, - timeout: &Option, - ) -> Result; -} -impl Defaultable for T -where - T: HasDefaultSpec + DefaultableWith + Sync, - E: std::error::Error, -{ - type Error = E; - - fn gen( - &self, - rng: &mut R, - timeout: &Option, - ) -> Result { - self.gen_with(self.default_spec(), rng, timeout) - } -} - -// WithDefault - trivial wrapper that pairs a 'DefaultableWith' type with a -// default spec -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct WithDefault { - #[serde(flatten)] - pub inner: T, - pub default: T::DefaultSpec, -} -impl DefaultableWith for WithDefault -where - T: DefaultableWith + Sync + Send, - T::DefaultSpec: Send, -{ - type DefaultSpec = T::DefaultSpec; - type Error = T::Error; - - fn gen_with( - &self, - spec: &Self::DefaultSpec, - rng: &mut R, - timeout: &Option, - ) -> Result { - self.inner.gen_with(spec, rng, timeout) - } -} -impl HasDefaultSpec for WithDefault -where - T: DefaultableWith + Sync + Send, - T::DefaultSpec: Send, -{ - fn default_spec(&self) -> &Self::DefaultSpec { - &self.default - } -} -#[async_trait] -impl ValueSpec for WithDefault -where - T: ValueSpec + DefaultableWith + Send + Sync, - Self: Send + Sync, -{ - fn matches(&self, value: &Value) -> Result<(), NoMatchWithPath> { - self.inner.matches(value) - } - fn validate(&self, manifest: &Manifest) -> Result<(), NoMatchWithPath> { - self.inner.validate(manifest) - } - async fn update( - &self, - ctx: &RpcContext, - manifest: &Manifest, - config_overrides: &BTreeMap, - value: &mut Value, - ) -> Result<(), ConfigurationError> { - self.inner - .update(ctx, manifest, config_overrides, value) - .await - } - fn pointers(&self, value: &Value) -> Result, NoMatchWithPath> { - self.inner.pointers(value) - } - fn requires(&self, id: &PackageId, value: &Value) -> bool { - self.inner.requires(id, value) - } - fn eq(&self, lhs: &Value, rhs: &Value) -> bool { - self.inner.eq(lhs, rhs) - } -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct WithNullable { - #[serde(flatten)] - pub inner: T, - pub nullable: bool, -} -#[async_trait] -impl ValueSpec for WithNullable -where - T: ValueSpec + Send + Sync, - Self: Send + Sync, -{ - fn matches(&self, value: &Value) -> Result<(), NoMatchWithPath> { - match (self.nullable, value) { - (true, &Value::Null) => Ok(()), - _ => self.inner.matches(value), - } - } - fn validate(&self, manifest: &Manifest) -> Result<(), NoMatchWithPath> { - self.inner.validate(manifest) - } - async fn update( - &self, - ctx: &RpcContext, - manifest: &Manifest, - config_overrides: &BTreeMap, - value: &mut Value, - ) -> Result<(), ConfigurationError> { - self.inner - .update(ctx, manifest, config_overrides, value) - .await - } - fn pointers(&self, value: &Value) -> Result, NoMatchWithPath> { - self.inner.pointers(value) - } - fn requires(&self, id: &PackageId, value: &Value) -> bool { - self.inner.requires(id, value) - } - fn eq(&self, lhs: &Value, rhs: &Value) -> bool { - self.inner.eq(lhs, rhs) - } -} - -impl DefaultableWith for WithNullable -where - T: DefaultableWith + Sync + Send, -{ - type DefaultSpec = T::DefaultSpec; - type Error = T::Error; - - fn gen_with( - &self, - spec: &Self::DefaultSpec, - rng: &mut R, - timeout: &Option, - ) -> Result { - self.inner.gen_with(spec, rng, timeout) - } -} - -impl Defaultable for WithNullable -where - T: Defaultable + Sync + Send, -{ - type Error = T::Error; - - fn gen( - &self, - rng: &mut R, - timeout: &Option, - ) -> Result { - self.inner.gen(rng, timeout) - } -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -#[serde(rename_all = "kebab-case")] -pub struct WithDescription { - #[serde(flatten)] - pub inner: T, - pub description: Option, - pub name: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub warning: Option, -} -#[async_trait] -impl ValueSpec for WithDescription -where - T: ValueSpec + Sync + Send, - Self: Sync + Send, -{ - fn matches(&self, value: &Value) -> Result<(), NoMatchWithPath> { - self.inner.matches(value) - } - fn validate(&self, manifest: &Manifest) -> Result<(), NoMatchWithPath> { - self.inner.validate(manifest) - } - async fn update( - &self, - ctx: &RpcContext, - manifest: &Manifest, - config_overrides: &BTreeMap, - value: &mut Value, - ) -> Result<(), ConfigurationError> { - self.inner - .update(ctx, manifest, config_overrides, value) - .await - } - fn pointers(&self, value: &Value) -> Result, NoMatchWithPath> { - self.inner.pointers(value) - } - fn requires(&self, id: &PackageId, value: &Value) -> bool { - self.inner.requires(id, value) - } - fn eq(&self, lhs: &Value, rhs: &Value) -> bool { - self.inner.eq(lhs, rhs) - } -} - -impl DefaultableWith for WithDescription -where - T: DefaultableWith + Sync + Send, -{ - type DefaultSpec = T::DefaultSpec; - type Error = T::Error; - - fn gen_with( - &self, - spec: &Self::DefaultSpec, - rng: &mut R, - timeout: &Option, - ) -> Result { - self.inner.gen_with(spec, rng, timeout) - } -} - -impl Defaultable for WithDescription -where - T: Defaultable + Sync + Send, -{ - type Error = T::Error; - - fn gen( - &self, - rng: &mut R, - timeout: &Option, - ) -> Result { - self.inner.gen(rng, timeout) - } -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -#[serde(rename_all = "kebab-case")] -#[serde(tag = "type")] -pub enum ValueSpecAny { - Boolean(WithDescription>), - Enum(WithDescription>), - List(ValueSpecList), - Number(WithDescription>>), - Object(WithDescription), - String(WithDescription>>), - Union(WithDescription>), - Pointer(WithDescription), -} -impl ValueSpecAny { - pub fn name(&self) -> &'_ str { - match self { - ValueSpecAny::Boolean(b) => b.name.as_str(), - ValueSpecAny::Enum(e) => e.name.as_str(), - ValueSpecAny::List(l) => match l { - ValueSpecList::Enum(e) => e.name.as_str(), - ValueSpecList::Number(n) => n.name.as_str(), - ValueSpecList::Object(o) => o.name.as_str(), - ValueSpecList::String(s) => s.name.as_str(), - ValueSpecList::Union(u) => u.name.as_str(), - }, - ValueSpecAny::Number(n) => n.name.as_str(), - ValueSpecAny::Object(o) => o.name.as_str(), - ValueSpecAny::Pointer(p) => p.name.as_str(), - ValueSpecAny::String(s) => s.name.as_str(), - ValueSpecAny::Union(u) => u.name.as_str(), - } - } -} -#[async_trait] -impl ValueSpec for ValueSpecAny { - fn matches(&self, value: &Value) -> Result<(), NoMatchWithPath> { - match self { - ValueSpecAny::Boolean(a) => a.matches(value), - ValueSpecAny::Enum(a) => a.matches(value), - ValueSpecAny::List(a) => a.matches(value), - ValueSpecAny::Number(a) => a.matches(value), - ValueSpecAny::Object(a) => a.matches(value), - ValueSpecAny::String(a) => a.matches(value), - ValueSpecAny::Union(a) => a.matches(value), - ValueSpecAny::Pointer(a) => a.matches(value), - } - } - fn validate(&self, manifest: &Manifest) -> Result<(), NoMatchWithPath> { - match self { - ValueSpecAny::Boolean(a) => a.validate(manifest), - ValueSpecAny::Enum(a) => a.validate(manifest), - ValueSpecAny::List(a) => a.validate(manifest), - ValueSpecAny::Number(a) => a.validate(manifest), - ValueSpecAny::Object(a) => a.validate(manifest), - ValueSpecAny::String(a) => a.validate(manifest), - ValueSpecAny::Union(a) => a.validate(manifest), - ValueSpecAny::Pointer(a) => a.validate(manifest), - } - } - async fn update( - &self, - ctx: &RpcContext, - manifest: &Manifest, - config_overrides: &BTreeMap, - value: &mut Value, - ) -> Result<(), ConfigurationError> { - match self { - ValueSpecAny::Boolean(a) => a.update(ctx, manifest, config_overrides, value).await, - ValueSpecAny::Enum(a) => a.update(ctx, manifest, config_overrides, value).await, - ValueSpecAny::List(a) => a.update(ctx, manifest, config_overrides, value).await, - ValueSpecAny::Number(a) => a.update(ctx, manifest, config_overrides, value).await, - ValueSpecAny::Object(a) => a.update(ctx, manifest, config_overrides, value).await, - ValueSpecAny::String(a) => a.update(ctx, manifest, config_overrides, value).await, - ValueSpecAny::Union(a) => a.update(ctx, manifest, config_overrides, value).await, - ValueSpecAny::Pointer(a) => a.update(ctx, manifest, config_overrides, value).await, - } - } - fn pointers(&self, value: &Value) -> Result, NoMatchWithPath> { - match self { - ValueSpecAny::Boolean(a) => a.pointers(value), - ValueSpecAny::Enum(a) => a.pointers(value), - ValueSpecAny::List(a) => a.pointers(value), - ValueSpecAny::Number(a) => a.pointers(value), - ValueSpecAny::Object(a) => a.pointers(value), - ValueSpecAny::String(a) => a.pointers(value), - ValueSpecAny::Union(a) => a.pointers(value), - ValueSpecAny::Pointer(a) => a.pointers(value), - } - } - fn requires(&self, id: &PackageId, value: &Value) -> bool { - match self { - ValueSpecAny::Boolean(a) => a.requires(id, value), - ValueSpecAny::Enum(a) => a.requires(id, value), - ValueSpecAny::List(a) => a.requires(id, value), - ValueSpecAny::Number(a) => a.requires(id, value), - ValueSpecAny::Object(a) => a.requires(id, value), - ValueSpecAny::String(a) => a.requires(id, value), - ValueSpecAny::Union(a) => a.requires(id, value), - ValueSpecAny::Pointer(a) => a.requires(id, value), - } - } - fn eq(&self, lhs: &Value, rhs: &Value) -> bool { - match self { - ValueSpecAny::Boolean(a) => a.eq(lhs, rhs), - ValueSpecAny::Enum(a) => a.eq(lhs, rhs), - ValueSpecAny::List(a) => a.eq(lhs, rhs), - ValueSpecAny::Number(a) => a.eq(lhs, rhs), - ValueSpecAny::Object(a) => a.eq(lhs, rhs), - ValueSpecAny::String(a) => a.eq(lhs, rhs), - ValueSpecAny::Union(a) => a.eq(lhs, rhs), - ValueSpecAny::Pointer(a) => a.eq(lhs, rhs), - } - } -} -impl Defaultable for ValueSpecAny { - type Error = ConfigurationError; - - fn gen( - &self, - rng: &mut R, - timeout: &Option, - ) -> Result { - match self { - ValueSpecAny::Boolean(a) => a.gen(rng, timeout).map_err(crate::util::Never::absurd), - ValueSpecAny::Enum(a) => a.gen(rng, timeout).map_err(crate::util::Never::absurd), - ValueSpecAny::List(a) => a.gen(rng, timeout), - ValueSpecAny::Number(a) => a.gen(rng, timeout).map_err(crate::util::Never::absurd), - ValueSpecAny::Object(a) => a.gen(rng, timeout), - ValueSpecAny::String(a) => a.gen(rng, timeout).map_err(ConfigurationError::from), - ValueSpecAny::Union(a) => a.gen(rng, timeout), - ValueSpecAny::Pointer(a) => a.gen(rng, timeout), - } - } -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct ValueSpecBoolean {} -#[async_trait] -impl ValueSpec for ValueSpecBoolean { - fn matches(&self, val: &Value) -> Result<(), NoMatchWithPath> { - match val { - Value::Bool(_) => Ok(()), - Value::Null => Err(NoMatchWithPath::new(MatchError::NotNullable)), - a => Err(NoMatchWithPath::new(MatchError::InvalidType( - "boolean", - a.type_of(), - ))), - } - } - fn validate(&self, _manifest: &Manifest) -> Result<(), NoMatchWithPath> { - Ok(()) - } - async fn update( - &self, - _ctx: &RpcContext, - _manifest: &Manifest, - _config_overrides: &BTreeMap, - _value: &mut Value, - ) -> Result<(), ConfigurationError> { - Ok(()) - } - fn pointers(&self, _value: &Value) -> Result, NoMatchWithPath> { - Ok(BTreeSet::new()) - } - fn requires(&self, _id: &PackageId, _value: &Value) -> bool { - false - } - fn eq(&self, lhs: &Value, rhs: &Value) -> bool { - match (lhs, rhs) { - (Value::Bool(lhs), Value::Bool(rhs)) => lhs == rhs, - _ => false, - } - } -} -impl DefaultableWith for ValueSpecBoolean { - type DefaultSpec = bool; - type Error = crate::util::Never; - - fn gen_with( - &self, - spec: &Self::DefaultSpec, - _rng: &mut R, - _timeout: &Option, - ) -> Result { - Ok(Value::Bool(*spec)) - } -} - -#[derive(Clone, Debug, Serialize)] -#[serde(rename_all = "kebab-case")] -pub struct ValueSpecEnum { - pub values: IndexSet, - pub value_names: BTreeMap, -} -impl<'de> serde::de::Deserialize<'de> for ValueSpecEnum { - fn deserialize>(deserializer: D) -> Result { - #[derive(Deserialize)] - #[serde(rename_all = "kebab-case")] - pub struct _ValueSpecEnum { - pub values: IndexSet, - #[serde(default)] - pub value_names: BTreeMap, - } - - let mut r#enum = _ValueSpecEnum::deserialize(deserializer)?; - for name in &r#enum.values { - if !r#enum.value_names.contains_key(name) { - r#enum.value_names.insert(name.clone(), name.clone()); - } - } - Ok(ValueSpecEnum { - values: r#enum.values, - value_names: r#enum.value_names, - }) - } -} -#[async_trait] -impl ValueSpec for ValueSpecEnum { - fn matches(&self, val: &Value) -> Result<(), NoMatchWithPath> { - match val { - Value::String(b) => { - if self.values.contains(&**b) { - Ok(()) - } else { - Err(NoMatchWithPath::new(MatchError::Enum( - b.clone(), - self.values.clone(), - ))) - } - } - Value::Null => Err(NoMatchWithPath::new(MatchError::NotNullable)), - a => Err(NoMatchWithPath::new(MatchError::InvalidType( - "string", - a.type_of(), - ))), - } - } - fn validate(&self, _manifest: &Manifest) -> Result<(), NoMatchWithPath> { - Ok(()) - } - async fn update( - &self, - _ctx: &RpcContext, - _manifest: &Manifest, - _config_overrides: &BTreeMap, - _value: &mut Value, - ) -> Result<(), ConfigurationError> { - Ok(()) - } - fn pointers(&self, _value: &Value) -> Result, NoMatchWithPath> { - Ok(BTreeSet::new()) - } - fn requires(&self, _id: &PackageId, _value: &Value) -> bool { - false - } - fn eq(&self, lhs: &Value, rhs: &Value) -> bool { - match (lhs, rhs) { - (Value::String(lhs), Value::String(rhs)) => lhs == rhs, - _ => false, - } - } -} -impl DefaultableWith for ValueSpecEnum { - type DefaultSpec = Arc; - type Error = crate::util::Never; - - fn gen_with( - &self, - spec: &Self::DefaultSpec, - _rng: &mut R, - _timeout: &Option, - ) -> Result { - Ok(Value::String(spec.clone())) - } -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct ListSpec { - pub spec: T, - pub range: NumRange, -} -#[async_trait] -impl ValueSpec for ListSpec -where - T: ValueSpec + Sync + Send, - Self: Sync + Send, -{ - fn matches(&self, value: &Value) -> Result<(), NoMatchWithPath> { - match value { - Value::Array(l) => { - if !self.range.contains(&l.len()) { - Err(NoMatchWithPath { - path: Vec::new(), - error: MatchError::LengthMismatch(self.range.clone(), l.len()), - }) - } else { - l.iter() - .enumerate() - .map(|(i, v)| { - self.spec - .matches(v) - .map_err(|e| e.prepend(InternedString::from_display(&i)))?; - if l.iter() - .enumerate() - .any(|(i2, v2)| i != i2 && self.spec.eq(v, v2)) - { - Err(NoMatchWithPath::new(MatchError::ListUniquenessViolation) - .prepend(InternedString::from_display(&i))) - } else { - Ok(()) - } - }) - .collect() - } - } - Value::Null => Err(NoMatchWithPath::new(MatchError::NotNullable)), - a => Err(NoMatchWithPath::new(MatchError::InvalidType( - "list", - a.type_of(), - ))), - } - } - fn validate(&self, manifest: &Manifest) -> Result<(), NoMatchWithPath> { - self.spec.validate(manifest) - } - async fn update( - &self, - ctx: &RpcContext, - manifest: &Manifest, - config_overrides: &BTreeMap, - value: &mut Value, - ) -> Result<(), ConfigurationError> { - if let Value::Array(ref mut ls) = value { - for (i, val) in ls.iter_mut().enumerate() { - match self.spec.update(ctx, manifest, config_overrides, val).await { - Err(ConfigurationError::NoMatch(e)) => Err(ConfigurationError::NoMatch( - e.prepend(InternedString::from_display(&i)), - )), - a => a, - }?; - } - Ok(()) - } else { - Err(ConfigurationError::NoMatch(NoMatchWithPath::new( - MatchError::InvalidType("list", value.type_of()), - ))) - } - } - fn pointers(&self, _value: &Value) -> Result, NoMatchWithPath> { - Ok(BTreeSet::new()) - } - fn requires(&self, id: &PackageId, value: &Value) -> bool { - if let Value::Array(ref ls) = value { - ls.into_iter().any(|v| self.spec.requires(id, v)) - } else { - false - } - } - fn eq(&self, lhs: &Value, rhs: &Value) -> bool { - match (lhs, rhs) { - (Value::Array(lhs), Value::Array(rhs)) => { - lhs.iter().zip_longest(rhs.iter()).all(|zip| match zip { - itertools::EitherOrBoth::Both(lhs, rhs) => lhs == rhs, - _ => false, - }) - } - _ => false, - } - } -} - -impl DefaultableWith for ListSpec -where - T: DefaultableWith + Sync + Send, -{ - type DefaultSpec = Vec; - type Error = T::Error; - - fn gen_with( - &self, - spec: &Self::DefaultSpec, - rng: &mut R, - timeout: &Option, - ) -> Result { - let mut res = Vector::new(); - for spec_member in spec.iter() { - res.push_back(self.spec.gen_with(spec_member, rng, timeout)?); - } - Ok(Value::Array(res)) - } -} - -unsafe impl Sync for ValueSpecObject {} // TODO: remove -unsafe impl Send for ValueSpecObject {} // TODO: remove -unsafe impl Sync for ValueSpecUnion {} // TODO: remove -unsafe impl Send for ValueSpecUnion {} // TODO: remove - -#[derive(Clone, Debug, Serialize, Deserialize)] -#[serde(rename_all = "kebab-case")] -#[serde(tag = "subtype")] -pub enum ValueSpecList { - Enum(WithDescription>>), - Number(WithDescription>>), - Object(WithDescription>>), - String(WithDescription>>), - Union(WithDescription>>>), -} -#[async_trait] -impl ValueSpec for ValueSpecList { - fn matches(&self, value: &Value) -> Result<(), NoMatchWithPath> { - match self { - ValueSpecList::Enum(a) => a.matches(value), - ValueSpecList::Number(a) => a.matches(value), - ValueSpecList::Object(a) => a.matches(value), - ValueSpecList::String(a) => a.matches(value), - ValueSpecList::Union(a) => a.matches(value), - } - } - fn validate(&self, manifest: &Manifest) -> Result<(), NoMatchWithPath> { - match self { - ValueSpecList::Enum(a) => a.validate(manifest), - ValueSpecList::Number(a) => a.validate(manifest), - ValueSpecList::Object(a) => a.validate(manifest), - ValueSpecList::String(a) => a.validate(manifest), - ValueSpecList::Union(a) => a.validate(manifest), - } - } - async fn update( - &self, - ctx: &RpcContext, - manifest: &Manifest, - config_overrides: &BTreeMap, - value: &mut Value, - ) -> Result<(), ConfigurationError> { - match self { - ValueSpecList::Enum(a) => a.update(ctx, manifest, config_overrides, value).await, - ValueSpecList::Number(a) => a.update(ctx, manifest, config_overrides, value).await, - ValueSpecList::Object(a) => a.update(ctx, manifest, config_overrides, value).await, - ValueSpecList::String(a) => a.update(ctx, manifest, config_overrides, value).await, - ValueSpecList::Union(a) => a.update(ctx, manifest, config_overrides, value).await, - } - } - fn pointers(&self, value: &Value) -> Result, NoMatchWithPath> { - match self { - ValueSpecList::Enum(a) => a.pointers(value), - ValueSpecList::Number(a) => a.pointers(value), - ValueSpecList::Object(a) => a.pointers(value), - ValueSpecList::String(a) => a.pointers(value), - ValueSpecList::Union(a) => a.pointers(value), - } - } - fn requires(&self, id: &PackageId, value: &Value) -> bool { - match self { - ValueSpecList::Enum(a) => a.requires(id, value), - ValueSpecList::Number(a) => a.requires(id, value), - ValueSpecList::Object(a) => a.requires(id, value), - ValueSpecList::String(a) => a.requires(id, value), - ValueSpecList::Union(a) => a.requires(id, value), - } - } - fn eq(&self, lhs: &Value, rhs: &Value) -> bool { - match self { - ValueSpecList::Enum(a) => a.eq(lhs, rhs), - ValueSpecList::Number(a) => a.eq(lhs, rhs), - ValueSpecList::Object(a) => a.eq(lhs, rhs), - ValueSpecList::String(a) => a.eq(lhs, rhs), - ValueSpecList::Union(a) => a.eq(lhs, rhs), - } - } -} - -impl Defaultable for ValueSpecList { - type Error = ConfigurationError; - - fn gen( - &self, - rng: &mut R, - timeout: &Option, - ) -> Result { - match self { - ValueSpecList::Enum(a) => a.gen(rng, timeout).map_err(crate::util::Never::absurd), - ValueSpecList::Number(a) => a.gen(rng, timeout).map_err(crate::util::Never::absurd), - ValueSpecList::Object(a) => { - let mut ret = match a.gen(rng, timeout).unwrap() { - Value::Array(l) => l, - a => { - return Err(ConfigurationError::NoMatch(NoMatchWithPath::new( - MatchError::InvalidType("list", a.type_of()), - ))) - } - }; - while !( - a.inner.inner.range.start_bound(), - std::ops::Bound::Unbounded, - ) - .contains(&ret.len()) - { - ret.push_back( - a.inner - .inner - .spec - .gen(rng, timeout) - .map_err(ConfigurationError::from)?, - ); - } - Ok(Value::Array(ret)) - } - ValueSpecList::String(a) => a.gen(rng, timeout).map_err(ConfigurationError::from), - ValueSpecList::Union(a) => a.gen(rng, timeout).map_err(ConfigurationError::from), - } - } -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct ValueSpecNumber { - range: Option>, - #[serde(default)] - integral: bool, - #[serde(skip_serializing_if = "Option::is_none")] - units: Option, - #[serde(skip_serializing_if = "Option::is_none")] - #[serde(default)] - pub placeholder: Option, -} -#[async_trait] -impl ValueSpec for ValueSpecNumber { - fn matches(&self, value: &Value) -> Result<(), NoMatchWithPath> { - match value { - Value::Number(n) => { - let n = n.as_f64().unwrap(); - if self.integral && n.floor() != n { - return Err(NoMatchWithPath::new(MatchError::NonIntegral(n))); - } - if let Some(range) = &self.range { - if !range.contains(&n) { - return Err(NoMatchWithPath::new(MatchError::OutOfRange( - range.clone(), - n, - ))); - } - } - Ok(()) - } - Value::Null => Err(NoMatchWithPath::new(MatchError::NotNullable)), - a => Err(NoMatchWithPath::new(MatchError::InvalidType( - "object", - a.type_of(), - ))), - } - } - fn validate(&self, _manifest: &Manifest) -> Result<(), NoMatchWithPath> { - Ok(()) - } - async fn update( - &self, - _ctx: &RpcContext, - _manifest: &Manifest, - _config_overrides: &BTreeMap, - _value: &mut Value, - ) -> Result<(), ConfigurationError> { - Ok(()) - } - fn pointers(&self, _value: &Value) -> Result, NoMatchWithPath> { - Ok(BTreeSet::new()) - } - fn requires(&self, _id: &PackageId, _value: &Value) -> bool { - false - } - fn eq(&self, lhs: &Value, rhs: &Value) -> bool { - match (lhs, rhs) { - (Value::Number(lhs), Value::Number(rhs)) => lhs == rhs, - _ => false, - } - } -} -impl DefaultableWith for ValueSpecNumber { - type DefaultSpec = Option; - type Error = crate::util::Never; - - fn gen_with( - &self, - spec: &Self::DefaultSpec, - _rng: &mut R, - _timeout: &Option, - ) -> Result { - Ok(spec - .clone() - .map(|s| Value::Number(s)) - .unwrap_or(Value::Null)) - } -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -#[serde(rename_all = "kebab-case")] -pub struct ValueSpecObject { - pub spec: ConfigSpec, - pub display_as: Option, - #[serde(default)] - pub unique_by: UniqueBy, -} -#[async_trait] -impl ValueSpec for ValueSpecObject { - fn matches(&self, value: &Value) -> Result<(), NoMatchWithPath> { - match value { - Value::Object(o) => self.spec.matches(o), - Value::Null => Err(NoMatchWithPath::new(MatchError::NotNullable)), - a => Err(NoMatchWithPath::new(MatchError::InvalidType( - "object", - a.type_of(), - ))), - } - } - fn validate(&self, manifest: &Manifest) -> Result<(), NoMatchWithPath> { - self.spec.validate(manifest) - } - async fn update( - &self, - ctx: &RpcContext, - manifest: &Manifest, - config_overrides: &BTreeMap, - value: &mut Value, - ) -> Result<(), ConfigurationError> { - if let Value::Object(o) = value { - self.spec.update(ctx, manifest, config_overrides, o).await - } else { - Err(ConfigurationError::NoMatch(NoMatchWithPath::new( - MatchError::InvalidType("object", value.type_of()), - ))) - } - } - fn pointers(&self, value: &Value) -> Result, NoMatchWithPath> { - if let Value::Object(o) = value { - self.spec.pointers(o) - } else { - Err(NoMatchWithPath::new(MatchError::InvalidType( - "object", - value.type_of(), - ))) - } - } - fn requires(&self, id: &PackageId, value: &Value) -> bool { - if let Value::Object(o) = value { - self.spec.requires(id, o) - } else { - false - } - } - fn eq(&self, lhs: &Value, rhs: &Value) -> bool { - match (lhs, rhs) { - (Value::Object(lhs), Value::Object(rhs)) => self.unique_by.eq(lhs, rhs), - _ => false, - } - } -} -impl DefaultableWith for ValueSpecObject { - type DefaultSpec = Config; - type Error = crate::util::Never; - - fn gen_with( - &self, - spec: &Self::DefaultSpec, - _rng: &mut R, - _timeout: &Option, - ) -> Result { - Ok(Value::Object(spec.clone())) - } -} -impl Defaultable for ValueSpecObject { - type Error = ConfigurationError; - - fn gen( - &self, - rng: &mut R, - timeout: &Option, - ) -> Result { - self.spec.gen(rng, timeout).map(Value::Object) - } -} - -#[derive(Clone, Debug, Default, Serialize, Deserialize)] -pub struct ConfigSpec(pub IndexMap); -impl ConfigSpec { - pub fn matches(&self, value: &Config) -> Result<(), NoMatchWithPath> { - for (key, val) in self.0.iter() { - if let Some(v) = value.get(&**key) { - val.matches(v).map_err(|e| e.prepend(key.clone()))?; - } else { - val.matches(&Value::Null) - .map_err(|e| e.prepend(key.clone()))?; - } - } - Ok(()) - } - - pub fn gen( - &self, - rng: &mut R, - timeout: &Option, - ) -> Result { - let mut res = Config::new(); - for (key, val) in self.0.iter() { - res.insert(key.clone(), val.gen(rng, timeout)?); - } - Ok(res) - } - - pub fn validate(&self, manifest: &Manifest) -> Result<(), NoMatchWithPath> { - for (name, val) in &self.0 { - val.validate(manifest) - .map_err(|e| e.prepend(name.clone()))?; - } - Ok(()) - } - - pub async fn update( - &self, - ctx: &RpcContext, - manifest: &Manifest, - config_overrides: &BTreeMap, - cfg: &mut Config, - ) -> Result<(), ConfigurationError> { - for (k, vs) in self.0.iter() { - match cfg.get_mut(k) { - None => { - let mut v = Value::Null; - vs.update(ctx, manifest, config_overrides, &mut v).await?; - cfg.insert(k.clone(), v); - } - Some(v) => match vs.update(ctx, manifest, config_overrides, v).await { - Err(ConfigurationError::NoMatch(e)) => { - Err(ConfigurationError::NoMatch(e.prepend(k.clone()))) - } - a => a, - }?, - }; - } - Ok(()) - } - - pub fn pointers(&self, cfg: &Config) -> Result, NoMatchWithPath> { - cfg.iter() - .filter_map(|(k, v)| self.0.get(k).map(|vs| (k, vs.pointers(v)))) - .fold(Ok(BTreeSet::::new()), |acc, v| { - match (acc, v) { - // propagate existing errors - (Err(e), _) => Err(e), - // create new error case - (Ok(_), (k, Err(e))) => Err(e.prepend(k.clone())), - // combine sets - (Ok(s0), (_, Ok(s1))) => Ok(BTreeSet::from_iter(s0.union(&s1).cloned())), - } - }) - } - - pub fn requires(&self, id: &PackageId, cfg: &Config) -> bool { - self.0 - .iter() - .any(|(k, v)| v.requires(id, cfg.get(k).unwrap_or(&STATIC_NULL))) - } -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -#[serde(rename_all = "kebab-case")] -pub struct Pattern { - #[serde(with = "util::serde_regex")] - pub pattern: Regex, - pub pattern_description: String, -} - -#[derive(Clone, Debug, Serialize)] -#[serde(rename_all = "kebab-case")] -pub struct ValueSpecString { - #[serde(flatten)] - pub pattern: Option, - pub textarea: bool, - pub copyable: bool, - pub masked: bool, - #[serde(skip_serializing_if = "Option::is_none")] - pub placeholder: Option, -} -impl<'de> Deserialize<'de> for ValueSpecString { - fn deserialize>(deserializer: D) -> Result { - struct ValueSpecStringVisitor; - impl<'de> Visitor<'de> for ValueSpecStringVisitor { - type Value = ValueSpecString; - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("struct ValueSpecString") - } - fn visit_map>(self, mut map: V) -> Result { - let mut pattern = None; - let mut pattern_description = None; - let mut textarea = false; - let mut copyable = false; - let mut masked = false; - let mut placeholder = None; - while let Some::(key) = map.next_key()? { - if &key == "pattern" { - if pattern.is_some() { - return Err(serde::de::Error::duplicate_field("pattern")); - } else { - pattern = Some( - Regex::new(&map.next_value::()?) - .map_err(serde::de::Error::custom)?, - ); - } - } else if &key == "pattern-description" { - if pattern_description.is_some() { - return Err(serde::de::Error::duplicate_field("pattern-description")); - } else { - pattern_description = Some(map.next_value()?); - } - } else if &key == "textarea" { - textarea = map.next_value()?; - } else if &key == "copyable" { - copyable = map.next_value()?; - } else if &key == "masked" { - masked = map.next_value()?; - } else if &key == "placeholder" { - if placeholder.is_some() { - return Err(serde::de::Error::duplicate_field("placeholder")); - } else { - placeholder = Some(map.next_value()?); - } - } - } - let regex = match (pattern, pattern_description) { - (None, None) => None, - (Some(p), Some(d)) => Some(Pattern { - pattern: p, - pattern_description: d, - }), - (Some(_), None) => { - return Err(serde::de::Error::missing_field("pattern-description")); - } - (None, Some(_)) => { - return Err(serde::de::Error::missing_field("pattern")); - } - }; - Ok(ValueSpecString { - pattern: regex, - textarea, - copyable, - masked, - placeholder, - }) - } - } - const FIELDS: &[&str] = &[ - "pattern", - "pattern-description", - "textarea", - "copyable", - "masked", - "placeholder", - ]; - deserializer.deserialize_struct("ValueSpecString", FIELDS, ValueSpecStringVisitor) - } -} -#[async_trait] -impl ValueSpec for ValueSpecString { - fn matches(&self, value: &Value) -> Result<(), NoMatchWithPath> { - match value { - Value::String(s) => { - if let Some(pattern) = &self.pattern { - if pattern.pattern.is_match(s) { - Ok(()) - } else { - Err(NoMatchWithPath::new(MatchError::Pattern( - s.clone(), - pattern.pattern.clone(), - ))) - } - } else { - Ok(()) - } - } - Value::Null => Err(NoMatchWithPath::new(MatchError::NotNullable)), - a => Err(NoMatchWithPath::new(MatchError::InvalidType( - "string", - a.type_of(), - ))), - } - } - fn validate(&self, _manifest: &Manifest) -> Result<(), NoMatchWithPath> { - Ok(()) - } - async fn update( - &self, - _ctx: &RpcContext, - _manifest: &Manifest, - _config_overrides: &BTreeMap, - _value: &mut Value, - ) -> Result<(), ConfigurationError> { - Ok(()) - } - fn pointers(&self, _value: &Value) -> Result, NoMatchWithPath> { - Ok(BTreeSet::new()) - } - fn requires(&self, _id: &PackageId, _value: &Value) -> bool { - false - } - fn eq(&self, lhs: &Value, rhs: &Value) -> bool { - match (lhs, rhs) { - (Value::String(lhs), Value::String(rhs)) => lhs == rhs, - _ => false, - } - } -} -impl DefaultableWith for ValueSpecString { - type DefaultSpec = Option; - type Error = TimeoutError; - - fn gen_with( - &self, - spec: &Self::DefaultSpec, - rng: &mut R, - timeout: &Option, - ) -> Result { - if let Some(spec) = spec { - let now = timeout.as_ref().map(|_| std::time::Instant::now()); - loop { - let candidate = spec.gen(rng); - match (spec, &self.pattern) { - (DefaultString::Entropy(_), Some(pattern)) - if !pattern.pattern.is_match(&candidate) => {} - _ => { - return Ok(Value::String(candidate)); - } - } - if let (Some(now), Some(timeout)) = (now, timeout) { - if &now.elapsed() > timeout { - return Err(TimeoutError); - } - } else { - return Ok(Value::String(candidate)); - } - } - } else { - Ok(Value::Null) - } - } -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -#[serde(untagged)] -pub enum DefaultString { - Literal(String), - Entropy(Entropy), -} -impl DefaultString { - pub fn gen(&self, rng: &mut R) -> Arc { - Arc::new(match self { - DefaultString::Literal(s) => s.clone(), - DefaultString::Entropy(e) => e.gen(rng), - }) - } -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct Entropy { - pub charset: Option, - pub len: usize, -} -impl Entropy { - pub fn gen(&self, rng: &mut R) -> String { - let len = self.len; - let set = self - .charset - .as_ref() - .map(|cs| Cow::Borrowed(cs)) - .unwrap_or_else(|| Cow::Owned(Default::default())); - std::iter::repeat_with(|| set.gen(rng)).take(len).collect() - } -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -#[serde(rename_all = "kebab-case")] -pub struct UnionTag { - pub id: InternedString, - pub name: String, - pub description: Option, - pub variant_names: BTreeMap, -} - -#[derive(Clone, Debug, Serialize)] -#[serde(rename_all = "kebab-case")] -pub struct ValueSpecUnion { - pub tag: UnionTag, - pub variants: BTreeMap, - pub display_as: Option, - pub unique_by: UniqueBy, -} - -impl<'de> serde::de::Deserialize<'de> for ValueSpecUnion { - fn deserialize>(deserializer: D) -> Result { - #[derive(Deserialize)] - #[serde(rename_all = "kebab-case")] - #[serde(untagged)] - pub enum _UnionTag { - Old(InternedString), - New(UnionTag), - } - #[derive(Deserialize)] - #[serde(rename_all = "kebab-case")] - pub struct _ValueSpecUnion { - pub variants: BTreeMap, - pub tag: _UnionTag, - pub display_as: Option, - #[serde(default)] - pub unique_by: UniqueBy, - } - - let u = _ValueSpecUnion::deserialize(deserializer)?; - Ok(ValueSpecUnion { - tag: match u.tag { - _UnionTag::Old(id) => UnionTag { - id: id.clone(), - name: id.to_string(), - description: None, - variant_names: u - .variants - .keys() - .map(|k| (k.to_owned(), k.to_owned())) - .collect(), - }, - _UnionTag::New(UnionTag { - id, - name, - description, - mut variant_names, - }) => UnionTag { - id, - name, - description, - variant_names: { - let mut iter = u.variants.keys(); - while variant_names.len() < u.variants.len() { - if let Some(variant) = iter.next() { - variant_names.insert(variant.to_owned(), variant.to_owned()); - } else { - break; - } - } - variant_names - }, - }, - }, - variants: u.variants, - display_as: u.display_as, - unique_by: u.unique_by, - }) - } -} - -#[async_trait] -impl ValueSpec for ValueSpecUnion { - fn matches(&self, value: &Value) -> Result<(), NoMatchWithPath> { - match value { - Value::Object(o) => { - if let Some(Value::String(ref tag)) = o.get(&*self.tag.id) { - if let Some(obj_spec) = self.variants.get(&**tag) { - let mut without_tag = o.clone(); - without_tag.remove(&*self.tag.id); - obj_spec.matches(&without_tag) - } else { - Err(NoMatchWithPath::new(MatchError::Union( - tag.clone(), - self.variants.keys().cloned().collect(), - ))) - } - } else { - Err(NoMatchWithPath::new(MatchError::MissingTag( - self.tag.id.clone(), - ))) - } - } - Value::Null => Err(NoMatchWithPath::new(MatchError::NotNullable)), - a => Err(NoMatchWithPath::new(MatchError::InvalidType( - "object", - a.type_of(), - ))), - } - } - fn validate(&self, manifest: &Manifest) -> Result<(), NoMatchWithPath> { - for (name, variant) in &self.variants { - if variant.0.get(&*self.tag.id).is_some() { - return Err(NoMatchWithPath::new(MatchError::PropertyMatchesUnionTag( - self.tag.id.clone(), - name.clone(), - ))); - } - variant.validate(manifest)?; - } - Ok(()) - } - async fn update( - &self, - ctx: &RpcContext, - manifest: &Manifest, - config_overrides: &BTreeMap, - value: &mut Value, - ) -> Result<(), ConfigurationError> { - if let Value::Object(o) = value { - match o.get(&*self.tag.id) { - None => Err(ConfigurationError::NoMatch(NoMatchWithPath::new( - MatchError::MissingTag(self.tag.id.clone()), - ))), - Some(Value::String(tag)) => match self.variants.get(&**tag) { - None => Err(ConfigurationError::NoMatch(NoMatchWithPath::new( - MatchError::Union(tag.clone(), self.variants.keys().cloned().collect()), - ))), - Some(spec) => spec.update(ctx, manifest, config_overrides, o).await, - }, - Some(other) => Err(ConfigurationError::NoMatch( - NoMatchWithPath::new(MatchError::InvalidType("string", other.type_of())) - .prepend(self.tag.id.clone()), - )), - } - } else { - Err(ConfigurationError::NoMatch(NoMatchWithPath::new( - MatchError::InvalidType("object", value.type_of()), - ))) - } - } - fn pointers(&self, value: &Value) -> Result, NoMatchWithPath> { - if let Value::Object(o) = value { - match o.get(&*self.tag.id) { - None => Err(NoMatchWithPath::new(MatchError::MissingTag( - self.tag.id.clone(), - ))), - Some(Value::String(tag)) => match self.variants.get(&**tag) { - None => Err(NoMatchWithPath::new(MatchError::Union( - tag.clone(), - self.variants.keys().cloned().collect(), - ))), - Some(spec) => spec.pointers(o), - }, - Some(other) => Err(NoMatchWithPath::new(MatchError::InvalidType( - "string", - other.type_of(), - )) - .prepend(self.tag.id.clone())), - } - } else { - Err(NoMatchWithPath::new(MatchError::InvalidType( - "object", - value.type_of(), - ))) - } - } - fn requires(&self, id: &PackageId, value: &Value) -> bool { - if let Value::Object(o) = value { - match o.get(&*self.tag.id) { - Some(Value::String(tag)) => match self.variants.get(&**tag) { - None => false, - Some(spec) => spec.requires(id, o), - }, - _ => false, - } - } else { - false - } - } - fn eq(&self, lhs: &Value, rhs: &Value) -> bool { - match (lhs, rhs) { - (Value::Object(lhs), Value::Object(rhs)) => self.unique_by.eq(lhs, rhs), - _ => false, - } - } -} -impl DefaultableWith for ValueSpecUnion { - type DefaultSpec = Arc; - type Error = ConfigurationError; - - fn gen_with( - &self, - spec: &Self::DefaultSpec, - rng: &mut R, - timeout: &Option, - ) -> Result { - let variant = if let Some(v) = self.variants.get(&**spec) { - v - } else { - return Err(ConfigurationError::NoMatch(NoMatchWithPath::new( - MatchError::Union(spec.clone(), self.variants.keys().cloned().collect()), - ))); - }; - let cfg_res = variant.gen(rng, timeout)?; - - let mut tagged_cfg = Config::new(); - tagged_cfg.insert(self.tag.id.clone(), Value::String(spec.clone())); - tagged_cfg.extend(cfg_res.into_iter()); - - Ok(Value::Object(tagged_cfg)) - } -} - -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] -#[serde(tag = "subtype")] -#[serde(rename_all = "kebab-case")] -pub enum ValueSpecPointer { - Package(PackagePointerSpec), - System(SystemPointerSpec), -} -impl fmt::Display for ValueSpecPointer { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - ValueSpecPointer::Package(p) => write!(f, "{}", p), - ValueSpecPointer::System(p) => write!(f, "{}", p), - } - } -} -impl Defaultable for ValueSpecPointer { - type Error = ConfigurationError; - fn gen( - &self, - _rng: &mut R, - _timeout: &Option, - ) -> Result { - Ok(Value::Null) - } -} -#[async_trait] -impl ValueSpec for ValueSpecPointer { - fn matches(&self, value: &Value) -> Result<(), NoMatchWithPath> { - match self { - ValueSpecPointer::Package(a) => a.matches(value), - ValueSpecPointer::System(a) => a.matches(value), - } - } - fn validate(&self, manifest: &Manifest) -> Result<(), NoMatchWithPath> { - match self { - ValueSpecPointer::Package(a) => a.validate(manifest), - ValueSpecPointer::System(a) => a.validate(manifest), - } - } - async fn update( - &self, - ctx: &RpcContext, - manifest: &Manifest, - config_overrides: &BTreeMap, - value: &mut Value, - ) -> Result<(), ConfigurationError> { - match self { - ValueSpecPointer::Package(a) => a.update(ctx, manifest, config_overrides, value).await, - ValueSpecPointer::System(a) => a.update(ctx, manifest, config_overrides, value).await, - } - } - fn pointers(&self, _value: &Value) -> Result, NoMatchWithPath> { - let mut pointers = BTreeSet::new(); - pointers.insert(self.clone()); - Ok(pointers) - } - fn requires(&self, id: &PackageId, value: &Value) -> bool { - match self { - ValueSpecPointer::Package(a) => a.requires(id, value), - ValueSpecPointer::System(a) => a.requires(id, value), - } - } - fn eq(&self, _lhs: &Value, _rhs: &Value) -> bool { - false - } -} - -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] -#[serde(tag = "target")] -#[serde(rename_all = "kebab-case")] -pub enum PackagePointerSpec { - TorKey(TorKeyPointer), - TorAddress(TorAddressPointer), - LanAddress(LanAddressPointer), - Config(ConfigPointer), -} -impl PackagePointerSpec { - pub fn package_id(&self) -> &PackageId { - match self { - PackagePointerSpec::TorKey(TorKeyPointer { package_id, .. }) => package_id, - PackagePointerSpec::TorAddress(TorAddressPointer { package_id, .. }) => package_id, - PackagePointerSpec::LanAddress(LanAddressPointer { package_id, .. }) => package_id, - PackagePointerSpec::Config(ConfigPointer { package_id, .. }) => package_id, - } - } - async fn deref( - &self, - ctx: &RpcContext, - manifest: &Manifest, - config_overrides: &BTreeMap, - ) -> Result { - match &self { - PackagePointerSpec::TorKey(key) => key.deref(&manifest.id, &ctx.secret_store).await, - PackagePointerSpec::TorAddress(tor) => tor.deref(ctx).await, - PackagePointerSpec::LanAddress(lan) => lan.deref(ctx).await, - PackagePointerSpec::Config(cfg) => cfg.deref(ctx, config_overrides).await, - } - } -} -impl fmt::Display for PackagePointerSpec { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self { - PackagePointerSpec::TorKey(key) => write!(f, "{}", key), - PackagePointerSpec::TorAddress(tor) => write!(f, "{}", tor), - PackagePointerSpec::LanAddress(lan) => write!(f, "{}", lan), - PackagePointerSpec::Config(cfg) => write!(f, "{}", cfg), - } - } -} -impl Defaultable for PackagePointerSpec { - type Error = ConfigurationError; - fn gen( - &self, - _rng: &mut R, - _timeout: &Option, - ) -> Result { - Ok(Value::Null) - } -} -#[async_trait] -impl ValueSpec for PackagePointerSpec { - fn matches(&self, _value: &Value) -> Result<(), NoMatchWithPath> { - Ok(()) - } - fn validate(&self, manifest: &Manifest) -> Result<(), NoMatchWithPath> { - if &manifest.id != self.package_id() - && !manifest.dependencies.0.contains_key(self.package_id()) - { - return Err(NoMatchWithPath::new(MatchError::InvalidPointer( - ValueSpecPointer::Package(self.clone()), - ))); - } - match self { - _ => Ok(()), - } - } - async fn update( - &self, - ctx: &RpcContext, - manifest: &Manifest, - config_overrides: &BTreeMap, - value: &mut Value, - ) -> Result<(), ConfigurationError> { - *value = self.deref(ctx, manifest, config_overrides).await?; - Ok(()) - } - fn pointers(&self, _value: &Value) -> Result, NoMatchWithPath> { - let mut pointers = BTreeSet::new(); - pointers.insert(ValueSpecPointer::Package(self.clone())); - Ok(pointers) - } - fn requires(&self, id: &PackageId, _value: &Value) -> bool { - self.package_id() == id - } - fn eq(&self, _lhs: &Value, _rhs: &Value) -> bool { - false - } -} - -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] -#[serde(rename_all = "kebab-case")] -pub struct TorAddressPointer { - pub package_id: PackageId, - interface: InterfaceId, -} -impl TorAddressPointer { - async fn deref(&self, ctx: &RpcContext) -> Result { - let addr = ctx - .db - .peek() - .await - .as_package_data() - .as_idx(&self.package_id) - .and_then(|pde| pde.as_installed()) - .and_then(|i| i.as_interface_addresses().as_idx(&self.interface)) - .and_then(|a| a.as_tor_address().de().transpose()) - .transpose() - .map_err(|e| ConfigurationError::SystemError(e))?; - Ok(addr.map(Arc::new).map(Value::String).unwrap_or(Value::Null)) - } -} -impl fmt::Display for TorAddressPointer { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - TorAddressPointer { - package_id, - interface, - } => write!(f, "{}: tor-address: {}", package_id, interface), - } - } -} - -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] -#[serde(rename_all = "kebab-case")] -pub struct LanAddressPointer { - pub package_id: PackageId, - interface: InterfaceId, -} -impl fmt::Display for LanAddressPointer { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let LanAddressPointer { - package_id, - interface, - } = self; - write!(f, "{}: lan-address: {}", package_id, interface) - } -} -impl LanAddressPointer { - async fn deref(&self, ctx: &RpcContext) -> Result { - let addr = ctx - .db - .peek() - .await - .as_package_data() - .as_idx(&self.package_id) - .and_then(|pde| pde.as_installed()) - .and_then(|i| i.as_interface_addresses().as_idx(&self.interface)) - .and_then(|a| a.as_lan_address().de().transpose()) - .transpose() - .map_err(|e| ConfigurationError::SystemError(e))?; - Ok(addr - .to_owned() - .map(Arc::new) - .map(Value::String) - .unwrap_or(Value::Null)) - } -} - -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] -#[serde(rename_all = "kebab-case")] -pub struct ConfigPointer { - package_id: PackageId, - selector: Arc, - multi: bool, -} -impl ConfigPointer { - pub fn select(&self, val: &Value) -> Value { - self.selector.select(self.multi, val) - } - async fn deref( - &self, - ctx: &RpcContext, - config_overrides: &BTreeMap, - ) -> Result { - if let Some(cfg) = config_overrides.get(&self.package_id) { - Ok(self.select(&Value::Object(cfg.clone()))) - } else { - let id = &self.package_id; - let version = ctx - .db - .peek() - .await - .as_package_data() - .as_idx(id) - .and_then(|pde| pde.as_installed()) - .map(|i| i.as_manifest().as_version().de()) - .transpose() - .map_err(ConfigurationError::SystemError)?; - if let Some(version) = version { - let cfg_res = ctx - .services - .get(&id) - .await - .as_ref() - .or_not_found(lazy_format!("Manager for {id}@{version}")) - .map_err(|e| ConfigurationError::SystemError(e))? - .get_config() - .await - .map_err(ConfigurationError::SystemError)?; - if let Some(cfg) = cfg_res.config { - Ok(self.select(&Value::Object(cfg))) - } else { - Ok(Value::Null) - } - } else { - Ok(Value::Null) - } - } - } -} -impl fmt::Display for ConfigPointer { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let ConfigPointer { - package_id, - selector, - .. - } = self; - write!(f, "{}: config: {}", package_id, selector) - } -} - -#[derive(Clone, Debug)] -pub struct ConfigSelector { - src: String, - compiled: CompiledJsonPath, -} -impl ConfigSelector { - fn select(&self, multi: bool, val: &Value) -> Value { - let selected = self.compiled.select(&val).ok().unwrap_or_else(Vector::new); - if multi { - Value::Array(selected.into_iter().cloned().collect()) - } else { - selected.get(0).map(|v| (*v).clone()).unwrap_or(Value::Null) - } - } -} -impl fmt::Display for ConfigSelector { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", self.src) - } -} -impl Serialize for ConfigSelector { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - serializer.serialize_str(&self.src) - } -} -impl<'de> Deserialize<'de> for ConfigSelector { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - let src: String = Deserialize::deserialize(deserializer)?; - let compiled = CompiledJsonPath::compile(&src).map_err(serde::de::Error::custom)?; - Ok(Self { src, compiled }) - } -} -impl PartialEq for ConfigSelector { - fn eq(&self, other: &ConfigSelector) -> bool { - self.src == other.src - } -} -impl Eq for ConfigSelector {} -impl PartialOrd for ConfigSelector { - fn partial_cmp(&self, other: &Self) -> Option { - self.src.partial_cmp(&other.src) - } -} -impl Ord for ConfigSelector { - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - self.src.cmp(&other.src) - } -} -impl Hash for ConfigSelector { - fn hash(&self, state: &mut H) { - self.src.hash(state) - } -} - -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] -#[serde(rename_all = "kebab-case")] -pub struct TorKeyPointer { - package_id: PackageId, - interface: InterfaceId, -} -impl TorKeyPointer { - async fn deref( - &self, - source_package: &PackageId, - secrets: &PgPool, - ) -> Result { - if &self.package_id != source_package { - return Err(ConfigurationError::PermissionDenied( - ValueSpecPointer::Package(PackagePointerSpec::TorKey(self.clone())), - )); - } - let key = Key::for_interface( - secrets - .acquire() - .await - .map_err(|e| ConfigurationError::SystemError(e.into()))? - .as_mut(), - Some((self.package_id.clone(), self.interface.clone())), - ) - .await - .map_err(ConfigurationError::SystemError)?; - Ok(Value::String(Arc::new(base32::encode( - base32::Alphabet::RFC4648 { padding: false }, - &key.tor_key().as_bytes(), - )))) - } -} -impl fmt::Display for TorKeyPointer { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}: tor-key: {}", self.package_id, self.interface) - } -} - -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] -#[serde(rename_all = "kebab-case")] -#[serde(tag = "target")] -pub enum SystemPointerSpec {} -impl fmt::Display for SystemPointerSpec { - fn fmt(&self, _f: &mut fmt::Formatter) -> fmt::Result { - // write!(f, "SYSTEM: {}", match *self {}) - Ok(()) - } -} -impl SystemPointerSpec { - async fn deref(&self, _ctx: &RpcContext) -> Result { - #[allow(unreachable_code)] - Ok(match *self {}) - } -} -impl Defaultable for SystemPointerSpec { - type Error = ConfigurationError; - fn gen( - &self, - _rng: &mut R, - _timeout: &Option, - ) -> Result { - Ok(Value::Null) - } -} -#[async_trait] -impl ValueSpec for SystemPointerSpec { - fn matches(&self, _value: &Value) -> Result<(), NoMatchWithPath> { - Ok(()) - } - fn validate(&self, _manifest: &Manifest) -> Result<(), NoMatchWithPath> { - Ok(()) - } - async fn update( - &self, - ctx: &RpcContext, - _manifest: &Manifest, - _config_overrides: &BTreeMap, - value: &mut Value, - ) -> Result<(), ConfigurationError> { - *value = self.deref(ctx).await?; - Ok(()) - } - fn pointers(&self, _value: &Value) -> Result, NoMatchWithPath> { - let mut pointers = BTreeSet::new(); - pointers.insert(ValueSpecPointer::System(self.clone())); - #[allow(unreachable_code)] - Ok(pointers) - } - fn requires(&self, _id: &PackageId, _value: &Value) -> bool { - false - } - fn eq(&self, _lhs: &Value, _rhs: &Value) -> bool { - false - } -} - -#[test] -fn invalid_regex_produces_error() { - assert!( - serde_yaml::from_reader::<_, ConfigSpec>(std::io::Cursor::new(include_bytes!( - "../../test/config-spec/lnd-invalid-regex.yaml" - ))) - .is_err() - ) -} - -#[test] -fn missing_pattern_description_produces_error() { - assert!( - serde_yaml::from_reader::<_, ConfigSpec>(std::io::Cursor::new(include_bytes!( - "../../test/config-spec/lnd-missing-pattern-description.yaml" - ))) - .is_err() - ) -} - -#[test] -fn missing_pattern_produces_error() { - assert!( - serde_yaml::from_reader::<_, ConfigSpec>(std::io::Cursor::new(include_bytes!( - "../../test/config-spec/lnd-missing-pattern.yaml" - ))) - .is_err() - ) -} - -#[test] -fn regex_control() { - let spec = serde_yaml::from_reader::<_, ConfigSpec>(std::io::Cursor::new(include_bytes!( - "../../test/config-spec/lnd-correct.yaml" - ))) - .unwrap(); - println!("{}", serde_json::to_string_pretty(&spec).unwrap()); -} diff --git a/core/startos/src/context/rpc.rs b/core/startos/src/context/rpc.rs index df2747089..905132071 100644 --- a/core/startos/src/context/rpc.rs +++ b/core/startos/src/context/rpc.rs @@ -116,15 +116,27 @@ impl RpcContext { let devices = lshw().await?; let ram = get_mem_info().await?.total.0 as u64 * 1024 * 1024; - if !db.peek().await.as_server_info().as_ntp_synced().de()? { + if !db + .peek() + .await + .as_public() + .as_server_info() + .as_ntp_synced() + .de()? + { let db = db.clone(); tokio::spawn(async move { while !check_time_is_synchronized().await.unwrap() { tokio::time::sleep(Duration::from_secs(30)).await; } - db.mutate(|v| v.as_server_info_mut().as_ntp_synced_mut().ser(&true)) - .await - .unwrap() + db.mutate(|v| { + v.as_public_mut() + .as_server_info_mut() + .as_ntp_synced_mut() + .ser(&true) + }) + .await + .unwrap() }); } @@ -208,12 +220,15 @@ impl RpcContext { self.db .mutate(|f| { let mut current_dependents = f + .as_public_mut() .as_package_data() .keys()? .into_iter() .map(|k| (k.clone(), BTreeMap::new())) .collect::>(); - for (package_id, package) in f.as_package_data_mut().as_entries_mut()? { + for (package_id, package) in + f.as_public_mut().as_package_data_mut().as_entries_mut()? + { for (k, v) in package .as_installed_mut() .into_iter() @@ -228,6 +243,7 @@ impl RpcContext { } for (package_id, current_dependents) in current_dependents { if let Some(deps) = f + .as_public_mut() .as_package_data_mut() .as_idx_mut(&package_id) .and_then(|pde| pde.expect_as_installed_mut().ok()) @@ -235,6 +251,7 @@ impl RpcContext { { deps.ser(&CurrentDependents(current_dependents))?; } else if let Some(deps) = f + .as_public_mut() .as_package_data_mut() .as_idx_mut(&package_id) .and_then(|pde| pde.expect_as_removing_mut().ok()) @@ -252,7 +269,7 @@ impl RpcContext { let mut all_dependency_config_errs = BTreeMap::new(); let peek = self.db.peek().await; - for (package_id, package) in peek.as_package_data().as_entries()?.into_iter() { + for (package_id, package) in peek.as_public().as_package_data().as_entries()?.into_iter() { let package = package.clone(); if let Some(current_dependencies) = package .as_installed() @@ -276,6 +293,7 @@ impl RpcContext { .mutate(|v| { for (package_id, errs) in all_dependency_config_errs { if let Some(config_errors) = v + .as_public_mut() .as_package_data_mut() .as_idx_mut(&package_id) .and_then(|pde| pde.as_installed_mut()) diff --git a/core/startos/src/db/mod.rs b/core/startos/src/db/mod.rs index 77b2dfef2..bf09c0ff2 100644 --- a/core/startos/src/db/mod.rs +++ b/core/startos/src/db/mod.rs @@ -11,7 +11,7 @@ use clap::Parser; use futures::{FutureExt, StreamExt}; use http::header::COOKIE; use http::HeaderMap; -use patch_db::json_ptr::JsonPointer; +use patch_db::json_ptr::{JsonPointer, ROOT}; use patch_db::{Dump, Revision}; use rpc_toolkit::yajrc::RpcError; use rpc_toolkit::{command, from_fn_async, CallRemote, HandlerExt, ParentHandler}; @@ -25,13 +25,17 @@ use crate::middleware::auth::{HasValidSession, HashSessionToken}; use crate::prelude::*; use crate::util::serde::{apply_expr, HandlerExtSerde}; +lazy_static::lazy_static! { + static ref PUBLIC: JsonPointer = "/public".parse().unwrap(); +} + #[instrument(skip_all)] async fn ws_handler( ctx: RpcContext, session: Option<(HasValidSession, HashSessionToken)>, mut stream: WebSocket, ) -> Result<(), Error> { - let (dump, sub) = ctx.db.dump_and_sub().await; + let (dump, sub) = ctx.db.dump_and_sub(PUBLIC.clone()).await; if let Some((session, token)) = session { let kill = subscribe_to_session_kill(&ctx, token).await; @@ -181,7 +185,7 @@ pub enum RevisionsRes { #[instrument(skip_all)] async fn cli_dump(ctx: CliContext, DumpParams { path }: DumpParams) -> Result { let dump = if let Some(path) = path { - PatchDb::open(path).await?.dump().await + PatchDb::open(path).await?.dump(&ROOT).await } else { from_value::(ctx.call_remote("db.dump", imbl_value::json!({})).await?)? }; @@ -201,7 +205,7 @@ pub struct DumpParams { // display(display_serializable) // )] pub async fn dump(ctx: RpcContext, _: DumpParams) -> Result { - Ok(ctx.db.dump().await) + Ok(ctx.db.dump(&*PUBLIC).await) } #[instrument(skip_all)] diff --git a/core/startos/src/db/model.rs b/core/startos/src/db/model.rs index 2f4d33ffa..571573a54 100644 --- a/core/startos/src/db/model.rs +++ b/core/startos/src/db/model.rs @@ -7,7 +7,7 @@ use imbl_value::InternedString; use ipnet::{Ipv4Net, Ipv6Net}; use isocountry::CountryCode; use itertools::Itertools; -use models::{DataUrl, HealthCheckId, InterfaceId, PackageId}; +use models::{DataUrl, HealthCheckId, HostId, PackageId}; use openssl::hash::MessageDigest; use patch_db::json_ptr::JsonPointer; use patch_db::{HasModel, Value}; @@ -16,7 +16,6 @@ use serde::{Deserialize, Serialize}; use ssh_key::public::Ed25519PublicKey; use crate::account::AccountInfo; -use crate::config::spec::PackagePointerSpec; use crate::net::utils::{get_iface_ipv4_addr, get_iface_ipv6_addr}; use crate::prelude::*; use crate::progress::FullProgress; @@ -30,72 +29,85 @@ use crate::{ARCH, PLATFORM}; #[derive(Debug, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] #[model = "Model"] -// #[macro_debug] pub struct Database { - pub server_info: ServerInfo, - pub package_data: AllPackageData, - pub ui: Value, + pub public: Public, + pub private: (), // TODO } impl Database { pub fn init(account: &AccountInfo) -> Self { let lan_address = account.hostname.lan_address().parse().unwrap(); Database { - server_info: ServerInfo { - arch: get_arch(), - platform: get_platform(), - id: account.server_id.clone(), - version: Current::new().semver().into(), - hostname: account.hostname.no_dot_host_name(), - last_backup: None, - last_wifi_region: None, - eos_version_compat: Current::new().compat().clone(), - lan_address, - tor_address: format!("https://{}", account.key.tor_address()) - .parse() - .unwrap(), - ip_info: BTreeMap::new(), - status_info: ServerStatus { - backup_progress: None, - updated: false, - update_progress: None, - shutting_down: false, - restarting: false, - }, - wifi: WifiInfo { - ssids: Vec::new(), - connected: None, - selected: None, - }, - unread_notification_count: 0, - connection_addresses: ConnectionAddresses { - tor: Vec::new(), - clearnet: Vec::new(), - }, - password_hash: account.password.clone(), - pubkey: ssh_key::PublicKey::from(Ed25519PublicKey::from(&account.key.ssh_key())) + public: Public { + server_info: ServerInfo { + arch: get_arch(), + platform: get_platform(), + id: account.server_id.clone(), + version: Current::new().semver().into(), + hostname: account.hostname.no_dot_host_name(), + last_backup: None, + last_wifi_region: None, + eos_version_compat: Current::new().compat().clone(), + lan_address, + tor_address: format!("https://{}", account.key.tor_address()) + .parse() + .unwrap(), + ip_info: BTreeMap::new(), + status_info: ServerStatus { + backup_progress: None, + updated: false, + update_progress: None, + shutting_down: false, + restarting: false, + }, + wifi: WifiInfo { + ssids: Vec::new(), + connected: None, + selected: None, + }, + unread_notification_count: 0, + connection_addresses: ConnectionAddresses { + tor: Vec::new(), + clearnet: Vec::new(), + }, + password_hash: account.password.clone(), + pubkey: ssh_key::PublicKey::from(Ed25519PublicKey::from( + &account.key.ssh_key(), + )) .to_openssh() .unwrap(), - ca_fingerprint: account - .root_ca_cert - .digest(MessageDigest::sha256()) - .unwrap() - .iter() - .map(|x| format!("{x:X}")) - .join(":"), - ntp_synced: false, - zram: true, - governor: None, + ca_fingerprint: account + .root_ca_cert + .digest(MessageDigest::sha256()) + .unwrap() + .iter() + .map(|x| format!("{x:X}")) + .join(":"), + ntp_synced: false, + zram: true, + governor: None, + }, + package_data: AllPackageData::default(), + ui: serde_json::from_str(include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../web/patchdb-ui-seed.json" + ))) + .unwrap(), }, - package_data: AllPackageData::default(), - ui: serde_json::from_str(include_str!(concat!( - env!("CARGO_MANIFEST_DIR"), - "/../../web/patchdb-ui-seed.json" - ))) - .unwrap(), + private: (), // TODO } } } +#[derive(Debug, Deserialize, Serialize, HasModel)] +#[serde(rename_all = "kebab-case")] +#[model = "Model"] +// #[macro_debug] +pub struct Public { + pub server_info: ServerInfo, + pub package_data: AllPackageData, + pub ui: Value, +} + pub type DatabaseModel = Model; fn get_arch() -> InternedString { @@ -532,14 +544,13 @@ pub struct StaticDependencyInfo { #[model = "Model"] pub struct CurrentDependencyInfo { #[serde(default)] - pub pointers: BTreeSet, pub health_checks: BTreeSet, } #[derive(Debug, Default, Deserialize, Serialize)] -pub struct InterfaceAddressMap(pub BTreeMap); +pub struct InterfaceAddressMap(pub BTreeMap); impl Map for InterfaceAddressMap { - type Key = InterfaceId; + type Key = HostId; type Value = InterfaceAddresses; } diff --git a/core/startos/src/db/prelude.rs b/core/startos/src/db/prelude.rs index 15e511d53..14f5e21eb 100644 --- a/core/startos/src/db/prelude.rs +++ b/core/startos/src/db/prelude.rs @@ -3,6 +3,7 @@ use std::marker::PhantomData; use std::panic::UnwindSafe; pub use imbl_value::Value; +use patch_db::json_ptr::ROOT; use patch_db::value::InternedString; pub use patch_db::{HasModel, PatchDb}; use serde::de::DeserializeOwned; @@ -42,7 +43,7 @@ pub trait PatchDbExt { #[async_trait::async_trait] impl PatchDbExt for PatchDb { async fn peek(&self) -> DatabaseModel { - DatabaseModel::from(self.dump().await.value) + DatabaseModel::from(self.dump(&ROOT).await.value) } async fn mutate( &self, diff --git a/core/startos/src/dependencies.rs b/core/startos/src/dependencies.rs index d6b297e13..6ebe7afed 100644 --- a/core/startos/src/dependencies.rs +++ b/core/startos/src/dependencies.rs @@ -8,7 +8,6 @@ use rpc_toolkit::{command, from_fn_async, Empty, HandlerExt, ParentHandler}; use serde::{Deserialize, Serialize}; use tracing::instrument; -use crate::config::spec::PackagePointerSpec; use crate::config::{Config, ConfigSpec, ConfigureContext}; use crate::context::{CliContext, RpcContext}; use crate::db::model::{CurrentDependencies, Database}; @@ -66,19 +65,11 @@ pub struct ConfigureParams { dependency_id: PackageId, } pub fn configure() -> ParentHandler { - ParentHandler::new() - .root_handler( - from_fn_async(configure_impl) - .with_inherited(|params, _| params) - .no_cli(), - ) - .subcommand( - "dry", - from_fn_async(configure_dry) - .with_inherited(|params, _| params) - .with_display_serializable() - .with_remote_cli::(), - ) + ParentHandler::new().root_handler( + from_fn_async(configure_impl) + .with_inherited(|params, _| params) + .no_cli(), + ) } pub async fn configure_impl( @@ -89,8 +80,6 @@ pub async fn configure_impl( dependency_id, }: ConfigureParams, ) -> Result<(), Error> { - let breakages = BTreeMap::new(); - let overrides = Default::default(); let ConfigDryRes { old_config: _, new_config, @@ -98,11 +87,8 @@ pub async fn configure_impl( } = configure_logic(ctx.clone(), (dependent_id, dependency_id.clone())).await?; let configure_context = ConfigureContext { - breakages, timeout: Some(Duration::from_secs(3).into()), config: Some(new_config), - dry_run: false, - overrides, }; ctx.services .get(&dependency_id) @@ -127,19 +113,6 @@ pub struct ConfigDryRes { pub spec: ConfigSpec, } -// #[command(rename = "dry", display(display_serializable))] -#[instrument(skip_all)] -pub async fn configure_dry( - ctx: RpcContext, - _: Empty, - ConfigureParams { - dependent_id, - dependency_id, - }: ConfigureParams, -) -> Result { - configure_logic(ctx, (dependent_id, dependency_id)).await -} - pub async fn configure_logic( ctx: RpcContext, (dependent_id, dependency_id): (PackageId, PackageId), @@ -226,6 +199,7 @@ pub fn add_dependent_to_current_dependents_lists( ) -> Result<(), Error> { for (dependency, dep_info) in ¤t_dependencies.0 { if let Some(dependency_dependents) = db + .as_public_mut() .as_package_data_mut() .as_idx_mut(dependency) .and_then(|pde| pde.as_installed_mut()) @@ -237,46 +211,6 @@ pub fn add_dependent_to_current_dependents_lists( Ok(()) } -pub fn set_dependents_with_live_pointers_to_needs_config( - db: &mut Peeked, - id: &PackageId, -) -> Result, Error> { - let mut res = Vec::new(); - for (dep, info) in db - .as_package_data() - .as_idx(id) - .or_not_found(id)? - .as_installed() - .or_not_found(id)? - .as_current_dependents() - .de()? - .0 - { - if info.pointers.iter().any(|ptr| match ptr { - // dependency id matches the package being uninstalled - PackagePointerSpec::TorAddress(ptr) => &ptr.package_id == id && &dep != id, - PackagePointerSpec::LanAddress(ptr) => &ptr.package_id == id && &dep != id, - // we never need to retarget these - PackagePointerSpec::TorKey(_) => false, - PackagePointerSpec::Config(_) => false, - }) { - let installed = db - .as_package_data_mut() - .as_idx_mut(&dep) - .or_not_found(&dep)? - .as_installed_mut() - .or_not_found(&dep)?; - let version = installed.as_manifest().as_version().de()?; - let configured = installed.as_status_mut().as_configured_mut(); - if configured.de()? { - configured.ser(&false)?; - res.push((dep, version)); - } - } - } - Ok(res) -} - #[instrument(skip_all)] pub async fn compute_dependency_config_errs( ctx: &RpcContext, diff --git a/core/startos/src/init.rs b/core/startos/src/init.rs index dfc13e068..fab80ab09 100644 --- a/core/startos/src/init.rs +++ b/core/startos/src/init.rs @@ -218,7 +218,7 @@ pub async fn init(cfg: &ServerConfig) -> Result { let db = cfg.db(&account).await?; tracing::info!("Opened PatchDB"); let peek = db.peek().await; - let mut server_info = peek.as_server_info().de()?; + let mut server_info = peek.as_public().as_server_info().de()?; // write to ca cert store tokio::fs::write( @@ -343,7 +343,7 @@ pub async fn init(cfg: &ServerConfig) -> Result { }; db.mutate(|v| { - v.as_server_info_mut().ser(&server_info)?; + v.as_public_mut().as_server_info_mut().ser(&server_info)?; Ok(()) }) .await?; diff --git a/core/startos/src/install/mod.rs b/core/startos/src/install/mod.rs index 110443162..ac00a750b 100644 --- a/core/startos/src/install/mod.rs +++ b/core/startos/src/install/mod.rs @@ -41,7 +41,7 @@ pub const PKG_WASM_DIR: &str = "package-data/wasm"; // #[command(display(display_serializable))] pub async fn list(ctx: RpcContext) -> Result { - Ok(ctx.db.peek().await.as_package_data().as_entries()? + Ok(ctx.db.peek().await.as_public().as_package_data().as_entries()? .iter() .filter_map(|(id, pde)| { let status = match pde.as_match() { @@ -185,7 +185,13 @@ pub async fn sideload(ctx: RpcContext) -> Result { let (err_send, err_recv) = oneshot::channel(); let progress = RequestGuid::new(); let db = ctx.db.clone(); - let mut sub = db.subscribe().await; + let mut sub = db + .subscribe( + "/package-data/{id}/install-progress" + .parse::() + .with_kind(ErrorKind::Database)?, + ) + .await; ctx.add_continuation( progress.clone(), RpcContinuation::ws( @@ -199,17 +205,15 @@ pub async fn sideload(ctx: RpcContext) -> Result { ErrorKind::Cancelled, ) })?; - let progress_path = - JsonPointer::parse(format!("/package-data/{id}/install-progress")) - .with_kind(ErrorKind::Database)?; tokio::select! { res = async { while let Some(rev) = sub.recv().await { - if rev.patch.affects_path(&progress_path) { + if !rev.patch.0.is_empty() { // TODO: don't send empty patches? ws.send(Message::Text( serde_json::to_string(&if let Some(p) = db .peek() .await + .as_public() .as_package_data() .as_idx(&id) .and_then(|e| e.as_install_progress()) @@ -230,16 +234,18 @@ pub async fn sideload(ctx: RpcContext) -> Result { } => res?, err = err_recv => { if let Ok(e) = err { - ws.send(Message::Text( - serde_json::to_string(&Err::<(), _>(e)) - .with_kind(ErrorKind::Serialization)?, - )) - .await - .with_kind(ErrorKind::Network)?; + ws.send(Message::Text( + serde_json::to_string(&Err::<(), _>(e)) + .with_kind(ErrorKind::Serialization)?, + )) + .await + .with_kind(ErrorKind::Network)?; } } } + ws.close().await.with_kind(ErrorKind::Network)?; + Ok::<_, Error>(()) } .await @@ -250,7 +256,7 @@ pub async fn sideload(ctx: RpcContext) -> Result { } .boxed() }), - Duration::from_secs(30), + Duration::from_secs(600), ), ) .await; @@ -405,26 +411,31 @@ pub async fn uninstall( ) -> Result { ctx.db .mutate(|db| { - let (manifest, static_files, installed) = - match db.as_package_data().as_idx(&id).or_not_found(&id)?.de()? { - PackageDataEntry::Installed(PackageDataEntryInstalled { - manifest, - static_files, - installed, - }) => (manifest, static_files, installed), - _ => { - return Err(Error::new( - eyre!("Package is not installed."), - crate::ErrorKind::NotFound, - )); - } - }; + let (manifest, static_files, installed) = match db + .as_public() + .as_package_data() + .as_idx(&id) + .or_not_found(&id)? + .de()? + { + PackageDataEntry::Installed(PackageDataEntryInstalled { + manifest, + static_files, + installed, + }) => (manifest, static_files, installed), + _ => { + return Err(Error::new( + eyre!("Package is not installed."), + crate::ErrorKind::NotFound, + )); + } + }; let pde = PackageDataEntry::Removing(PackageDataEntryRemoving { manifest, static_files, removing: installed, }); - db.as_package_data_mut().insert(&id, &pde) + db.as_public_mut().as_package_data_mut().insert(&id, &pde) }) .await?; diff --git a/core/startos/src/net/dhcp.rs b/core/startos/src/net/dhcp.rs index 1c9d65d24..a8dbcabb0 100644 --- a/core/startos/src/net/dhcp.rs +++ b/core/startos/src/net/dhcp.rs @@ -75,7 +75,8 @@ pub async fn update( let ip_info = IpInfo::for_interface(&interface).await?; ctx.db .mutate(|db| { - db.as_server_info_mut() + db.as_public_mut() + .as_server_info_mut() .as_ip_info_mut() .insert(&interface, &ip_info) }) diff --git a/core/startos/src/net/dns.rs b/core/startos/src/net/dns.rs index 7b2784a50..9eb5d3750 100644 --- a/core/startos/src/net/dns.rs +++ b/core/startos/src/net/dns.rs @@ -163,13 +163,13 @@ impl DnsController { Command::new("resolvectl") .arg("dns") - .arg("br-start9") + .arg("lxcbr0") .arg("127.0.0.1") .invoke(ErrorKind::Network) .await?; Command::new("resolvectl") .arg("domain") - .arg("br-start9") + .arg("lxcbr0") .arg("embassy") .invoke(ErrorKind::Network) .await?; diff --git a/core/startos/src/net/host/mod.rs b/core/startos/src/net/host/mod.rs new file mode 100644 index 000000000..b2b991698 --- /dev/null +++ b/core/startos/src/net/host/mod.rs @@ -0,0 +1,29 @@ +use imbl_value::InternedString; +use serde::{Deserialize, Serialize}; + +use crate::net::host::multi::MultiHost; + +pub mod multi; + +pub enum Host { + Multi(MultiHost), + // Single(SingleHost), + // Static(StaticHost), +} + +#[derive(Deserialize, Serialize)] +pub struct BindOptions { + scheme: InternedString, + preferred_external_port: u16, + add_ssl: Option, + secure: bool, + ssl: bool, +} + +#[derive(Deserialize, Serialize)] +pub struct AddSslOptions { + scheme: InternedString, + preferred_external_port: u16, + #[serde(default)] + add_x_forwarded_headers: bool, +} diff --git a/core/startos/src/net/host/multi.rs b/core/startos/src/net/host/multi.rs new file mode 100644 index 000000000..511619201 --- /dev/null +++ b/core/startos/src/net/host/multi.rs @@ -0,0 +1,13 @@ +use std::collections::BTreeMap; + +use imbl_value::InternedString; +use serde::{Deserialize, Serialize}; + +use crate::net::host::BindOptions; +use crate::net::keys::Key; + +pub struct MultiHost { + id: InternedString, + key: Key, + binds: BTreeMap, +} diff --git a/core/startos/src/net/interface.rs b/core/startos/src/net/interface.rs deleted file mode 100644 index f1fa1e406..000000000 --- a/core/startos/src/net/interface.rs +++ /dev/null @@ -1,122 +0,0 @@ -use std::collections::BTreeMap; - -use indexmap::IndexSet; -pub use models::InterfaceId; -use models::PackageId; -use serde::{Deserialize, Deserializer, Serialize}; -use sqlx::{Executor, Postgres}; -use tracing::instrument; - -use crate::db::model::{InterfaceAddressMap, InterfaceAddresses}; -use crate::net::keys::Key; -use crate::util::serde::Port; -use crate::{Error, ResultExt}; - -#[derive(Clone, Debug, Deserialize, Serialize)] -#[serde(rename_all = "kebab-case")] -pub struct Interfaces(pub BTreeMap); // TODO -impl Interfaces { - #[instrument(skip_all)] - pub fn validate(&self) -> Result<(), Error> { - for (_, interface) in &self.0 { - interface.validate().with_ctx(|_| { - ( - crate::ErrorKind::ValidateS9pk, - format!("Interface {}", interface.name), - ) - })?; - } - Ok(()) - } - #[instrument(skip_all)] - pub async fn install( - &self, - secrets: &mut Ex, - package_id: &PackageId, - ) -> Result - where - for<'a> &'a mut Ex: Executor<'a, Database = Postgres>, - { - let mut interface_addresses = InterfaceAddressMap(BTreeMap::new()); - for (id, iface) in &self.0 { - let mut addrs = InterfaceAddresses { - tor_address: None, - lan_address: None, - }; - if iface.tor_config.is_some() || iface.lan_config.is_some() { - let key = - Key::for_interface(secrets, Some((package_id.clone(), id.clone()))).await?; - if iface.tor_config.is_some() { - addrs.tor_address = Some(key.tor_address().to_string()); - } - if iface.lan_config.is_some() { - addrs.lan_address = Some(key.local_address()); - } - } - interface_addresses.0.insert(id.clone(), addrs); - } - Ok(interface_addresses) - } -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -#[serde(rename_all = "kebab-case")] -pub struct Interface { - pub name: String, - pub description: String, - pub tor_config: Option, - pub lan_config: Option>, - pub ui: bool, - pub protocols: IndexSet, -} -impl Interface { - #[instrument(skip_all)] - pub fn validate(&self) -> Result<(), color_eyre::eyre::Report> { - if self.tor_config.is_some() && !self.protocols.contains("tcp") { - color_eyre::eyre::bail!("must support tcp to set up a tor hidden service"); - } - if self.lan_config.is_some() && !self.protocols.contains("http") { - color_eyre::eyre::bail!("must support http to set up a lan service"); - } - if self.ui && !(self.protocols.contains("http") || self.protocols.contains("https")) { - color_eyre::eyre::bail!("must support http or https to serve a ui"); - } - Ok(()) - } -} - -#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] -#[serde(rename_all = "kebab-case")] -pub struct TorConfig { - pub port_mapping: BTreeMap, -} - -#[derive(Clone, Debug, Serialize)] -#[serde(rename_all = "kebab-case")] -pub struct LanPortConfig { - pub ssl: bool, - pub internal: u16, -} -impl<'de> Deserialize<'de> for LanPortConfig { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - #[derive(Deserialize)] - #[serde(rename_all = "kebab-case")] - struct PermissiveLanPortConfig { - ssl: bool, - internal: Option, - mapping: Option, - } - - let config = PermissiveLanPortConfig::deserialize(deserializer)?; - Ok(LanPortConfig { - ssl: config.ssl, - internal: config - .internal - .or(config.mapping) - .ok_or_else(|| serde::de::Error::missing_field("internal"))?, - }) - } -} diff --git a/core/startos/src/net/keys.rs b/core/startos/src/net/keys.rs index 4816fd98a..1079d4a98 100644 --- a/core/startos/src/net/keys.rs +++ b/core/startos/src/net/keys.rs @@ -1,6 +1,6 @@ use clap::Parser; use color_eyre::eyre::eyre; -use models::{Id, InterfaceId, PackageId}; +use models::{HostId, Id, PackageId}; use openssl::pkey::{PKey, Private}; use openssl::sha::Sha256; use openssl::x509::X509; @@ -22,13 +22,13 @@ use crate::util::crypto::ed25519_expand_key; // TODO: delete once we may change tor addresses async fn compat( secrets: impl PgExecutor<'_>, - interface: &Option<(PackageId, InterfaceId)>, + host: &Option<(PackageId, HostId)>, ) -> Result, Error> { - if let Some((package, interface)) = interface { + if let Some((package, host)) = host { if let Some(r) = sqlx::query!( "SELECT key FROM tor WHERE package = $1 AND interface = $2", package, - interface + host ) .fetch_optional(secrets) .await? @@ -60,19 +60,19 @@ async fn compat( #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct Key { - interface: Option<(PackageId, InterfaceId)>, + host: Option<(PackageId, HostId)>, base: [u8; 32], tor_key: [u8; 64], // Does NOT necessarily match base } impl Key { - pub fn interface(&self) -> Option<(PackageId, InterfaceId)> { - self.interface.clone() + pub fn host(&self) -> Option<(PackageId, HostId)> { + self.host.clone() } pub fn as_bytes(&self) -> [u8; 32] { self.base } pub fn internal_address(&self) -> String { - self.interface + self.host .as_ref() .map(|(pkg_id, _)| format!("{}.embassy", pkg_id)) .unwrap_or_else(|| "embassy".to_owned()) @@ -111,21 +111,21 @@ impl Key { Ed25519PrivateKey::from_bytes(&self.base) } pub(crate) fn from_pair( - interface: Option<(PackageId, InterfaceId)>, + host: Option<(PackageId, HostId)>, bytes: [u8; 32], tor_key: [u8; 64], ) -> Self { Self { - interface, + host, tor_key, base: bytes, } } - pub fn from_bytes(interface: Option<(PackageId, InterfaceId)>, bytes: [u8; 32]) -> Self { - Self::from_pair(interface, bytes, ed25519_expand_key(&bytes)) + pub fn from_bytes(host: Option<(PackageId, HostId)>, bytes: [u8; 32]) -> Self { + Self::from_pair(host, bytes, ed25519_expand_key(&bytes)) } - pub fn new(interface: Option<(PackageId, InterfaceId)>) -> Self { - Self::from_bytes(interface, rand::random()) + pub fn new(host: Option<(PackageId, HostId)>) -> Self { + Self::from_bytes(host, rand::random()) } pub(super) fn with_certs(self, certs: CertPair, int: X509, root: X509) -> KeyInfo { KeyInfo { @@ -163,10 +163,7 @@ impl Key { .await? .into_iter() .map(|row| { - let interface = Some(( - package.clone(), - InterfaceId::from(Id::try_from(row.interface)?), - )); + let host = Some((package.clone(), HostId::from(Id::try_from(row.interface)?))); let bytes = row.key.try_into().map_err(|e: Vec| { Error::new( eyre!("Invalid length for network key {} expected 32", e.len()), @@ -175,7 +172,7 @@ impl Key { })?; Ok(match row.tor_key { Some(tor_key) => Key::from_pair( - interface, + host, bytes, tor_key.try_into().map_err(|e: Vec| { Error::new( @@ -184,20 +181,20 @@ impl Key { ) })?, ), - None => Key::from_bytes(interface, bytes), + None => Key::from_bytes(host, bytes), }) }) .collect() } - pub async fn for_interface( + pub async fn for_host( secrets: &mut Ex, - interface: Option<(PackageId, InterfaceId)>, + host: Option<(PackageId, HostId)>, ) -> Result where for<'a> &'a mut Ex: PgExecutor<'a>, { let tentative = rand::random::<[u8; 32]>(); - let actual = if let Some((pkg, iface)) = &interface { + let actual = if let Some((pkg, iface)) = &host { let k = tentative.as_slice(); let actual = sqlx::query!( "INSERT INTO network_keys (package, interface, key) VALUES ($1, $2, $3) ON CONFLICT (package, interface) DO UPDATE SET package = EXCLUDED.package RETURNING key", @@ -229,8 +226,8 @@ impl Key { })?); bytes }; - let mut res = Self::from_bytes(interface, actual); - if let Some(tor_key) = compat(secrets, &res.interface).await? { + let mut res = Self::from_bytes(host, actual); + if let Some(tor_key) = compat(secrets, &res.host).await? { res.tor_key = tor_key; } Ok(res) @@ -288,43 +285,43 @@ pub fn display_requires_reboot(_: RotateKeysParams, args: RequiresReboot) { #[command(rename_all = "kebab-case")] pub struct RotateKeysParams { package: Option, - interface: Option, + host: Option, } // #[command(display(display_requires_reboot))] pub async fn rotate_key( ctx: RpcContext, - RotateKeysParams { package, interface }: RotateKeysParams, + RotateKeysParams { package, host }: RotateKeysParams, ) -> Result { let mut pgcon = ctx.secret_store.acquire().await?; let mut tx = pgcon.begin().await?; if let Some(package) = package { - let Some(interface) = interface else { + let Some(host) = host else { return Err(Error::new( - eyre!("Must specify interface"), + eyre!("Must specify host"), ErrorKind::InvalidRequest, )); }; sqlx::query!( "DELETE FROM tor WHERE package = $1 AND interface = $2", &package, - &interface, + &host, ) .execute(&mut *tx) .await?; sqlx::query!( "DELETE FROM network_keys WHERE package = $1 AND interface = $2", &package, - &interface, + &host, ) .execute(&mut *tx) .await?; - let new_key = - Key::for_interface(&mut *tx, Some((package.clone(), interface.clone()))).await?; + let new_key = Key::for_host(&mut *tx, Some((package.clone(), host.clone()))).await?; let needs_config = ctx .db .mutate(|v| { let installed = v + .as_public_mut() .as_package_data_mut() .as_idx_mut(&package) .or_not_found(&package)? @@ -332,8 +329,8 @@ pub async fn rotate_key( .or_not_found("installed")?; let addrs = installed .as_interface_addresses_mut() - .as_idx_mut(&interface) - .or_not_found(&interface)?; + .as_idx_mut(&host) + .or_not_found(&host)?; if let Some(lan) = addrs.as_lan_address_mut().transpose_mut() { lan.ser(&new_key.local_address())?; } @@ -380,10 +377,15 @@ pub async fn rotate_key( sqlx::query!("UPDATE account SET tor_key = NULL, network_key = gen_random_bytes(32)") .execute(&mut *tx) .await?; - let new_key = Key::for_interface(&mut *tx, None).await?; + let new_key = Key::for_host(&mut *tx, None).await?; let url = format!("https://{}", new_key.tor_address()).parse()?; ctx.db - .mutate(|v| v.as_server_info_mut().as_tor_address_mut().ser(&url)) + .mutate(|v| { + v.as_public_mut() + .as_server_info_mut() + .as_tor_address_mut() + .ser(&url) + }) .await?; tx.commit().await?; Ok(RequiresReboot(true)) diff --git a/core/startos/src/net/mod.rs b/core/startos/src/net/mod.rs index 25d7a9647..a0a2ed166 100644 --- a/core/startos/src/net/mod.rs +++ b/core/startos/src/net/mod.rs @@ -4,7 +4,7 @@ use crate::context::CliContext; pub mod dhcp; pub mod dns; -pub mod interface; +pub mod host; pub mod keys; pub mod mdns; pub mod net_controller; diff --git a/core/startos/src/net/net_controller.rs b/core/startos/src/net/net_controller.rs index 38aa079af..9b9145531 100644 --- a/core/startos/src/net/net_controller.rs +++ b/core/startos/src/net/net_controller.rs @@ -3,7 +3,7 @@ use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use std::sync::{Arc, Weak}; use color_eyre::eyre::eyre; -use models::{InterfaceId, PackageId}; +use models::{HostId, PackageId}; use sqlx::PgExecutor; use tracing::instrument; @@ -20,7 +20,7 @@ use crate::{Error, HOST_IP}; pub struct NetController { pub(super) tor: TorController, pub(super) vhost: VHostController, - // pub(super) dns: DnsController, + pub(super) dns: DnsController, pub(super) ssl: Arc, pub(super) os_bindings: Vec>, } @@ -39,7 +39,7 @@ impl NetController { let mut res = Self { tor: TorController::new(tor_control, tor_socks), vhost: VHostController::new(ssl.clone()), - // dns: DnsController::init(dns_bind).await?, + dns: DnsController::init(dns_bind).await?, ssl, os_bindings: Vec::new(), }; @@ -60,8 +60,8 @@ impl NetController { alpn.clone(), ) .await?; - // self.os_bindings - // .push(self.dns.add(None, HOST_IP.into()).await?); + self.os_bindings + .push(self.dns.add(None, HOST_IP.into()).await?); // LAN IP self.os_bindings.push( @@ -147,13 +147,13 @@ impl NetController { package: PackageId, ip: Ipv4Addr, ) -> Result { - // let dns = self.dns.add(Some(package.clone()), ip).await?; + let dns = self.dns.add(Some(package.clone()), ip).await?; Ok(NetService { shutdown: false, id: package, ip, - // dns, + dns, controller: Arc::downgrade(self), tor: BTreeMap::new(), lan: BTreeMap::new(), @@ -212,10 +212,10 @@ pub struct NetService { shutdown: bool, id: PackageId, ip: Ipv4Addr, - // dns: Arc<()>, + dns: Arc<()>, controller: Weak, - tor: BTreeMap<(InterfaceId, u16), (Key, Vec>)>, - lan: BTreeMap<(InterfaceId, u16), (Key, Vec>)>, + tor: BTreeMap<(HostId, u16), (Key, Vec>)>, + lan: BTreeMap<(HostId, u16), (Key, Vec>)>, } impl NetService { fn net_controller(&self) -> Result, Error> { @@ -229,14 +229,14 @@ impl NetService { pub async fn add_tor( &mut self, secrets: &mut Ex, - id: InterfaceId, + id: HostId, external: u16, internal: u16, ) -> Result<(), Error> where for<'a> &'a mut Ex: PgExecutor<'a>, { - let key = Key::for_interface(secrets, Some((self.id.clone(), id.clone()))).await?; + let key = Key::for_host(secrets, Some((self.id.clone(), id.clone()))).await?; let ctrl = self.net_controller()?; let tor_idx = (id, external); let mut tor = self @@ -251,7 +251,7 @@ impl NetService { self.tor.insert(tor_idx, tor); Ok(()) } - pub async fn remove_tor(&mut self, id: InterfaceId, external: u16) -> Result<(), Error> { + pub async fn remove_tor(&mut self, id: HostId, external: u16) -> Result<(), Error> { let ctrl = self.net_controller()?; if let Some((key, rcs)) = self.tor.remove(&(id, external)) { ctrl.remove_tor(&key, external, rcs).await?; @@ -261,7 +261,7 @@ impl NetService { pub async fn add_lan( &mut self, secrets: &mut Ex, - id: InterfaceId, + id: HostId, external: u16, internal: u16, connect_ssl: Result<(), AlpnInfo>, @@ -269,7 +269,7 @@ impl NetService { where for<'a> &'a mut Ex: PgExecutor<'a>, { - let key = Key::for_interface(secrets, Some((self.id.clone(), id.clone()))).await?; + let key = Key::for_host(secrets, Some((self.id.clone(), id.clone()))).await?; let ctrl = self.net_controller()?; let lan_idx = (id, external); let mut lan = self @@ -289,7 +289,7 @@ impl NetService { self.lan.insert(lan_idx, lan); Ok(()) } - pub async fn remove_lan(&mut self, id: InterfaceId, external: u16) -> Result<(), Error> { + pub async fn remove_lan(&mut self, id: HostId, external: u16) -> Result<(), Error> { let ctrl = self.net_controller()?; if let Some((key, rcs)) = self.lan.remove(&(id, external)) { ctrl.remove_lan(&key, external, rcs).await?; @@ -299,13 +299,13 @@ impl NetService { pub async fn export_cert( &self, secrets: &mut Ex, - id: &InterfaceId, + id: &HostId, ip: IpAddr, ) -> Result<(), Error> where for<'a> &'a mut Ex: PgExecutor<'a>, { - let key = Key::for_interface(secrets, Some((self.id.clone(), id.clone()))).await?; + let key = Key::for_host(secrets, Some((self.id.clone(), id.clone()))).await?; let ctrl = self.net_controller()?; let cert = ctrl.ssl.with_certs(key, ip).await?; let cert_dir = cert_dir(&self.id, id); @@ -332,8 +332,8 @@ impl NetService { for ((_, external), (key, rcs)) in std::mem::take(&mut self.tor) { errors.handle(ctrl.remove_tor(&key, external, rcs).await); } - // std::mem::take(&mut self.dns); - // errors.handle(ctrl.dns.gc(Some(self.id.clone()), self.ip).await); + std::mem::take(&mut self.dns); + errors.handle(ctrl.dns.gc(Some(self.id.clone()), self.ip).await); errors.into_result() } else { tracing::warn!("NetService dropped after NetController is shutdown"); @@ -355,7 +355,7 @@ impl Drop for NetService { shutdown: true, id: Default::default(), ip: Ipv4Addr::new(0, 0, 0, 0), - // dns: Default::default(), + dns: Default::default(), controller: Default::default(), tor: Default::default(), lan: Default::default(), diff --git a/core/startos/src/net/ssl.rs b/core/startos/src/net/ssl.rs index a3a6a24c9..f9502c86b 100644 --- a/core/startos/src/net/ssl.rs +++ b/core/startos/src/net/ssl.rs @@ -336,7 +336,7 @@ pub struct SANInfo { impl SANInfo { pub fn new(key: &Key, hostname: &Hostname, ips: BTreeSet) -> Self { let mut dns = BTreeSet::new(); - if let Some((id, _)) = key.interface() { + if let Some((id, _)) = key.host() { dns.insert(MaybeWildcard::WithWildcard(format!("{id}.embassy"))); dns.insert(MaybeWildcard::WithWildcard(key.local_address().to_string())); } else { diff --git a/core/startos/src/net/wifi.rs b/core/startos/src/net/wifi.rs index be1c49fdc..5a86ad720 100644 --- a/core/startos/src/net/wifi.rs +++ b/core/startos/src/net/wifi.rs @@ -682,7 +682,8 @@ impl WpaCli { pub async fn save_config(&mut self, db: PatchDb) -> Result<(), Error> { let new_country = self.get_country_low().await?; db.mutate(|d| { - d.as_server_info_mut() + d.as_public_mut() + .as_server_info_mut() .as_last_wifi_region_mut() .ser(&new_country) }) diff --git a/core/startos/src/notifications.rs b/core/startos/src/notifications.rs index aa0b0b963..f16eab176 100644 --- a/core/startos/src/notifications.rs +++ b/core/startos/src/notifications.rs @@ -102,7 +102,8 @@ pub async fn list( ctx.db .mutate(|d| { - d.as_server_info_mut() + d.as_public_mut() + .as_server_info_mut() .as_unread_notification_count_mut() .ser(&0) }) @@ -308,7 +309,11 @@ impl NotificationManager { { return Ok(()); } - let mut count = peek.as_server_info().as_unread_notification_count().de()?; + let mut count = peek + .as_public() + .as_server_info() + .as_unread_notification_count() + .de()?; let sql_package_id = package_id.as_ref().map(|p| &**p); let sql_code = T::CODE; let sql_level = format!("{}", level); @@ -325,7 +330,8 @@ impl NotificationManager { ).execute(&self.sqlite).await?; count += 1; db.mutate(|db| { - db.as_server_info_mut() + db.as_public_mut() + .as_server_info_mut() .as_unread_notification_count_mut() .ser(&count) }) diff --git a/core/startos/src/service/config.rs b/core/startos/src/service/config.rs index c64e2be65..06dc8bd55 100644 --- a/core/startos/src/service/config.rs +++ b/core/startos/src/service/config.rs @@ -1,6 +1,6 @@ use std::collections::BTreeMap; -use models::PackageId; +use models::{ActionId, PackageId, ProcedureName}; use crate::config::ConfigureContext; use crate::prelude::*; @@ -9,14 +9,13 @@ use crate::service::Service; impl Service { pub async fn configure( &self, - ConfigureContext { - breakages, - timeout, - config, - overrides, - dry_run, - }: ConfigureContext, - ) -> Result, Error> { - todo!() + ConfigureContext { timeout, config }: ConfigureContext, + ) -> Result<(), Error> { + let container = &self.seed.persistent_container; + container + .execute::(ProcedureName::SetConfig, to_value(&config)?, timeout) + .await + .with_kind(ErrorKind::Action)?; + Ok(()) } } diff --git a/core/startos/src/service/mod.rs b/core/startos/src/service/mod.rs index fd8412c02..b572caa89 100644 --- a/core/startos/src/service/mod.rs +++ b/core/startos/src/service/mod.rs @@ -7,7 +7,7 @@ use futures::future::BoxFuture; use imbl::OrdMap; use models::{ActionId, HealthCheckId, PackageId, ProcedureName}; use persistent_container::PersistentContainer; -use rpc_toolkit::{from_fn_async, CallRemoteHandler, Handler, HandlerArgs}; +use rpc_toolkit::{from_fn_async, CallRemoteHandler, Empty, Handler, HandlerArgs}; use serde::{Deserialize, Serialize}; use start_stop::StartStop; use tokio::sync::{watch, Notify}; @@ -128,6 +128,7 @@ impl Service { .db .peek() .await + .into_public() .into_package_data() .into_idx(id) .map(|pde| pde.into_match()) @@ -151,7 +152,7 @@ impl Service { } // TODO: delete s9pk? ctx.db - .mutate(|v| v.as_package_data_mut().remove(id)) + .mutate(|v| v.as_public_mut().as_package_data_mut().remove(id)) .await?; Ok(None) } @@ -188,7 +189,8 @@ impl Service { .mutate({ let manifest = s9pk.as_manifest().clone(); |db| { - db.as_package_data_mut() + db.as_public_mut() + .as_package_data_mut() .as_idx_mut(&manifest.id) .or_not_found(&manifest.id)? .ser(&PackageDataEntry::Installed(PackageDataEntryInstalled { @@ -229,7 +231,7 @@ impl Service { } ctx.db - .mutate(|v| v.as_package_data_mut().remove(id)) + .mutate(|v| v.as_public_mut().as_package_data_mut().remove(id)) .await?; Ok(None) @@ -274,7 +276,8 @@ impl Service { } ctx.db .mutate(|d| { - d.as_package_data_mut() + d.as_public_mut() + .as_package_data_mut() .as_idx_mut(&manifest.id) .or_not_found(&manifest.id)? .ser(&PackageDataEntry::Installed(PackageDataEntryInstalled { @@ -346,6 +349,11 @@ impl Service { .await; if let Some((hdl, shutdown)) = self.seed.persistent_container.rpc_server.send_replace(None) { + self.seed + .persistent_container + .rpc_client + .request(rpc::Exit, Empty {}) + .await?; shutdown.shutdown(); hdl.await.with_kind(ErrorKind::Cancelled)?; } @@ -367,6 +375,12 @@ impl Service { .persistent_container .execute(ProcedureName::Uninit, to_value(&target_version)?, None) // TODO timeout .await?; + let id = self.seed.persistent_container.s9pk.as_manifest().id.clone(); + self.seed + .ctx + .db + .mutate(|d| d.as_public_mut().as_package_data_mut().remove(&id)) + .await?; self.shutdown().await } pub async fn backup(&self, guard: impl GenericMountGuard) -> Result { @@ -416,6 +430,7 @@ impl Actor for ServiceActor { .db .mutate(|d| { if let Some(i) = d + .as_public_mut() .as_package_data_mut() .as_idx_mut(&id) .and_then(|p| p.as_installed_mut()) diff --git a/core/startos/src/service/persistent_container.rs b/core/startos/src/service/persistent_container.rs index 6716ed472..eee353a07 100644 --- a/core/startos/src/service/persistent_container.rs +++ b/core/startos/src/service/persistent_container.rs @@ -46,7 +46,7 @@ struct ProcedureId(u64); pub struct PersistentContainer { pub(super) s9pk: S9pk, pub(super) lxc_container: OnceCell, - rpc_client: UnixRpcClient, + pub(super) rpc_client: UnixRpcClient, pub(super) rpc_server: watch::Sender, ShutdownHandle)>>, // procedures: Mutex>, js_mount: MountGuard, @@ -239,8 +239,8 @@ impl PersistentContainer { let lxc_container = self.lxc_container.take(); async move { let mut errs = ErrorCollection::new(); - errs.handle(dbg!(rpc_client.request(rpc::Exit, Empty {}).await)); if let Some((hdl, shutdown)) = rpc_server { + errs.handle(rpc_client.request(rpc::Exit, Empty {}).await); shutdown.shutdown(); errs.handle(hdl.await.with_kind(ErrorKind::Cancelled)); } diff --git a/core/startos/src/service/service_effect_handler.rs b/core/startos/src/service/service_effect_handler.rs index d5a4561f7..8fae3908a 100644 --- a/core/startos/src/service/service_effect_handler.rs +++ b/core/startos/src/service/service_effect_handler.rs @@ -12,6 +12,7 @@ use patch_db::json_ptr::JsonPointer; use rpc_toolkit::{from_fn, from_fn_async, AnyContext, Context, Empty, HandlerExt, ParentHandler}; use tokio::process::Command; +use crate::db::model::ExposedUI; use crate::disk::mount::filesystem::idmapped::IdMapped; use crate::disk::mount::filesystem::loop_dev::LoopDev; use crate::disk::mount::filesystem::overlayfs::OverlayGuard; @@ -23,8 +24,7 @@ use crate::service::ServiceActorSeed; use crate::status::health_check::HealthCheckResult; use crate::status::MainStatus; use crate::util::clap::FromStrParser; -use crate::util::new_guid; -use crate::{db::model::ExposedUI, util::Invoke}; +use crate::util::{new_guid, Invoke}; use crate::{echo, ARCH}; #[derive(Clone)] @@ -120,6 +120,10 @@ pub fn service_effect_handler() -> ParentHandler { from_fn_async(get_ssl_certificate).no_cli(), ) .subcommand("getSslKey", from_fn_async(get_ssl_key).no_cli()) + .subcommand( + "getServiceInterface", + from_fn_async(get_service_interface).no_cli(), + ) // TODO @DrBonez when we get the new api for 4.0 // .subcommand("setDependencies",from_fn(set_dependencies)) // .subcommand("embassyGetInterface",from_fn(embassy_get_interface)) @@ -144,6 +148,43 @@ pub fn service_effect_handler() -> ParentHandler { // .subcommand("reverseProxy",from_fn(reverse_pro)xy) // TODO Callbacks } +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, Parser)] +#[serde(rename_all = "camelCase")] +struct GetServiceInterfaceParams { + package_id: Option, + service_interface_id: String, + callback: String, +} +async fn get_service_interface( + _: AnyContext, + GetServiceInterfaceParams { + callback, + package_id, + service_interface_id, + }: GetServiceInterfaceParams, +) -> Result { + // TODO @Dr_Bonez + Ok(json!({ + "id": service_interface_id, + "name": service_interface_id, + "description": "This is a fake", + "hasPrimary": false, + "disabled": false, + "addressInfo": json!({ + "username": Value::Null, + "hostId": "HostId?", + "options": json!({ + "scheme": Value::Null, + "preferredExternalPort": 80, + "addSsl":Value::Null, + "secure": false, + "ssl": false + }), + "suffix": "http" + }), + "type": "ui" + })) +} #[derive(Debug, Clone, serde::Serialize, serde::Deserialize, Parser)] #[serde(rename_all = "camelCase")] @@ -255,6 +296,7 @@ async fn get_store( let peeked = context.ctx.db.peek().await; let package_id = package_id.unwrap_or(context.id.clone()); let value = peeked + .as_public() .as_package_data() .as_idx(&package_id) .or_not_found(&package_id)? @@ -286,6 +328,7 @@ async fn set_store( .db .mutate(|db| { let model = db + .as_public_mut() .as_package_data_mut() .as_idx_mut(&package_id) .or_not_found(&package_id)? @@ -317,7 +360,8 @@ async fn expose_for_dependents( .ctx .db .mutate(|db| { - db.as_package_data_mut() + db.as_public_mut() + .as_package_data_mut() .as_idx_mut(&package_id) .or_not_found(&package_id)? .as_installed_mut() @@ -344,7 +388,8 @@ async fn expose_ui( .ctx .db .mutate(|db| { - db.as_package_data_mut() + db.as_public_mut() + .as_package_data_mut() .as_idx_mut(&package_id) .or_not_found(&package_id)? .as_installed_mut() @@ -369,7 +414,11 @@ struct ParamsMaybePackageId { async fn exists(context: EffectContext, params: ParamsPackageId) -> Result { let context = context.deref()?; let peeked = context.ctx.db.peek().await; - let package = peeked.as_package_data().as_idx(¶ms.package).is_some(); + let package = peeked + .as_public() + .as_package_data() + .as_idx(¶ms.package) + .is_some(); Ok(json!(package)) } @@ -408,6 +457,7 @@ async fn get_configured(context: EffectContext, _: Empty) -> Result Result let peeked = context.ctx.db.peek().await; let package_id = params.package_id.unwrap_or_else(|| context.id.clone()); let package = peeked + .as_public() .as_package_data() .as_idx(&package_id) .or_not_found(&package_id)? @@ -439,6 +490,7 @@ async fn running(context: EffectContext, params: ParamsMaybePackageId) -> Result let peeked = context.ctx.db.peek().await; let package_id = params.package_id.unwrap_or_else(|| context.id.clone()); let package = peeked + .as_public() .as_package_data() .as_idx(&package_id) .or_not_found(&package_id)? @@ -489,7 +541,8 @@ async fn set_configured(context: EffectContext, params: SetConfigured) -> Result .ctx .db .mutate(|db| { - db.as_package_data_mut() + db.as_public_mut() + .as_package_data_mut() .as_idx_mut(package_id) .or_not_found(package_id)? .as_installed_mut() @@ -578,6 +631,7 @@ async fn set_health(context: EffectContext, params: SetHealth) -> Result Result return Ok(()), }; - db.as_package_data_mut() + db.as_public_mut() + .as_package_data_mut() .as_idx_mut(package_id) .or_not_found(package_id)? .as_installed_mut() diff --git a/core/startos/src/service/service_map.rs b/core/startos/src/service/service_map.rs index 1fddbb8d1..7ac555aff 100644 --- a/core/startos/src/service/service_map.rs +++ b/core/startos/src/service/service_map.rs @@ -61,7 +61,7 @@ impl ServiceMap { #[instrument(skip_all)] pub async fn init(&self, ctx: &RpcContext) -> Result<(), Error> { - for id in ctx.db.peek().await.as_package_data().keys()? { + for id in ctx.db.peek().await.as_public().as_package_data().keys()? { if let Err(e) = self.load(ctx, &id, LoadDisposition::Retry).await { tracing::error!("Error loading installed package as service: {e}"); tracing::debug!("{e:?}"); @@ -136,6 +136,7 @@ impl ServiceMap { let install_progress = progress.snapshot(); move |db| { let pde = match db + .as_public() .as_package_data() .as_idx(&id) .map(|x| x.de()) @@ -174,7 +175,9 @@ impl ServiceMap { )) } }; - db.as_package_data_mut().insert(&manifest.id, &pde) + db.as_public_mut() + .as_package_data_mut() + .insert(&manifest.id, &pde) } })) .await?; @@ -194,7 +197,8 @@ impl ServiceMap { NonDetachingJoinHandle::from(tokio::spawn(progress.sync_to_db( ctx.db.clone(), move |v| { - v.as_package_data_mut() + v.as_public_mut() + .as_package_data_mut() .as_idx_mut(&deref_id) .and_then(|e| e.as_install_progress_mut()) }, diff --git a/core/startos/src/setup.rs b/core/startos/src/setup.rs index 0f47874e9..9c8d54db3 100644 --- a/core/startos/src/setup.rs +++ b/core/startos/src/setup.rs @@ -84,7 +84,8 @@ async fn setup_init( account.set_password(&password)?; account.save(secrets_tx.as_mut()).await?; db.mutate(|m| { - m.as_server_info_mut() + m.as_public_mut() + .as_server_info_mut() .as_password_hash_mut() .ser(&account.password) }) @@ -310,11 +311,6 @@ pub async fn execute( tokio::task::spawn({ async move { let ctx = ctx.clone(); - let recovery_source = recovery_source; - - let embassy_password = embassy_password; - let recovery_source = recovery_source; - let recovery_password = recovery_password; match execute_inner( ctx.clone(), embassy_logicalname, diff --git a/core/startos/src/shutdown.rs b/core/startos/src/shutdown.rs index bd99bbbd1..f6a984897 100644 --- a/core/startos/src/shutdown.rs +++ b/core/startos/src/shutdown.rs @@ -78,7 +78,8 @@ impl Shutdown { pub async fn shutdown(ctx: RpcContext) -> Result<(), Error> { ctx.db .mutate(|db| { - db.as_server_info_mut() + db.as_public_mut() + .as_server_info_mut() .as_status_info_mut() .as_shutting_down_mut() .ser(&true) @@ -97,7 +98,8 @@ pub async fn shutdown(ctx: RpcContext) -> Result<(), Error> { pub async fn restart(ctx: RpcContext) -> Result<(), Error> { ctx.db .mutate(|db| { - db.as_server_info_mut() + db.as_public_mut() + .as_server_info_mut() .as_status_info_mut() .as_restarting_mut() .ser(&true) diff --git a/core/startos/src/system.rs b/core/startos/src/system.rs index 5a5509da7..2525491f6 100644 --- a/core/startos/src/system.rs +++ b/core/startos/src/system.rs @@ -83,7 +83,7 @@ pub struct ZramParams { pub async fn zram(ctx: RpcContext, ZramParams { enable }: ZramParams) -> Result<(), Error> { let db = ctx.db.peek().await; - let zram = db.as_server_info().as_zram().de()?; + let zram = db.as_public().as_server_info().as_zram().de()?; if enable == zram { return Ok(()); } @@ -100,7 +100,10 @@ pub async fn zram(ctx: RpcContext, ZramParams { enable }: ZramParams) -> Result< } ctx.db .mutate(|v| { - v.as_server_info_mut().as_zram_mut().ser(&enable)?; + v.as_public_mut() + .as_server_info_mut() + .as_zram_mut() + .ser(&enable)?; Ok(()) }) .await?; @@ -153,10 +156,22 @@ pub async fn governor( } set_governor(&set).await?; ctx.db - .mutate(|d| d.as_server_info_mut().as_governor_mut().ser(&Some(set))) + .mutate(|d| { + d.as_public_mut() + .as_server_info_mut() + .as_governor_mut() + .ser(&Some(set)) + }) .await?; } - let current = ctx.db.peek().await.as_server_info().as_governor().de()?; + let current = ctx + .db + .peek() + .await + .as_public() + .as_server_info() + .as_governor() + .de()?; Ok(GovernorInfo { current, available }) } diff --git a/core/startos/src/update/mod.rs b/core/startos/src/update/mod.rs index a1d9a8363..31693aba0 100644 --- a/core/startos/src/update/mod.rs +++ b/core/startos/src/update/mod.rs @@ -93,7 +93,7 @@ async fn maybe_do_update(ctx: RpcContext, marketplace_url: Url) -> Result { Some((msg, reply)) if shutdown_recv.try_recv() == Err(TryRecvError::Empty) => { let mut new_bg = BackgroundJobs::default(); tokio::select! { - res = msg.handle_with(&mut actor, &mut new_bg) => { reply.send(res); }, + res = msg.handle_with(&mut actor, &mut new_bg) => { let _ = reply.send(res); }, _ = &mut bg => (), } bg.jobs.append(&mut new_bg.jobs); @@ -129,7 +129,9 @@ impl SimpleActor { )))); } let (reply_send, reply_recv) = oneshot::channel(); - self.messenger.send((Box::new(message), reply_send)); + self.messenger + .send((Box::new(message), reply_send)) + .unwrap(); futures::future::Either::Right( reply_recv .map_err(|_| Error::new(eyre!("actor runtime has exited"), ErrorKind::Unknown)) @@ -159,11 +161,11 @@ impl SimpleActor { drop(self.messenger); let timeout = match strategy { PendingMessageStrategy::CancelAll => { - self.shutdown.send(()); + self.shutdown.send(()).unwrap(); Some(Duration::from_secs(0)) } PendingMessageStrategy::FinishCurrentCancelPending { timeout } => { - self.shutdown.send(()); + self.shutdown.send(()).unwrap(); timeout } PendingMessageStrategy::FinishAll { timeout } => timeout, diff --git a/core/startos/src/version/mod.rs b/core/startos/src/version/mod.rs index 3e4f7c4a2..a2ef069ac 100644 --- a/core/startos/src/version/mod.rs +++ b/core/startos/src/version/mod.rs @@ -70,8 +70,12 @@ where let semver = self.semver().into(); let compat = self.compat().clone(); db.mutate(|d| { - d.as_server_info_mut().as_version_mut().ser(&semver)?; - d.as_server_info_mut() + d.as_public_mut() + .as_server_info_mut() + .as_version_mut() + .ser(&semver)?; + d.as_public_mut() + .as_server_info_mut() .as_eos_version_compat_mut() .ser(&compat)?; Ok(()) @@ -166,7 +170,14 @@ where } pub async fn init(db: &PatchDb, secrets: &PgPool) -> Result<(), Error> { - let version = Version::from_util_version(db.peek().await.as_server_info().as_version().de()?); + let version = Version::from_util_version( + db.peek() + .await + .as_public() + .as_server_info() + .as_version() + .de()?, + ); match version { Version::V0_3_4(v) => v.0.migrate_to(&Current::new(), db.clone(), secrets).await?, diff --git a/core/startos/src/version/v0_3_4.rs b/core/startos/src/version/v0_3_4.rs index e33dcb931..52a0d6960 100644 --- a/core/startos/src/version/v0_3_4.rs +++ b/core/startos/src/version/v0_3_4.rs @@ -56,20 +56,23 @@ impl VersionT for Version { let mut account = AccountInfo::load(secrets).await?; let account = db .mutate(|d| { - d.as_server_info_mut().as_pubkey_mut().ser( + d.as_public_mut().as_server_info_mut().as_pubkey_mut().ser( &ssh_key::PublicKey::from(Ed25519PublicKey::from(&account.key.ssh_key())) .to_openssh()?, )?; - d.as_server_info_mut().as_ca_fingerprint_mut().ser( - &account - .root_ca_cert - .digest(MessageDigest::sha256()) - .unwrap() - .iter() - .map(|x| format!("{x:X}")) - .join(":"), - )?; - let server_info = d.as_server_info(); + d.as_public_mut() + .as_server_info_mut() + .as_ca_fingerprint_mut() + .ser( + &account + .root_ca_cert + .digest(MessageDigest::sha256()) + .unwrap() + .iter() + .map(|x| format!("{x:X}")) + .join(":"), + )?; + let server_info = d.as_public_mut().as_server_info(); account.hostname = server_info.as_hostname().de().map(Hostname)?; account.server_id = server_info.as_id().de()?; @@ -81,15 +84,16 @@ impl VersionT for Version { let parsed_url = Some(COMMUNITY_URL.parse().unwrap()); db.mutate(|d| { - let mut ui = d.as_ui().de()?; + let mut ui = d.as_public().as_ui().de()?; use imbl_value::json; ui["marketplace"]["known-hosts"][COMMUNITY_URL] = json!({}); ui["marketplace"]["known-hosts"][MAIN_REGISTRY] = json!({}); - for package_id in d.as_package_data().keys()? { + for package_id in d.as_public().as_package_data().keys()? { if !COMMUNITY_SERVICES.contains(&&*package_id.to_string()) { continue; } - d.as_package_data_mut() + d.as_public_mut() + .as_package_data_mut() .as_idx_mut(&package_id) .or_not_found(&package_id)? .as_installed_mut() @@ -100,19 +104,20 @@ impl VersionT for Version { ui["theme"] = json!("Dark".to_string()); ui["widgets"] = json!([]); - d.as_ui_mut().ser(&ui) + d.as_public_mut().as_ui_mut().ser(&ui) }) .await } async fn down(&self, db: PatchDb, _secrets: &PgPool) -> Result<(), Error> { db.mutate(|d| { - let mut ui = d.as_ui().de()?; + let mut ui = d.as_public().as_ui().de()?; let parsed_url = Some(MAIN_REGISTRY.parse().unwrap()); - for package_id in d.as_package_data().keys()? { + for package_id in d.as_public().as_package_data().keys()? { if !COMMUNITY_SERVICES.contains(&&*package_id.to_string()) { continue; } - d.as_package_data_mut() + d.as_public_mut() + .as_package_data_mut() .as_idx_mut(&package_id) .or_not_found(&package_id)? .as_installed_mut() @@ -128,7 +133,7 @@ impl VersionT for Version { ui["marketplace"]["known-hosts"][COMMUNITY_URL].take(); ui["marketplace"]["known-hosts"][MAIN_REGISTRY].take(); - d.as_ui_mut().ser(&ui) + d.as_public_mut().as_ui_mut().ser(&ui) }) .await } diff --git a/core/startos/src/version/v0_3_4_4.rs b/core/startos/src/version/v0_3_4_4.rs index b6345ca4c..686c00826 100644 --- a/core/startos/src/version/v0_3_4_4.rs +++ b/core/startos/src/version/v0_3_4_4.rs @@ -26,7 +26,7 @@ impl VersionT for Version { } async fn up(&self, db: PatchDb, _secrets: &PgPool) -> Result<(), Error> { db.mutate(|v| { - let tor_address_lens = v.as_server_info_mut().as_tor_address_mut(); + let tor_address_lens = v.as_public_mut().as_server_info_mut().as_tor_address_mut(); let mut tor_addr = tor_address_lens.de()?; tor_addr .set_scheme("https") diff --git a/core/startos/src/version/v0_3_5.rs b/core/startos/src/version/v0_3_5.rs index ba28cd468..485ec5f81 100644 --- a/core/startos/src/version/v0_3_5.rs +++ b/core/startos/src/version/v0_3_5.rs @@ -30,7 +30,7 @@ impl VersionT for Version { async fn up(&self, db: PatchDb, _secrets: &PgPool) -> Result<(), Error> { let peek = db.peek().await; let mut url_replacements = BTreeMap::new(); - for (_, pde) in peek.as_package_data().as_entries()? { + for (_, pde) in peek.as_public().as_package_data().as_entries()? { for (dependency, info) in pde .as_installed() .map(|i| i.as_dependency_info().as_entries()) @@ -63,7 +63,7 @@ impl VersionT for Version { } let prev_zram = db .mutate(|v| { - for (_, pde) in v.as_package_data_mut().as_entries_mut()? { + for (_, pde) in v.as_public_mut().as_package_data_mut().as_entries_mut()? { for (dependency, info) in pde .as_installed_mut() .map(|i| i.as_dependency_info_mut().as_entries_mut()) @@ -95,7 +95,10 @@ impl VersionT for Version { } } } - v.as_server_info_mut().as_zram_mut().replace(&true) + v.as_public_mut() + .as_server_info_mut() + .as_zram_mut() + .replace(&true) }) .await?; if !prev_zram { diff --git a/core/startos/src/volume.rs b/core/startos/src/volume.rs index 47d1ffc34..f8c46c71e 100644 --- a/core/startos/src/volume.rs +++ b/core/startos/src/volume.rs @@ -3,17 +3,15 @@ use std::ops::{Deref, DerefMut}; use std::path::{Path, PathBuf}; pub use helpers::script_dir; -use models::PackageId; pub use models::VolumeId; +use models::{HostId, PackageId}; use serde::{Deserialize, Serialize}; use tracing::instrument; use crate::context::RpcContext; -use crate::net::interface::{InterfaceId, Interfaces}; use crate::net::PACKAGE_CERT_PATH; use crate::prelude::*; use crate::util::Version; -use crate::{Error, ResultExt}; pub const PKG_VOLUME_DIR: &str = "package-data/volumes"; pub const BACKUP_DIR: &str = "/media/embassy/backups"; @@ -21,21 +19,6 @@ pub const BACKUP_DIR: &str = "/media/embassy/backups"; #[derive(Clone, Debug, Default, Deserialize, Serialize)] pub struct Volumes(BTreeMap); impl Volumes { - #[instrument(skip_all)] - pub fn validate(&self, interfaces: &Interfaces) -> Result<(), Error> { - for (id, volume) in &self.0 { - volume - .validate(interfaces) - .with_ctx(|_| (crate::ErrorKind::ValidateS9pk, format!("Volume {}", id)))?; - if let Volume::Backup { .. } = volume { - return Err(Error::new( - eyre!("Invalid volume type \"backup\""), - ErrorKind::ParseS9pk, - )); // Volume::Backup is for internal use and shouldn't be declared in manifest - } - } - Ok(()) - } #[instrument(skip_all)] pub async fn install( &self, @@ -112,8 +95,8 @@ pub fn backup_dir(pkg_id: &PackageId) -> PathBuf { Path::new(BACKUP_DIR).join(pkg_id).join("data") } -pub fn cert_dir(pkg_id: &PackageId, interface_id: &InterfaceId) -> PathBuf { - Path::new(PACKAGE_CERT_PATH).join(pkg_id).join(interface_id) +pub fn cert_dir(pkg_id: &PackageId, host_id: &HostId) -> PathBuf { + Path::new(PACKAGE_CERT_PATH).join(pkg_id).join(host_id) } #[derive(Clone, Debug, Deserialize, Serialize)] @@ -135,23 +118,11 @@ pub enum Volume { readonly: bool, }, #[serde(rename_all = "kebab-case")] - Certificate { interface_id: InterfaceId }, + Certificate { interface_id: HostId }, #[serde(rename_all = "kebab-case")] Backup { readonly: bool }, } impl Volume { - #[instrument(skip_all)] - pub fn validate(&self, interfaces: &Interfaces) -> Result<(), color_eyre::eyre::Report> { - match self { - Volume::Certificate { interface_id } => { - if !interfaces.0.contains_key(interface_id) { - color_eyre::eyre::bail!("unknown interface: {}", interface_id); - } - } - _ => (), - } - Ok(()) - } pub async fn install( &self, path: &PathBuf, diff --git a/patch-db b/patch-db index 7096f15e9..899c63afb 160000 --- a/patch-db +++ b/patch-db @@ -1 +1 @@ -Subproject commit 7096f15e9b218f59b8ded1fd1133c70b82de74c5 +Subproject commit 899c63afb5367c66bca6cafb98164d8cbd78f7e3 diff --git a/sdk/lib/interfaces/Host.ts b/sdk/lib/interfaces/Host.ts index e767bd18b..80368fe51 100644 --- a/sdk/lib/interfaces/Host.ts +++ b/sdk/lib/interfaces/Host.ts @@ -35,6 +35,11 @@ const knownProtocols = { ssl: false, defaultPort: 8333, }, + lightning: { + secure: true, + ssl: true, + defaultPort: 9735, + }, grpc: { secure: true, ssl: true, @@ -47,11 +52,11 @@ const knownProtocols = { }, } as const -type Scheme = string | null +export type Scheme = string | null type AddSslOptions = { - preferredExternalPort: number scheme: Scheme + preferredExternalPort: number addXForwardedHeaders?: boolean /** default: false */ } type Security = { secure: false; ssl: false } | { secure: true; ssl: boolean } @@ -73,7 +78,7 @@ type NotProtocolsWithSslVariants = Exclude< ProtocolsWithSslVariants > -type PortOptionsByKnownProtocol = +type BindOptionsByKnownProtocol = | ({ protocol: ProtocolsWithSslVariants preferredExternalPort?: number @@ -85,7 +90,7 @@ type PortOptionsByKnownProtocol = scheme?: Scheme addSsl?: AddSslOptions | null } -type PortOptionsByProtocol = PortOptionsByKnownProtocol | BindOptions +type BindOptionsByProtocol = BindOptionsByKnownProtocol | BindOptions export type HostKind = "static" | "single" | "multi" @@ -104,7 +109,7 @@ export class Host { async bindPort( internalPort: number, - options: PortOptionsByProtocol, + options: BindOptionsByProtocol, ): Promise> { if (hasStringProtocol(options)) { return await this.bindPortForKnown(options, internalPort) @@ -138,7 +143,7 @@ export class Host { } private async bindPortForKnown( - options: PortOptionsByKnownProtocol, + options: BindOptionsByKnownProtocol, internalPort: number, ) { const scheme = @@ -174,7 +179,7 @@ export class Host { } private getAddSsl( - options: PortOptionsByKnownProtocol, + options: BindOptionsByKnownProtocol, protoInfo: KnownProtocols[keyof KnownProtocols], ): AddSslOptions | null { if ("noAddSsl" in options && options.noAddSsl) return null diff --git a/sdk/lib/interfaces/Origin.ts b/sdk/lib/interfaces/Origin.ts index 053e76ae8..aaadbea50 100644 --- a/sdk/lib/interfaces/Origin.ts +++ b/sdk/lib/interfaces/Origin.ts @@ -1,5 +1,7 @@ import { AddressInfo } from "../types" -import { Host, BindOptions } from "./Host" +import { AddressReceipt } from "./AddressReceipt" +import { Host, BindOptions, Scheme } from "./Host" +import { ServiceInterfaceBuilder } from "./ServiceInterfaceBuilder" export class Origin { constructor( @@ -7,7 +9,7 @@ export class Origin { readonly options: BindOptions, ) {} - build({ username, path, search }: BuildOptions): AddressInfo { + build({ username, path, search, schemeOverride }: BuildOptions): AddressInfo { const qpEntries = Object.entries(search) .map( ([key, val]) => `${encodeURIComponent(key)}=${encodeURIComponent(val)}`, @@ -18,15 +20,77 @@ export class Origin { return { hostId: this.host.options.id, - options: this.options, + bindOptions: { + ...this.options, + scheme: schemeOverride ? schemeOverride.noSsl : this.options.scheme, + addSsl: this.options.addSsl + ? { + ...this.options.addSsl, + scheme: schemeOverride + ? schemeOverride.ssl + : this.options.addSsl.scheme, + } + : null, + }, suffix: `${path}${qp}`, username, } } + + /** + * A function to register a group of origins ( :// : ) with StartOS + * + * The returned addressReceipt serves as proof that the addresses were registered + * + * @param addressInfo + * @returns + */ + async export( + serviceInterfaces: ServiceInterfaceBuilder[], + ): Promise { + const addressesInfo = [] + for (let serviceInterface of serviceInterfaces) { + const { + name, + description, + hasPrimary, + disabled, + id, + type, + username, + path, + search, + schemeOverride, + masked, + } = serviceInterface.options + + const addressInfo = this.build({ + username, + path, + search, + schemeOverride, + }) + + await serviceInterface.options.effects.exportServiceInterface({ + id, + name, + description, + hasPrimary, + disabled, + addressInfo, + type, + masked, + }) + + addressesInfo.push(addressInfo) + } + + return addressesInfo as AddressInfo[] & AddressReceipt + } } type BuildOptions = { - scheme: string | null + schemeOverride: { ssl: Scheme; noSsl: Scheme } | null username: string | null path: string search: Record diff --git a/sdk/lib/interfaces/ServiceInterfaceBuilder.ts b/sdk/lib/interfaces/ServiceInterfaceBuilder.ts index 241cf52dc..c7b99b2d5 100644 --- a/sdk/lib/interfaces/ServiceInterfaceBuilder.ts +++ b/sdk/lib/interfaces/ServiceInterfaceBuilder.ts @@ -1,8 +1,6 @@ -import { AddressInfo, Effects } from "../types" +import { Effects } from "../types" import { ServiceInterfaceType } from "../util/utils" -import { AddressReceipt } from "./AddressReceipt" -import { Host } from "./Host" -import { Origin } from "./Origin" +import { Scheme } from "./Host" /** * A helper class for creating a Network Interface @@ -25,47 +23,11 @@ export class ServiceInterfaceBuilder { hasPrimary: boolean disabled: boolean type: ServiceInterfaceType - username: null | string + username: string | null path: string search: Record + schemeOverride: { ssl: Scheme; noSsl: Scheme } | null + masked: boolean }, ) {} - - /** - * A function to register a group of origins ( :// : ) with StartOS - * - * The returned addressReceipt serves as proof that the addresses were registered - * - * @param addressInfo - * @returns - */ - async export>( - origin: OriginForHost, - ): Promise { - const { - name, - description, - hasPrimary, - disabled, - id, - type, - username, - path, - search, - } = this.options - - const addressInfo = origin.build({ username, path, search, scheme: null }) - - await this.options.effects.exportServiceInterface({ - id, - name, - description, - hasPrimary, - disabled, - addressInfo, - type, - }) - - return addressInfo as AddressInfo & AddressReceipt - } } diff --git a/sdk/lib/test/host.test.ts b/sdk/lib/test/host.test.ts index 880a8f1a1..d891bd52c 100644 --- a/sdk/lib/test/host.test.ts +++ b/sdk/lib/test/host.test.ts @@ -19,9 +19,11 @@ describe("host", () => { username: "bar", path: "/baz", search: { qux: "yes" }, + schemeOverride: null, + masked: false, }) - await fooInterface.export([fooOrigin]) + await fooOrigin.export([fooInterface]) } }) }) diff --git a/sdk/lib/types.ts b/sdk/lib/types.ts index de03e34b2..e0bc4a259 100644 --- a/sdk/lib/types.ts +++ b/sdk/lib/types.ts @@ -1,7 +1,7 @@ export * as configTypes from "./config/configTypes" import { InputSpec } from "./config/configTypes" import { DependenciesReceipt } from "./config/setupConfig" -import { HostKind, BindOptions } from "./interfaces/Host" +import { BindOptions } from "./interfaces/Host" import { Daemons } from "./mainFn/Daemons" import { UrlString } from "./util/getServiceInterface" import { ServiceInterfaceType, Signals } from "./util/utils" @@ -10,7 +10,7 @@ export type ExportedAction = (options: { effects: Effects input?: Record }) => Promise -export type MaybePromise = A | Promise +export type MaybePromise = Promise | A export namespace ExpectedExports { version: 1 /** Set configuration is called after we have modified and saved the configuration in the start9 ui. Use this to make a file for the docker to read from for configuration. */ @@ -164,19 +164,21 @@ export type ActionMetadata = { group?: string } export declare const hostName: unique symbol +// asdflkjadsf.onion | 1.2.3.4 export type Hostname = string & { [hostName]: never } /** ${scheme}://${username}@${host}:${externalPort}${suffix} */ export type AddressInfo = { username: string | null hostId: string - options: BindOptions + bindOptions: BindOptions suffix: string } export type HostnameInfoIp = { kind: "ip" networkInterfaceId: string + public: boolean hostname: | { kind: "ipv4" | "ipv6" | "local" @@ -201,11 +203,13 @@ export type HostnameInfoOnion = { export type HostnameInfo = HostnameInfoIp | HostnameInfoOnion export type SingleHost = { + id: string kind: "single" | "static" hostname: HostnameInfo | null } export type MultiHost = { + id: string kind: "multi" hostnames: HostnameInfo[] } @@ -224,11 +228,18 @@ export type ServiceInterface = { hasPrimary: boolean /** Disabled interfaces do not serve, but they retain their metadata and addresses */ disabled: boolean + /** Whether or not to mask the URIs for this interface. Useful if the URIs contain sensitive information, such as a password, macaroon, or API key */ + masked: boolean /** URI Information */ addressInfo: AddressInfo /** The network interface could be several types, something like ui, p2p, or network */ type: ServiceInterfaceType } + +export type ServiceInterfaceWithHostInfo = ServiceInterface & { + hostInfo: HostInfo +} + // prettier-ignore export type ExposeAllServicePaths = Store extends Record ? {[K in keyof Store & string]: ExposeAllServicePaths}[keyof Store & string] : @@ -278,18 +289,18 @@ export type Effects = { } & BindOptions, ): Promise /** Retrieves the current hostname(s) associated with a host id */ - getHostnames(options: { + getHostInfo(options: { kind: "static" | "single" - hostId: string + serviceInterfaceId: string packageId?: string callback: () => void - }): Promise<[] | [Hostname]> - getHostnames(options: { + }): Promise + getHostInfo(options: { kind?: "multi" + serviceInterfaceId: string packageId?: string - hostId: string callback: () => void - }): Promise + }): Promise // /** // * Run rsync between two volumes. This is used to backup data between volumes. @@ -329,13 +340,6 @@ export type Effects = { callback: (config: unknown, previousConfig: unknown) => void }): Promise - getLocalHostname(): Promise - getIPHostname(): Promise - /** Get the address for another service for tor interfaces */ - getServiceTorHostname( - serviceInterfaceId: ServiceInterfaceId, - packageId?: string, - ): Promise /** Get the IP address of the container */ getContainerIp(): Promise /** @@ -419,14 +423,16 @@ export type Effects = { * @returns PEM encoded fullchain (ecdsa) */ getSslCertificate: ( - packageId?: string, + packageId: string | null, + hostId: string, algorithm?: "ecdsa" | "ed25519", ) => Promise<[string, string, string]> /** * @returns PEM encoded ssl key (ecdsa) */ getSslKey: ( - packageId?: string, + packageId: string | null, + hostId: string, algorithm?: "ecdsa" | "ed25519", ) => Promise diff --git a/sdk/lib/util/getServiceInterface.ts b/sdk/lib/util/getServiceInterface.ts index 69083c66f..6f03e75e5 100644 --- a/sdk/lib/util/getServiceInterface.ts +++ b/sdk/lib/util/getServiceInterface.ts @@ -1,4 +1,11 @@ -import { AddressInfo, Effects, Hostname, ServiceInterface } from "../types" +import { + AddressInfo, + Effects, + HostInfo, + Hostname, + HostnameInfo, + ServiceInterface, +} from "../types" import * as regexes from "./regexes" import { ServiceInterfaceType } from "./utils" @@ -22,7 +29,6 @@ export type Filled = { ipv4Hostnames: Hostname[] ipv6Hostnames: Hostname[] nonIpHostnames: Hostname[] - allHostnames: Hostname[] urls: UrlString[] onionUrls: UrlString[] @@ -31,7 +37,6 @@ export type Filled = { ipv4Urls: UrlString[] ipv6Urls: UrlString[] nonIpUrls: UrlString[] - allUrls: UrlString[] } export type FilledAddressInfo = AddressInfo & Filled export type ServiceInterfaceFilled = { @@ -44,6 +49,10 @@ export type ServiceInterfaceFilled = { hasPrimary: boolean /** Whether or not the interface disabled */ disabled: boolean + /** Whether or not to mask the URIs for this interface. Useful if the URIs contain sensitive information, such as a password, macaroon, or API key */ + masked: boolean + /** Information about the host for this binding */ + hostInfo: HostInfo /** URI information */ addressInfo: FilledAddressInfo /** Indicates if we are a ui/p2p/api for the kind of interface that this is representing */ @@ -62,75 +71,110 @@ const negate = (a: A) => !fn(a) const unique = (values: A[]) => Array.from(new Set(values)) +function stringifyHostname(info: HostnameInfo): Hostname { + let base: string + if ("kind" in info.hostname && info.hostname.kind === "domain") { + base = info.hostname.subdomain + ? `${info.hostname.subdomain}.${info.hostname.domain}` + : info.hostname.domain + } else { + base = info.hostname.value + } + if (info.hostname.port && info.hostname.sslPort) { + return `${base}:${info.hostname.port}` as Hostname + } else if (info.hostname.sslPort) { + return `${base}:${info.hostname.sslPort}` as Hostname + } else if (info.hostname.port) { + return `${base}:${info.hostname.port}` as Hostname + } + return base as Hostname +} const addressHostToUrl = ( - { options, username, suffix }: AddressInfo, + { bindOptions, username, suffix }: AddressInfo, host: Hostname, ): UrlString => { const scheme = host.endsWith(".onion") - ? options.scheme - : options.addSsl - ? options.addSsl.scheme - : options.scheme // TODO: encode whether hostname transport is "secure"? + ? bindOptions.scheme + : bindOptions.addSsl + ? bindOptions.addSsl.scheme + : bindOptions.scheme // TODO: encode whether hostname transport is "secure"? return `${scheme ? `${scheme}//` : ""}${ username ? `${username}@` : "" }${host}${suffix}` } export const filledAddress = ( - hostnames: Hostname[], + hostInfo: HostInfo, addressInfo: AddressInfo, ): FilledAddressInfo => { const toUrl = addressHostToUrl.bind(null, addressInfo) + const hostnameInfo = + hostInfo.kind == "multi" + ? hostInfo.hostnames + : hostInfo.hostname + ? [hostInfo.hostname] + : [] return { ...addressInfo, - hostnames, + hostnames: hostnameInfo.flatMap((h) => stringifyHostname(h)), get onionHostnames() { - return hostnames.filter(regexes.torHostname.test) + return hostnameInfo + .filter((h) => h.kind === "onion") + .map((h) => stringifyHostname(h)) }, get localHostnames() { - return hostnames.filter(regexes.localHostname.test) + return hostnameInfo + .filter((h) => h.kind === "ip" && h.hostname.kind === "local") + .map((h) => stringifyHostname(h)) }, get ipHostnames() { - return hostnames.filter(either(regexes.ipv4.test, regexes.ipv6.test)) + return hostnameInfo + .filter( + (h) => + h.kind === "ip" && + (h.hostname.kind === "ipv4" || h.hostname.kind === "ipv6"), + ) + .map((h) => stringifyHostname(h)) }, get ipv4Hostnames() { - return hostnames.filter(regexes.ipv4.test) + return hostnameInfo + .filter((h) => h.kind === "ip" && h.hostname.kind === "ipv4") + .map((h) => stringifyHostname(h)) }, get ipv6Hostnames() { - return hostnames.filter(regexes.ipv6.test) + return hostnameInfo + .filter((h) => h.kind === "ip" && h.hostname.kind === "ipv6") + .map((h) => stringifyHostname(h)) }, get nonIpHostnames() { - return hostnames.filter( - negate(either(regexes.ipv4.test, regexes.ipv6.test)), - ) + return hostnameInfo + .filter( + (h) => + h.kind === "ip" && + h.hostname.kind !== "ipv4" && + h.hostname.kind !== "ipv6", + ) + .map((h) => stringifyHostname(h)) }, - allHostnames: hostnames, get urls() { - return hostnames.map(toUrl) + return this.hostnames.map(toUrl) }, get onionUrls() { - return hostnames.filter(regexes.torHostname.test).map(toUrl) + return this.onionHostnames.map(toUrl) }, get localUrls() { - return hostnames.filter(regexes.localHostname.test).map(toUrl) + return this.localHostnames.map(toUrl) }, get ipUrls() { - return hostnames - .filter(either(regexes.ipv4.test, regexes.ipv6.test)) - .map(toUrl) + return this.ipHostnames.map(toUrl) }, get ipv4Urls() { - return hostnames.filter(regexes.ipv4.test).map(toUrl) + return this.ipv4Hostnames.map(toUrl) }, get ipv6Urls() { - return hostnames.filter(regexes.ipv6.test).map(toUrl) + return this.ipv6Hostnames.map(toUrl) }, get nonIpUrls() { - return hostnames - .filter(negate(either(regexes.ipv4.test, regexes.ipv6.test))) - .map(toUrl) - }, - get allUrls() { - return hostnames.map(toUrl) + return this.nonIpHostnames.map(toUrl) }, } } @@ -151,9 +195,9 @@ const makeInterfaceFilled = async ({ packageId, callback, }) - const hostIdRecord = await effects.getHostnames({ + const hostInfo = await effects.getHostInfo({ packageId, - hostId: serviceInterfaceValue.addressInfo.hostId, + serviceInterfaceId: serviceInterfaceValue.id, callback, }) const primaryUrl = await effects.getPrimaryUrl({ @@ -165,7 +209,8 @@ const makeInterfaceFilled = async ({ const interfaceFilled: ServiceInterfaceFilled = { ...serviceInterfaceValue, primaryUrl: primaryUrl, - addressInfo: filledAddress(hostIdRecord, serviceInterfaceValue.addressInfo), + hostInfo, + addressInfo: filledAddress(hostInfo, serviceInterfaceValue.addressInfo), get primaryHostname() { if (primaryUrl == null) return null return getHostname(primaryUrl) diff --git a/sdk/lib/util/getServiceInterfaces.ts b/sdk/lib/util/getServiceInterfaces.ts index 9c45fd002..176918bb3 100644 --- a/sdk/lib/util/getServiceInterfaces.ts +++ b/sdk/lib/util/getServiceInterfaces.ts @@ -20,19 +20,13 @@ const makeManyInterfaceFilled = async ({ }) const hostIdsRecord = Object.fromEntries( await Promise.all( - Array.from( - new Set( - serviceInterfaceValues - .flatMap((x) => x.addressInfo) - .map((x) => x.hostId), - ), - ).map( - async (hostId) => + Array.from(new Set(serviceInterfaceValues.map((x) => x.id))).map( + async (id) => [ - hostId, - await effects.getHostnames({ + id, + await effects.getHostInfo({ packageId, - hostId, + serviceInterfaceId: id, callback, }), ] as const, @@ -42,9 +36,9 @@ const makeManyInterfaceFilled = async ({ const serviceInterfacesFilled: ServiceInterfaceFilled[] = await Promise.all( serviceInterfaceValues.map(async (serviceInterfaceValue) => { - const hostIdRecord = await effects.getHostnames({ + const hostInfo = await effects.getHostInfo({ packageId, - hostId: serviceInterfaceValue.addressInfo.hostId, + serviceInterfaceId: serviceInterfaceValue.id, callback, }) const primaryUrl = await effects.getPrimaryUrl({ @@ -55,10 +49,8 @@ const makeManyInterfaceFilled = async ({ return { ...serviceInterfaceValue, primaryUrl: primaryUrl, - addressInfo: filledAddress( - hostIdRecord, - serviceInterfaceValue.addressInfo, - ), + hostInfo, + addressInfo: filledAddress(hostInfo, serviceInterfaceValue.addressInfo), get primaryHostname() { if (primaryUrl == null) return null return getHostname(primaryUrl) diff --git a/sdk/lib/util/utils.ts b/sdk/lib/util/utils.ts index 8f28191e4..af6ae89cb 100644 --- a/sdk/lib/util/utils.ts +++ b/sdk/lib/util/utils.ts @@ -25,7 +25,7 @@ import { NamedPath, Path, } from "../dependency/setupDependencyMounts" -import { MultiHost, SingleHost, StaticHost } from "../interfaces/Host" +import { MultiHost, Scheme, SingleHost, StaticHost } from "../interfaces/Host" import { ServiceInterfaceBuilder } from "../interfaces/ServiceInterfaceBuilder" import { GetServiceInterface, getServiceInterface } from "./getServiceInterface" import { @@ -83,6 +83,8 @@ export type Utils< username: null | string path: string search: Record + schemeOverride: { ssl: Scheme; noSsl: Scheme } | null + masked: boolean }) => ServiceInterfaceBuilder getSystemSmtp: () => GetSystemSmtp & WrapperOverWrite host: { @@ -158,6 +160,8 @@ export const createUtils = < username: null | string path: string search: Record + schemeOverride: { ssl: Scheme; noSsl: Scheme } | null + masked: boolean }) => new ServiceInterfaceBuilder({ ...options, effects }), childProcess, getSystemSmtp: () => From 39964bf0773da0fce4b1bc351642bde9247ca027 Mon Sep 17 00:00:00 2001 From: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com> Date: Thu, 22 Feb 2024 15:37:11 -0700 Subject: [PATCH 053/169] Feature/lxc container runtime (#2563) * wip: context * wip(fix) Sorta auth * wip: warnings * wip(fix): registry/admin * wip(fix) marketplace * wip(fix) Some more converted and fixed with the linter and config * wip: Working on the static server * wip(fix)static server * wip: Remove some asynnc * wip: Something about the request and regular rpc * wip: gut install Co-authored-by: J H * wip: Convert the static server into the new system * wip delete file * test * wip(fix) vhost does not need the with safe defaults * wip: Adding in the wifi * wip: Fix the developer and the verify * wip: new install flow Co-authored-by: J H * fix middleware * wip * wip: Fix the auth * wip * continue service refactor * feature: Service get_config * feat: Action * wip: Fighting the great fight against the borrow checker * wip: Remove an error in a file that I just need to deel with later * chore: Add in some more lifetime stuff to the services * wip: Install fix on lifetime * cleanup * wip: Deal with the borrow later * more cleanup * resolve borrowchecker errors * wip(feat): add in the handler for the socket, for now * wip(feat): Update the service_effect_handler::action * chore: Add in the changes to make sure the from_service goes to context * chore: Change the * refactor service map * fix references to service map * fill out restore * wip: Before I work on the store stuff * fix backup module * handle some warnings * feat: add in the ui components on the rust side * feature: Update the procedures * chore: Update the js side of the main and a few of the others * chore: Update the rpc listener to match the persistant container * wip: Working on updating some things to have a better name * wip(feat): Try and get the rpc to return the correct shape? * lxc wip * wip(feat): Try and get the rpc to return the correct shape? * build for container runtime wip * remove container-init * fix build * fix error * chore: Update to work I suppose * lxc wip * remove docker module and feature * download alpine squashfs automatically * overlays effect Co-authored-by: Jade * chore: Add the overlay effect * feat: Add the mounter in the main * chore: Convert to use the mounts, still need to work with the sandbox * install fixes * fix ssl * fixes from testing * implement tmpfile for upload * wip * misc fixes * cleanup * cleanup * better progress reporting * progress for sideload * return real guid * add devmode script * fix lxc rootfs path * fix percentage bar * fix progress bar styling * fix build for unstable * tweaks * label progress * tweaks * update progress more often * make symlink in rpc_client * make socket dir * fix parent path * add start-cli to container * add echo and gitInfo commands * wip: Add the init + errors * chore: Add in the exit effect for the system * chore: Change the type to null for failure to parse * move sigterm timeout to stopping status * update order * chore: Update the return type * remove dbg * change the map error * chore: Update the thing to capture id * chore add some life changes * chore: Update the loging * chore: Update the package to run module * us From for RpcError * chore: Update to use import instead * chore: update * chore: Use require for the backup * fix a default * update the type that is wrong * chore: Update the type of the manifest * chore: Update to make null * only symlink if not exists * get rid of double result * better debug info for ErrorCollection * chore: Update effects * chore: fix * mount assets and volumes * add exec instead of spawn * fix mounting in image * fix overlay mounts Co-authored-by: Jade * misc fixes * feat: Fix two * fix: systemForEmbassy main * chore: Fix small part of main loop * chore: Modify the bundle * merge * fixMain loop" * move tsc to makefile * chore: Update the return types of the health check * fix client * chore: Convert the todo to use tsmatches * add in the fixes for the seen and create the hack to allow demo * chore: Update to include the systemForStartOs * chore UPdate to the latest types from the expected outout * fixes * fix typo * Don't emit if failure on tsc * wip Co-authored-by: Jade * add s9pk api * add inspection * add inspect manifest * newline after display serializable * fix squashfs in image name * edit manifest Co-authored-by: Jade * wait for response on repl * ignore sig for now * ignore sig for now * re-enable sig verification * fix * wip * env and chroot * add profiling logs * set uid & gid in squashfs to 100000 * set uid of sqfs to 100000 * fix mksquashfs args * add env to compat * fix * re-add docker feature flag * fix docker output format being stupid * here be dragons * chore: Add in the cross compiling for something * fix npm link * extract logs from container on exit * chore: Update for testing * add log capture to drop trait * chore: add in the modifications that I make * chore: Update small things for no updates * chore: Update the types of something * chore: Make main not complain * idmapped mounts * idmapped volumes * re-enable kiosk * chore: Add in some logging for the new system * bring in start-sdk * remove avahi * chore: Update the deps * switch to musl * chore: Update the version of prettier * chore: Organize' * chore: Update some of the headers back to the standard of fetch * fix musl build * fix idmapped mounts * fix cross build * use cross compiler for correct arch * feat: Add in the faked ssl stuff for the effects * @dr_bonez Did a solution here * chore: Something that DrBonez * chore: up * wip: We have a working server!!! * wip * uninstall * wip * tes * misc fixes * fix cli * replace interface with host * chore: Fix the types in some ts files * chore: quick update for the system for embassy to update the types * replace br-start9 with lxcbr0 * split patchdb into public/private * chore: Add changes for config set * Feat: Adding some debugging for the errors * wip: Working on getting the set config to work * chore: Update and fix the small issue with the deserialization * lightning, masked, schemeOverride, invert host-iface relationship * feat: Add in the changes for just the sdk * feat: Add in the changes for the new effects I suppose for now * Some small changes ???? --------- Co-authored-by: J H <2364004+Blu-J@users.noreply.github.com> Co-authored-by: J H Co-authored-by: J H Co-authored-by: Matt Hill --- .../src/Adapters/Systems/SystemForEmbassy/index.ts | 14 +++++++++----- core/startos/src/service/service_effect_handler.rs | 5 +++-- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts b/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts index d96f826d7..f984bb489 100644 --- a/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts +++ b/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts @@ -907,18 +907,22 @@ async function updateConfig( mutConfigValue[key] = configValue } if (matchPointerPackage.test(specValue)) { + if (specValue.target === "tor-key") + throw new Error("This service uses an unsupported target TorKey") const filled = await utils.serviceInterface .get({ packageId: specValue["package-id"], id: specValue.interface, }) .once() - if (specValue.target === "tor-key") - throw new Error("This service uses an unsupported target TorKey") + .catch(() => null) + mutConfigValue[key] = - specValue.target === "lan-address" - ? filled.addressInfo.localHostnames[0] - : filled.addressInfo.onionHostnames[0] + filled === null + ? "" + : specValue.target === "lan-address" + ? filled.addressInfo.localHostnames[0] + : filled.addressInfo.onionHostnames[0] } } } diff --git a/core/startos/src/service/service_effect_handler.rs b/core/startos/src/service/service_effect_handler.rs index 8fae3908a..4a8e647d7 100644 --- a/core/startos/src/service/service_effect_handler.rs +++ b/core/startos/src/service/service_effect_handler.rs @@ -168,8 +168,9 @@ async fn get_service_interface( "id": service_interface_id, "name": service_interface_id, "description": "This is a fake", - "hasPrimary": false, + "hasPrimary": true, "disabled": false, + "masked": false, "addressInfo": json!({ "username": Value::Null, "hostId": "HostId?", @@ -182,7 +183,7 @@ async fn get_service_interface( }), "suffix": "http" }), - "type": "ui" + "type": "api" })) } From 3bd7596873ec069e17acbe394d53470a2f94365d Mon Sep 17 00:00:00 2001 From: J H Date: Thu, 22 Feb 2024 16:39:16 -0700 Subject: [PATCH 054/169] chore: Fix some issues in the installation of a package and other rpc things --- container-runtime/src/Adapters/RpcListener.ts | 8 ++++++++ .../src/Adapters/Systems/SystemForEmbassy/index.ts | 3 +-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/container-runtime/src/Adapters/RpcListener.ts b/container-runtime/src/Adapters/RpcListener.ts index 815a5538e..202e942b5 100644 --- a/container-runtime/src/Adapters/RpcListener.ts +++ b/container-runtime/src/Adapters/RpcListener.ts @@ -204,6 +204,14 @@ export class RpcListener { id, ...result, })) + .then((x) => { + if ( + ("result" in x && x.result === undefined) || + !("error" in x || "result" in x) + ) + (x as any).result = null + return x + }) .catch((error) => ({ jsonrpc, id, diff --git a/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts b/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts index f984bb489..339df6460 100644 --- a/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts +++ b/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts @@ -30,7 +30,6 @@ import { JsonPath, unNestPath } from "../../../Models/JsonPath" import { HostSystem } from "../../../Interfaces/HostSystem" import { RpcResult, matchRpcResult } from "../../RpcListener" import { ServiceInterface } from "../../../../../sdk/dist/cjs/lib/types" -import { createUtils } from "../../../../../sdk/dist/cjs/lib/util" type Optional = A | undefined | null function todo(): never { @@ -880,7 +879,7 @@ async function updateConfig( ) { if (!dictionary([string, unknown]).test(spec)) return if (!dictionary([string, unknown]).test(mutConfigValue)) return - const utils = createUtils(effects) + const utils = util.createUtils(effects) for (const key in spec) { const specValue = spec[key] From 87d6684ca71595ab132d5a604b80022c8082ead5 Mon Sep 17 00:00:00 2001 From: Matt Hill Date: Fri, 23 Feb 2024 10:38:50 -0700 Subject: [PATCH 055/169] Frontend changes for 036 (#2554) * new interfaces and remove tor http warnings * move sigtermTimeout to stopping main status * lightning, masked, schemeOverride, invert host-iface relationship * update for new sdk * update for latest SDK changes * Update app-interfaces.page.ts * Update config.service.ts --- sdk/lib/util/getServiceInterface.ts | 2 - web/package-lock.json | 1 + .../shared/src/types/workspace-config.ts | 2 +- .../ui/src/app/app/menu/menu.component.html | 6 - .../ui/src/app/app/menu/menu.component.ts | 5 - .../components/status/status.component.html | 9 +- .../app-interfaces-item.component.html | 70 +- .../app-interfaces/app-interfaces.page.html | 32 +- .../app-interfaces/app-interfaces.page.ts | 156 +++-- .../app-list-pkg/app-list-pkg.component.html | 10 +- .../app-list-pkg/app-list-pkg.component.ts | 25 +- .../app-show-status.component.html | 10 +- .../app-show-status.component.ts | 19 +- .../ui/src/app/pages/login/login.page.html | 24 - .../ui/src/app/pages/login/login.page.ts | 7 - .../server-show/server-show.page.html | 21 - .../server-show/server-show.page.ts | 8 - .../app/pipes/launchable/launchable.pipe.ts | 9 +- web/projects/ui/src/app/pipes/ui/ui.pipe.ts | 8 +- .../ui/src/app/services/api/api.fixures.ts | 655 ++++++++++++++---- .../services/api/embassy-mock-api.service.ts | 18 +- .../ui/src/app/services/api/mock-patch.ts | 418 ++++++++--- .../ui/src/app/services/config.service.ts | 125 ++-- .../src/app/services/patch-db/data-model.ts | 17 +- .../src/app/services/ui-launcher.service.ts | 10 +- 25 files changed, 1096 insertions(+), 571 deletions(-) diff --git a/sdk/lib/util/getServiceInterface.ts b/sdk/lib/util/getServiceInterface.ts index 6f03e75e5..dd2712849 100644 --- a/sdk/lib/util/getServiceInterface.ts +++ b/sdk/lib/util/getServiceInterface.ts @@ -4,9 +4,7 @@ import { HostInfo, Hostname, HostnameInfo, - ServiceInterface, } from "../types" -import * as regexes from "./regexes" import { ServiceInterfaceType } from "./utils" export type UrlString = string diff --git a/web/package-lock.json b/web/package-lock.json index bcd2967f1..f1aab5e5b 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1972,6 +1972,7 @@ } }, "../sdk/dist": { + "name": "@start9labs/start-sdk", "version": "0.4.0-rev0.lib0.rc8.beta7", "license": "MIT", "dependencies": { diff --git a/web/projects/shared/src/types/workspace-config.ts b/web/projects/shared/src/types/workspace-config.ts index 101af40fd..57d5e2a4c 100644 --- a/web/projects/shared/src/types/workspace-config.ts +++ b/web/projects/shared/src/types/workspace-config.ts @@ -13,7 +13,7 @@ export type WorkspaceConfig = { community: 'https://community-registry.start9.com/' } mocks: { - maskAs: 'tor' | 'local' | 'localhost' + maskAs: 'tor' | 'local' | 'ip' | 'localhost' // enables local development in secure mode maskAsHttps: boolean skipStartupAlerts: boolean diff --git a/web/projects/ui/src/app/app/menu/menu.component.html b/web/projects/ui/src/app/app/menu/menu.component.html index a54033b67..6db19dea6 100644 --- a/web/projects/ui/src/app/app/menu/menu.component.html +++ b/web/projects/ui/src/app/app/menu/menu.component.html @@ -22,12 +22,6 @@ {{ page.title }} - !synced)), - ) - constructor( private readonly patch: PatchDB, private readonly eosService: EOSService, diff --git a/web/projects/ui/src/app/components/status/status.component.html b/web/projects/ui/src/app/components/status/status.component.html index fd265fd96..e1829f4ca 100644 --- a/web/projects/ui/src/app/components/status/status.component.html +++ b/web/projects/ui/src/app/components/status/status.component.html @@ -8,13 +8,8 @@ > {{ (connected$ | async) ? rendering.display : 'Unknown' }} - - this may take a while + + . This may take a while diff --git a/web/projects/ui/src/app/pages/apps-routes/app-interfaces/app-interfaces-item.component.html b/web/projects/ui/src/app/pages/apps-routes/app-interfaces/app-interfaces-item.component.html index 932c1fd0a..420cbcf1b 100644 --- a/web/projects/ui/src/app/pages/apps-routes/app-interfaces/app-interfaces-item.component.html +++ b/web/projects/ui/src/app/pages/apps-routes/app-interfaces/app-interfaces-item.component.html @@ -1,72 +1,44 @@ - + -

    {{ interface.def.name }}

    -

    {{ interface.def.description }}

    +

    {{ iFace.name }}

    +

    {{ iFace.description }}

    -
    - - +
    + -

    Tor Address

    -

    {{ tor }}

    +

    {{ address.name }}

    +

    {{ address.url }}

    - + - + - +
    - - - -

    Tor Address

    -

    Service does not use a Tor Address

    -
    -
    - - - - -

    LAN Address

    -

    {{ lan }}

    -
    - - - - - - - - - - - -
    - - - -

    LAN Address

    -

    N/A

    -
    -
    diff --git a/web/projects/ui/src/app/pages/apps-routes/app-interfaces/app-interfaces.page.html b/web/projects/ui/src/app/pages/apps-routes/app-interfaces/app-interfaces.page.html index 16c6a5bd6..ea83aedb1 100644 --- a/web/projects/ui/src/app/pages/apps-routes/app-interfaces/app-interfaces.page.html +++ b/web/projects/ui/src/app/pages/apps-routes/app-interfaces/app-interfaces.page.html @@ -8,19 +8,29 @@ - - - - User Interface - + + + User Interfaces (UI) + - - - Machine Interfaces -
    - -
    + + Application Program Interfaces (API) + + + + + Peer-To-Peer Interfaces (P2P) +
    diff --git a/web/projects/ui/src/app/pages/apps-routes/app-interfaces/app-interfaces.page.ts b/web/projects/ui/src/app/pages/apps-routes/app-interfaces/app-interfaces.page.ts index 825d6536d..3678474e6 100644 --- a/web/projects/ui/src/app/pages/apps-routes/app-interfaces/app-interfaces.page.ts +++ b/web/projects/ui/src/app/pages/apps-routes/app-interfaces/app-interfaces.page.ts @@ -3,19 +3,21 @@ import { WINDOW } from '@ng-web-apis/common' import { ActivatedRoute } from '@angular/router' import { ModalController, ToastController } from '@ionic/angular' import { copyToClipboard, getPkgId } from '@start9labs/shared' -import { getUiInterfaceKey } from 'src/app/services/config.service' -import { - DataModel, - InstalledPackageDataEntry, - InterfaceDef, -} from 'src/app/services/patch-db/data-model' +import { DataModel } from 'src/app/services/patch-db/data-model' import { PatchDB } from 'patch-db-client' import { QRComponent } from 'src/app/components/qr/qr.component' -import { getPackage } from '../../../util/get-package-data' +import { map } from 'rxjs' +import { + ServiceInterface, + ServiceInterfaceWithHostInfo, +} from '@start9labs/start-sdk/mjs/lib/types' -interface LocalInterface { - def: InterfaceDef - addresses: InstalledPackageDataEntry['interface-addresses'][string] +type MappedInterface = ServiceInterface & { + addresses: MappedAddress[] +} +type MappedAddress = { + name: string + url: string } @Component({ @@ -24,60 +26,33 @@ interface LocalInterface { styleUrls: ['./app-interfaces.page.scss'], }) export class AppInterfacesPage { - ui?: LocalInterface - other: LocalInterface[] = [] readonly pkgId = getPkgId(this.route) + readonly serviceInterfaces$ = this.patch + .watch$('package-data', this.pkgId, 'installed', 'service-interfaces') + .pipe( + map(interfaces => { + const sorted = Object.values(interfaces) + .sort(iface => + iface.name.toLowerCase() > iface.name.toLowerCase() ? -1 : 1, + ) + .map(iface => ({ + ...iface, + addresses: getAddresses(iface), + })) + + return { + ui: sorted.filter(val => val.type === 'ui'), + api: sorted.filter(val => val.type === 'api'), + p2p: sorted.filter(val => val.type === 'p2p'), + } + }), + ) + constructor( private readonly route: ActivatedRoute, private readonly patch: PatchDB, ) {} - - async ngOnInit() { - const pkg = await getPackage(this.patch, this.pkgId) - if (!pkg) return - - const interfaces = pkg.manifest.interfaces - const uiKey = getUiInterfaceKey(interfaces) - - if (!pkg.installed) return - - const addressesMap = pkg.installed['interface-addresses'] - - if (uiKey) { - const uiAddresses = addressesMap[uiKey] - this.ui = { - def: interfaces[uiKey], - addresses: { - 'lan-address': uiAddresses['lan-address'] - ? 'https://' + uiAddresses['lan-address'] - : '', - // leave http for services - 'tor-address': uiAddresses['tor-address'] - ? 'http://' + uiAddresses['tor-address'] - : '', - }, - } - } - - this.other = Object.keys(interfaces) - .filter(key => key !== uiKey) - .map(key => { - const addresses = addressesMap[key] - return { - def: interfaces[key], - addresses: { - 'lan-address': addresses['lan-address'] - ? 'https://' + addresses['lan-address'] - : '', - 'tor-address': addresses['tor-address'] - ? // leave http for services - 'http://' + addresses['tor-address'] - : '', - }, - } - }) - } } @Component({ @@ -86,8 +61,7 @@ export class AppInterfacesPage { styleUrls: ['./app-interfaces.page.scss'], }) export class AppInterfacesItemComponent { - @Input() - interface!: LocalInterface + @Input() iFace!: MappedInterface constructor( private readonly toastCtrl: ToastController, @@ -126,3 +100,65 @@ export class AppInterfacesItemComponent { await toast.present() } } + +function getAddresses( + serviceInterface: ServiceInterfaceWithHostInfo, +): MappedAddress[] { + const host = serviceInterface.hostInfo + const addressInfo = serviceInterface.addressInfo + const username = addressInfo.username ? addressInfo.username + '@' : '' + const suffix = addressInfo.suffix || '' + + const hostnames = + host.kind === 'multi' + ? host.hostnames + : host.hostname + ? [host.hostname] + : [] + + return hostnames + .map(h => { + const addresses: MappedAddress[] = [] + + let name = '' + let hostname = '' + + if (h.kind === 'onion') { + name = 'Tor' + hostname = h.hostname.value + } else { + name = h.hostname.kind + hostname = + h.hostname.kind === 'domain' + ? `${h.hostname.subdomain}.${h.hostname.domain}` + : h.hostname.value + } + + if (h.hostname.sslPort) { + const port = h.hostname.sslPort === 443 ? '' : `:${h.hostname.sslPort}` + const scheme = addressInfo.bindOptions.addSsl?.scheme + ? `${addressInfo.bindOptions.addSsl.scheme}://` + : '' + + addresses.push({ + name, + url: `${scheme}${username}${hostname}${port}${suffix}`, + }) + } + + if (h.hostname.port) { + const port = h.hostname.port === 80 ? '' : `:${h.hostname.port}` + const scheme = addressInfo.bindOptions.scheme + ? `${addressInfo.bindOptions.scheme}://` + : '' + + addresses.push({ + name, + url: `${scheme}${username}${hostname}${port}${suffix}`, + }) + } + + return addresses + }) + .flat() +} diff --git a/web/projects/ui/src/app/pages/apps-routes/app-list/app-list-pkg/app-list-pkg.component.html b/web/projects/ui/src/app/pages/apps-routes/app-list/app-list-pkg/app-list-pkg.component.html index 037f7cc07..71988ba5b 100644 --- a/web/projects/ui/src/app/pages/apps-routes/app-list/app-list-pkg/app-list-pkg.component.html +++ b/web/projects/ui/src/app/pages/apps-routes/app-list/app-list-pkg/app-list-pkg.component.html @@ -17,16 +17,18 @@

    {{ manifest.title }}

    [installProgress]="pkg.entry['install-progress']" weight="bold" size="small" - [sigtermTimeout]="manifest.main['sigterm-timeout']" + [sigtermTimeout]="sigtermTimeout" > diff --git a/web/projects/ui/src/app/pages/apps-routes/app-list/app-list-pkg/app-list-pkg.component.ts b/web/projects/ui/src/app/pages/apps-routes/app-list/app-list-pkg/app-list-pkg.component.ts index 3302e182e..76559a8b1 100644 --- a/web/projects/ui/src/app/pages/apps-routes/app-list/app-list-pkg/app-list-pkg.component.ts +++ b/web/projects/ui/src/app/pages/apps-routes/app-list/app-list-pkg/app-list-pkg.component.ts @@ -1,5 +1,9 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core' -import { PackageMainStatus } from 'src/app/services/patch-db/data-model' +import { + InstalledPackageDataEntry, + MainStatus, + PackageMainStatus, +} from 'src/app/services/patch-db/data-model' import { PkgInfo } from 'src/app/util/get-package-info' import { UiLauncherService } from 'src/app/services/ui-launcher.service' @@ -14,15 +18,26 @@ export class AppListPkgComponent { constructor(private readonly launcherService: UiLauncherService) {} - get status(): PackageMainStatus { + get pkgMainStatus(): MainStatus { return ( - this.pkg.entry.installed?.status.main.status || PackageMainStatus.Stopped + this.pkg.entry.installed?.status.main || { + status: PackageMainStatus.Stopped, + } ) } - launchUi(e: Event): void { + get sigtermTimeout(): string | null { + return this.pkgMainStatus.status === PackageMainStatus.Stopping + ? this.pkgMainStatus.timeout + : null + } + + launchUi( + e: Event, + interfaces: InstalledPackageDataEntry['service-interfaces'], + ): void { e.stopPropagation() e.preventDefault() - this.launcherService.launch(this.pkg.entry) + this.launcherService.launch(interfaces) } } diff --git a/web/projects/ui/src/app/pages/apps-routes/app-show/components/app-show-status/app-show-status.component.html b/web/projects/ui/src/app/pages/apps-routes/app-show/components/app-show-status/app-show-status.component.html index 6a8676ebc..e2379713b 100644 --- a/web/projects/ui/src/app/pages/apps-routes/app-show/components/app-show-status/app-show-status.component.html +++ b/web/projects/ui/src/app/pages/apps-routes/app-show/components/app-show-status/app-show-status.component.html @@ -6,7 +6,7 @@ weight="600" [installProgress]="pkg['install-progress']" [rendering]="PR[status.primary]" - [sigtermTimeout]="pkg.manifest.main['sigterm-timeout']" + [sigtermTimeout]="sigtermTimeout" >
    @@ -56,13 +56,11 @@ Launch UI diff --git a/web/projects/ui/src/app/pages/apps-routes/app-show/components/app-show-status/app-show-status.component.ts b/web/projects/ui/src/app/pages/apps-routes/app-show/components/app-show-status/app-show-status.component.ts index f67a2b2fa..dd8832c55 100644 --- a/web/projects/ui/src/app/pages/apps-routes/app-show/components/app-show-status/app-show-status.component.ts +++ b/web/projects/ui/src/app/pages/apps-routes/app-show/components/app-show-status/app-show-status.component.ts @@ -6,8 +6,9 @@ import { PrimaryStatus, } from 'src/app/services/pkg-status-rendering.service' import { - InterfaceDef, + InstalledPackageDataEntry, PackageDataEntry, + PackageMainStatus, PackageState, Status, } from 'src/app/services/patch-db/data-model' @@ -45,8 +46,10 @@ export class AppShowStatusComponent { private readonly connectionService: ConnectionService, ) {} - get interfaces(): Record { - return this.pkg.manifest.interfaces || {} + get interfaces(): + | InstalledPackageDataEntry['service-interfaces'] + | undefined { + return this.pkg.installed?.['service-interfaces'] } get pkgStatus(): Status | null { @@ -73,8 +76,14 @@ export class AppShowStatusComponent { return this.status.primary === PrimaryStatus.Stopped } - launchUi(): void { - this.launcherService.launch(this.pkg) + get sigtermTimeout(): string | null { + return this.pkgStatus?.main.status === PackageMainStatus.Stopping + ? this.pkgStatus.main.timeout + : null + } + + launchUi(interfaces: InstalledPackageDataEntry['service-interfaces']): void { + this.launcherService.launch(interfaces) } async presentModalConfig(): Promise { diff --git a/web/projects/ui/src/app/pages/login/login.page.html b/web/projects/ui/src/app/pages/login/login.page.html index 99f6abbe8..7e27a16c3 100644 --- a/web/projects/ui/src/app/pages/login/login.page.html +++ b/web/projects/ui/src/app/pages/login/login.page.html @@ -6,30 +6,6 @@ -
    - diff --git a/web/projects/ui/src/app/pages/login/login.page.ts b/web/projects/ui/src/app/pages/login/login.page.ts index 15f7d588e..db0d1c2c4 100644 --- a/web/projects/ui/src/app/pages/login/login.page.ts +++ b/web/projects/ui/src/app/pages/login/login.page.ts @@ -5,7 +5,6 @@ import { AuthService } from 'src/app/services/auth.service' import { Router } from '@angular/router' import { ConfigService } from 'src/app/services/config.service' import { DOCUMENT } from '@angular/common' -import { WINDOW } from '@ng-web-apis/common' @Component({ selector: 'login', @@ -24,14 +23,8 @@ export class LoginPage { private readonly api: ApiService, public readonly config: ConfigService, @Inject(DOCUMENT) public readonly document: Document, - @Inject(WINDOW) private readonly windowRef: Window, ) {} - launchHttps() { - const host = this.config.getHost() - this.windowRef.open(`https://${host}`, '_self') - } - async submit() { this.error = '' diff --git a/web/projects/ui/src/app/pages/server-routes/server-show/server-show.page.html b/web/projects/ui/src/app/pages/server-routes/server-show/server-show.page.html index 760a013e6..f16066874 100644 --- a/web/projects/ui/src/app/pages/server-routes/server-show/server-show.page.html +++ b/web/projects/ui/src/app/pages/server-routes/server-show/server-show.page.html @@ -40,27 +40,6 @@

    Clock sync failure

    - - - -

    Http detected

    -

    - Tor is faster over https. - - Download and trust your server's Root CA - - , then switch to https. -

    -
    - - Open Https - - -
    -
    diff --git a/web/projects/ui/src/app/pages/server-routes/server-show/server-show.page.ts b/web/projects/ui/src/app/pages/server-routes/server-show/server-show.page.ts index 2b64fcf1c..38087b354 100644 --- a/web/projects/ui/src/app/pages/server-routes/server-show/server-show.page.ts +++ b/web/projects/ui/src/app/pages/server-routes/server-show/server-show.page.ts @@ -41,8 +41,6 @@ export class ServerShowPage { readonly showUpdate$ = this.eosService.showUpdate$ readonly showDiskRepair$ = this.ClientStorageService.showDiskRepair$ - readonly isTorHttp = this.config.isTorHttp() - constructor( private readonly alertCtrl: AlertController, private readonly modalCtrl: ModalController, @@ -56,7 +54,6 @@ export class ServerShowPage { private readonly ClientStorageService: ClientStorageService, private readonly authService: AuthService, private readonly toastCtrl: ToastController, - private readonly config: ConfigService, @Inject(WINDOW) private readonly windowRef: Window, ) {} @@ -305,11 +302,6 @@ export class ServerShowPage { await alert.present() } - async launchHttps() { - const { 'tor-address': torAddress } = await getServerInfo(this.patch) - this.windowRef.open(torAddress, '_self') - } - addClick(title: string) { switch (title) { case 'Manage': diff --git a/web/projects/ui/src/app/pipes/launchable/launchable.pipe.ts b/web/projects/ui/src/app/pipes/launchable/launchable.pipe.ts index be1d5218d..668328820 100644 --- a/web/projects/ui/src/app/pipes/launchable/launchable.pipe.ts +++ b/web/projects/ui/src/app/pipes/launchable/launchable.pipe.ts @@ -1,6 +1,5 @@ import { Pipe, PipeTransform } from '@angular/core' import { - InterfaceDef, PackageMainStatus, PackageState, } from 'src/app/services/patch-db/data-model' @@ -12,11 +11,7 @@ import { ConfigService } from '../../services/config.service' export class LaunchablePipe implements PipeTransform { constructor(private configService: ConfigService) {} - transform( - state: PackageState, - status: PackageMainStatus, - interfaces: Record, - ): boolean { - return this.configService.isLaunchable(state, status, interfaces) + transform(state: PackageState, status: PackageMainStatus): boolean { + return this.configService.isLaunchable(state, status) } } diff --git a/web/projects/ui/src/app/pipes/ui/ui.pipe.ts b/web/projects/ui/src/app/pipes/ui/ui.pipe.ts index 9d46bfd86..03ec11df0 100644 --- a/web/projects/ui/src/app/pipes/ui/ui.pipe.ts +++ b/web/projects/ui/src/app/pipes/ui/ui.pipe.ts @@ -1,12 +1,14 @@ import { Pipe, PipeTransform } from '@angular/core' -import { InterfaceDef } from '../../services/patch-db/data-model' +import { InstalledPackageDataEntry } from '../../services/patch-db/data-model' import { hasUi } from '../../services/config.service' @Pipe({ name: 'hasUi', }) export class UiPipe implements PipeTransform { - transform(interfaces: Record): boolean { - return hasUi(interfaces) + transform( + interfaces: InstalledPackageDataEntry['service-interfaces'], + ): boolean { + return interfaces ? hasUi(interfaces) : false } } diff --git a/web/projects/ui/src/app/services/api/api.fixures.ts b/web/projects/ui/src/app/services/api/api.fixures.ts index 17460609a..ea83a4f0a 100644 --- a/web/projects/ui/src/app/services/api/api.fixures.ts +++ b/web/projects/ui/src/app/services/api/api.fixures.ts @@ -78,18 +78,6 @@ export module Mock { start: 'Starting Bitcoin is good for your health.', stop: null, }, - main: { - type: 'docker', - image: '', - system: true, - entrypoint: '', - args: [], - mounts: {}, - 'io-format': DockerIoFormat.Yaml, - inject: false, - 'shm-size': '', - 'sigterm-timeout': '1ms', - }, 'health-checks': {}, config: { get: null, @@ -97,40 +85,6 @@ export module Mock { }, volumes: {}, 'min-os-version': '0.2.12', - interfaces: { - ui: { - name: 'Node Visualizer', - description: - 'Web application for viewing information about your node and the Bitcoin network.', - ui: true, - 'tor-config': { - 'port-mapping': {}, - }, - 'lan-config': {}, - protocols: [], - }, - rpc: { - name: 'RPC', - description: 'Used by wallets to interact with your Bitcoin Core node.', - ui: false, - 'tor-config': { - 'port-mapping': {}, - }, - 'lan-config': {}, - protocols: [], - }, - p2p: { - name: 'P2P', - description: - 'Used by other Bitcoin nodes to communicate and interact with your node.', - ui: false, - 'tor-config': { - 'port-mapping': {}, - }, - 'lan-config': {}, - protocols: [], - }, - }, backup: { create: { type: 'docker', @@ -382,18 +336,6 @@ export module Mock { start: 'Starting LND is good for your health.', stop: null, }, - main: { - type: 'docker', - image: '', - system: true, - entrypoint: '', - args: [], - mounts: {}, - 'io-format': DockerIoFormat.Yaml, - inject: false, - 'shm-size': '', - 'sigterm-timeout': '10000µs', - }, 'health-checks': {}, config: { get: null, @@ -401,38 +343,6 @@ export module Mock { }, volumes: {}, 'min-os-version': '0.2.12', - interfaces: { - rpc: { - name: 'RPC interface', - description: 'Good for connecting to your node at a distance.', - ui: true, - 'tor-config': { - 'port-mapping': {}, - }, - 'lan-config': { - '44': { - ssl: true, - mapping: 33, - }, - }, - protocols: [], - }, - grpc: { - name: 'GRPC', - description: 'Certain wallet use grpc.', - ui: false, - 'tor-config': { - 'port-mapping': {}, - }, - 'lan-config': { - '66': { - ssl: true, - mapping: 55, - }, - }, - protocols: [], - }, - }, backup: { create: { type: 'docker', @@ -535,39 +445,10 @@ export module Mock { start: null, stop: null, }, - main: { - type: 'docker', - image: '', - system: true, - entrypoint: '', - args: [''], - mounts: {}, - 'io-format': DockerIoFormat.Yaml, - inject: false, - 'shm-size': '', - 'sigterm-timeout': '1m', - }, 'health-checks': {}, config: { get: {} as any, set: {} as any }, volumes: {}, 'min-os-version': '0.2.12', - interfaces: { - rpc: { - name: 'RPC interface', - description: 'Good for connecting to your node at a distance.', - ui: false, - 'tor-config': { - 'port-mapping': {}, - }, - 'lan-config': { - 44: { - ssl: true, - mapping: 33, - }, - }, - protocols: [], - }, - }, backup: { create: { type: 'docker', @@ -1887,18 +1768,219 @@ export module Mock { }, 'dependency-config-errors': {}, }, - 'interface-addresses': { + 'service-interfaces': { ui: { - 'tor-address': 'bitcoind-ui-address.onion', - 'lan-address': 'bitcoind-ui-address.local', + id: 'ui', + hasPrimary: false, + disabled: false, + masked: false, + name: 'Web UI', + description: + 'A launchable web app for you to interact with your Bitcoin node', + type: 'ui', + addressInfo: { + username: null, + hostId: 'abcdefg', + bindOptions: { + scheme: 'http', + preferredExternalPort: 80, + addSsl: { + preferredExternalPort: 443, + scheme: 'https', + }, + secure: false, + ssl: false, + }, + suffix: '', + }, + hostInfo: { + id: 'abcdefg', + kind: 'multi', + hostnames: [ + { + kind: 'onion', + hostname: { + value: 'bitcoin-ui-address.onion', + port: 80, + sslPort: 443, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'local', + value: 'adjective-noun.local', + port: null, + sslPort: 1234, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'ipv4', + value: '192.168.1.5', + port: null, + sslPort: 1234, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'ipv6', + value: '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', + port: null, + sslPort: 1234, + }, + }, + ], + }, }, rpc: { - 'tor-address': 'bitcoind-rpc-address.onion', - 'lan-address': 'bitcoind-rpc-address.local', + id: 'rpc', + hasPrimary: false, + disabled: false, + masked: false, + name: 'RPC', + description: + 'Used by dependent services and client wallets for connecting to your node', + type: 'api', + addressInfo: { + username: null, + hostId: 'bcdefgh', + bindOptions: { + scheme: 'http', + preferredExternalPort: 80, + addSsl: { + preferredExternalPort: 443, + scheme: 'https', + }, + secure: false, + ssl: false, + }, + suffix: '', + }, + hostInfo: { + id: 'bcdefgh', + kind: 'multi', + hostnames: [ + { + kind: 'onion', + hostname: { + value: 'bitcoin-rpc-address.onion', + port: 80, + sslPort: 443, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'local', + value: 'adjective-noun.local', + port: null, + sslPort: 2345, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'ipv4', + value: '192.168.1.5', + port: null, + sslPort: 2345, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'ipv6', + value: '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', + port: null, + sslPort: 2345, + }, + }, + ], + }, }, p2p: { - 'tor-address': 'bitcoind-p2p-address.onion', - 'lan-address': 'bitcoind-p2p-address.local', + id: 'p2p', + hasPrimary: true, + disabled: false, + masked: false, + name: 'P2P', + description: + 'Used for connecting to other nodes on the Bitcoin network', + type: 'p2p', + addressInfo: { + username: null, + hostId: 'cdefghi', + bindOptions: { + scheme: 'bitcoin', + preferredExternalPort: 8333, + addSsl: null, + secure: true, + ssl: false, + }, + suffix: '', + }, + hostInfo: { + id: 'cdefghi', + kind: 'multi', + hostnames: [ + { + kind: 'onion', + hostname: { + value: 'bitcoin-p2p-address.onion', + port: 8333, + sslPort: null, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'local', + value: 'adjective-noun.local', + port: 3456, + sslPort: null, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'ipv4', + value: '192.168.1.5', + port: 3456, + sslPort: null, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'ipv6', + value: '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', + port: 3456, + sslPort: null, + }, + }, + ], + }, }, }, 'system-pointers': [], @@ -1934,10 +2016,110 @@ export module Mock { 'dependency-config-errors': {}, }, manifest: MockManifestBitcoinProxy, - 'interface-addresses': { - rpc: { - 'tor-address': 'bitcoinproxy-rpc-address.onion', - 'lan-address': 'bitcoinproxy-rpc-address.local', + 'service-interfaces': { + ui: { + id: 'ui', + hasPrimary: false, + disabled: false, + masked: false, + name: 'Web UI', + description: 'A launchable web app for Bitcoin Proxy', + type: 'ui', + addressInfo: { + username: null, + hostId: 'hijklmnop', + bindOptions: { + scheme: 'http', + preferredExternalPort: 80, + addSsl: { + preferredExternalPort: 443, + scheme: 'https', + }, + secure: true, + ssl: true, + }, + suffix: '', + }, + hostInfo: { + id: 'hijklmnop', + kind: 'multi', + hostnames: [ + { + kind: 'onion', + hostname: { + value: 'proxy-ui-address.onion', + port: 80, + sslPort: 443, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'local', + value: 'adjective-noun.local', + port: null, + sslPort: 4567, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'ipv4', + value: '192.168.1.5', + port: null, + sslPort: 4567, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'ipv6', + value: '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', + port: null, + sslPort: 4567, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'wlan0', + public: false, + hostname: { + kind: 'local', + value: 'adjective-noun.local', + port: null, + sslPort: 4567, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'wlan0', + public: false, + hostname: { + kind: 'ipv4', + value: '192.168.1.7', + port: null, + sslPort: 4567, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'wlan0', + public: false, + hostname: { + kind: 'ipv6', + value: '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', + port: null, + sslPort: 4567, + }, + }, + ], + }, }, }, 'system-pointers': [], @@ -1985,14 +2167,213 @@ export module Mock { }, }, manifest: MockManifestLnd, - 'interface-addresses': { - rpc: { - 'tor-address': 'lnd-rpc-address.onion', - 'lan-address': 'lnd-rpc-address.local', - }, + 'service-interfaces': { grpc: { - 'tor-address': 'lnd-grpc-address.onion', - 'lan-address': 'lnd-grpc-address.local', + id: 'grpc', + hasPrimary: false, + disabled: false, + masked: false, + name: 'GRPC', + description: + 'Used by dependent services and client wallets for connecting to your node', + type: 'api', + addressInfo: { + username: null, + hostId: 'qrstuv', + bindOptions: { + scheme: 'grpc', + preferredExternalPort: 10009, + addSsl: null, + secure: true, + ssl: true, + }, + suffix: '', + }, + hostInfo: { + id: 'qrstuv', + kind: 'multi', + hostnames: [ + { + kind: 'onion', + hostname: { + value: 'lnd-grpc-address.onion', + port: 10009, + sslPort: null, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'local', + value: 'adjective-noun.local', + port: 5678, + sslPort: null, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'ipv4', + value: '192.168.1.5', + port: 5678, + sslPort: null, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'ipv6', + value: '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', + port: 5678, + sslPort: null, + }, + }, + ], + }, + }, + lndconnect: { + id: 'lndconnect', + hasPrimary: false, + disabled: false, + masked: true, + name: 'LND Connect', + description: + 'Used by client wallets adhering to LND Connect protocol to connect to your node', + type: 'api', + addressInfo: { + username: null, + hostId: 'qrstuv', + bindOptions: { + scheme: 'lndconnect', + preferredExternalPort: 10009, + addSsl: null, + secure: true, + ssl: true, + }, + suffix: 'cert=askjdfbjadnaskjnd&macaroon=ksjbdfnhjasbndjksand', + }, + hostInfo: { + id: 'qrstuv', + kind: 'multi', + hostnames: [ + { + kind: 'onion', + hostname: { + value: 'lnd-grpc-address.onion', + port: 10009, + sslPort: null, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'local', + value: 'adjective-noun.local', + port: 5678, + sslPort: null, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'ipv4', + value: '192.168.1.5', + port: 5678, + sslPort: null, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'ipv6', + value: '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', + port: 5678, + sslPort: null, + }, + }, + ], + }, + }, + p2p: { + id: 'p2p', + hasPrimary: true, + disabled: false, + masked: false, + name: 'P2P', + description: + 'Used for connecting to other nodes on the Bitcoin network', + type: 'p2p', + addressInfo: { + username: null, + hostId: 'rstuvw', + bindOptions: { + scheme: null, + preferredExternalPort: 9735, + addSsl: null, + secure: true, + ssl: true, + }, + suffix: '', + }, + hostInfo: { + id: 'rstuvw', + kind: 'multi', + hostnames: [ + { + kind: 'onion', + hostname: { + value: 'lnd-p2p-address.onion', + port: 9735, + sslPort: null, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'local', + value: 'adjective-noun.local', + port: 6789, + sslPort: null, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'ipv4', + value: '192.168.1.5', + port: 6789, + sslPort: null, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'ipv6', + value: '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', + port: 6789, + sslPort: null, + }, + }, + ], + }, }, }, 'system-pointers': [], diff --git a/web/projects/ui/src/app/services/api/embassy-mock-api.service.ts b/web/projects/ui/src/app/services/api/embassy-mock-api.service.ts index c98a4bd87..a2e5324a1 100644 --- a/web/projects/ui/src/app/services/api/embassy-mock-api.service.ts +++ b/web/projects/ui/src/app/services/api/embassy-mock-api.service.ts @@ -919,8 +919,10 @@ export class MockApiService extends ApiService { const patch2 = [ { op: PatchOp.REPLACE, - path: path + '/status', - value: PackageMainStatus.Stopped, + path: path, + value: { + status: PackageMainStatus.Stopped, + }, }, ] this.mockRevision(patch2) @@ -929,13 +931,11 @@ export class MockApiService extends ApiService { const patch = [ { op: PatchOp.REPLACE, - path: path + '/status', - value: PackageMainStatus.Stopping, - }, - { - op: PatchOp.REPLACE, - path: path + '/health', - value: {}, + path: path, + value: { + status: PackageMainStatus.Stopping, + timeout: '35s', + }, }, ] diff --git a/web/projects/ui/src/app/services/api/mock-patch.ts b/web/projects/ui/src/app/services/api/mock-patch.ts index 1dc7abd66..35942e92f 100644 --- a/web/projects/ui/src/app/services/api/mock-patch.ts +++ b/web/projects/ui/src/app/services/api/mock-patch.ts @@ -116,18 +116,6 @@ export const mockPatchData: DataModel = { start: 'Starting Bitcoin is good for your health.', stop: null, }, - main: { - type: 'docker', - image: '', - system: true, - entrypoint: '', - args: [], - mounts: {}, - 'io-format': DockerIoFormat.Yaml, - inject: false, - 'shm-size': '', - 'sigterm-timeout': '.49m', - }, 'health-checks': { 'chain-state': { name: 'Chain State', @@ -152,41 +140,6 @@ export const mockPatchData: DataModel = { } as any, volumes: {}, 'min-os-version': '0.2.12', - interfaces: { - ui: { - name: 'Node Visualizer', - description: - 'Web application for viewing information about your node and the Bitcoin network.', - ui: true, - 'tor-config': { - 'port-mapping': {}, - }, - 'lan-config': {}, - protocols: [], - }, - rpc: { - name: 'RPC', - description: - 'Used by wallets to interact with your Bitcoin Core node.', - ui: false, - 'tor-config': { - 'port-mapping': {}, - }, - 'lan-config': {}, - protocols: [], - }, - p2p: { - name: 'P2P', - description: - 'Used by other Bitcoin nodes to communicate and interact with your node.', - ui: false, - 'tor-config': { - 'port-mapping': {}, - }, - 'lan-config': {}, - protocols: [], - }, - }, backup: { create: { type: 'docker', @@ -441,18 +394,110 @@ export const mockPatchData: DataModel = { }, 'dependency-config-errors': {}, }, - 'interface-addresses': { + 'service-interfaces': { ui: { - 'tor-address': 'bitcoind-ui-address.onion', - 'lan-address': 'bitcoind-ui-address.local', - }, - rpc: { - 'tor-address': 'bitcoind-rpc-address.onion', - 'lan-address': 'bitcoind-rpc-address.local', - }, - p2p: { - 'tor-address': 'bitcoind-p2p-address.onion', - 'lan-address': 'bitcoind-p2p-address.local', + id: 'ui', + hasPrimary: false, + disabled: false, + masked: false, + name: 'Web UI', + description: 'A launchable web app for Bitcoin Proxy', + type: 'ui', + addressInfo: { + username: null, + hostId: 'hijklmnop', + bindOptions: { + scheme: 'http', + preferredExternalPort: 80, + addSsl: { + preferredExternalPort: 443, + scheme: 'https', + }, + secure: true, + ssl: true, + }, + suffix: '', + }, + hostInfo: { + id: 'hijklmnop', + kind: 'multi', + hostnames: [ + { + kind: 'onion', + hostname: { + value: 'proxy-ui-address.onion', + port: 80, + sslPort: 443, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'local', + value: 'adjective-noun.local', + port: null, + sslPort: 4567, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'ipv4', + value: '192.168.1.5', + port: null, + sslPort: 4567, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'ipv6', + value: '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', + port: null, + sslPort: 4567, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'wlan0', + public: false, + hostname: { + kind: 'local', + value: 'adjective-noun.local', + port: null, + sslPort: 4567, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'wlan0', + public: false, + hostname: { + kind: 'ipv4', + value: '192.168.1.7', + port: null, + sslPort: 4567, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'wlan0', + public: false, + hostname: { + kind: 'ipv6', + value: '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', + port: null, + sslPort: 4567, + }, + }, + ], + }, }, }, 'system-pointers': [], @@ -506,18 +551,6 @@ export const mockPatchData: DataModel = { start: 'Starting LND is good for your health.', stop: null, }, - main: { - type: 'docker', - image: '', - system: true, - entrypoint: '', - args: [], - mounts: {}, - 'io-format': DockerIoFormat.Yaml, - inject: false, - 'shm-size': '', - 'sigterm-timeout': '0.5s', - }, 'health-checks': {}, config: { get: null, @@ -525,38 +558,6 @@ export const mockPatchData: DataModel = { }, volumes: {}, 'min-os-version': '0.2.12', - interfaces: { - rpc: { - name: 'RPC interface', - description: 'Good for connecting to your node at a distance.', - ui: true, - 'tor-config': { - 'port-mapping': {}, - }, - 'lan-config': { - '44': { - ssl: true, - mapping: 33, - }, - }, - protocols: [], - }, - grpc: { - name: 'GRPC', - description: 'Certain wallet use grpc.', - ui: false, - 'tor-config': { - 'port-mapping': {}, - }, - 'lan-config': { - '66': { - ssl: true, - mapping: 55, - }, - }, - protocols: [], - }, - }, backup: { create: { type: 'docker', @@ -642,14 +643,213 @@ export const mockPatchData: DataModel = { 'btc-rpc-proxy': 'This is a config unsatisfied error', }, }, - 'interface-addresses': { - rpc: { - 'tor-address': 'lnd-rpc-address.onion', - 'lan-address': 'lnd-rpc-address.local', - }, + 'service-interfaces': { grpc: { - 'tor-address': 'lnd-grpc-address.onion', - 'lan-address': 'lnd-grpc-address.local', + id: 'grpc', + hasPrimary: false, + disabled: false, + masked: false, + name: 'GRPC', + description: + 'Used by dependent services and client wallets for connecting to your node', + type: 'api', + addressInfo: { + username: null, + hostId: 'qrstuv', + bindOptions: { + scheme: 'grpc', + preferredExternalPort: 10009, + addSsl: null, + secure: true, + ssl: true, + }, + suffix: '', + }, + hostInfo: { + id: 'qrstuv', + kind: 'multi', + hostnames: [ + { + kind: 'onion', + hostname: { + value: 'lnd-grpc-address.onion', + port: 10009, + sslPort: null, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'local', + value: 'adjective-noun.local', + port: 5678, + sslPort: null, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'ipv4', + value: '192.168.1.5', + port: 5678, + sslPort: null, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'ipv6', + value: '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', + port: 5678, + sslPort: null, + }, + }, + ], + }, + }, + lndconnect: { + id: 'lndconnect', + hasPrimary: false, + disabled: false, + masked: true, + name: 'LND Connect', + description: + 'Used by client wallets adhering to LND Connect protocol to connect to your node', + type: 'api', + addressInfo: { + username: null, + hostId: 'qrstuv', + bindOptions: { + scheme: 'lndconnect', + preferredExternalPort: 10009, + addSsl: null, + secure: true, + ssl: true, + }, + suffix: 'cert=askjdfbjadnaskjnd&macaroon=ksjbdfnhjasbndjksand', + }, + hostInfo: { + id: 'qrstuv', + kind: 'multi', + hostnames: [ + { + kind: 'onion', + hostname: { + value: 'lnd-grpc-address.onion', + port: 10009, + sslPort: null, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'local', + value: 'adjective-noun.local', + port: 5678, + sslPort: null, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'ipv4', + value: '192.168.1.5', + port: 5678, + sslPort: null, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'ipv6', + value: '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', + port: 5678, + sslPort: null, + }, + }, + ], + }, + }, + p2p: { + id: 'p2p', + hasPrimary: true, + disabled: false, + masked: false, + name: 'P2P', + description: + 'Used for connecting to other nodes on the Bitcoin network', + type: 'p2p', + addressInfo: { + username: null, + hostId: 'rstuvw', + bindOptions: { + scheme: null, + preferredExternalPort: 9735, + addSsl: null, + secure: true, + ssl: true, + }, + suffix: '', + }, + hostInfo: { + id: 'rstuvw', + kind: 'multi', + hostnames: [ + { + kind: 'onion', + hostname: { + value: 'lnd-p2p-address.onion', + port: 9735, + sslPort: null, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'local', + value: 'adjective-noun.local', + port: 6789, + sslPort: null, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'ipv4', + value: '192.168.1.5', + port: 6789, + sslPort: null, + }, + }, + { + kind: 'ip', + networkInterfaceId: 'elan0', + public: false, + hostname: { + kind: 'ipv6', + value: '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', + port: 6789, + sslPort: null, + }, + }, + ], + }, }, }, 'system-pointers': [], diff --git a/web/projects/ui/src/app/services/config.service.ts b/web/projects/ui/src/app/services/config.service.ts index f8fef3d60..50f228e95 100644 --- a/web/projects/ui/src/app/services/config.service.ts +++ b/web/projects/ui/src/app/services/config.service.ts @@ -2,8 +2,11 @@ import { DOCUMENT } from '@angular/common' import { Inject, Injectable } from '@angular/core' import { WorkspaceConfig } from '@start9labs/shared' import { - InterfaceDef, - PackageDataEntry, + HostnameInfoIp, + HostnameInfoOnion, +} from '@start9labs/start-sdk/mjs/lib/types' +import { + InstalledPackageDataEntry, PackageMainStatus, PackageState, } from 'src/app/services/patch-db/data-model' @@ -45,10 +48,6 @@ export class ConfigService { : this.hostname.endsWith('.local') } - isTorHttp(): boolean { - return this.isTor() && !this.isHttps() - } - isLanHttp(): boolean { return !this.isTor() && !this.isLocalhost() && !this.isHttps() } @@ -57,24 +56,60 @@ export class ConfigService { return window.isSecureContext || this.isTor() } - isLaunchable( - state: PackageState, - status: PackageMainStatus, - interfaces: Record, - ): boolean { + isLaunchable(state: PackageState, status: PackageMainStatus): boolean { return ( - state === PackageState.Installed && - status === PackageMainStatus.Running && - hasUi(interfaces) + state === PackageState.Installed && status === PackageMainStatus.Running ) } - launchableURL(pkg: PackageDataEntry): string { - if (!this.isTor() && hasLocalUi(pkg.manifest.interfaces)) { - return `https://${lanUiAddress(pkg)}` + /** ${scheme}://${username}@${host}:${externalPort}${suffix} */ + launchableAddress( + interfaces: InstalledPackageDataEntry['service-interfaces'], + ): string { + const ui = Object.values(interfaces).find(i => i.type === 'ui') + + if (!ui) return '' + + const host = ui.hostInfo + const addressInfo = ui.addressInfo + const scheme = this.isHttps() ? 'https' : 'http' + const username = addressInfo.username ? addressInfo.username + '@' : '' + const suffix = addressInfo.suffix || '' + const url = new URL(`${scheme}://${username}placeholder${suffix}`) + + if (host.kind === 'multi') { + const onionHostname = host.hostnames.find( + h => h.kind === 'onion', + ) as HostnameInfoOnion + + if (this.isTor() && onionHostname) { + url.hostname = onionHostname.hostname.value + } else { + const ipHostname = host.hostnames.find( + h => h.kind === 'ip', + ) as HostnameInfoIp + + if (!ipHostname) return '' + + url.hostname = this.hostname + url.port = String( + ipHostname.hostname.sslPort || ipHostname.hostname.port, + ) + } } else { - return `http://${torUiAddress(pkg)}` + const hostname = host.hostname + + if (!hostname) return '' + + if (this.isTor() && hostname.kind === 'onion') { + url.hostname = hostname.hostname.value + } else { + url.hostname = this.hostname + url.port = String(hostname.hostname.sslPort || hostname.hostname.port) + } } + + return url.href } getHost(): string { @@ -92,54 +127,8 @@ export class ConfigService { } } -export function hasTorUi(interfaces: Record): boolean { - const int = getUiInterfaceValue(interfaces) - return !!int?.['tor-config'] -} - -export function hasLocalUi(interfaces: Record): boolean { - const int = getUiInterfaceValue(interfaces) - return !!int?.['lan-config'] -} - -export function torUiAddress({ - manifest, - installed, -}: PackageDataEntry): string { - const key = getUiInterfaceKey(manifest.interfaces) - return installed ? installed['interface-addresses'][key]['tor-address'] : '' -} - -export function lanUiAddress({ - manifest, - installed, -}: PackageDataEntry): string { - const key = getUiInterfaceKey(manifest.interfaces) - return installed ? installed['interface-addresses'][key]['lan-address'] : '' -} - -export function hasUi(interfaces: Record): boolean { - return hasTorUi(interfaces) || hasLocalUi(interfaces) -} - -export function removeProtocol(str: string): string { - if (str.startsWith('http://')) return str.slice(7) - if (str.startsWith('https://')) return str.slice(8) - return str -} - -export function removePort(str: string): string { - return str.split(':')[0] -} - -export function getUiInterfaceKey( - interfaces: Record, -): string { - return Object.keys(interfaces).find(key => interfaces[key].ui) || '' -} - -export function getUiInterfaceValue( - interfaces: Record, -): InterfaceDef | null { - return Object.values(interfaces).find(i => i.ui) || null +export function hasUi( + interfaces: InstalledPackageDataEntry['service-interfaces'], +): boolean { + return Object.values(interfaces).some(iface => iface.type === 'ui') } diff --git a/web/projects/ui/src/app/services/patch-db/data-model.ts b/web/projects/ui/src/app/services/patch-db/data-model.ts index e4ea729d9..e00350528 100644 --- a/web/projects/ui/src/app/services/patch-db/data-model.ts +++ b/web/projects/ui/src/app/services/patch-db/data-model.ts @@ -2,6 +2,7 @@ import { ConfigSpec } from 'src/app/pkg-config/config-types' import { Url } from '@start9labs/shared' import { MarketplaceManifest } from '@start9labs/marketplace' import { BasicInfo } from 'src/app/pages/developer-routes/developer-menu/form-info' +import { ServiceInterfaceWithHostInfo } from '@start9labs/start-sdk/mjs/lib/types' export interface DataModel { 'server-info': ServerInfo @@ -139,9 +140,7 @@ export interface InstalledPackageDataEntry { icon: Url } } - 'interface-addresses': { - [id: string]: { 'tor-address': string; 'lan-address': string } - } + 'service-interfaces': Record 'marketplace-url': string | null 'developer-key': string } @@ -160,7 +159,6 @@ export interface Manifest extends MarketplaceManifest { assets: string // path to assets folder scripts: string // path to scripts folder } - main: ActionImpl 'health-checks': Record< string, ActionImpl & { name: string; 'success-message': string | null } @@ -168,7 +166,6 @@ export interface Manifest extends MarketplaceManifest { config: ConfigActions | null volumes: Record 'min-os-version': string - interfaces: Record backup: BackupActions migrations: Migrations | null actions: Record @@ -241,15 +238,6 @@ export enum VolumeType { Backup = 'backup', } -export interface InterfaceDef { - name: string - description: string - 'tor-config': TorConfig | null - 'lan-config': LanConfig | null - ui: boolean - protocols: string[] -} - export interface TorConfig { 'port-mapping': { [port: number]: number } } @@ -297,6 +285,7 @@ export interface MainStatusStopped { export interface MainStatusStopping { status: PackageMainStatus.Stopping + timeout: string } export interface MainStatusStarting { diff --git a/web/projects/ui/src/app/services/ui-launcher.service.ts b/web/projects/ui/src/app/services/ui-launcher.service.ts index 55559bcd3..70666e264 100644 --- a/web/projects/ui/src/app/services/ui-launcher.service.ts +++ b/web/projects/ui/src/app/services/ui-launcher.service.ts @@ -1,6 +1,6 @@ import { Inject, Injectable } from '@angular/core' import { WINDOW } from '@ng-web-apis/common' -import { PackageDataEntry } from 'src/app/services/patch-db/data-model' +import { InstalledPackageDataEntry } from 'src/app/services/patch-db/data-model' import { ConfigService } from './config.service' @Injectable({ @@ -12,7 +12,11 @@ export class UiLauncherService { private readonly config: ConfigService, ) {} - launch(pkg: PackageDataEntry): void { - this.windowRef.open(this.config.launchableURL(pkg), '_blank', 'noreferrer') + launch(interfaces: InstalledPackageDataEntry['service-interfaces']): void { + this.windowRef.open( + this.config.launchableAddress(interfaces), + '_blank', + 'noreferrer', + ) } } From 4e3075aabad02fb2b6f878fd01269937c3dbd0d8 Mon Sep 17 00:00:00 2001 From: J H Date: Fri, 23 Feb 2024 15:32:01 -0700 Subject: [PATCH 056/169] chore: Add in the ability to remove the bad sections? --- .../Systems/SystemForEmbassy/index.ts | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts b/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts index 339df6460..4814da9b2 100644 --- a/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts +++ b/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts @@ -826,9 +826,11 @@ export class SystemForEmbassy implements System { } async function removePointers(value: T.ConfigRes): Promise { const startingSpec = structuredClone(value.spec) + const config = + value.config && cleanConfigFromPointers(value.config, startingSpec) const spec = cleanSpecOfPointers(startingSpec) - return { ...value, spec } + return { config, spec } } const matchPointer = object({ @@ -871,6 +873,44 @@ function cleanSpecOfPointers(mutSpec: T): T { return mutSpec } +function isKeyOf( + key: string, + ofObject: O, +): key is keyof O & string { + return key in ofObject +} + +// prettier-ignore +type CleanConfigFromPointers = + [C, S] extends [object, object] ? { + [K in (keyof C & keyof S ) & string]: ( + S[K] extends {type: "pointer"} ? never : + S[K] extends {spec: object & infer B} ? CleanConfigFromPointers : + C[K] + ) + } : + null + +function cleanConfigFromPointers( + config: C, + spec: S, +): CleanConfigFromPointers { + const newConfig = {} as CleanConfigFromPointers + + if (!(object.test(config) && object.test(spec)) || newConfig == null) + return null as CleanConfigFromPointers + + for (const key of Object.keys(spec)) { + if (!isKeyOf(key, spec)) continue + if (!isKeyOf(key, config)) continue + const partSpec = spec[key] + if (matchPointer.test(partSpec)) continue + ;(newConfig as any)[key] = matchSpec.test(partSpec) + ? cleanConfigFromPointers(config[key], partSpec.spec) + : config[key] + } + return newConfig as CleanConfigFromPointers +} async function updateConfig( effects: HostSystemStartOs, From d87748fda1eb74806b824a4f83c0f5cd991afcaa Mon Sep 17 00:00:00 2001 From: Aiden McClelland Date: Mon, 26 Feb 2024 16:59:37 -0700 Subject: [PATCH 057/169] add npm workspace file --- package-lock.json | 4444 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 4 + 2 files changed, 4448 insertions(+) create mode 100644 package-lock.json create mode 100644 package.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..aa2b3c81e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4444 @@ +{ + "name": "start-os", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "start-os", + "workspaces": [ + "sdk" + ] + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "dev": true, + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "dev": true, + "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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.4.tgz", + "integrity": "sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.23.tgz", + "integrity": "sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@start9labs/start-sdk": { + "resolved": "sdk", + "link": true + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/node": { + "version": "20.11.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz", + "integrity": "sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@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-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001589", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001589.tgz", + "integrity": "sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.682", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.682.tgz", + "integrity": "sha512-oCglfs8yYKs9RQjJFOHonSnhikPK3y+0SvSYc/YpYJV//6rqc0/hbwd0c7vgK4vrl6y2gJAwjkhkSGWK+z4KRA==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isomorphic-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", + "dependencies": { + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", + "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-jest": { + "version": "29.1.2", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", + "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/ts-matches": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ts-matches/-/ts-matches-5.4.1.tgz", + "integrity": "sha512-kXrY75F0s0WD15N2bWKDScKlKgwnusN6dTRzGs1N7LlxQRnazrsBISC1HL4sy2adsyk65Zbx3Ui3IGN8leAFOQ==" + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tsx": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.1.tgz", + "integrity": "sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==", + "dev": true, + "dependencies": { + "esbuild": "~0.19.10", + "get-tsconfig": "^4.7.2" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.0.tgz", + "integrity": "sha512-j9iR8g+/t0lArF4V6NE/QCfT+CO7iLqrXAHZbJdo+LfjqP1vR8Fg5bSiaq6Q2lOD1AUEVrEVIgABvBFYojJVYQ==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "sdk": { + "name": "@start9labs/start-sdk", + "version": "0.4.0-rev0.lib0.rc8.beta7", + "license": "MIT", + "dependencies": { + "@iarna/toml": "^2.2.5", + "isomorphic-fetch": "^3.0.0", + "ts-matches": "^5.4.1", + "yaml": "^2.2.2" + }, + "devDependencies": { + "@types/jest": "^29.4.0", + "jest": "^29.4.3", + "prettier": "^3.2.5", + "ts-jest": "^29.0.5", + "ts-node": "^10.9.1", + "tsx": "^4.7.1", + "typescript": "^5.0.4" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..ce3109a9e --- /dev/null +++ b/package.json @@ -0,0 +1,4 @@ +{ + "name": "start-os", + "workspaces": ["sdk"] +} From ddeed65994d1d2e55bc4fa877ad7d44e8b61c135 Mon Sep 17 00:00:00 2001 From: Aiden McClelland Date: Mon, 26 Feb 2024 17:29:20 -0700 Subject: [PATCH 058/169] remove workspace package json --- package-lock.json | 4444 --------------------------------------------- package.json | 4 - 2 files changed, 4448 deletions(-) delete mode 100644 package-lock.json delete mode 100644 package.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index aa2b3c81e..000000000 --- a/package-lock.json +++ /dev/null @@ -1,4444 +0,0 @@ -{ - "name": "start-os", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "start-os", - "workspaces": [ - "sdk" - ] - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", - "dev": true, - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, - "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" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", - "dev": true, - "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" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@iarna/toml": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.4.tgz", - "integrity": "sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.23", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.23.tgz", - "integrity": "sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@start9labs/start-sdk": { - "resolved": "sdk", - "link": true - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", - "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/node": { - "version": "20.11.20", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz", - "integrity": "sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true - }, - "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@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-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001589", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001589.tgz", - "integrity": "sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "dev": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.682", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.682.tgz", - "integrity": "sha512-oCglfs8yYKs9RQjJFOHonSnhikPK3y+0SvSYc/YpYJV//6rqc0/hbwd0c7vgK4vrl6y2gJAwjkhkSGWK+z4KRA==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isomorphic-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", - "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", - "dependencies": { - "node-fetch": "^2.6.1", - "whatwg-fetch": "^3.4.1" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", - "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pure-rand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/ts-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-jest/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-jest/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/ts-matches": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ts-matches/-/ts-matches-5.4.1.tgz", - "integrity": "sha512-kXrY75F0s0WD15N2bWKDScKlKgwnusN6dTRzGs1N7LlxQRnazrsBISC1HL4sy2adsyk65Zbx3Ui3IGN8leAFOQ==" - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tsx": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.1.tgz", - "integrity": "sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==", - "dev": true, - "dependencies": { - "esbuild": "~0.19.10", - "get-tsconfig": "^4.7.2" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-fetch": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.0.tgz", - "integrity": "sha512-j9iR8g+/t0lArF4V6NE/QCfT+CO7iLqrXAHZbJdo+LfjqP1vR8Fg5bSiaq6Q2lOD1AUEVrEVIgABvBFYojJVYQ==", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "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" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "sdk": { - "name": "@start9labs/start-sdk", - "version": "0.4.0-rev0.lib0.rc8.beta7", - "license": "MIT", - "dependencies": { - "@iarna/toml": "^2.2.5", - "isomorphic-fetch": "^3.0.0", - "ts-matches": "^5.4.1", - "yaml": "^2.2.2" - }, - "devDependencies": { - "@types/jest": "^29.4.0", - "jest": "^29.4.3", - "prettier": "^3.2.5", - "ts-jest": "^29.0.5", - "ts-node": "^10.9.1", - "tsx": "^4.7.1", - "typescript": "^5.0.4" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index ce3109a9e..000000000 --- a/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "start-os", - "workspaces": ["sdk"] -} From 6b990e1ceebb09c8d618778eb72e940785f0c558 Mon Sep 17 00:00:00 2001 From: J H Date: Tue, 27 Feb 2024 12:33:31 -0700 Subject: [PATCH 059/169] chore: Up the version --- sdk/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/package.json b/sdk/package.json index 110b4bc8f..d2cab0a39 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@start9labs/start-sdk", - "version": "0.4.0-rev0.lib0.rc8.beta7", + "version": "0.4.0-rev0.lib0.rc8.beta8", "description": "Software development kit to facilitate packaging services for StartOS", "main": "./cjs/lib/index.js", "types": "./cjs/lib/index.d.ts", @@ -56,4 +56,4 @@ "tsx": "^4.7.1", "typescript": "^5.0.4" } -} +} \ No newline at end of file From 2f6d7ac12835d0bda6d1a8c18530b928728088d3 Mon Sep 17 00:00:00 2001 From: J H Date: Tue, 27 Feb 2024 13:11:04 -0700 Subject: [PATCH 060/169] chore: Update to have the startsdk --- sdk/lib/index.ts | 1 + sdk/package-lock.json | 4 ++-- sdk/package.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/sdk/lib/index.ts b/sdk/lib/index.ts index 746bc12e9..1430c3be7 100644 --- a/sdk/lib/index.ts +++ b/sdk/lib/index.ts @@ -2,6 +2,7 @@ export { Daemons } from "./mainFn/Daemons" export { EmVer } from "./emverLite/mod" export { Overlay } from "./util/Overlay" export { Utils } from "./util/utils" +export { StartSdk } from "./StartSdk" export * as actions from "./actions" export * as backup from "./backup" export * as config from "./config" diff --git a/sdk/package-lock.json b/sdk/package-lock.json index 8c6d32fc8..d9d124e1e 100644 --- a/sdk/package-lock.json +++ b/sdk/package-lock.json @@ -1,12 +1,12 @@ { "name": "@start9labs/start-sdk", - "version": "0.4.0-rev0.lib0.rc8.beta7", + "version": "0.4.0-rev0.lib0.rc8.beta9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@start9labs/start-sdk", - "version": "0.4.0-rev0.lib0.rc8.beta7", + "version": "0.4.0-rev0.lib0.rc8.beta9", "license": "MIT", "dependencies": { "@iarna/toml": "^2.2.5", diff --git a/sdk/package.json b/sdk/package.json index d2cab0a39..c0acf932a 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@start9labs/start-sdk", - "version": "0.4.0-rev0.lib0.rc8.beta8", + "version": "0.4.0-rev0.lib0.rc8.beta9", "description": "Software development kit to facilitate packaging services for StartOS", "main": "./cjs/lib/index.js", "types": "./cjs/lib/index.d.ts", From f50ddb436f0dab950d8ea62497c9e46af1579318 Mon Sep 17 00:00:00 2001 From: J H Date: Tue, 27 Feb 2024 13:12:51 -0700 Subject: [PATCH 061/169] chore: somethinng --- sdk/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/package.json b/sdk/package.json index c0acf932a..14165ca30 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@start9labs/start-sdk", - "version": "0.4.0-rev0.lib0.rc8.beta9", + "version": "0.4.0-rev0.lib0.rc8.beta10", "description": "Software development kit to facilitate packaging services for StartOS", "main": "./cjs/lib/index.js", "types": "./cjs/lib/index.d.ts", From a5b1b4e103b3858acf6796ff25d4a257126e013f Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Wed, 28 Feb 2024 00:15:32 +0400 Subject: [PATCH 062/169] refactor: remove ionic from remaining places (#2565) --- web/.gitignore | 3 +- web/angular.json | 10 - web/package-lock.json | 120 ++++---- web/package.json | 18 +- .../components/ticker/ticker.component.scss | 1 + .../src/directives/enter/enter.directive.ts | 21 -- .../src/directives/enter/enter.module.ts | 9 - web/projects/shared/src/public-api.ts | 7 - .../dark-theme/dark-theme.component.scss | 1 - .../themes/dark-theme/dark-theme.component.ts | 15 - .../themes/dark-theme/dark-theme.module.ts | 9 - .../light-theme/light-theme.component.scss | 95 ------ .../light-theme/light-theme.component.ts | 15 - .../themes/light-theme/light-theme.module.ts | 9 - web/projects/ui/src/app/app.component.html | 118 ++------ web/projects/ui/src/app/app.component.scss | 116 -------- web/projects/ui/src/app/app.component.ts | 84 ++---- web/projects/ui/src/app/app.module.ts | 36 +-- .../connection-bar.component.html | 16 - .../connection-bar.component.module.ts | 11 - .../connection-bar.component.scss | 9 - .../connection-bar.component.ts | 71 ----- .../src/app/app/footer/footer.component.html | 33 --- .../src/app/app/footer/footer.component.scss | 9 - .../ui/src/app/app/footer/footer.component.ts | 32 -- .../ui/src/app/app/footer/footer.module.ts | 12 - .../ui/src/app/app/menu/menu.component.html | 64 ---- .../ui/src/app/app/menu/menu.component.scss | 49 ---- .../ui/src/app/app/menu/menu.component.ts | 129 --------- .../ui/src/app/app/menu/menu.module.ts | 20 -- .../app/preloader/preloader.component.html | 82 ------ .../app/app/preloader/preloader.component.ts | 106 ------- .../src/app/app/preloader/preloader.module.ts | 13 - .../ui/src/app/app/snek/snake.page.html | 8 - .../ui/src/app/app/snek/snake.page.scss | 14 - .../ui/src/app/app/snek/snake.page.ts | 273 ------------------ .../ui/src/app/app/snek/snek.directive.ts | 50 ---- .../ui/src/app/app/snek/snek.module.ts | 14 - .../app/apps/diagnostic/home/home.page.scss | 20 +- .../app/apps/diagnostic/logs/logs.module.ts | 18 +- .../app/apps/diagnostic/logs/logs.page.html | 76 ++--- .../src/app/apps/diagnostic/logs/logs.page.ts | 121 ++++---- .../ui/src/app/apps/loading/loading.page.ts | 8 +- .../ui/src/app/apps/login/login.page.scss | 2 +- .../ui/src/app/apps/login/login.page.ts | 4 +- .../components/header/corner.component.ts | 2 +- .../interfaces/interface.component.ts | 2 +- .../service/components/status.component.ts | 6 +- .../service/modals/credentials.component.ts | 29 +- .../service/pipes}/install-progress.pipe.ts | 9 +- .../routes/service/pipes/to-menu.pipe.ts | 21 +- .../settings/routes/router/primary-ip.pipe.ts | 14 + .../routes/router/router.component.ts | 4 +- .../system/updates/updates.component.ts | 76 +++-- .../install-progress.module.ts | 8 - .../common/primary-ip/primary-ip.module.ts | 8 - .../app/common/primary-ip/primary-ip.pipe.ts | 17 -- .../ui/src/app/common/qr.component.ts | 16 + .../ui/src/app/common/qr/qr.component.ts | 14 - .../ui/src/app/common/qr/qr.module.ts | 12 - .../{app => common}/sidebar-host.component.ts | 0 .../skeleton-list.component.html | 51 ---- .../skeleton-list.component.module.ts | 12 - .../skeleton-list/skeleton-list.component.ts | 18 -- .../app/common/svg-definitions.component.ts | 32 ++ .../notifications-toast.component.ts | 42 +++ .../notifications-toast.component.html | 8 - .../notifications-toast.component.ts | 27 -- .../notifications-toast.service.ts | 19 -- .../refresh-alert.component.ts | 90 ++++++ .../refresh-alert.component.html | 27 -- .../refresh-alert/refresh-alert.component.ts | 51 ---- .../refresh-alert/refresh-alert.service.ts | 22 -- .../toast-container.component.html | 3 - .../toast-container.component.ts | 15 +- .../toast-container/toast-container.module.ts | 30 -- .../toast-container/update-toast.component.ts | 79 +++++ .../update-toast/update-toast.component.html | 23 -- .../update-toast/update-toast.component.ts | 42 --- .../update-toast/update-toast.service.ts | 15 - .../any-link/any-link.component.html | 17 -- .../any-link/any-link.component.scss | 4 - .../any-link/any-link.component.ts | 27 -- .../widget-card/widget-card.component.html | 28 -- .../widget-card/widget-card.component.scss | 68 ----- .../widget-card/widget-card.component.ts | 66 ----- .../widget-list/widget-list.component.html | 12 - .../widget-list.component.module.ts | 14 - .../widget-list/widget-list.component.scss | 19 -- .../widget-list/widget-list.component.ts | 84 ------ web/projects/ui/src/app/route-animation.ts | 33 --- 91 files changed, 585 insertions(+), 2582 deletions(-) delete mode 100644 web/projects/shared/src/directives/enter/enter.directive.ts delete mode 100644 web/projects/shared/src/directives/enter/enter.module.ts delete mode 100644 web/projects/shared/src/themes/dark-theme/dark-theme.component.scss delete mode 100644 web/projects/shared/src/themes/dark-theme/dark-theme.component.ts delete mode 100644 web/projects/shared/src/themes/dark-theme/dark-theme.module.ts delete mode 100644 web/projects/shared/src/themes/light-theme/light-theme.component.scss delete mode 100644 web/projects/shared/src/themes/light-theme/light-theme.component.ts delete mode 100644 web/projects/shared/src/themes/light-theme/light-theme.module.ts delete mode 100644 web/projects/ui/src/app/app/connection-bar/connection-bar.component.html delete mode 100644 web/projects/ui/src/app/app/connection-bar/connection-bar.component.module.ts delete mode 100644 web/projects/ui/src/app/app/connection-bar/connection-bar.component.scss delete mode 100644 web/projects/ui/src/app/app/connection-bar/connection-bar.component.ts delete mode 100644 web/projects/ui/src/app/app/footer/footer.component.html delete mode 100644 web/projects/ui/src/app/app/footer/footer.component.scss delete mode 100644 web/projects/ui/src/app/app/footer/footer.component.ts delete mode 100644 web/projects/ui/src/app/app/footer/footer.module.ts delete mode 100644 web/projects/ui/src/app/app/menu/menu.component.html delete mode 100644 web/projects/ui/src/app/app/menu/menu.component.scss delete mode 100644 web/projects/ui/src/app/app/menu/menu.component.ts delete mode 100644 web/projects/ui/src/app/app/menu/menu.module.ts delete mode 100644 web/projects/ui/src/app/app/preloader/preloader.component.html delete mode 100644 web/projects/ui/src/app/app/preloader/preloader.component.ts delete mode 100644 web/projects/ui/src/app/app/preloader/preloader.module.ts delete mode 100644 web/projects/ui/src/app/app/snek/snake.page.html delete mode 100644 web/projects/ui/src/app/app/snek/snake.page.scss delete mode 100644 web/projects/ui/src/app/app/snek/snake.page.ts delete mode 100644 web/projects/ui/src/app/app/snek/snek.directive.ts delete mode 100644 web/projects/ui/src/app/app/snek/snek.module.ts rename web/projects/ui/src/app/{common/install-progress => apps/portal/routes/service/pipes}/install-progress.pipe.ts (52%) create mode 100644 web/projects/ui/src/app/apps/portal/routes/system/settings/routes/router/primary-ip.pipe.ts delete mode 100644 web/projects/ui/src/app/common/install-progress/install-progress.module.ts delete mode 100644 web/projects/ui/src/app/common/primary-ip/primary-ip.module.ts delete mode 100644 web/projects/ui/src/app/common/primary-ip/primary-ip.pipe.ts create mode 100644 web/projects/ui/src/app/common/qr.component.ts delete mode 100644 web/projects/ui/src/app/common/qr/qr.component.ts delete mode 100644 web/projects/ui/src/app/common/qr/qr.module.ts rename web/projects/ui/src/app/{app => common}/sidebar-host.component.ts (100%) delete mode 100644 web/projects/ui/src/app/common/skeleton-list/skeleton-list.component.html delete mode 100644 web/projects/ui/src/app/common/skeleton-list/skeleton-list.component.module.ts delete mode 100644 web/projects/ui/src/app/common/skeleton-list/skeleton-list.component.ts create mode 100644 web/projects/ui/src/app/common/svg-definitions.component.ts create mode 100644 web/projects/ui/src/app/common/toast-container/notifications-toast.component.ts delete mode 100644 web/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.component.html delete mode 100644 web/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.component.ts delete mode 100644 web/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.service.ts create mode 100644 web/projects/ui/src/app/common/toast-container/refresh-alert.component.ts delete mode 100644 web/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.html delete mode 100644 web/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.ts delete mode 100644 web/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.service.ts delete mode 100644 web/projects/ui/src/app/common/toast-container/toast-container.component.html delete mode 100644 web/projects/ui/src/app/common/toast-container/toast-container.module.ts create mode 100644 web/projects/ui/src/app/common/toast-container/update-toast.component.ts delete mode 100644 web/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.html delete mode 100644 web/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.ts delete mode 100644 web/projects/ui/src/app/common/toast-container/update-toast/update-toast.service.ts delete mode 100644 web/projects/ui/src/app/common/widget-list/any-link/any-link.component.html delete mode 100644 web/projects/ui/src/app/common/widget-list/any-link/any-link.component.scss delete mode 100644 web/projects/ui/src/app/common/widget-list/any-link/any-link.component.ts delete mode 100644 web/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.html delete mode 100644 web/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.scss delete mode 100644 web/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.ts delete mode 100644 web/projects/ui/src/app/common/widget-list/widget-list.component.html delete mode 100644 web/projects/ui/src/app/common/widget-list/widget-list.component.module.ts delete mode 100644 web/projects/ui/src/app/common/widget-list/widget-list.component.scss delete mode 100644 web/projects/ui/src/app/common/widget-list/widget-list.component.ts delete mode 100644 web/projects/ui/src/app/route-animation.ts diff --git a/web/.gitignore b/web/.gitignore index b1c5a5c90..284e0a69e 100644 --- a/web/.gitignore +++ b/web/.gitignore @@ -26,7 +26,6 @@ postprocess.js /.angular /.idea -/.ionic /.sass-cache /.sourcemaps /.versions @@ -39,4 +38,4 @@ postprocess.js /plugins config.json -proxy.conf.json \ No newline at end of file +proxy.conf.json diff --git a/web/angular.json b/web/angular.json index 9e99210cd..cd18f4523 100644 --- a/web/angular.json +++ b/web/angular.json @@ -26,11 +26,6 @@ "input": "projects/shared/assets", "output": "assets" }, - { - "glob": "**/*.svg", - "input": "node_modules/ionicons/dist/svg", - "output": "./svg" - }, { "glob": "**/*", "input": "node_modules/monaco-editor", @@ -46,11 +41,6 @@ "glob": "ngsw.json", "input": "dist/raw/ui", "output": "projects/ui/src" - }, - { - "glob": "**/*", - "input": "node_modules/@taiga-ui/icons/src", - "output": "assets/taiga-ui/icons" } ], "styles": [ diff --git a/web/package-lock.json b/web/package-lock.json index 9537c894e..917caaf61 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -24,15 +24,15 @@ "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc8.beta2", - "@taiga-ui/addon-charts": "3.65.0", - "@taiga-ui/addon-commerce": "3.65.0", - "@taiga-ui/addon-mobile": "3.65.0", - "@taiga-ui/cdk": "3.65.0", - "@taiga-ui/core": "3.65.0", - "@taiga-ui/experimental": "3.65.0", - "@taiga-ui/icons": "3.65.0", - "@taiga-ui/kit": "3.65.0", - "@taiga-ui/styles": "3.65.0", + "@taiga-ui/addon-charts": "3.68.0", + "@taiga-ui/addon-commerce": "3.68.0", + "@taiga-ui/addon-mobile": "3.68.0", + "@taiga-ui/cdk": "3.68.0", + "@taiga-ui/core": "3.68.0", + "@taiga-ui/experimental": "3.68.0", + "@taiga-ui/icons": "3.68.0", + "@taiga-ui/kit": "3.68.0", + "@taiga-ui/styles": "3.68.0", "@tinkoff/ng-dompurify": "4.0.0", "@tinkoff/ng-event-plugins": "3.1.0", "ansi-to-html": "^0.7.2", @@ -4672,9 +4672,9 @@ } }, "node_modules/@taiga-ui/addon-charts": { - "version": "3.65.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.65.0.tgz", - "integrity": "sha512-HNKUeK0ippIvLRF6wsuCiyJ4d98K4uIhkGwK1fWaTVOCN26Z+AnFKk9AryTyhocEZctyc4PMpJ7BP7h3CA4dZA==", + "version": "3.68.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.68.0.tgz", + "integrity": "sha512-f19w8EikXSQuF2f/M8e3yZoXBzunugbLZlz/W0Fiw8ykGE2tZPWXmcX4VKHa2yuI/VPwSUClVcF/n7MgNque0w==", "dependencies": { "tslib": "2.6.2" }, @@ -4682,15 +4682,15 @@ "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@ng-web-apis/common": "3.0.6", - "@taiga-ui/cdk": "^3.65.0", - "@taiga-ui/core": "^3.65.0", + "@taiga-ui/cdk": "^3.68.0", + "@taiga-ui/core": "^3.68.0", "@tinkoff/ng-polymorpheus": "4.3.0" } }, "node_modules/@taiga-ui/addon-commerce": { - "version": "3.65.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-commerce/-/addon-commerce-3.65.0.tgz", - "integrity": "sha512-D98M3nkPKVFz9TFiMxCmMtmJs9vDc69RlPv5M03ZF+qXHqbthfpVss/p2MSzs4Cr2vgoECaZWPLNcWBOO5mzCw==", + "version": "3.68.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-commerce/-/addon-commerce-3.68.0.tgz", + "integrity": "sha512-HyBqU9WRbty4mXloawhO+0E2tfNwwD7yZ1DOx8kEiRrGWwIT+11Io/PspkShZzY4mTyPt0iuoBkwe9rpdoxieA==", "dependencies": { "tslib": "2.6.2" }, @@ -4702,18 +4702,18 @@ "@maskito/core": "1.9.0", "@maskito/kit": "1.9.0", "@ng-web-apis/common": "3.0.6", - "@taiga-ui/cdk": "^3.65.0", - "@taiga-ui/core": "^3.65.0", - "@taiga-ui/i18n": "^3.65.0", - "@taiga-ui/kit": "^3.65.0", + "@taiga-ui/cdk": "^3.68.0", + "@taiga-ui/core": "^3.68.0", + "@taiga-ui/i18n": "^3.68.0", + "@taiga-ui/kit": "^3.68.0", "@tinkoff/ng-polymorpheus": "4.3.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/addon-mobile": { - "version": "3.65.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-mobile/-/addon-mobile-3.65.0.tgz", - "integrity": "sha512-nKEf5Lb7yfR7vqkAIQQLoUEzSpKftdPpAsmco6FNfN4FDlvDFYTKE8MqqXAxzEqrXviDXv8/CKPv+nc6xd4VXg==", + "version": "3.68.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/addon-mobile/-/addon-mobile-3.68.0.tgz", + "integrity": "sha512-ssX+dO+aPF7q49YiuW2X//N9X01XqkJB8NlTKM4kYPxOQi423JR4tewafmcHoRjdT9OnUo/pkq72GRE5UECEAg==", "dependencies": { "tslib": "2.6.2" }, @@ -4722,17 +4722,17 @@ "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", "@ng-web-apis/common": "3.0.6", - "@taiga-ui/cdk": "^3.65.0", - "@taiga-ui/core": "^3.65.0", - "@taiga-ui/kit": "^3.65.0", + "@taiga-ui/cdk": "^3.68.0", + "@taiga-ui/core": "^3.68.0", + "@taiga-ui/kit": "^3.68.0", "@tinkoff/ng-polymorpheus": "4.3.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/cdk": { - "version": "3.65.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.65.0.tgz", - "integrity": "sha512-hiFC9RlRng7pUv84YPZbqieKIYsFEzsMKCjMIckHBASBBU6qQ4OY6irKszFvTGqMe9KJgBh6sJU1hkQOBwFSaA==", + "version": "3.68.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.68.0.tgz", + "integrity": "sha512-GB1wJaJGJMkK2+Njl3qePy3o4tu6w2MIBGcPkFE65sqgomIDNhM5jVB3ldQI5XtvTHsAAoV8m6UpyKRDQJdw6g==", "dependencies": { "@ng-web-apis/common": "3.0.6", "@ng-web-apis/mutation-observer": "3.1.0", @@ -4760,11 +4760,11 @@ "optional": true }, "node_modules/@taiga-ui/core": { - "version": "3.65.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.65.0.tgz", - "integrity": "sha512-zNctTTsrW73fhmYirWE/mZs32UUvv6gV5CoIFm0BzVos0X7ZkN+x7PLXd9R+3CEgL6Kv/OxY92p+pJRvqc5jHg==", + "version": "3.68.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.68.0.tgz", + "integrity": "sha512-KBS7ZM8i/h0ReZcoD5xQP/AJYmrabg26f0n/fr4pZmDKgZGaaGvB54vwTxq6vh7QW1VOGc7LuJQ2MshEE9iOmQ==", "dependencies": { - "@taiga-ui/i18n": "^3.65.0", + "@taiga-ui/i18n": "^3.68.0", "tslib": "2.6.2" }, "peerDependencies": { @@ -4776,35 +4776,35 @@ "@angular/router": ">=12.0.0", "@ng-web-apis/common": "3.0.6", "@ng-web-apis/mutation-observer": "3.1.0", - "@taiga-ui/cdk": "^3.65.0", - "@taiga-ui/i18n": "^3.65.0", + "@taiga-ui/cdk": "^3.68.0", + "@taiga-ui/i18n": "^3.68.0", "@tinkoff/ng-event-plugins": "3.1.0", "@tinkoff/ng-polymorpheus": "4.3.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/experimental": { - "version": "3.65.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/experimental/-/experimental-3.65.0.tgz", - "integrity": "sha512-LZYR+XeJ2n+vE4AHBiIolzlqDrDGUx/bmE0ypmKO7dPgvHWu5Al8OXRrnhyqmAVO48FNpkSZ07YoqCG/aoxu6g==", + "version": "3.68.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/experimental/-/experimental-3.68.0.tgz", + "integrity": "sha512-gZyD+S7af1Z11Sx0dQUZBGoyWsN2ykZsguTYCCtVF4iynoCiqwCsTTWhjaA7scNVuTl/H7ekwabw+U6+G3TPfg==", "dependencies": { "tslib": "2.6.2" }, "peerDependencies": { "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0", - "@taiga-ui/addon-commerce": "^3.65.0", - "@taiga-ui/cdk": "^3.65.0", - "@taiga-ui/core": "^3.65.0", - "@taiga-ui/kit": "^3.65.0", + "@taiga-ui/addon-commerce": "^3.68.0", + "@taiga-ui/cdk": "^3.68.0", + "@taiga-ui/core": "^3.68.0", + "@taiga-ui/kit": "^3.68.0", "@tinkoff/ng-polymorpheus": "4.3.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/i18n": { - "version": "3.65.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.65.0.tgz", - "integrity": "sha512-lHy9VDKc5IXbm40eJnnAyOlmm3vDgmWhGbr5woGe9bV/tTqsBBDATY7Rkhz7Bu1nbX7X+MI0TDfQh9ayoCCKRQ==", + "version": "3.68.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.68.0.tgz", + "integrity": "sha512-AyJDYm3nD0mNfEnqXubGFgsHqUTCs8W8/P2Td/TF1JCsp7Zjo+qc9uocqWXzlf2Zd0w26d0oYbBsVjpnrMlVnw==", "dependencies": { "tslib": "2.6.2" }, @@ -4815,20 +4815,20 @@ } }, "node_modules/@taiga-ui/icons": { - "version": "3.65.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.65.0.tgz", - "integrity": "sha512-8iE6EuK+QBzcNiRM1ThZOOkZpal7V6dBouMXMj+QphRWiIp8Znj58mtY3L+uwQFpGnxt3DRs4p4eEA9ZuGFssw==", + "version": "3.68.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.68.0.tgz", + "integrity": "sha512-krRHxz4I74hwYfD1/zOQRMUlzpYyAyXCxudYm9lTS8G2Yy7QeVzs0d7FkdpUvCYMqfQjBLqepckykxD5qPwoSw==", "dependencies": { "tslib": "2.6.2" }, "peerDependencies": { - "@taiga-ui/cdk": "^3.65.0" + "@taiga-ui/cdk": "^3.68.0" } }, "node_modules/@taiga-ui/kit": { - "version": "3.65.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.65.0.tgz", - "integrity": "sha512-Nh6pMSAFR7yScF7acj8WdCpKQUgDatW2jObqts0z4hy9BJ8gl9BAWRBgSlbp3Oen5c2WAIC316Gb9OcttC8nbw==", + "version": "3.68.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.68.0.tgz", + "integrity": "sha512-s+GMHy9C5pX8FdyYdTrnue5H/OH41214qgIjXF1aPYzNveDsDTF1H1pFwJcDXYQO2wE3UEH0sV4nEyKXXyNjBA==", "dependencies": { "@maskito/angular": "1.9.0", "@maskito/core": "1.9.0", @@ -4845,19 +4845,19 @@ "@ng-web-apis/common": "3.0.6", "@ng-web-apis/mutation-observer": "3.1.0", "@ng-web-apis/resize-observer": "3.0.6", - "@taiga-ui/cdk": "^3.65.0", - "@taiga-ui/core": "^3.65.0", - "@taiga-ui/i18n": "^3.65.0", + "@taiga-ui/cdk": "^3.68.0", + "@taiga-ui/core": "^3.68.0", + "@taiga-ui/i18n": "^3.68.0", "@tinkoff/ng-polymorpheus": "4.3.0", "rxjs": ">=6.0.0" } }, "node_modules/@taiga-ui/styles": { - "version": "3.65.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/styles/-/styles-3.65.0.tgz", - "integrity": "sha512-HO2sZPxNOGj2BPQpWkrM6HgZV/QxaEMEemye3sJvsfuttvk6bmxoL8NF331I63tlp/Zx7woD8AusH5ATuUniqg==", + "version": "3.68.0", + "resolved": "https://registry.npmjs.org/@taiga-ui/styles/-/styles-3.68.0.tgz", + "integrity": "sha512-7iC+T2ManhjCzPqw3e3H2vt3Bn9op555tio6WROhnsxakOdUrZbPiVZGaKcIlZ27ZjPbYKxL1NeCmaiviuphOw==", "peerDependencies": { - "@taiga-ui/cdk": "^3.65.0", + "@taiga-ui/cdk": "^3.68.0", "tslib": "2.6.2" } }, diff --git a/web/package.json b/web/package.json index e80feeea9..20a75be0b 100644 --- a/web/package.json +++ b/web/package.json @@ -46,15 +46,15 @@ "@start9labs/argon2": "^0.1.0", "@start9labs/emver": "^0.1.5", "@start9labs/start-sdk": "0.4.0-rev0.lib0.rc8.beta2", - "@taiga-ui/addon-charts": "3.65.0", - "@taiga-ui/addon-commerce": "3.65.0", - "@taiga-ui/addon-mobile": "3.65.0", - "@taiga-ui/cdk": "3.65.0", - "@taiga-ui/core": "3.65.0", - "@taiga-ui/experimental": "3.65.0", - "@taiga-ui/icons": "3.65.0", - "@taiga-ui/kit": "3.65.0", - "@taiga-ui/styles": "3.65.0", + "@taiga-ui/addon-charts": "3.68.0", + "@taiga-ui/addon-commerce": "3.68.0", + "@taiga-ui/addon-mobile": "3.68.0", + "@taiga-ui/cdk": "3.68.0", + "@taiga-ui/core": "3.68.0", + "@taiga-ui/experimental": "3.68.0", + "@taiga-ui/icons": "3.68.0", + "@taiga-ui/kit": "3.68.0", + "@taiga-ui/styles": "3.68.0", "@tinkoff/ng-dompurify": "4.0.0", "@tinkoff/ng-event-plugins": "3.1.0", "ansi-to-html": "^0.7.2", diff --git a/web/projects/shared/src/components/ticker/ticker.component.scss b/web/projects/shared/src/components/ticker/ticker.component.scss index a94230795..0c1fbd505 100644 --- a/web/projects/shared/src/components/ticker/ticker.component.scss +++ b/web/projects/shared/src/components/ticker/ticker.component.scss @@ -1,4 +1,5 @@ :host { + max-width: 100%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; diff --git a/web/projects/shared/src/directives/enter/enter.directive.ts b/web/projects/shared/src/directives/enter/enter.directive.ts deleted file mode 100644 index 8d3d6a399..000000000 --- a/web/projects/shared/src/directives/enter/enter.directive.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Directive, HostListener, Inject } from '@angular/core' -import { DOCUMENT } from '@angular/common' -import { debounce } from '../../util/misc.util' - -@Directive({ - selector: '[appEnter]', -}) -export class EnterDirective { - constructor(@Inject(DOCUMENT) private readonly document: Document) {} - - @HostListener('document:keydown.enter') - @debounce() - handleKeyboardEvent() { - const elems = this.document.querySelectorAll('.enter-click') - const elem = elems[elems.length - 1] as HTMLButtonElement - - if (elem && !elem.classList.contains('no-click') && !elem.disabled) { - elem.click() - } - } -} diff --git a/web/projects/shared/src/directives/enter/enter.module.ts b/web/projects/shared/src/directives/enter/enter.module.ts deleted file mode 100644 index 776f2eb38..000000000 --- a/web/projects/shared/src/directives/enter/enter.module.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { NgModule } from '@angular/core' - -import { EnterDirective } from './enter.directive' - -@NgModule({ - declarations: [EnterDirective], - exports: [EnterDirective], -}) -export class EnterModule {} diff --git a/web/projects/shared/src/public-api.ts b/web/projects/shared/src/public-api.ts index 61d4e76fd..78ba1abd8 100644 --- a/web/projects/shared/src/public-api.ts +++ b/web/projects/shared/src/public-api.ts @@ -18,8 +18,6 @@ export * from './components/drive.component' export * from './directives/drag-scroller.directive' export * from './directives/safe-links.directive' -export * from './directives/enter/enter.directive' -export * from './directives/enter/enter.module' export * from './mocks/get-setup-status' @@ -42,11 +40,6 @@ export * from './services/http.service' export * from './services/setup.service' export * from './services/setup-logs.service' -export * from './themes/dark-theme/dark-theme.component' -export * from './themes/dark-theme/dark-theme.module' -export * from './themes/light-theme/light-theme.component' -export * from './themes/light-theme/light-theme.module' - export * from './types/api' export * from './types/constructor' export * from './types/http.types' diff --git a/web/projects/shared/src/themes/dark-theme/dark-theme.component.scss b/web/projects/shared/src/themes/dark-theme/dark-theme.component.scss deleted file mode 100644 index 48e6526df..000000000 --- a/web/projects/shared/src/themes/dark-theme/dark-theme.component.scss +++ /dev/null @@ -1 +0,0 @@ -@import '../../../styles/variables'; diff --git a/web/projects/shared/src/themes/dark-theme/dark-theme.component.ts b/web/projects/shared/src/themes/dark-theme/dark-theme.component.ts deleted file mode 100644 index 2f80a5efb..000000000 --- a/web/projects/shared/src/themes/dark-theme/dark-theme.component.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - ViewEncapsulation, -} from '@angular/core' -import { AbstractTuiThemeSwitcher } from '@taiga-ui/cdk' - -@Component({ - selector: 'dark-theme', - template: '', - styleUrls: ['./dark-theme.component.scss'], - encapsulation: ViewEncapsulation.None, - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class DarkThemeComponent extends AbstractTuiThemeSwitcher {} diff --git a/web/projects/shared/src/themes/dark-theme/dark-theme.module.ts b/web/projects/shared/src/themes/dark-theme/dark-theme.module.ts deleted file mode 100644 index f383e201f..000000000 --- a/web/projects/shared/src/themes/dark-theme/dark-theme.module.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { NgModule } from '@angular/core' - -import { DarkThemeComponent } from './dark-theme.component' - -@NgModule({ - declarations: [DarkThemeComponent], - exports: [DarkThemeComponent], -}) -export class DarkThemeModule {} diff --git a/web/projects/shared/src/themes/light-theme/light-theme.component.scss b/web/projects/shared/src/themes/light-theme/light-theme.component.scss deleted file mode 100644 index 33be8c8a9..000000000 --- a/web/projects/shared/src/themes/light-theme/light-theme.component.scss +++ /dev/null @@ -1,95 +0,0 @@ -// Ionic Variables and Theming. For more info, please see: -// http://ionicframework.com/docs/theming/ - -/** Ionic CSS Variables **/ -:root { - --ion-color-primary: #0075e1; - --ion-color-primary-rgb: 66, 140, 255; - --ion-color-primary-contrast: #ffffff; - --ion-color-primary-contrast-rgb: 255, 255, 255; - --ion-color-primary-shade: #3a7be0; - --ion-color-primary-tint: #5598ff; - - --ion-color-secondary: #50c8ff; - --ion-color-secondary-rgb: 80, 200, 255; - --ion-color-secondary-contrast: #ffffff; - --ion-color-secondary-contrast-rgb: 255, 255, 255; - --ion-color-secondary-shade: #46b0e0; - --ion-color-secondary-tint: #62ceff; - - --ion-color-tertiary: #6a64ff; - --ion-color-tertiary-rgb: 106, 100, 255; - --ion-color-tertiary-contrast: #ffffff; - --ion-color-tertiary-contrast-rgb: 255, 255, 255; - --ion-color-tertiary-shade: #5d58e0; - --ion-color-tertiary-tint: #7974ff; - - --ion-color-success: #2fdf75; - --ion-color-success-rgb: 47, 223, 117; - --ion-color-success-contrast: #000000; - --ion-color-success-contrast-rgb: 0, 0, 0; - --ion-color-success-shade: #29c467; - --ion-color-success-tint: #44e283; - - --ion-color-warning: #ffb506; - --ion-color-warning-rgb: 255, 213, 52; - --ion-color-warning-contrast: #000000; - --ion-color-warning-contrast-rgb: 0, 0, 0; - --ion-color-warning-shade: #e0bb2e; - --ion-color-warning-tint: #ffd534; - - --ion-color-danger: #ff4961; - --ion-color-danger-rgb: 255, 73, 97; - --ion-color-danger-contrast: #ffffff; - --ion-color-danger-contrast-rgb: 255, 255, 255; - --ion-color-danger-shade: #e04055; - --ion-color-danger-tint: #ff5b71; - - //--ion-color-light: #f4f5f8; - //--ion-color-light-rgb: 244, 245, 248; - //--ion-color-light-contrast: #000000; - //--ion-color-light-contrast-rgb: 0, 0, 0; - //--ion-color-light-shade: #d7d8da; - //--ion-color-light-tint: #f5f6f9; - // - //--ion-color-medium: #f4f5f8; - //--ion-color-medium-rgb: 244, 245, 248; - //--ion-color-medium-contrast: #000000; - //--ion-color-medium-contrast-rgb: 0, 0, 0; - //--ion-color-medium-shade: #d7d8da; - //--ion-color-medium-tint: #f5f6f9; - // - //--ion-color-dark: #92949c; - //--ion-color-dark-rgb: 146, 148, 156; - //--ion-color-dark-contrast: #ffffff; - //--ion-color-dark-contrast-rgb: 255, 255, 255; - //--ion-color-dark-shade: #808289; - //--ion-color-dark-tint: #9d9fa6; - - --ion-color-step-50: #f2f2f2; - --ion-color-step-100: #e6e6e6; - --ion-color-step-150: #d9d9d9; - --ion-color-step-200: #cccccc; - --ion-color-step-250: #bfbfbf; - --ion-color-step-300: #b3b3b3; - --ion-color-step-350: #a6a6a6; - --ion-color-step-400: #999999; - --ion-color-step-450: #8c8c8c; - --ion-color-step-500: #808080; - --ion-color-step-550: #737373; - --ion-color-step-600: #666666; - --ion-color-step-650: #595959; - --ion-color-step-700: #4d4d4d; - --ion-color-step-750: #404040; - --ion-color-step-800: #333333; - --ion-color-step-850: #262626; - --ion-color-step-900: #191919; - --ion-color-step-950: #0d0d0d; - - --alt-red: #ff4961; - --alt-orange: #f89248; - --alt-yellow: #e5d53e; - --alt-green: #3dcf6f; - --alt-blue: #00a8a8; - --alt-purple: #9747ff; -} diff --git a/web/projects/shared/src/themes/light-theme/light-theme.component.ts b/web/projects/shared/src/themes/light-theme/light-theme.component.ts deleted file mode 100644 index 1c3d7d366..000000000 --- a/web/projects/shared/src/themes/light-theme/light-theme.component.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - ViewEncapsulation, -} from '@angular/core' -import { AbstractTuiThemeSwitcher } from '@taiga-ui/cdk' - -@Component({ - selector: 'light-theme', - template: '', - styleUrls: ['./light-theme.component.scss'], - encapsulation: ViewEncapsulation.None, - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class LightThemeComponent extends AbstractTuiThemeSwitcher {} diff --git a/web/projects/shared/src/themes/light-theme/light-theme.module.ts b/web/projects/shared/src/themes/light-theme/light-theme.module.ts deleted file mode 100644 index a9f9554e9..000000000 --- a/web/projects/shared/src/themes/light-theme/light-theme.module.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { NgModule } from '@angular/core' - -import { LightThemeComponent } from './light-theme.component' - -@NgModule({ - declarations: [LightThemeComponent], - exports: [LightThemeComponent], -}) -export class LightThemeModule {} diff --git a/web/projects/ui/src/app/app.component.html b/web/projects/ui/src/app/app.component.html index c588d56ac..b8024eef8 100644 --- a/web/projects/ui/src/app/app.component.html +++ b/web/projects/ui/src/app/app.component.html @@ -1,101 +1,31 @@ - - - - - - - - - - - + + + + - - - - - - - - -
    - -
    -
    - - - - -
    - -
    + +
    - -
    -
    - - - -
    +
    - - - - - - - - + + +@if (auth.isVerified$ | async) { + @switch (theme$ | async) { + @case ('Dark') { + + } + } +} @else { - - +} diff --git a/web/projects/ui/src/app/app.component.scss b/web/projects/ui/src/app/app.component.scss index 295b01263..2cf185479 100644 --- a/web/projects/ui/src/app/app.component.scss +++ b/web/projects/ui/src/app/app.component.scss @@ -7,16 +7,6 @@ tui-root { height: 100%; } -.left-menu { - --side-max-width: 280px; -} - -.menu { - :host-context(body[data-theme='Light']) & { - --ion-color-base: #f4f4f5 !important; - } -} - .container { max-width: 100%; transition: filter 0.3s; @@ -24,110 +14,4 @@ tui-root { &_offline { filter: saturate(0.75) contrast(0.85); } - - @media screen and (max-width: 991.499px) { - --widgets-width: 0px; - } -} - -.right-menu { - --side-max-width: 600px; - - position: fixed; - z-index: 1000; - right: 0; - left: auto; - top: 74px; - - // For some reason *ngIf is broken upon first login - &_hidden { - display: none; - } -} - -.divider { - height: 100%; - width: 10px; - pointer-events: none; - - position: absolute; - left: 0; - top: 0; - bottom: 0; - - background: #e2e2e2; - - z-index: 10; - opacity: 0.2; - transition: opacity 0.3s; - - &:before, - &:after { - content: ''; - position: absolute; - top: 50%; - margin-top: -78px; - left: 10px; - width: 60px; - height: 50px; - border-bottom-left-radius: 14px; - box-shadow: -14px 0 0 -1px #e2e2e2; - } - - &:after { - margin-top: 28px; - border-radius: 0; - border-top-left-radius: 14px; - } - - &:hover { - opacity: 0.4; - } -} - -.widgets-button { - position: absolute; - top: 50%; - font-size: 0; - left: 100%; - width: 16px; - height: 60px; - margin-top: -30px; - border-top-right-radius: 10px; - border-bottom-right-radius: 10px; - background: inherit; - pointer-events: auto; - - &:before, - &:after { - content: ''; - position: absolute; - top: 50%; - left: 3px; - width: 2px; - height: 8px; - background: black; - transform: rotate(-45deg); - border-radius: 2px; - } - - &:before { - margin-top: -5px; - transform: rotate(45deg); - } - - &_collapse:before { - transform: rotate(-45deg); - } - - &_collapse:after { - transform: rotate(45deg); - } -} - -.definitions { - position: absolute; - width: 0; - height: 0; - visibility: hidden; } diff --git a/web/projects/ui/src/app/app.component.ts b/web/projects/ui/src/app/app.component.ts index aed5b066a..93ff394da 100644 --- a/web/projects/ui/src/app/app.component.ts +++ b/web/projects/ui/src/app/app.component.ts @@ -1,50 +1,36 @@ -import { Component, inject, OnDestroy } from '@angular/core' -import { Router } from '@angular/router' -import { combineLatest, map, merge, startWith } from 'rxjs' -import { AuthService } from './services/auth.service' -import { SplitPaneTracker } from './services/split-pane.service' -import { PatchDataService } from './services/patch-data.service' -import { PatchMonitorService } from './services/patch-monitor.service' -import { ConnectionService } from './services/connection.service' +import { Component, inject, OnInit } from '@angular/core' +import { takeUntilDestroyed } from '@angular/core/rxjs-interop' import { Title } from '@angular/platform-browser' -import { - ClientStorageService, - WidgetDrawer, -} from './services/client-storage.service' -import { ThemeSwitcherService } from './services/theme-switcher.service' import { THEME } from '@start9labs/shared' import { PatchDB } from 'patch-db-client' +import { combineLatest, map, merge, startWith } from 'rxjs' +import { AuthService } from './services/auth.service' +import { ConnectionService } from './services/connection.service' +import { PatchDataService } from './services/patch-data.service' import { DataModel } from './services/patch-db/data-model' -import { slideInAnimation } from './route-animation' - -function hasNavigation(url: string): boolean { - return ( - !url.startsWith('/loading') && - !url.startsWith('/diagnostic') && - !url.startsWith('/portal') - ) -} +import { PatchMonitorService } from './services/patch-monitor.service' @Component({ selector: 'app-root', templateUrl: 'app.component.html', styleUrls: ['app.component.scss'], - animations: [slideInAnimation], }) -export class AppComponent implements OnDestroy { - readonly subscription = merge(this.patchData, this.patchMonitor).subscribe() - readonly sidebarOpen$ = this.splitPane.sidebarOpen$ - readonly widgetDrawer$ = this.clientStorageService.widgetDrawer$ +export class AppComponent implements OnInit { + private readonly title = inject(Title) + private readonly patch = inject(PatchDB) + + readonly auth = inject(AuthService) readonly theme$ = inject(THEME) - // @TODO theres a bug here disabling the side menu from appearing on first login; refresh fixes - readonly navigation$ = combineLatest([ - this.authService.isVerified$, - this.router.events.pipe(map(() => hasNavigation(this.router.url))), - ]).pipe(map(([isVerified, hasNavigation]) => isVerified && hasNavigation)) + readonly subscription = merge( + inject(PatchDataService), + inject(PatchMonitorService), + ) + .pipe(takeUntilDestroyed()) + .subscribe() readonly offline$ = combineLatest([ - this.authService.isVerified$, - this.connection.connected$, + inject(ConnectionService).connected$, + this.auth.isVerified$, this.patch .watch$('server-info', 'status-info') .pipe(startWith({ restarting: false, 'shutting-down': false })), @@ -56,37 +42,9 @@ export class AppComponent implements OnDestroy { ), ) - constructor( - private readonly router: Router, - private readonly titleService: Title, - private readonly patchData: PatchDataService, - private readonly patchMonitor: PatchMonitorService, - private readonly splitPane: SplitPaneTracker, - private readonly patch: PatchDB, - readonly authService: AuthService, - readonly connection: ConnectionService, - readonly clientStorageService: ClientStorageService, - readonly themeSwitcher: ThemeSwitcherService, - ) {} - async ngOnInit() { this.patch .watch$('ui', 'name') - .subscribe(name => this.titleService.setTitle(name || 'StartOS')) - } - - splitPaneVisible({ detail }: any) { - this.splitPane.sidebarOpen$.next(detail.visible) - } - - onResize(drawer: WidgetDrawer) { - this.clientStorageService.updateWidgetDrawer({ - ...drawer, - width: drawer.width === 400 ? 600 : 400, - }) - } - - ngOnDestroy() { - this.subscription.unsubscribe() + .subscribe(name => this.title.setTitle(name || 'StartOS')) } } diff --git a/web/projects/ui/src/app/app.module.ts b/web/projects/ui/src/app/app.module.ts index 9a42a28e4..2457c07bd 100644 --- a/web/projects/ui/src/app/app.module.ts +++ b/web/projects/ui/src/app/app.module.ts @@ -3,15 +3,7 @@ import { NgModule } from '@angular/core' import { BrowserAnimationsModule } from '@angular/platform-browser/animations' import { ServiceWorkerModule } from '@angular/service-worker' import { IonicModule } from '@ionic/angular' -import { MonacoEditorModule } from '@materia-ui/ngx-monaco-editor' -import { - DarkThemeModule, - EnterModule, - LightThemeModule, - LoadingModule, - MarkdownModule, - SharedPipesModule, -} from '@start9labs/shared' +import { LoadingModule } from '@start9labs/shared' import { TuiAlertModule, TuiDialogModule, @@ -19,17 +11,12 @@ import { TuiRootModule, TuiThemeNightModule, } from '@taiga-ui/core' +import { SidebarHostComponent } from 'src/app/common/sidebar-host.component' +import { SvgDefinitionsComponent } from 'src/app/common/svg-definitions.component' +import { ToastContainerComponent } from 'src/app/common/toast-container/toast-container.component' import { environment } from '../environments/environment' import { AppComponent } from './app.component' import { APP_PROVIDERS } from './app.providers' -import { ConnectionBarComponentModule } from './app/connection-bar/connection-bar.component.module' -import { FooterModule } from './app/footer/footer.module' -import { MenuModule } from './app/menu/menu.module' -import { PreloaderModule } from './app/preloader/preloader.module' -import { SidebarHostComponent } from './app/sidebar-host.component' -import { OSWelcomePageModule } from './common/os-welcome/os-welcome.module' -import { QRComponentModule } from './common/qr/qr.module' -import { ToastContainerModule } from './common/toast-container/toast-container.module' import { RoutingModule } from './routing.module' @NgModule({ @@ -41,23 +28,12 @@ import { RoutingModule } from './routing.module' mode: 'md', }), RoutingModule, - MenuModule, - PreloaderModule, - FooterModule, - EnterModule, - OSWelcomePageModule, - MarkdownModule, - MonacoEditorModule, - SharedPipesModule, - ToastContainerModule, - ConnectionBarComponentModule, + ToastContainerComponent, TuiRootModule, TuiDialogModule, TuiAlertModule, TuiModeModule, TuiThemeNightModule, - DarkThemeModule, - LightThemeModule, ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.useServiceWorker, // Register the ServiceWorker as soon as the application is stable @@ -65,8 +41,8 @@ import { RoutingModule } from './routing.module' registrationStrategy: 'registerWhenStable:30000', }), LoadingModule, - QRComponentModule, SidebarHostComponent, + SvgDefinitionsComponent, ], providers: APP_PROVIDERS, bootstrap: [AppComponent], diff --git a/web/projects/ui/src/app/app/connection-bar/connection-bar.component.html b/web/projects/ui/src/app/app/connection-bar/connection-bar.component.html deleted file mode 100644 index 3af0f2120..000000000 --- a/web/projects/ui/src/app/app/connection-bar/connection-bar.component.html +++ /dev/null @@ -1,16 +0,0 @@ - -
    - -

    {{ connection.message }}

    - -
    -
    diff --git a/web/projects/ui/src/app/app/connection-bar/connection-bar.component.module.ts b/web/projects/ui/src/app/app/connection-bar/connection-bar.component.module.ts deleted file mode 100644 index c67816642..000000000 --- a/web/projects/ui/src/app/app/connection-bar/connection-bar.component.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { ConnectionBarComponent } from './connection-bar.component' - -@NgModule({ - declarations: [ConnectionBarComponent], - imports: [CommonModule, IonicModule], - exports: [ConnectionBarComponent], -}) -export class ConnectionBarComponentModule {} diff --git a/web/projects/ui/src/app/app/connection-bar/connection-bar.component.scss b/web/projects/ui/src/app/app/connection-bar/connection-bar.component.scss deleted file mode 100644 index 1f9826193..000000000 --- a/web/projects/ui/src/app/app/connection-bar/connection-bar.component.scss +++ /dev/null @@ -1,9 +0,0 @@ -.connection-toolbar { - padding: 0 24px; - --min-height: 36px; -} - -.icon { - font-size: 23px; - padding-right: 12px; -} \ No newline at end of file diff --git a/web/projects/ui/src/app/app/connection-bar/connection-bar.component.ts b/web/projects/ui/src/app/app/connection-bar/connection-bar.component.ts deleted file mode 100644 index 9c4b07b7f..000000000 --- a/web/projects/ui/src/app/app/connection-bar/connection-bar.component.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' -import { PatchDB } from 'patch-db-client' -import { combineLatest, map, Observable, startWith } from 'rxjs' -import { ConnectionService } from 'src/app/services/connection.service' -import { DataModel } from 'src/app/services/patch-db/data-model' - -@Component({ - selector: 'connection-bar', - templateUrl: './connection-bar.component.html', - styleUrls: ['./connection-bar.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class ConnectionBarComponent { - private readonly websocket$ = this.connectionService.websocketConnected$ - - readonly connection$: Observable<{ - message: string - color: string - icon: string - dots: boolean - }> = combineLatest([ - this.connectionService.networkConnected$, - this.websocket$.pipe(startWith(false)), - this.patch - .watch$('server-info', 'status-info') - .pipe(startWith({ restarting: false, 'shutting-down': false })), - ]).pipe( - map(([network, websocket, status]) => { - if (!network) - return { - message: 'No Internet', - color: 'danger', - icon: 'cloud-offline-outline', - dots: false, - } - if (!websocket) - return { - message: 'Connecting', - color: 'warning', - icon: 'cloud-offline-outline', - dots: true, - } - if (status['shutting-down']) - return { - message: 'Shutting Down', - color: 'dark', - icon: 'power', - dots: true, - } - if (status.restarting) - return { - message: 'Restarting', - color: 'dark', - icon: 'power', - dots: true, - } - - return { - message: 'Connected', - color: 'success', - icon: 'cloud-done', - dots: false, - } - }), - ) - - constructor( - private readonly connectionService: ConnectionService, - private readonly patch: PatchDB, - ) {} -} diff --git a/web/projects/ui/src/app/app/footer/footer.component.html b/web/projects/ui/src/app/app/footer/footer.component.html deleted file mode 100644 index 306ceca67..000000000 --- a/web/projects/ui/src/app/app/footer/footer.component.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - Downloading: - {{ getProgress(progress.size, progress.downloaded) }}% - - - - - - - Calculating download size - - - - - diff --git a/web/projects/ui/src/app/app/footer/footer.component.scss b/web/projects/ui/src/app/app/footer/footer.component.scss deleted file mode 100644 index cd737e850..000000000 --- a/web/projects/ui/src/app/app/footer/footer.component.scss +++ /dev/null @@ -1,9 +0,0 @@ -.list { - box-shadow: inset 0 1px var(--ion-color-dark); - box-sizing: border-box; -} - -.progress { - width: auto; - margin: 0 16px 16px 16px; -} diff --git a/web/projects/ui/src/app/app/footer/footer.component.ts b/web/projects/ui/src/app/app/footer/footer.component.ts deleted file mode 100644 index c630418fd..000000000 --- a/web/projects/ui/src/app/app/footer/footer.component.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' -import { PatchDB } from 'patch-db-client' -import { map } from 'rxjs' -import { heightCollapse } from 'src/app/util/animations' -import { DataModel } from 'src/app/services/patch-db/data-model' - -@Component({ - selector: 'footer[appFooter]', - templateUrl: 'footer.component.html', - styleUrls: ['footer.component.scss'], - animations: [heightCollapse], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class FooterComponent { - readonly progress$ = this.patch - .watch$('server-info', 'status-info', 'update-progress') - .pipe(map(a => a && { ...a })) - - readonly animation = { - value: '', - params: { - duration: 1000, - delay: 50, - }, - } - - constructor(private readonly patch: PatchDB) {} - - getProgress(size: number, downloaded: number): number { - return Math.round((100 * downloaded) / (size || 1)) - } -} diff --git a/web/projects/ui/src/app/app/footer/footer.module.ts b/web/projects/ui/src/app/app/footer/footer.module.ts deleted file mode 100644 index c76e4b26e..000000000 --- a/web/projects/ui/src/app/app/footer/footer.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { CommonModule } from '@angular/common' -import { NgModule } from '@angular/core' -import { IonicModule } from '@ionic/angular' - -import { FooterComponent } from './footer.component' - -@NgModule({ - imports: [CommonModule, IonicModule], - declarations: [FooterComponent], - exports: [FooterComponent], -}) -export class FooterModule {} diff --git a/web/projects/ui/src/app/app/menu/menu.component.html b/web/projects/ui/src/app/app/menu/menu.component.html deleted file mode 100644 index 58892db0d..000000000 --- a/web/projects/ui/src/app/app/menu/menu.component.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - {{ page.title }} - - - - - {{ updateCount }} - - - {{ notificaitonCount }} - - - - -Play Snake - - - diff --git a/web/projects/ui/src/app/app/menu/menu.component.scss b/web/projects/ui/src/app/app/menu/menu.component.scss deleted file mode 100644 index a7c8c762f..000000000 --- a/web/projects/ui/src/app/app/menu/menu.component.scss +++ /dev/null @@ -1,49 +0,0 @@ -:host { - display: block; -} - -.logo { - display: block; - width: 36%; - margin: 0 auto; - padding: 16px 16px 0 16px; -} - -.menu { - padding: 30px 0; -} - -.link { - --border-radius: 0; - - :host-context(body[data-theme='Light']) &_selected { - --ion-color-base: #333; - --ion-color-contrast: #fff; - } -} - -.icon { - margin-left: 10px; -} - -.label { - color: var(--ion-color-dark-shade); - - &_selected { - color: var(--ion-color-dark); - font-weight: bold; - } -} - -.snek { - position: absolute; - bottom: 56px; - right: 20px; - width: 20px; - cursor: pointer; -} - -.bottom { - position: absolute; - bottom: 0; -} diff --git a/web/projects/ui/src/app/app/menu/menu.component.ts b/web/projects/ui/src/app/app/menu/menu.component.ts deleted file mode 100644 index 268a7167d..000000000 --- a/web/projects/ui/src/app/app/menu/menu.component.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - inject, - Inject, -} from '@angular/core' -import { EOSService } from 'src/app/services/eos.service' -import { PatchDB } from 'patch-db-client' -import { - combineLatest, - filter, - first, - map, - Observable, - pairwise, - startWith, - switchMap, -} from 'rxjs' -import { AbstractMarketplaceService } from '@start9labs/marketplace' -import { MarketplaceService } from 'src/app/services/marketplace.service' -import { DataModel } from 'src/app/services/patch-db/data-model' -import { SplitPaneTracker } from 'src/app/services/split-pane.service' -import { Emver, THEME } from '@start9labs/shared' -import { ConnectionService } from 'src/app/services/connection.service' -import { ConfigService } from 'src/app/services/config.service' - -@Component({ - selector: 'app-menu', - templateUrl: 'menu.component.html', - styleUrls: ['menu.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class MenuComponent { - readonly pages = [ - { - title: 'Services', - url: '/services', - icon: 'grid-outline', - }, - { - title: 'Marketplace', - url: '/marketplace', - icon: 'storefront-outline', - }, - { - title: 'Updates', - url: '/updates', - icon: 'globe-outline', - }, - { - title: 'Backups', - url: '/backups', - icon: 'save-outline', - }, - { - title: 'Notifications', - url: '/notifications', - icon: 'notifications-outline', - }, - { - title: 'System', - url: '/system', - icon: 'construct-outline', - }, - ] - - readonly notificationCount$ = this.patch.watch$( - 'server-info', - 'unreadNotifications', - 'count', - ) - - readonly snekScore$ = this.patch.watch$('ui', 'gaming', 'snake', 'high-score') - - readonly showEOSUpdate$ = this.eosService.showUpdate$ - - private readonly local$ = this.connectionService.connected$.pipe( - filter(Boolean), - switchMap(() => this.patch.watch$('package-data').pipe(first())), - switchMap(outer => - this.patch.watch$('package-data').pipe( - pairwise(), - filter(([prev, curr]) => - Object.values(prev).some(p => { - const c = curr[p.manifest.id] - return !c || (p['install-progress'] && !c['install-progress']) - }), - ), - map(([_, curr]) => curr), - startWith(outer), - ), - ), - ) - - readonly updateCount$: Observable = combineLatest([ - this.marketplaceService.getMarketplace$(true), - this.local$, - ]).pipe( - map(([marketplace, local]) => - Object.entries(marketplace).reduce((list, [_, store]) => { - store?.packages.forEach(({ manifest: { id, version } }) => { - if (this.emver.compare(version, local[id]?.manifest.version) === 1) - list.add(id) - }) - return list - }, new Set()), - ), - map(list => list.size), - ) - - readonly sidebarOpen$ = this.splitPane.sidebarOpen$ - - readonly theme$ = inject(THEME) - - readonly warning$ = this.patch - .watch$('server-info', 'ntp-synced') - .pipe(map(synced => !synced)) - - constructor( - private readonly patch: PatchDB, - private readonly eosService: EOSService, - @Inject(AbstractMarketplaceService) - private readonly marketplaceService: MarketplaceService, - private readonly splitPane: SplitPaneTracker, - private readonly emver: Emver, - private readonly connectionService: ConnectionService, - private readonly config: ConfigService, - ) {} -} diff --git a/web/projects/ui/src/app/app/menu/menu.module.ts b/web/projects/ui/src/app/app/menu/menu.module.ts deleted file mode 100644 index 72a3fec9d..000000000 --- a/web/projects/ui/src/app/app/menu/menu.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { CommonModule } from '@angular/common' -import { NgModule } from '@angular/core' -import { RouterModule } from '@angular/router' -import { IonicModule } from '@ionic/angular' -import { MenuComponent } from './menu.component' -import { SnekModule } from '../snek/snek.module' -import { ConnectionBarComponentModule } from '../connection-bar/connection-bar.component.module' - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule, - SnekModule, - ConnectionBarComponentModule, - ], - declarations: [MenuComponent], - exports: [MenuComponent], -}) -export class MenuModule {} diff --git a/web/projects/ui/src/app/app/preloader/preloader.component.html b/web/projects/ui/src/app/app/preloader/preloader.component.html deleted file mode 100644 index b26815f2c..000000000 --- a/web/projects/ui/src/app/app/preloader/preloader.component.html +++ /dev/null @@ -1,82 +0,0 @@ -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - load bold font - - - - - - - - - - - - -
    - -
    - -

    a

    -

    a

    -

    a

    -

    a

    -

    a

    -

    a

    -

    a

    -

    a

    -

    a

    -
    diff --git a/web/projects/ui/src/app/app/preloader/preloader.component.ts b/web/projects/ui/src/app/app/preloader/preloader.component.ts deleted file mode 100644 index de77bb500..000000000 --- a/web/projects/ui/src/app/app/preloader/preloader.component.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core' - -// TODO: Turn into DI token if this is needed someplace else too -const ICONS = [ - 'add', - 'alarm-outline', - 'alert-outline', - 'alert-circle-outline', - 'aperture-outline', - 'archive-outline', - 'arrow-back', - 'arrow-forward', - 'arrow-up', - 'brush-outline', - 'bookmark-outline', - 'cellular-outline', - 'chatbubbles-outline', - 'checkmark', - 'chevron-down', - 'chevron-up', - 'chevron-forward', - 'close', - 'close-circle-outline', - 'cloud-outline', - 'cloud-done', - 'cloud-done-outline', - 'cloud-download-outline', - 'cloud-offline-outline', - 'cloud-upload-outline', - 'code-outline', - 'color-wand-outline', - 'construct-outline', - 'copy-outline', - 'desktop-outline', - 'download-outline', - 'duplicate-outline', - 'earth-outline', - 'ellipsis-horizontal', - 'eye-off-outline', - 'eye-outline', - 'file-tray-stacked-outline', - 'finger-print-outline', - 'flash-outline', - 'flask-outline', - 'flash-off-outline', - 'folder-open-outline', - 'globe-outline', - 'grid-outline', - 'hammer-outline', - 'help-circle-outline', - 'hammer-outline', - 'information-circle-outline', - 'key-outline', - 'list-outline', - 'log-out-outline', - 'logo-bitcoin', - 'mail-outline', - 'map-outline', - 'medkit-outline', - 'notifications-outline', - 'open-outline', - 'options-outline', - 'pencil', - 'phone-portrait-outline', - 'play-circle-outline', - 'play-outline', - 'power', - 'pricetag-outline', - 'pulse', - 'push-outline', - 'qr-code-outline', - 'radio-outline', - 'receipt-outline', - 'refresh', - 'reload', - 'remove', - 'remove-circle-outline', - 'remove-outline', - 'repeat-outline', - 'ribbon-outline', - 'rocket-outline', - 'save-outline', - 'server-outline', - 'settings-outline', - 'shield-outline', - 'shuffle-outline', - 'stop-outline', - 'stopwatch-outline', - 'storefront-outline', - 'swap-vertical', - 'terminal-outline', - 'trail-sign-outline', - 'trash', - 'trash-outline', - 'warning-outline', - 'wifi', -] - -@Component({ - selector: 'section[appPreloader]', - templateUrl: 'preloader.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class PreloaderComponent { - readonly icons = ICONS -} diff --git a/web/projects/ui/src/app/app/preloader/preloader.module.ts b/web/projects/ui/src/app/app/preloader/preloader.module.ts deleted file mode 100644 index b1496e638..000000000 --- a/web/projects/ui/src/app/app/preloader/preloader.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CommonModule } from '@angular/common' -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core' -import { IonicModule } from '@ionic/angular' -import { QrCodeModule } from 'ng-qrcode' -import { PreloaderComponent } from './preloader.component' - -@NgModule({ - imports: [CommonModule, IonicModule, QrCodeModule], - declarations: [PreloaderComponent], - exports: [PreloaderComponent], - schemas: [CUSTOM_ELEMENTS_SCHEMA], -}) -export class PreloaderModule {} diff --git a/web/projects/ui/src/app/app/snek/snake.page.html b/web/projects/ui/src/app/app/snek/snake.page.html deleted file mode 100644 index 1fc48c47c..000000000 --- a/web/projects/ui/src/app/app/snek/snake.page.html +++ /dev/null @@ -1,8 +0,0 @@ -
    - -
    -
    - Score: {{ score }} - High Score: {{ highScore }} - -
    diff --git a/web/projects/ui/src/app/app/snek/snake.page.scss b/web/projects/ui/src/app/app/snek/snake.page.scss deleted file mode 100644 index 50605f1dc..000000000 --- a/web/projects/ui/src/app/app/snek/snake.page.scss +++ /dev/null @@ -1,14 +0,0 @@ -.canvas-center { - min-height: 50vh; - padding-top: 20px; - display: flex; - align-items: center; - justify-content: center; -} - -.footer { - display: flex; - align-items: center; - justify-content: space-between; - padding-top: 32px; -} diff --git a/web/projects/ui/src/app/app/snek/snake.page.ts b/web/projects/ui/src/app/app/snek/snake.page.ts deleted file mode 100644 index eeadb9df0..000000000 --- a/web/projects/ui/src/app/app/snek/snake.page.ts +++ /dev/null @@ -1,273 +0,0 @@ -import { - AfterViewInit, - Component, - HostListener, - Inject, - OnDestroy, -} from '@angular/core' -import { pauseFor } from '@start9labs/shared' -import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' -import { TuiDialogContext } from '@taiga-ui/core' -import { DOCUMENT } from '@angular/common' - -@Component({ - selector: 'snake', - templateUrl: './snake.page.html', - styleUrls: ['./snake.page.scss'], -}) -export class SnakePage implements AfterViewInit, OnDestroy { - highScore = this.dialog.data.highScore - - score = 0 - - private readonly speed = 45 - private readonly width = 40 - private readonly height = 26 - private grid = NaN - - private readonly startingLength = 4 - - private xDown?: number - private yDown?: number - private canvas!: HTMLCanvasElement - private image!: HTMLImageElement - private context!: CanvasRenderingContext2D - - private snake: any - private bitcoin: { x: number; y: number } = { x: NaN, y: NaN } - - private moveQueue: String[] = [] - private destroyed = false - - constructor( - @Inject(DOCUMENT) private readonly document: Document, - @Inject(POLYMORPHEUS_CONTEXT) - private readonly dialog: TuiDialogContext, - ) {} - - dismiss() { - this.dialog.completeWith(this.highScore) - } - - @HostListener('document:keydown', ['$event']) - keyEvent(e: KeyboardEvent) { - this.moveQueue.push(e.key) - } - - @HostListener('touchstart', ['$event']) - touchStart(e: TouchEvent) { - this.handleTouchStart(e) - } - - @HostListener('touchmove', ['$event']) - touchMove(e: TouchEvent) { - this.handleTouchMove(e) - } - - @HostListener('window:resize') - sizeChange() { - this.init() - } - - ngOnDestroy() { - this.destroyed = true - } - - ngAfterViewInit() { - this.init() - - this.image = new Image() - this.image.onload = () => { - requestAnimationFrame(async () => await this.loop()) - } - this.image.src = '../../../../../../assets/img/icons/bitcoin.svg' - } - - init() { - this.canvas = this.document.querySelector('canvas#game')! - this.canvas.style.border = '1px solid #e0e0e0' - this.context = this.canvas.getContext('2d')! - const container = this.document.querySelector('.canvas-center')! - this.grid = Math.min( - Math.floor(container.clientWidth / this.width), - Math.floor(container.clientHeight / this.height), - ) - this.snake = { - x: this.grid * (Math.floor(this.width / 2) - this.startingLength), - y: this.grid * Math.floor(this.height / 2), - // snake velocity. moves one grid length every frame in either the x or y direction - dx: this.grid, - dy: 0, - // keep track of all grids the snake body occupies - cells: [], - // length of the snake. grows when eating an bitcoin - maxCells: this.startingLength, - } - this.bitcoin = { - x: this.getRandomInt(0, this.width) * this.grid, - y: this.getRandomInt(0, this.height) * this.grid, - } - - this.canvas.width = this.grid * this.width - this.canvas.height = this.grid * this.height - this.context.imageSmoothingEnabled = false - } - - getTouches(evt: TouchEvent) { - return evt.touches - } - - handleTouchStart(evt: TouchEvent) { - const firstTouch = this.getTouches(evt)[0] - this.xDown = firstTouch.clientX - this.yDown = firstTouch.clientY - } - - handleTouchMove(evt: TouchEvent) { - if (!this.xDown || !this.yDown) { - return - } - - var xUp = evt.touches[0].clientX - var yUp = evt.touches[0].clientY - - var xDiff = this.xDown - xUp - var yDiff = this.yDown - yUp - - if (Math.abs(xDiff) > Math.abs(yDiff)) { - /*most significant*/ - if (xDiff > 0) { - this.moveQueue.push('ArrowLeft') - } else { - this.moveQueue.push('ArrowRight') - } - } else { - if (yDiff > 0) { - this.moveQueue.push('ArrowUp') - } else { - this.moveQueue.push('ArrowDown') - } - } - /* reset values */ - this.xDown = undefined - this.yDown = undefined - } - - // game loop - async loop() { - if (this.destroyed) return - - await pauseFor(this.speed) - - requestAnimationFrame(async () => await this.loop()) - - this.context.clearRect(0, 0, this.canvas.width, this.canvas.height) - - // move snake by its velocity - this.snake.x += this.snake.dx - this.snake.y += this.snake.dy - - if (this.moveQueue.length) { - const move = this.moveQueue.shift() - // left arrow key - if (move === 'ArrowLeft' && this.snake.dx === 0) { - this.snake.dx = -this.grid - this.snake.dy = 0 - } - // up arrow key - else if (move === 'ArrowUp' && this.snake.dy === 0) { - this.snake.dy = -this.grid - this.snake.dx = 0 - } - // right arrow key - else if (move === 'ArrowRight' && this.snake.dx === 0) { - this.snake.dx = this.grid - this.snake.dy = 0 - } - // down arrow key - else if (move === 'ArrowDown' && this.snake.dy === 0) { - this.snake.dy = this.grid - this.snake.dx = 0 - } - } - - // edge death - if ( - this.snake.x < 0 || - this.snake.y < 0 || - this.snake.x >= this.canvas.width || - this.snake.y >= this.canvas.height - ) { - this.death() - } - - // keep track of where snake has been. front of the array is always the head - this.snake.cells.unshift({ x: this.snake.x, y: this.snake.y }) - - // remove cells as we move away from them - if (this.snake.cells.length > this.snake.maxCells) { - this.snake.cells.pop() - } - - // draw bitcoin - this.context.fillStyle = '#ff4961' - this.context.drawImage( - this.image, - this.bitcoin.x - 1, - this.bitcoin.y - 1, - this.grid + 2, - this.grid + 2, - ) - - // draw snake one cell at a time - this.context.fillStyle = '#2fdf75' - - const firstCell = this.snake.cells[0] - - for (let index = 0; index < this.snake.cells.length; index++) { - const cell = this.snake.cells[index] - - // drawing 1 px smaller than the grid creates a grid effect in the snake body so you can see how long it is - this.context.fillRect(cell.x, cell.y, this.grid - 1, this.grid - 1) - - // snake ate bitcoin - if (cell.x === this.bitcoin.x && cell.y === this.bitcoin.y) { - this.score++ - this.highScore = Math.max(this.score, this.highScore) - this.snake.maxCells++ - - this.bitcoin.x = this.getRandomInt(0, this.width) * this.grid - this.bitcoin.y = this.getRandomInt(0, this.height) * this.grid - } - - if (index > 0) { - // check collision with all cells after this one (modified bubble sort) - // snake occupies same space as a body part. reset game - if ( - firstCell.x === this.snake.cells[index].x && - firstCell.y === this.snake.cells[index].y - ) { - this.death() - } - } - } - } - - death() { - this.snake.x = - this.grid * (Math.floor(this.width / 2) - this.startingLength) - this.snake.y = this.grid * Math.floor(this.height / 2) - this.snake.cells = [] - this.snake.maxCells = this.startingLength - this.snake.dx = this.grid - this.snake.dy = 0 - - this.bitcoin.x = this.getRandomInt(0, 25) * this.grid - this.bitcoin.y = this.getRandomInt(0, 25) * this.grid - this.score = 0 - } - - getRandomInt(min: number, max: number) { - return Math.floor(Math.random() * (max - min)) + min - } -} diff --git a/web/projects/ui/src/app/app/snek/snek.directive.ts b/web/projects/ui/src/app/app/snek/snek.directive.ts deleted file mode 100644 index 246db7c09..000000000 --- a/web/projects/ui/src/app/app/snek/snek.directive.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Directive, HostListener, Input } from '@angular/core' -import { ErrorService, LoadingService } from '@start9labs/shared' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { TuiDialogService } from '@taiga-ui/core' -import { filter } from 'rxjs' -import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' -import { SnakePage } from './snake.page' - -@Directive({ - selector: 'img[appSnek]', -}) -export class SnekDirective { - @Input() - appSnekHighScore = 0 - - constructor( - private readonly dialogs: TuiDialogService, - private readonly loader: LoadingService, - private readonly errorService: ErrorService, - private readonly embassyApi: ApiService, - ) {} - - @HostListener('click') - async onClick() { - this.dialogs - .open(new PolymorpheusComponent(SnakePage), { - label: 'Snake!', - closeable: false, - dismissible: false, - data: { - highScore: this.appSnekHighScore, - }, - }) - .pipe(filter(score => score > this.appSnekHighScore)) - .subscribe(async score => { - const loader = this.loader.open('Saving high score...').subscribe() - - try { - await this.embassyApi.setDbValue( - ['gaming', 'snake', 'high-score'], - score, - ) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - }) - } -} diff --git a/web/projects/ui/src/app/app/snek/snek.module.ts b/web/projects/ui/src/app/app/snek/snek.module.ts deleted file mode 100644 index a678b8395..000000000 --- a/web/projects/ui/src/app/app/snek/snek.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { TuiButtonModule } from '@taiga-ui/experimental' - -import { SnekDirective } from './snek.directive' -import { SnakePage } from './snake.page' - -@NgModule({ - imports: [CommonModule, IonicModule, TuiButtonModule], - declarations: [SnekDirective, SnakePage], - exports: [SnekDirective, SnakePage], -}) -export class SnekModule {} diff --git a/web/projects/ui/src/app/apps/diagnostic/home/home.page.scss b/web/projects/ui/src/app/apps/diagnostic/home/home.page.scss index 15ec44f64..52f6f34c8 100644 --- a/web/projects/ui/src/app/apps/diagnostic/home/home.page.scss +++ b/web/projects/ui/src/app/apps/diagnostic/home/home.page.scss @@ -1,19 +1,20 @@ :host { display: block; - padding: 32px; + padding: 2rem; overflow: auto; + background: var(--tui-base-01); } .title { text-align: center; - padding-bottom: 24px; - font-size: calc(2vw + 14px); + padding-bottom: 1.5rem; + font-size: calc(2vw + 1rem); } .subtitle { - padding-top: 16px; - padding-bottom: 16px; - font-size: calc(1vw + 12px); + padding-top: 1rem; + padding-bottom: 1rem; + font-size: calc(1vw + 0.75rem); font-weight: bold; } @@ -21,8 +22,8 @@ display: block; color: var(--tui-success-fill); background: rgb(69, 69, 69); - padding: 1px 16px; - margin-bottom: 32px; + padding: 1px 1rem; + margin-bottom: 2rem; } .warning { @@ -31,5 +32,6 @@ .buttons { display: flex; - gap: 16px; + flex-wrap: wrap; + gap: 1rem; } diff --git a/web/projects/ui/src/app/apps/diagnostic/logs/logs.module.ts b/web/projects/ui/src/app/apps/diagnostic/logs/logs.module.ts index 7cb2cc2e1..97c1b8f90 100644 --- a/web/projects/ui/src/app/apps/diagnostic/logs/logs.module.ts +++ b/web/projects/ui/src/app/apps/diagnostic/logs/logs.module.ts @@ -1,7 +1,11 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' import { Routes, RouterModule } from '@angular/router' -import { IonicModule } from '@ionic/angular' +import { IntersectionObserverModule } from '@ng-web-apis/intersection-observer' +import { MutationObserverModule } from '@ng-web-apis/mutation-observer' +import { TuiLoaderModule, TuiScrollbarModule } from '@taiga-ui/core' +import { TuiBadgeModule, TuiButtonModule } from '@taiga-ui/experimental' +import { NgDompurifyModule } from '@tinkoff/ng-dompurify' import { LogsPage } from './logs.page' const ROUTES: Routes = [ @@ -12,7 +16,17 @@ const ROUTES: Routes = [ ] @NgModule({ - imports: [CommonModule, IonicModule, RouterModule.forChild(ROUTES)], + imports: [ + CommonModule, + RouterModule.forChild(ROUTES), + IntersectionObserverModule, + MutationObserverModule, + NgDompurifyModule, + TuiBadgeModule, + TuiButtonModule, + TuiLoaderModule, + TuiScrollbarModule, + ], declarations: [LogsPage], }) export class LogsPageModule {} diff --git a/web/projects/ui/src/app/apps/diagnostic/logs/logs.page.html b/web/projects/ui/src/app/apps/diagnostic/logs/logs.page.html index 6abfaa929..129d34713 100644 --- a/web/projects/ui/src/app/apps/diagnostic/logs/logs.page.html +++ b/web/projects/ui/src/app/apps/diagnostic/logs/logs.page.html @@ -1,57 +1,23 @@ - - - - - - Logs - - - - - + +
    - - - -
    -
    -
    - -
    - -
    - - - -
    - + @if (loading) { + + } +
    + @for (log of logs; track log) { +
    
    +  }
    +
    diff --git a/web/projects/ui/src/app/apps/diagnostic/logs/logs.page.ts b/web/projects/ui/src/app/apps/diagnostic/logs/logs.page.ts index 7aaf0f519..a8304b168 100644 --- a/web/projects/ui/src/app/apps/diagnostic/logs/logs.page.ts +++ b/web/projects/ui/src/app/apps/diagnostic/logs/logs.page.ts @@ -1,94 +1,79 @@ -import { Component, ViewChild } from '@angular/core' -import { IonContent } from '@ionic/angular' -import { ErrorService, toLocalIsoString } from '@start9labs/shared' -import { DiagnosticService } from '../services/diagnostic.service' - -const Convert = require('ansi-to-html') -const convert = new Convert({ - bg: 'transparent', -}) +import { Component, ElementRef, inject, OnInit, ViewChild } from '@angular/core' +import { INTERSECTION_ROOT } from '@ng-web-apis/intersection-observer' +import { convertAnsi, ErrorService } from '@start9labs/shared' +import { TuiScrollbarComponent } from '@taiga-ui/core' +import { DiagnosticService } from 'src/app/apps/diagnostic/services/diagnostic.service' @Component({ selector: 'logs', templateUrl: './logs.page.html', + styles: ` + :host { + max-height: 100vh; + display: flex; + flex-direction: column; + justify-content: flex-start; + padding: 1rem; + gap: 1rem; + background: var(--tui-base-01); + } + `, + providers: [ + { + provide: INTERSECTION_ROOT, + useExisting: ElementRef, + }, + ], }) -export class LogsPage { - @ViewChild(IonContent) private content?: IonContent - loading = true - needInfinite = true - startCursor?: string - limit = 200 - isOnBottom = true +export class LogsPage implements OnInit { + @ViewChild(TuiScrollbarComponent, { read: ElementRef }) + private readonly scrollbar?: ElementRef + private readonly api = inject(DiagnosticService) + private readonly errorService = inject(ErrorService) - constructor( - private readonly api: DiagnosticService, - private readonly errorService: ErrorService, - ) {} + startCursor?: string + loading = false + logs: string[] = [] + scrollTop = 0 - async ngOnInit() { - await this.getLogs() - this.loading = false + ngOnInit() { + this.getLogs() } - scrollEnd() { - const bottomDiv = document.getElementById('bottom-div') - this.isOnBottom = - !!bottomDiv && - bottomDiv.getBoundingClientRect().top - 420 < window.innerHeight + onTop(top: boolean) { + if (top) this.getLogs() } - scrollToBottom() { - this.content?.scrollToBottom(500) - } + restoreScroll() { + if (this.loading || !this.scrollbar) return - async doInfinite(e: any): Promise { - await this.getLogs() - e.target.complete() + const scrollbar = this.scrollbar.nativeElement + const offset = scrollbar.querySelector('pre')?.clientHeight || 0 + + scrollbar.scrollTop = this.scrollTop + offset } private async getLogs() { + if (this.loading) return + + this.loading = true + try { - const { 'start-cursor': startCursor, entries } = await this.api.getLogs({ + const response = await this.api.getLogs({ cursor: this.startCursor, before: !!this.startCursor, - limit: this.limit, + limit: 200, }) - if (!entries.length) return - - this.startCursor = startCursor - - const container = document.getElementById('container') - const newLogs = document.getElementById('template')?.cloneNode(true) - - if (!(newLogs instanceof HTMLElement)) return - - newLogs.innerHTML = entries - .map( - entry => - `${toLocalIsoString( - new Date(entry.timestamp), - )} ${convert.toHtml(entry.message)}`, - ) - .join('\n') - - const beforeContainerHeight = container?.scrollHeight || 0 - container?.prepend(newLogs) - const afterContainerHeight = container?.scrollHeight || 0 - - // scroll down - setTimeout(() => { - this.content?.scrollToPoint( - 0, - afterContainerHeight - beforeContainerHeight, - ) - }, 50) + if (!response.entries.length) return - if (entries.length < this.limit) { - this.needInfinite = false - } + this.startCursor = response['start-cursor'] + this.logs = [convertAnsi(response.entries), ...this.logs] + this.scrollTop = this.scrollbar?.nativeElement.scrollTop || 0 } catch (e: any) { this.errorService.handleError(e) + } finally { + this.loading = false } } } diff --git a/web/projects/ui/src/app/apps/loading/loading.page.ts b/web/projects/ui/src/app/apps/loading/loading.page.ts index 028c5f1a4..4702c7626 100644 --- a/web/projects/ui/src/app/apps/loading/loading.page.ts +++ b/web/projects/ui/src/app/apps/loading/loading.page.ts @@ -1,5 +1,5 @@ import { Component, inject } from '@angular/core' -import { NavController } from '@ionic/angular' +import { Router } from '@angular/router' import { InitializingComponent, provideSetupLogsService, @@ -13,8 +13,8 @@ import { ApiService } from 'src/app/services/api/embassy-api.service' template: ` + (finished)="router.navigate(['login'])" + /> `, providers: [ provideSetupService(ApiService), @@ -23,5 +23,5 @@ import { ApiService } from 'src/app/services/api/embassy-api.service' imports: [InitializingComponent], }) export class LoadingPage { - readonly navCtrl = inject(NavController) + readonly router = inject(Router) } diff --git a/web/projects/ui/src/app/apps/login/login.page.scss b/web/projects/ui/src/app/apps/login/login.page.scss index 65bc582b1..8d6b6d2d0 100644 --- a/web/projects/ui/src/app/apps/login/login.page.scss +++ b/web/projects/ui/src/app/apps/login/login.page.scss @@ -9,7 +9,7 @@ overflow: visible; align-items: center; text-align: center; - width: max(50%, 20rem); + width: max(33%, 20rem); } .logo { diff --git a/web/projects/ui/src/app/apps/login/login.page.ts b/web/projects/ui/src/app/apps/login/login.page.ts index b910c0c62..29b4a8ab1 100644 --- a/web/projects/ui/src/app/apps/login/login.page.ts +++ b/web/projects/ui/src/app/apps/login/login.page.ts @@ -1,5 +1,4 @@ import { Component, Inject } from '@angular/core' -import { getPlatforms } from '@ionic/angular' import { ApiService } from 'src/app/services/api/embassy-api.service' import { AuthService } from 'src/app/services/auth.service' import { Router } from '@angular/router' @@ -45,7 +44,8 @@ export class LoginPage { } await this.api.login({ password: this.password, - metadata: { platforms: getPlatforms() }, + // TODO: get platforms metadata + metadata: { platforms: [] }, }) this.password = '' diff --git a/web/projects/ui/src/app/apps/portal/components/header/corner.component.ts b/web/projects/ui/src/app/apps/portal/components/header/corner.component.ts index 80652611a..1a49954a2 100644 --- a/web/projects/ui/src/app/apps/portal/components/header/corner.component.ts +++ b/web/projects/ui/src/app/apps/portal/components/header/corner.component.ts @@ -18,7 +18,7 @@ import { import { Subject } from 'rxjs' import { HeaderMenuComponent } from './menu.component' import { HeaderNotificationsComponent } from './notifications.component' -import { SidebarDirective } from '../../../../app/sidebar-host.component' +import { SidebarDirective } from 'src/app/common/sidebar-host.component' import { NotificationService } from '../../services/notification.service' @Component({ diff --git a/web/projects/ui/src/app/apps/portal/components/interfaces/interface.component.ts b/web/projects/ui/src/app/apps/portal/components/interfaces/interface.component.ts index 33a2d5f62..2f0f362b5 100644 --- a/web/projects/ui/src/app/apps/portal/components/interfaces/interface.component.ts +++ b/web/projects/ui/src/app/apps/portal/components/interfaces/interface.component.ts @@ -14,7 +14,7 @@ import { TuiTitleModule, } from '@taiga-ui/experimental' import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' -import { QRComponent } from 'src/app/common/qr/qr.component' +import { QRComponent } from 'src/app/common/qr.component' @Component({ standalone: true, diff --git a/web/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts index c5e8aeb22..db021af59 100644 --- a/web/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/service/components/status.component.ts @@ -7,7 +7,7 @@ import { } from '@angular/core' import { InstallProgress } from 'src/app/services/patch-db/data-model' import { StatusRendering } from 'src/app/services/pkg-status-rendering.service' -import { InstallProgressPipeModule } from 'src/app/common/install-progress/install-progress.module' +import { InstallProgressPipe } from '../pipes/install-progress.pipe' @Component({ selector: 'service-status', @@ -18,7 +18,7 @@ import { InstallProgressPipeModule } from 'src/app/common/install-progress/insta - + Installing {{ progress }} @@ -36,7 +36,7 @@ import { InstallProgressPipeModule } from 'src/app/common/install-progress/insta ], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, - imports: [CommonModule, InstallProgressPipeModule], + imports: [CommonModule, InstallProgressPipe], }) export class ServiceStatusComponent { @Input({ required: true }) diff --git a/web/projects/ui/src/app/apps/portal/routes/service/modals/credentials.component.ts b/web/projects/ui/src/app/apps/portal/routes/service/modals/credentials.component.ts index 613d76e06..d155947ab 100644 --- a/web/projects/ui/src/app/apps/portal/routes/service/modals/credentials.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/service/modals/credentials.component.ts @@ -1,26 +1,25 @@ import { CommonModule } from '@angular/common' import { ChangeDetectionStrategy, Component, inject } from '@angular/core' -import { ErrorService, SharedPipesModule } from '@start9labs/shared' -import { TuiForModule } from '@taiga-ui/cdk' +import { ErrorService } from '@start9labs/shared' +import { TuiLoaderModule } from '@taiga-ui/core' import { TuiButtonModule } from '@taiga-ui/experimental' import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' import { BehaviorSubject } from 'rxjs' import { ApiService } from 'src/app/services/api/embassy-api.service' -import { SkeletonListComponentModule } from 'src/app/common/skeleton-list/skeleton-list.component.module' import { ServiceCredentialComponent } from '../components/credential.component' @Component({ template: ` - - - - - No credentials - `, @@ -36,11 +35,9 @@ import { ServiceCredentialComponent } from '../components/credential.component' standalone: true, imports: [ CommonModule, - TuiForModule, TuiButtonModule, - SharedPipesModule, - SkeletonListComponentModule, ServiceCredentialComponent, + TuiLoaderModule, ], }) export class ServiceCredentialsModal { diff --git a/web/projects/ui/src/app/common/install-progress/install-progress.pipe.ts b/web/projects/ui/src/app/apps/portal/routes/service/pipes/install-progress.pipe.ts similarity index 52% rename from web/projects/ui/src/app/common/install-progress/install-progress.pipe.ts rename to web/projects/ui/src/app/apps/portal/routes/service/pipes/install-progress.pipe.ts index d4ce5298a..44e10fb1b 100644 --- a/web/projects/ui/src/app/common/install-progress/install-progress.pipe.ts +++ b/web/projects/ui/src/app/apps/portal/routes/service/pipes/install-progress.pipe.ts @@ -1,11 +1,12 @@ import { Pipe, PipeTransform } from '@angular/core' -import { InstallProgress } from '../../services/patch-db/data-model' -import { packageLoadingProgress } from '../../util/package-loading-progress' +import { InstallProgress } from 'src/app/services/patch-db/data-model' +import { packageLoadingProgress } from 'src/app/util/package-loading-progress' @Pipe({ - name: 'installProgressDisplay', + standalone: true, + name: 'installProgress', }) -export class InstallProgressDisplayPipe implements PipeTransform { +export class InstallProgressPipe implements PipeTransform { transform(installProgress?: InstallProgress): string { const totalProgress = packageLoadingProgress(installProgress)?.totalProgress || 0 diff --git a/web/projects/ui/src/app/apps/portal/routes/service/pipes/to-menu.pipe.ts b/web/projects/ui/src/app/apps/portal/routes/service/pipes/to-menu.pipe.ts index 1b4a19a18..12e35d2b8 100644 --- a/web/projects/ui/src/app/apps/portal/routes/service/pipes/to-menu.pipe.ts +++ b/web/projects/ui/src/app/apps/portal/routes/service/pipes/to-menu.pipe.ts @@ -56,11 +56,12 @@ export class ToMenuPipe implements PipeTransform { name: 'Credentials', description: `Password, keys, or other credentials of interest`, action: () => - this.showDialog( - `${manifest.title} credentials`, - manifest.id, - ServiceCredentialsModal, - ), + this.dialogs + .open(new PolymorpheusComponent(ServiceCredentialsModal), { + label: `${manifest.title} credentials`, + data: manifest.id, + }) + .subscribe(), }, { icon: 'tuiIconZapLarge', @@ -116,16 +117,6 @@ export class ToMenuPipe implements PipeTransform { .subscribe() } - private showDialog(label: string, data: any, modal: Type) { - this.dialogs - .open(new PolymorpheusComponent(modal), { - size: 'l', - label, - data, - }) - .subscribe() - } - private openConfig({ title, id }: Manifest) { this.formDialog.open(ServiceConfigModal, { label: `${title} configuration`, diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/router/primary-ip.pipe.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/router/primary-ip.pipe.ts new file mode 100644 index 000000000..777194183 --- /dev/null +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/router/primary-ip.pipe.ts @@ -0,0 +1,14 @@ +import { Pipe, PipeTransform } from '@angular/core' +import { IpInfo } from 'src/app/services/patch-db/data-model' + +@Pipe({ + standalone: true, + name: 'primaryIp', +}) +export class PrimaryIpPipe implements PipeTransform { + transform(ipInfo: IpInfo): string { + return Object.values(ipInfo) + .filter(iface => iface.ipv4) + .sort((a, b) => (a.wireless ? -1 : 1))[0].ipv4! + } +} diff --git a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/router/router.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/router/router.component.ts index 0fe99fe61..b34be8390 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/router/router.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/settings/routes/router/router.component.ts @@ -3,8 +3,8 @@ import { ChangeDetectionStrategy, Component, inject } from '@angular/core' import { TuiTextfieldControllerModule } from '@taiga-ui/core' import { PatchDB } from 'patch-db-client' import { DataModel } from 'src/app/services/patch-db/data-model' -import { PrimaryIpPipeModule } from 'src/app/common/primary-ip/primary-ip.module' import { RouterInfoComponent } from './info.component' +import { PrimaryIpPipe } from './primary-ip.pipe' import { RouterPortComponent } from './table.component' @Component({ @@ -58,10 +58,10 @@ import { RouterPortComponent } from './table.component' standalone: true, imports: [ CommonModule, - PrimaryIpPipeModule, RouterInfoComponent, RouterPortComponent, TuiTextfieldControllerModule, + PrimaryIpPipe, ], }) export class SettingsRouterComponent { diff --git a/web/projects/ui/src/app/apps/portal/routes/system/updates/updates.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/updates/updates.component.ts index 1f8de4437..a1b7116b4 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/updates/updates.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/updates/updates.component.ts @@ -4,7 +4,7 @@ import { AbstractMarketplaceService, StoreIconComponentModule, } from '@start9labs/marketplace' -import { TuiForModule } from '@taiga-ui/cdk' +import { TuiAvatarModule, TuiCellModule } from '@taiga-ui/experimental' import { PatchDB } from 'patch-db-client' import { combineLatest } from 'rxjs' import { MarketplaceService } from 'src/app/services/marketplace.service' @@ -12,66 +12,64 @@ import { DataModel } from 'src/app/services/patch-db/data-model' import { ConfigService } from 'src/app/services/config.service' import { FilterUpdatesPipe } from './pipes/filter-updates.pipe' import { UpdatesItemComponent } from './components/item.component' -import { SkeletonListComponent } from '../../../components/skeleton-list.component' @Component({ template: ` - -
    + @if (data$ | async; as data) { + @for (host of data.hosts; track host) {

    - + {{ host.name }}

    -

    - Request Failed -

    - -
    -
    -

    All services are up to date!

    - - - + @if (data.errors.includes(host.url)) { +

    Request Failed

    + } + @if (data.mp[host.url]?.packages | filterUpdates: data.local; as pkgs) { + @for (pkg of pkgs; track pkg) { + + } @empty { +

    All services are up to date!

    + } + } @else { + @for (i of [0, 1, 2]; track i) { +
    + + Loading update item + + Loading actions + +
    + } + } + } + } `, host: { class: 'g-page' }, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ CommonModule, - TuiForModule, + TuiCellModule, + TuiAvatarModule, StoreIconComponentModule, FilterUpdatesPipe, UpdatesItemComponent, - SkeletonListComponent, ], }) export default class UpdatesComponent { - private readonly marketplace = inject( + private readonly service = inject( AbstractMarketplaceService, ) as MarketplaceService - readonly config = inject(ConfigService) - + readonly mp = inject(ConfigService).marketplace readonly data$ = combineLatest({ - hosts: this.marketplace.getKnownHosts$(true), - mp: this.marketplace.getMarketplace$(), + hosts: this.service.getKnownHosts$(true), + mp: this.service.getMarketplace$(), local: inject(PatchDB).watch$('package-data'), - errors: this.marketplace.getRequestErrors$(), + errors: this.service.getRequestErrors$(), }) } diff --git a/web/projects/ui/src/app/common/install-progress/install-progress.module.ts b/web/projects/ui/src/app/common/install-progress/install-progress.module.ts deleted file mode 100644 index 68d0330b5..000000000 --- a/web/projects/ui/src/app/common/install-progress/install-progress.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NgModule } from '@angular/core' -import { InstallProgressDisplayPipe } from './install-progress.pipe' - -@NgModule({ - declarations: [InstallProgressDisplayPipe], - exports: [InstallProgressDisplayPipe], -}) -export class InstallProgressPipeModule {} diff --git a/web/projects/ui/src/app/common/primary-ip/primary-ip.module.ts b/web/projects/ui/src/app/common/primary-ip/primary-ip.module.ts deleted file mode 100644 index 941518ab2..000000000 --- a/web/projects/ui/src/app/common/primary-ip/primary-ip.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NgModule } from '@angular/core' -import { PrimaryIpPipe } from './primary-ip.pipe' - -@NgModule({ - declarations: [PrimaryIpPipe], - exports: [PrimaryIpPipe], -}) -export class PrimaryIpPipeModule {} diff --git a/web/projects/ui/src/app/common/primary-ip/primary-ip.pipe.ts b/web/projects/ui/src/app/common/primary-ip/primary-ip.pipe.ts deleted file mode 100644 index 4cfa98552..000000000 --- a/web/projects/ui/src/app/common/primary-ip/primary-ip.pipe.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core' -import { IpInfo } from '../../services/patch-db/data-model' - -@Pipe({ - name: 'primaryIp', -}) -export class PrimaryIpPipe implements PipeTransform { - transform(ipInfo: IpInfo): string { - return getPrimaryIp(ipInfo) - } -} - -export function getPrimaryIp(ipInfo: IpInfo): string { - return Object.values(ipInfo) - .filter(iface => iface.ipv4) - .sort((a, b) => (a.wireless ? -1 : 1))[0].ipv4! -} diff --git a/web/projects/ui/src/app/common/qr.component.ts b/web/projects/ui/src/app/common/qr.component.ts new file mode 100644 index 000000000..dee6cbb7e --- /dev/null +++ b/web/projects/ui/src/app/common/qr.component.ts @@ -0,0 +1,16 @@ +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { TuiDialogContext } from '@taiga-ui/core' +import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' +import { QrCodeModule } from 'ng-qrcode' + +@Component({ + standalone: true, + selector: 'qr', + template: '', + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [QrCodeModule], +}) +export class QRComponent { + readonly context = + inject>(POLYMORPHEUS_CONTEXT) +} diff --git a/web/projects/ui/src/app/common/qr/qr.component.ts b/web/projects/ui/src/app/common/qr/qr.component.ts deleted file mode 100644 index a87e43863..000000000 --- a/web/projects/ui/src/app/common/qr/qr.component.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Component, Inject } from '@angular/core' -import { POLYMORPHEUS_CONTEXT } from '@tinkoff/ng-polymorpheus' -import { TuiDialogContext } from '@taiga-ui/core' - -@Component({ - selector: 'qr', - template: '', -}) -export class QRComponent { - constructor( - @Inject(POLYMORPHEUS_CONTEXT) - readonly context: TuiDialogContext, - ) {} -} diff --git a/web/projects/ui/src/app/common/qr/qr.module.ts b/web/projects/ui/src/app/common/qr/qr.module.ts deleted file mode 100644 index aa5086b28..000000000 --- a/web/projects/ui/src/app/common/qr/qr.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { QrCodeModule } from 'ng-qrcode' - -import { QRComponent } from './qr.component' - -@NgModule({ - declarations: [QRComponent], - imports: [CommonModule, QrCodeModule], - exports: [QRComponent], -}) -export class QRComponentModule {} diff --git a/web/projects/ui/src/app/app/sidebar-host.component.ts b/web/projects/ui/src/app/common/sidebar-host.component.ts similarity index 100% rename from web/projects/ui/src/app/app/sidebar-host.component.ts rename to web/projects/ui/src/app/common/sidebar-host.component.ts diff --git a/web/projects/ui/src/app/common/skeleton-list/skeleton-list.component.html b/web/projects/ui/src/app/common/skeleton-list/skeleton-list.component.html deleted file mode 100644 index 5b875fa2c..000000000 --- a/web/projects/ui/src/app/common/skeleton-list/skeleton-list.component.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/web/projects/ui/src/app/common/skeleton-list/skeleton-list.component.module.ts b/web/projects/ui/src/app/common/skeleton-list/skeleton-list.component.module.ts deleted file mode 100644 index 23e8b446e..000000000 --- a/web/projects/ui/src/app/common/skeleton-list/skeleton-list.component.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { SkeletonListComponent } from './skeleton-list.component' -import { IonicModule } from '@ionic/angular' -import { RouterModule } from '@angular/router' - -@NgModule({ - declarations: [SkeletonListComponent], - imports: [CommonModule, IonicModule, RouterModule], - exports: [SkeletonListComponent], -}) -export class SkeletonListComponentModule {} diff --git a/web/projects/ui/src/app/common/skeleton-list/skeleton-list.component.ts b/web/projects/ui/src/app/common/skeleton-list/skeleton-list.component.ts deleted file mode 100644 index 4f6c369d0..000000000 --- a/web/projects/ui/src/app/common/skeleton-list/skeleton-list.component.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Component, Input } from '@angular/core' - -@Component({ - selector: 'skeleton-list', - templateUrl: './skeleton-list.component.html', -}) -export class SkeletonListComponent { - @Input() groups = 0 - @Input() rows = 3 - @Input() showAvatar = false - groupsArr: number[] = [] - rowsArr: number[] = [] - - ngOnInit() { - this.groupsArr = Array(this.groups).fill(0) - this.rowsArr = Array(this.rows).fill(0) - } -} diff --git a/web/projects/ui/src/app/common/svg-definitions.component.ts b/web/projects/ui/src/app/common/svg-definitions.component.ts new file mode 100644 index 000000000..36d6462b9 --- /dev/null +++ b/web/projects/ui/src/app/common/svg-definitions.component.ts @@ -0,0 +1,32 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core' + +@Component({ + standalone: true, + selector: 'svg-definitions', + template: ` + + + + + + + + + + `, + styles: ` + :host { + position: absolute; + width: 0; + height: 0; + visibility: hidden; + } + `, + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class SvgDefinitionsComponent {} diff --git a/web/projects/ui/src/app/common/toast-container/notifications-toast.component.ts b/web/projects/ui/src/app/common/toast-container/notifications-toast.component.ts new file mode 100644 index 000000000..eceb6cc62 --- /dev/null +++ b/web/projects/ui/src/app/common/toast-container/notifications-toast.component.ts @@ -0,0 +1,42 @@ +import { AsyncPipe } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { RouterLink } from '@angular/router' +import { TuiAlertModule } from '@taiga-ui/core' +import { PatchDB } from 'patch-db-client' +import { Observable, Subject, merge, pairwise, map, endWith } from 'rxjs' +import { DataModel } from 'src/app/services/patch-db/data-model' + +@Component({ + standalone: true, + selector: 'notifications-toast', + template: ` + + New notifications + View + + `, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [TuiAlertModule, RouterLink, AsyncPipe], +}) +export class NotificationsToastComponent { + private readonly dismiss$ = new Subject() + + readonly visible$: Observable = merge( + this.dismiss$, + inject(PatchDB) + .watch$('server-info', 'unreadNotifications', 'count') + .pipe( + pairwise(), + map(([prev, cur]) => cur > prev), + endWith(false), + ), + ) + + onDismiss() { + this.dismiss$.next(false) + } +} diff --git a/web/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.component.html b/web/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.component.html deleted file mode 100644 index d75364715..000000000 --- a/web/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.component.html +++ /dev/null @@ -1,8 +0,0 @@ - - New notifications - View - diff --git a/web/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.component.ts b/web/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.component.ts deleted file mode 100644 index 65d4241c2..000000000 --- a/web/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ChangeDetectionStrategy, Component, Inject } from '@angular/core' -import { Observable, Subject, merge } from 'rxjs' - -import { NotificationsToastService } from './notifications-toast.service' - -@Component({ - selector: 'notifications-toast', - templateUrl: './notifications-toast.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class NotificationsToastComponent { - private readonly dismiss$ = new Subject() - - readonly visible$: Observable = merge( - this.dismiss$, - this.notifications$, - ) - - constructor( - @Inject(NotificationsToastService) - private readonly notifications$: Observable, - ) {} - - onDismiss() { - this.dismiss$.next(false) - } -} diff --git a/web/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.service.ts b/web/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.service.ts deleted file mode 100644 index 9dd3671f7..000000000 --- a/web/projects/ui/src/app/common/toast-container/notifications-toast/notifications-toast.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core' -import { PatchDB } from 'patch-db-client' -import { endWith, map, pairwise, Observable } from 'rxjs' -import { DataModel } from 'src/app/services/patch-db/data-model' - -@Injectable({ providedIn: 'root' }) -export class NotificationsToastService extends Observable { - private readonly stream$ = this.patch - .watch$('server-info', 'unreadNotifications', 'count') - .pipe( - pairwise(), - map(([prev, cur]) => cur > prev), - endWith(false), - ) - - constructor(private readonly patch: PatchDB) { - super(subscriber => this.stream$.subscribe(subscriber)) - } -} diff --git a/web/projects/ui/src/app/common/toast-container/refresh-alert.component.ts b/web/projects/ui/src/app/common/toast-container/refresh-alert.component.ts new file mode 100644 index 000000000..49aabce15 --- /dev/null +++ b/web/projects/ui/src/app/common/toast-container/refresh-alert.component.ts @@ -0,0 +1,90 @@ +import { AsyncPipe } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { SwUpdate } from '@angular/service-worker' +import { Emver, LoadingService } from '@start9labs/shared' +import { TuiAutoFocusModule } from '@taiga-ui/cdk' +import { TuiDialogModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' +import { PatchDB } from 'patch-db-client' +import { debounceTime, endWith, map, merge, Subject } from 'rxjs' +import { ConfigService } from 'src/app/services/config.service' +import { DataModel } from 'src/app/services/patch-db/data-model' + +@Component({ + standalone: true, + selector: 'refresh-alert', + template: ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + `, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [TuiDialogModule, AsyncPipe, TuiButtonModule, TuiAutoFocusModule], +}) +export class RefreshAlertComponent { + private readonly updates = inject(SwUpdate) + private readonly loader = inject(LoadingService) + private readonly emver = inject(Emver) + private readonly config = inject(ConfigService) + private readonly dismiss$ = new Subject() + + readonly show$ = merge( + this.dismiss$, + inject(PatchDB) + .watch$('server-info', 'version') + .pipe( + map(version => !!this.emver.compare(this.config.version, version)), + endWith(false), + ), + ).pipe(debounceTime(0)) + + // @TODO use this like we did on 0344 + onPwa = false + + ngOnInit() { + this.onPwa = window.matchMedia('(display-mode: standalone)').matches + } + + async pwaReload() { + const loader = this.loader.open('Reloading PWA...').subscribe() + + try { + // attempt to update to the latest client version available + await this.updates.activateUpdate() + } catch (e) { + console.error('Error activating update from service worker: ', e) + } finally { + loader.unsubscribe() + // always reload, as this resolves most out of sync cases + window.location.reload() + } + } + + onDismiss() { + this.dismiss$.next(false) + } +} diff --git a/web/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.html b/web/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.html deleted file mode 100644 index cb412aae9..000000000 --- a/web/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/web/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.ts b/web/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.ts deleted file mode 100644 index 708b9ca22..000000000 --- a/web/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.component.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { ChangeDetectionStrategy, Component, Inject } from '@angular/core' -import { Observable, Subject, merge, debounceTime } from 'rxjs' - -import { RefreshAlertService } from './refresh-alert.service' -import { SwUpdate } from '@angular/service-worker' -import { LoadingController } from '@ionic/angular' - -@Component({ - selector: 'refresh-alert', - templateUrl: './refresh-alert.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class RefreshAlertComponent { - private readonly dismiss$ = new Subject() - - readonly show$ = merge(this.dismiss$, this.refresh$).pipe(debounceTime(0)) - - // @TODO use this like we did on 0344 - onPwa = false - - constructor( - @Inject(RefreshAlertService) private readonly refresh$: Observable, - private readonly updates: SwUpdate, - private readonly loadingCtrl: LoadingController, - ) {} - - ngOnInit() { - this.onPwa = window.matchMedia('(display-mode: standalone)').matches - } - - async pwaReload() { - const loader = await this.loadingCtrl.create({ - message: 'Reloading PWA...', - }) - await loader.present() - try { - // attempt to update to the latest client version available - await this.updates.activateUpdate() - } catch (e) { - console.error('Error activating update from service worker: ', e) - } finally { - loader.dismiss() - // always reload, as this resolves most out of sync cases - window.location.reload() - } - } - - onDismiss() { - this.dismiss$.next(false) - } -} diff --git a/web/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.service.ts b/web/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.service.ts deleted file mode 100644 index 134add795..000000000 --- a/web/projects/ui/src/app/common/toast-container/refresh-alert/refresh-alert.service.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Injectable } from '@angular/core' -import { Emver } from '@start9labs/shared' -import { PatchDB } from 'patch-db-client' -import { endWith, map, Observable } from 'rxjs' -import { ConfigService } from 'src/app/services/config.service' -import { DataModel } from 'src/app/services/patch-db/data-model' - -@Injectable({ providedIn: 'root' }) -export class RefreshAlertService extends Observable { - private readonly stream$ = this.patch.watch$('server-info', 'version').pipe( - map(version => !!this.emver.compare(this.config.version, version)), - endWith(false), - ) - - constructor( - private readonly patch: PatchDB, - private readonly emver: Emver, - private readonly config: ConfigService, - ) { - super(subscriber => this.stream$.subscribe(subscriber)) - } -} diff --git a/web/projects/ui/src/app/common/toast-container/toast-container.component.html b/web/projects/ui/src/app/common/toast-container/toast-container.component.html deleted file mode 100644 index 3b7ca2cf1..000000000 --- a/web/projects/ui/src/app/common/toast-container/toast-container.component.html +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/web/projects/ui/src/app/common/toast-container/toast-container.component.ts b/web/projects/ui/src/app/common/toast-container/toast-container.component.ts index 161ddc076..edf74664f 100644 --- a/web/projects/ui/src/app/common/toast-container/toast-container.component.ts +++ b/web/projects/ui/src/app/common/toast-container/toast-container.component.ts @@ -1,8 +1,21 @@ import { ChangeDetectionStrategy, Component } from '@angular/core' +import { NotificationsToastComponent } from './notifications-toast.component' +import { RefreshAlertComponent } from './refresh-alert.component' +import { UpdateToastComponent } from './update-toast.component' @Component({ + standalone: true, selector: 'toast-container', - templateUrl: './toast-container.component.html', + template: ` + + + + `, changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + NotificationsToastComponent, + UpdateToastComponent, + RefreshAlertComponent, + ], }) export class ToastContainerComponent {} diff --git a/web/projects/ui/src/app/common/toast-container/toast-container.module.ts b/web/projects/ui/src/app/common/toast-container/toast-container.module.ts deleted file mode 100644 index bf24027d3..000000000 --- a/web/projects/ui/src/app/common/toast-container/toast-container.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { CommonModule } from '@angular/common' -import { NgModule } from '@angular/core' -import { RouterModule } from '@angular/router' -import { TuiAutoFocusModule } from '@taiga-ui/cdk' -import { TuiAlertModule, TuiDialogModule } from '@taiga-ui/core' -import { TuiButtonModule } from '@taiga-ui/experimental' - -import { ToastContainerComponent } from './toast-container.component' -import { NotificationsToastComponent } from './notifications-toast/notifications-toast.component' -import { RefreshAlertComponent } from './refresh-alert/refresh-alert.component' -import { UpdateToastComponent } from './update-toast/update-toast.component' - -@NgModule({ - imports: [ - CommonModule, - RouterModule, - TuiDialogModule, - TuiButtonModule, - TuiAutoFocusModule, - TuiAlertModule, - ], - declarations: [ - ToastContainerComponent, - NotificationsToastComponent, - RefreshAlertComponent, - UpdateToastComponent, - ], - exports: [ToastContainerComponent], -}) -export class ToastContainerModule {} diff --git a/web/projects/ui/src/app/common/toast-container/update-toast.component.ts b/web/projects/ui/src/app/common/toast-container/update-toast.component.ts new file mode 100644 index 000000000..6396398fa --- /dev/null +++ b/web/projects/ui/src/app/common/toast-container/update-toast.component.ts @@ -0,0 +1,79 @@ +import { AsyncPipe } from '@angular/common' +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { ErrorService, LoadingService } from '@start9labs/shared' +import { TuiAlertModule } from '@taiga-ui/core' +import { TuiButtonModule } from '@taiga-ui/experimental' +import { PatchDB } from 'patch-db-client' +import { + distinctUntilChanged, + endWith, + filter, + merge, + Observable, + Subject, +} from 'rxjs' +import { ApiService } from 'src/app/services/api/embassy-api.service' +import { DataModel } from 'src/app/services/patch-db/data-model' + +@Component({ + standalone: true, + selector: 'update-toast', + template: ` + + Restart your server for these updates to take effect. It can take several + minutes to come back online. +
    + +
    +
    + `, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [TuiButtonModule, TuiAlertModule, AsyncPipe], +}) +export class UpdateToastComponent { + private readonly api = inject(ApiService) + private readonly errorService = inject(ErrorService) + private readonly loader = inject(LoadingService) + private readonly dismiss$ = new Subject() + + readonly visible$: Observable = merge( + this.dismiss$, + inject(PatchDB) + .watch$('server-info', 'status-info', 'updated') + .pipe(distinctUntilChanged(), filter(Boolean), endWith(false)), + ) + + onDismiss() { + this.dismiss$.next(false) + } + + async restart(): Promise { + this.onDismiss() + + const loader = this.loader.open('Restarting...').subscribe() + + try { + await this.api.restartServer({}) + } catch (e: any) { + await this.errorService.handleError(e) + } finally { + await loader.unsubscribe() + } + } +} diff --git a/web/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.html b/web/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.html deleted file mode 100644 index 8cd93b647..000000000 --- a/web/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.html +++ /dev/null @@ -1,23 +0,0 @@ - - Restart your server for these updates to take effect. It can take several - minutes to come back online. -
    - -
    -
    diff --git a/web/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.ts b/web/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.ts deleted file mode 100644 index 0b02faa4e..000000000 --- a/web/projects/ui/src/app/common/toast-container/update-toast/update-toast.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { ChangeDetectionStrategy, Component, Inject } from '@angular/core' -import { ErrorService, LoadingService } from '@start9labs/shared' -import { Observable, Subject, merge } from 'rxjs' - -import { UpdateToastService } from './update-toast.service' -import { ApiService } from 'src/app/services/api/embassy-api.service' - -@Component({ - selector: 'update-toast', - templateUrl: './update-toast.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class UpdateToastComponent { - private readonly dismiss$ = new Subject() - - readonly visible$: Observable = merge(this.dismiss$, this.update$) - - constructor( - @Inject(UpdateToastService) private readonly update$: Observable, - private readonly embassyApi: ApiService, - private readonly errorService: ErrorService, - private readonly loader: LoadingService, - ) {} - - onDismiss() { - this.dismiss$.next(false) - } - - async restart(): Promise { - this.onDismiss() - - const loader = this.loader.open('Restarting...').subscribe() - - try { - await this.embassyApi.restartServer({}) - } catch (e: any) { - await this.errorService.handleError(e) - } finally { - await loader.unsubscribe() - } - } -} diff --git a/web/projects/ui/src/app/common/toast-container/update-toast/update-toast.service.ts b/web/projects/ui/src/app/common/toast-container/update-toast/update-toast.service.ts deleted file mode 100644 index 77afbe736..000000000 --- a/web/projects/ui/src/app/common/toast-container/update-toast/update-toast.service.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Injectable } from '@angular/core' -import { distinctUntilChanged, filter, endWith, Observable } from 'rxjs' -import { PatchDB } from 'patch-db-client' -import { DataModel } from 'src/app/services/patch-db/data-model' - -@Injectable({ providedIn: 'root' }) -export class UpdateToastService extends Observable { - private readonly stream$ = this.patch - .watch$('server-info', 'status-info', 'updated') - .pipe(distinctUntilChanged(), filter(Boolean), endWith(false)) - - constructor(private readonly patch: PatchDB) { - super(subscriber => this.stream$.subscribe(subscriber)) - } -} diff --git a/web/projects/ui/src/app/common/widget-list/any-link/any-link.component.html b/web/projects/ui/src/app/common/widget-list/any-link/any-link.component.html deleted file mode 100644 index 67a2956f5..000000000 --- a/web/projects/ui/src/app/common/widget-list/any-link/any-link.component.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - diff --git a/web/projects/ui/src/app/common/widget-list/any-link/any-link.component.scss b/web/projects/ui/src/app/common/widget-list/any-link/any-link.component.scss deleted file mode 100644 index 81759f278..000000000 --- a/web/projects/ui/src/app/common/widget-list/any-link/any-link.component.scss +++ /dev/null @@ -1,4 +0,0 @@ -a { - text-decoration: none; - color: unset; -} \ No newline at end of file diff --git a/web/projects/ui/src/app/common/widget-list/any-link/any-link.component.ts b/web/projects/ui/src/app/common/widget-list/any-link/any-link.component.ts deleted file mode 100644 index 0e8d6f67d..000000000 --- a/web/projects/ui/src/app/common/widget-list/any-link/any-link.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { - Component, - Input, - ChangeDetectionStrategy, - OnInit, -} from '@angular/core' - -@Component({ - selector: 'any-link', - templateUrl: './any-link.component.html', - styleUrls: ['./any-link.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AnyLinkComponent implements OnInit { - @Input({ required: true }) link!: string - @Input() qp?: Record - externalLink = false - - ngOnInit() { - try { - const _ = new URL(this.link) - this.externalLink = true - } catch { - this.externalLink = false - } - } -} diff --git a/web/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.html b/web/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.html deleted file mode 100644 index dec4bc5e1..000000000 --- a/web/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.html +++ /dev/null @@ -1,28 +0,0 @@ -
    -
    - - - - {{ cardDetails.title }} - - - - - -

    {{ cardDetails.description }}

    -
    -
    -
    -
    -
    diff --git a/web/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.scss b/web/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.scss deleted file mode 100644 index 687370f0f..000000000 --- a/web/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.scss +++ /dev/null @@ -1,68 +0,0 @@ -ion-card { - background: rgba(70, 70, 70, 0.31); - box-shadow: 0 4px 4px rgba(0, 0, 0, 0.25); - border-radius: 44px; - margin: auto; - max-height: 100%; - max-width: 100%; - text-align: center; - transition: all 350ms ease; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - - &:hover { - transition-property: transform; - transform: scale(1.05); - transition-delay: 40ms; - } - - ion-card-title { - font-family: 'Open Sans', sans-serif; - padding: 0.6rem; - font-weight: 600; - height: 2.4rem; - } - - ion-card-content { - min-height: 8rem; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - - ion-icon { - font-size: calc(90px + 0.4vw); - --ionicon-stroke-width: 1rem; - } - } - - ion-footer { - padding: 0 1rem; - font-family: 'Open Sans'; - font-size: clamp(1rem, calc(12px + 0.5vw), 1.3rem); - height: 4.5rem; - width: clamp(13rem, 80%, 18rem); - margin: 0 auto; - * { - max-width: 100%; - } - p { - margin-top: 0; - } - } - - .footer-md::before { - background-image: none; - } -} - -@media (max-width: 900px) { - ion-footer { - width: 10rem; - } -} - -@media (max-width: 1200px) { - ion-footer { - width: 14rem; - } -} diff --git a/web/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.ts b/web/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.ts deleted file mode 100644 index 5b1ba93e9..000000000 --- a/web/projects/ui/src/app/common/widget-list/widget-card/widget-card.component.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - ElementRef, - HostListener, - Input, - ViewChild, -} from '@angular/core' - -@Component({ - selector: 'widget-card', - templateUrl: './widget-card.component.html', - styleUrls: ['./widget-card.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class WidgetCardComponent { - @Input({ required: true }) cardDetails!: Card - @Input({ required: true }) containerDimensions!: Dimension - @ViewChild('outerWrapper') outerWrapper: ElementRef = - {} as ElementRef - @ViewChild('innerWrapper') innerWrapper: ElementRef = - {} as ElementRef - @HostListener('window:resize', ['$event']) - onResize() { - this.resize() - } - maxHeight = 0 - maxWidth = 0 - innerTransform = '' - outerWidth: any - outerHeight: any - - ngAfterViewInit() { - this.maxHeight = ( ( - this.innerWrapper.nativeElement - )).getBoundingClientRect().height - this.maxWidth = ( ( - this.innerWrapper.nativeElement - )).getBoundingClientRect().width - this.resize() - } - - resize() { - const height = this.containerDimensions.height - const width = this.containerDimensions.width - const isMax = width >= this.maxWidth && height >= this.maxHeight - const scale = Math.min(width / this.maxWidth, height / this.maxHeight) - this.innerTransform = isMax ? '' : 'scale(' + scale + ')' - this.outerWidth = isMax ? '' : this.maxWidth * scale - this.outerHeight = isMax ? '' : this.maxHeight * scale - } -} - -export interface Dimension { - height: number - width: number -} - -export interface Card { - title: string - icon: string - color: string - description: string - link: string - qp?: Record -} diff --git a/web/projects/ui/src/app/common/widget-list/widget-list.component.html b/web/projects/ui/src/app/common/widget-list/widget-list.component.html deleted file mode 100644 index 2c013d1c3..000000000 --- a/web/projects/ui/src/app/common/widget-list/widget-list.component.html +++ /dev/null @@ -1,12 +0,0 @@ -
    - - - - - - - -
    diff --git a/web/projects/ui/src/app/common/widget-list/widget-list.component.module.ts b/web/projects/ui/src/app/common/widget-list/widget-list.component.module.ts deleted file mode 100644 index b75bad20b..000000000 --- a/web/projects/ui/src/app/common/widget-list/widget-list.component.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { RouterModule } from '@angular/router' -import { AnyLinkComponent } from './any-link/any-link.component' -import { WidgetListComponent } from './widget-list.component' -import { WidgetCardComponent } from './widget-card/widget-card.component' - -@NgModule({ - declarations: [WidgetListComponent, WidgetCardComponent, AnyLinkComponent], - imports: [CommonModule, IonicModule, RouterModule], - exports: [WidgetListComponent], -}) -export class WidgetListComponentModule {} diff --git a/web/projects/ui/src/app/common/widget-list/widget-list.component.scss b/web/projects/ui/src/app/common/widget-list/widget-list.component.scss deleted file mode 100644 index 843e0d9a5..000000000 --- a/web/projects/ui/src/app/common/widget-list/widget-list.component.scss +++ /dev/null @@ -1,19 +0,0 @@ -ion-col { - max-width: 22rem !important; - --ion-grid-column-padding: 1rem; -} - -@media (min-width: 1700px) { - div { - padding: 0 7%; - } - ion-col { - max-width: 24rem !important; - } -} - -@media (min-width: 2000px) { - div { - padding: 0 12%; - } -} \ No newline at end of file diff --git a/web/projects/ui/src/app/common/widget-list/widget-list.component.ts b/web/projects/ui/src/app/common/widget-list/widget-list.component.ts deleted file mode 100644 index f6514e4ee..000000000 --- a/web/projects/ui/src/app/common/widget-list/widget-list.component.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { - ChangeDetectionStrategy, - Component, - ElementRef, - HostListener, - ViewChild, -} from '@angular/core' -import { Card, Dimension } from './widget-card/widget-card.component' - -@Component({ - selector: 'widget-list', - templateUrl: './widget-list.component.html', - styleUrls: ['./widget-list.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class WidgetListComponent { - @ViewChild('gridContent') - gridContent: ElementRef = {} as ElementRef - @HostListener('window:resize', ['$event']) - onResize() { - this.setContainerDimensions() - } - - containerDimensions: Dimension = {} as Dimension - - ngAfterViewInit() { - this.setContainerDimensions() - } - - setContainerDimensions() { - this.containerDimensions.height = ( ( - this.gridContent.nativeElement - )).getBoundingClientRect().height - this.containerDimensions.width = ( ( - this.gridContent.nativeElement - )).getBoundingClientRect().width - } - - cards: Card[] = [ - { - title: 'Server Info', - icon: 'information-circle-outline', - color: 'var(--alt-green)', - description: 'View information about your server', - link: '/system/specs', - }, - { - title: 'Browse', - icon: 'storefront-outline', - color: 'var(--alt-purple)', - description: 'Browse for services to install', - link: '/marketplace', - qp: { back: 'true' }, - }, - { - title: 'Create Backup', - icon: 'duplicate-outline', - color: 'var(--alt-blue)', - description: 'Back up StartOS and service data', - link: '/system/backup', - }, - { - title: 'Monitor', - icon: 'pulse-outline', - color: 'var(--alt-orange)', - description: `View your system resource usage`, - link: '/system/metrics', - }, - { - title: 'User Manual', - icon: 'map-outline', - color: 'var(--alt-yellow)', - description: 'Discover what StartOS can do', - link: 'https://docs.start9.com/0.3.5.x/user-manual/index', - }, - { - title: 'Contact Support', - icon: 'chatbubbles-outline', - color: 'var(--alt-red)', - description: 'Get help from the Start9 community', - link: 'https://start9.com/contact', - }, - ] -} diff --git a/web/projects/ui/src/app/route-animation.ts b/web/projects/ui/src/app/route-animation.ts deleted file mode 100644 index 17d6e2b75..000000000 --- a/web/projects/ui/src/app/route-animation.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { - animate, - group, - query, - style, - transition, - trigger, -} from '@angular/animations' -export const slideInAnimation = trigger('routeAnimations', [ - transition('* => *', [ - query(':enter, :leave', style({ position: 'fixed', width: '100%' }), { - optional: true, - }), - group([ - query( - ':enter', - [ - style({ transform: 'translateX(-100%)' }), - animate('1s ease-in-out', style({ transform: 'translateX(0%)' })), - ], - { optional: true }, - ), - query( - ':leave', - [ - style({ transform: 'translateX(0%)' }), - animate('1s ease-in-out', style({ transform: 'translateX(100%)' })), - ], - { optional: true }, - ), - ]), - ]), -]) From 171e0ed31286d99ae54a65c40b21376917358aa9 Mon Sep 17 00:00:00 2001 From: J H Date: Tue, 27 Feb 2024 13:20:55 -0700 Subject: [PATCH 063/169] chore: Something --- sdk/package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/package-lock.json b/sdk/package-lock.json index d9d124e1e..c00bd6701 100644 --- a/sdk/package-lock.json +++ b/sdk/package-lock.json @@ -1,12 +1,12 @@ { "name": "@start9labs/start-sdk", - "version": "0.4.0-rev0.lib0.rc8.beta9", + "version": "0.4.0-rev0.lib0.rc8.beta10", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@start9labs/start-sdk", - "version": "0.4.0-rev0.lib0.rc8.beta9", + "version": "0.4.0-rev0.lib0.rc8.beta10", "license": "MIT", "dependencies": { "@iarna/toml": "^2.2.5", From 5366b4c873719c5b49f6026b3ce66f07c0f60333 Mon Sep 17 00:00:00 2001 From: J H Date: Tue, 27 Feb 2024 13:25:58 -0700 Subject: [PATCH 064/169] chore: Add another export --- sdk/lib/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/lib/index.ts b/sdk/lib/index.ts index 1430c3be7..aff2ef7ed 100644 --- a/sdk/lib/index.ts +++ b/sdk/lib/index.ts @@ -3,6 +3,7 @@ export { EmVer } from "./emverLite/mod" export { Overlay } from "./util/Overlay" export { Utils } from "./util/utils" export { StartSdk } from "./StartSdk" +export { setupManifest } from "./manifest/setupManifest" export * as actions from "./actions" export * as backup from "./backup" export * as config from "./config" From 11c93231aa6478912701aaa65b7c4761ef78bd11 Mon Sep 17 00:00:00 2001 From: J H Date: Mon, 4 Mar 2024 13:37:48 -0700 Subject: [PATCH 065/169] fix: Let the service be able to be started --- core/startos/src/service/mod.rs | 35 +++++++++++++++---- .../src/service/service_effect_handler.rs | 18 +++++----- core/startos/src/service/transition/mod.rs | 2 +- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/core/startos/src/service/mod.rs b/core/startos/src/service/mod.rs index b572caa89..b5a9c4bb2 100644 --- a/core/startos/src/service/mod.rs +++ b/core/startos/src/service/mod.rs @@ -389,7 +389,7 @@ impl Service { } } -#[derive(Clone)] +#[derive(Debug, Clone)] struct RunningStatus { health: OrdMap, started: DateTime, @@ -406,7 +406,32 @@ pub(self) struct ServiceActorSeed { synchronized: Arc, } +impl ServiceActorSeed { + pub fn started(&self) { + self.persistent_container + .current_state + .send_replace(StartStop::Start); + self.persistent_container + .running_status + .send_modify(|running_status| { + *running_status = + Some( + std::mem::take(running_status).unwrap_or_else(|| RunningStatus { + health: Default::default(), + started: Utc::now(), + }), + ); + }) + } + pub fn stopped(&self) { + self.persistent_container + .current_state + .send_replace(StartStop::Stop); + self.persistent_container.running_status.send_replace(None); + } +} struct ServiceActor(Arc); + impl Actor for ServiceActor { fn init(&mut self, jobs: &mut BackgroundJobs) { let seed = self.0.clone(); @@ -418,7 +443,7 @@ impl Actor for ServiceActor { let mut transition = seed.transition_state.subscribe(); let mut running = seed.running_status.clone(); loop { - let (desired_state, current_state, transition_kind, running_status) = ( + let (desired_state, current_state, transition_kind, running_status) = dbg!( temp_desired.borrow().unwrap_or(*desired.borrow()), *current.borrow(), transition.borrow().as_ref().map(|t| t.kind()), @@ -464,10 +489,8 @@ impl Actor for ServiceActor { timeout: todo!("sigterm timeout"), } } - (None, StartStop::Start, StartStop::Stop, _) => { - MainStatus::Starting - } - (None, StartStop::Start, StartStop::Start, None) => { + (None, StartStop::Start, StartStop::Stop, _) + | (None, StartStop::Start, StartStop::Start, None) => { MainStatus::Starting } (None, StartStop::Start, StartStop::Start, Some(status)) => { diff --git a/core/startos/src/service/service_effect_handler.rs b/core/startos/src/service/service_effect_handler.rs index 4a8e647d7..c4a9584d3 100644 --- a/core/startos/src/service/service_effect_handler.rs +++ b/core/startos/src/service/service_effect_handler.rs @@ -1,9 +1,10 @@ -use std::ffi::OsString; use std::os::unix::process::CommandExt; use std::path::{Path, PathBuf}; use std::str::FromStr; use std::sync::{Arc, Weak}; +use std::{ffi::OsString, time::Instant}; +use chrono::Utc; use clap::builder::{TypedValueParser, ValueParserFactory}; use clap::Parser; use imbl_value::json; @@ -12,7 +13,6 @@ use patch_db::json_ptr::JsonPointer; use rpc_toolkit::{from_fn, from_fn_async, AnyContext, Context, Empty, HandlerExt, ParentHandler}; use tokio::process::Command; -use crate::db::model::ExposedUI; use crate::disk::mount::filesystem::idmapped::IdMapped; use crate::disk::mount::filesystem::loop_dev::LoopDev; use crate::disk::mount::filesystem::overlayfs::OverlayGuard; @@ -25,6 +25,7 @@ use crate::status::health_check::HealthCheckResult; use crate::status::MainStatus; use crate::util::clap::FromStrParser; use crate::util::{new_guid, Invoke}; +use crate::{db::model::ExposedUI, service::RunningStatus}; use crate::{echo, ARCH}; #[derive(Clone)] @@ -487,6 +488,7 @@ async fn stopped(context: EffectContext, params: ParamsMaybePackageId) -> Result Ok(json!(matches!(package, MainStatus::Stopped))) } async fn running(context: EffectContext, params: ParamsMaybePackageId) -> Result { + dbg!("Starting the running {params:?}"); let context = context.deref()?; let peeked = context.ctx.db.peek().await; let package_id = params.package_id.unwrap_or_else(|| context.id.clone()); @@ -586,14 +588,12 @@ struct SetMainStatus { status: Status, } async fn set_main_status(context: EffectContext, params: SetMainStatus) -> Result { + dbg!(format!("Status for main will be is {params:?}")); let context = context.deref()?; - context - .persistent_container - .current_state - .send_replace(match params.status { - Status::Running => StartStop::Start, - Status::Stopped => StartStop::Stop, - }); + match params.status { + Status::Running => context.started(), + Status::Stopped => context.stopped(), + } Ok(Value::Null) } diff --git a/core/startos/src/service/transition/mod.rs b/core/startos/src/service/transition/mod.rs index 29c1be38d..b472434d4 100644 --- a/core/startos/src/service/transition/mod.rs +++ b/core/startos/src/service/transition/mod.rs @@ -51,7 +51,7 @@ impl Drop for TransitionState { } } -#[derive(Clone)] +#[derive(Debug, Clone)] pub struct TempDesiredState(pub(super) Arc>>); impl TempDesiredState { pub fn stop(&self) { From 88028412bdfed6daf3fd3002a859a0f5002e6de5 Mon Sep 17 00:00:00 2001 From: J H Date: Mon, 4 Mar 2024 14:18:20 -0700 Subject: [PATCH 066/169] chore: Add some documentation for the service actor seed --- core/startos/src/service/mod.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/startos/src/service/mod.rs b/core/startos/src/service/mod.rs index b5a9c4bb2..5dba4cdb4 100644 --- a/core/startos/src/service/mod.rs +++ b/core/startos/src/service/mod.rs @@ -398,11 +398,17 @@ struct RunningStatus { pub(self) struct ServiceActorSeed { ctx: RpcContext, id: PackageId, + // Needed to interact with the container for the service persistent_container: PersistentContainer, + // Setting this value causes the service actor to try to bring the service to the specified state. This is done in the background job created in ServiceActor::init desired_state: watch::Sender, + // Override the current desired state for the service during a transition (this is protected by a guard that sets this value to null on drop) temp_desired_state: TempDesiredState, + // This represents a currently running task that affects the service's shown state, such as BackingUp or Restarting. transition_state: Arc>>, + // This contains the start time and health check information for when the service is running. Note: Will be overwritting to the db, running_status: watch::Receiver>, + // This is notified every time the background job created in ServiceActor::init responds to a change synchronized: Arc, } From 093a5d4ddf8f7a6ea970564b5b38e1306789a6cc Mon Sep 17 00:00:00 2001 From: J H Date: Wed, 6 Mar 2024 09:38:55 -0700 Subject: [PATCH 067/169] chore: Simplify the state into one --- .../Systems/SystemForEmbassy/index.ts | 4 +- .../src/Adapters/Systems/SystemForStartOs.ts | 3 +- container-runtime/src/Models/Duration.ts | 6 + core/startos/src/service/control.rs | 21 +-- core/startos/src/service/mod.rs | 158 +++++++----------- .../src/service/persistent_container.rs | 68 +++++--- core/startos/src/service/transition/mod.rs | 36 ++-- .../startos/src/service/transition/restart.rs | 31 +++- 8 files changed, 174 insertions(+), 153 deletions(-) create mode 100644 container-runtime/src/Models/Duration.ts diff --git a/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts b/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts index 4814da9b2..8495a669b 100644 --- a/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts +++ b/container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts @@ -2,6 +2,7 @@ import { types as T, util, EmVer } from "@start9labs/start-sdk" import * as fs from "fs/promises" import { PolyfillEffects } from "./polyfillEffects" +import { Duration, duration } from "../../../Models/Duration" import { ExecuteResult, System } from "../../../Interfaces/System" import { matchManifest, Manifest, Procedure } from "./matchManifest" import { create } from "domain" @@ -202,7 +203,7 @@ export class SystemForEmbassy implements System { private async mainStop( effects: HostSystemStartOs, options?: { timeout?: number }, - ): Promise { + ): Promise { const { currentRunning } = this delete this.currentRunning if (currentRunning) { @@ -210,6 +211,7 @@ export class SystemForEmbassy implements System { timeout: options?.timeout || this.manifest.main["sigterm-timeout"], }) } + return duration(this.manifest.main["sigterm-timeout"], "s") } private async createBackup(effects: HostSystemStartOs): Promise { const backup = this.manifest.backup.create diff --git a/container-runtime/src/Adapters/Systems/SystemForStartOs.ts b/container-runtime/src/Adapters/Systems/SystemForStartOs.ts index 95afb5fb4..7549bf0f2 100644 --- a/container-runtime/src/Adapters/Systems/SystemForStartOs.ts +++ b/container-runtime/src/Adapters/Systems/SystemForStartOs.ts @@ -4,6 +4,7 @@ import { string } from "ts-matches" import { HostSystemStartOs } from "../HostSystemStartOs" import { Effects } from "../../Models/Effects" import { RpcResult } from "../RpcListener" +import { duration } from "../../Models/Duration" const LOCATION = "/usr/lib/startos/package/startos" export class SystemForStartOs implements System { private onTerm: (() => Promise) | undefined @@ -82,7 +83,7 @@ export class SystemForStartOs implements System { await effects.setMainStatus({ status: "stopped" }) if (this.onTerm) await this.onTerm() delete this.onTerm - return + return duration(30, "s") } case "/config/set": { const path = `${LOCATION}/procedures/config` diff --git a/container-runtime/src/Models/Duration.ts b/container-runtime/src/Models/Duration.ts new file mode 100644 index 000000000..8c701a703 --- /dev/null +++ b/container-runtime/src/Models/Duration.ts @@ -0,0 +1,6 @@ +export type TimeUnit = "d" | "h" | "s" | "ms" +export type Duration = `${number}${TimeUnit}` + +export function duration(timeValue: number, timeUnit: TimeUnit = "s") { + return `${timeValue}${timeUnit}` as Duration +} diff --git a/core/startos/src/service/control.rs b/core/startos/src/service/control.rs index 17c432755..88d66d97c 100644 --- a/core/startos/src/service/control.rs +++ b/core/startos/src/service/control.rs @@ -9,7 +9,9 @@ struct Start; impl Handler for ServiceActor { type Response = (); async fn handle(&mut self, _: Start, _: &mut BackgroundJobs) -> Self::Response { - self.0.desired_state.send_replace(StartStop::Start); + self.0.persistent_container.state.send_modify(|x| { + x.desired_state = StartStop::Start; + }); self.0.synchronized.notified().await } } @@ -24,16 +26,15 @@ struct Stop; impl Handler for ServiceActor { type Response = (); async fn handle(&mut self, _: Stop, _: &mut BackgroundJobs) -> Self::Response { - self.0.desired_state.send_replace(StartStop::Stop); - if self.0.transition_state.borrow().as_ref().map(|t| t.kind()) - == Some(TransitionKind::Restarting) - { - if let Some(restart) = self.0.transition_state.send_replace(None) { - restart.abort().await; - } else { - #[cfg(feature = "unstable")] - unreachable!() + let mut transition_state = None; + self.0.persistent_container.state.send_modify(|x| { + x.desired_state = StartStop::Stop; + if x.transition_state.as_ref().map(|x| x.kind()) == Some(TransitionKind::Restarting) { + transition_state = std::mem::take(&mut x.transition_state); } + }); + if let Some(restart) = transition_state { + restart.abort().await; } self.0.synchronized.notified().await } diff --git a/core/startos/src/service/mod.rs b/core/startos/src/service/mod.rs index 5dba4cdb4..3335be1ca 100644 --- a/core/startos/src/service/mod.rs +++ b/core/startos/src/service/mod.rs @@ -1,5 +1,5 @@ -use std::sync::Arc; use std::time::Duration; +use std::{ops::Deref, sync::Arc}; use chrono::{DateTime, Utc}; use clap::Parser; @@ -70,23 +70,17 @@ impl Service { #[instrument(skip_all)] async fn new(ctx: RpcContext, s9pk: S9pk, start: StartStop) -> Result { let id = s9pk.as_manifest().id.clone(); - let desired_state = watch::channel(start).0; - let temp_desired_state = TempDesiredState(Arc::new(watch::channel(None).0)); let persistent_container = PersistentContainer::new( - &ctx, - s9pk, + &ctx, s9pk, + start, // desired_state.subscribe(), // temp_desired_state.subscribe(), ) .await?; let seed = Arc::new(ServiceActorSeed { id, - running_status: persistent_container.running_status.subscribe(), persistent_container, ctx, - desired_state, - temp_desired_state, - transition_state: Arc::new(watch::channel(None).0), synchronized: Arc::new(Notify::new()), }); seed.persistent_container @@ -383,7 +377,7 @@ impl Service { .await?; self.shutdown().await } - pub async fn backup(&self, guard: impl GenericMountGuard) -> Result { + pub async fn backup(&self, _guard: impl GenericMountGuard) -> Result { // TODO Err(Error::new(eyre!("not yet implemented"), ErrorKind::Unknown)) } @@ -395,45 +389,36 @@ struct RunningStatus { started: DateTime, } -pub(self) struct ServiceActorSeed { +struct ServiceActorSeed { ctx: RpcContext, id: PackageId, - // Needed to interact with the container for the service + /// Needed to interact with the container for the service persistent_container: PersistentContainer, - // Setting this value causes the service actor to try to bring the service to the specified state. This is done in the background job created in ServiceActor::init - desired_state: watch::Sender, - // Override the current desired state for the service during a transition (this is protected by a guard that sets this value to null on drop) - temp_desired_state: TempDesiredState, - // This represents a currently running task that affects the service's shown state, such as BackingUp or Restarting. - transition_state: Arc>>, - // This contains the start time and health check information for when the service is running. Note: Will be overwritting to the db, - running_status: watch::Receiver>, - // This is notified every time the background job created in ServiceActor::init responds to a change + /// This is notified every time the background job created in ServiceActor::init responds to a change synchronized: Arc, } impl ServiceActorSeed { + /// Used to indicate that we have finished the task of starting the service pub fn started(&self) { - self.persistent_container - .current_state - .send_replace(StartStop::Start); - self.persistent_container - .running_status - .send_modify(|running_status| { - *running_status = - Some( - std::mem::take(running_status).unwrap_or_else(|| RunningStatus { + self.persistent_container.state.send_modify(|state| { + state.running_status = + Some( + state + .running_status + .take() + .unwrap_or_else(|| RunningStatus { health: Default::default(), started: Utc::now(), }), - ); - }) + ); + }); } + /// Used to indicate that we have finished the task of stopping the service pub fn stopped(&self) { - self.persistent_container - .current_state - .send_replace(StartStop::Stop); - self.persistent_container.running_status.send_replace(None); + self.persistent_container.state.send_modify(|state| { + state.running_status = None; + }); } } struct ServiceActor(Arc); @@ -443,20 +428,41 @@ impl Actor for ServiceActor { let seed = self.0.clone(); jobs.add_job(async move { let id = seed.id.clone(); - let mut current = seed.persistent_container.current_state.subscribe(); - let mut desired = seed.desired_state.subscribe(); - let mut temp_desired = seed.temp_desired_state.subscribe(); - let mut transition = seed.transition_state.subscribe(); - let mut running = seed.running_status.clone(); + let mut current = seed.persistent_container.state.subscribe(); + loop { - let (desired_state, current_state, transition_kind, running_status) = dbg!( - temp_desired.borrow().unwrap_or(*desired.borrow()), - *current.borrow(), - transition.borrow().as_ref().map(|t| t.kind()), - running.borrow().clone(), - ); + let kinds = dbg!(current.borrow().kinds()); if let Err(e) = async { + let main_status = match ( + kinds.transition_state, + kinds.desired_state, + kinds.running_status, + ) { + (Some(TransitionKind::Restarting), _, _) => MainStatus::Restarting, + (Some(TransitionKind::BackingUp), _, Some(status)) => { + MainStatus::BackingUp { + started: Some(status.started), + health: status.health.clone(), + } + } + (Some(TransitionKind::BackingUp), _, None) => MainStatus::BackingUp { + started: None, + health: OrdMap::new(), + }, + (None, StartStop::Stop, None) => MainStatus::Stopped, + (None, StartStop::Stop, Some(_)) => MainStatus::Stopping { + timeout: seed.persistent_container.stop().await?.into(), + }, + (None, StartStop::Start, Some(status)) => MainStatus::Running { + started: status.started, + health: status.health.clone(), + }, + (None, StartStop::Start, None) => { + seed.persistent_container.start().await?; + MainStatus::Starting + } + }; seed.ctx .db .mutate(|d| { @@ -466,61 +472,13 @@ impl Actor for ServiceActor { .as_idx_mut(&id) .and_then(|p| p.as_installed_mut()) { - i.as_status_mut().as_main_mut().ser(&match ( - transition_kind, - desired_state, - current_state, - running_status, - ) { - (Some(TransitionKind::Restarting), _, _, _) => { - MainStatus::Restarting - } - (Some(TransitionKind::BackingUp), _, _, Some(status)) => { - MainStatus::BackingUp { - started: Some(status.started), - health: status.health.clone(), - } - } - (Some(TransitionKind::BackingUp), _, _, None) => { - MainStatus::BackingUp { - started: None, - health: OrdMap::new(), - } - } - (None, StartStop::Stop, StartStop::Stop, _) => { - MainStatus::Stopped - } - (None, StartStop::Stop, StartStop::Start, _) => { - MainStatus::Stopping { - timeout: todo!("sigterm timeout"), - } - } - (None, StartStop::Start, StartStop::Stop, _) - | (None, StartStop::Start, StartStop::Start, None) => { - MainStatus::Starting - } - (None, StartStop::Start, StartStop::Start, Some(status)) => { - MainStatus::Running { - started: status.started, - health: status.health.clone(), - } - } - })?; + i.as_status_mut().as_main_mut().ser(&main_status)?; } Ok(()) }) .await?; - match (desired_state, current_state) { - (StartStop::Start, StartStop::Stop) => { - seed.persistent_container.start().await - } - (StartStop::Stop, StartStop::Start) => { - seed.persistent_container - .stop(todo!("s9pk sigterm timeout")) - .await - } - _ => Ok(()), - } + + Ok::<_, Error>(()) } .await { @@ -538,10 +496,6 @@ impl Actor for ServiceActor { tokio::select! { _ = current.changed() => (), - _ = desired.changed() => (), - _ = temp_desired.changed() => (), - _ = transition.changed() => (), - _ = running.changed() => (), } } }) diff --git a/core/startos/src/service/persistent_container.rs b/core/startos/src/service/persistent_container.rs index eee353a07..28067cdd8 100644 --- a/core/startos/src/service/persistent_container.rs +++ b/core/startos/src/service/persistent_container.rs @@ -15,8 +15,11 @@ use tokio::process::Command; use tokio::sync::{oneshot, watch, Mutex, OnceCell}; use tracing::instrument; -use super::service_effect_handler::{service_effect_handler, EffectContext}; -use super::ServiceActorSeed; +use super::{ + service_effect_handler::{service_effect_handler, EffectContext}, + transition::{TempDesiredState, TransitionKind}, +}; +use super::{transition::TransitionState, ServiceActorSeed}; use crate::context::RpcContext; use crate::disk::mount::filesystem::bind::Bind; use crate::disk::mount::filesystem::idmapped::IdMapped; @@ -39,6 +42,43 @@ const RPC_CONNECT_TIMEOUT: Duration = Duration::from_secs(10); struct ProcedureId(u64); +#[derive(Debug)] +pub struct ServiceState { + // This contains the start time and health check information for when the service is running. Note: Will be overwritting to the db, + pub(super) running_status: Option, + /// Setting this value causes the service actor to try to bring the service to the specified state. This is done in the background job created in ServiceActor::init + pub(super) desired_state: StartStop, + /// Override the current desired state for the service during a transition (this is protected by a guard that sets this value to null on drop) + pub(super) temp_desired_state: Option, + /// This represents a currently running task that affects the service's shown state, such as BackingUp or Restarting. + pub(super) transition_state: Option, +} + +#[derive(Debug)] +pub struct ServiceStateKinds { + pub transition_state: Option, + pub running_status: Option, + pub desired_state: StartStop, +} + +impl ServiceState { + pub fn new(desired_state: StartStop) -> Self { + Self { + running_status: Default::default(), + temp_desired_state: Default::default(), + transition_state: Default::default(), + desired_state, + } + } + pub fn kinds(&self) -> ServiceStateKinds { + ServiceStateKinds { + transition_state: self.transition_state.as_ref().map(|x| x.kind()), + desired_state: self.temp_desired_state.unwrap_or(self.desired_state), + running_status: self.running_status.clone(), + } + } +} + // @DRB On top of this we need to also have the procedures to have the effects and get the results back for them, maybe lock them to the running instance? /// This contains the LXC container running the javascript init system /// that can be used via a JSON RPC Client connected to a unix domain @@ -53,20 +93,12 @@ pub struct PersistentContainer { volumes: BTreeMap, assets: BTreeMap, pub(super) overlays: Arc>>, - pub(super) current_state: watch::Sender, - // pub(super) desired_state: watch::Receiver, - // pub(super) temp_desired_state: watch::Receiver>, - pub(super) running_status: watch::Sender>, + pub(super) state: Arc>, } impl PersistentContainer { #[instrument(skip_all)] - pub async fn new( - ctx: &RpcContext, - s9pk: S9pk, - // desired_state: watch::Receiver, - // temp_desired_state: watch::Receiver>, - ) -> Result { + pub async fn new(ctx: &RpcContext, s9pk: S9pk, start: StartStop) -> Result { let lxc_container = ctx.lxc_manager.create(LxcConfig::default()).await?; let rpc_client = lxc_container.connect_rpc(Some(RPC_CONNECT_TIMEOUT)).await?; let js_mount = MountGuard::mount( @@ -156,10 +188,7 @@ impl PersistentContainer { volumes, assets, overlays: Arc::new(Mutex::new(BTreeMap::new())), - current_state: watch::channel(StartStop::Stop).0, - // desired_state, - // temp_desired_state, - running_status: watch::channel(None).0, + state: Arc::new(watch::channel(ServiceState::new(start)).0), }) } @@ -280,10 +309,11 @@ impl PersistentContainer { } #[instrument(skip_all)] - pub async fn stop(&self, timeout: Option) -> Result<(), Error> { - self.execute(ProcedureName::StopMain, Value::Null, timeout) + pub async fn stop(&self) -> Result { + let timeout: Option = self + .execute(ProcedureName::StopMain, Value::Null, None) .await?; - Ok(()) + Ok(timeout.map(|a| *a).unwrap_or(Duration::from_secs(30))) } #[instrument(skip_all)] diff --git a/core/startos/src/service/transition/mod.rs b/core/startos/src/service/transition/mod.rs index b472434d4..cd7979cae 100644 --- a/core/startos/src/service/transition/mod.rs +++ b/core/startos/src/service/transition/mod.rs @@ -1,5 +1,5 @@ -use std::ops::Deref; use std::sync::Arc; +use std::{fmt::Display, ops::Deref}; use futures::{Future, FutureExt}; use tokio::sync::watch; @@ -8,6 +8,8 @@ use crate::service::start_stop::StartStop; use crate::util::actor::BackgroundJobs; use crate::util::future::{CancellationHandle, RemoteCancellable}; +use super::persistent_container::ServiceState; + pub mod backup; pub mod restart; @@ -23,6 +25,13 @@ pub struct TransitionState { cancel_handle: CancellationHandle, kind: TransitionKind, } +impl ::std::fmt::Debug for TransitionState { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("TransitionState") + .field("kind", &self.kind) + .finish_non_exhaustive() + } +} impl TransitionState { pub fn kind(&self) -> TransitionKind { @@ -52,23 +61,28 @@ impl Drop for TransitionState { } #[derive(Debug, Clone)] -pub struct TempDesiredState(pub(super) Arc>>); +pub struct TempDesiredState(pub(super) Arc>); impl TempDesiredState { + pub fn new(state: &Arc>) -> Self { + Self(state.clone()) + } pub fn stop(&self) { - self.0.send_replace(Some(StartStop::Stop)); + self.0 + .send_modify(|s| s.temp_desired_state = Some(StartStop::Stop)); } pub fn start(&self) { - self.0.send_replace(Some(StartStop::Start)); + self.0 + .send_modify(|s| s.temp_desired_state = Some(StartStop::Start)); } } impl Drop for TempDesiredState { fn drop(&mut self) { - self.0.send_replace(None); - } -} -impl Deref for TempDesiredState { - type Target = watch::Sender>; - fn deref(&self) -> &Self::Target { - &*self.0 + self.0.send_modify(|s| s.temp_desired_state = None); } } +// impl Deref for TempDesiredState { +// type Target = watch::Sender>; +// fn deref(&self) -> &Self::Target { +// &*self.0 +// } +// } diff --git a/core/startos/src/service/transition/restart.rs b/core/startos/src/service/transition/restart.rs index 71a889305..9c82d0282 100644 --- a/core/startos/src/service/transition/restart.rs +++ b/core/startos/src/service/transition/restart.rs @@ -1,32 +1,45 @@ +use std::sync::Arc; + use futures::FutureExt; use crate::prelude::*; -use crate::service::start_stop::StartStop; use crate::service::transition::{TransitionKind, TransitionState}; use crate::service::{Service, ServiceActor}; use crate::util::actor::{BackgroundJobs, Handler}; use crate::util::future::RemoteCancellable; +use super::TempDesiredState; + struct Restart; #[async_trait::async_trait] impl Handler for ServiceActor { type Response = (); async fn handle(&mut self, _: Restart, jobs: &mut BackgroundJobs) -> Self::Response { - let temp = self.0.temp_desired_state.clone(); - let mut current = self.0.persistent_container.current_state.subscribe(); + // So Need a handle to just a single field in the state + let temp = TempDesiredState::new(&self.0.persistent_container.state); + let mut current = self.0.persistent_container.state.subscribe(); let transition = RemoteCancellable::new(async move { temp.stop(); - current.wait_for(|s| *s == StartStop::Stop).await; + current.wait_for(|s| s.running_status.is_none()).await; temp.start(); - current.wait_for(|s| *s == StartStop::Start).await; + current.wait_for(|s| s.running_status.is_some()).await; + drop(temp); }); let cancel_handle = transition.cancellation_handle(); jobs.add_job(transition.map(|_| ())); let notified = self.0.synchronized.notified(); - if let Some(t) = self.0.transition_state.send_replace(Some(TransitionState { - kind: TransitionKind::Restarting, - cancel_handle, - })) { + + let mut old = None; + self.0.persistent_container.state.send_modify(|s| { + old = std::mem::replace( + &mut s.transition_state, + Some(TransitionState { + kind: TransitionKind::Restarting, + cancel_handle, + }), + ) + }); + if let Some(t) = old { t.abort().await; } notified.await From 8410929e86fde6287813c70f49bfc3eb7c33360d Mon Sep 17 00:00:00 2001 From: J H Date: Wed, 6 Mar 2024 10:55:21 -0700 Subject: [PATCH 068/169] feat: Add the stop/start loop for the service --- .../Systems/SystemForEmbassy/MainLoop.ts | 3 +- .../src/service/service_effect_handler.rs | 39 ++++++++++++++++--- sdk/lib/types.ts | 8 +++- sdk/lib/util/Overlay.ts | 10 +++-- sdk/lib/util/utils.ts | 5 ++- 5 files changed, 52 insertions(+), 13 deletions(-) diff --git a/container-runtime/src/Adapters/Systems/SystemForEmbassy/MainLoop.ts b/container-runtime/src/Adapters/Systems/SystemForEmbassy/MainLoop.ts index 484e02c24..daf3ade70 100644 --- a/container-runtime/src/Adapters/Systems/SystemForEmbassy/MainLoop.ts +++ b/container-runtime/src/Adapters/Systems/SystemForEmbassy/MainLoop.ts @@ -86,10 +86,11 @@ export class MainLoop { public async clean(options?: { timeout?: number }) { const { mainEvent, healthLoops, propertiesEvent } = this + const main = await mainEvent delete this.mainEvent delete this.healthLoops delete this.propertiesEvent - if (mainEvent) await (await mainEvent).daemon.term() + if (mainEvent) await main?.daemon.term() clearInterval(propertiesEvent) if (healthLoops) healthLoops.forEach((x) => clearInterval(x.interval)) } diff --git a/core/startos/src/service/service_effect_handler.rs b/core/startos/src/service/service_effect_handler.rs index c4a9584d3..55bc07916 100644 --- a/core/startos/src/service/service_effect_handler.rs +++ b/core/startos/src/service/service_effect_handler.rs @@ -7,7 +7,7 @@ use std::{ffi::OsString, time::Instant}; use chrono::Utc; use clap::builder::{TypedValueParser, ValueParserFactory}; use clap::Parser; -use imbl_value::json; +use imbl_value::{json, InternedString}; use models::{ActionId, HealthCheckId, ImageId, PackageId}; use patch_db::json_ptr::JsonPointer; use rpc_toolkit::{from_fn, from_fn_async, AnyContext, Context, Empty, HandlerExt, ParentHandler}; @@ -111,11 +111,15 @@ pub fn service_effect_handler() -> ParentHandler { .subcommand( "createOverlayedImage", from_fn_async(create_overlayed_image) - .with_custom_display_fn::(|_, path| { + .with_custom_display_fn::(|_, (path, _)| { Ok(println!("{}", path.display())) }) .with_remote_cli::(), ) + .subcommand( + "destroyOverlayedImage", + from_fn_async(destroy_overlayed_image).no_cli(), + ) .subcommand( "getSslCertificate", from_fn_async(get_ssl_certificate).no_cli(), @@ -668,7 +672,32 @@ async fn set_health(context: EffectContext, params: SetHealth) -> Result Result<(), Error> { + let ctx = ctx.deref()?; + if ctx + .persistent_container + .overlays + .lock() + .await + .remove(&guid) + .is_none() + { + tracing::warn!("Could not find a guard to remove on the destroy overlayed image; assumming that it already is removed and will be skipping"); + } + Ok(()) +} #[derive(serde::Deserialize, serde::Serialize, Parser)] #[serde(rename_all = "camelCase")] #[command(rename_all = "camelCase")] @@ -680,10 +709,10 @@ pub struct CreateOverlayedImageParams { pub async fn create_overlayed_image( ctx: EffectContext, CreateOverlayedImageParams { image_id }: CreateOverlayedImageParams, -) -> Result { +) -> Result<(PathBuf, InternedString), Error> { let ctx = ctx.deref()?; let path = Path::new("images") - .join(&*ARCH) + .join(*ARCH) .join(&image_id) .with_extension("squashfs"); if let Some(image) = ctx @@ -730,7 +759,7 @@ pub async fn create_overlayed_image( .lock() .await .insert(guid.clone(), guard); - Ok(container_mountpoint) + Ok((container_mountpoint, guid)) } else { Err(Error::new( eyre!("image {image_id} not found in s9pk"), diff --git a/sdk/lib/types.ts b/sdk/lib/types.ts index e0bc4a259..cb1946818 100644 --- a/sdk/lib/types.ts +++ b/sdk/lib/types.ts @@ -276,7 +276,13 @@ export type Effects = { }): Promise /** A low level api used by makeOverlay */ - createOverlayedImage(options: { imageId: string }): Promise + createOverlayedImage(options: { imageId: string }): Promise<[string, string]> + + /** A low level api used by destroyOverlay + makeOverlay:destroy */ + destroyOverlayedImage(options: { + imageId: string + guid: string + }): Promise /** Removes all network bindings */ clearBindings(): Promise diff --git a/sdk/lib/util/Overlay.ts b/sdk/lib/util/Overlay.ts index 5f928289d..36dbaead5 100644 --- a/sdk/lib/util/Overlay.ts +++ b/sdk/lib/util/Overlay.ts @@ -10,9 +10,10 @@ export class Overlay { readonly effects: T.Effects, readonly imageId: string, readonly rootfs: string, + readonly guid: string, ) {} static async of(effects: T.Effects, imageId: string) { - const rootfs = await effects.createOverlayedImage({ imageId }) + const [rootfs, guid] = await effects.createOverlayedImage({ imageId }) for (const dirPart of ["dev", "sys", "proc", "run"] as const) { await fs.mkdir(`${rootfs}/${dirPart}`, { recursive: true }) @@ -23,7 +24,7 @@ export class Overlay { ]) } - return new Overlay(effects, imageId, rootfs) + return new Overlay(effects, imageId, rootfs, guid) } async mount(options: MountOptions, path: string): Promise { @@ -51,8 +52,9 @@ export class Overlay { } async destroy() { - await execFile("umount", ["-R", this.rootfs]) - await fs.rm(this.rootfs, { recursive: true, force: true }) + const imageId = this.imageId + const guid = this.guid + await this.effects.destroyOverlayedImage({ imageId, guid }) } async exec( diff --git a/sdk/lib/util/utils.ts b/sdk/lib/util/utils.ts index af6ae89cb..cb5afae3d 100644 --- a/sdk/lib/util/utils.ts +++ b/sdk/lib/util/utils.ts @@ -246,7 +246,7 @@ export const createUtils = < console.error(data.toString()) }) - childProcess.on("close", (code: any) => { + childProcess.on("exit", (code: any) => { if (code === 0) { return resolve(null) } @@ -262,7 +262,7 @@ export const createUtils = < try { childProcess.kill(signal) - if (timeout <= NO_TIMEOUT) { + if (timeout > NO_TIMEOUT) { const didTimeout = await Promise.race([ new Promise((resolve) => setTimeout(resolve, timeout)).then( () => true, @@ -270,6 +270,7 @@ export const createUtils = < answer.then(() => false), ]) if (didTimeout) childProcess.kill(SIGKILL) + return } await answer } finally { From f3ccad192c7b73c60f155e9796cbde97e8202d07 Mon Sep 17 00:00:00 2001 From: J H Date: Wed, 6 Mar 2024 15:43:07 -0700 Subject: [PATCH 069/169] chore: Add the process tree destroyer --- .../src/Adapters/HostSystemStartOs.ts | 12 +++++- sdk/lib/mainFn/Daemons.ts | 2 + sdk/lib/util/utils.ts | 41 ++++++++++++++++--- 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/container-runtime/src/Adapters/HostSystemStartOs.ts b/container-runtime/src/Adapters/HostSystemStartOs.ts index 007f783c0..ec4fac796 100644 --- a/container-runtime/src/Adapters/HostSystemStartOs.ts +++ b/container-runtime/src/Adapters/HostSystemStartOs.ts @@ -110,11 +110,21 @@ export class HostSystemStartOs implements Effects { T.Effects["clearServiceInterfaces"] > } - createOverlayedImage(options: { imageId: string }): Promise { + createOverlayedImage(options: { + imageId: string + }): Promise<[string, string]> { return this.rpcRound("createOverlayedImage", options) as ReturnType< T.Effects["createOverlayedImage"] > } + destroyOverlayedImage(options: { + imageId: string + guid: string + }): Promise { + return this.rpcRound("destroyOverlayedImage", options) as ReturnType< + T.Effects["destroyOverlayedImage"] + > + } executeAction(...[options]: Parameters) { return this.rpcRound("executeAction", options) as ReturnType< T.Effects["executeAction"] diff --git a/sdk/lib/mainFn/Daemons.ts b/sdk/lib/mainFn/Daemons.ts index 45ff723d0..e9986ad3f 100644 --- a/sdk/lib/mainFn/Daemons.ts +++ b/sdk/lib/mainFn/Daemons.ts @@ -137,6 +137,7 @@ export class Daemons { } return { async term(options?: { signal?: Signals; timeout?: number }) { + console.error("Bluj Daemons term") await Promise.all( Object.values>(daemonsStarted).map((x) => x.then((x) => x.term(options)), @@ -144,6 +145,7 @@ export class Daemons { ) }, async wait() { + console.error("Bluj Daemons wait") await Promise.all( Object.values>(daemonsStarted).map((x) => x.then((x) => x.wait()), diff --git a/sdk/lib/util/utils.ts b/sdk/lib/util/utils.ts index cb5afae3d..e8eb7f6e0 100644 --- a/sdk/lib/util/utils.ts +++ b/sdk/lib/util/utils.ts @@ -254,11 +254,21 @@ export const createUtils = < }) }) + const pid = childProcess.pid return { - wait() { - return answer + async wait() { + const pids = pid ? await psTree(pid, overlay) : [] + try { + return await answer + } finally { + for (const process of pids) { + overlay.exec(["kill", `-9`, String(process)]) + } + } }, async term({ signal = SIGTERM, timeout = NO_TIMEOUT } = {}) { + const pids = pid ? await psTree(pid, overlay) : [] + console.error("Bluj killing pid ", pids) try { childProcess.kill(signal) @@ -269,13 +279,26 @@ export const createUtils = < ), answer.then(() => false), ]) - if (didTimeout) childProcess.kill(SIGKILL) - return + if (didTimeout) { + childProcess.kill(SIGKILL) + } + } else { + await answer } - await answer } finally { await overlay.destroy() } + + console.error("Bluj actually killing pid ", pids) + try { + for (const process of pids) { + await overlay.exec(["kill", `-${signal}`, String(process)]) + } + } finally { + for (const process of pids) { + overlay.exec(["kill", `-9`, String(process)]) + } + } }, } }, @@ -294,3 +317,11 @@ export const createUtils = < } } function noop(): void {} + +async function psTree(pid: number, overlay: Overlay): Promise { + const { stdout } = await overlay.exec(["pstree", `-p`, String(pid)]) + const regex: RegExp = /\((\d+)\)/g + return [...stdout.toString().matchAll(regex)].map(([_all, pid]) => + parseInt(pid), + ) +} From 14be2fa344e676955538f5e11630d9a8077fdc77 Mon Sep 17 00:00:00 2001 From: J H Date: Wed, 6 Mar 2024 16:22:29 -0700 Subject: [PATCH 070/169] chore: Add in the ability to kill the tree of processes --- sdk/lib/util/utils.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/sdk/lib/util/utils.ts b/sdk/lib/util/utils.ts index e8eb7f6e0..2f9388884 100644 --- a/sdk/lib/util/utils.ts +++ b/sdk/lib/util/utils.ts @@ -47,6 +47,7 @@ const childProcess = { exec: promisify(CP.exec), execFile: promisify(CP.execFile), } +const cp = childProcess export type ServiceInterfaceType = "ui" | "p2p" | "api" @@ -262,7 +263,7 @@ export const createUtils = < return await answer } finally { for (const process of pids) { - overlay.exec(["kill", `-9`, String(process)]) + cp.execFile("kill", [`-9`, String(process)]).catch((_) => {}) } } }, @@ -292,11 +293,11 @@ export const createUtils = < console.error("Bluj actually killing pid ", pids) try { for (const process of pids) { - await overlay.exec(["kill", `-${signal}`, String(process)]) + await cp.execFile("kill", [`-${signal}`, String(process)]) } } finally { for (const process of pids) { - overlay.exec(["kill", `-9`, String(process)]) + cp.execFile("kill", [`-9`, String(process)]).catch((_) => {}) } } }, @@ -319,7 +320,7 @@ export const createUtils = < function noop(): void {} async function psTree(pid: number, overlay: Overlay): Promise { - const { stdout } = await overlay.exec(["pstree", `-p`, String(pid)]) + const { stdout } = await childProcess.exec(`pstree -p ${pid}`) const regex: RegExp = /\((\d+)\)/g return [...stdout.toString().matchAll(regex)].map(([_all, pid]) => parseInt(pid), From efbbaa57411c4a108f156cac5d0df6c46c6b8807 Mon Sep 17 00:00:00 2001 From: J H Date: Thu, 7 Mar 2024 11:38:59 -0700 Subject: [PATCH 071/169] feat: Get the health checks for the js --- .../src/Adapters/HostSystemStartOs.ts | 1 + .../Systems/SystemForEmbassy/MainLoop.ts | 138 +++++++++++++----- .../src/service/service_effect_handler.rs | 58 ++++---- core/startos/src/status/health_check.rs | 10 ++ sdk/lib/health/HealthCheck.ts | 4 +- sdk/lib/health/checkFns/checkPortListening.ts | 4 +- sdk/lib/health/checkFns/checkWebUrl.ts | 13 +- sdk/lib/health/checkFns/runHealthScript.ts | 2 +- sdk/lib/mainFn/Daemons.ts | 2 +- sdk/lib/types.ts | 7 +- 10 files changed, 159 insertions(+), 80 deletions(-) diff --git a/container-runtime/src/Adapters/HostSystemStartOs.ts b/container-runtime/src/Adapters/HostSystemStartOs.ts index ec4fac796..e863b6714 100644 --- a/container-runtime/src/Adapters/HostSystemStartOs.ts +++ b/container-runtime/src/Adapters/HostSystemStartOs.ts @@ -268,6 +268,7 @@ export class HostSystemStartOs implements Effects { > } setHealth(...[options]: Parameters) { + console.error("BLUJ sethealth", options) return this.rpcRound("setHealth", options) as ReturnType< T.Effects["setHealth"] > diff --git a/container-runtime/src/Adapters/Systems/SystemForEmbassy/MainLoop.ts b/container-runtime/src/Adapters/Systems/SystemForEmbassy/MainLoop.ts index daf3ade70..8142a17df 100644 --- a/container-runtime/src/Adapters/Systems/SystemForEmbassy/MainLoop.ts +++ b/container-runtime/src/Adapters/Systems/SystemForEmbassy/MainLoop.ts @@ -106,46 +106,106 @@ export class MainLoop { const { manifest } = this.system const effects = this.effects const start = Date.now() - return Object.values(manifest["health-checks"]).map((value) => { - const name = value.name - const interval = setInterval(async () => { - const actionProcedure = value - const timeChanged = Date.now() - start - if (actionProcedure.type === "docker") { - const container = await DockerProcedureContainer.of( - effects, - actionProcedure, - manifest.volumes, - ) - const executed = await container.exec([ - actionProcedure.entrypoint, - ...actionProcedure.args, - JSON.stringify(timeChanged), - ]) - const stderr = executed.stderr.toString() - if (stderr) - console.error(`Error running health check ${value.name}: ${stderr}`) - return executed.stdout.toString() - } else { - const moduleCode = await this.system.moduleCode - const method = moduleCode.health?.[value.name] - if (!method) - return console.error( - `Expecting that thejs health check ${value.name} exists`, + return Object.entries(manifest["health-checks"]).map( + ([healthId, value]) => { + const interval = setInterval(async () => { + const actionProcedure = value + const timeChanged = Date.now() - start + if (actionProcedure.type === "docker") { + const container = await DockerProcedureContainer.of( + effects, + actionProcedure, + manifest.volumes, ) - return (await method( - new PolyfillEffects(effects, this.system.manifest), - timeChanged, - ).then((x) => { - if ("result" in x) return x.result - if ("error" in x) - return console.error("Error getting config: " + x.error) - return console.error("Error getting config: " + x["error-code"][1]) - })) as any - } - }, EMBASSY_HEALTH_INTERVAL) + const executed = await container.exec([ + actionProcedure.entrypoint, + ...actionProcedure.args, + JSON.stringify(timeChanged), + ]) + const stderr = executed.stderr.toString() + if (stderr) + console.error( + `Error running health check ${value.name}: ${stderr}`, + ) + return executed.stdout.toString() + } else { + actionProcedure + const moduleCode = await this.system.moduleCode + const method = moduleCode.health?.[healthId] + if (!method) { + await effects.setHealth({ + name: healthId, + status: "failure", + message: `Expecting that thejs health check ${healthId} exists`, + }) + return + } - return { name, interval } - }) + const result = await method( + new PolyfillEffects(effects, this.system.manifest), + timeChanged, + ) + + if ("result" in result) { + await effects.setHealth({ + name: healthId, + status: "passing", + }) + return + } + if ("error" in result) { + await effects.setHealth({ + name: healthId, + status: "failure", + message: result.error, + }) + return + } + if (!("error-code" in result)) { + await effects.setHealth({ + name: healthId, + status: "failure", + message: `Unknown error type ${JSON.stringify(result)}`, + }) + return + } + const [code, message] = result["error-code"] + if (code === 59) { + await effects.setHealth({ + name: healthId, + status: "disabled", + message, + }) + return + } + if (code === 60) { + await effects.setHealth({ + name: healthId, + status: "starting", + message, + }) + return + } + if (code === 61) { + await effects.setHealth({ + name: healthId, + status: "warning", + message, + }) + return + } + + await effects.setHealth({ + name: healthId, + status: "failure", + message: `${result["error-code"][0]}: ${result["error-code"][1]}`, + }) + return + } + }, EMBASSY_HEALTH_INTERVAL) + + return { name: healthId, interval } + }, + ) } } diff --git a/core/startos/src/service/service_effect_handler.rs b/core/startos/src/service/service_effect_handler.rs index 55bc07916..369c8f319 100644 --- a/core/startos/src/service/service_effect_handler.rs +++ b/core/startos/src/service/service_effect_handler.rs @@ -13,7 +13,6 @@ use patch_db::json_ptr::JsonPointer; use rpc_toolkit::{from_fn, from_fn_async, AnyContext, Context, Empty, HandlerExt, ParentHandler}; use tokio::process::Command; -use crate::disk::mount::filesystem::idmapped::IdMapped; use crate::disk::mount::filesystem::loop_dev::LoopDev; use crate::disk::mount::filesystem::overlayfs::OverlayGuard; use crate::prelude::*; @@ -26,6 +25,7 @@ use crate::status::MainStatus; use crate::util::clap::FromStrParser; use crate::util::{new_guid, Invoke}; use crate::{db::model::ExposedUI, service::RunningStatus}; +use crate::{disk::mount::filesystem::idmapped::IdMapped, status::health_check::HealthCheckString}; use crate::{echo, ARCH}; #[derive(Clone)] @@ -605,30 +605,22 @@ async fn set_main_status(context: EffectContext, params: SetMainStatus) -> Resul #[serde(rename_all = "camelCase")] struct SetHealth { name: HealthCheckId, - health_result: Option, + status: HealthCheckString, + message: Option, } -async fn set_health(context: EffectContext, params: SetHealth) -> Result { +async fn set_health( + context: EffectContext, + SetHealth { + name, + status, + message, + }: SetHealth, +) -> Result { + dbg!(&name); + dbg!(&status); + dbg!(&message); let context = context.deref()?; - // TODO DrBonez + BLU-J Need to change the type from - // ```rs - // #[serde(tag = "result")] - // pub enum HealthCheckResult { - // Success, - // Disabled, - // Starting, - // Loading { message: String }, - // Failure { error: String }, - // } - // ``` - // to - // ```ts - // setHealth(o: { - // name: string - // status: HealthStatus - // message?: string - // }): Promise - // ``` let package_id = &context.id; context @@ -648,14 +640,22 @@ async fn set_health(context: EffectContext, params: SetHealth) -> Result { - health.remove(¶ms.name); - if let SetHealth { + health.remove(&name); + + health.insert( name, - health_result: Some(health_result), - } = params - { - health.insert(name, health_result); - } + match status { + HealthCheckString::Disabled => HealthCheckResult::Disabled, + HealthCheckString::Passing => HealthCheckResult::Success, + HealthCheckString::Starting => HealthCheckResult::Starting, + HealthCheckString::Warning => HealthCheckResult::Loading { + message: message.unwrap_or_default(), + }, + HealthCheckString::Failure => HealthCheckResult::Failure { + error: message.unwrap_or_default(), + }, + }, + ); } _ => return Ok(()), }; diff --git a/core/startos/src/status/health_check.rs b/core/startos/src/status/health_check.rs index 8189454c7..fef879e33 100644 --- a/core/startos/src/status/health_check.rs +++ b/core/startos/src/status/health_check.rs @@ -22,3 +22,13 @@ impl std::fmt::Display for HealthCheckResult { } } } + +#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub enum HealthCheckString { + Passing, + Disabled, + Starting, + Warning, + Failure, +} diff --git a/sdk/lib/health/HealthCheck.ts b/sdk/lib/health/HealthCheck.ts index 8f0bcf81e..1cbc5ebf2 100644 --- a/sdk/lib/health/HealthCheck.ts +++ b/sdk/lib/health/HealthCheck.ts @@ -47,10 +47,10 @@ export function healthCheck(o: { } catch (e) { await o.effects.setHealth({ name: o.name, - status: "failing", + status: "failure", message: asMessage(e), }) - currentValue.lastResult = "failing" + currentValue.lastResult = "failure" } } }) diff --git a/sdk/lib/health/checkFns/checkPortListening.ts b/sdk/lib/health/checkFns/checkPortListening.ts index 07144071b..a82b75fd4 100644 --- a/sdk/lib/health/checkFns/checkPortListening.ts +++ b/sdk/lib/health/checkFns/checkPortListening.ts @@ -48,7 +48,7 @@ export async function checkPortListening( return { status: "passing", message: options.successMessage } } return { - status: "failing", + status: "failure", message: options.errorMessage, } }), @@ -56,7 +56,7 @@ export async function checkPortListening( setTimeout( () => resolve({ - status: "failing", + status: "failure", message: options.timeoutMessage || `Timeout trying to check port ${port}`, }), diff --git a/sdk/lib/health/checkFns/checkWebUrl.ts b/sdk/lib/health/checkFns/checkWebUrl.ts index 81da2b425..d18509ee3 100644 --- a/sdk/lib/health/checkFns/checkWebUrl.ts +++ b/sdk/lib/health/checkFns/checkWebUrl.ts @@ -19,14 +19,17 @@ export const checkWebUrl = async ( } = {}, ): Promise => { return Promise.race([fetch(url), timeoutPromise(timeout)]) - .then((x) => ({ - status: "passing" as const, - message: successMessage, - })) + .then( + (x) => + ({ + status: "passing", + message: successMessage, + }) as const, + ) .catch((e) => { console.warn(`Error while fetching URL: ${url}`) console.error(JSON.stringify(e)) console.error(e.toString()) - return { status: "failing" as const, message: errorMessage } + return { status: "failure" as const, message: errorMessage } }) } diff --git a/sdk/lib/health/checkFns/runHealthScript.ts b/sdk/lib/health/checkFns/runHealthScript.ts index 4bc4556e9..659c787f8 100644 --- a/sdk/lib/health/checkFns/runHealthScript.ts +++ b/sdk/lib/health/checkFns/runHealthScript.ts @@ -29,7 +29,7 @@ export const runHealthScript = async ( console.warn(errorMessage) console.warn(JSON.stringify(e)) console.warn(e.toString()) - throw { status: "failing", message: errorMessage } as CheckResult + throw { status: "failure", message: errorMessage } as CheckResult }) return { status: "passing", diff --git a/sdk/lib/mainFn/Daemons.ts b/sdk/lib/mainFn/Daemons.ts index e9986ad3f..c240427bc 100644 --- a/sdk/lib/mainFn/Daemons.ts +++ b/sdk/lib/mainFn/Daemons.ts @@ -121,7 +121,7 @@ export class Daemons { const response = await Promise.resolve(daemon.ready.fn()).catch( (err) => ({ - status: "failing", + status: "failure", message: "message" in err ? err.message : String(err), }) as CheckResult, ) diff --git a/sdk/lib/types.ts b/sdk/lib/types.ts index cb1946818..a53b3d273 100644 --- a/sdk/lib/types.ts +++ b/sdk/lib/types.ts @@ -133,7 +133,12 @@ export type Daemon = { [DaemonProof]: never } -export type HealthStatus = "passing" | "warning" | "failing" | "disabled" +export type HealthStatus = + | `passing` + | `disabled` + | `starting` + | `warning` + | `failure` export type SmtpValue = { server: string From 328beaba3549e4aa7c87b3d1a00fe014c56ba401 Mon Sep 17 00:00:00 2001 From: J H Date: Thu, 7 Mar 2024 13:36:38 -0700 Subject: [PATCH 072/169] chore: Add in the possibility to get the status code from the executed health check --- .../DockerProcedureContainer.ts | 9 ++++ .../Systems/SystemForEmbassy/MainLoop.ts | 52 ++++++++++++++++--- 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/container-runtime/src/Adapters/Systems/SystemForEmbassy/DockerProcedureContainer.ts b/container-runtime/src/Adapters/Systems/SystemForEmbassy/DockerProcedureContainer.ts index 3129ce45d..3506575bc 100644 --- a/container-runtime/src/Adapters/Systems/SystemForEmbassy/DockerProcedureContainer.ts +++ b/container-runtime/src/Adapters/Systems/SystemForEmbassy/DockerProcedureContainer.ts @@ -73,6 +73,15 @@ export class DockerProcedureContainer { } } + async execSpawn(commands: string[]) { + try { + const spawned = await this.overlay.spawn(commands) + return spawned + } finally { + await this.overlay.destroy() + } + } + async spawn(commands: string[]): Promise { return await this.overlay.spawn(commands) } diff --git a/container-runtime/src/Adapters/Systems/SystemForEmbassy/MainLoop.ts b/container-runtime/src/Adapters/Systems/SystemForEmbassy/MainLoop.ts index 8142a17df..c5e6644af 100644 --- a/container-runtime/src/Adapters/Systems/SystemForEmbassy/MainLoop.ts +++ b/container-runtime/src/Adapters/Systems/SystemForEmbassy/MainLoop.ts @@ -3,6 +3,7 @@ import { DockerProcedureContainer } from "./DockerProcedureContainer" import { SystemForEmbassy } from "." import { HostSystemStartOs } from "../../HostSystemStartOs" import { util, Daemons, types as T } from "@start9labs/start-sdk" +import { exec } from "child_process" const EMBASSY_HEALTH_INTERVAL = 15 * 1000 const EMBASSY_PROPERTIES_LOOP = 30 * 1000 @@ -117,17 +118,54 @@ export class MainLoop { actionProcedure, manifest.volumes, ) - const executed = await container.exec([ + const executed = await container.execSpawn([ actionProcedure.entrypoint, ...actionProcedure.args, JSON.stringify(timeChanged), ]) - const stderr = executed.stderr.toString() - if (stderr) - console.error( - `Error running health check ${value.name}: ${stderr}`, - ) - return executed.stdout.toString() + if (executed.exitCode === 59) { + await effects.setHealth({ + name: healthId, + status: "disabled", + message: + executed.stderr.toString() || executed.stdout.toString(), + }) + return + } + if (executed.exitCode === 60) { + await effects.setHealth({ + name: healthId, + status: "starting", + message: + executed.stderr.toString() || executed.stdout.toString(), + }) + return + } + if (executed.exitCode === 61) { + await effects.setHealth({ + name: healthId, + status: "warning", + message: + executed.stderr.toString() || executed.stdout.toString(), + }) + return + } + const errorMessage = executed.stderr.toString() + const message = executed.stdout.toString() + if (!!errorMessage) { + await effects.setHealth({ + name: healthId, + status: "failure", + message: errorMessage, + }) + return + } + await effects.setHealth({ + name: healthId, + status: "passing", + message, + }) + return } else { actionProcedure const moduleCode = await this.system.moduleCode From a17ec4221b1a546b0df2f547cdf95afa3a11c70c Mon Sep 17 00:00:00 2001 From: J H Date: Thu, 7 Mar 2024 13:45:38 -0700 Subject: [PATCH 073/169] chore: Remove some of the bad logging --- container-runtime/src/Adapters/HostSystemStartOs.ts | 1 - core/startos/src/service/service_effect_handler.rs | 3 --- sdk/lib/mainFn/Daemons.ts | 2 -- sdk/lib/util/utils.ts | 2 -- 4 files changed, 8 deletions(-) diff --git a/container-runtime/src/Adapters/HostSystemStartOs.ts b/container-runtime/src/Adapters/HostSystemStartOs.ts index e863b6714..ec4fac796 100644 --- a/container-runtime/src/Adapters/HostSystemStartOs.ts +++ b/container-runtime/src/Adapters/HostSystemStartOs.ts @@ -268,7 +268,6 @@ export class HostSystemStartOs implements Effects { > } setHealth(...[options]: Parameters) { - console.error("BLUJ sethealth", options) return this.rpcRound("setHealth", options) as ReturnType< T.Effects["setHealth"] > diff --git a/core/startos/src/service/service_effect_handler.rs b/core/startos/src/service/service_effect_handler.rs index 369c8f319..3978b64c7 100644 --- a/core/startos/src/service/service_effect_handler.rs +++ b/core/startos/src/service/service_effect_handler.rs @@ -617,9 +617,6 @@ async fn set_health( message, }: SetHealth, ) -> Result { - dbg!(&name); - dbg!(&status); - dbg!(&message); let context = context.deref()?; let package_id = &context.id; diff --git a/sdk/lib/mainFn/Daemons.ts b/sdk/lib/mainFn/Daemons.ts index c240427bc..368c15c89 100644 --- a/sdk/lib/mainFn/Daemons.ts +++ b/sdk/lib/mainFn/Daemons.ts @@ -137,7 +137,6 @@ export class Daemons { } return { async term(options?: { signal?: Signals; timeout?: number }) { - console.error("Bluj Daemons term") await Promise.all( Object.values>(daemonsStarted).map((x) => x.then((x) => x.term(options)), @@ -145,7 +144,6 @@ export class Daemons { ) }, async wait() { - console.error("Bluj Daemons wait") await Promise.all( Object.values>(daemonsStarted).map((x) => x.then((x) => x.wait()), diff --git a/sdk/lib/util/utils.ts b/sdk/lib/util/utils.ts index 2f9388884..f0592385e 100644 --- a/sdk/lib/util/utils.ts +++ b/sdk/lib/util/utils.ts @@ -269,7 +269,6 @@ export const createUtils = < }, async term({ signal = SIGTERM, timeout = NO_TIMEOUT } = {}) { const pids = pid ? await psTree(pid, overlay) : [] - console.error("Bluj killing pid ", pids) try { childProcess.kill(signal) @@ -290,7 +289,6 @@ export const createUtils = < await overlay.destroy() } - console.error("Bluj actually killing pid ", pids) try { for (const process of pids) { await cp.execFile("kill", [`-${signal}`, String(process)]) From e0c9f8a5aad233755cd2341015adb8e9cd4a3ae1 Mon Sep 17 00:00:00 2001 From: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com> Date: Thu, 7 Mar 2024 14:40:22 -0700 Subject: [PATCH 074/169] Feature/remove postgres (#2570) * wip: move postgres data to patchdb * wip * wip * wip * complete notifications and clean up warnings * fill in user agent * move os tor bindings to single call --- core/Cargo.lock | 98 ++--- core/models/Cargo.toml | 2 +- core/models/src/errors.rs | 5 + core/models/src/id/host.rs | 11 + core/models/src/id/mod.rs | 5 + core/models/src/id/package.rs | 11 + core/models/src/procedure_name.rs | 2 +- core/startos/Cargo.toml | 16 +- core/startos/src/account.rs | 125 +++--- core/startos/src/auth.rs | 134 +++--- core/startos/src/backup/backup_bulk.rs | 288 ++++++------ core/startos/src/backup/os.rs | 123 ++++-- core/startos/src/backup/restore.rs | 15 +- core/startos/src/backup/target/cifs.rs | 178 ++++---- core/startos/src/backup/target/mod.rs | 32 +- core/startos/src/context/config.rs | 10 +- core/startos/src/context/rpc.rs | 22 +- core/startos/src/context/setup.rs | 9 +- core/startos/src/control.rs | 6 +- core/startos/src/db/model.rs | 104 ++++- core/startos/src/db/prelude.rs | 237 +++++++--- core/startos/src/dependencies.rs | 10 +- core/startos/src/firmware.rs | 1 - core/startos/src/init.rs | 23 +- core/startos/src/install/mod.rs | 4 - core/startos/src/logs.rs | 2 +- core/startos/src/lxc/mod.rs | 17 + core/startos/src/middleware/auth.rs | 84 ++-- core/startos/src/net/dns.rs | 5 +- core/startos/src/net/forward.rs | 177 ++++++++ core/startos/src/net/host/address.rs | 9 + core/startos/src/net/host/binding.rs | 71 +++ core/startos/src/net/host/mod.rs | 93 +++- core/startos/src/net/host/multi.rs | 13 - core/startos/src/net/keys.rs | 401 +---------------- core/startos/src/net/mdns.rs | 8 +- core/startos/src/net/mod.rs | 14 +- core/startos/src/net/net_controller.rs | 411 ++++++++++-------- core/startos/src/net/ssl.rs | 284 ++++++------ core/startos/src/net/static_server.rs | 6 +- core/startos/src/net/tor.rs | 162 ++++--- core/startos/src/net/vhost.rs | 73 ++-- core/startos/src/notifications.rs | 340 ++++++--------- core/startos/src/registry/admin.rs | 4 +- core/startos/src/s9pk/merkle_archive/mod.rs | 2 - .../source/multi_cursor_file.rs | 4 +- core/startos/src/service/config.rs | 4 +- core/startos/src/service/mod.rs | 15 +- .../src/service/persistent_container.rs | 17 +- core/startos/src/service/rpc.rs | 2 +- .../src/service/service_effect_handler.rs | 12 +- core/startos/src/service/service_map.rs | 26 +- core/startos/src/service/transition/mod.rs | 4 +- core/startos/src/setup.rs | 42 +- core/startos/src/ssh.rs | 167 ++++--- core/startos/src/status/mod.rs | 6 + core/startos/src/update/mod.rs | 51 +-- core/startos/src/upload.rs | 8 +- core/startos/src/util/future.rs | 4 +- core/startos/src/util/serde.rs | 150 +++++++ core/startos/src/version/mod.rs | 208 ++++----- core/startos/src/version/v0_3_4.rs | 140 ------ core/startos/src/version/v0_3_4_1.rs | 31 -- core/startos/src/version/v0_3_4_2.rs | 31 -- core/startos/src/version/v0_3_4_3.rs | 31 -- core/startos/src/version/v0_3_4_4.rs | 43 -- core/startos/src/version/v0_3_5.rs | 103 +---- core/startos/src/version/v0_3_5_1.rs | 9 +- core/startos/src/version/v0_3_6.rs | 29 ++ core/startos/src/volume.rs | 10 + 70 files changed, 2420 insertions(+), 2374 deletions(-) create mode 100644 core/startos/src/net/forward.rs create mode 100644 core/startos/src/net/host/address.rs create mode 100644 core/startos/src/net/host/binding.rs delete mode 100644 core/startos/src/net/host/multi.rs delete mode 100644 core/startos/src/version/v0_3_4.rs delete mode 100644 core/startos/src/version/v0_3_4_1.rs delete mode 100644 core/startos/src/version/v0_3_4_2.rs delete mode 100644 core/startos/src/version/v0_3_4_3.rs delete mode 100644 core/startos/src/version/v0_3_4_4.rs create mode 100644 core/startos/src/version/v0_3_6.rs diff --git a/core/Cargo.lock b/core/Cargo.lock index 95b7f3ca9..5435fe2b0 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -304,7 +304,7 @@ checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" dependencies = [ "async-trait", "axum-core 0.4.3", - "base64 0.21.7", + "base64", "bytes", "futures-util", "http 1.0.0", @@ -417,12 +417,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23ce669cd6c8588f79e15cf450314f9638f967fc5770ff1c7c1deb0925ea7cfa" -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - [[package]] name = "base64" version = "0.21.7" @@ -533,7 +527,6 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "block-padding", "generic-array", ] @@ -546,12 +539,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - [[package]] name = "brotli" version = "3.4.0" @@ -1044,16 +1031,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "crypto-mac" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" -dependencies = [ - "generic-array", - "subtle", -] - [[package]] name = "csv" version = "1.3.0" @@ -1847,7 +1824,7 @@ version = "7.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" dependencies = [ - "base64 0.21.7", + "base64", "byteorder", "flate2", "nom", @@ -1913,17 +1890,7 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ - "hmac 0.12.1", -] - -[[package]] -name = "hmac" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" -dependencies = [ - "crypto-mac", - "digest 0.9.0", + "hmac", ] [[package]] @@ -2125,6 +2092,15 @@ dependencies = [ "cc", ] +[[package]] +name = "id-pool" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d0df4d8a768821ee4aa2e0353f67125c4586f0e13adbf95b8ebbf8d8fdb344" +dependencies = [ + "serde", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -2412,7 +2388,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd20997283339a19226445db97d632c8dc7adb6b8172537fe0e9e540fb141df2" dependencies = [ "anyhow", - "base64 0.21.7", + "base64", "flate2", "once_cell", "openssl", @@ -2684,7 +2660,7 @@ dependencies = [ name = "models" version = "0.1.0" dependencies = [ - "base64 0.21.7", + "base64", "color-eyre", "ed25519-dalek 2.1.1", "emver", @@ -2962,7 +2938,7 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c75a0ec2d1b302412fb503224289325fcc0e44600176864804c7211b055cfd58" dependencies = [ - "base64 0.21.7", + "base64", "byteorder", "md-5", "sha2 0.10.8", @@ -3156,7 +3132,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ "digest 0.10.7", - "hmac 0.12.1", + "hmac", ] [[package]] @@ -3609,7 +3585,7 @@ version = "0.11.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" dependencies = [ - "base64 0.21.7", + "base64", "bytes", "cookie 0.17.0", "cookie_store", @@ -3666,7 +3642,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "hmac 0.12.1", + "hmac", "subtle", ] @@ -3827,7 +3803,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d9848531d60c9cbbcf9d166c885316c24bc0e2a9d3eba0956bb6cbbd79bc6e8" dependencies = [ - "base64 0.21.7", + "base64", "blake2b_simd", "constant_time_eq", ] @@ -3891,7 +3867,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.7", + "base64", ] [[package]] @@ -4128,7 +4104,7 @@ version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15d167997bd841ec232f5b2b8e0e26606df2e7caa4c31b95ea9ca52b200bd270" dependencies = [ - "base64 0.21.7", + "base64", "chrono", "hex", "indexmap 1.9.3", @@ -4202,14 +4178,12 @@ dependencies = [ [[package]] name = "sha3" -version = "0.9.1" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "block-buffer 0.9.0", - "digest 0.9.0", + "digest 0.10.7", "keccak", - "opaque-debug", ] [[package]] @@ -4455,7 +4429,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4" dependencies = [ "atoi", - "base64 0.21.7", + "base64", "bitflags 2.4.2", "byteorder", "bytes", @@ -4471,7 +4445,7 @@ dependencies = [ "generic-array", "hex", "hkdf", - "hmac 0.12.1", + "hmac", "itoa", "log", "md-5", @@ -4498,7 +4472,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24" dependencies = [ "atoi", - "base64 0.21.7", + "base64", "bitflags 2.4.2", "byteorder", "chrono", @@ -4511,7 +4485,7 @@ dependencies = [ "futures-util", "hex", "hkdf", - "hmac 0.12.1", + "hmac", "home", "itoa", "log", @@ -4635,7 +4609,7 @@ dependencies = [ "axum 0.7.4", "axum-server", "base32", - "base64 0.21.7", + "base64", "base64ct", "basic-cookies", "blake3", @@ -4660,8 +4634,9 @@ dependencies = [ "gpt", "helpers", "hex", - "hmac 0.12.1", + "hmac", "http 1.0.0", + "id-pool", "imbl", "imbl-value", "include_dir", @@ -5215,7 +5190,7 @@ dependencies = [ "async-stream", "async-trait", "axum 0.6.20", - "base64 0.21.7", + "base64", "bytes", "h2 0.3.24", "http 0.2.11", @@ -5236,19 +5211,18 @@ dependencies = [ [[package]] name = "torut" version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99febc413f26cf855b3a309c5872edff5c31e0ffe9c2fce5681868761df36f69" +source = "git+https://github.com/Start9Labs/torut.git?branch=update/dependencies#2b6fa9528d22e0b276132bccf7f2e9308f84b2c7" dependencies = [ "base32", - "base64 0.13.1", + "base64", "derive_more", "ed25519-dalek 1.0.1", "hex", - "hmac 0.11.0", + "hmac", "rand 0.7.3", "serde", "serde_derive", - "sha2 0.9.9", + "sha2 0.10.8", "sha3", "tokio", ] diff --git a/core/models/Cargo.toml b/core/models/Cargo.toml index c6fc76f55..250ba22a7 100644 --- a/core/models/Cargo.toml +++ b/core/models/Cargo.toml @@ -34,6 +34,6 @@ sqlx = { version = "0.7.2", features = [ ssh-key = "0.6.2" thiserror = "1.0" tokio = { version = "1", features = ["full"] } -torut = "0.2.1" +torut = { git = "https://github.com/Start9Labs/torut.git", branch = "update/dependencies" } tracing = "0.1.39" yasi = "0.1.5" diff --git a/core/models/src/errors.rs b/core/models/src/errors.rs index 15bc90b9f..2362b6dba 100644 --- a/core/models/src/errors.rs +++ b/core/models/src/errors.rs @@ -207,6 +207,11 @@ impl Error { } } } +impl From for Error { + fn from(value: std::convert::Infallible) -> Self { + match value {} + } +} impl From for Error { fn from(err: InvalidId) -> Self { Error::new(err, ErrorKind::InvalidPackageId) diff --git a/core/models/src/id/host.rs b/core/models/src/id/host.rs index 91abd56e7..6bca7d0ff 100644 --- a/core/models/src/id/host.rs +++ b/core/models/src/id/host.rs @@ -2,6 +2,7 @@ use std::path::Path; use std::str::FromStr; use serde::{Deserialize, Deserializer, Serialize}; +use yasi::InternedString; use crate::{Id, InvalidId}; @@ -18,6 +19,16 @@ impl From for HostId { Self(id) } } +impl From for Id { + fn from(value: HostId) -> Self { + value.0 + } +} +impl From for InternedString { + fn from(value: HostId) -> Self { + value.0.into() + } +} impl std::fmt::Display for HostId { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", &self.0) diff --git a/core/models/src/id/mod.rs b/core/models/src/id/mod.rs index 068955336..efbe1f818 100644 --- a/core/models/src/id/mod.rs +++ b/core/models/src/id/mod.rs @@ -59,6 +59,11 @@ impl TryFrom<&str> for Id { } } } +impl From for InternedString { + fn from(value: Id) -> Self { + value.0 + } +} impl std::ops::Deref for Id { type Target = str; fn deref(&self) -> &Self::Target { diff --git a/core/models/src/id/package.rs b/core/models/src/id/package.rs index 14c29d88b..060f541c3 100644 --- a/core/models/src/id/package.rs +++ b/core/models/src/id/package.rs @@ -3,6 +3,7 @@ use std::path::Path; use std::str::FromStr; use serde::{Deserialize, Serialize, Serializer}; +use yasi::InternedString; use crate::{Id, InvalidId, SYSTEM_ID}; @@ -22,6 +23,16 @@ impl From for PackageId { PackageId(id) } } +impl From for Id { + fn from(value: PackageId) -> Self { + value.0 + } +} +impl From for InternedString { + fn from(value: PackageId) -> Self { + value.0.into() + } +} impl std::ops::Deref for PackageId { type Target = str; fn deref(&self) -> &Self::Target { diff --git a/core/models/src/procedure_name.rs b/core/models/src/procedure_name.rs index 841f8df7d..bf69b06b8 100644 --- a/core/models/src/procedure_name.rs +++ b/core/models/src/procedure_name.rs @@ -1,6 +1,6 @@ use serde::{Deserialize, Serialize}; -use crate::{ActionId, HealthCheckId, PackageId}; +use crate::ActionId; #[derive(Debug, Clone, Serialize, Deserialize)] pub enum ProcedureName { diff --git a/core/startos/Cargo.toml b/core/startos/Cargo.toml index 3fce87089..fd36c3de6 100644 --- a/core/startos/Cargo.toml +++ b/core/startos/Cargo.toml @@ -87,14 +87,10 @@ helpers = { path = "../helpers" } hex = "0.4.3" hmac = "0.12.1" http = "1.0.0" -# http-body-util = "0.1.0" -# hyper = { version = "1.1.0", features = ["full"] } -# hyper-util = { version = "0.1.2", features = [ -# "server", -# "server-auto", -# "tokio", -# ] } -# hyper-ws-listener = "0.3.0" +id-pool = { version = "0.2.2", default-features = false, features = [ + "serde", + "u16", +] } imbl = "2.0.2" imbl-value = { git = "https://github.com/Start9Labs/imbl-value.git" } include_dir = "0.7.3" @@ -169,7 +165,9 @@ tokio-stream = { version = "0.1.14", features = ["io-util", "sync", "net"] } tokio-tar = { git = "https://github.com/dr-bonez/tokio-tar.git" } tokio-tungstenite = { version = "0.21.0", features = ["native-tls"] } tokio-util = { version = "0.7.9", features = ["io"] } -torut = "0.2.1" +torut = { git = "https://github.com/Start9Labs/torut.git", branch = "update/dependencies", features = [ + "serialize", +] } tracing = "0.1.39" tracing-error = "0.2.0" tracing-futures = "0.2.5" diff --git a/core/startos/src/account.rs b/core/startos/src/account.rs index cb08a0d53..e074d301d 100644 --- a/core/startos/src/account.rs +++ b/core/startos/src/account.rs @@ -1,15 +1,14 @@ use std::time::SystemTime; -use ed25519_dalek::SecretKey; use openssl::pkey::{PKey, Private}; use openssl::x509::X509; -use sqlx::PgExecutor; +use torut::onion::TorSecretKeyV3; +use crate::db::model::DatabaseModel; use crate::hostname::{generate_hostname, generate_id, Hostname}; -use crate::net::keys::Key; use crate::net::ssl::{generate_key, make_root_cert}; use crate::prelude::*; -use crate::util::crypto::ed25519_expand_key; +use crate::util::serde::Pem; fn hash_password(password: &str) -> Result { argon2::hash_encoded( @@ -25,103 +24,83 @@ pub struct AccountInfo { pub server_id: String, pub hostname: Hostname, pub password: String, - pub key: Key, + pub tor_key: TorSecretKeyV3, pub root_ca_key: PKey, pub root_ca_cert: X509, + pub ssh_key: ssh_key::PrivateKey, } impl AccountInfo { pub fn new(password: &str, start_time: SystemTime) -> Result { let server_id = generate_id(); let hostname = generate_hostname(); + let tor_key = TorSecretKeyV3::generate(); let root_ca_key = generate_key()?; let root_ca_cert = make_root_cert(&root_ca_key, &hostname, start_time)?; + let ssh_key = ssh_key::PrivateKey::from(ssh_key::private::Ed25519Keypair::random( + &mut rand::thread_rng(), + )); Ok(Self { server_id, hostname, password: hash_password(password)?, - key: Key::new(None), + tor_key, root_ca_key, root_ca_cert, + ssh_key, }) } - pub async fn load(secrets: impl PgExecutor<'_>) -> Result { - let r = sqlx::query!("SELECT * FROM account WHERE id = 0") - .fetch_one(secrets) - .await?; - - let server_id = r.server_id.unwrap_or_else(generate_id); - let hostname = r.hostname.map(Hostname).unwrap_or_else(generate_hostname); - let password = r.password; - let network_key = SecretKey::try_from(r.network_key).map_err(|e| { - Error::new( - eyre!("expected vec of len 32, got len {}", e.len()), - ErrorKind::ParseDbField, - ) - })?; - let tor_key = if let Some(k) = &r.tor_key { - <[u8; 64]>::try_from(&k[..]).map_err(|_| { - Error::new( - eyre!("expected vec of len 64, got len {}", k.len()), - ErrorKind::ParseDbField, - ) - })? - } else { - ed25519_expand_key(&network_key) - }; - let key = Key::from_pair(None, network_key, tor_key); - let root_ca_key = PKey::private_key_from_pem(r.root_ca_key_pem.as_bytes())?; - let root_ca_cert = X509::from_pem(r.root_ca_cert_pem.as_bytes())?; + pub fn load(db: &DatabaseModel) -> Result { + let server_id = db.as_public().as_server_info().as_id().de()?; + let hostname = Hostname(db.as_public().as_server_info().as_hostname().de()?); + let password = db.as_private().as_password().de()?; + let key_store = db.as_private().as_key_store(); + let tor_addr = db.as_public().as_server_info().as_onion_address().de()?; + let tor_key = key_store.as_onion().get_key(&tor_addr)?; + let cert_store = key_store.as_local_certs(); + let root_ca_key = cert_store.as_root_key().de()?.0; + let root_ca_cert = cert_store.as_root_cert().de()?.0; + let ssh_key = db.as_private().as_ssh_privkey().de()?.0; Ok(Self { server_id, hostname, password, - key, + tor_key, root_ca_key, root_ca_cert, + ssh_key, }) } - pub async fn save(&self, secrets: impl PgExecutor<'_>) -> Result<(), Error> { - let server_id = self.server_id.as_str(); - let hostname = self.hostname.0.as_str(); - let password = self.password.as_str(); - let network_key = self.key.as_bytes(); - let network_key = network_key.as_slice(); - let root_ca_key = String::from_utf8(self.root_ca_key.private_key_to_pem_pkcs8()?)?; - let root_ca_cert = String::from_utf8(self.root_ca_cert.to_pem()?)?; - - sqlx::query!( - r#" - INSERT INTO account ( - id, - server_id, - hostname, - password, - network_key, - root_ca_key_pem, - root_ca_cert_pem - ) VALUES ( - 0, $1, $2, $3, $4, $5, $6 - ) ON CONFLICT (id) DO UPDATE SET - server_id = EXCLUDED.server_id, - hostname = EXCLUDED.hostname, - password = EXCLUDED.password, - network_key = EXCLUDED.network_key, - root_ca_key_pem = EXCLUDED.root_ca_key_pem, - root_ca_cert_pem = EXCLUDED.root_ca_cert_pem - "#, - server_id, - hostname, - password, - network_key, - root_ca_key, - root_ca_cert, - ) - .execute(secrets) - .await?; - + pub fn save(&self, db: &mut DatabaseModel) -> Result<(), Error> { + let server_info = db.as_public_mut().as_server_info_mut(); + server_info.as_id_mut().ser(&self.server_id)?; + server_info.as_hostname_mut().ser(&self.hostname.0)?; + server_info + .as_lan_address_mut() + .ser(&self.hostname.lan_address().parse()?)?; + server_info + .as_pubkey_mut() + .ser(&self.ssh_key.public_key().to_openssh()?)?; + let onion_address = self.tor_key.public().get_onion_address(); + server_info.as_onion_address_mut().ser(&onion_address)?; + server_info + .as_tor_address_mut() + .ser(&format!("https://{onion_address}").parse()?)?; + db.as_private_mut().as_password_mut().ser(&self.password)?; + db.as_private_mut() + .as_ssh_privkey_mut() + .ser(Pem::new_ref(&self.ssh_key))?; + let key_store = db.as_private_mut().as_key_store_mut(); + key_store.as_onion_mut().insert_key(&self.tor_key)?; + let cert_store = key_store.as_local_certs_mut(); + cert_store + .as_root_key_mut() + .ser(Pem::new_ref(&self.root_ca_key))?; + cert_store + .as_root_cert_mut() + .ser(Pem::new_ref(&self.root_ca_cert))?; Ok(()) } diff --git a/core/startos/src/auth.rs b/core/startos/src/auth.rs index 891f390bc..21cfbd101 100644 --- a/core/startos/src/auth.rs +++ b/core/startos/src/auth.rs @@ -1,17 +1,17 @@ use std::collections::BTreeMap; use chrono::{DateTime, Utc}; -use clap::{ArgMatches, Parser}; +use clap::Parser; use color_eyre::eyre::eyre; use imbl_value::{json, InternedString}; use josekit::jwk::Jwk; use rpc_toolkit::yajrc::RpcError; use rpc_toolkit::{command, from_fn_async, AnyContext, CallRemote, HandlerExt, ParentHandler}; use serde::{Deserialize, Serialize}; -use sqlx::{Executor, Postgres}; use tracing::instrument; use crate::context::{CliContext, RpcContext}; +use crate::db::model::DatabaseModel; use crate::middleware::auth::{ AsLogoutSessionId, HasLoggedOutSessions, HashSessionToken, LoginRes, }; @@ -19,6 +19,25 @@ use crate::prelude::*; use crate::util::crypto::EncryptedWire; use crate::util::serde::{display_serializable, HandlerExtSerde, WithIoFormat}; use crate::{ensure_code, Error, ResultExt}; + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +pub struct Sessions(pub BTreeMap); +impl Sessions { + pub fn new() -> Self { + Self(BTreeMap::new()) + } +} +impl Map for Sessions { + type Key = InternedString; + type Value = Session; + fn key_str(key: &Self::Key) -> Result, Error> { + Ok(key) + } + fn key_string(key: &Self::Key) -> Result { + Ok(key.clone()) + } +} + #[derive(Clone, Serialize, Deserialize)] #[serde(untagged)] pub enum PasswordType { @@ -95,16 +114,6 @@ pub fn auth() -> ParentHandler { ) } -pub fn cli_metadata() -> Value { - imbl_value::json!({ - "platforms": ["cli"], - }) -} - -pub fn parse_metadata(_: &str, _: &ArgMatches) -> Result { - Ok(cli_metadata()) -} - #[test] fn gen_pwd() { println!( @@ -163,14 +172,8 @@ pub fn check_password(hash: &str, password: &str) -> Result<(), Error> { Ok(()) } -pub async fn check_password_against_db(secrets: &mut Ex, password: &str) -> Result<(), Error> -where - for<'a> &'a mut Ex: Executor<'a, Database = Postgres>, -{ - let pw_hash = sqlx::query!("SELECT password FROM account") - .fetch_one(secrets) - .await? - .password; +pub fn check_password_against_db(db: &DatabaseModel, password: &str) -> Result<(), Error> { + let pw_hash = db.as_private().as_password().de()?; check_password(&pw_hash, password)?; Ok(()) } @@ -180,7 +183,8 @@ where #[command(rename_all = "kebab-case")] pub struct LoginParams { password: Option, - #[arg(skip = cli_metadata())] + #[serde(default)] + user_agent: Option, #[serde(default)] metadata: Value, } @@ -188,26 +192,31 @@ pub struct LoginParams { #[instrument(skip_all)] pub async fn login_impl( ctx: RpcContext, - LoginParams { password, metadata }: LoginParams, -) -> Result { - let password = password.unwrap_or_default().decrypt(&ctx)?; - let mut handle = ctx.secret_store.acquire().await?; - check_password_against_db(handle.as_mut(), &password).await?; - - let hash_token = HashSessionToken::new(); - let user_agent = "".to_string(); // todo!() as String; - let metadata = serde_json::to_string(&metadata).with_kind(crate::ErrorKind::Database)?; - let hash_token_hashed = hash_token.hashed(); - sqlx::query!( - "INSERT INTO session (id, user_agent, metadata) VALUES ($1, $2, $3)", - hash_token_hashed, + LoginParams { + password, user_agent, metadata, - ) - .execute(handle.as_mut()) - .await?; + }: LoginParams, +) -> Result { + let password = password.unwrap_or_default().decrypt(&ctx)?; - Ok(hash_token.to_login_res()) + ctx.db + .mutate(|db| { + check_password_against_db(db, &password)?; + let hash_token = HashSessionToken::new(); + db.as_private_mut().as_sessions_mut().insert( + hash_token.hashed(), + &Session { + logged_in: Utc::now(), + last_active: Utc::now(), + user_agent, + metadata, + }, + )?; + + Ok(hash_token.to_login_res()) + }) + .await } #[derive(Deserialize, Serialize, Parser)] @@ -226,20 +235,20 @@ pub async fn logout( )) } -#[derive(Deserialize, Serialize)] +#[derive(Debug, Clone, Deserialize, Serialize)] #[serde(rename_all = "kebab-case")] pub struct Session { - logged_in: DateTime, - last_active: DateTime, - user_agent: Option, - metadata: Value, + pub logged_in: DateTime, + pub last_active: DateTime, + pub user_agent: Option, + pub metadata: Value, } #[derive(Deserialize, Serialize)] #[serde(rename_all = "kebab-case")] pub struct SessionList { - current: String, - sessions: BTreeMap, + current: InternedString, + sessions: Sessions, } pub fn session() -> ParentHandler { @@ -277,7 +286,7 @@ fn display_sessions(params: WithIoFormat, arg: SessionList) { "USER AGENT", "METADATA", ]); - for (id, session) in arg.sessions { + for (id, session) in arg.sessions.0 { let mut row = row![ &id, &format!("{}", session.logged_in), @@ -310,33 +319,11 @@ pub async fn list( ListParams { session, .. }: ListParams, ) -> Result { Ok(SessionList { - current: HashSessionToken::from_token(session).hashed().to_owned(), - sessions: sqlx::query!( - "SELECT * FROM session WHERE logged_out IS NULL OR logged_out > CURRENT_TIMESTAMP" - ) - .fetch_all(ctx.secret_store.acquire().await?.as_mut()) - .await? - .into_iter() - .map(|row| { - Ok(( - row.id, - Session { - logged_in: DateTime::from_utc(row.logged_in, Utc), - last_active: DateTime::from_utc(row.last_active, Utc), - user_agent: row.user_agent, - metadata: serde_json::from_str(&row.metadata) - .with_kind(crate::ErrorKind::Database)?, - }, - )) - }) - .collect::>()?, + current: HashSessionToken::from_token(session).hashed().clone(), + sessions: ctx.db.peek().await.into_private().into_sessions().de()?, }) } -fn parse_comma_separated(arg: &str, _: &ArgMatches) -> Result, RpcError> { - Ok(arg.split(",").map(|s| s.trim().to_owned()).collect()) -} - #[derive(Debug, Clone, Serialize, Deserialize)] struct KillSessionId(InternedString); @@ -433,14 +420,17 @@ pub async fn reset_password_impl( )); } account.set_password(&new_password)?; - account.save(&ctx.secret_store).await?; let account_password = &account.password; + let account = account.clone(); ctx.db .mutate(|d| { d.as_public_mut() .as_server_info_mut() .as_password_hash_mut() - .ser(account_password) + .ser(account_password)?; + account.save(d)?; + + Ok(()) }) .await } diff --git a/core/startos/src/backup/backup_bulk.rs b/core/startos/src/backup/backup_bulk.rs index 4660ab4bc..4f633d7ae 100644 --- a/core/startos/src/backup/backup_bulk.rs +++ b/core/startos/src/backup/backup_bulk.rs @@ -1,5 +1,4 @@ use std::collections::BTreeMap; -use std::panic::UnwindSafe; use std::path::{Path, PathBuf}; use std::sync::Arc; @@ -19,11 +18,11 @@ use crate::auth::check_password_against_db; use crate::backup::os::OsBackup; use crate::backup::{BackupReport, ServerBackupReport}; use crate::context::RpcContext; -use crate::db::model::BackupProgress; +use crate::db::model::{BackupProgress, DatabaseModel}; use crate::disk::mount::backup::BackupMountGuard; use crate::disk::mount::filesystem::ReadWrite; use crate::disk::mount::guard::{GenericMountGuard, TmpMountGuard}; -use crate::notifications::NotificationLevel; +use crate::notifications::{notify, NotificationLevel}; use crate::prelude::*; use crate::util::io::dir_copy; use crate::util::serde::IoFormat; @@ -41,6 +40,111 @@ pub struct BackupParams { password: crate::auth::PasswordType, } +struct BackupStatusGuard(Option); +impl BackupStatusGuard { + fn new(db: PatchDb) -> Self { + Self(Some(db)) + } + async fn handle_result( + mut self, + result: Result, Error>, + ) -> Result<(), Error> { + if let Some(db) = self.0.as_ref() { + db.mutate(|v| { + v.as_public_mut() + .as_server_info_mut() + .as_status_info_mut() + .as_backup_progress_mut() + .ser(&None) + }) + .await?; + } + if let Some(db) = self.0.take() { + match result { + Ok(report) if report.iter().all(|(_, rep)| rep.error.is_none()) => { + db.mutate(|db| { + notify( + db, + None, + NotificationLevel::Success, + "Backup Complete".to_owned(), + "Your backup has completed".to_owned(), + BackupReport { + server: ServerBackupReport { + attempted: true, + error: None, + }, + packages: report, + }, + ) + }) + .await + } + Ok(report) => { + db.mutate(|db| { + notify( + db, + None, + NotificationLevel::Warning, + "Backup Complete".to_owned(), + "Your backup has completed, but some package(s) failed to backup" + .to_owned(), + BackupReport { + server: ServerBackupReport { + attempted: true, + error: None, + }, + packages: report, + }, + ) + }) + .await + } + Err(e) => { + tracing::error!("Backup Failed: {}", e); + tracing::debug!("{:?}", e); + let err_string = e.to_string(); + db.mutate(|db| { + notify( + db, + None, + NotificationLevel::Error, + "Backup Failed".to_owned(), + "Your backup failed to complete.".to_owned(), + BackupReport { + server: ServerBackupReport { + attempted: true, + error: Some(err_string), + }, + packages: BTreeMap::new(), + }, + ) + }) + .await + } + }?; + } + Ok(()) + } +} +impl Drop for BackupStatusGuard { + fn drop(&mut self) { + if let Some(db) = self.0.take() { + tokio::spawn(async move { + db.mutate(|v| { + v.as_public_mut() + .as_server_info_mut() + .as_status_info_mut() + .as_backup_progress_mut() + .ser(&None) + }) + .await + .unwrap() + }); + } + } +} + #[instrument(skip(ctx, old_password, password))] pub async fn backup_all( ctx: RpcContext, @@ -57,139 +161,81 @@ pub async fn backup_all( .clone() .decrypt(&ctx)?; let password = password.decrypt(&ctx)?; - check_password_against_db(ctx.secret_store.acquire().await?.as_mut(), &password).await?; - let fs = target_id - .load(ctx.secret_store.acquire().await?.as_mut()) - .await?; + + let ((fs, package_ids), status_guard) = ( + ctx.db + .mutate(|db| { + check_password_against_db(db, &password)?; + let fs = target_id.load(db)?; + let package_ids = if let Some(ids) = package_ids { + ids.into_iter().collect() + } else { + db.as_public() + .as_package_data() + .as_entries()? + .into_iter() + .filter(|(_, m)| m.expect_as_installed().is_ok()) + .map(|(id, _)| id) + .collect() + }; + assure_backing_up(db, &package_ids)?; + Ok((fs, package_ids)) + }) + .await?, + BackupStatusGuard::new(ctx.db.clone()), + ); + let mut backup_guard = BackupMountGuard::mount( TmpMountGuard::mount(&fs, ReadWrite).await?, &old_password_decrypted, ) .await?; - let package_ids = if let Some(ids) = package_ids { - ids.into_iter().collect() - } else { - todo!("all installed packages"); - }; if old_password.is_some() { backup_guard.change_password(&password)?; } - assure_backing_up(&ctx.db, &package_ids).await?; tokio::task::spawn(async move { - let backup_res = perform_backup(&ctx, backup_guard, &package_ids).await; - match backup_res { - Ok(report) if report.iter().all(|(_, rep)| rep.error.is_none()) => ctx - .notification_manager - .notify( - ctx.db.clone(), - None, - NotificationLevel::Success, - "Backup Complete".to_owned(), - "Your backup has completed".to_owned(), - BackupReport { - server: ServerBackupReport { - attempted: true, - error: None, - }, - packages: report, - }, - None, - ) - .await - .expect("failed to send notification"), - Ok(report) => ctx - .notification_manager - .notify( - ctx.db.clone(), - None, - NotificationLevel::Warning, - "Backup Complete".to_owned(), - "Your backup has completed, but some package(s) failed to backup".to_owned(), - BackupReport { - server: ServerBackupReport { - attempted: true, - error: None, - }, - packages: report, - }, - None, - ) - .await - .expect("failed to send notification"), - Err(e) => { - tracing::error!("Backup Failed: {}", e); - tracing::debug!("{:?}", e); - ctx.notification_manager - .notify( - ctx.db.clone(), - None, - NotificationLevel::Error, - "Backup Failed".to_owned(), - "Your backup failed to complete.".to_owned(), - BackupReport { - server: ServerBackupReport { - attempted: true, - error: Some(e.to_string()), - }, - packages: BTreeMap::new(), - }, - None, - ) - .await - .expect("failed to send notification"); - } - } - ctx.db - .mutate(|v| { - v.as_public_mut() - .as_server_info_mut() - .as_status_info_mut() - .as_backup_progress_mut() - .ser(&None) - }) - .await?; - Ok::<(), Error>(()) + status_guard + .handle_result(perform_backup(&ctx, backup_guard, &package_ids).await) + .await + .unwrap(); }); Ok(()) } #[instrument(skip(db, packages))] -async fn assure_backing_up( - db: &PatchDb, - packages: impl IntoIterator + UnwindSafe + Send, +fn assure_backing_up<'a>( + db: &mut DatabaseModel, + packages: impl IntoIterator, ) -> Result<(), Error> { - db.mutate(|v| { - let backing_up = v - .as_public_mut() - .as_server_info_mut() - .as_status_info_mut() - .as_backup_progress_mut(); - if backing_up - .clone() - .de()? - .iter() - .flat_map(|x| x.values()) - .fold(false, |acc, x| { - if !x.complete { - return true; - } - acc - }) - { - return Err(Error::new( - eyre!("Server is already backing up!"), - ErrorKind::InvalidRequest, - )); - } - backing_up.ser(&Some( - packages - .into_iter() - .map(|x| (x.clone(), BackupProgress { complete: false })) - .collect(), - ))?; - Ok(()) - }) - .await + let backing_up = db + .as_public_mut() + .as_server_info_mut() + .as_status_info_mut() + .as_backup_progress_mut(); + if backing_up + .clone() + .de()? + .iter() + .flat_map(|x| x.values()) + .fold(false, |acc, x| { + if !x.complete { + return true; + } + acc + }) + { + return Err(Error::new( + eyre!("Server is already backing up!"), + ErrorKind::InvalidRequest, + )); + } + backing_up.ser(&Some( + packages + .into_iter() + .map(|x| (x.clone(), BackupProgress { complete: false })) + .collect(), + ))?; + Ok(()) } #[instrument(skip(ctx, backup_guard))] diff --git a/core/startos/src/backup/os.rs b/core/startos/src/backup/os.rs index 5ab8bd12e..6848473a7 100644 --- a/core/startos/src/backup/os.rs +++ b/core/startos/src/backup/os.rs @@ -1,13 +1,15 @@ -use openssl::pkey::PKey; +use openssl::pkey::{PKey, Private}; use openssl::x509::X509; use patch_db::Value; use serde::{Deserialize, Serialize}; +use ssh_key::private::Ed25519Keypair; +use torut::onion::TorSecretKeyV3; use crate::account::AccountInfo; use crate::hostname::{generate_hostname, generate_id, Hostname}; -use crate::net::keys::Key; use crate::prelude::*; -use crate::util::serde::Base64; +use crate::util::crypto::ed25519_expand_key; +use crate::util::serde::{Base32, Base64, Pem}; pub struct OsBackup { pub account: AccountInfo, @@ -19,19 +21,23 @@ impl<'de> Deserialize<'de> for OsBackup { D: serde::Deserializer<'de>, { let tagged = OsBackupSerDe::deserialize(deserializer)?; - match tagged.version { + Ok(match tagged.version { 0 => patch_db::value::from_value::(tagged.rest) .map_err(serde::de::Error::custom)? .project() - .map_err(serde::de::Error::custom), + .map_err(serde::de::Error::custom)?, 1 => patch_db::value::from_value::(tagged.rest) .map_err(serde::de::Error::custom)? - .project() - .map_err(serde::de::Error::custom), - v => Err(serde::de::Error::custom(&format!( - "Unknown backup version {v}" - ))), - } + .project(), + 2 => patch_db::value::from_value::(tagged.rest) + .map_err(serde::de::Error::custom)? + .project(), + v => { + return Err(serde::de::Error::custom(&format!( + "Unknown backup version {v}" + ))) + } + }) } } impl Serialize for OsBackup { @@ -40,11 +46,9 @@ impl Serialize for OsBackup { S: serde::Serializer, { OsBackupSerDe { - version: 1, - rest: patch_db::value::to_value( - &OsBackupV1::unproject(self).map_err(serde::ser::Error::custom)?, - ) - .map_err(serde::ser::Error::custom)?, + version: 2, + rest: patch_db::value::to_value(&OsBackupV2::unproject(self)) + .map_err(serde::ser::Error::custom)?, } .serialize(serializer) } @@ -62,10 +66,10 @@ struct OsBackupSerDe { #[derive(Deserialize)] #[serde(rename = "kebab-case")] struct OsBackupV0 { - // tor_key: Base32<[u8; 64]>, - root_ca_key: String, // PEM Encoded OpenSSL Key - root_ca_cert: String, // PEM Encoded OpenSSL X509 Certificate - ui: Value, // JSON Value + tor_key: Base32<[u8; 64]>, // Base32 Encoded Ed25519 Expanded Secret Key + root_ca_key: Pem>, // PEM Encoded OpenSSL Key + root_ca_cert: Pem, // PEM Encoded OpenSSL X509 Certificate + ui: Value, // JSON Value } impl OsBackupV0 { fn project(self) -> Result { @@ -74,9 +78,13 @@ impl OsBackupV0 { server_id: generate_id(), hostname: generate_hostname(), password: Default::default(), - key: Key::new(None), - root_ca_key: PKey::private_key_from_pem(self.root_ca_key.as_bytes())?, - root_ca_cert: X509::from_pem(self.root_ca_cert.as_bytes())?, + root_ca_key: self.root_ca_key.0, + root_ca_cert: self.root_ca_cert.0, + ssh_key: ssh_key::PrivateKey::random( + &mut rand::thread_rng(), + ssh_key::Algorithm::Ed25519, + )?, + tor_key: TorSecretKeyV3::from(self.tor_key.0), }, ui: self.ui, }) @@ -87,36 +95,67 @@ impl OsBackupV0 { #[derive(Deserialize, Serialize)] #[serde(rename = "kebab-case")] struct OsBackupV1 { - server_id: String, // uuidv4 - hostname: String, // embassy-- - net_key: Base64<[u8; 32]>, // Ed25519 Secret Key - root_ca_key: String, // PEM Encoded OpenSSL Key - root_ca_cert: String, // PEM Encoded OpenSSL X509 Certificate - ui: Value, // JSON Value - // TODO add more + server_id: String, // uuidv4 + hostname: String, // embassy-- + net_key: Base64<[u8; 32]>, // Ed25519 Secret Key + root_ca_key: Pem>, // PEM Encoded OpenSSL Key + root_ca_cert: Pem, // PEM Encoded OpenSSL X509 Certificate + ui: Value, // JSON Value } impl OsBackupV1 { - fn project(self) -> Result { - Ok(OsBackup { + fn project(self) -> OsBackup { + OsBackup { account: AccountInfo { server_id: self.server_id, hostname: Hostname(self.hostname), password: Default::default(), - key: Key::from_bytes(None, self.net_key.0), - root_ca_key: PKey::private_key_from_pem(self.root_ca_key.as_bytes())?, - root_ca_cert: X509::from_pem(self.root_ca_cert.as_bytes())?, + root_ca_key: self.root_ca_key.0, + root_ca_cert: self.root_ca_cert.0, + ssh_key: ssh_key::PrivateKey::from(Ed25519Keypair::from_seed(&self.net_key.0)), + tor_key: TorSecretKeyV3::from(ed25519_expand_key(&self.net_key.0)), }, ui: self.ui, - }) + } + } +} + +/// V2 +#[derive(Deserialize, Serialize)] +#[serde(rename = "kebab-case")] + +struct OsBackupV2 { + server_id: String, // uuidv4 + hostname: String, // - + root_ca_key: Pem>, // PEM Encoded OpenSSL Key + root_ca_cert: Pem, // PEM Encoded OpenSSL X509 Certificate + ssh_key: Pem, // PEM Encoded OpenSSH Key + tor_key: TorSecretKeyV3, // Base64 Encoded Ed25519 Expanded Secret Key + ui: Value, // JSON Value +} +impl OsBackupV2 { + fn project(self) -> OsBackup { + OsBackup { + account: AccountInfo { + server_id: self.server_id, + hostname: Hostname(self.hostname), + password: Default::default(), + root_ca_key: self.root_ca_key.0, + root_ca_cert: self.root_ca_cert.0, + ssh_key: self.ssh_key.0, + tor_key: self.tor_key, + }, + ui: self.ui, + } } - fn unproject(backup: &OsBackup) -> Result { - Ok(Self { + fn unproject(backup: &OsBackup) -> Self { + Self { server_id: backup.account.server_id.clone(), hostname: backup.account.hostname.0.clone(), - net_key: Base64(backup.account.key.as_bytes()), - root_ca_key: String::from_utf8(backup.account.root_ca_key.private_key_to_pem_pkcs8()?)?, - root_ca_cert: String::from_utf8(backup.account.root_ca_cert.to_pem()?)?, + root_ca_key: Pem(backup.account.root_ca_key.clone()), + root_ca_cert: Pem(backup.account.root_ca_cert.clone()), + ssh_key: Pem(backup.account.ssh_key.clone()), + tor_key: backup.account.tor_key.clone(), ui: backup.ui.clone(), - }) + } } } diff --git a/core/startos/src/backup/restore.rs b/core/startos/src/backup/restore.rs index 404c12c6b..bae7eb58a 100644 --- a/core/startos/src/backup/restore.rs +++ b/core/startos/src/backup/restore.rs @@ -5,6 +5,7 @@ use clap::Parser; use futures::{stream, StreamExt}; use models::PackageId; use openssl::x509::X509; +use patch_db::json_ptr::ROOT; use serde::{Deserialize, Serialize}; use torut::onion::OnionAddressV3; use tracing::instrument; @@ -12,6 +13,7 @@ use tracing::instrument; use super::target::BackupTargetId; use crate::backup::os::OsBackup; use crate::context::{RpcContext, SetupContext}; +use crate::db::model::Database; use crate::disk::mount::backup::BackupMountGuard; use crate::disk::mount::filesystem::ReadWrite; use crate::disk::mount::guard::{GenericMountGuard, TmpMountGuard}; @@ -42,9 +44,7 @@ pub async fn restore_packages_rpc( password, }: RestorePackageParams, ) -> Result<(), Error> { - let fs = target_id - .load(ctx.secret_store.acquire().await?.as_mut()) - .await?; + let fs = target_id.load(&ctx.db.peek().await)?; let backup_guard = BackupMountGuard::mount(TmpMountGuard::mount(&fs, ReadWrite).await?, &password).await?; @@ -95,11 +95,8 @@ pub async fn recover_full_embassy( ) .with_kind(ErrorKind::PasswordHashGeneration)?; - let secret_store = ctx.secret_store().await?; - - os_backup.account.save(&secret_store).await?; - - secret_store.close().await; + let db = ctx.db().await?; + db.put(&ROOT, &Database::init(&os_backup.account)?).await?; init(&ctx.config).await?; @@ -129,7 +126,7 @@ pub async fn recover_full_embassy( Ok(( disk_guid, os_backup.account.hostname, - os_backup.account.key.tor_address(), + os_backup.account.tor_key.public().get_onion_address(), os_backup.account.root_ca_cert, )) } diff --git a/core/startos/src/backup/target/cifs.rs b/core/startos/src/backup/target/cifs.rs index 4f3ee4827..db332e28f 100644 --- a/core/startos/src/backup/target/cifs.rs +++ b/core/startos/src/backup/target/cifs.rs @@ -1,14 +1,15 @@ +use std::collections::BTreeMap; use std::path::{Path, PathBuf}; use clap::Parser; use color_eyre::eyre::eyre; -use futures::TryStreamExt; +use imbl_value::InternedString; use rpc_toolkit::{command, from_fn_async, HandlerExt, ParentHandler}; use serde::{Deserialize, Serialize}; -use sqlx::{Executor, Postgres}; use super::{BackupTarget, BackupTargetId}; use crate::context::{CliContext, RpcContext}; +use crate::db::model::DatabaseModel; use crate::disk::mount::filesystem::cifs::Cifs; use crate::disk::mount::filesystem::ReadOnly; use crate::disk::mount::guard::{GenericMountGuard, TmpMountGuard}; @@ -16,6 +17,24 @@ use crate::disk::util::{recovery_info, EmbassyOsRecoveryInfo}; use crate::prelude::*; use crate::util::serde::KeyVal; +#[derive(Debug, Default, Deserialize, Serialize)] +pub struct CifsTargets(pub BTreeMap); +impl CifsTargets { + pub fn new() -> Self { + Self(BTreeMap::new()) + } +} +impl Map for CifsTargets { + type Key = u32; + type Value = Cifs; + fn key_str(key: &Self::Key) -> Result, Error> { + Self::key_string(key) + } + fn key_string(key: &Self::Key) -> Result { + Ok(InternedString::from_display(key)) + } +} + #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "kebab-case")] pub struct CifsBackupTarget { @@ -69,23 +88,27 @@ pub async fn add( ) -> Result, Error> { let cifs = Cifs { hostname, - path, + path: Path::new("/").join(path), username, password, }; let guard = TmpMountGuard::mount(&cifs, ReadOnly).await?; let embassy_os = recovery_info(guard.path()).await?; guard.unmount().await?; - let path_string = Path::new("/").join(&cifs.path).display().to_string(); - let id: i32 = sqlx::query!( - "INSERT INTO cifs_shares (hostname, path, username, password) VALUES ($1, $2, $3, $4) RETURNING id", - cifs.hostname, - path_string, - cifs.username, - cifs.password, - ) - .fetch_one(&ctx.secret_store) - .await?.id; + let id = ctx + .db + .mutate(|db| { + let id = db + .as_private() + .as_cifs() + .keys()? + .into_iter() + .max() + .map_or(0, |a| a + 1); + db.as_private_mut().as_cifs_mut().insert(&id, &cifs)?; + Ok(id) + }) + .await?; Ok(KeyVal { key: BackupTargetId::Cifs { id }, value: BackupTarget::Cifs(CifsBackupTarget { @@ -129,32 +152,27 @@ pub async fn update( }; let cifs = Cifs { hostname, - path, + path: Path::new("/").join(path), username, password, }; let guard = TmpMountGuard::mount(&cifs, ReadOnly).await?; let embassy_os = recovery_info(guard.path()).await?; guard.unmount().await?; - let path_string = Path::new("/").join(&cifs.path).display().to_string(); - if sqlx::query!( - "UPDATE cifs_shares SET hostname = $1, path = $2, username = $3, password = $4 WHERE id = $5", - cifs.hostname, - path_string, - cifs.username, - cifs.password, - id, - ) - .execute(&ctx.secret_store) - .await? - .rows_affected() - == 0 - { - return Err(Error::new( - eyre!("Backup Target ID {} Not Found", BackupTargetId::Cifs { id }), - ErrorKind::NotFound, - )); - }; + ctx.db + .mutate(|db| { + db.as_private_mut() + .as_cifs_mut() + .as_idx_mut(&id) + .ok_or_else(|| { + Error::new( + eyre!("Backup Target ID {} Not Found", BackupTargetId::Cifs { id }), + ErrorKind::NotFound, + ) + })? + .ser(&cifs) + }) + .await?; Ok(KeyVal { key: BackupTargetId::Cifs { id }, value: BackupTarget::Cifs(CifsBackupTarget { @@ -183,74 +201,46 @@ pub async fn remove(ctx: RpcContext, RemoveParams { id }: RemoveParams) -> Resul ErrorKind::NotFound, )); }; - if sqlx::query!("DELETE FROM cifs_shares WHERE id = $1", id) - .execute(&ctx.secret_store) - .await? - .rows_affected() - == 0 - { - return Err(Error::new( - eyre!("Backup Target ID {} Not Found", BackupTargetId::Cifs { id }), - ErrorKind::NotFound, - )); - }; + ctx.db + .mutate(|db| db.as_private_mut().as_cifs_mut().remove(&id)) + .await?; Ok(()) } -pub async fn load(secrets: &mut Ex, id: i32) -> Result -where - for<'a> &'a mut Ex: Executor<'a, Database = Postgres>, -{ - let record = sqlx::query!( - "SELECT hostname, path, username, password FROM cifs_shares WHERE id = $1", - id - ) - .fetch_one(secrets) - .await?; - - Ok(Cifs { - hostname: record.hostname, - path: PathBuf::from(record.path), - username: record.username, - password: record.password, - }) +pub fn load(db: &DatabaseModel, id: u32) -> Result { + db.as_private() + .as_cifs() + .as_idx(&id) + .ok_or_else(|| { + Error::new( + eyre!("Backup Target ID {} Not Found", id), + ErrorKind::NotFound, + ) + })? + .de() } -pub async fn list(secrets: &mut Ex) -> Result, Error> -where - for<'a> &'a mut Ex: Executor<'a, Database = Postgres>, -{ - let mut records = - sqlx::query!("SELECT id, hostname, path, username, password FROM cifs_shares") - .fetch_many(secrets); - +pub async fn list(db: &DatabaseModel) -> Result, Error> { let mut cifs = Vec::new(); - while let Some(query_result) = records.try_next().await? { - if let Some(record) = query_result.right() { - let mount_info = Cifs { - hostname: record.hostname, - path: PathBuf::from(record.path), - username: record.username, - password: record.password, - }; - let embassy_os = async { - let guard = TmpMountGuard::mount(&mount_info, ReadOnly).await?; - let embassy_os = recovery_info(guard.path()).await?; - guard.unmount().await?; - Ok::<_, Error>(embassy_os) - } - .await; - cifs.push(( - record.id, - CifsBackupTarget { - hostname: mount_info.hostname, - path: mount_info.path, - username: mount_info.username, - mountable: embassy_os.is_ok(), - embassy_os: embassy_os.ok().and_then(|a| a), - }, - )); + for (id, model) in db.as_private().as_cifs().as_entries()? { + let mount_info = model.de()?; + let embassy_os = async { + let guard = TmpMountGuard::mount(&mount_info, ReadOnly).await?; + let embassy_os = recovery_info(guard.path()).await?; + guard.unmount().await?; + Ok::<_, Error>(embassy_os) } + .await; + cifs.push(( + id, + CifsBackupTarget { + hostname: mount_info.hostname, + path: mount_info.path, + username: mount_info.username, + mountable: embassy_os.is_ok(), + embassy_os: embassy_os.ok().and_then(|a| a), + }, + )); } Ok(cifs) diff --git a/core/startos/src/backup/target/mod.rs b/core/startos/src/backup/target/mod.rs index 473b2865d..72dd45832 100644 --- a/core/startos/src/backup/target/mod.rs +++ b/core/startos/src/backup/target/mod.rs @@ -11,12 +11,12 @@ use models::PackageId; use rpc_toolkit::{command, from_fn_async, AnyContext, HandlerExt, ParentHandler}; use serde::{Deserialize, Serialize}; use sha2::Sha256; -use sqlx::{Executor, Postgres}; use tokio::sync::Mutex; use tracing::instrument; use self::cifs::CifsBackupTarget; use crate::context::{CliContext, RpcContext}; +use crate::db::model::DatabaseModel; use crate::disk::mount::backup::BackupMountGuard; use crate::disk::mount::filesystem::block_dev::BlockDev; use crate::disk::mount::filesystem::cifs::Cifs; @@ -49,18 +49,15 @@ pub enum BackupTarget { #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] pub enum BackupTargetId { Disk { logicalname: PathBuf }, - Cifs { id: i32 }, + Cifs { id: u32 }, } impl BackupTargetId { - pub async fn load(self, secrets: &mut Ex) -> Result - where - for<'a> &'a mut Ex: Executor<'a, Database = Postgres>, - { + pub fn load(self, db: &DatabaseModel) -> Result { Ok(match self { BackupTargetId::Disk { logicalname } => { BackupTargetFS::Disk(BlockDev::new(logicalname)) } - BackupTargetId::Cifs { id } => BackupTargetFS::Cifs(cifs::load(secrets, id).await?), + BackupTargetId::Cifs { id } => BackupTargetFS::Cifs(cifs::load(db, id)?), }) } } @@ -161,10 +158,10 @@ pub fn target() -> ParentHandler { // #[command(display(display_serializable))] pub async fn list(ctx: RpcContext) -> Result, Error> { - let mut sql_handle = ctx.secret_store.acquire().await?; + let peek = ctx.db.peek().await; let (disks_res, cifs) = tokio::try_join!( crate::disk::util::list(&ctx.os_partitions), - cifs::list(sql_handle.as_mut()), + cifs::list(&peek), )?; Ok(disks_res .into_iter() @@ -262,13 +259,7 @@ pub async fn info( }: InfoParams, ) -> Result { let guard = BackupMountGuard::mount( - TmpMountGuard::mount( - &target_id - .load(ctx.secret_store.acquire().await?.as_mut()) - .await?, - ReadWrite, - ) - .await?, + TmpMountGuard::mount(&target_id.load(&ctx.db.peek().await)?, ReadWrite).await?, &password, ) .await?; @@ -308,14 +299,7 @@ pub async fn mount( } let guard = BackupMountGuard::mount( - TmpMountGuard::mount( - &target_id - .clone() - .load(ctx.secret_store.acquire().await?.as_mut()) - .await?, - ReadWrite, - ) - .await?, + TmpMountGuard::mount(&target_id.clone().load(&ctx.db.peek().await)?, ReadWrite).await?, &password, ) .await?; diff --git a/core/startos/src/context/config.rs b/core/startos/src/context/config.rs index fc9cfb790..55065e816 100644 --- a/core/startos/src/context/config.rs +++ b/core/startos/src/context/config.rs @@ -3,15 +3,12 @@ use std::net::SocketAddr; use std::path::{Path, PathBuf}; use clap::Parser; -use patch_db::json_ptr::JsonPointer; use reqwest::Url; use serde::de::DeserializeOwned; use serde::{Deserialize, Serialize}; use sqlx::postgres::PgConnectOptions; use sqlx::PgPool; -use crate::account::AccountInfo; -use crate::db::model::Database; use crate::disk::OsPartitionInfo; use crate::init::init_postgres; use crate::prelude::*; @@ -149,15 +146,12 @@ impl ServerConfig { .as_deref() .unwrap_or_else(|| Path::new("/embassy-data")) } - pub async fn db(&self, account: &AccountInfo) -> Result { + pub async fn db(&self) -> Result { let db_path = self.datadir().join("main").join("embassy.db"); let db = PatchDb::open(&db_path) .await .with_ctx(|_| (crate::ErrorKind::Filesystem, db_path.display().to_string()))?; - if !db.exists(&::default()).await { - db.put(&::default(), &Database::init(account)) - .await?; - } + Ok(db) } #[instrument(skip_all)] diff --git a/core/startos/src/context/rpc.rs b/core/startos/src/context/rpc.rs index 905132071..0f11bf63f 100644 --- a/core/startos/src/context/rpc.rs +++ b/core/startos/src/context/rpc.rs @@ -11,7 +11,6 @@ use josekit::jwk::Jwk; use patch_db::PatchDb; use reqwest::{Client, Proxy}; use rpc_toolkit::Context; -use sqlx::PgPool; use tokio::sync::{broadcast, oneshot, Mutex, RwLock}; use tokio::time::Instant; use tracing::instrument; @@ -28,14 +27,11 @@ use crate::init::check_time_is_synchronized; use crate::lxc::{LxcContainer, LxcManager}; use crate::middleware::auth::HashSessionToken; use crate::net::net_controller::NetController; -use crate::net::ssl::{root_ca_start_time, SslManager}; use crate::net::utils::find_eth_iface; use crate::net::wifi::WpaCli; -use crate::notifications::NotificationManager; use crate::prelude::*; use crate::service::ServiceMap; use crate::shutdown::Shutdown; -use crate::status::MainStatus; use crate::system::get_mem_info; use crate::util::lshw::{lshw, LshwDevice}; @@ -47,14 +43,12 @@ pub struct RpcContextSeed { pub datadir: PathBuf, pub disk_guid: Arc, pub db: PatchDb, - pub secret_store: PgPool, pub account: RwLock, pub net_controller: Arc, pub services: ServiceMap, pub metrics_cache: RwLock>, pub shutdown: broadcast::Sender>, pub tor_socks: SocketAddr, - pub notification_manager: NotificationManager, pub lxc_manager: Arc, pub open_authed_websockets: Mutex>>>, pub rpc_stream_continuations: Mutex>, @@ -86,13 +80,14 @@ impl RpcContext { 9050, ))); let (shutdown, _) = tokio::sync::broadcast::channel(1); - let secret_store = config.secret_store().await?; - tracing::info!("Opened Pg DB"); - let account = AccountInfo::load(&secret_store).await?; - let db = config.db(&account).await?; + + let db = config.db().await?; + let peek = db.peek().await; + let account = AccountInfo::load(&peek)?; tracing::info!("Opened PatchDB"); let net_controller = Arc::new( NetController::init( + db.clone(), config .tor_control .unwrap_or(SocketAddr::from(([127, 0, 0, 1], 9051))), @@ -101,16 +96,14 @@ impl RpcContext { .dns_bind .as_deref() .unwrap_or(&[SocketAddr::from(([127, 0, 0, 1], 53))]), - SslManager::new(&account, root_ca_start_time().await?)?, &account.hostname, - &account.key, + account.tor_key.clone(), ) .await?, ); tracing::info!("Initialized Net Controller"); let services = ServiceMap::default(); let metrics_cache = RwLock::>::new(None); - let notification_manager = NotificationManager::new(secret_store.clone()); tracing::info!("Initialized Notification Manager"); let tor_proxy_url = format!("socks5h://{tor_proxy}"); let devices = lshw().await?; @@ -157,14 +150,12 @@ impl RpcContext { }, disk_guid, db, - secret_store, account: RwLock::new(account), net_controller, services, metrics_cache, shutdown, tor_socks: tor_proxy, - notification_manager, lxc_manager: Arc::new(LxcManager::new()), open_authed_websockets: Mutex::new(BTreeMap::new()), rpc_stream_continuations: Mutex::new(BTreeMap::new()), @@ -208,7 +199,6 @@ impl RpcContext { #[instrument(skip_all)] pub async fn shutdown(self) -> Result<(), Error> { self.services.shutdown_all().await?; - self.secret_store.close().await; self.is_closed.store(true, Ordering::SeqCst); tracing::info!("RPC Context is shutdown"); // TODO: shutdown http servers diff --git a/core/startos/src/context/setup.rs b/core/startos/src/context/setup.rs index aeeca2920..933aa155c 100644 --- a/core/startos/src/context/setup.rs +++ b/core/startos/src/context/setup.rs @@ -3,7 +3,6 @@ use std::path::PathBuf; use std::sync::Arc; use josekit::jwk::Jwk; -use patch_db::json_ptr::JsonPointer; use patch_db::PatchDb; use rpc_toolkit::yajrc::RpcError; use rpc_toolkit::Context; @@ -14,9 +13,7 @@ use tokio::sync::broadcast::Sender; use tokio::sync::RwLock; use tracing::instrument; -use crate::account::AccountInfo; use crate::context::config::ServerConfig; -use crate::db::model::Database; use crate::disk::OsPartitionInfo; use crate::init::init_postgres; use crate::prelude::*; @@ -81,15 +78,11 @@ impl SetupContext { }))) } #[instrument(skip_all)] - pub async fn db(&self, account: &AccountInfo) -> Result { + pub async fn db(&self) -> Result { let db_path = self.datadir.join("main").join("embassy.db"); let db = PatchDb::open(&db_path) .await .with_ctx(|_| (crate::ErrorKind::Filesystem, db_path.display().to_string()))?; - if !db.exists(&::default()).await { - db.put(&::default(), &Database::init(account)) - .await?; - } Ok(db) } #[instrument(skip_all)] diff --git a/core/startos/src/control.rs b/core/startos/src/control.rs index 893aeee2b..26b227cd2 100644 --- a/core/startos/src/control.rs +++ b/core/startos/src/control.rs @@ -24,7 +24,7 @@ pub async fn start(ctx: RpcContext, ControlParams { id }: ControlParams) -> Resu .as_ref() .or_not_found(lazy_format!("Manager for {id}"))? .start() - .await; + .await?; Ok(()) } @@ -37,7 +37,7 @@ pub async fn stop(ctx: RpcContext, ControlParams { id }: ControlParams) -> Resul .as_ref() .ok_or_else(|| Error::new(eyre!("Manager not found"), crate::ErrorKind::InvalidRequest))? .stop() - .await; + .await?; Ok(()) } @@ -49,7 +49,7 @@ pub async fn restart(ctx: RpcContext, ControlParams { id }: ControlParams) -> Re .as_ref() .ok_or_else(|| Error::new(eyre!("Manager not found"), crate::ErrorKind::InvalidRequest))? .restart() - .await; + .await?; Ok(()) } diff --git a/core/startos/src/db/model.rs b/core/startos/src/db/model.rs index 571573a54..19cfa37a1 100644 --- a/core/startos/src/db/model.rs +++ b/core/startos/src/db/model.rs @@ -13,30 +13,46 @@ use patch_db::json_ptr::JsonPointer; use patch_db::{HasModel, Value}; use reqwest::Url; use serde::{Deserialize, Serialize}; -use ssh_key::public::Ed25519PublicKey; +use torut::onion::OnionAddressV3; use crate::account::AccountInfo; +use crate::auth::Sessions; +use crate::backup::target::cifs::CifsTargets; +use crate::net::forward::AvailablePorts; +use crate::net::host::HostInfo; +use crate::net::keys::KeyStore; use crate::net::utils::{get_iface_ipv4_addr, get_iface_ipv6_addr}; +use crate::notifications::Notifications; use crate::prelude::*; use crate::progress::FullProgress; use crate::s9pk::manifest::Manifest; +use crate::ssh::SshKeys; use crate::status::Status; use crate::util::cpupower::Governor; +use crate::util::serde::Pem; use crate::util::Version; use crate::version::{Current, VersionT}; use crate::{ARCH, PLATFORM}; +fn get_arch() -> InternedString { + (*ARCH).into() +} + +fn get_platform() -> InternedString { + (&*PLATFORM).into() +} + #[derive(Debug, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] #[model = "Model"] pub struct Database { pub public: Public, - pub private: (), // TODO + pub private: Private, } impl Database { - pub fn init(account: &AccountInfo) -> Self { + pub fn init(account: &AccountInfo) -> Result { let lan_address = account.hostname.lan_address().parse().unwrap(); - Database { + Ok(Database { public: Public { server_info: ServerInfo { arch: get_arch(), @@ -48,9 +64,13 @@ impl Database { last_wifi_region: None, eos_version_compat: Current::new().compat().clone(), lan_address, - tor_address: format!("https://{}", account.key.tor_address()) - .parse() - .unwrap(), + onion_address: account.tor_key.public().get_onion_address(), + tor_address: format!( + "https://{}", + account.tor_key.public().get_onion_address() + ) + .parse() + .unwrap(), ip_info: BTreeMap::new(), status_info: ServerStatus { backup_progress: None, @@ -70,11 +90,9 @@ impl Database { clearnet: Vec::new(), }, password_hash: account.password.clone(), - pubkey: ssh_key::PublicKey::from(Ed25519PublicKey::from( - &account.key.ssh_key(), - )) - .to_openssh() - .unwrap(), + pubkey: ssh_key::PublicKey::from(&account.ssh_key) + .to_openssh() + .unwrap(), ca_fingerprint: account .root_ca_cert .digest(MessageDigest::sha256()) @@ -93,11 +111,22 @@ impl Database { ))) .unwrap(), }, - private: (), // TODO - } + private: Private { + key_store: KeyStore::new(account)?, + password: account.password.clone(), + ssh_privkey: Pem(account.ssh_key.clone()), + ssh_pubkeys: SshKeys::new(), + available_ports: AvailablePorts::new(), + sessions: Sessions::new(), + notifications: Notifications::new(), + cifs: CifsTargets::new(), + }, // TODO + }) } } +pub type DatabaseModel = Model; + #[derive(Debug, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] #[model = "Model"] @@ -108,14 +137,18 @@ pub struct Public { pub ui: Value, } -pub type DatabaseModel = Model; - -fn get_arch() -> InternedString { - (*ARCH).into() -} - -fn get_platform() -> InternedString { - (&*PLATFORM).into() +#[derive(Debug, Deserialize, Serialize, HasModel)] +#[serde(rename_all = "kebab-case")] +#[model = "Model"] +pub struct Private { + pub key_store: KeyStore, + pub password: String, // argon2 hash + pub ssh_privkey: Pem, + pub ssh_pubkeys: SshKeys, + pub available_ports: AvailablePorts, + pub sessions: Sessions, + pub notifications: Notifications, + pub cifs: CifsTargets, } #[derive(Debug, Deserialize, Serialize, HasModel)] @@ -134,6 +167,8 @@ pub struct ServerInfo { pub last_wifi_region: Option, pub eos_version_compat: VersionRange, pub lan_address: Url, + pub onion_address: OnionAddressV3, + /// for backwards compatibility pub tor_address: Url, pub ip_info: BTreeMap, #[serde(default)] @@ -229,6 +264,12 @@ pub struct AllPackageData(pub BTreeMap); impl Map for AllPackageData { type Key = PackageId; type Value = PackageDataEntry; + fn key_str(key: &Self::Key) -> Result, Error> { + Ok(key) + } + fn key_string(key: &Self::Key) -> Result { + Ok(key.clone().into()) + } } #[derive(Debug, Deserialize, Serialize, HasModel)] @@ -471,6 +512,7 @@ pub struct InstalledPackageInfo { pub current_dependents: CurrentDependents, pub current_dependencies: CurrentDependencies, pub interface_addresses: InterfaceAddressMap, + pub hosts: HostInfo, pub store: Value, pub store_exposed_ui: Vec, pub store_exposed_dependents: Vec, @@ -512,6 +554,12 @@ impl CurrentDependents { impl Map for CurrentDependents { type Key = PackageId; type Value = CurrentDependencyInfo; + fn key_str(key: &Self::Key) -> Result, Error> { + Ok(key) + } + fn key_string(key: &Self::Key) -> Result { + Ok(key.clone().into()) + } } #[derive(Debug, Clone, Default, Deserialize, Serialize)] pub struct CurrentDependencies(pub BTreeMap); @@ -529,6 +577,12 @@ impl CurrentDependencies { impl Map for CurrentDependencies { type Key = PackageId; type Value = CurrentDependencyInfo; + fn key_str(key: &Self::Key) -> Result, Error> { + Ok(key) + } + fn key_string(key: &Self::Key) -> Result { + Ok(key.clone().into()) + } } #[derive(Debug, Deserialize, Serialize, HasModel)] @@ -552,6 +606,12 @@ pub struct InterfaceAddressMap(pub BTreeMap); impl Map for InterfaceAddressMap { type Key = HostId; type Value = InterfaceAddresses; + fn key_str(key: &Self::Key) -> Result, Error> { + Ok(key) + } + fn key_string(key: &Self::Key) -> Result { + Ok(key.clone().into()) + } } #[derive(Debug, Deserialize, Serialize, HasModel)] diff --git a/core/startos/src/db/prelude.rs b/core/startos/src/db/prelude.rs index 14f5e21eb..911b2d389 100644 --- a/core/startos/src/db/prelude.rs +++ b/core/startos/src/db/prelude.rs @@ -1,13 +1,15 @@ use std::collections::BTreeMap; use std::marker::PhantomData; use std::panic::UnwindSafe; +use std::str::FromStr; +use chrono::{DateTime, Utc}; pub use imbl_value::Value; use patch_db::json_ptr::ROOT; use patch_db::value::InternedString; pub use patch_db::{HasModel, PatchDb}; use serde::de::DeserializeOwned; -use serde::Serialize; +use serde::{Deserialize, Serialize}; use crate::db::model::DatabaseModel; use crate::prelude::*; @@ -92,12 +94,37 @@ impl Model { } } +impl Serialize for Model { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + self.value.serialize(serializer) + } +} + +impl<'de, T: Serialize + Deserialize<'de>> Deserialize<'de> for Model { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + use serde::de::Error; + Self::new(&T::deserialize(deserializer)?).map_err(D::Error::custom) + } +} + impl Model { pub fn replace(&mut self, value: &T) -> Result { let orig = self.de()?; self.ser(value)?; Ok(orig) } + pub fn mutate(&mut self, f: impl FnOnce(&mut T) -> Result) -> Result { + let mut orig = self.de()?; + let res = f(&mut orig)?; + self.ser(&orig)?; + Ok(res) + } } impl Clone for Model { fn clone(&self) -> Self { @@ -181,20 +208,38 @@ impl Model> { pub trait Map: DeserializeOwned + Serialize { type Key; type Value; + fn key_str(key: &Self::Key) -> Result, Error>; + fn key_string(key: &Self::Key) -> Result { + Ok(InternedString::intern(Self::key_str(key)?.as_ref())) + } } impl Map for BTreeMap +where + A: serde::Serialize + serde::de::DeserializeOwned + Ord + AsRef, + B: serde::Serialize + serde::de::DeserializeOwned, +{ + type Key = A; + type Value = B; + fn key_str(key: &Self::Key) -> Result, Error> { + Ok(key.as_ref()) + } +} + +impl Map for BTreeMap, B> where A: serde::Serialize + serde::de::DeserializeOwned + Ord, B: serde::Serialize + serde::de::DeserializeOwned, { type Key = A; type Value = B; + fn key_str(key: &Self::Key) -> Result, Error> { + serde_json::to_string(key).with_kind(ErrorKind::Serialization) + } } impl Model where - T::Key: AsRef, T::Value: Serialize, { pub fn insert(&mut self, key: &T::Key, value: &T::Value) -> Result<(), Error> { @@ -202,7 +247,7 @@ where let v = patch_db::value::to_value(value)?; match &mut self.value { Value::Object(o) => { - o.insert(InternedString::intern(key.as_ref()), v); + o.insert(T::key_string(key)?, v); Ok(()) } v => Err(patch_db::value::Error { @@ -212,13 +257,40 @@ where .into()), } } + pub fn upsert(&mut self, key: &T::Key, value: F) -> Result<&mut Model, Error> + where + F: FnOnce() -> D, + D: AsRef, + { + use serde::ser::Error; + match &mut self.value { + Value::Object(o) => { + use patch_db::ModelExt; + let s = T::key_str(key)?; + let exists = o.contains_key(s.as_ref()); + let res = self.transmute_mut(|v| { + use patch_db::value::index::Index; + s.as_ref().index_or_insert(v) + }); + if !exists { + res.ser(value().as_ref())?; + } + Ok(res) + } + v => Err(patch_db::value::Error { + source: patch_db::value::ErrorSource::custom(format!("expected object found {v}")), + kind: patch_db::value::ErrorKind::Serialization, + } + .into()), + } + } pub fn insert_model(&mut self, key: &T::Key, value: Model) -> Result<(), Error> { use patch_db::ModelExt; use serde::ser::Error; let v = value.into_value(); match &mut self.value { Value::Object(o) => { - o.insert(InternedString::intern(key.as_ref()), v); + o.insert(T::key_string(key)?, v); Ok(()) } v => Err(patch_db::value::Error { @@ -232,25 +304,16 @@ where impl Model where - T::Key: DeserializeOwned + Ord + Clone, + T::Key: FromStr + Ord + Clone, + Error: From<::Err>, { pub fn keys(&self) -> Result, Error> { use serde::de::Error; - use serde::Deserialize; match &self.value { Value::Object(o) => o .keys() .cloned() - .map(|k| { - T::Key::deserialize(patch_db::value::de::InternedStringDeserializer::from(k)) - .map_err(|e| { - patch_db::value::Error { - kind: patch_db::value::ErrorKind::Deserialization, - source: e, - } - .into() - }) - }) + .map(|k| Ok(T::Key::from_str(&*k)?)) .collect(), v => Err(patch_db::value::Error { source: patch_db::value::ErrorSource::custom(format!("expected object found {v}")), @@ -263,19 +326,10 @@ where pub fn into_entries(self) -> Result)>, Error> { use patch_db::ModelExt; use serde::de::Error; - use serde::Deserialize; match self.value { Value::Object(o) => o .into_iter() - .map(|(k, v)| { - Ok(( - T::Key::deserialize(patch_db::value::de::InternedStringDeserializer::from( - k, - )) - .with_kind(ErrorKind::Deserialization)?, - Model::from_value(v), - )) - }) + .map(|(k, v)| Ok((T::Key::from_str(&*k)?, Model::from_value(v)))) .collect(), v => Err(patch_db::value::Error { source: patch_db::value::ErrorSource::custom(format!("expected object found {v}")), @@ -287,19 +341,10 @@ where pub fn as_entries(&self) -> Result)>, Error> { use patch_db::ModelExt; use serde::de::Error; - use serde::Deserialize; match &self.value { Value::Object(o) => o .iter() - .map(|(k, v)| { - Ok(( - T::Key::deserialize(patch_db::value::de::InternedStringDeserializer::from( - k.clone(), - )) - .with_kind(ErrorKind::Deserialization)?, - Model::value_as(v), - )) - }) + .map(|(k, v)| Ok((T::Key::from_str(&**k)?, Model::value_as(v)))) .collect(), v => Err(patch_db::value::Error { source: patch_db::value::ErrorSource::custom(format!("expected object found {v}")), @@ -311,19 +356,10 @@ where pub fn as_entries_mut(&mut self) -> Result)>, Error> { use patch_db::ModelExt; use serde::de::Error; - use serde::Deserialize; match &mut self.value { Value::Object(o) => o .iter_mut() - .map(|(k, v)| { - Ok(( - T::Key::deserialize(patch_db::value::de::InternedStringDeserializer::from( - k.clone(), - )) - .with_kind(ErrorKind::Deserialization)?, - Model::value_as_mut(v), - )) - }) + .map(|(k, v)| Ok((T::Key::from_str(&**k)?, Model::value_as_mut(v)))) .collect(), v => Err(patch_db::value::Error { source: patch_db::value::ErrorSource::custom(format!("expected object found {v}")), @@ -333,36 +369,36 @@ where } } } -impl Model -where - T::Key: AsRef, -{ +impl Model { pub fn into_idx(self, key: &T::Key) -> Option> { use patch_db::ModelExt; + let s = T::key_str(key).ok()?; match &self.value { - Value::Object(o) if o.contains_key(key.as_ref()) => Some(self.transmute(|v| { + Value::Object(o) if o.contains_key(s.as_ref()) => Some(self.transmute(|v| { use patch_db::value::index::Index; - key.as_ref().index_into_owned(v).unwrap() + s.as_ref().index_into_owned(v).unwrap() })), _ => None, } } pub fn as_idx<'a>(&'a self, key: &T::Key) -> Option<&'a Model> { use patch_db::ModelExt; + let s = T::key_str(key).ok()?; match &self.value { - Value::Object(o) if o.contains_key(key.as_ref()) => Some(self.transmute_ref(|v| { + Value::Object(o) if o.contains_key(s.as_ref()) => Some(self.transmute_ref(|v| { use patch_db::value::index::Index; - key.as_ref().index_into(v).unwrap() + s.as_ref().index_into(v).unwrap() })), _ => None, } } pub fn as_idx_mut<'a>(&'a mut self, key: &T::Key) -> Option<&'a mut Model> { use patch_db::ModelExt; + let s = T::key_str(key).ok()?; match &mut self.value { - Value::Object(o) if o.contains_key(key.as_ref()) => Some(self.transmute_mut(|v| { + Value::Object(o) if o.contains_key(s.as_ref()) => Some(self.transmute_mut(|v| { use patch_db::value::index::Index; - key.as_ref().index_or_insert(v) + s.as_ref().index_or_insert(v) })), _ => None, } @@ -371,7 +407,7 @@ where use serde::ser::Error; match &mut self.value { Value::Object(o) => { - let v = o.remove(key.as_ref()); + let v = o.remove(T::key_str(key)?.as_ref()); Ok(v.map(patch_db::ModelExt::from_value)) } v => Err(patch_db::value::Error { @@ -382,3 +418,90 @@ where } } } + +#[repr(transparent)] +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] +pub struct JsonKey(pub T); +impl From for JsonKey { + fn from(value: T) -> Self { + Self::new(value) + } +} +impl JsonKey { + pub fn new(value: T) -> Self { + Self(value) + } + pub fn unwrap(self) -> T { + self.0 + } + pub fn new_ref(value: &T) -> &Self { + unsafe { std::mem::transmute(value) } + } + pub fn new_mut(value: &mut T) -> &mut Self { + unsafe { std::mem::transmute(value) } + } +} +impl std::ops::Deref for JsonKey { + type Target = T; + fn deref(&self) -> &Self::Target { + &self.0 + } +} +impl std::ops::DerefMut for JsonKey { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} +impl Serialize for JsonKey { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + use serde::ser::Error; + serde_json::to_string(&self.0) + .map_err(S::Error::custom)? + .serialize(serializer) + } +} +// { "foo": "bar" } -> "{ \"foo\": \"bar\" }" +impl<'de, T: Serialize + DeserializeOwned> Deserialize<'de> for JsonKey { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + use serde::de::Error; + let string = String::deserialize(deserializer)?; + Ok(Self( + serde_json::from_str(&string).map_err(D::Error::custom)?, + )) + } +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct WithTimeData { + pub created_at: DateTime, + pub updated_at: DateTime, + pub value: T, +} +impl WithTimeData { + pub fn new(value: T) -> Self { + let now = Utc::now(); + Self { + created_at: now, + updated_at: now, + value, + } + } +} +impl std::ops::Deref for WithTimeData { + type Target = T; + fn deref(&self) -> &Self::Target { + &self.value + } +} +impl std::ops::DerefMut for WithTimeData { + fn deref_mut(&mut self) -> &mut Self::Target { + self.updated_at = Utc::now(); + &mut self.value + } +} diff --git a/core/startos/src/dependencies.rs b/core/startos/src/dependencies.rs index 6ebe7afed..4e96a3db3 100644 --- a/core/startos/src/dependencies.rs +++ b/core/startos/src/dependencies.rs @@ -9,13 +9,11 @@ use serde::{Deserialize, Serialize}; use tracing::instrument; use crate::config::{Config, ConfigSpec, ConfigureContext}; -use crate::context::{CliContext, RpcContext}; +use crate::context::RpcContext; use crate::db::model::{CurrentDependencies, Database}; use crate::prelude::*; use crate::s9pk::manifest::Manifest; use crate::status::DependencyConfigErrors; -use crate::util::serde::HandlerExtSerde; -use crate::util::Version; use crate::Error; pub fn dependency() -> ParentHandler { @@ -28,6 +26,12 @@ pub struct Dependencies(pub BTreeMap); impl Map for Dependencies { type Key = PackageId; type Value = DepInfo; + fn key_str(key: &Self::Key) -> Result, Error> { + Ok(key) + } + fn key_string(key: &Self::Key) -> Result { + Ok(key.clone().into()) + } } #[derive(Clone, Debug, Deserialize, Serialize)] diff --git a/core/startos/src/firmware.rs b/core/startos/src/firmware.rs index ed4a6577a..86f576cce 100644 --- a/core/startos/src/firmware.rs +++ b/core/startos/src/firmware.rs @@ -2,7 +2,6 @@ use std::collections::BTreeSet; use std::path::Path; use async_compression::tokio::bufread::GzipDecoder; -use clap::Parser; use serde::{Deserialize, Serialize}; use tokio::fs::File; use tokio::io::BufReader; diff --git a/core/startos/src/init.rs b/core/startos/src/init.rs index fab80ab09..68a57fca9 100644 --- a/core/startos/src/init.rs +++ b/core/startos/src/init.rs @@ -6,7 +6,6 @@ use std::time::{Duration, SystemTime}; use color_eyre::eyre::eyre; use models::ResultExt; use rand::random; -use sqlx::{Pool, Postgres}; use tokio::process::Command; use tracing::instrument; @@ -179,7 +178,6 @@ pub async fn init_postgres(datadir: impl AsRef) -> Result<(), Error> { } pub struct InitResult { - pub secret_store: Pool, pub db: patch_db::PatchDb, } @@ -208,16 +206,19 @@ pub async fn init(cfg: &ServerConfig) -> Result { .await?; } - let secret_store = cfg.secret_store().await?; - tracing::info!("Opened Postgres"); + let db = cfg.db().await?; + let peek = db.peek().await; + tracing::info!("Opened PatchDB"); - crate::ssh::sync_keys_from_db(&secret_store, "/home/start9/.ssh/authorized_keys").await?; + crate::ssh::sync_keys( + &peek.as_private().as_ssh_pubkeys().de()?, + "/home/start9/.ssh/authorized_keys", + ) + .await?; tracing::info!("Synced SSH Keys"); - let account = AccountInfo::load(&secret_store).await?; - let db = cfg.db(&account).await?; - tracing::info!("Opened PatchDB"); - let peek = db.peek().await; + let account = AccountInfo::load(&peek)?; + let mut server_info = peek.as_public().as_server_info().de()?; // write to ca cert store @@ -348,7 +349,7 @@ pub async fn init(cfg: &ServerConfig) -> Result { }) .await?; - crate::version::init(&db, &secret_store).await?; + crate::version::init(&db).await?; db.mutate(|d| { let model = d.de()?; @@ -366,5 +367,5 @@ pub async fn init(cfg: &ServerConfig) -> Result { tracing::info!("System initialized."); - Ok(InitResult { secret_store, db }) + Ok(InitResult { db }) } diff --git a/core/startos/src/install/mod.rs b/core/startos/src/install/mod.rs index ac00a750b..6ea4a7129 100644 --- a/core/startos/src/install/mod.rs +++ b/core/startos/src/install/mod.rs @@ -1,4 +1,3 @@ -use std::io::SeekFrom; use std::path::PathBuf; use std::time::Duration; @@ -14,7 +13,6 @@ use rpc_toolkit::yajrc::RpcError; use rpc_toolkit::CallRemote; use serde::{Deserialize, Serialize}; use serde_json::{json, Value}; -use tokio::io::{AsyncReadExt, AsyncSeekExt}; use tokio::sync::oneshot; use tracing::instrument; @@ -28,8 +26,6 @@ use crate::prelude::*; use crate::progress::{FullProgress, PhasedProgressBar}; use crate::s9pk::manifest::PackageId; use crate::s9pk::merkle_archive::source::http::HttpSource; -use crate::s9pk::v1::reader::S9pkReader; -use crate::s9pk::v2::compat::{self, MAGIC_AND_VERSION}; use crate::s9pk::S9pk; use crate::upload::upload; use crate::util::clap::FromStrParser; diff --git a/core/startos/src/logs.rs b/core/startos/src/logs.rs index 0b7ef3c67..0431274ac 100644 --- a/core/startos/src/logs.rs +++ b/core/startos/src/logs.rs @@ -7,7 +7,7 @@ use chrono::{DateTime, Utc}; use clap::Parser; use color_eyre::eyre::eyre; use futures::stream::BoxStream; -use futures::{FutureExt, SinkExt, Stream, StreamExt, TryStreamExt}; +use futures::{FutureExt, Stream, StreamExt, TryStreamExt}; use models::PackageId; use rpc_toolkit::yajrc::RpcError; use rpc_toolkit::{command, from_fn_async, CallRemote, Empty, HandlerExt, ParentHandler}; diff --git a/core/startos/src/lxc/mod.rs b/core/startos/src/lxc/mod.rs index 136a8423b..374952f98 100644 --- a/core/startos/src/lxc/mod.rs +++ b/core/startos/src/lxc/mod.rs @@ -1,4 +1,5 @@ use std::collections::BTreeSet; +use std::net::Ipv4Addr; use std::ops::Deref; use std::path::Path; use std::sync::{Arc, Weak}; @@ -109,6 +110,7 @@ impl LxcManager { pub struct LxcContainer { manager: Weak, rootfs: OverlayGuard, + ip: Ipv4Addr, guid: Arc, rpc_bind: TmpMountGuard, config: LxcConfig, @@ -169,9 +171,20 @@ impl LxcContainer { .arg(&*guid) .invoke(ErrorKind::Lxc) .await?; + let ip = String::from_utf8( + Command::new("lxc-info") + .arg("--name") + .arg(&*guid) + .arg("-iH") + .invoke(ErrorKind::Docker) + .await?, + )? + .trim() + .parse()?; Ok(Self { manager: Arc::downgrade(manager), rootfs, + ip, guid: Arc::new(guid), rpc_bind, config, @@ -183,6 +196,10 @@ impl LxcContainer { self.rootfs.path() } + pub fn ip(&self) -> Ipv4Addr { + self.ip + } + pub fn rpc_dir(&self) -> &Path { self.rpc_bind.path() } diff --git a/core/startos/src/middleware/auth.rs b/core/startos/src/middleware/auth.rs index 9260d7fa2..2eddcd3ad 100644 --- a/core/startos/src/middleware/auth.rs +++ b/core/startos/src/middleware/auth.rs @@ -1,14 +1,17 @@ use std::borrow::Borrow; +use std::collections::BTreeSet; +use std::ops::Deref; use std::sync::Arc; use std::time::{Duration, Instant}; use axum::extract::Request; use axum::response::Response; use basic_cookies::Cookie; +use chrono::Utc; use color_eyre::eyre::eyre; use digest::Digest; use helpers::const_true; -use http::header::COOKIE; +use http::header::{COOKIE, USER_AGENT}; use http::HeaderValue; use imbl_value::InternedString; use rpc_toolkit::yajrc::INTERNAL_ERROR; @@ -38,24 +41,36 @@ pub struct HasLoggedOutSessions(()); impl HasLoggedOutSessions { pub async fn new( - logged_out_sessions: impl IntoIterator, + sessions: impl IntoIterator, ctx: &RpcContext, ) -> Result { - let mut open_authed_websockets = ctx.open_authed_websockets.lock().await; - let mut sqlx_conn = ctx.secret_store.acquire().await?; - for session in logged_out_sessions { - let session = session.as_logout_session_id(); - let session = &*session; - sqlx::query!( - "UPDATE session SET logged_out = CURRENT_TIMESTAMP WHERE id = $1", - session - ) - .execute(sqlx_conn.as_mut()) + let to_log_out: BTreeSet<_> = sessions + .into_iter() + .map(|s| s.as_logout_session_id()) + .collect(); + ctx.open_authed_websockets + .lock() + .await + .retain(|session, sockets| { + if to_log_out.contains(session.hashed()) { + for socket in std::mem::take(sockets) { + let _ = socket.send(()); + } + false + } else { + true + } + }); + ctx.db + .mutate(|db| { + let sessions = db.as_private_mut().as_sessions_mut(); + for sid in &to_log_out { + sessions.remove(sid)?; + } + + Ok(()) + }) .await?; - for socket in open_authed_websockets.remove(session).unwrap_or_default() { - let _ = socket.send(()); - } - } Ok(HasLoggedOutSessions(())) } } @@ -105,15 +120,20 @@ impl HasValidSession { ctx: &RpcContext, ) -> Result { let session_hash = session_token.hashed(); - let session = sqlx::query!("UPDATE session SET last_active = CURRENT_TIMESTAMP WHERE id = $1 AND logged_out IS NULL OR logged_out > CURRENT_TIMESTAMP", session_hash) - .execute(ctx.secret_store.acquire().await?.as_mut()) + ctx.db + .mutate(|db| { + db.as_private_mut() + .as_sessions_mut() + .as_idx_mut(session_hash) + .ok_or_else(|| { + Error::new(eyre!("UNAUTHORIZED"), crate::ErrorKind::Authorization) + })? + .mutate(|s| { + s.last_active = Utc::now(); + Ok(()) + }) + }) .await?; - if session.rows_affected() == 0 { - return Err(Error::new( - eyre!("UNAUTHORIZED"), - crate::ErrorKind::Authorization, - )); - } Ok(Self(SessionType::Session(session_token))) } @@ -181,8 +201,8 @@ impl HashSessionToken { } } - pub fn hashed(&self) -> &str { - &*self.hashed + pub fn hashed(&self) -> &InternedString { + &self.hashed } fn hash(token: &str) -> InternedString { @@ -241,6 +261,7 @@ pub struct Auth { cookie: Option, is_login: bool, set_cookie: Option, + user_agent: Option, } impl Auth { pub fn new() -> Self { @@ -249,6 +270,7 @@ impl Auth { cookie: None, is_login: false, set_cookie: None, + user_agent: None, } } } @@ -260,7 +282,8 @@ impl Middleware for Auth { _: &RpcContext, request: &mut Request, ) -> Result<(), Response> { - self.cookie = request.headers_mut().get(COOKIE).cloned(); + self.cookie = request.headers_mut().remove(COOKIE); + self.user_agent = request.headers_mut().remove(USER_AGENT); Ok(()) } async fn process_rpc_request( @@ -282,6 +305,10 @@ impl Middleware for Auth { .into()), }); } + if let Some(user_agent) = self.user_agent.as_ref().and_then(|h| h.to_str().ok()) { + request.params["user-agent"] = Value::String(Arc::new(user_agent.to_owned())) + // TODO: will this panic? + } } else if metadata.authenticated { match HasValidSession::from_header(self.cookie.as_ref(), &context).await { Err(e) => { @@ -291,7 +318,8 @@ impl Middleware for Auth { }) } Ok(HasValidSession(SessionType::Session(s))) if metadata.get_session => { - request.params["session"] = Value::String(Arc::new(s.hashed().into())); + request.params["session"] = + Value::String(Arc::new(s.hashed().deref().to_owned())); // TODO: will this panic? } _ => (), diff --git a/core/startos/src/net/dns.rs b/core/startos/src/net/dns.rs index 9eb5d3750..ba69b6c16 100644 --- a/core/startos/src/net/dns.rs +++ b/core/startos/src/net/dns.rs @@ -18,6 +18,7 @@ use trust_dns_server::proto::rr::{Name, Record, RecordType}; use trust_dns_server::server::{Request, RequestHandler, ResponseHandler, ResponseInfo}; use trust_dns_server::ServerFuture; +use crate::net::forward::START9_BRIDGE_IFACE; use crate::util::Invoke; use crate::{Error, ErrorKind, ResultExt}; @@ -163,13 +164,13 @@ impl DnsController { Command::new("resolvectl") .arg("dns") - .arg("lxcbr0") + .arg(START9_BRIDGE_IFACE) .arg("127.0.0.1") .invoke(ErrorKind::Network) .await?; Command::new("resolvectl") .arg("domain") - .arg("lxcbr0") + .arg(START9_BRIDGE_IFACE) .arg("embassy") .invoke(ErrorKind::Network) .await?; diff --git a/core/startos/src/net/forward.rs b/core/startos/src/net/forward.rs new file mode 100644 index 000000000..e954bc36a --- /dev/null +++ b/core/startos/src/net/forward.rs @@ -0,0 +1,177 @@ +use std::collections::BTreeMap; +use std::net::SocketAddr; +use std::sync::{Arc, Weak}; + +use id_pool::IdPool; +use serde::{Deserialize, Serialize}; +use tokio::process::Command; +use tokio::sync::Mutex; + +use crate::prelude::*; +use crate::util::Invoke; + +pub const START9_BRIDGE_IFACE: &str = "lxcbr0"; +pub const FIRST_DYNAMIC_PRIVATE_PORT: u16 = 49152; + +#[derive(Debug, Deserialize, Serialize)] +pub struct AvailablePorts(IdPool); +impl AvailablePorts { + pub fn new() -> Self { + Self(IdPool::new_ranged(FIRST_DYNAMIC_PRIVATE_PORT..u16::MAX)) + } + pub fn alloc(&mut self) -> Result { + self.0.request_id().ok_or_else(|| { + Error::new( + eyre!("No more dynamic ports available!"), + ErrorKind::Network, + ) + }) + } + pub fn free(&mut self, ports: impl IntoIterator) { + for port in ports { + self.0.return_id(port).unwrap_or_default(); + } + } +} + +pub struct LanPortForwardController { + forwards: Mutex>>>, +} +impl LanPortForwardController { + pub fn new() -> Self { + Self { + forwards: Mutex::new(BTreeMap::new()), + } + } + pub async fn add(&self, port: u16, addr: SocketAddr) -> Result, Error> { + let mut writable = self.forwards.lock().await; + let (prev, mut forward) = if let Some(forward) = writable.remove(&port) { + ( + forward.keys().next().cloned(), + forward + .into_iter() + .filter(|(_, rc)| rc.strong_count() > 0) + .collect(), + ) + } else { + (None, BTreeMap::new()) + }; + let rc = Arc::new(()); + forward.insert(addr, Arc::downgrade(&rc)); + let next = forward.keys().next().cloned(); + if !forward.is_empty() { + writable.insert(port, forward); + } + + update_forward(port, prev, next).await?; + Ok(rc) + } + pub async fn gc(&self, external: u16) -> Result<(), Error> { + let mut writable = self.forwards.lock().await; + let (prev, forward) = if let Some(forward) = writable.remove(&external) { + ( + forward.keys().next().cloned(), + forward + .into_iter() + .filter(|(_, rc)| rc.strong_count() > 0) + .collect(), + ) + } else { + (None, BTreeMap::new()) + }; + let next = forward.keys().next().cloned(); + if !forward.is_empty() { + writable.insert(external, forward); + } + + update_forward(external, prev, next).await + } +} + +async fn update_forward( + external: u16, + prev: Option, + next: Option, +) -> Result<(), Error> { + if prev != next { + if let Some(prev) = prev { + unforward(START9_BRIDGE_IFACE, external, prev).await?; + } + if let Some(next) = next { + forward(START9_BRIDGE_IFACE, external, next).await?; + } + } + Ok(()) +} + +// iptables -I FORWARD -o br-start9 -p tcp -d 172.18.0.2 --dport 8333 -j ACCEPT +// iptables -t nat -I PREROUTING -p tcp --dport 32768 -j DNAT --to 172.18.0.2:8333 +async fn forward(iface: &str, external: u16, addr: SocketAddr) -> Result<(), Error> { + Command::new("iptables") + .arg("-I") + .arg("FORWARD") + .arg("-o") + .arg(iface) + .arg("-p") + .arg("tcp") + .arg("-d") + .arg(addr.ip().to_string()) + .arg("--dport") + .arg(addr.port().to_string()) + .arg("-j") + .arg("ACCEPT") + .invoke(crate::ErrorKind::Network) + .await?; + Command::new("iptables") + .arg("-t") + .arg("nat") + .arg("-I") + .arg("PREROUTING") + .arg("-p") + .arg("tcp") + .arg("--dport") + .arg(external.to_string()) + .arg("-j") + .arg("DNAT") + .arg("--to") + .arg(addr.to_string()) + .invoke(crate::ErrorKind::Network) + .await?; + Ok(()) +} + +// iptables -D FORWARD -o br-start9 -p tcp -d 172.18.0.2 --dport 8333 -j ACCEPT +// iptables -t nat -D PREROUTING -p tcp --dport 32768 -j DNAT --to 172.18.0.2:8333 +async fn unforward(iface: &str, external: u16, addr: SocketAddr) -> Result<(), Error> { + Command::new("iptables") + .arg("-D") + .arg("FORWARD") + .arg("-o") + .arg(iface) + .arg("-p") + .arg("tcp") + .arg("-d") + .arg(addr.ip().to_string()) + .arg("--dport") + .arg(addr.port().to_string()) + .arg("-j") + .arg("ACCEPT") + .invoke(crate::ErrorKind::Network) + .await?; + Command::new("iptables") + .arg("-t") + .arg("nat") + .arg("-D") + .arg("PREROUTING") + .arg("-p") + .arg("tcp") + .arg("--dport") + .arg(external.to_string()) + .arg("-j") + .arg("DNAT") + .arg("--to") + .arg(addr.to_string()) + .invoke(crate::ErrorKind::Network) + .await?; + Ok(()) +} diff --git a/core/startos/src/net/host/address.rs b/core/startos/src/net/host/address.rs new file mode 100644 index 000000000..6f3ff6df2 --- /dev/null +++ b/core/startos/src/net/host/address.rs @@ -0,0 +1,9 @@ +use serde::{Deserialize, Serialize}; +use torut::onion::OnionAddressV3; + +#[derive(Debug, Deserialize, Serialize, PartialEq, Eq, PartialOrd, Ord)] +#[serde(rename_all = "camelCase")] +#[serde(tag = "kind")] +pub enum HostAddress { + Onion { address: OnionAddressV3 }, +} diff --git a/core/startos/src/net/host/binding.rs b/core/startos/src/net/host/binding.rs new file mode 100644 index 000000000..0584b517b --- /dev/null +++ b/core/startos/src/net/host/binding.rs @@ -0,0 +1,71 @@ +use imbl_value::InternedString; +use serde::{Deserialize, Serialize}; + +use crate::net::forward::AvailablePorts; +use crate::net::vhost::AlpnInfo; +use crate::prelude::*; + +#[derive(Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct BindInfo { + pub options: BindOptions, + pub assigned_lan_port: Option, +} +impl BindInfo { + pub fn new(available_ports: &mut AvailablePorts, options: BindOptions) -> Result { + let mut assigned_lan_port = None; + if options.add_ssl.is_some() || options.secure { + assigned_lan_port = Some(available_ports.alloc()?); + } + Ok(Self { + options, + assigned_lan_port, + }) + } + pub fn update( + self, + available_ports: &mut AvailablePorts, + options: BindOptions, + ) -> Result { + let Self { + mut assigned_lan_port, + .. + } = self; + if options.add_ssl.is_some() || options.secure { + assigned_lan_port = if let Some(port) = assigned_lan_port.take() { + Some(port) + } else { + Some(available_ports.alloc()?) + }; + } else { + if let Some(port) = assigned_lan_port.take() { + available_ports.free([port]); + } + } + Ok(Self { + options, + assigned_lan_port, + }) + } +} + +#[derive(Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct BindOptions { + pub scheme: InternedString, + pub preferred_external_port: u16, + pub add_ssl: Option, + pub secure: bool, + pub ssl: bool, +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct AddSslOptions { + pub scheme: InternedString, + pub preferred_external_port: u16, + // #[serde(default)] + // pub add_x_forwarded_headers: bool, // TODO + #[serde(default)] + pub alpn: AlpnInfo, +} diff --git a/core/startos/src/net/host/mod.rs b/core/startos/src/net/host/mod.rs index b2b991698..18b86ba0e 100644 --- a/core/startos/src/net/host/mod.rs +++ b/core/startos/src/net/host/mod.rs @@ -1,29 +1,84 @@ +use std::collections::{BTreeMap, BTreeSet}; + use imbl_value::InternedString; +use models::HostId; use serde::{Deserialize, Serialize}; -use crate::net::host::multi::MultiHost; +use crate::net::forward::AvailablePorts; +use crate::net::host::address::HostAddress; +use crate::net::host::binding::{BindInfo, BindOptions}; +use crate::prelude::*; + +pub mod address; +pub mod binding; -pub mod multi; +#[derive(Debug, Deserialize, Serialize, HasModel)] +#[serde(rename_all = "camelCase")] +#[model = "Model"] +pub struct Host { + pub kind: HostKind, + pub bindings: BTreeMap, + pub addresses: BTreeSet, + pub primary: Option, +} +impl AsRef for Host { + fn as_ref(&self) -> &Host { + self + } +} +impl Host { + pub fn new(kind: HostKind) -> Self { + Self { + kind, + bindings: BTreeMap::new(), + addresses: BTreeSet::new(), + primary: None, + } + } +} -pub enum Host { - Multi(MultiHost), - // Single(SingleHost), - // Static(StaticHost), +#[derive(Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub enum HostKind { + Multi, + // Single, + // Static, } -#[derive(Deserialize, Serialize)] -pub struct BindOptions { - scheme: InternedString, - preferred_external_port: u16, - add_ssl: Option, - secure: bool, - ssl: bool, +#[derive(Debug, Default, Deserialize, Serialize, HasModel)] +#[model = "Model"] +pub struct HostInfo(BTreeMap); + +impl Map for HostInfo { + type Key = HostId; + type Value = Host; + fn key_str(key: &Self::Key) -> Result, Error> { + Ok(key) + } + fn key_string(key: &Self::Key) -> Result { + Ok(key.clone().into()) + } } -#[derive(Deserialize, Serialize)] -pub struct AddSslOptions { - scheme: InternedString, - preferred_external_port: u16, - #[serde(default)] - add_x_forwarded_headers: bool, +impl Model { + pub fn add_binding( + &mut self, + available_ports: &mut AvailablePorts, + kind: HostKind, + id: &HostId, + internal_port: u16, + options: BindOptions, + ) -> Result<(), Error> { + self.upsert(id, || Host::new(kind))? + .as_bindings_mut() + .mutate(|b| { + let info = if let Some(info) = b.remove(&internal_port) { + info.update(available_ports, options)? + } else { + BindInfo::new(available_ports, options)? + }; + b.insert(internal_port, info); + Ok(()) + }) // TODO: handle host kind change + } } diff --git a/core/startos/src/net/host/multi.rs b/core/startos/src/net/host/multi.rs deleted file mode 100644 index 511619201..000000000 --- a/core/startos/src/net/host/multi.rs +++ /dev/null @@ -1,13 +0,0 @@ -use std::collections::BTreeMap; - -use imbl_value::InternedString; -use serde::{Deserialize, Serialize}; - -use crate::net::host::BindOptions; -use crate::net::keys::Key; - -pub struct MultiHost { - id: InternedString, - key: Key, - binds: BTreeMap, -} diff --git a/core/startos/src/net/keys.rs b/core/startos/src/net/keys.rs index 1079d4a98..02ec17329 100644 --- a/core/startos/src/net/keys.rs +++ b/core/startos/src/net/keys.rs @@ -1,393 +1,24 @@ -use clap::Parser; -use color_eyre::eyre::eyre; -use models::{HostId, Id, PackageId}; -use openssl::pkey::{PKey, Private}; -use openssl::sha::Sha256; -use openssl::x509::X509; -use p256::elliptic_curve::pkcs8::EncodePrivateKey; use serde::{Deserialize, Serialize}; -use sqlx::{Acquire, PgExecutor}; -use ssh_key::private::Ed25519PrivateKey; -use torut::onion::{OnionAddressV3, TorSecretKeyV3}; -use zeroize::Zeroize; -use crate::config::ConfigureContext; -use crate::context::RpcContext; -use crate::control::{restart, ControlParams}; -use crate::disk::fsck::RequiresReboot; -use crate::net::ssl::CertPair; +use crate::account::AccountInfo; +use crate::net::ssl::CertStore; +use crate::net::tor::OnionStore; use crate::prelude::*; -use crate::util::crypto::ed25519_expand_key; -// TODO: delete once we may change tor addresses -async fn compat( - secrets: impl PgExecutor<'_>, - host: &Option<(PackageId, HostId)>, -) -> Result, Error> { - if let Some((package, host)) = host { - if let Some(r) = sqlx::query!( - "SELECT key FROM tor WHERE package = $1 AND interface = $2", - package, - host - ) - .fetch_optional(secrets) - .await? - { - Ok(Some(<[u8; 64]>::try_from(r.key).map_err(|e| { - Error::new( - eyre!("expected vec of len 64, got len {}", e.len()), - ErrorKind::ParseDbField, - ) - })?)) - } else { - Ok(None) - } - } else if let Some(key) = sqlx::query!("SELECT tor_key FROM account WHERE id = 0") - .fetch_one(secrets) - .await? - .tor_key - { - Ok(Some(<[u8; 64]>::try_from(key).map_err(|e| { - Error::new( - eyre!("expected vec of len 64, got len {}", e.len()), - ErrorKind::ParseDbField, - ) - })?)) - } else { - Ok(None) - } -} - -#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct Key { - host: Option<(PackageId, HostId)>, - base: [u8; 32], - tor_key: [u8; 64], // Does NOT necessarily match base -} -impl Key { - pub fn host(&self) -> Option<(PackageId, HostId)> { - self.host.clone() - } - pub fn as_bytes(&self) -> [u8; 32] { - self.base - } - pub fn internal_address(&self) -> String { - self.host - .as_ref() - .map(|(pkg_id, _)| format!("{}.embassy", pkg_id)) - .unwrap_or_else(|| "embassy".to_owned()) - } - pub fn tor_key(&self) -> TorSecretKeyV3 { - self.tor_key.into() - } - pub fn tor_address(&self) -> OnionAddressV3 { - self.tor_key().public().get_onion_address() - } - pub fn base_address(&self) -> String { - self.tor_key() - .public() - .get_onion_address() - .get_address_without_dot_onion() - } - pub fn local_address(&self) -> String { - self.base_address() + ".local" - } - pub fn openssl_key_ed25519(&self) -> PKey { - PKey::private_key_from_raw_bytes(&self.base, openssl::pkey::Id::ED25519).unwrap() - } - pub fn openssl_key_nistp256(&self) -> PKey { - let mut buf = self.base; - loop { - if let Ok(k) = p256::SecretKey::from_slice(&buf) { - return PKey::private_key_from_pkcs8(&*k.to_pkcs8_der().unwrap().as_bytes()) - .unwrap(); - } - let mut sha = Sha256::new(); - sha.update(&buf); - buf = sha.finish(); - } - } - pub fn ssh_key(&self) -> Ed25519PrivateKey { - Ed25519PrivateKey::from_bytes(&self.base) - } - pub(crate) fn from_pair( - host: Option<(PackageId, HostId)>, - bytes: [u8; 32], - tor_key: [u8; 64], - ) -> Self { - Self { - host, - tor_key, - base: bytes, - } - } - pub fn from_bytes(host: Option<(PackageId, HostId)>, bytes: [u8; 32]) -> Self { - Self::from_pair(host, bytes, ed25519_expand_key(&bytes)) - } - pub fn new(host: Option<(PackageId, HostId)>) -> Self { - Self::from_bytes(host, rand::random()) - } - pub(super) fn with_certs(self, certs: CertPair, int: X509, root: X509) -> KeyInfo { - KeyInfo { - key: self, - certs, - int, - root, - } - } - pub async fn for_package( - secrets: impl PgExecutor<'_>, - package: &PackageId, - ) -> Result, Error> { - sqlx::query!( - r#" - SELECT - network_keys.package, - network_keys.interface, - network_keys.key, - tor.key AS "tor_key?" - FROM - network_keys - LEFT JOIN - tor - ON - network_keys.package = tor.package - AND - network_keys.interface = tor.interface - WHERE - network_keys.package = $1 - "#, - package - ) - .fetch_all(secrets) - .await? - .into_iter() - .map(|row| { - let host = Some((package.clone(), HostId::from(Id::try_from(row.interface)?))); - let bytes = row.key.try_into().map_err(|e: Vec| { - Error::new( - eyre!("Invalid length for network key {} expected 32", e.len()), - crate::ErrorKind::Database, - ) - })?; - Ok(match row.tor_key { - Some(tor_key) => Key::from_pair( - host, - bytes, - tor_key.try_into().map_err(|e: Vec| { - Error::new( - eyre!("Invalid length for tor key {} expected 64", e.len()), - crate::ErrorKind::Database, - ) - })?, - ), - None => Key::from_bytes(host, bytes), - }) - }) - .collect() - } - pub async fn for_host( - secrets: &mut Ex, - host: Option<(PackageId, HostId)>, - ) -> Result - where - for<'a> &'a mut Ex: PgExecutor<'a>, - { - let tentative = rand::random::<[u8; 32]>(); - let actual = if let Some((pkg, iface)) = &host { - let k = tentative.as_slice(); - let actual = sqlx::query!( - "INSERT INTO network_keys (package, interface, key) VALUES ($1, $2, $3) ON CONFLICT (package, interface) DO UPDATE SET package = EXCLUDED.package RETURNING key", - pkg, - iface, - k, - ) - .fetch_one(&mut *secrets) - .await?.key; - let mut bytes = tentative; - bytes.clone_from_slice(actual.get(0..32).ok_or_else(|| { - Error::new( - eyre!("Invalid key size returned from DB"), - crate::ErrorKind::Database, - ) - })?); - bytes - } else { - let actual = sqlx::query!("SELECT network_key FROM account WHERE id = 0") - .fetch_one(&mut *secrets) - .await? - .network_key; - let mut bytes = tentative; - bytes.clone_from_slice(actual.get(0..32).ok_or_else(|| { - Error::new( - eyre!("Invalid key size returned from DB"), - crate::ErrorKind::Database, - ) - })?); - bytes +#[derive(Debug, Deserialize, Serialize, HasModel)] +#[model = "Model"] +pub struct KeyStore { + pub onion: OnionStore, + pub local_certs: CertStore, + // pub letsencrypt_certs: BTreeMap, CertData> +} +impl KeyStore { + pub fn new(account: &AccountInfo) -> Result { + let mut res = Self { + onion: OnionStore::new(), + local_certs: CertStore::new(account)?, }; - let mut res = Self::from_bytes(host, actual); - if let Some(tor_key) = compat(secrets, &res.host).await? { - res.tor_key = tor_key; - } + res.onion.insert(account.tor_key.clone()); Ok(res) } } -impl Drop for Key { - fn drop(&mut self) { - self.base.zeroize(); - self.tor_key.zeroize(); - } -} - -#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] -pub struct KeyInfo { - key: Key, - certs: CertPair, - int: X509, - root: X509, -} -impl KeyInfo { - pub fn key(&self) -> &Key { - &self.key - } - pub fn certs(&self) -> &CertPair { - &self.certs - } - pub fn int_ca(&self) -> &X509 { - &self.int - } - pub fn root_ca(&self) -> &X509 { - &self.root - } - pub fn fullchain_ed25519(&self) -> Vec<&X509> { - vec![&self.certs.ed25519, &self.int, &self.root] - } - pub fn fullchain_nistp256(&self) -> Vec<&X509> { - vec![&self.certs.nistp256, &self.int, &self.root] - } -} - -#[test] -pub fn test_keygen() { - let key = Key::new(None); - key.tor_key(); - key.openssl_key_nistp256(); -} - -pub fn display_requires_reboot(_: RotateKeysParams, args: RequiresReboot) { - if args.0 { - println!("Server must be restarted for changes to take effect"); - } -} -#[derive(Deserialize, Serialize, Parser)] -#[serde(rename_all = "kebab-case")] -#[command(rename_all = "kebab-case")] -pub struct RotateKeysParams { - package: Option, - host: Option, -} - -// #[command(display(display_requires_reboot))] -pub async fn rotate_key( - ctx: RpcContext, - RotateKeysParams { package, host }: RotateKeysParams, -) -> Result { - let mut pgcon = ctx.secret_store.acquire().await?; - let mut tx = pgcon.begin().await?; - if let Some(package) = package { - let Some(host) = host else { - return Err(Error::new( - eyre!("Must specify host"), - ErrorKind::InvalidRequest, - )); - }; - sqlx::query!( - "DELETE FROM tor WHERE package = $1 AND interface = $2", - &package, - &host, - ) - .execute(&mut *tx) - .await?; - sqlx::query!( - "DELETE FROM network_keys WHERE package = $1 AND interface = $2", - &package, - &host, - ) - .execute(&mut *tx) - .await?; - let new_key = Key::for_host(&mut *tx, Some((package.clone(), host.clone()))).await?; - let needs_config = ctx - .db - .mutate(|v| { - let installed = v - .as_public_mut() - .as_package_data_mut() - .as_idx_mut(&package) - .or_not_found(&package)? - .as_installed_mut() - .or_not_found("installed")?; - let addrs = installed - .as_interface_addresses_mut() - .as_idx_mut(&host) - .or_not_found(&host)?; - if let Some(lan) = addrs.as_lan_address_mut().transpose_mut() { - lan.ser(&new_key.local_address())?; - } - if let Some(lan) = addrs.as_tor_address_mut().transpose_mut() { - lan.ser(&new_key.tor_address().to_string())?; - } - - // TODO - // if installed - // .as_manifest() - // .as_config() - // .transpose_ref() - // .is_some() - // { - // installed - // .as_status_mut() - // .as_configured_mut() - // .replace(&false) - // } else { - // Ok(false) - // } - Ok(false) - }) - .await?; - tx.commit().await?; - if needs_config { - ctx.services - .get(&package) - .await - .as_ref() - .ok_or_else(|| { - Error::new( - eyre!("There is no manager running for {package}"), - ErrorKind::Unknown, - ) - })? - .configure(ConfigureContext::default()) - .await?; - } else { - restart(ctx, ControlParams { id: package }).await?; - } - Ok(RequiresReboot(false)) - } else { - sqlx::query!("UPDATE account SET tor_key = NULL, network_key = gen_random_bytes(32)") - .execute(&mut *tx) - .await?; - let new_key = Key::for_host(&mut *tx, None).await?; - let url = format!("https://{}", new_key.tor_address()).parse()?; - ctx.db - .mutate(|v| { - v.as_public_mut() - .as_server_info_mut() - .as_tor_address_mut() - .ser(&url) - }) - .await?; - tx.commit().await?; - Ok(RequiresReboot(true)) - } -} diff --git a/core/startos/src/net/mdns.rs b/core/startos/src/net/mdns.rs index ee2e0fa41..af5d128a8 100644 --- a/core/startos/src/net/mdns.rs +++ b/core/startos/src/net/mdns.rs @@ -1,14 +1,10 @@ -use std::collections::BTreeMap; use std::net::Ipv4Addr; -use std::sync::{Arc, Weak}; use color_eyre::eyre::eyre; -use tokio::process::{Child, Command}; -use tokio::sync::Mutex; -use tracing::instrument; +use tokio::process::Command; +use crate::prelude::*; use crate::util::Invoke; -use crate::{Error, ResultExt}; pub async fn resolve_mdns(hostname: &str) -> Result { Ok(String::from_utf8( diff --git a/core/startos/src/net/mod.rs b/core/startos/src/net/mod.rs index a0a2ed166..f6e5ddee5 100644 --- a/core/startos/src/net/mod.rs +++ b/core/startos/src/net/mod.rs @@ -1,9 +1,8 @@ -use rpc_toolkit::{from_fn_async, AnyContext, HandlerExt, ParentHandler}; - -use crate::context::CliContext; +use rpc_toolkit::ParentHandler; pub mod dhcp; pub mod dns; +pub mod forward; pub mod host; pub mod keys; pub mod mdns; @@ -22,13 +21,4 @@ pub fn net() -> ParentHandler { ParentHandler::new() .subcommand("tor", tor::tor()) .subcommand("dhcp", dhcp::dhcp()) - .subcommand("ssl", ssl::ssl()) - .subcommand( - "rotate-key", - from_fn_async(keys::rotate_key) - .with_custom_display_fn::(|handle, result| { - Ok(keys::display_requires_reboot(handle.params, result)) - }) - .with_remote_cli::(), - ) } diff --git a/core/startos/src/net/net_controller.rs b/core/startos/src/net/net_controller.rs index 9b9145531..d9d7a5d76 100644 --- a/core/startos/src/net/net_controller.rs +++ b/core/startos/src/net/net_controller.rs @@ -1,59 +1,72 @@ -use std::collections::BTreeMap; -use std::net::{IpAddr, Ipv4Addr, SocketAddr}; +use std::collections::{BTreeMap, BTreeSet}; +use std::net::{Ipv4Addr, SocketAddr}; use std::sync::{Arc, Weak}; use color_eyre::eyre::eyre; -use models::{HostId, PackageId}; -use sqlx::PgExecutor; +use imbl::OrdMap; +use lazy_format::lazy_format; +use models::{HostId, OptionExt, PackageId}; +use patch_db::PatchDb; +use torut::onion::{OnionAddressV3, TorSecretKeyV3}; use tracing::instrument; +use crate::db::prelude::PatchDbExt; use crate::error::ErrorCollection; use crate::hostname::Hostname; use crate::net::dns::DnsController; -use crate::net::keys::Key; -use crate::net::ssl::{export_cert, export_key, SslManager}; +use crate::net::forward::LanPortForwardController; +use crate::net::host::address::HostAddress; +use crate::net::host::binding::{AddSslOptions, BindOptions}; +use crate::net::host::{Host, HostKind}; use crate::net::tor::TorController; use crate::net::vhost::{AlpnInfo, VHostController}; -use crate::volume::cert_dir; +use crate::util::serde::MaybeUtf8String; use crate::{Error, HOST_IP}; pub struct NetController { + db: PatchDb, pub(super) tor: TorController, pub(super) vhost: VHostController, pub(super) dns: DnsController, - pub(super) ssl: Arc, + pub(super) forward: LanPortForwardController, pub(super) os_bindings: Vec>, } impl NetController { #[instrument(skip_all)] pub async fn init( + db: PatchDb, tor_control: SocketAddr, tor_socks: SocketAddr, dns_bind: &[SocketAddr], - ssl: SslManager, hostname: &Hostname, - os_key: &Key, + os_tor_key: TorSecretKeyV3, ) -> Result { - let ssl = Arc::new(ssl); let mut res = Self { + db: db.clone(), tor: TorController::new(tor_control, tor_socks), - vhost: VHostController::new(ssl.clone()), + vhost: VHostController::new(db), dns: DnsController::init(dns_bind).await?, - ssl, + forward: LanPortForwardController::new(), os_bindings: Vec::new(), }; - res.add_os_bindings(hostname, os_key).await?; + res.add_os_bindings(hostname, os_tor_key).await?; Ok(res) } - async fn add_os_bindings(&mut self, hostname: &Hostname, key: &Key) -> Result<(), Error> { - let alpn = Err(AlpnInfo::Specified(vec!["http/1.1".into(), "h2".into()])); + async fn add_os_bindings( + &mut self, + hostname: &Hostname, + tor_key: TorSecretKeyV3, + ) -> Result<(), Error> { + let alpn = Err(AlpnInfo::Specified(vec![ + MaybeUtf8String("http/1.1".into()), + MaybeUtf8String("h2".into()), + ])); // Internal DNS self.vhost .add( - key.clone(), Some("embassy".into()), 443, ([127, 0, 0, 1], 80).into(), @@ -66,13 +79,7 @@ impl NetController { // LAN IP self.os_bindings.push( self.vhost - .add( - key.clone(), - None, - 443, - ([127, 0, 0, 1], 80).into(), - alpn.clone(), - ) + .add(None, 443, ([127, 0, 0, 1], 80).into(), alpn.clone()) .await?, ); @@ -80,7 +87,6 @@ impl NetController { self.os_bindings.push( self.vhost .add( - key.clone(), Some("localhost".into()), 443, ([127, 0, 0, 1], 80).into(), @@ -91,7 +97,6 @@ impl NetController { self.os_bindings.push( self.vhost .add( - key.clone(), Some(hostname.no_dot_host_name()), 443, ([127, 0, 0, 1], 80).into(), @@ -104,7 +109,6 @@ impl NetController { self.os_bindings.push( self.vhost .add( - key.clone(), Some(hostname.local_domain_name()), 443, ([127, 0, 0, 1], 80).into(), @@ -113,28 +117,26 @@ impl NetController { .await?, ); - // Tor (http) - self.os_bindings.push( - self.tor - .add(key.tor_key(), 80, ([127, 0, 0, 1], 80).into()) - .await?, - ); - - // Tor (https) + // Tor self.os_bindings.push( self.vhost .add( - key.clone(), - Some(key.tor_address().to_string()), + Some(tor_key.public().get_onion_address().to_string()), 443, ([127, 0, 0, 1], 80).into(), alpn.clone(), ) .await?, ); - self.os_bindings.push( + self.os_bindings.extend( self.tor - .add(key.tor_key(), 443, ([127, 0, 0, 1], 443).into()) + .add( + tor_key, + vec![ + (80, ([127, 0, 0, 1], 80).into()), // http + (443, ([127, 0, 0, 1], 443).into()), // https + ], + ) .await?, ); @@ -155,57 +157,15 @@ impl NetController { ip, dns, controller: Arc::downgrade(self), - tor: BTreeMap::new(), - lan: BTreeMap::new(), + binds: BTreeMap::new(), }) } +} - async fn add_tor( - &self, - key: &Key, - external: u16, - target: SocketAddr, - ) -> Result>, Error> { - let mut rcs = Vec::with_capacity(1); - rcs.push(self.tor.add(key.tor_key(), external, target).await?); - Ok(rcs) - } - - async fn remove_tor(&self, key: &Key, external: u16, rcs: Vec>) -> Result<(), Error> { - drop(rcs); - self.tor.gc(Some(key.tor_key()), Some(external)).await - } - - async fn add_lan( - &self, - key: Key, - external: u16, - target: SocketAddr, - connect_ssl: Result<(), AlpnInfo>, - ) -> Result>, Error> { - let mut rcs = Vec::with_capacity(2); - rcs.push( - self.vhost - .add( - key.clone(), - Some(key.local_address()), - external, - target.into(), - connect_ssl, - ) - .await?, - ); - // rcs.push(self.mdns.add(key.base_address()).await?); - // TODO - Ok(rcs) - } - - async fn remove_lan(&self, key: &Key, external: u16, rcs: Vec>) -> Result<(), Error> { - drop(rcs); - // self.mdns.gc(key.base_address()).await?; - // TODO - self.vhost.gc(Some(key.local_address()), external).await - } +#[derive(Default)] +struct HostBinds { + lan: BTreeMap, Arc<()>)>, + tor: BTreeMap, Vec>)>, } pub struct NetService { @@ -214,8 +174,7 @@ pub struct NetService { ip: Ipv4Addr, dns: Arc<()>, controller: Weak, - tor: BTreeMap<(HostId, u16), (Key, Vec>)>, - lan: BTreeMap<(HostId, u16), (Key, Vec>)>, + binds: BTreeMap, } impl NetService { fn net_controller(&self) -> Result, Error> { @@ -226,111 +185,196 @@ impl NetService { ) }) } - pub async fn add_tor( + + pub async fn bind( &mut self, - secrets: &mut Ex, + kind: HostKind, id: HostId, - external: u16, - internal: u16, - ) -> Result<(), Error> - where - for<'a> &'a mut Ex: PgExecutor<'a>, - { - let key = Key::for_host(secrets, Some((self.id.clone(), id.clone()))).await?; - let ctrl = self.net_controller()?; - let tor_idx = (id, external); - let mut tor = self - .tor - .remove(&tor_idx) - .unwrap_or_else(|| (key.clone(), Vec::new())); - tor.1.append( - &mut ctrl - .add_tor(&key, external, SocketAddr::new(self.ip.into(), internal)) - .await?, - ); - self.tor.insert(tor_idx, tor); - Ok(()) + internal_port: u16, + options: BindOptions, + ) -> Result<(), Error> { + let id_ref = &id; + let pkg_id = &self.id; + let host = self + .net_controller()? + .db + .mutate(|d| { + let mut ports = d.as_private().as_available_ports().de()?; + let hosts = d + .as_public_mut() + .as_package_data_mut() + .as_idx_mut(pkg_id) + .or_not_found(pkg_id)? + .as_installed_mut() + .or_not_found(pkg_id)? + .as_hosts_mut(); + hosts.add_binding(&mut ports, kind, &id, internal_port, options)?; + let host = hosts + .as_idx(&id) + .or_not_found(lazy_format!("Host {id_ref} for {pkg_id}"))? + .de()?; + d.as_private_mut().as_available_ports_mut().ser(&ports)?; + Ok(host) + }) + .await?; + self.update(id, host).await } - pub async fn remove_tor(&mut self, id: HostId, external: u16) -> Result<(), Error> { + + async fn update(&mut self, id: HostId, host: Host) -> Result<(), Error> { let ctrl = self.net_controller()?; - if let Some((key, rcs)) = self.tor.remove(&(id, external)) { - ctrl.remove_tor(&key, external, rcs).await?; + let binds = { + if !self.binds.contains_key(&id) { + self.binds.insert(id.clone(), Default::default()); + } + self.binds.get_mut(&id).unwrap() + }; + if true + // TODO: if should listen lan + { + for (port, bind) in &host.bindings { + let old_lan_bind = binds.lan.remove(port); + let old_lan_port = old_lan_bind.as_ref().map(|(external, _, _)| *external); + let lan_bind = old_lan_bind.filter(|(external, ssl, _)| { + ssl == &bind.options.add_ssl + && bind.assigned_lan_port.as_ref() == Some(external) + }); // only keep existing binding if relevant details match + if let Some(external) = bind.assigned_lan_port { + let new_lan_bind = if let Some(b) = lan_bind { + b + } else { + if let Some(ssl) = &bind.options.add_ssl { + let rc = ctrl + .vhost + .add( + None, + external, + (self.ip, *port).into(), + if bind.options.ssl { + Ok(()) + } else { + Err(ssl.alpn.clone()) + }, + ) + .await?; + (*port, Some(ssl.clone()), rc) + } else { + let rc = ctrl.forward.add(external, (self.ip, *port).into()).await?; + (*port, None, rc) + } + }; + binds.lan.insert(*port, new_lan_bind); + } + if let Some(external) = old_lan_port { + ctrl.vhost.gc(None, external).await?; + ctrl.forward.gc(external).await?; + } + } + let mut removed = BTreeSet::new(); + let mut removed_ssl = BTreeSet::new(); + binds.lan.retain(|internal, (external, ssl, _)| { + if host.bindings.contains_key(internal) { + true + } else { + if ssl.is_some() { + removed_ssl.insert(*external); + } else { + removed.insert(*external); + } + false + } + }); + for external in removed { + ctrl.forward.gc(external).await?; + } + for external in removed_ssl { + ctrl.vhost.gc(None, external).await?; + } } - Ok(()) - } - pub async fn add_lan( - &mut self, - secrets: &mut Ex, - id: HostId, - external: u16, - internal: u16, - connect_ssl: Result<(), AlpnInfo>, - ) -> Result<(), Error> - where - for<'a> &'a mut Ex: PgExecutor<'a>, - { - let key = Key::for_host(secrets, Some((self.id.clone(), id.clone()))).await?; - let ctrl = self.net_controller()?; - let lan_idx = (id, external); - let mut lan = self - .lan - .remove(&lan_idx) - .unwrap_or_else(|| (key.clone(), Vec::new())); - lan.1.append( - &mut ctrl - .add_lan( - key, - external, - SocketAddr::new(self.ip.into(), internal), - connect_ssl, - ) - .await?, - ); - self.lan.insert(lan_idx, lan); - Ok(()) - } - pub async fn remove_lan(&mut self, id: HostId, external: u16) -> Result<(), Error> { - let ctrl = self.net_controller()?; - if let Some((key, rcs)) = self.lan.remove(&(id, external)) { - ctrl.remove_lan(&key, external, rcs).await?; + let tor_binds: OrdMap = host + .bindings + .iter() + .flat_map(|(internal, info)| { + let non_ssl = ( + info.options.preferred_external_port, + SocketAddr::from((self.ip, *internal)), + ); + if let (Some(ssl), Some(ssl_internal)) = + (&info.options.add_ssl, info.assigned_lan_port) + { + itertools::Either::Left( + [ + ( + ssl.preferred_external_port, + SocketAddr::from(([127, 0, 0, 1], ssl_internal)), + ), + non_ssl, + ] + .into_iter(), + ) + } else { + itertools::Either::Right([non_ssl].into_iter()) + } + }) + .collect(); + let mut keep_tor_addrs = BTreeSet::new(); + for addr in match host.kind { + HostKind::Multi => { + // itertools::Either::Left( + host.addresses.iter() + // ) + } // HostKind::Single | HostKind::Static => itertools::Either::Right(&host.primary), + } { + match addr { + HostAddress::Onion { address } => { + keep_tor_addrs.insert(address); + let old_tor_bind = binds.tor.remove(address); + let tor_bind = old_tor_bind.filter(|(ports, _)| ports == &tor_binds); + let new_tor_bind = if let Some(tor_bind) = tor_bind { + tor_bind + } else { + let key = ctrl + .db + .peek() + .await + .into_private() + .into_key_store() + .into_onion() + .get_key(address)?; + let rcs = ctrl + .tor + .add(key, tor_binds.clone().into_iter().collect()) + .await?; + (tor_binds.clone(), rcs) + }; + binds.tor.insert(address.clone(), new_tor_bind); + } + } + } + for addr in binds.tor.keys() { + if !keep_tor_addrs.contains(addr) { + ctrl.tor.gc(Some(addr.clone()), None).await?; + } } Ok(()) } - pub async fn export_cert( - &self, - secrets: &mut Ex, - id: &HostId, - ip: IpAddr, - ) -> Result<(), Error> - where - for<'a> &'a mut Ex: PgExecutor<'a>, - { - let key = Key::for_host(secrets, Some((self.id.clone(), id.clone()))).await?; - let ctrl = self.net_controller()?; - let cert = ctrl.ssl.with_certs(key, ip).await?; - let cert_dir = cert_dir(&self.id, id); - tokio::fs::create_dir_all(&cert_dir).await?; - export_key( - &cert.key().openssl_key_nistp256(), - &cert_dir.join(format!("{id}.key.pem")), - ) - .await?; - export_cert( - &cert.fullchain_nistp256(), - &cert_dir.join(format!("{id}.cert.pem")), - ) - .await?; // TODO: can upgrade to ed25519? - Ok(()) - } + pub async fn remove_all(mut self) -> Result<(), Error> { self.shutdown = true; let mut errors = ErrorCollection::new(); if let Some(ctrl) = Weak::upgrade(&self.controller) { - for ((_, external), (key, rcs)) in std::mem::take(&mut self.lan) { - errors.handle(ctrl.remove_lan(&key, external, rcs).await); - } - for ((_, external), (key, rcs)) in std::mem::take(&mut self.tor) { - errors.handle(ctrl.remove_tor(&key, external, rcs).await); + for (_, binds) in std::mem::take(&mut self.binds) { + for (_, (external, ssl, rc)) in binds.lan { + drop(rc); + if ssl.is_some() { + errors.handle(ctrl.vhost.gc(None, external).await); + } else { + errors.handle(ctrl.forward.gc(external).await); + } + } + for (addr, (_, rcs)) in binds.tor { + drop(rcs); + errors.handle(ctrl.tor.gc(Some(addr), None).await); + } } std::mem::take(&mut self.dns); errors.handle(ctrl.dns.gc(Some(self.id.clone()), self.ip).await); @@ -357,8 +401,7 @@ impl Drop for NetService { ip: Ipv4Addr::new(0, 0, 0, 0), dns: Default::default(), controller: Default::default(), - tor: Default::default(), - lan: Default::default(), + binds: BTreeMap::new(), }, ); tokio::spawn(async move { svc.remove_all().await.unwrap() }); diff --git a/core/startos/src/net/ssl.rs b/core/startos/src/net/ssl.rs index f9502c86b..44d7cf0da 100644 --- a/core/startos/src/net/ssl.rs +++ b/core/startos/src/net/ssl.rs @@ -5,6 +5,7 @@ use std::path::Path; use std::time::{SystemTime, UNIX_EPOCH}; use futures::FutureExt; +use imbl_value::InternedString; use libc::time_t; use openssl::asn1::{Asn1Integer, Asn1Time}; use openssl::bn::{BigNum, MsbOption}; @@ -14,17 +15,137 @@ use openssl::nid::Nid; use openssl::pkey::{PKey, Private}; use openssl::x509::{X509Builder, X509Extension, X509NameBuilder, X509}; use openssl::*; -use rpc_toolkit::{from_fn_async, HandlerExt, ParentHandler}; -use tokio::sync::{Mutex, RwLock}; +use patch_db::HasModel; +use serde::{Deserialize, Serialize}; +use tokio::sync::Mutex; use tracing::instrument; use crate::account::AccountInfo; -use crate::context::{CliContext, RpcContext}; use crate::hostname::Hostname; use crate::init::check_time_is_synchronized; -use crate::net::dhcp::ips; -use crate::net::keys::{Key, KeyInfo}; -use crate::{Error, ErrorKind, ResultExt, SOURCE_DATE}; +use crate::prelude::*; +use crate::util::serde::Pem; +use crate::SOURCE_DATE; + +#[derive(Debug, Deserialize, Serialize, HasModel)] +#[model = "Model"] +#[serde(rename_all = "kebab-case")] +pub struct CertStore { + pub root_key: Pem>, + pub root_cert: Pem, + pub int_key: Pem>, + pub int_cert: Pem, + pub leaves: BTreeMap>, CertData>, +} +impl CertStore { + pub fn new(account: &AccountInfo) -> Result { + let int_key = generate_key()?; + let int_cert = make_int_cert((&account.root_ca_key, &account.root_ca_cert), &int_key)?; + Ok(Self { + root_key: Pem::new(account.root_ca_key.clone()), + root_cert: Pem::new(account.root_ca_cert.clone()), + int_key: Pem::new(int_key), + int_cert: Pem::new(int_cert), + leaves: BTreeMap::new(), + }) + } +} +impl Model { + /// This function will grant any cert for any domain. It is up to the *caller* to enusure that the calling service has permission to sign a cert for the requested domain + pub fn cert_for( + &mut self, + hostnames: &BTreeSet, + ) -> Result { + let keys = if let Some(cert_data) = self + .as_leaves() + .as_idx(JsonKey::new_ref(hostnames)) + .map(|m| m.de()) + .transpose()? + { + if cert_data + .certs + .ed25519 + .not_before() + .compare(Asn1Time::days_from_now(0)?.as_ref())? + == Ordering::Less + && cert_data + .certs + .ed25519 + .not_after() + .compare(Asn1Time::days_from_now(30)?.as_ref())? + == Ordering::Greater + && cert_data + .certs + .nistp256 + .not_before() + .compare(Asn1Time::days_from_now(0)?.as_ref())? + == Ordering::Less + && cert_data + .certs + .nistp256 + .not_after() + .compare(Asn1Time::days_from_now(30)?.as_ref())? + == Ordering::Greater + { + return Ok(FullchainCertData { + root: self.as_root_cert().de()?.0, + int: self.as_int_cert().de()?.0, + leaf: cert_data, + }); + } + cert_data.keys + } else { + PKeyPair { + ed25519: PKey::generate_ed25519()?, + nistp256: PKey::from_ec_key(EcKey::generate(&*EcGroup::from_curve_name( + Nid::X9_62_PRIME256V1, + )?)?)?, + } + }; + let int_key = self.as_int_key().de()?.0; + let int_cert = self.as_int_cert().de()?.0; + let cert_data = CertData { + certs: CertPair { + ed25519: make_leaf_cert( + (&int_key, &int_cert), + (&keys.ed25519, &SANInfo::new(hostnames)), + )?, + nistp256: make_leaf_cert( + (&int_key, &int_cert), + (&keys.nistp256, &SANInfo::new(hostnames)), + )?, + }, + keys, + }; + self.as_leaves_mut() + .insert(JsonKey::new_ref(hostnames), &cert_data)?; + Ok(FullchainCertData { + root: self.as_root_cert().de()?.0, + int: self.as_int_cert().de()?.0, + leaf: cert_data, + }) + } +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct CertData { + pub keys: PKeyPair, + pub certs: CertPair, +} + +pub struct FullchainCertData { + pub root: X509, + pub int: X509, + pub leaf: CertData, +} +impl FullchainCertData { + pub fn fullchain_ed25519(&self) -> Vec<&X509> { + vec![&self.root, &self.int, &self.leaf.certs.ed25519] + } + pub fn fullchain_nistp256(&self) -> Vec<&X509> { + vec![&self.root, &self.int, &self.leaf.certs.nistp256] + } +} static CERTIFICATE_VERSION: i32 = 2; // X509 version 3 is actually encoded as '2' in the cert because fuck you. @@ -35,63 +156,21 @@ fn unix_time(time: SystemTime) -> time_t { .unwrap_or_default() } -#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct PKeyPair { + #[serde(with = "crate::util::serde::pem")] + pub ed25519: PKey, + #[serde(with = "crate::util::serde::pem")] + pub nistp256: PKey, +} + +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Deserialize, Serialize)] pub struct CertPair { + #[serde(with = "crate::util::serde::pem")] pub ed25519: X509, + #[serde(with = "crate::util::serde::pem")] pub nistp256: X509, } -impl CertPair { - fn updated( - pair: Option<&Self>, - hostname: &Hostname, - signer: (&PKey, &X509), - applicant: &Key, - ip: BTreeSet, - ) -> Result<(Self, bool), Error> { - let mut updated = false; - let mut updated_cert = |cert: Option<&X509>, osk: PKey| -> Result { - let mut ips = BTreeSet::new(); - if let Some(cert) = cert { - ips.extend( - cert.subject_alt_names() - .iter() - .flatten() - .filter_map(|a| a.ipaddress()) - .filter_map(|a| match a.len() { - 4 => Some::(<[u8; 4]>::try_from(a).unwrap().into()), - 16 => Some::(<[u8; 16]>::try_from(a).unwrap().into()), - _ => None, - }), - ); - if cert - .not_before() - .compare(Asn1Time::days_from_now(0)?.as_ref())? - == Ordering::Less - && cert - .not_after() - .compare(Asn1Time::days_from_now(30)?.as_ref())? - == Ordering::Greater - && ips.is_superset(&ip) - { - return Ok(cert.clone()); - } - } - ips.extend(ip.iter().copied()); - updated = true; - make_leaf_cert(signer, (&osk, &SANInfo::new(&applicant, hostname, ips))) - }; - Ok(( - Self { - ed25519: updated_cert(pair.map(|c| &c.ed25519), applicant.openssl_key_ed25519())?, - nistp256: updated_cert( - pair.map(|c| &c.nistp256), - applicant.openssl_key_nistp256(), - )?, - }, - updated, - )) - } -} pub async fn root_ca_start_time() -> Result { Ok(if check_time_is_synchronized().await? { @@ -101,51 +180,6 @@ pub async fn root_ca_start_time() -> Result { }) } -#[derive(Debug)] -pub struct SslManager { - hostname: Hostname, - root_cert: X509, - int_key: PKey, - int_cert: X509, - cert_cache: RwLock>, -} -impl SslManager { - pub fn new(account: &AccountInfo, start_time: SystemTime) -> Result { - let int_key = generate_key()?; - let int_cert = make_int_cert( - (&account.root_ca_key, &account.root_ca_cert), - &int_key, - start_time, - )?; - Ok(Self { - hostname: account.hostname.clone(), - root_cert: account.root_ca_cert.clone(), - int_key, - int_cert, - cert_cache: RwLock::new(BTreeMap::new()), - }) - } - pub async fn with_certs(&self, key: Key, ip: IpAddr) -> Result { - let mut ips = ips().await?; - ips.insert(ip); - let (pair, updated) = CertPair::updated( - self.cert_cache.read().await.get(&key), - &self.hostname, - (&self.int_key, &self.int_cert), - &key, - ips, - )?; - if updated { - self.cert_cache - .write() - .await - .insert(key.clone(), pair.clone()); - } - - Ok(key.with_certs(pair, self.int_cert.clone(), self.root_cert.clone())) - } -} - const EC_CURVE_NAME: nid::Nid = nid::Nid::X9_62_PRIME256V1; lazy_static::lazy_static! { static ref EC_GROUP: EcGroup = EcGroup::from_curve_name(EC_CURVE_NAME).unwrap(); @@ -245,18 +279,13 @@ pub fn make_root_cert( pub fn make_int_cert( signer: (&PKey, &X509), applicant: &PKey, - start_time: SystemTime, ) -> Result { let mut builder = X509Builder::new()?; builder.set_version(CERTIFICATE_VERSION)?; - let unix_start_time = unix_time(start_time); + builder.set_not_before(signer.1.not_before())?; - let embargo = Asn1Time::from_unix(unix_start_time - 86400)?; - builder.set_not_before(&embargo)?; - - let expiration = Asn1Time::from_unix(unix_start_time + (10 * 364 * 86400))?; - builder.set_not_after(&expiration)?; + builder.set_not_after(signer.1.not_after())?; builder.set_serial_number(&*rand_serial()?)?; @@ -309,13 +338,13 @@ pub fn make_int_cert( #[derive(Debug, PartialEq, Eq, PartialOrd, Ord)] pub enum MaybeWildcard { WithWildcard(String), - WithoutWildcard(String), + WithoutWildcard(InternedString), } impl MaybeWildcard { pub fn as_str(&self) -> &str { match self { MaybeWildcard::WithWildcard(s) => s.as_str(), - MaybeWildcard::WithoutWildcard(s) => s.as_str(), + MaybeWildcard::WithoutWildcard(s) => &**s, } } } @@ -334,18 +363,16 @@ pub struct SANInfo { pub ips: BTreeSet, } impl SANInfo { - pub fn new(key: &Key, hostname: &Hostname, ips: BTreeSet) -> Self { + pub fn new(hostnames: &BTreeSet) -> Self { let mut dns = BTreeSet::new(); - if let Some((id, _)) = key.host() { - dns.insert(MaybeWildcard::WithWildcard(format!("{id}.embassy"))); - dns.insert(MaybeWildcard::WithWildcard(key.local_address().to_string())); - } else { - dns.insert(MaybeWildcard::WithoutWildcard("embassy".to_owned())); - dns.insert(MaybeWildcard::WithWildcard(hostname.local_domain_name())); - dns.insert(MaybeWildcard::WithoutWildcard(hostname.no_dot_host_name())); - dns.insert(MaybeWildcard::WithoutWildcard("localhost".to_owned())); + let mut ips = BTreeSet::new(); + for hostname in hostnames { + if let Ok(ip) = hostname.parse::() { + ips.insert(ip); + } else { + dns.insert(MaybeWildcard::WithoutWildcard(hostname.clone())); // TODO: wildcards? + } } - dns.insert(MaybeWildcard::WithWildcard(key.tor_address().to_string())); Self { dns, ips } } } @@ -443,14 +470,3 @@ pub fn make_leaf_cert( let cert = builder.build(); Ok(cert) } - -pub fn ssl() -> ParentHandler { - ParentHandler::new().subcommand("size", from_fn_async(size).with_remote_cli::()) -} - -pub async fn size(ctx: RpcContext) -> Result { - Ok(format!( - "Cert Catch size: {}", - ctx.net_controller.ssl.cert_cache.read().await.len() - )) -} diff --git a/core/startos/src/net/static_server.rs b/core/startos/src/net/static_server.rs index 68f071c79..fec881795 100644 --- a/core/startos/src/net/static_server.rs +++ b/core/startos/src/net/static_server.rs @@ -11,7 +11,6 @@ use axum::routing::{any, get, post}; use axum::Router; use digest::Digest; use futures::future::ready; -use futures::{FutureExt, TryFutureExt}; use http::header::ACCEPT_ENCODING; use http::request::Parts as RequestParts; use http::{HeaderMap, Method, StatusCode}; @@ -28,7 +27,6 @@ use crate::context::{DiagnosticContext, InstallContext, RpcContext, SetupContext use crate::core::rpc_continuations::RequestGuid; use crate::db::subscribe; use crate::hostname::Hostname; -use crate::install::PKG_PUBLIC_DIR; use crate::middleware::auth::{Auth, HasValidSession}; use crate::middleware::cors::Cors; use crate::middleware::db::SyncDb; @@ -131,8 +129,7 @@ pub fn main_ui_server_router(ctx: RpcContext) -> Router { "/ws/rpc/*path", get({ let ctx = ctx.clone(); - move |headers: HeaderMap, - x::Path(path): x::Path, + move |x::Path(path): x::Path, ws: axum::extract::ws::WebSocketUpgrade| async move { match RequestGuid::from(&path) { None => { @@ -155,7 +152,6 @@ pub fn main_ui_server_router(ctx: RpcContext) -> Router { let path = request .uri() .path() - .clone() .strip_prefix("/rest/rpc/") .unwrap_or_default(); match RequestGuid::from(&path) { diff --git a/core/startos/src/net/tor.rs b/core/startos/src/net/tor.rs index 13096dab8..171404ceb 100644 --- a/core/startos/src/net/tor.rs +++ b/core/startos/src/net/tor.rs @@ -28,13 +28,44 @@ use crate::logs::{ cli_logs_generic_follow, cli_logs_generic_nofollow, fetch_logs, follow_logs, journalctl, LogFollowResponse, LogResponse, LogSource, }; +use crate::prelude::*; use crate::util::serde::{display_serializable, HandlerExtSerde, WithIoFormat}; use crate::util::Invoke; -use crate::{Error, ErrorKind, ResultExt as _}; pub const SYSTEMD_UNIT: &str = "tor@default"; const STARTING_HEALTH_TIMEOUT: u64 = 120; // 2min +#[derive(Debug, Default, Deserialize, Serialize)] +pub struct OnionStore(BTreeMap); +impl Map for OnionStore { + type Key = OnionAddressV3; + type Value = TorSecretKeyV3; + fn key_str(key: &Self::Key) -> Result, Error> { + Ok(key.get_address_without_dot_onion()) + } +} +impl OnionStore { + pub fn new() -> Self { + Self::default() + } + pub fn insert(&mut self, key: TorSecretKeyV3) { + self.0.insert(key.public().get_onion_address(), key); + } +} +impl Model { + pub fn new_key(&mut self) -> Result { + let key = TorSecretKeyV3::generate(); + self.insert(&key.public().get_onion_address(), &key)?; + Ok(key) + } + pub fn insert_key(&mut self, key: &TorSecretKeyV3) -> Result<(), Error> { + self.insert(&key.public().get_onion_address(), &key) + } + pub fn get_key(&self, address: &OnionAddressV3) -> Result { + self.as_idx(address).or_not_found(address)?.de() + } +} + enum ErrorLogSeverity { Fatal { wipe_state: bool }, Unknown { wipe_state: bool }, @@ -208,33 +239,29 @@ impl TorController { pub async fn add( &self, key: TorSecretKeyV3, - external: u16, - target: SocketAddr, - ) -> Result, Error> { + bindings: Vec<(u16, SocketAddr)>, + ) -> Result>, Error> { let (reply, res) = oneshot::channel(); self.0 .send .send(TorCommand::AddOnion { key, - external, - target, + bindings, reply, }) - .ok() - .ok_or_else(|| Error::new(eyre!("TorControl died"), ErrorKind::Tor))?; + .map_err(|_| Error::new(eyre!("TorControl died"), ErrorKind::Tor))?; res.await - .ok() - .ok_or_else(|| Error::new(eyre!("TorControl died"), ErrorKind::Tor)) + .map_err(|_| Error::new(eyre!("TorControl died"), ErrorKind::Tor)) } pub async fn gc( &self, - key: Option, + addr: Option, external: Option, ) -> Result<(), Error> { self.0 .send - .send(TorCommand::GC { key, external }) + .send(TorCommand::GC { addr, external }) .ok() .ok_or_else(|| Error::new(eyre!("TorControl died"), ErrorKind::Tor)) } @@ -279,12 +306,11 @@ type AuthenticatedConnection = AuthenticatedConn< enum TorCommand { AddOnion { key: TorSecretKeyV3, - external: u16, - target: SocketAddr, - reply: oneshot::Sender>, + bindings: Vec<(u16, SocketAddr)>, + reply: oneshot::Sender>>, }, GC { - key: Option, + addr: Option, external: Option, }, GetInfo { @@ -302,7 +328,13 @@ async fn torctl( tor_control: SocketAddr, tor_socks: SocketAddr, recv: &mut mpsc::UnboundedReceiver, - services: &mut BTreeMap<[u8; 64], BTreeMap>>>, + services: &mut BTreeMap< + OnionAddressV3, + ( + TorSecretKeyV3, + BTreeMap>>, + ), + >, wipe_state: &AtomicBool, health_timeout: &mut Duration, ) -> Result<(), Error> { @@ -420,27 +452,32 @@ async fn torctl( match command { TorCommand::AddOnion { key, - external, - target, + bindings, reply, } => { - let mut service = if let Some(service) = services.remove(&key.as_bytes()) { + let addr = key.public().get_onion_address(); + let mut service = if let Some((_key, service)) = services.remove(&addr) { + debug_assert_eq!(key, _key); service } else { BTreeMap::new() }; - let mut binding = service.remove(&external).unwrap_or_default(); - let rc = if let Some(rc) = - Weak::upgrade(&binding.remove(&target).unwrap_or_default()) - { - rc - } else { - Arc::new(()) - }; - binding.insert(target, Arc::downgrade(&rc)); - service.insert(external, binding); - services.insert(key.as_bytes(), service); - reply.send(rc).unwrap_or_default(); + let mut rcs = Vec::with_capacity(bindings.len()); + for (external, target) in bindings { + let mut binding = service.remove(&external).unwrap_or_default(); + let rc = if let Some(rc) = + Weak::upgrade(&binding.remove(&target).unwrap_or_default()) + { + rc + } else { + Arc::new(()) + }; + binding.insert(target, Arc::downgrade(&rc)); + service.insert(external, binding); + rcs.push(rc); + } + services.insert(addr, (key, service)); + reply.send(rcs).unwrap_or_default(); } TorCommand::GetInfo { reply, .. } => { reply @@ -480,8 +517,7 @@ async fn torctl( ) .await?; - for (key, service) in std::mem::take(services) { - let key = TorSecretKeyV3::from(key); + for (addr, (key, service)) in std::mem::take(services) { let bindings = service .iter() .flat_map(|(ext, int)| { @@ -491,7 +527,7 @@ async fn torctl( }) .collect::>(); if !bindings.is_empty() { - services.insert(key.as_bytes(), service); + services.insert(addr, (key.clone(), service)); connection .add_onion_v3(&key, false, false, false, None, &mut bindings.iter()) .await?; @@ -503,31 +539,33 @@ async fn torctl( match command { TorCommand::AddOnion { key, - external, - target, + bindings, reply, } => { let mut rm_res = Ok(()); - let onion_base = key - .public() - .get_onion_address() - .get_address_without_dot_onion(); - let mut service = if let Some(service) = services.remove(&key.as_bytes()) { + let addr = key.public().get_onion_address(); + let onion_base = addr.get_address_without_dot_onion(); + let mut service = if let Some((_key, service)) = services.remove(&addr) { + debug_assert_eq!(_key, key); rm_res = connection.del_onion(&onion_base).await; service } else { BTreeMap::new() }; - let mut binding = service.remove(&external).unwrap_or_default(); - let rc = if let Some(rc) = - Weak::upgrade(&binding.remove(&target).unwrap_or_default()) - { - rc - } else { - Arc::new(()) - }; - binding.insert(target, Arc::downgrade(&rc)); - service.insert(external, binding); + let mut rcs = Vec::with_capacity(bindings.len()); + for (external, target) in bindings { + let mut binding = service.remove(&external).unwrap_or_default(); + let rc = if let Some(rc) = + Weak::upgrade(&binding.remove(&target).unwrap_or_default()) + { + rc + } else { + Arc::new(()) + }; + binding.insert(target, Arc::downgrade(&rc)); + service.insert(external, binding); + rcs.push(rc); + } let bindings = service .iter() .flat_map(|(ext, int)| { @@ -536,25 +574,21 @@ async fn torctl( .map(|(addr, _)| (*ext, SocketAddr::from(*addr))) }) .collect::>(); - services.insert(key.as_bytes(), service); - reply.send(rc).unwrap_or_default(); + services.insert(addr, (key.clone(), service)); + reply.send(rcs).unwrap_or_default(); rm_res?; connection .add_onion_v3(&key, false, false, false, None, &mut bindings.iter()) .await?; } - TorCommand::GC { key, external } => { - for key in if key.is_some() { - itertools::Either::Left(key.into_iter().map(|k| k.as_bytes())) + TorCommand::GC { addr, external } => { + for addr in if addr.is_some() { + itertools::Either::Left(addr.into_iter()) } else { itertools::Either::Right(services.keys().cloned().collect_vec().into_iter()) } { - let key = TorSecretKeyV3::from(key); - let onion_base = key - .public() - .get_onion_address() - .get_address_without_dot_onion(); - if let Some(mut service) = services.remove(&key.as_bytes()) { + if let Some((key, mut service)) = services.remove(&addr) { + let onion_base: String = addr.get_address_without_dot_onion(); for external in if external.is_some() { itertools::Either::Left(external.into_iter()) } else { @@ -583,7 +617,7 @@ async fn torctl( }) .collect::>(); if !bindings.is_empty() { - services.insert(key.as_bytes(), service); + services.insert(addr, (key.clone(), service)); } rm_res?; if !bindings.is_empty() { diff --git a/core/startos/src/net/vhost.rs b/core/startos/src/net/vhost.rs index 3d60544db..88cb759a0 100644 --- a/core/startos/src/net/vhost.rs +++ b/core/startos/src/net/vhost.rs @@ -5,7 +5,9 @@ use std::time::Duration; use color_eyre::eyre::eyre; use helpers::NonDetachingJoinHandle; +use imbl_value::InternedString; use models::ResultExt; +use serde::{Deserialize, Serialize}; use tokio::net::{TcpListener, TcpStream}; use tokio::sync::{Mutex, RwLock}; use tokio_rustls::rustls::pki_types::{ @@ -16,38 +18,36 @@ use tokio_rustls::rustls::{RootCertStore, ServerConfig}; use tokio_rustls::{LazyConfigAcceptor, TlsConnector}; use tracing::instrument; -use crate::net::keys::Key; -use crate::net::ssl::SslManager; use crate::prelude::*; use crate::util::io::{BackTrackingReader, TimeoutStream}; +use crate::util::serde::MaybeUtf8String; // not allowed: <=1024, >=32768, 5355, 5432, 9050, 6010, 9051, 5353 pub struct VHostController { - ssl: Arc, + db: PatchDb, servers: Mutex>, } impl VHostController { - pub fn new(ssl: Arc) -> Self { + pub fn new(db: PatchDb) -> Self { Self { - ssl, + db, servers: Mutex::new(BTreeMap::new()), } } #[instrument(skip_all)] pub async fn add( &self, - key: Key, hostname: Option, external: u16, target: SocketAddr, - connect_ssl: Result<(), AlpnInfo>, + connect_ssl: Result<(), AlpnInfo>, // Ok: yes, connect using ssl, pass through alpn; Err: connect tcp, use provided strategy for alpn ) -> Result, Error> { let mut writable = self.servers.lock().await; let server = if let Some(server) = writable.remove(&external) { server } else { - VHostServer::new(external, self.ssl.clone()).await? + VHostServer::new(external, self.db.clone()).await? }; let rc = server .add( @@ -55,7 +55,6 @@ impl VHostController { TargetInfo { addr: target, connect_ssl, - key, }, ) .await; @@ -79,13 +78,18 @@ impl VHostController { struct TargetInfo { addr: SocketAddr, connect_ssl: Result<(), AlpnInfo>, - key: Key, } -#[derive(Clone, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] pub enum AlpnInfo { Reflect, - Specified(Vec>), + Specified(Vec), +} +impl Default for AlpnInfo { + fn default() -> Self { + Self::Reflect + } } struct VHostServer { @@ -94,7 +98,7 @@ struct VHostServer { } impl VHostServer { #[instrument(skip_all)] - async fn new(port: u16, ssl: Arc) -> Result { + async fn new(port: u16, db: PatchDb) -> Result { // check if port allowed let listener = TcpListener::bind(SocketAddr::new(Ipv6Addr::UNSPECIFIED.into(), port)) .await @@ -105,13 +109,13 @@ impl VHostServer { _thread: tokio::spawn(async move { loop { match listener.accept().await { - Ok((stream, _)) => { + Ok((stream, sock_addr)) => { let stream = Box::pin(TimeoutStream::new(stream, Duration::from_secs(300))); let mut stream = BackTrackingReader::new(stream); stream.start_buffering(); let mapping = mapping.clone(); - let ssl = ssl.clone(); + let db = db.clone(); tokio::spawn(async move { if let Err(e) = async { let mid = match LazyConfigAcceptor::new( @@ -167,6 +171,7 @@ impl VHostServer { .find(|(_, rc)| rc.strong_count() > 0) .or_else(|| { if target_name + .as_ref() .map(|s| s.parse::().is_ok()) .unwrap_or(true) { @@ -184,8 +189,22 @@ impl VHostServer { if let Some(target) = target { let mut tcp_stream = TcpStream::connect(target.addr).await?; - let key = - ssl.with_certs(target.key, target.addr.ip()).await?; + let hostnames = target_name + .as_ref() + .into_iter() + .map(InternedString::intern) + .chain(std::iter::once(InternedString::from_display( + &sock_addr.ip(), + ))) + .collect(); + let key = db + .mutate(|v| { + v.as_private_mut() + .as_key_store_mut() + .as_local_certs_mut() + .cert_for(&hostnames) + }) + .await?; let cfg = ServerConfig::builder() .with_no_client_auth(); let mut cfg = @@ -202,8 +221,9 @@ impl VHostServer { }) .collect::>()?, PrivateKeyDer::from(PrivatePkcs8KeyDer::from( - key.key() - .openssl_key_ed25519() + key.leaf + .keys + .ed25519 .private_key_to_pkcs8()?, )), ) @@ -218,8 +238,9 @@ impl VHostServer { }) .collect::>()?, PrivateKeyDer::from(PrivatePkcs8KeyDer::from( - key.key() - .openssl_key_nistp256() + key.leaf + .keys + .nistp256 .private_key_to_pkcs8()?, )), ) @@ -233,7 +254,7 @@ impl VHostServer { let mut store = RootCertStore::empty(); store.add( CertificateDer::from( - key.root_ca().to_der()?, + key.root.to_der()?, ), ).with_kind(crate::ErrorKind::OpenSsl)?; store @@ -249,9 +270,9 @@ impl VHostServer { let mut target_stream = TlsConnector::from(Arc::new(client_cfg)) .connect_with( - ServerName::try_from( - key.key().internal_address(), - ).with_kind(crate::ErrorKind::OpenSsl)?, + ServerName::IpAddress( + target.addr.ip().into(), + ), tcp_stream, |conn| { cfg.alpn_protocols.extend( @@ -302,7 +323,7 @@ impl VHostServer { .await } Err(AlpnInfo::Specified(alpn)) => { - cfg.alpn_protocols = alpn; + cfg.alpn_protocols = alpn.into_iter().map(|a| a.0).collect(); let mut tls_stream = match mid.into_stream(Arc::new(cfg)).await { Ok(a) => a, diff --git a/core/startos/src/notifications.rs b/core/startos/src/notifications.rs index f16eab176..f696b27b7 100644 --- a/core/startos/src/notifications.rs +++ b/core/startos/src/notifications.rs @@ -1,24 +1,23 @@ -use std::collections::HashMap; +use std::collections::BTreeMap; use std::fmt; use std::str::FromStr; -use chrono::{DateTime, TimeZone, Utc}; +use chrono::{DateTime, Utc}; use clap::builder::ValueParserFactory; use clap::Parser; use color_eyre::eyre::eyre; +use imbl_value::InternedString; use models::PackageId; use rpc_toolkit::{command, from_fn_async, HandlerExt, ParentHandler}; use serde::{Deserialize, Serialize}; -use sqlx::PgPool; -use tokio::sync::Mutex; use tracing::instrument; use crate::backup::BackupReport; use crate::context::{CliContext, RpcContext}; +use crate::db::model::DatabaseModel; use crate::prelude::*; use crate::util::clap::FromStrParser; use crate::util::serde::HandlerExtSerde; -use crate::{Error, ErrorKind, ResultExt}; // #[command(subcommands(list, delete, delete_before, create))] pub fn notification() -> ParentHandler { @@ -53,132 +52,102 @@ pub fn notification() -> ParentHandler { #[serde(rename_all = "kebab-case")] #[command(rename_all = "kebab-case")] pub struct ListParams { - before: Option, - - limit: Option, + before: Option, + limit: Option, } // #[command(display(display_serializable))] #[instrument(skip_all)] pub async fn list( ctx: RpcContext, ListParams { before, limit }: ListParams, -) -> Result, Error> { - let limit = limit.unwrap_or(40); - match before { - None => { - let records = sqlx::query!( - "SELECT id, package_id, created_at, code, level, title, message, data FROM notifications ORDER BY id DESC LIMIT $1", - limit as i64 - ).fetch_all(&ctx.secret_store).await?; - let notifs = records - .into_iter() - .map(|r| { - Ok(Notification { - id: r.id as u32, - package_id: r.package_id.and_then(|p| p.parse().ok()), - created_at: Utc.from_utc_datetime(&r.created_at), - code: r.code as u32, - level: match r.level.parse::() { - Ok(a) => a, - Err(e) => return Err(e.into()), - }, - title: r.title, - message: r.message, - data: match r.data { - None => serde_json::Value::Null, - Some(v) => match v.parse::() { - Ok(a) => a, - Err(e) => { - return Err(Error::new( - eyre!("Invalid Notification Data: {}", e), - ErrorKind::ParseDbField, - )) - } - }, - }, - }) - }) - .collect::, Error>>()?; - - ctx.db - .mutate(|d| { - d.as_public_mut() +) -> Result, Error> { + ctx.db + .mutate(|db| { + let limit = limit.unwrap_or(40); + match before { + None => { + let records = db + .as_private() + .as_notifications() + .as_entries()? + .into_iter() + .take(limit); + let notifs = records + .into_iter() + .map(|(id, notification)| { + Ok(NotificationWithId { + id, + notification: notification.de()?, + }) + }) + .collect::, Error>>()?; + db.as_public_mut() .as_server_info_mut() .as_unread_notification_count_mut() - .ser(&0) - }) - .await?; - Ok(notifs) - } - Some(before) => { - let records = sqlx::query!( - "SELECT id, package_id, created_at, code, level, title, message, data FROM notifications WHERE id < $1 ORDER BY id DESC LIMIT $2", - before, - limit as i64 - ).fetch_all(&ctx.secret_store).await?; - let res = records - .into_iter() - .map(|r| { - Ok(Notification { - id: r.id as u32, - package_id: r.package_id.and_then(|p| p.parse().ok()), - created_at: Utc.from_utc_datetime(&r.created_at), - code: r.code as u32, - level: match r.level.parse::() { - Ok(a) => a, - Err(e) => return Err(e.into()), - }, - title: r.title, - message: r.message, - data: match r.data { - None => serde_json::Value::Null, - Some(v) => match v.parse::() { - Ok(a) => a, - Err(e) => { - return Err(Error::new( - eyre!("Invalid Notification Data: {}", e), - ErrorKind::ParseDbField, - )) - } - }, - }, - }) - }) - .collect::, Error>>()?; - Ok(res) - } - } + .ser(&0)?; + Ok(notifs) + } + Some(before) => { + let records = db + .as_private() + .as_notifications() + .as_entries()? + .into_iter() + .filter(|(id, _)| *id < before) + .take(limit); + records + .into_iter() + .map(|(id, notification)| { + Ok(NotificationWithId { + id, + notification: notification.de()?, + }) + }) + .collect() + } + } + }) + .await } #[derive(Deserialize, Serialize, Parser)] #[serde(rename_all = "kebab-case")] #[command(rename_all = "kebab-case")] pub struct DeleteParams { - id: i32, + id: u32, } pub async fn delete(ctx: RpcContext, DeleteParams { id }: DeleteParams) -> Result<(), Error> { - sqlx::query!("DELETE FROM notifications WHERE id = $1", id) - .execute(&ctx.secret_store) - .await?; - Ok(()) + ctx.db + .mutate(|db| { + db.as_private_mut().as_notifications_mut().remove(&id)?; + Ok(()) + }) + .await } #[derive(Deserialize, Serialize, Parser)] #[serde(rename_all = "kebab-case")] #[command(rename_all = "kebab-case")] pub struct DeleteBeforeParams { - before: i32, + before: u32, } pub async fn delete_before( ctx: RpcContext, DeleteBeforeParams { before }: DeleteBeforeParams, ) -> Result<(), Error> { - sqlx::query!("DELETE FROM notifications WHERE id < $1", before) - .execute(&ctx.secret_store) - .await?; - Ok(()) + ctx.db + .mutate(|db| { + for id in db.as_private().as_notifications().keys()? { + if id < before { + db.as_private_mut().as_notifications_mut().remove(&id)?; + } + } + Ok(()) + }) + .await } + #[derive(Deserialize, Serialize, Parser)] #[serde(rename_all = "kebab-case")] #[command(rename_all = "kebab-case")] @@ -198,8 +167,8 @@ pub async fn create( message, }: CreateParams, ) -> Result<(), Error> { - ctx.notification_manager - .notify(ctx.db.clone(), package, level, title, message, (), None) + ctx.db + .mutate(|db| notify(db, package, level, title, message, ())) .await } @@ -254,120 +223,95 @@ impl fmt::Display for InvalidNotificationLevel { write!(f, "Invalid Notification Level: {}", self.0) } } -#[derive(Debug, serde::Serialize, serde::Deserialize)] + +#[derive(Debug, Default, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub struct Notifications(pub BTreeMap); +impl Notifications { + pub fn new() -> Self { + Self(BTreeMap::new()) + } +} +impl Map for Notifications { + type Key = u32; + type Value = Notification; + fn key_str(key: &Self::Key) -> Result, Error> { + Self::key_string(key) + } + fn key_string(key: &Self::Key) -> Result { + Ok(InternedString::from_display(key)) + } +} + +#[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] pub struct Notification { - id: u32, package_id: Option, created_at: DateTime, code: u32, level: NotificationLevel, title: String, message: String, - data: serde_json::Value, + data: Value, +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub struct NotificationWithId { + id: u32, + #[serde(flatten)] + notification: Notification, } pub trait NotificationType: serde::Serialize + for<'de> serde::Deserialize<'de> + std::fmt::Debug { - const CODE: i32; + const CODE: u32; } impl NotificationType for () { - const CODE: i32 = 0; + const CODE: u32 = 0; } impl NotificationType for BackupReport { - const CODE: i32 = 1; + const CODE: u32 = 1; } -pub struct NotificationManager { - sqlite: PgPool, - cache: Mutex, NotificationLevel, String), i64>>, -} -impl NotificationManager { - pub fn new(sqlite: PgPool) -> Self { - NotificationManager { - sqlite, - cache: Mutex::new(HashMap::new()), - } - } - #[instrument(skip(db, subtype, self))] - pub async fn notify( - &self, - db: PatchDb, - package_id: Option, - level: NotificationLevel, - title: String, - message: String, - subtype: T, - debounce_interval: Option, - ) -> Result<(), Error> { - let peek = db.peek().await; - if !self - .should_notify(&package_id, &level, &title, debounce_interval) - .await - { - return Ok(()); - } - let mut count = peek - .as_public() - .as_server_info() - .as_unread_notification_count() - .de()?; - let sql_package_id = package_id.as_ref().map(|p| &**p); - let sql_code = T::CODE; - let sql_level = format!("{}", level); - let sql_data = - serde_json::to_string(&subtype).with_kind(crate::ErrorKind::Serialization)?; - sqlx::query!( - "INSERT INTO notifications (package_id, code, level, title, message, data) VALUES ($1, $2, $3, $4, $5, $6)", - sql_package_id, - sql_code as i32, - sql_level, - title, - message, - sql_data - ).execute(&self.sqlite).await?; - count += 1; - db.mutate(|db| { - db.as_public_mut() - .as_server_info_mut() - .as_unread_notification_count_mut() - .ser(&count) - }) - .await - } - async fn should_notify( - &self, - package_id: &Option, - level: &NotificationLevel, - title: &String, - debounce_interval: Option, - ) -> bool { - let mut guard = self.cache.lock().await; - let k = (package_id.clone(), level.clone(), title.clone()); - let v = (*guard).get(&k); - match v { - None => { - (*guard).insert(k, Utc::now().timestamp()); - true - } - Some(last_issued) => match debounce_interval { - None => { - (*guard).insert(k, Utc::now().timestamp()); - true - } - Some(interval) => { - if last_issued + interval as i64 > Utc::now().timestamp() { - false - } else { - (*guard).insert(k, Utc::now().timestamp()); - true - } - } - }, - } - } +#[instrument(skip(subtype, db))] +pub fn notify( + db: &mut DatabaseModel, + package_id: Option, + level: NotificationLevel, + title: String, + message: String, + subtype: T, +) -> Result<(), Error> { + let data = to_value(&subtype)?; + db.as_public_mut() + .as_server_info_mut() + .as_unread_notification_count_mut() + .mutate(|c| { + *c += 1; + Ok(()) + })?; + let id = db + .as_private() + .as_notifications() + .keys()? + .into_iter() + .max() + .map_or(0, |id| id + 1); + db.as_private_mut().as_notifications_mut().insert( + &id, + &Notification { + package_id, + created_at: Utc::now(), + code: T::CODE, + level, + title, + message, + data, + }, + ) } #[test] diff --git a/core/startos/src/registry/admin.rs b/core/startos/src/registry/admin.rs index 9f0033e96..95cfcec8f 100644 --- a/core/startos/src/registry/admin.rs +++ b/core/startos/src/registry/admin.rs @@ -133,7 +133,7 @@ pub async fn publish( .with_prefix("[1/3]") .with_message("Querying s9pk"); pb.enable_steady_tick(Duration::from_millis(200)); - let mut s9pk = S9pk::open(&path, None).await?; + let s9pk = S9pk::open(&path, None).await?; let m = s9pk.as_manifest().clone(); pb.set_style(plain_line_style.clone()); pb.abandon(); @@ -144,7 +144,7 @@ pub async fn publish( .with_prefix("[1/3]") .with_message("Verifying s9pk"); pb.enable_steady_tick(Duration::from_millis(200)); - let mut s9pk = S9pk::open(&path, None).await?; + let s9pk = S9pk::open(&path, None).await?; // s9pk.validate().await?; todo!(); let m = s9pk.as_manifest().clone(); diff --git a/core/startos/src/s9pk/merkle_archive/mod.rs b/core/startos/src/s9pk/merkle_archive/mod.rs index abddb3c1e..afd00032a 100644 --- a/core/startos/src/s9pk/merkle_archive/mod.rs +++ b/core/startos/src/s9pk/merkle_archive/mod.rs @@ -1,7 +1,5 @@ use std::path::Path; -use std::sync::Arc; -use ed25519::signature::Keypair; use ed25519_dalek::{Signature, SigningKey, VerifyingKey}; use tokio::io::AsyncRead; diff --git a/core/startos/src/s9pk/merkle_archive/source/multi_cursor_file.rs b/core/startos/src/s9pk/merkle_archive/source/multi_cursor_file.rs index afb808471..7add68e6f 100644 --- a/core/startos/src/s9pk/merkle_archive/source/multi_cursor_file.rs +++ b/core/startos/src/s9pk/merkle_archive/source/multi_cursor_file.rs @@ -1,7 +1,7 @@ -use std::os::fd::{AsRawFd, FromRawFd, RawFd}; +use std::io::SeekFrom; +use std::os::fd::{AsRawFd, RawFd}; use std::path::{Path, PathBuf}; use std::sync::Arc; -use std::{borrow::Borrow, io::SeekFrom}; use tokio::fs::File; use tokio::io::{AsyncRead, AsyncReadExt}; diff --git a/core/startos/src/service/config.rs b/core/startos/src/service/config.rs index 06dc8bd55..e1294a465 100644 --- a/core/startos/src/service/config.rs +++ b/core/startos/src/service/config.rs @@ -1,6 +1,4 @@ -use std::collections::BTreeMap; - -use models::{ActionId, PackageId, ProcedureName}; +use models::ProcedureName; use crate::config::ConfigureContext; use crate::prelude::*; diff --git a/core/startos/src/service/mod.rs b/core/startos/src/service/mod.rs index 3335be1ca..1efb116d5 100644 --- a/core/startos/src/service/mod.rs +++ b/core/startos/src/service/mod.rs @@ -1,5 +1,5 @@ +use std::sync::Arc; use std::time::Duration; -use std::{ops::Deref, sync::Arc}; use chrono::{DateTime, Utc}; use clap::Parser; @@ -10,25 +10,25 @@ use persistent_container::PersistentContainer; use rpc_toolkit::{from_fn_async, CallRemoteHandler, Empty, Handler, HandlerArgs}; use serde::{Deserialize, Serialize}; use start_stop::StartStop; -use tokio::sync::{watch, Notify}; +use tokio::sync::Notify; use crate::action::ActionResult; use crate::config::action::ConfigRes; use crate::context::{CliContext, RpcContext}; use crate::core::rpc_continuations::RequestGuid; use crate::db::model::{ - CurrentDependencies, CurrentDependents, InstalledPackageInfo, PackageDataEntry, - PackageDataEntryInstalled, PackageDataEntryMatchModel, StaticFiles, + InstalledPackageInfo, PackageDataEntry, PackageDataEntryInstalled, PackageDataEntryMatchModel, + StaticFiles, }; use crate::disk::mount::guard::GenericMountGuard; use crate::install::PKG_ARCHIVE_DIR; use crate::prelude::*; -use crate::progress::{self, NamedProgress, Progress}; +use crate::progress::{NamedProgress, Progress}; use crate::s9pk::S9pk; use crate::service::service_map::InstallProgressHandles; -use crate::service::transition::{TempDesiredState, TransitionKind, TransitionState}; +use crate::service::transition::TransitionKind; use crate::status::health_check::HealthCheckResult; -use crate::status::{DependencyConfigErrors, MainStatus, Status}; +use crate::status::{MainStatus, Status}; use crate::util::actor::{Actor, BackgroundJobs, SimpleActor}; use crate::volume::data_dir; @@ -289,6 +289,7 @@ impl Service { marketplace_url: None, // TODO manifest: manifest.clone(), last_backup: None, // TODO + hosts: Default::default(), // TODO store: Value::Null, // TODO store_exposed_dependents: Default::default(), // TODO store_exposed_ui: Default::default(), // TODO diff --git a/core/startos/src/service/persistent_container.rs b/core/startos/src/service/persistent_container.rs index 28067cdd8..523b5f19a 100644 --- a/core/startos/src/service/persistent_container.rs +++ b/core/startos/src/service/persistent_container.rs @@ -15,19 +15,18 @@ use tokio::process::Command; use tokio::sync::{oneshot, watch, Mutex, OnceCell}; use tracing::instrument; -use super::{ - service_effect_handler::{service_effect_handler, EffectContext}, - transition::{TempDesiredState, TransitionKind}, -}; -use super::{transition::TransitionState, ServiceActorSeed}; +use super::service_effect_handler::{service_effect_handler, EffectContext}; +use super::transition::{TransitionKind, TransitionState}; +use super::ServiceActorSeed; use crate::context::RpcContext; use crate::disk::mount::filesystem::bind::Bind; use crate::disk::mount::filesystem::idmapped::IdMapped; use crate::disk::mount::filesystem::loop_dev::LoopDev; use crate::disk::mount::filesystem::overlayfs::OverlayGuard; use crate::disk::mount::filesystem::{MountType, ReadOnly}; -use crate::disk::mount::guard::{GenericMountGuard, MountGuard}; +use crate::disk::mount::guard::MountGuard; use crate::lxc::{LxcConfig, LxcContainer, HOST_RPC_SERVER_SOCKET}; +use crate::net::net_controller::NetService; use crate::prelude::*; use crate::s9pk::merkle_archive::source::FileSource; use crate::s9pk::S9pk; @@ -94,6 +93,7 @@ pub struct PersistentContainer { assets: BTreeMap, pub(super) overlays: Arc>>, pub(super) state: Arc>, + pub(super) net_service: Mutex, } impl PersistentContainer { @@ -178,6 +178,10 @@ impl PersistentContainer { .await?; } } + let net_service = ctx + .net_controller + .create_service(s9pk.as_manifest().id.clone(), lxc_container.ip()) + .await?; Ok(Self { s9pk, lxc_container: OnceCell::new_with(Some(lxc_container)), @@ -189,6 +193,7 @@ impl PersistentContainer { assets, overlays: Arc::new(Mutex::new(BTreeMap::new())), state: Arc::new(watch::channel(ServiceState::new(start)).0), + net_service: Mutex::new(net_service), }) } diff --git a/core/startos/src/service/rpc.rs b/core/startos/src/service/rpc.rs index 05e6dcfab..6823a7189 100644 --- a/core/startos/src/service/rpc.rs +++ b/core/startos/src/service/rpc.rs @@ -2,7 +2,7 @@ use std::time::Duration; use imbl_value::Value; use models::ProcedureName; -use rpc_toolkit::yajrc::{RpcError, RpcMethod}; +use rpc_toolkit::yajrc::RpcMethod; use rpc_toolkit::Empty; use crate::prelude::*; diff --git a/core/startos/src/service/service_effect_handler.rs b/core/startos/src/service/service_effect_handler.rs index 3978b64c7..ea2228e81 100644 --- a/core/startos/src/service/service_effect_handler.rs +++ b/core/startos/src/service/service_effect_handler.rs @@ -1,11 +1,10 @@ +use std::ffi::OsString; use std::os::unix::process::CommandExt; use std::path::{Path, PathBuf}; use std::str::FromStr; use std::sync::{Arc, Weak}; -use std::{ffi::OsString, time::Instant}; -use chrono::Utc; -use clap::builder::{TypedValueParser, ValueParserFactory}; +use clap::builder::ValueParserFactory; use clap::Parser; use imbl_value::{json, InternedString}; use models::{ActionId, HealthCheckId, ImageId, PackageId}; @@ -13,19 +12,18 @@ use patch_db::json_ptr::JsonPointer; use rpc_toolkit::{from_fn, from_fn_async, AnyContext, Context, Empty, HandlerExt, ParentHandler}; use tokio::process::Command; +use crate::db::model::ExposedUI; +use crate::disk::mount::filesystem::idmapped::IdMapped; use crate::disk::mount::filesystem::loop_dev::LoopDev; use crate::disk::mount::filesystem::overlayfs::OverlayGuard; use crate::prelude::*; use crate::s9pk::rpc::SKIP_ENV; use crate::service::cli::ContainerCliContext; -use crate::service::start_stop::StartStop; use crate::service::ServiceActorSeed; -use crate::status::health_check::HealthCheckResult; +use crate::status::health_check::{HealthCheckResult, HealthCheckString}; use crate::status::MainStatus; use crate::util::clap::FromStrParser; use crate::util::{new_guid, Invoke}; -use crate::{db::model::ExposedUI, service::RunningStatus}; -use crate::{disk::mount::filesystem::idmapped::IdMapped, status::health_check::HealthCheckString}; use crate::{echo, ARCH}; #[derive(Clone)] diff --git a/core/startos/src/service/service_map.rs b/core/startos/src/service/service_map.rs index 7ac555aff..f555be531 100644 --- a/core/startos/src/service/service_map.rs +++ b/core/startos/src/service/service_map.rs @@ -12,12 +12,12 @@ use tracing::instrument; use crate::context::RpcContext; use crate::db::model::{ - InstalledPackageInfo, PackageDataEntry, PackageDataEntryInstalled, PackageDataEntryInstalling, + PackageDataEntry, PackageDataEntryInstalled, PackageDataEntryInstalling, PackageDataEntryRestoring, PackageDataEntryUpdating, StaticFiles, }; use crate::disk::mount::guard::GenericMountGuard; use crate::install::PKG_ARCHIVE_DIR; -use crate::notifications::NotificationLevel; +use crate::notifications::{notify, NotificationLevel}; use crate::prelude::*; use crate::progress::{ FullProgressTracker, FullProgressTrackerHandle, PhaseProgressTrackerHandle, @@ -370,17 +370,19 @@ impl ServiceReloadInfo { .load(&self.ctx, &self.id, LoadDisposition::Undo) .await?; if let Some(error) = error { + let error_string = error.to_string(); self.ctx - .notification_manager - .notify( - self.ctx.db.clone(), - Some(self.id.clone()), - NotificationLevel::Error, - format!("{} Failed", self.operation), - error.to_string(), - (), - None, - ) + .db + .mutate(|db| { + notify( + db, + Some(self.id.clone()), + NotificationLevel::Error, + format!("{} Failed", self.operation), + error_string, + (), + ) + }) .await?; } Ok(()) diff --git a/core/startos/src/service/transition/mod.rs b/core/startos/src/service/transition/mod.rs index cd7979cae..af62ccc1c 100644 --- a/core/startos/src/service/transition/mod.rs +++ b/core/startos/src/service/transition/mod.rs @@ -1,15 +1,13 @@ use std::sync::Arc; -use std::{fmt::Display, ops::Deref}; use futures::{Future, FutureExt}; use tokio::sync::watch; +use super::persistent_container::ServiceState; use crate::service::start_stop::StartStop; use crate::util::actor::BackgroundJobs; use crate::util::future::{CancellationHandle, RemoteCancellable}; -use super::persistent_container::ServiceState; - pub mod backup; pub mod restart; diff --git a/core/startos/src/setup.rs b/core/startos/src/setup.rs index 9c8d54db3..8275f2d61 100644 --- a/core/startos/src/setup.rs +++ b/core/startos/src/setup.rs @@ -5,10 +5,10 @@ use std::time::Duration; use color_eyre::eyre::eyre; use josekit::jwk::Jwk; use openssl::x509::X509; +use patch_db::json_ptr::ROOT; use rpc_toolkit::yajrc::RpcError; use rpc_toolkit::{from_fn_async, HandlerExt, ParentHandler}; use serde::{Deserialize, Serialize}; -use sqlx::Connection; use tokio::fs::File; use tokio::io::AsyncWriteExt; use tokio::try_join; @@ -20,6 +20,7 @@ use crate::backup::restore::recover_full_embassy; use crate::backup::target::BackupTargetFS; use crate::context::setup::SetupResult; use crate::context::SetupContext; +use crate::db::model::Database; use crate::disk::fsck::RepairStrategy; use crate::disk::main::DEFAULT_PASSWORD; use crate::disk::mount::filesystem::cifs::Cifs; @@ -74,29 +75,26 @@ async fn setup_init( ctx: &SetupContext, password: Option, ) -> Result<(Hostname, OnionAddressV3, X509), Error> { - let InitResult { secret_store, db } = init(&ctx.config).await?; - let mut secrets_handle = secret_store.acquire().await?; - let mut secrets_tx = secrets_handle.begin().await?; + let InitResult { db } = init(&ctx.config).await?; - let mut account = AccountInfo::load(secrets_tx.as_mut()).await?; - - if let Some(password) = password { - account.set_password(&password)?; - account.save(secrets_tx.as_mut()).await?; - db.mutate(|m| { + let account = db + .mutate(|m| { + let mut account = AccountInfo::load(m)?; + if let Some(password) = password { + account.set_password(&password)?; + } + account.save(m)?; m.as_public_mut() .as_server_info_mut() .as_password_hash_mut() - .ser(&account.password) + .ser(&account.password)?; + Ok(account) }) .await?; - } - - secrets_tx.commit().await?; Ok(( account.hostname, - account.key.tor_address(), + account.tor_key.public().get_onion_address(), account.root_ca_cert, )) } @@ -419,15 +417,13 @@ async fn fresh_setup( embassy_password: &str, ) -> Result<(Hostname, OnionAddressV3, X509), Error> { let account = AccountInfo::new(embassy_password, root_ca_start_time().await?)?; - let sqlite_pool = ctx.secret_store().await?; - account.save(&sqlite_pool).await?; - sqlite_pool.close().await; - let InitResult { secret_store, .. } = init(&ctx.config).await?; - secret_store.close().await; + let db = ctx.db().await?; + db.put(&ROOT, &Database::init(&account)?).await?; + init(&ctx.config).await?; Ok(( - account.hostname.clone(), - account.key.tor_address(), - account.root_ca_cert.clone(), + account.hostname, + account.tor_key.public().get_onion_address(), + account.root_ca_cert, )) } diff --git a/core/startos/src/ssh.rs b/core/startos/src/ssh.rs index d762b63a0..8965c7edd 100644 --- a/core/startos/src/ssh.rs +++ b/core/startos/src/ssh.rs @@ -1,28 +1,46 @@ +use std::collections::BTreeMap; use std::path::Path; -use chrono::Utc; use clap::builder::ValueParserFactory; use clap::Parser; use color_eyre::eyre::eyre; +use imbl_value::InternedString; use rpc_toolkit::{command, from_fn_async, AnyContext, Empty, HandlerExt, ParentHandler}; use serde::{Deserialize, Serialize}; -use sqlx::{Pool, Postgres}; use tracing::instrument; use crate::context::{CliContext, RpcContext}; +use crate::prelude::*; use crate::util::clap::FromStrParser; use crate::util::serde::{display_serializable, HandlerExtSerde, WithIoFormat}; -use crate::{Error, ErrorKind}; static SSH_AUTHORIZED_KEYS_FILE: &str = "/home/start9/.ssh/authorized_keys"; #[derive(Clone, Debug, Deserialize, Serialize)] -pub struct PubKey( +pub struct SshKeys(BTreeMap>); +impl SshKeys { + pub fn new() -> Self { + Self(BTreeMap::new()) + } +} +impl Map for SshKeys { + type Key = InternedString; + type Value = WithTimeData; + fn key_str(key: &Self::Key) -> Result, Error> { + Ok(key) + } + fn key_string(key: &Self::Key) -> Result { + Ok(key.clone()) + } +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct SshPubKey( #[serde(serialize_with = "crate::util::serde::serialize_display")] #[serde(deserialize_with = "crate::util::serde::deserialize_from_str")] openssh_keys::PublicKey, ); -impl ValueParserFactory for PubKey { +impl ValueParserFactory for SshPubKey { type Parser = FromStrParser; fn value_parser() -> Self::Parser { FromStrParser::new() @@ -33,7 +51,7 @@ impl ValueParserFactory for PubKey { #[serde(rename_all = "kebab-case")] pub struct SshKeyResponse { pub alg: String, - pub fingerprint: String, + pub fingerprint: InternedString, pub hostname: String, pub created_at: String, } @@ -47,10 +65,10 @@ impl std::fmt::Display for SshKeyResponse { } } -impl std::str::FromStr for PubKey { +impl std::str::FromStr for SshPubKey { type Err = Error; fn from_str(s: &str) -> Result { - s.parse().map(|pk| PubKey(pk)).map_err(|e| Error { + s.parse().map(|pk| SshPubKey(pk)).map_err(|e| Error { source: e.into(), kind: crate::ErrorKind::ParseSshKey, revision: None, @@ -88,49 +106,34 @@ pub fn ssh() -> ParentHandler { #[serde(rename_all = "kebab-case")] #[command(rename_all = "kebab-case")] pub struct AddParams { - key: PubKey, + key: SshPubKey, } #[instrument(skip_all)] pub async fn add(ctx: RpcContext, AddParams { key }: AddParams) -> Result { - let pool = &ctx.secret_store; - // check fingerprint for duplicates - let fp = key.0.fingerprint_md5(); - match sqlx::query!("SELECT * FROM ssh_keys WHERE fingerprint = $1", fp) - .fetch_optional(pool) - .await? - { - None => { - // if no duplicates, insert into DB - let raw_key = format!("{}", key.0); - let created_at = Utc::now().to_rfc3339(); - sqlx::query!( - "INSERT INTO ssh_keys (fingerprint, openssh_pubkey, created_at) VALUES ($1, $2, $3)", - fp, - raw_key, - created_at - ) - .execute(pool) - .await?; - // insert into live key file, for now we actually do a wholesale replacement of the keys file, for maximum - // consistency - sync_keys_from_db(pool, Path::new(SSH_AUTHORIZED_KEYS_FILE)).await?; + let mut key = WithTimeData::new(key); + let fingerprint = InternedString::intern(key.0.fingerprint_md5()); + ctx.db + .mutate(move |m| { + m.as_private_mut() + .as_ssh_pubkeys_mut() + .insert(&fingerprint, &key)?; + Ok(SshKeyResponse { alg: key.0.keytype().to_owned(), - fingerprint: fp, - hostname: key.0.comment.unwrap_or(String::new()).to_owned(), - created_at, + fingerprint, + hostname: key.0.comment.take().unwrap_or_default(), + created_at: key.created_at.to_rfc3339(), }) - } - Some(_) => Err(Error::new(eyre!("Duplicate ssh key"), ErrorKind::Duplicate)), - } + }) + .await } #[derive(Deserialize, Serialize, Parser)] #[serde(rename_all = "kebab-case")] #[command(rename_all = "kebab-case")] pub struct DeleteParams { - fingerprint: String, + fingerprint: InternedString, } #[instrument(skip_all)] @@ -138,25 +141,22 @@ pub async fn delete( ctx: RpcContext, DeleteParams { fingerprint }: DeleteParams, ) -> Result<(), Error> { - let pool = &ctx.secret_store; - // check if fingerprint is in DB - // if in DB, remove it from DB - let n = sqlx::query!("DELETE FROM ssh_keys WHERE fingerprint = $1", fingerprint) - .execute(pool) - .await? - .rows_affected(); - // if not in DB, Err404 - if n == 0 { - Err(Error { - source: color_eyre::eyre::eyre!("SSH Key Not Found"), - kind: crate::error::ErrorKind::NotFound, - revision: None, + let keys = ctx + .db + .mutate(|m| { + let keys_ref = m.as_private_mut().as_ssh_pubkeys_mut(); + if keys_ref.remove(&fingerprint)?.is_some() { + keys_ref.de() + } else { + Err(Error { + source: color_eyre::eyre::eyre!("SSH Key Not Found"), + kind: crate::error::ErrorKind::NotFound, + revision: None, + }) + } }) - } else { - // AND overlay key file - sync_keys_from_db(pool, Path::new(SSH_AUTHORIZED_KEYS_FILE)).await?; - Ok(()) - } + .await?; + sync_keys(&keys, SSH_AUTHORIZED_KEYS_FILE).await } fn display_all_ssh_keys(params: WithIoFormat, result: Vec) { @@ -186,43 +186,31 @@ fn display_all_ssh_keys(params: WithIoFormat, result: Vec } #[instrument(skip_all)] -pub async fn list(ctx: RpcContext, _: Empty) -> Result, Error> { - let pool = &ctx.secret_store; - // list keys in DB and return them - let entries = sqlx::query!("SELECT fingerprint, openssh_pubkey, created_at FROM ssh_keys") - .fetch_all(pool) - .await?; - Ok(entries +pub async fn list(ctx: RpcContext) -> Result, Error> { + ctx.db + .peek() + .await + .into_private() + .into_ssh_pubkeys() + .into_entries()? .into_iter() - .map(|r| { - let k = PubKey(r.openssh_pubkey.parse().unwrap()).0; - let alg = k.keytype().to_owned(); - let fingerprint = k.fingerprint_md5(); - let hostname = k.comment.unwrap_or("".to_owned()); - let created_at = r.created_at; - SshKeyResponse { - alg, + .map(|(fingerprint, key)| { + let mut key = key.de()?; + Ok(SshKeyResponse { + alg: key.0.keytype().to_owned(), fingerprint, - hostname, - created_at, - } + hostname: key.0.comment.take().unwrap_or_default(), + created_at: key.created_at.to_rfc3339(), + }) }) - .collect()) + .collect() } #[instrument(skip_all)] -pub async fn sync_keys_from_db>( - pool: &Pool, - dest: P, -) -> Result<(), Error> { +pub async fn sync_keys>(keys: &SshKeys, dest: P) -> Result<(), Error> { + use tokio::io::AsyncWriteExt; + let dest = dest.as_ref(); - let keys = sqlx::query!("SELECT openssh_pubkey FROM ssh_keys") - .fetch_all(pool) - .await?; - let contents: String = keys - .into_iter() - .map(|k| format!("{}\n", k.openssh_pubkey)) - .collect(); let ssh_dir = dest.parent().ok_or_else(|| { Error::new( eyre!("SSH Key File cannot be \"/\""), @@ -232,5 +220,10 @@ pub async fn sync_keys_from_db>( if tokio::fs::metadata(ssh_dir).await.is_err() { tokio::fs::create_dir_all(ssh_dir).await?; } - std::fs::write(dest, contents).map_err(|e| e.into()) + let mut f = tokio::fs::File::create(dest).await?; + for key in keys.0.values() { + f.write_all(key.0.to_key_format().as_bytes()).await?; + f.write_all(b"\n").await?; + } + Ok(()) } diff --git a/core/startos/src/status/mod.rs b/core/startos/src/status/mod.rs index ffc1a98bb..721b47511 100644 --- a/core/startos/src/status/mod.rs +++ b/core/startos/src/status/mod.rs @@ -27,6 +27,12 @@ pub struct DependencyConfigErrors(pub BTreeMap); impl Map for DependencyConfigErrors { type Key = PackageId; type Value = String; + fn key_str(key: &Self::Key) -> Result, Error> { + Ok(key) + } + fn key_string(key: &Self::Key) -> Result { + Ok(key.clone().into()) + } } #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)] diff --git a/core/startos/src/update/mod.rs b/core/startos/src/update/mod.rs index 31693aba0..9f2b58135 100644 --- a/core/startos/src/update/mod.rs +++ b/core/startos/src/update/mod.rs @@ -18,7 +18,7 @@ use crate::db::model::UpdateProgress; use crate::disk::mount::filesystem::bind::Bind; use crate::disk::mount::filesystem::ReadWrite; use crate::disk::mount::guard::MountGuard; -use crate::notifications::NotificationLevel; +use crate::notifications::{notify, NotificationLevel}; use crate::prelude::*; use crate::registry::marketplace::with_query_params; use crate::sound::{ @@ -66,7 +66,7 @@ pub enum UpdateResult { Updating, } -pub fn display_update_result(params: UpdateSystemParams, status: UpdateResult) { +pub fn display_update_result(_: UpdateSystemParams, status: UpdateResult) { match status { UpdateResult::Updating => { println!("Updating..."); @@ -131,24 +131,14 @@ async fn maybe_do_update(ctx: RpcContext, marketplace_url: Url) -> Result